# 新增实体类快速执行指南 ## ✅ 已完成工作 ### 1. 实体类创建(10个) #### WorkOrder 模块(5个实体) - ✅ `WorkOrdMaster.cs` - 工单主数据 - ✅ `WorkOrdDetail.cs` - 工单物料明细 - ✅ `WorkOrdRouting.cs` - 工单工序表 - ✅ `MesMorder.cs` - 工单信息表 - ✅ `MesMoentry.cs` - 工单附属表 #### Production 模块(5个实体) - ✅ `PeriodSequenceDet.cs` - 工序间衔接 - ✅ `ScheduleResultOpMaster.cs` - 排产结果 - ✅ `ShopCalendarWorkCtr.cs` - 产线工作日历 - ✅ `QualityLineWorkDetail.cs` - 产线休息时间 - ✅ `ResourceOccupancyTime.cs` - 产线加班表 ### 2. 租户支持 所有实体都已添加 `tenant_id` 字段(统一为小写下划线格式) ### 3. 数据库迁移脚本 已生成 `tools/sql/add_tenant_id_to_new_entities.sql` ## 📋 执行步骤 ### 步骤1:执行数据库迁移(必需) ```bash # 方式1:PowerShell Get-Content "d:\DEMONET\tools\sql\add_tenant_id_to_new_entities.sql" | mysql --host=localhost --user=root --password=你的密码 --database=aidopdev # 方式2:MySQL 客户端 mysql -u root -p aidopdev < d:\DEMONET\tools\sql\add_tenant_id_to_new_entities.sql ``` **影响的表(9张新增):** - WorkOrdMaster - WorkOrdDetail - WorkOrdRouting - mes_moentry - PeriodSequenceDet - ScheduleResultOpMaster - ShopCalendarWorkCtr - QualityLineWorkDetail - ResourceOccupancyTime ### 步骤2:为现有数据设置租户ID(如有历史数据) ```sql -- 假设默认租户ID为 1,根据实际情况调整 USE aidopdev; -- WorkOrder 模块 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; -- Production 模块 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; ``` ### 步骤3:验证结果 ```sql -- 验证字段是否添加成功 SELECT TABLE_NAME AS 表名, COLUMN_NAME AS 字段名 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id' AND TABLE_NAME IN ( 'WorkOrdMaster', 'WorkOrdDetail', 'WorkOrdRouting', 'mes_moentry', 'PeriodSequenceDet', 'ScheduleResultOpMaster', 'ShopCalendarWorkCtr', 'QualityLineWorkDetail', 'ResourceOccupancyTime' ) ORDER BY TABLE_NAME; -- 验证索引是否创建成功 SELECT TABLE_NAME AS 表名, INDEX_NAME AS 索引名 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id' AND INDEX_NAME = 'idx_tenant_id' AND TABLE_NAME IN ( 'WorkOrdMaster', 'WorkOrdDetail', 'WorkOrdRouting', 'mes_moentry', 'PeriodSequenceDet', 'ScheduleResultOpMaster', 'ShopCalendarWorkCtr', 'QualityLineWorkDetail', 'ResourceOccupancyTime' ) ORDER BY TABLE_NAME; ``` ## 📚 相关文档 1. **📖 详细报告** `tools/NEW_ENTITIES_CREATION_REPORT.md` 包含所有实体类的详细信息、字段统计、关系图等 2. **💾 数据库脚本** `tools/sql/add_tenant_id_to_new_entities.sql` 为新增表添加租户字段和索引 3. **📋 之前的租户改造报告** `tools/TENANT_MIGRATION_REPORT.md` Order 和 Production 模块的租户改造记录 ## 🎯 下一步工作 ### 1. Service 层开发 为新实体创建 Service 类,参考模板: ```csharp [ApiDescriptionSettings(Order = 270, Description = "工单主数据")] [Route("api/WorkOrder")] [AllowAnonymous] [NonUnify] public class WorkOrdMasterService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly UserManager _userManager; public WorkOrdMasterService(ISqlSugarClient db, UserManager userManager) { _db = db; _userManager = userManager; } [DisplayName("工单列表")] [HttpGet("workord/list")] public async Task GetList([FromQuery] WorkOrdListInput input) { var tenantId = _userManager.TenantId; var query = _db.Queryable() .Where(x => x.TenantId == tenantId); // 添加其他查询条件... var list = await query.ToPagedListAsync(input.Page, input.PageSize); return new { total = list.Total, list = list.Items }; } [DisplayName("新增工单")] [HttpPost("workord/save")] public async Task Save([FromBody] WorkOrdSaveInput input) { var tenantId = _userManager.TenantId; var entity = input.Adapt(); entity.TenantId = tenantId; await _db.Insertable(entity).ExecuteCommandAsync(); return new { message = "保存成功" }; } } ``` ### 2. DTO 类创建 为每个 Service 创建对应的 DTO 类: - `WorkOrdListInput` - 列表查询参数 - `WorkOrdSaveInput` - 保存参数 - `WorkOrdDetailOutput` - 详情输出 ### 3. 前端页面开发 根据业务需求开发对应的 Vue 页面 ## ⚠️ 注意事项 ### 1. 实体关系 注意 WorkOrdMaster、WorkOrdDetail、WorkOrdRouting 之间的主从关系: - WorkOrdDetail 和 WorkOrdRouting 通过 `WorkOrdMasterRecID` 关联到 WorkOrdMaster - 查询、删除时需要考虑级联操作 ### 2. 租户隔离 所有增删改查操作都必须包含租户过滤: - **查询:** `WHERE tenant_id = @TenantId` - **新增:** `entity.TenantId = _userManager.TenantId` - **修改/删除:** 先查询验证租户ID,再操作 ### 3. 性能优化 - tenant_id 字段已添加索引 - 查询时始终包含 tenant_id 条件以利用索引 - 大表查询时注意分页 ## ✨ 完成标志 执行完成后,应该看到: - ✅ 10个实体类文件已创建 - ✅ 9张表已添加 tenant_id 字段 - ✅ 9张表已创建 idx_tenant_id 索引 - ✅ 现有数据(如有)已设置租户ID - ✅ 实体类可正常编译通过 --- 生成时间:2026-04-22 实体总数:10个 涉及模块:WorkOrder(5个)、Production(5个)