| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- using Admin.NET.Plugin.AiDOP.Entity;
- using Admin.NET.Plugin.AiDOP.Service.S8.OrderFlow;
- using Yitter.IdGenerator;
- namespace Admin.NET.Plugin.AiDOP.Infrastructure;
- /// <summary>
- /// Ai-DOP 每租户必备基线:S8 七个业务角色 + KPI calc config(从 AIDOP 模板租户复制)。
- /// 形态为「每租户复制」,便于各租户独立调整 KPI 公式与角色配置。
- /// </summary>
- public sealed class AidopTenantInitService : ITransient
- {
- /// <summary>AIDOP 运行租户:KPI calc config 模板来源。</summary>
- public const long KpiTemplateTenantId = 797403760988229L;
- private static readonly (string Code, string Name, int OrderNo)[] S8BusinessRoles =
- {
- ("ROLE_ORDER_PLANNER", "订单计划员", 800),
- ("ROLE_PRODUCTION_PLANNER", "生产计划员", 801),
- ("ROLE_PURCHASER", "采购员", 802),
- ("ROLE_WH_INBOUND", "仓库收货员", 803),
- ("ROLE_WH_OUTBOUND", "仓库发货员", 804),
- ("ROLE_QC", "质检员", 805),
- ("ROLE_EQUIP_MAINT", "设备维修员", 806),
- };
- private readonly ISqlSugarClient _db;
- public AidopTenantInitService(ISqlSugarClient db) => _db = db;
- /// <summary>幂等种入目标租户的 S8 业务角色与 KPI calc config;允许重复调用。</summary>
- public async Task InitTenantBaselineAsync(long tenantId)
- {
- if (tenantId <= 0) return;
- await SeedS8BusinessRolesAsync(tenantId);
- await SeedKpiCalcConfigFromTemplateAsync(tenantId);
- }
- private async Task SeedS8BusinessRolesAsync(long tenantId)
- {
- var ct = DateTime.Now;
- foreach (var (code, name, orderNo) in S8BusinessRoles)
- {
- var exists = await _db.Queryable<SysRole>()
- .ClearFilter<ITenantIdFilter>()
- .AnyAsync(r => r.TenantId == tenantId && r.Code == code);
- if (exists) continue;
- await _db.Insertable(new SysRole
- {
- Id = YitIdHelper.NextId(),
- TenantId = tenantId,
- Name = name,
- Code = code,
- OrderNo = orderNo,
- DataScope = DataScopeEnum.Self,
- Status = StatusEnum.Enable,
- Remark = "S8 业务角色(异常协同承接)",
- CreateTime = ct,
- }).ExecuteCommandAsync();
- }
- }
- private async Task SeedKpiCalcConfigFromTemplateAsync(long tenantId)
- {
- if (tenantId == KpiTemplateTenantId) return;
- var templates = await _db.Queryable<AdoSmartOpsKpiCalcConfig>()
- .ClearFilter<ITenantIdFilter>()
- .Where(c => c.TenantId == KpiTemplateTenantId)
- .ToListAsync();
- if (templates.Count == 0) return;
- var now = DateTime.Now;
- foreach (var tpl in templates)
- {
- var exists = await _db.Queryable<AdoSmartOpsKpiCalcConfig>()
- .ClearFilter<ITenantIdFilter>()
- .AnyAsync(c => c.TenantId == tenantId && c.MetricCode == tpl.MetricCode && c.VersionNo == tpl.VersionNo);
- if (exists) continue;
- await _db.Insertable(new AdoSmartOpsKpiCalcConfig
- {
- TenantId = tenantId,
- MetricCode = tpl.MetricCode,
- ModuleCode = tpl.ModuleCode,
- VersionNo = tpl.VersionNo,
- CalcEngineType = tpl.CalcEngineType,
- DataSourceCode = tpl.DataSourceCode,
- SqlScript = tpl.SqlScript,
- SqlParametersJson = tpl.SqlParametersJson,
- TimeoutSeconds = tpl.TimeoutSeconds,
- PublishStatus = tpl.PublishStatus,
- IsCurrent = tpl.IsCurrent,
- Remark = tpl.Remark,
- CreatedBy = "AidopTenantInit",
- CreatedAt = now,
- }).ExecuteCommandAsync();
- }
- }
- }
|