2026-04-22
server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdMaster.csWorkOrdMasterRecID(自增)server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdDetail.csWorkOrdDetailRecID(自增)WorkOrdMasterRecID(关联工单主表)server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/WorkOrdRouting.csWorkOrdRoutingRecID(自增)WorkOrdMasterRecID(关联工单主表)server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/MesMorder.csmes_morderId(自增)server/Plugins/Admin.NET.Plugin.AiDOP/WorkOrder/Entity/MesMoentry.csmes_moentryId(自增)moentry_moid(关联工单主表)server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/PeriodSequenceDet.csPeriodSequenceDetRecID(自增)server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ScheduleResultOpMaster.csScheduleResultOpMasterRecID(自增)server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ShopCalendarWorkCtr.csShopCalendarWorkCtrRecID(自增)server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/QualityLineWorkDetail.csQualityLineWorkDetailRecID(自增)server/Plugins/Admin.NET.Plugin.AiDOP/Production/Entity/ResourceOccupancyTime.csResourceOccupancyTimeRecID(自增)所有实体类均遵循以下规范:
// WorkOrder 模块
namespace Admin.NET.Plugin.AiDOP.WorkOrder;
// Production 模块
namespace Admin.NET.Plugin.AiDOP.Production;
[SugarTable("TableName", "表中文名")]
public class EntityName
[SugarColumn(ColumnName = "RecID", IsPrimaryKey = true, IsIdentity = true)]
public long RecID { get; set; }
/// <summary>租户ID(多租户隔离)</summary>
[SugarColumn(ColumnName = "tenant_id", IsNullable = true)]
public long? TenantId { get; set; }
string?(可空)+ Length 参数decimal?, int?, long?(可空)DateTime?(可空)int?(数据库存储0/1)📄 tools/sql/add_tenant_id_to_new_entities.sql
tenant_id 字段idx_tenant_id 索引tenant_id 的表mysql -u root -p你的密码 aidopdev < tools/sql/add_tenant_id_to_new_entities.sql
执行 SQL 脚本为表添加 tenant_id 字段和索引。
参照现有 Service 模式为新实体创建服务类:
public class WorkOrdMasterService : IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
// 查询时过滤租户
var tenantId = _userManager.TenantId;
var list = await _db.Queryable<WorkOrdMaster>()
.Where(x => x.TenantId == tenantId)
.ToListAsync();
// 新增时写入租户ID
entity.TenantId = tenantId;
await _db.Insertable(entity).ExecuteCommandAsync();
}
如果表中已有数据,需要设置默认租户ID:
-- 假设默认租户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;
WorkOrdMaster (工单主表)
├── WorkOrdDetail (物料明细) - 通过 WorkOrdMasterRecID 关联
└── WorkOrdRouting (工序表) - 通过 WorkOrdMasterRecID 关联
MesMorder (MES工单主表)
└── MesMoentry (工单子表) - 通过 moentry_moid 关联
PeriodSequenceDet (工序间衔接) - 独立表
ScheduleResultOpMaster (排产结果) - 独立表
ShopCalendarWorkCtr (工作日历) - 独立表
QualityLineWorkDetail (休息时间) - 独立表
ResourceOccupancyTime (资源占用) - 独立表
tenant_id 字段BIGINT NULLpublic long? TenantId { get; set; }✅ 已完成:
📊 统计数据:
🎯 符合规范:
生成时间:2026-04-22
涉及模块:WorkOrder、Production
实体总数:10个
字段总数:281个