AdoS8WatchDebugController.cs 2.9 KB

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