# org_id 策略修复 — 生产环境部署验证 ## 发布包内容 ``` org-policy-fix-test-20260501/ ├── cw-elevator-application-V1.0.0.20211103.jar # V2 JAR(含 @RibbonClients 修复,命名同 V1) ├── scripts/ │ ├── verify_org_policy_fix.py # 7 用例验证脚本 │ └── stub_org_service.py # 组织服务 HTTP 桩(本地测试用) ├── config/ │ └── v2-local-config.properties # 本地测试配置参考 ├── sql/ │ ├── tenant_visitor_floor_policy_v2.sql # DDL(加 org_id 列) │ └── tenant_visitor_floor_policy_migrate_org_id.sql # 数据迁移(business_id → org_id) └── docs/ └── 2026-05-01-org-policy-verify-manual.md # 详细操作手册 ``` --- ## 部署验证流程 ### 第一步:DDL 上线(DBA 执行,仅一次) 在生产库 `cw-elevator-application` 执行: ```bash mysql -h <生产MySQL主机> -P <端口> -u <用户> -p cw-elevator-application < sql/tenant_visitor_floor_policy_v2.sql ``` 验证: ```sql -- 确认 org_id 列已添加,uk_org_building 约束已创建 SELECT COLUMN_NAME, COLUMN_KEY, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'cw-elevator-application' AND TABLE_NAME = 'tenant_visitor_floor_policy' ORDER BY ORDINAL_POSITION; ``` ### 第二步:数据迁移(DBA 执行,按公司逐行) ```sql -- 1. 查看可用公司节点 SELECT o.ID, o.NAME FROM component-organization.cw_is_organization o WHERE o.BUSINESS_ID = '2524639890ba4f2cba9ba1a4eeaa4015' AND o.IS_DEL = 0 ORDER BY o.NAME; -- 2. 为广发基金迁移(示例) UPDATE cw-elevator-application.tenant_visitor_floor_policy SET org_id = '<广发基金 org_id>' WHERE id = 'gf_vstr_policy_guangfa_fund_001x'; -- 3. 为其他公司新增策略(模板) INSERT INTO cw-elevator-application.tenant_visitor_floor_policy (id, org_id, business_id, policy_type, allow_zone_ids, building_id, enabled, policy_version, remark, created_at, updated_at) VALUES (REPLACE(UUID(),'-',''), '<公司 org_id>', NULL, 'INTERSECT_ALLOWLIST', '[""]', NULL, 1, 1, '', UNIX_TIMESTAMP(NOW())*1000, UNIX_TIMESTAMP(NOW())*1000); ``` ### 第三步:部署 V2 JAR(运维执行) ```bash # 1. 停旧 V2 /path/to/stop.sh # 2. 替换 JAR cp cw-elevator-application-V1.0.0.20211103.jar /path/to/deploy/ # 3. 确认配置文件不变(application.properties / bootstrap.properties 沿用现有) # 4. 启动 /path/to/start.sh ``` ### 第四步:运行验证脚本 ```bash # 安装依赖 pip3 install requests pymysql # 运行(根据生产环境修改 DB 地址和电梯 URL) cd scripts/ python3 verify_org_policy_fix.py \ --elevator-base-url http://<生产V2地址>:<端口> ``` **注意:** 生产环境不需要桩服务——`ninca-common` 和 `ninca-common-component-organization` 服务在生产 Consul 或 Dubbo 中可用。脚本直接调用生产 V2,V2 通过现有 Feign/Ribbon 链路访问真实组织服务。 --- ## 验证用例清单 | ID | 场景 | 期望 | |----|------|------| | T1 | 公司有策略 allow=[28F] | passRule 返回仅 [28F] | | T2 | 公司无策略 | passRule 返回 floorList 全集 | | T3 | allow 含无效 zoneId | fail 76260533 | | T4 | 被访人多组织,其一有策略 | 命中该策略 | | T5 | enabled=0 | 等同无策略 | | T6 | 调用方传 floorIds,但策略优先 | 策略 allow 覆盖调用方值 | | T7 | 广发基金迁移后生效 | 仅 [28F] | --- ## 回滚方案 ```sql -- 回滚 DDL ALTER TABLE tenant_visitor_floor_policy DROP INDEX uk_org_building; ALTER TABLE tenant_visitor_floor_policy DROP COLUMN org_id; ALTER TABLE tenant_visitor_floor_policy ADD UNIQUE KEY uk_biz_building (business_id, building_id); ``` 部署旧 JAR 即可恢复原有行为。