using Admin.NET.Core.Service;
using Admin.NET.Plugin.AiDOP.DataPlatform;
using Admin.NET.Plugin.AiDOP.DataPlatform.Executors;
using Admin.NET.Plugin.AiDOP.DataPlatform.MdpRebuild;
using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
using Admin.NET.Plugin.AiDOP.Entity.SmartOps;
namespace Admin.NET.Plugin.AiDOP.Order;
///
/// 数据中台统一 MDP 运行监控。
///
/// 【租户安全边界】需认证访问(已移除类级 [AllowAnonymous]);租户一律经
/// AidopTenantScope.ResolveOrThrow 从认证后 JWT 解析,无有效租户即拒绝,
/// 不读前端 tenantId、无默认回退(原实现:类级匿名 + 直接取 _userManager.TenantId,
/// 匿名时退化为 tenant_id = 0 平台行)。租户行与平台行可见性语义(BuildMdpRunLogTenantWhere)不变。
///
[ApiDescriptionSettings(Order = 322, Description = "统一MDP运行监控")]
[Route("api/DataPlatform")]
[NonUnify]
public class MdpMonitorService : IDynamicApiController, ITransient
{
private static readonly Dictionary ModuleJobCodes = new(StringComparer.OrdinalIgnoreCase)
{
["S1"] = "S1_MDP_SYNC_TRANSFORM",
["S2"] = "S2_MDP_SYNC_TRANSFORM",
["S3"] = "S3_MDP_SYNC_TRANSFORM",
["S4"] = "S4_MDP_SYNC_TRANSFORM"
};
private static readonly Dictionary JobCatalog = new(StringComparer.OrdinalIgnoreCase)
{
["S1_MDP_SYNC_TRANSFORM"] = new(
"S1_MDP_SYNC_TRANSFORM",
"order_delivery",
"订单交付域",
["S1", "S2", "S3", "S4", "S7", "S9"],
"GLOBAL_DOMAIN",
"订单交付域 MDP 同步",
"job_s1_mdp_sync_transform"),
["S2_MDP_SYNC_TRANSFORM"] = new(
"S2_MDP_SYNC_TRANSFORM",
"work_schedule",
"工单排程域",
["S2", "S3", "S5", "S6", "S8", "S9"],
"GLOBAL_DOMAIN",
"工单排程域 MDP 同步",
"job_s2_mdp_sync_transform"),
["S3_MDP_SYNC_TRANSFORM"] = new(
"S3_MDP_SYNC_TRANSFORM",
"supply_purchase",
"供应采购域",
["S3", "S4", "S5", "S8", "S9"],
"GLOBAL_DOMAIN",
"供应采购域 MDP 同步",
"job_s3_mdp_sync_transform"),
["S4_MDP_SYNC_TRANSFORM"] = new(
"S4_MDP_SYNC_TRANSFORM",
"purchase_execution",
"采购执行域",
["S4", "S5", "S8", "S9"],
"GLOBAL_DOMAIN",
"采购执行域 MDP 同步",
"job_s4_mdp_sync_transform")
};
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
private readonly MdpOutboundGate _outboundGate;
private readonly DataPlatform.MdpRebuild.IModuleRebuildCapability _rebuildCapability;
private readonly IEtlInstanceStore _etlInstances;
private readonly DataPlatform.MdpRebuild.ModuleRebuildService _rebuild;
private readonly DataPlatform.MdpRebuild.IModuleRebuildJobStore _rebuildJobs;
public MdpMonitorService(
ISqlSugarClient db,
UserManager userManager,
MdpOutboundGate outboundGate,
DataPlatform.MdpRebuild.IModuleRebuildCapability rebuildCapability,
IEtlInstanceStore etlInstances,
DataPlatform.MdpRebuild.ModuleRebuildService rebuild,
DataPlatform.MdpRebuild.IModuleRebuildJobStore rebuildJobs)
{
_db = db;
_userManager = userManager;
_outboundGate = outboundGate;
_rebuildCapability = rebuildCapability;
_etlInstances = etlInstances;
_rebuild = rebuild;
_rebuildJobs = rebuildJobs;
}
/// 超管接口的统一门。前端的 v-if 只是不渲染,鉴权只认这里。
private void RequireSuperAdmin()
{
if (!_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.SA001);
}
[DisplayName("超管:租户列表")]
[HttpGet("mdp-monitor/admin/tenants")]
public async Task