PendingInspectionService.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
  2. namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
  3. /// <summary>
  4. /// S5 暂收在检列表 只读 list 服务。
  5. ///
  6. /// 数据源:aidopdev.MissedPrint(Status='I' 暂收待检、Qty>0、Location 空),忠实复刻旧系统存储过程
  7. /// pr_WMS_GetMissedTempQty:LEFT JOIN qms_qcp_inspecapplyn/qms_qcp_insappnentry 取检验状态,按
  8. /// Supply/PurOrd/PurLine/ShipperNbr/ItemNum/LotSerial 聚合(MAX Shelf/SUM Qty/MAX CheckNo/MAX FINSPECTSTATUS),
  9. /// 再 LEFT JOIN ItemMaster(描述/单位)、SuppMaster(简称),clfs='3' 追加“-挑选使用”。
  10. /// Domain 由 GeneralizedCodeMaster(SystemConfig/CompanyCode) 解析,默认 8010。
  11. ///
  12. /// 本服务仅 SELECT:无新增/编辑/删除/库存事务/状态流转;MissedPrint 无 tenant_id,不做租户过滤。
  13. /// </summary>
  14. [ApiDescriptionSettings(Order = 301, Description = "暂收在检列表")]
  15. [Route("api/S5PendingInspection")]
  16. [AllowAnonymous]
  17. [NonUnify]
  18. public class PendingInspectionService : IDynamicApiController, ITransient
  19. {
  20. private readonly ISqlSugarClient _db;
  21. public PendingInspectionService(ISqlSugarClient db)
  22. {
  23. _db = db;
  24. }
  25. /// <summary>解析公司域(GeneralizedCodeMaster SystemConfig/CompanyCode,默认 8010)。</summary>
  26. private async Task<string> ResolveDomainAsync()
  27. {
  28. var list = await _db.Ado.SqlQueryAsync<string>(
  29. "SELECT Domain FROM GeneralizedCodeMaster WHERE FldName='SystemConfig' AND Val='CompanyCode' ORDER BY RecID LIMIT 1");
  30. var domain = list.FirstOrDefault();
  31. return string.IsNullOrWhiteSpace(domain) ? "8010" : domain;
  32. }
  33. /// <summary>
  34. /// 暂收在检列表(只读分页查询)。
  35. /// </summary>
  36. [DisplayName("暂收在检列表")]
  37. [HttpGet("list")]
  38. public async Task<object> GetList([FromQuery] PendingInspectionListInput input)
  39. {
  40. var page = input.Page <= 0 ? 1 : input.Page;
  41. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  42. var offset = (page - 1) * pageSize;
  43. var domain = await ResolveDomainAsync();
  44. var where = new List<string>
  45. {
  46. "m.Domain = @Domain",
  47. "m.Status = 'I'",
  48. "m.Qty > 0",
  49. "IFNULL(m.Location,'') = ''",
  50. };
  51. var pars = new List<SugarParameter> { new("@Domain", domain) };
  52. if (!string.IsNullOrWhiteSpace(input.DemandNo))
  53. {
  54. where.Add("m.PurOrd LIKE @DemandNo");
  55. pars.Add(new SugarParameter("@DemandNo", $"%{input.DemandNo.Trim()}%"));
  56. }
  57. if (!string.IsNullOrWhiteSpace(input.Shelf))
  58. {
  59. where.Add("m.Shelf LIKE @Shelf");
  60. pars.Add(new SugarParameter("@Shelf", $"%{input.Shelf.Trim()}%"));
  61. }
  62. if (!string.IsNullOrWhiteSpace(input.BatchNo))
  63. {
  64. where.Add("m.LotSerial LIKE @BatchNo");
  65. pars.Add(new SugarParameter("@BatchNo", $"%{input.BatchNo.Trim()}%"));
  66. }
  67. if (!string.IsNullOrWhiteSpace(input.MaterialCode))
  68. {
  69. where.Add("m.ItemNum LIKE @MaterialCode");
  70. pars.Add(new SugarParameter("@MaterialCode", $"%{input.MaterialCode.Trim()}%"));
  71. }
  72. if (!string.IsNullOrWhiteSpace(input.InspectStatus))
  73. {
  74. where.Add("d.FINSPECTSTATUS = @InspectStatus");
  75. pars.Add(new SugarParameter("@InspectStatus", input.InspectStatus.Trim()));
  76. }
  77. if (!string.IsNullOrWhiteSpace(input.Supplier))
  78. {
  79. where.Add("m.Supply = @Supplier");
  80. pars.Add(new SugarParameter("@Supplier", input.Supplier.Trim()));
  81. }
  82. var whereSql = string.Join(" AND ", where);
  83. // 复刻存储过程 @tbLocDet 聚合层
  84. var groupedInner =
  85. $"""
  86. SELECT m.Supply, m.PurOrd, m.PurLine, m.ItemNum, m.ShipperNbr, m.LotSerial,
  87. MAX(m.Shelf) AS Shelf, SUM(m.Qty) AS Qty, MAX(m.CheckNo) AS CheckNo,
  88. MAX(IFNULL(d.FINSPECTSTATUS,'')) AS FINSPECTSTATUS
  89. FROM MissedPrint m
  90. LEFT JOIN qms_qcp_inspecapplyn q ON m.CheckNo = q.FBILLNO
  91. LEFT JOIN qms_qcp_insappnentry d ON q.id = d.glid
  92. WHERE {whereSql}
  93. GROUP BY m.Supply, m.PurOrd, m.PurLine, m.ShipperNbr, m.ItemNum, m.LotSerial
  94. """;
  95. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) FROM ({groupedInner}) t", pars);
  96. var grandList = await _db.Ado.SqlQueryAsync<decimal>($"SELECT IFNULL(SUM(t.Qty),0) FROM ({groupedInner}) t", pars);
  97. var grandTotalQty = grandList.FirstOrDefault();
  98. var list = await _db.Ado.SqlQueryAsync<PendingInspectionListRow>(
  99. $"""
  100. SELECT
  101. t.PurOrd AS DemandNo,
  102. t.PurLine AS DemandLineNo,
  103. t.ItemNum AS MaterialCode,
  104. i.Descr AS MaterialName,
  105. t.LotSerial AS BatchNo,
  106. t.Qty AS Qty,
  107. i.UM AS Unit,
  108. t.Shelf AS PendingShelf,
  109. t.ShipperNbr AS DeliveryNo,
  110. t.CheckNo AS InspectNo,
  111. CONCAT(t.FINSPECTSTATUS,
  112. CASE WHEN (SELECT MAX(ib.clfs) FROM qms_qcp_inspbill ib WHERE ib.lydjbh = t.CheckNo) = '3'
  113. THEN '-挑选使用' ELSE '' END) AS InspectStatus,
  114. t.Supply AS Supplier,
  115. s.SortName AS SupplierShortName
  116. FROM ({groupedInner}) t
  117. LEFT JOIN ItemMaster i ON i.Domain = @Domain AND t.ItemNum = i.ItemNum
  118. LEFT JOIN SuppMaster s ON s.Domain = @Domain AND t.Supply = s.Supp
  119. ORDER BY t.Supply, t.PurOrd, t.PurLine
  120. LIMIT {pageSize} OFFSET {offset}
  121. """,
  122. pars);
  123. return new { total, page, pageSize, list, grandTotalQty };
  124. }
  125. /// <summary>
  126. /// 检验状态下拉选项(qms_qcp_insappnentry.FINSPECTSTATUS distinct,只读)。
  127. /// </summary>
  128. [DisplayName("暂收在检检验状态选项")]
  129. [HttpGet("status-options")]
  130. public async Task<object> GetStatusOptions()
  131. {
  132. var list = await _db.Ado.SqlQueryAsync<PendingInspectionStatusOption>(
  133. """
  134. SELECT DISTINCT FINSPECTSTATUS AS Val
  135. FROM qms_qcp_insappnentry
  136. WHERE IFNULL(FINSPECTSTATUS,'') <> ''
  137. ORDER BY FINSPECTSTATUS
  138. """);
  139. return list;
  140. }
  141. /// <summary>
  142. /// 供应商下拉选项(暂收在检集合内 distinct Supply + SuppMaster.SortName,只读)。
  143. /// </summary>
  144. [DisplayName("暂收在检供应商选项")]
  145. [HttpGet("supplier-options")]
  146. public async Task<object> GetSupplierOptions()
  147. {
  148. var domain = await ResolveDomainAsync();
  149. var list = await _db.Ado.SqlQueryAsync<PendingInspectionSupplierOption>(
  150. """
  151. SELECT DISTINCT m.Supply AS Val, s.SortName AS Label
  152. FROM MissedPrint m
  153. LEFT JOIN SuppMaster s ON s.Domain = @Domain AND m.Supply = s.Supp
  154. WHERE m.Domain = @Domain AND m.Status = 'I' AND m.Qty > 0 AND IFNULL(m.Location,'') = ''
  155. AND IFNULL(m.Supply,'') <> ''
  156. ORDER BY m.Supply
  157. """,
  158. new List<SugarParameter> { new("@Domain", domain) });
  159. return list;
  160. }
  161. }