using Admin.NET.Plugin.AiDOP.Entity;
using Admin.NET.Plugin.AiDOP.Service.S8.OrderFlow;
using Yitter.IdGenerator;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
///
/// Ai-DOP 每租户必备基线:S8 七个业务角色 + KPI calc config(从 AIDOP 模板租户复制)。
/// 形态为「每租户复制」,便于各租户独立调整 KPI 公式与角色配置。
///
public sealed class AidopTenantInitService : ITransient
{
/// AIDOP 运行租户:KPI calc config 模板来源。
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;
/// 幂等种入目标租户的 S8 业务角色与 KPI calc config;允许重复调用。
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()
.ClearFilter()
.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()
.ClearFilter()
.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()
.ClearFilter()
.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();
}
}
}