WorkOrdMaster.cs - 工单主数据WorkOrdDetail.cs - 工单物料明细WorkOrdRouting.cs - 工单工序表MesMorder.cs - 工单信息表MesMoentry.cs - 工单附属表PeriodSequenceDet.cs - 工序间衔接ScheduleResultOpMaster.cs - 排产结果ShopCalendarWorkCtr.cs - 产线工作日历QualityLineWorkDetail.cs - 产线休息时间ResourceOccupancyTime.cs - 产线加班表所有实体都已添加 tenant_id 字段(统一为小写下划线格式)
已生成 tools/sql/add_tenant_id_to_new_entities.sql
# 方式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张新增):
-- 假设默认租户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;
-- 验证字段是否添加成功
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;
📖 详细报告
tools/NEW_ENTITIES_CREATION_REPORT.md
包含所有实体类的详细信息、字段统计、关系图等
💾 数据库脚本
tools/sql/add_tenant_id_to_new_entities.sql
为新增表添加租户字段和索引
📋 之前的租户改造报告
tools/TENANT_MIGRATION_REPORT.md
Order 和 Production 模块的租户改造记录
为新实体创建 Service 类,参考模板:
[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<object> GetList([FromQuery] WorkOrdListInput input)
{
var tenantId = _userManager.TenantId;
var query = _db.Queryable<WorkOrdMaster>()
.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<object> Save([FromBody] WorkOrdSaveInput input)
{
var tenantId = _userManager.TenantId;
var entity = input.Adapt<WorkOrdMaster>();
entity.TenantId = tenantId;
await _db.Insertable(entity).ExecuteCommandAsync();
return new { message = "保存成功" };
}
}
为每个 Service 创建对应的 DTO 类:
WorkOrdListInput - 列表查询参数WorkOrdSaveInput - 保存参数WorkOrdDetailOutput - 详情输出根据业务需求开发对应的 Vue 页面
注意 WorkOrdMaster、WorkOrdDetail、WorkOrdRouting 之间的主从关系:
WorkOrdMasterRecID 关联到 WorkOrdMaster所有增删改查操作都必须包含租户过滤:
WHERE tenant_id = @TenantIdentity.TenantId = _userManager.TenantId执行完成后,应该看到:
生成时间:2026-04-22
实体总数:10个
涉及模块:WorkOrder(5个)、Production(5个)