- 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
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';
-- 即刻生效, 无需重启