NEW_ENTITIES_QUICK_START.md 6.2 KB

新增实体类快速执行指南

✅ 已完成工作

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:执行数据库迁移(必需)

# 方式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(如有历史数据)

-- 假设默认租户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:验证结果

-- 验证字段是否添加成功
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 类,参考模板:

[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 = "保存成功" };
    }
}

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个)