feat(tenant): 租户-项目两级架构 Phase 2 — IoT + Ops 业务迁移

DO 迁移 (15个 TenantBaseDO → ProjectBaseDO):
- IoT: IotDeviceDO
- Ops 核心: OpsOrderDO, OpsOrderEventDO, OpsOrderDispatchDO, OpsOrderQueueDO,
  OpsBusAreaDO, OpsAreaDeviceRelationDO, OpsDeviceTrajectoryDO
- Ops 保洁: OpsOrderCleanExtDO, OpsCleanerStatusDO, OpsCleanerPerformanceMonthlyDO,
  OpsInspectionRecordDO, OpsInspectionRecordItemDO
- Ops 安保: OpsOrderSecurityExtDO, OpsAreaSecurityUserDO

IoT 适配:
- IotDeviceRespDTO 新增 projectId 字段
- IotDeviceMessage 新增 projectId 字段
- IotDeviceMessageServiceImpl.appendDeviceMessage() 设置 projectId
- IotCleanRuleMessageHandler 嵌套 ProjectUtils.execute() 设置项目上下文

缓存改造:
- ProjectRedisCacheManager extends TenantRedisCacheManager,追加 :projectId 后缀
- ViewshTenantAutoConfiguration 替换为 ProjectRedisCacheManager

SQL 迁移脚本 (sql/mysql/project/):
- 01-create-tables.sql: system_project + system_user_project 建表
- 02-default-data.sql: 默认项目 + 用户关联回填
- 03-alter-business-tables.sql: 15 张表添加 project_id (NULL → 回填 → NOT NULL → 索引)
- 04-index-audit.sql: 现有索引审计 + project_id 补充建议
- 99-rollback.sql: 完整回滚方案

附带修复:
- fix(ops): UserDispatchStatusServiceImpl 添加缺失的 KEY_PREFIX 常量

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
lzh
2026-04-16 22:27:34 +08:00
parent 87beb1228e
commit a2f500fa20
27 changed files with 648 additions and 176 deletions

View File

@@ -0,0 +1,215 @@
-- =============================================
-- 租户-项目两级架构 - 业务表增加 project_id 字段
-- 执行顺序ADD NULL → UPDATE 回填 → MODIFY NOT NULL → ADD INDEX
-- 前置条件02-default-data.sql 已执行system_project 中已有默认项目数据
-- =============================================
-- -----------------------------------------------
-- 1. iot_device
-- -----------------------------------------------
ALTER TABLE iot_device ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE iot_device d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE iot_device MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE iot_device ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 2. ops_order
-- -----------------------------------------------
ALTER TABLE ops_order ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 3. ops_order_event
-- -----------------------------------------------
ALTER TABLE ops_order_event ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order_event d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order_event MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order_event ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 4. ops_order_dispatch
-- -----------------------------------------------
ALTER TABLE ops_order_dispatch ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order_dispatch d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order_dispatch MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order_dispatch ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 5. ops_order_queue
-- -----------------------------------------------
ALTER TABLE ops_order_queue ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order_queue d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order_queue MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order_queue ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 6. ops_bus_area
-- -----------------------------------------------
ALTER TABLE ops_bus_area ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_bus_area d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_bus_area MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_bus_area ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 7. ops_area_device_relation
-- -----------------------------------------------
ALTER TABLE ops_area_device_relation ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_area_device_relation d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_area_device_relation MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_area_device_relation ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 8. ops_order_security_ext
-- -----------------------------------------------
ALTER TABLE ops_order_security_ext ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order_security_ext d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order_security_ext MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order_security_ext ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 9. ops_area_security_user
-- -----------------------------------------------
ALTER TABLE ops_area_security_user ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_area_security_user d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_area_security_user MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_area_security_user ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 10. ops_order_clean_ext
-- -----------------------------------------------
ALTER TABLE ops_order_clean_ext ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_order_clean_ext d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_order_clean_ext MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_order_clean_ext ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 11. ops_cleaner_status
-- -----------------------------------------------
ALTER TABLE ops_cleaner_status ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_cleaner_status d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_cleaner_status MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_cleaner_status ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 12. ops_cleaner_performance_monthly
-- -----------------------------------------------
ALTER TABLE ops_cleaner_performance_monthly ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_cleaner_performance_monthly d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_cleaner_performance_monthly MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_cleaner_performance_monthly ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 13. ops_device_trajectory
-- -----------------------------------------------
ALTER TABLE ops_device_trajectory ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_device_trajectory d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_device_trajectory MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_device_trajectory ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 14. ops_inspection_record
-- -----------------------------------------------
ALTER TABLE ops_inspection_record ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_inspection_record d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_inspection_record MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_inspection_record ADD INDEX idx_project_id (project_id);
-- -----------------------------------------------
-- 15. ops_inspection_record_item
-- -----------------------------------------------
ALTER TABLE ops_inspection_record_item ADD COLUMN project_id BIGINT NULL COMMENT '项目编号';
UPDATE ops_inspection_record_item d
JOIN system_project p ON p.tenant_id = d.tenant_id AND p.code = 'DEFAULT' AND p.deleted = 0
SET d.project_id = p.id
WHERE d.project_id IS NULL;
ALTER TABLE ops_inspection_record_item MODIFY COLUMN project_id BIGINT NOT NULL COMMENT '项目编号';
ALTER TABLE ops_inspection_record_item ADD INDEX idx_project_id (project_id);