# 新增实体类及租户支持完成报告 ## 完成时间 2026-04-22 ## 新增实体类汇总 ### 一、WorkOrder 模块(5个实体) #### 1. WorkOrdMaster - 工单主数据 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdMaster.cs` - **数据库表:** `WorkOrdMaster` - **主键:** `RecID`(自增) - **关键字段:** WorkOrd, ItemNum, Status, Typed, QtyOrded, QtyCompleted, Priority - **租户字段:** ✅ tenant_id(已添加) #### 2. WorkOrdDetail - 工单物料明细 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdDetail.cs` - **数据库表:** `WorkOrdDetail` - **主键:** `RecID`(自增) - **关联字段:** `WorkOrdMasterRecID`(关联工单主表) - **关键字段:** WorkOrd, ItemNum, LineNum, QtyRequired, QtyIssued - **租户字段:** ✅ tenant_id(已添加) #### 3. WorkOrdRouting - 工单工序表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdRouting.cs` - **数据库表:** `WorkOrdRouting` - **主键:** `RecID`(自增) - **关联字段:** `WorkOrdMasterRecID`(关联工单主表) - **关键字段:** WorkOrd, OP, ItemNum, WorkCtr, Status, QtyComplete - **租户字段:** ✅ tenant_id(已添加) #### 4. MesMorder - 工单信息表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/MesMorder.cs` - **数据库表:** `mes_morder` - **主键:** `Id`(自增) - **关键字段:** morder_no, product_code, morder_state, morder_production_number - **租户字段:** ✅ tenant_id(已存在,无需修改) #### 5. MesMoentry - 工单附属表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/MesMoentry.cs` - **数据库表:** `mes_moentry` - **主键:** `Id`(自增) - **关联字段:** `moentry_moid`(关联工单主表) - **关键字段:** moentry_mono, fbill_no, morder_production_number - **租户字段:** ✅ tenant_id(已添加) ### 二、Production 模块(5个实体) #### 6. PeriodSequenceDet - 工序间衔接 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/PeriodSequenceDet.cs` - **数据库表:** `PeriodSequenceDet` - **主键:** `RecID`(自增) - **关键字段:** ItemNum, Line, Op, WorkCtr, Period, Sequence, OrdQty - **租户字段:** ✅ tenant_id(已添加) #### 7. ScheduleResultOpMaster - 排产结果 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ScheduleResultOpMaster.cs` - **数据库表:** `ScheduleResultOpMaster` - **主键:** `RecID`(自增) - **关键字段:** WorkOrd, WorkCtr, Line, ItemNum, Op, WorkDate, WorkQty - **租户字段:** ✅ tenant_id(已添加) #### 8. ShopCalendarWorkCtr - 产线工作日历表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ShopCalendarWorkCtr.cs` - **数据库表:** `ShopCalendarWorkCtr` - **主键:** `RecID`(自增) - **关键字段:** WorkCtr, ProdLine, WeekDay, IsWorkDay, ShiftsStart1-4 - **租户字段:** ✅ tenant_id(已添加) #### 9. QualityLineWorkDetail - 产线休息时间表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/QualityLineWorkDetail.cs` - **数据库表:** `QualityLineWorkDetail` - **主键:** `RecID`(自增) - **关键字段:** ProdLine, WorkShift, Period, RestTimePoint, RestTime - **租户字段:** ✅ tenant_id(已添加) #### 10. ResourceOccupancyTime - 产线加班表 - **文件路径:** `server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ResourceOccupancyTime.cs` - **数据库表:** `ResourceOccupancyTime` - **主键:** `RecID`(自增) - **关键字段:** ResourceType, Resource, StartTime, EndTime, IsRest - **租户字段:** ✅ tenant_id(已添加) ## 实体类特性 ### 统一规范 所有实体类均遵循以下规范: #### 1. 命名空间 ```csharp // WorkOrder 模块 namespace Admin.NET.Plugin.AiDOP.WorkOrder; // Production 模块 namespace Admin.NET.Plugin.AiDOP.Production; ``` #### 2. 表映射 ```csharp [SugarTable("TableName", "表中文名")] public class EntityName ``` #### 3. 主键定义 ```csharp [SugarColumn(ColumnName = "RecID", IsPrimaryKey = true, IsIdentity = true)] public long RecID { get; set; } ``` #### 4. 租户字段 ```csharp /// 租户ID(多租户隔离) [SugarColumn(ColumnName = "tenant_id", IsNullable = true)] public long? TenantId { get; set; } ``` #### 5. 字段类型映射 - **字符串:** `string?`(可空)+ `Length` 参数 - **数值:** `decimal?`, `int?`, `long?`(可空) - **日期:** `DateTime?`(可空) - **布尔:** `int?`(数据库存储0/1) ## 数据库迁移 ### 迁移脚本 📄 `tools/sql/add_tenant_id_to_new_entities.sql` ### 包含功能 1. ✅ 为9张新增表添加 `tenant_id` 字段 2. ✅ 为所有表创建 `idx_tenant_id` 索引 3. ✅ 验证字段和索引创建结果 4. ✅ 自动跳过已有 `tenant_id` 的表 ### 执行命令 ```bash mysql -u root -p你的密码 aidopdev < tools/sql/add_tenant_id_to_new_entities.sql ``` ## 字段统计 ### WorkOrder 模块字段数 - WorkOrdMaster: **35个核心字段** + tenant_id - WorkOrdDetail: **27个字段** + tenant_id - WorkOrdRouting: **40个字段** + tenant_id - MesMorder: **48个字段** + tenant_id - MesMoentry: **15个字段** + tenant_id ### Production 模块字段数 - PeriodSequenceDet: **30个字段** + tenant_id - ScheduleResultOpMaster: **28个字段** + tenant_id - ShopCalendarWorkCtr: **24个字段** + tenant_id - QualityLineWorkDetail: **19个字段** + tenant_id - ResourceOccupancyTime: **15个字段** + tenant_id ## 下一步建议 ### 1. 数据库迁移 执行 SQL 脚本为表添加 `tenant_id` 字段和索引。 ### 2. Service 层开发 参照现有 Service 模式为新实体创建服务类: - 列表查询(带租户过滤) - 详情查询(带租户过滤) - 新增操作(写入租户ID) - 修改操作(租户隔离) - 删除操作(租户隔离) ### 3. 参考模板 ```csharp public class WorkOrdMasterService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly UserManager _userManager; // 查询时过滤租户 var tenantId = _userManager.TenantId; var list = await _db.Queryable() .Where(x => x.TenantId == tenantId) .ToListAsync(); // 新增时写入租户ID entity.TenantId = tenantId; await _db.Insertable(entity).ExecuteCommandAsync(); } ``` ### 4. 为现有数据设置租户ID 如果表中已有数据,需要设置默认租户ID: ```sql -- 假设默认租户ID为1 UPDATE WorkOrdMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE WorkOrdDetail SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE WorkOrdRouting SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE mes_moentry SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE PeriodSequenceDet SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ScheduleResultOpMaster SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ShopCalendarWorkCtr SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE QualityLineWorkDetail SET tenant_id = 1 WHERE tenant_id IS NULL; UPDATE ResourceOccupancyTime SET tenant_id = 1 WHERE tenant_id IS NULL; ``` ## 实体关系 ### WorkOrder 模块关系 ``` WorkOrdMaster (工单主表) ├── WorkOrdDetail (物料明细) - 通过 WorkOrdMasterRecID 关联 └── WorkOrdRouting (工序表) - 通过 WorkOrdMasterRecID 关联 MesMorder (MES工单主表) └── MesMoentry (工单子表) - 通过 moentry_moid 关联 ``` ### Production 模块关系 ``` PeriodSequenceDet (工序间衔接) - 独立表 ScheduleResultOpMaster (排产结果) - 独立表 ShopCalendarWorkCtr (工作日历) - 独立表 QualityLineWorkDetail (休息时间) - 独立表 ResourceOccupancyTime (资源占用) - 独立表 ``` ## 技术亮点 ### 1. 完整的多租户支持 - ✅ 所有实体都包含 `tenant_id` 字段 - ✅ 字段类型统一:`BIGINT NULL` - ✅ C# 属性统一:`public long? TenantId { get; set; }` ### 2. 规范的ORM映射 - ✅ 使用 SqlSugar 特性 - ✅ 字段名与数据库完全对应 - ✅ 可空类型正确标注 ### 3. 完善的注释 - ✅ 类级别注释(表中文名) - ✅ 属性级别注释(重要字段) - ✅ 租户字段特殊标注 ### 4. 性能优化 - ✅ 所有租户字段添加索引 - ✅ 使用条件索引创建(IF NOT EXISTS) - ✅ 主键为自增长类型 ## 总结 ✅ **已完成:** - 10个实体类完整创建 - 所有实体添加租户ID支持 - 数据库迁移脚本生成 - 索引优化脚本生成 📊 **统计数据:** - WorkOrder 模块:5个实体,165个字段 - Production 模块:5个实体,116个字段 - 总计:10个实体,281个字段 🎯 **符合规范:** - 统一使用 tenant_id(小写下划线) - 统一使用 SqlSugar ORM - 完整的可空类型支持 - 规范的主键定义 --- 生成时间:2026-04-22 涉及模块:WorkOrder、Production 实体总数:10个 字段总数:281个