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

@@ -1,6 +1,6 @@
package com.viewsh.module.ops.environment.dal.dataobject.cleaner;
import com.viewsh.framework.tenant.core.db.TenantBaseDO;
import com.viewsh.framework.tenant.core.db.ProjectBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -21,7 +21,7 @@ import java.math.BigDecimal;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsCleanerPerformanceMonthlyDO extends TenantBaseDO {
public class OpsCleanerPerformanceMonthlyDO extends ProjectBaseDO {
/**
* 汇总ID

View File

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.viewsh.framework.tenant.core.db.TenantBaseDO;
import com.viewsh.framework.tenant.core.db.ProjectBaseDO;
import com.viewsh.module.ops.enums.CleanerStatusEnum;
import lombok.*;
@@ -22,7 +22,7 @@ import java.time.LocalDateTime;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsCleanerStatusDO extends TenantBaseDO {
public class OpsCleanerStatusDO extends ProjectBaseDO {
/**
* 主键ID

View File

@@ -1,6 +1,6 @@
package com.viewsh.module.ops.environment.dal.dataobject.inspection;
import com.viewsh.framework.tenant.core.db.TenantBaseDO;
import com.viewsh.framework.tenant.core.db.ProjectBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -21,7 +21,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsInspectionRecordDO extends TenantBaseDO {
public class OpsInspectionRecordDO extends ProjectBaseDO {
/**
* 巡检记录ID

View File

@@ -1,6 +1,6 @@
package com.viewsh.module.ops.environment.dal.dataobject.inspection;
import com.viewsh.framework.tenant.core.db.TenantBaseDO;
import com.viewsh.framework.tenant.core.db.ProjectBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -21,7 +21,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsInspectionRecordItemDO extends TenantBaseDO {
public class OpsInspectionRecordItemDO extends ProjectBaseDO {
/**
* 明细ID

View File

@@ -1,6 +1,6 @@
package com.viewsh.module.ops.environment.dal.dataobject.workorder;
import com.viewsh.framework.tenant.core.db.TenantBaseDO;
import com.viewsh.framework.tenant.core.db.ProjectBaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
@@ -19,7 +19,7 @@ import java.time.LocalDateTime;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsOrderCleanExtDO extends TenantBaseDO {
public class OpsOrderCleanExtDO extends ProjectBaseDO {
/**
* 主键