using Admin.NET.Plugin.AiDOP.DataPlatform.S1Refresh; using Admin.NET.Plugin.AiDOP.SmartOps; namespace Admin.NET.Plugin.AiDOP.Controllers; /// S1 看板轻量刷新与异步重算。独立控制器以避免继承 AidopKanbanController 的 AllowAnonymous。 [ApiController] [Route("api/AidopKanban")] [Authorize] [NonUnify] public class AidopKanbanS1RefreshController : ControllerBase { private readonly S1KpiTargetSnapshotRefreshService _snapshot; private readonly S1DashboardRebuildService _rebuild; private readonly UserManager _userManager; public AidopKanbanS1RefreshController( S1KpiTargetSnapshotRefreshService snapshot, S1DashboardRebuildService rebuild, UserManager userManager) { _snapshot = snapshot; _rebuild = rebuild; _userManager = userManager; } [HttpPost("s1/target-snapshot/refresh")] public async Task RefreshTargetSnapshot([FromQuery] long factoryId = 1, CancellationToken ct = default) { var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var result = await _snapshot.RefreshAsync(tenantId, factoryId, ct); return Ok(result); } [HttpPost("s1/rebuild-jobs")] public async Task EnqueueRebuild([FromQuery] long factoryId = 1, CancellationToken ct = default) { var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var (status, body) = await _rebuild.EnqueueAsync(tenantId, factoryId, _userManager.UserId, "MANUAL", ct); return StatusCode(status, body); } [HttpGet("s1/rebuild-jobs/latest")] public async Task LatestRebuild([FromQuery] long factoryId = 1, CancellationToken ct = default) { var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; var dto = await _rebuild.LatestAsync(tenantId, factoryId, ct); return Ok(dto); } [HttpGet("s1/rebuild-jobs/{jobId:long}")] public async Task GetRebuild(long jobId, [FromQuery] long factoryId = 1, CancellationToken ct = default) { var tenantId = AidopTenantScope.ResolveOrThrow(_userManager); if (factoryId <= 0) factoryId = 1; return Ok(await _rebuild.GetAsync(jobId, tenantId, factoryId, ct)); } }