using Admin.NET.Plugin.AiDOP.DataPlatform.MdpRebuild; using Admin.NET.Plugin.AiDOP.SmartOps; namespace Admin.NET.Plugin.AiDOP.Controllers; /// S2–S7 异步重算与 S2–S7/S9 轻量快照刷新。独立控制器,避免继承 AidopKanbanController 的 AllowAnonymous。 [ApiController] [Route("api/AidopKanban")] [Authorize] [NonUnify] public class AidopKanbanModuleRefreshController : ControllerBase { private readonly S1KpiTargetSnapshotRefreshService _snapshot; private readonly ModuleRebuildService _rebuild; private readonly UserManager _userManager; public AidopKanbanModuleRefreshController( S1KpiTargetSnapshotRefreshService snapshot, ModuleRebuildService rebuild, UserManager userManager) { _snapshot = snapshot; _rebuild = rebuild; _userManager = userManager; } [HttpPost("{moduleCode}/target-snapshot/refresh")] public async Task RefreshTargetSnapshot(string moduleCode, [FromQuery] long factoryId = 1, CancellationToken ct = default) { var mc = MdpRebuildScope.NormalizeModule(moduleCode); if (string.Equals(mc, "S1", StringComparison.OrdinalIgnoreCase)) return NotFound(); if (!MdpRebuildScope.SnapshotModules.Contains(mc)) return NotFound(); var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var result = await _snapshot.RefreshAsync(mc, tenantId, factoryId, ct); return Ok(result); } [HttpPost("{moduleCode}/rebuild-jobs")] public async Task EnqueueRebuild(string moduleCode, [FromQuery] long factoryId = 1, CancellationToken ct = default) { var mc = MdpRebuildScope.NormalizeModule(moduleCode); if (string.Equals(mc, "S1", StringComparison.OrdinalIgnoreCase) || string.Equals(mc, "S9", StringComparison.OrdinalIgnoreCase)) return NotFound(); if (!MdpRebuildScope.RebuildModules.Contains(mc)) return NotFound(); var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var (status, body) = await _rebuild.EnqueueAsync(mc, tenantId, factoryId, _userManager.UserId, "MANUAL", ct); return StatusCode(status, body); } [HttpGet("{moduleCode}/rebuild-jobs/latest")] public async Task LatestRebuild(string moduleCode, [FromQuery] long factoryId = 1, CancellationToken ct = default) { var mc = MdpRebuildScope.NormalizeModule(moduleCode); if (string.Equals(mc, "S1", StringComparison.OrdinalIgnoreCase) || !MdpRebuildScope.RebuildModules.Contains(mc)) return NotFound(); var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var dto = await _rebuild.LatestAsync(mc, tenantId, factoryId, ct); return Ok(dto); } [HttpGet("{moduleCode}/rebuild-jobs/{jobId:long}")] public async Task GetRebuild(string moduleCode, long jobId, [FromQuery] long factoryId = 1, CancellationToken ct = default) { var mc = MdpRebuildScope.NormalizeModule(moduleCode); if (string.Equals(mc, "S1", StringComparison.OrdinalIgnoreCase) || !MdpRebuildScope.RebuildModules.Contains(mc)) return NotFound(); var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; return Ok(await _rebuild.GetAsync(mc, jobId, tenantId, factoryId, ct)); } }