AdoS0WorkOrdControlController.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Admin.NET.Plugin.AiDOP.Dto.S0.Manufacturing;
  2. using Admin.NET.Plugin.AiDOP.Entity.S0.Manufacturing;
  3. namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Manufacturing;
  4. /// <summary>
  5. /// 工单控制参数设置(WorkOrdControl):单记录配置表单。
  6. ///
  7. /// 业务模型(S0-WORKORD-CONTROL-TENANT-UX-FIX):**每个租户一套配置**。
  8. /// - tenant_id 是唯一隔离边界;Domain 只是历史兼容业务字段,不承担可见性/安全职责。
  9. /// - GET 不要求传 Domain:不传即返回当前租户的配置,页面打开即可自动回填。
  10. /// - Upsert 按 Id 定位时必须先 tenant scope;Id 属于其他租户一律 404,绝不更新。
  11. /// - 单配置约束:未命中 Id 时按租户定位既有记录,不会因 Domain 不同而无限新建。
  12. /// </summary>
  13. [ApiController]
  14. [Route("api/s0/manufacturing/work-ord-control")]
  15. [NonUnify]
  16. public class AdoS0WorkOrdControlController : ControllerBase
  17. {
  18. private readonly SqlSugarRepository<AdoS0WorkOrdControl> _rep;
  19. public AdoS0WorkOrdControlController(SqlSugarRepository<AdoS0WorkOrdControl> rep)
  20. {
  21. _rep = rep;
  22. }
  23. [HttpGet]
  24. public async Task<IActionResult> GetOneAsync([FromQuery] AdoS0WorkOrdControlGetDto q)
  25. {
  26. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  27. // 租户优先:Domain 仅作可选业务筛选,留空即返回当前租户配置(页面无需先手输工厂域)。
  28. var domain = q.Domain?.Trim();
  29. var item = await _rep.ScopedTo(tenantId)
  30. .WhereIF(!string.IsNullOrWhiteSpace(domain), x => x.Domain == domain)
  31. .OrderBy(x => x.Id)
  32. .FirstAsync();
  33. return Ok(item);
  34. }
  35. [HttpPost("upsert")]
  36. public async Task<IActionResult> UpsertAsync([FromBody] AdoS0WorkOrdControlUpsertDto dto)
  37. {
  38. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  39. var now = DateTime.Now;
  40. var domain = dto.Domain?.Trim();
  41. AdoS0WorkOrdControl? entity = null;
  42. if (dto.Id is > 0)
  43. {
  44. // P0:先 tenant scope 再按 Id 命中。Id 属于其他租户时查不到 → 404,绝不落到 Update 分支。
  45. entity = await _rep.ScopedTo(tenantId)
  46. .Where(x => x.Id == dto.Id!.Value)
  47. .FirstAsync();
  48. if (entity == null) return NotFound();
  49. }
  50. // 单配置约束:一个租户最多一条当前配置,不因 Domain 不同而无限新建。
  51. entity ??= await _rep.ScopedTo(tenantId)
  52. .OrderBy(x => x.Id)
  53. .FirstAsync();
  54. if (entity == null)
  55. {
  56. entity = new AdoS0WorkOrdControl
  57. {
  58. TenantId = tenantId,
  59. // Domain 可空:留空存空串(列非空),不猜 8010 / S0-F001 等历史值。
  60. Domain = domain ?? string.Empty,
  61. EnteringPer = dto.EnteringPer,
  62. PaintingPer = dto.PaintingPer,
  63. IssuedInterval = dto.IssuedInterval,
  64. PostVarsatSFC = dto.PostVarsatSFC,
  65. IsIssued = dto.IsIssued,
  66. IsPrintRejectBarcode = dto.IsPrintRejectBarcode,
  67. IsPrintScrapBarcode = dto.IsPrintScrapBarcode,
  68. IsQualityConfirm = dto.IsQualityConfirm,
  69. IsActive = dto.IsActive,
  70. IsConfirm = dto.IsConfirm,
  71. CreateUser = dto.CreateUser ?? dto.UpdateUser,
  72. CreateTime = dto.CreateTime ?? dto.UpdateTime ?? now,
  73. UpdateUser = dto.UpdateUser,
  74. UpdateTime = dto.UpdateTime ?? now
  75. };
  76. await _rep.AsInsertable(entity).ExecuteReturnEntityAsync();
  77. return Ok(entity);
  78. }
  79. // 保值:dto 未传 Domain 时不得抹掉既有历史值。
  80. if (!string.IsNullOrWhiteSpace(domain)) entity.Domain = domain;
  81. entity.EnteringPer = dto.EnteringPer;
  82. entity.PaintingPer = dto.PaintingPer;
  83. entity.IssuedInterval = dto.IssuedInterval;
  84. entity.PostVarsatSFC = dto.PostVarsatSFC;
  85. entity.IsIssued = dto.IsIssued;
  86. entity.IsPrintRejectBarcode = dto.IsPrintRejectBarcode;
  87. entity.IsPrintScrapBarcode = dto.IsPrintScrapBarcode;
  88. entity.IsQualityConfirm = dto.IsQualityConfirm;
  89. entity.IsActive = dto.IsActive;
  90. entity.IsConfirm = dto.IsConfirm;
  91. entity.UpdateUser = dto.UpdateUser;
  92. entity.UpdateTime = dto.UpdateTime ?? now;
  93. await _rep.AsUpdateable(entity).ExecuteCommandAsync();
  94. return Ok(entity);
  95. }
  96. }