AdoS0TaskAssignmentsController.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using Admin.NET.Plugin.AiDOP.Dto.S0.Warehouse;
  2. using Admin.NET.Plugin.AiDOP.Entity.S0.Warehouse;
  3. using Admin.NET.Plugin.AiDOP.Infrastructure;
  4. namespace Admin.NET.Plugin.AiDOP.Controllers.S0.Warehouse;
  5. /// <summary>
  6. /// S0 物料状态任务指派(wms_rwzp 语义)。
  7. /// 多租户隔离:所有读写显式限定当前请求租户(AdoS0TenantScope.TryResolveRequired),不依赖全局 AOP 兜底。
  8. /// </summary>
  9. [ApiController]
  10. [Route("api/s0/warehouse/task-assignments")]
  11. [NonUnify]
  12. public class AdoS0TaskAssignmentsController : ControllerBase
  13. {
  14. private readonly SqlSugarRepository<AdoS0TaskAssignment> _rep;
  15. public AdoS0TaskAssignmentsController(SqlSugarRepository<AdoS0TaskAssignment> rep)
  16. {
  17. _rep = rep;
  18. }
  19. [HttpGet]
  20. public async Task<IActionResult> GetPagedAsync([FromQuery] AdoS0TaskAssignmentQueryDto q)
  21. {
  22. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  23. (q.Page, q.PageSize) = PagingGuard.Normalize(q.Page, q.PageSize);
  24. var query = _rep.AsQueryable()
  25. .Where(x => x.TenantId == tenantId)
  26. .WhereIF(q.CompanyRefId.HasValue, x => x.CompanyRefId == q.CompanyRefId!.Value)
  27. .WhereIF(q.FactoryRefId.HasValue, x => x.FactoryRefId == q.FactoryRefId!.Value)
  28. .WhereIF(!string.IsNullOrWhiteSpace(q.DomainCode), x => x.DomainCode == q.DomainCode)
  29. .WhereIF(!string.IsNullOrWhiteSpace(q.Rwlx), x => x.Rwlx == q.Rwlx)
  30. .WhereIF(!string.IsNullOrWhiteSpace(q.Zt), x => x.Zt == q.Zt)
  31. .WhereIF(!string.IsNullOrWhiteSpace(q.Sqr), x => x.Sqr != null && x.Sqr.Contains(q.Sqr!))
  32. .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
  33. x => (x.Wlbm != null && x.Wlbm.Contains(q.Keyword!)) || (x.Sqr != null && x.Sqr.Contains(q.Keyword!)));
  34. var total = await query.CountAsync();
  35. var list = await query
  36. .OrderByDescending(x => x.Tcrq)
  37. .Skip((q.Page - 1) * q.PageSize)
  38. .Take(q.PageSize)
  39. .ToListAsync();
  40. return Ok(new { total, page = q.Page, pageSize = q.PageSize, list });
  41. }
  42. [HttpGet("{id:long}")]
  43. public async Task<IActionResult> GetAsync(long id)
  44. {
  45. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  46. var item = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
  47. return item == null ? NotFound() : Ok(item);
  48. }
  49. [HttpPost]
  50. public async Task<IActionResult> CreateAsync([FromBody] AdoS0TaskAssignmentUpsertDto dto)
  51. {
  52. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  53. if (string.IsNullOrWhiteSpace(dto.DomainCode))
  54. return AdoS0ApiErrors.InvalidRequest("请填写域编码");
  55. // 唯一口径对齐数据库 uk_wms_rwzp_tenant_org_task
  56. // (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)
  57. if (await IsDuplicateAsync(tenantId, dto, null))
  58. return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "相同工厂域下该物料任务指派已存在");
  59. var entity = new AdoS0TaskAssignment
  60. {
  61. TenantId = tenantId,
  62. CompanyRefId = dto.CompanyRefId,
  63. FactoryRefId = dto.FactoryRefId,
  64. DomainCode = dto.DomainCode ?? string.Empty,
  65. Tcrq = dto.Tcrq,
  66. Sqr = dto.Sqr,
  67. Rwlx = dto.Rwlx,
  68. Wlbm = dto.Wlbm,
  69. Sl = dto.Sl,
  70. Rqpc = dto.Rqpc,
  71. Yskw = dto.Yskw,
  72. Mdkw = dto.Mdkw,
  73. Xqsj = dto.Xqsj,
  74. Clr = dto.Clr,
  75. Bz = dto.Bz,
  76. Zt = dto.Zt,
  77. CreateUser = dto.CreateUser,
  78. CreateTime = DateTime.Now
  79. };
  80. await _rep.AsInsertable(entity).ExecuteReturnEntityAsync();
  81. return Ok(entity);
  82. }
  83. [HttpPut("{id:long}")]
  84. public async Task<IActionResult> UpdateAsync(long id, [FromBody] AdoS0TaskAssignmentUpsertDto dto)
  85. {
  86. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  87. if (string.IsNullOrWhiteSpace(dto.DomainCode))
  88. return AdoS0ApiErrors.InvalidRequest("请填写域编码");
  89. var entity = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
  90. if (entity == null) return NotFound();
  91. if (await IsDuplicateAsync(tenantId, dto, id))
  92. return AdoS0ApiErrors.Conflict(AdoS0ErrorCodes.DuplicateCode, "相同工厂域下该物料任务指派已存在");
  93. // entity.TenantId 保持不变(== tenantId);不接受前端修改 tenant
  94. entity.CompanyRefId = dto.CompanyRefId;
  95. entity.FactoryRefId = dto.FactoryRefId;
  96. entity.DomainCode = dto.DomainCode ?? string.Empty;
  97. entity.Tcrq = dto.Tcrq;
  98. entity.Sqr = dto.Sqr;
  99. entity.Rwlx = dto.Rwlx;
  100. entity.Wlbm = dto.Wlbm;
  101. entity.Sl = dto.Sl;
  102. entity.Rqpc = dto.Rqpc;
  103. entity.Yskw = dto.Yskw;
  104. entity.Mdkw = dto.Mdkw;
  105. entity.Xqsj = dto.Xqsj;
  106. entity.Clr = dto.Clr;
  107. entity.Bz = dto.Bz;
  108. entity.Zt = dto.Zt;
  109. entity.UpdateUser = dto.UpdateUser;
  110. entity.UpdateTime = DateTime.Now;
  111. await _rep.AsUpdateable(entity).ExecuteCommandAsync();
  112. return Ok(entity);
  113. }
  114. [HttpDelete("{id:long}")]
  115. public async Task<IActionResult> DeleteAsync(long id)
  116. {
  117. if (!AdoS0TenantScope.TryResolveRequired(out var tenantId, out var tenantError)) return tenantError!;
  118. var item = await _rep.AsQueryable().Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
  119. if (item == null) return NotFound();
  120. await _rep.DeleteAsync(item);
  121. return Ok(new { message = "删除成功" });
  122. }
  123. /// <summary>
  124. /// 租户内业务唯一校验:对齐 uk_wms_rwzp_tenant_org_task
  125. /// (tenant_id, company_ref_id, factory_ref_id, domain_code, rwlx, wlbm, rqpc, yskw, mdkw)。
  126. /// excludeId 非空时排除自身(更新场景)。
  127. /// </summary>
  128. private async Task<bool> IsDuplicateAsync(long tenantId, AdoS0TaskAssignmentUpsertDto dto, long? excludeId)
  129. {
  130. var domainCode = dto.DomainCode ?? string.Empty;
  131. return await _rep.AsQueryable()
  132. .Where(x => x.TenantId == tenantId
  133. && x.CompanyRefId == dto.CompanyRefId
  134. && x.FactoryRefId == dto.FactoryRefId
  135. && x.DomainCode == domainCode
  136. && x.Rwlx == dto.Rwlx
  137. && x.Wlbm == dto.Wlbm
  138. && x.Rqpc == dto.Rqpc
  139. && x.Yskw == dto.Yskw
  140. && x.Mdkw == dto.Mdkw)
  141. .WhereIF(excludeId.HasValue, x => x.Id != excludeId!.Value)
  142. .AnyAsync();
  143. }
  144. }