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));
}
}