AdoS8WatchDebugController.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Admin.NET.Plugin.AiDOP.Infrastructure.S8;
  2. using Admin.NET.Plugin.AiDOP.Const.S8;
  3. using Admin.NET.Plugin.AiDOP.Service.S8;
  4. using Microsoft.Extensions.Configuration;
  5. namespace Admin.NET.Plugin.AiDOP.Controllers.S8;
  6. /// <summary>
  7. /// G-01 最小补验内部入口(非正式调度接入点)。
  8. /// 仅用于触发 S8 自动监控 MVP 主链一次,供端到端联调与验收取证;
  9. /// 不对外暴露业务语义,不作为长期 API。
  10. /// G08-06:移除匿名访问;由 appsettings 的 `WatchScheduler:DebugEndpointEnabled` 控制是否启用,
  11. /// 未启用时所有 Action 返回 404(语义等价于"未注册")。
  12. /// </summary>
  13. [ApiController]
  14. [Route("api/aidop/s8/watch-debug")]
  15. [NonUnify]
  16. public class AdoS8WatchDebugController : ControllerBase
  17. {
  18. private readonly S8WatchSchedulerService _svc;
  19. private readonly bool _debugEndpointEnabled;
  20. public AdoS8WatchDebugController(S8WatchSchedulerService svc, IConfiguration configuration)
  21. {
  22. _svc = svc;
  23. _debugEndpointEnabled = configuration.GetValue("WatchScheduler:DebugEndpointEnabled", false);
  24. }
  25. [HttpPost("run-once")]
  26. [S8Permission(S8PermissionCatalog.DebugRun)]
  27. public async Task<IActionResult> RunOnceAsync(
  28. [FromQuery] long tenantId = 1,
  29. [FromQuery] long factoryId = 1)
  30. {
  31. if (!_debugEndpointEnabled) return NotFound();
  32. var results = await _svc.CreateExceptionsAsync(tenantId, factoryId);
  33. return Ok(new
  34. {
  35. count = results.Count,
  36. results = results.Select(r => new
  37. {
  38. created = r.Created,
  39. skipped = r.Skipped,
  40. createdExceptionId = r.CreatedExceptionId,
  41. reason = r.Reason,
  42. errorMessage = r.ErrorMessage,
  43. sourceRuleId = r.DedupResult.Hit.SourceRuleId,
  44. relatedObjectCode = r.DedupResult.Hit.RelatedObjectCode,
  45. matchedExceptionId = r.DedupResult.MatchedExceptionId
  46. })
  47. });
  48. }
  49. /// <summary>
  50. /// S2-EW:仅供 e2e fixture 使用的 TEST_G09_ 数据软删入口。
  51. /// 安全契约:
  52. /// - 与 run-once 共用 _debugEndpointEnabled;未启用时 404。
  53. /// - tenantId / factoryId 必须显式传入(无默认值),缺参由 ASP.NET 返回 400。
  54. /// - 前缀 TEST_G09_ 在 service 端硬编码,本接口不接受 prefix 入参。
  55. /// - 仅 soft delete(SET IsDeleted=true),不触发物理 DELETE。
  56. /// </summary>
  57. [HttpDelete("test-cleanup")]
  58. [S8Permission(S8PermissionCatalog.DebugRun)]
  59. public async Task<IActionResult> TestCleanupAsync(
  60. [FromQuery] long? tenantId,
  61. [FromQuery] long? factoryId,
  62. [FromServices] S8ExceptionService exceptionSvc)
  63. {
  64. if (!_debugEndpointEnabled) return NotFound();
  65. if (tenantId is null || factoryId is null)
  66. return BadRequest(new { message = "tenantId and factoryId are required (no defaults)." });
  67. var deletedCount = await exceptionSvc.SoftDeleteTestPrefixAsync(tenantId.Value, factoryId.Value);
  68. return Ok(new { deletedCount });
  69. }
  70. }