# 新增实体类及租户支持完成报告
## 完成时间
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个