Files
starRiverProperty/docs/superpowers/plans/2026-05-09-guangfa-visitor-floor.md
hpd840321 42c4a9fd6b docs: mark elevator-side tenant policy SQL as deprecated, add guangfa visitor floor design
- Deprecate elevator-side tenant_visitor_floor_policy SQL files
  (V2 queries only component-organization library)
- Add guangfa 28F visitor floor design spec (table-driven approach A)
- Add complete database ER diagram (14 DBs, 537 tables)
- Add implementation plan for guangfa visitor floor policy
- Code walkthrough docs for visitor floor policy analysis
2026-05-09 23:56:12 +08:00

6.9 KiB

广发基金访客默认28F — 方案A实施计划

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: 将广发基金访客默认楼层从 28F (单层) 扩展为目标楼层列表, 通过 UPDATE tenant_visitor_floor_policy.allow_zone_ids 实现, 零代码变更。

Architecture: 纯数据变更。利用 V2 已有的 tenant_visitor_floor_policy 表驱动策略架构, 在 ImgPersonServiceImpl.detail() L643-648 的策略替代块中自动生效。仅修改 component-organization 库, 电梯侧不参与。

Tech Stack: MySQL (component-organization 库), Shell (验证)


前置确认

实施前需确认目标楼层列表 (zone_id)。当前仅28F:

zone_id = 605560545117995008  (28F, code=0x1C)

若仅为演示 28F 单层方案, 无需修改数据 (当前已是 28F)。若需扩展到多楼层, 需先确认 zone_id 列表。


Task 1: 确认目标 zone_id 列表 (调研)

Files:

  • (不修改文件)

  • Step 1: 查询当前 20 层 zone_id

-- 连接: mysql -h 192.168.3.12 -P 3307 -u root -p'123456' cw-elevator-application

SELECT zone_id, zone_name, code, parent_id
FROM code_elevator_area
WHERE parent_id = '605560539791228928'
  AND zone_name NOT LIKE '%B%'
ORDER BY CAST(zone_name AS UNSIGNED) ASC;

预期: 返回所有可用楼层, 确认目标 20 层的 zone_id 列表。

  • Step 2: 记录目标楼层列表

将 zone_id 列表整理为 JSON 数组格式:

["605560545117995008", "zone_id_2", ..., "zone_id_20"]

Task 2: 更新策略数据 (生产库)

Files:

  • (不修改文件)

  • Step 1: 备份当前策略

-- 连接: component-organization 库
CREATE TABLE tenant_visitor_floor_policy_bak_20260509 AS
SELECT * FROM tenant_visitor_floor_policy
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';

预期: Query OK, 1 row affected

  • Step 2: 验证当前策略状态
SELECT id, org_id, allow_zone_ids, enabled, policy_version
FROM tenant_visitor_floor_policy
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';

预期: enabled=1, allow_zone_ids='["605560545117995008"]'

  • Step 3: 更新 allow_zone_ids
-- 以28F单层为例 (若为20层则替换为Task 1确认的列表)
UPDATE tenant_visitor_floor_policy
SET allow_zone_ids = '["605560545117995008"]',
    policy_version = policy_version + 1,
    remark = '广发基金:访客默认28F (2026-05-09 方案A实施)',
    updated_at = UNIX_TIMESTAMP(NOW()) * 1000
WHERE id = 'gf_vstr_policy_guangfa_fund_001x'
  AND enabled = 1;

预期: Query OK, 1 row affected

  • Step 4: 验证更新结果
SELECT id, org_id, allow_zone_ids, enabled, policy_version, updated_at
FROM tenant_visitor_floor_policy
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';

预期: policy_version 自增 1, allow_zone_ids 为新列表


Task 3: 更新种子 SQL

Files:

  • Modify: docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql

  • Step 1: 更新广发基金策略种子数据

找到文件中 gf_vstr_policy_guangfa_fund_001x 的 INSERT 语句, 更新 allow_zone_ids:

-- 原内容 (~第 33 行):
  '["605560545117995008"]',

-- 改为:
  '["605560545117995008"]',

同步更新 remark 字段:

-- 原内容:
  '广发基金:访客楼层策略(组织库);默认 28F。',

-- 改为:
  '广发基金:访客楼层策略(组织库);默认 28F (方案A-20260509)。',
  • Step 2: 验证种子文件一致性

确认 org_id = '488b8ad049bb43408a6fbcc50bcb89ac' 与生产库一致, policy_type = 'INTERSECT_ALLOWLIST' 不变。


Task 4: 标记电梯侧 SQL 为废弃

Files:

  • Modify: docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql

  • Step 1: 添加废弃注释

在文件头部添加:

-- @deprecated 2026-05-09: V2 架构中策略仅在 component-organization 库维护。
-- cw-elevator-application 不再查询此表 (PersonRuleServiceImpl.addVisitor() 
-- 已移除策略代码)。此文件保留仅供历史参考。
  • Step 2: 同样标记物业策略文件

修改 docs/sql/tenant_visitor_floor_policy_init_property_mgmt_6f.sql:

-- @deprecated 2026-05-09: 同上。物业策略由 organization_tenant_visitor_floor_policy_init_tenants.sql 维护。

Task 5: 功能验证

Files:

  • (不修改文件)

  • Step 1: 验证 detail() floorList 策略生效

# 广发基金被访人 1072908835884208128
curl -s -X POST http://127.0.0.1:18081/elevator/person/add/visitor \
  -H 'Content-Type: application/json' \
  -d '{
    "personId": "1072908835884208128",
    "businessId": "2524639890ba4f2cba9ba1a4eeaa4015",
    "visitorName": "test_28f_verify",
    "begVisitorTime": "2026-05-09 00:00:00",
    "endVisitorTime": "2026-12-31 23:59:59"
  }' | python3 -m json.tool

预期: 返回 success: true, 不返回 76260531 (无楼层错误)。

  • Step 2: 验证 image_rule_ref 写入
-- 使用上一步返回的 visitorId
SELECT zone_id, zone_name, person_id, parent_rule
FROM image_rule_ref
WHERE person_id = '<visitor_id_from_step1>';

预期: 写入行数等于 allow_zone_ids 中 zone 数量 (当前为 1 行, zone_name=28F)。

  • Step 3: 验证物业公司不受影响
# 物业公司被访人 (使用不同的 personId)
curl -s -X POST http://127.0.0.1:18081/elevator/person/add/visitor \
  -H 'Content-Type: application/json' \
  -d '{
    "personId": "<物业员工personId>",
    "businessId": "2524639890ba4f2cba9ba1a4eeaa4015",
    "visitorName": "test_pm_verify",
    "begVisitorTime": "2026-05-09 00:00:00",
    "endVisitorTime": "2026-12-31 23:59:59"
  }' | python3 -m json.tool

预期: 返回 success: true, 物业访客仍获 40F 或 6F (取决于 org 归属)。

  • Step 4: 日志验证 — 确认 [GF-28F] 策略命中
# 检查 component-org 日志 (detail 中的策略替代)
grep "POLICY\|replacementZoneIds\|allow_zone_ids" <component-org-log> | tail -5

预期: 日志中出现 [POLICY] entry orgIds=[488b8ad...] 和 allow_zone_ids 解析结果。


Task 6: Commit

  • Step 1: 提交种子 SQL 变更
git add docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql
git add docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql
git add docs/sql/tenant_visitor_floor_policy_init_property_mgmt_6f.sql
git commit -m "docs: mark elevator-side tenant policy SQL as deprecated (V2 only queries component-org)"

回滚方案

-- 恢复到 28F 单层
UPDATE tenant_visitor_floor_policy
SET allow_zone_ids = '["605560545117995008"]',
    policy_version = policy_version + 1,
    remark = '广发基金:访客默认28F(回滚)',
    updated_at = UNIX_TIMESTAMP(NOW()) * 1000
WHERE id = 'gf_vstr_policy_guangfa_fund_001x';
-- 即刻生效, 无需重启