IqcReturnQueryService.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using Admin.NET.Plugin.AiDOP.ProcurementExecution.Dto;
  2. namespace Admin.NET.Plugin.AiDOP.ProcurementExecution;
  3. /// <summary>
  4. /// S4 IQC 退货查询(只读列表)。数据:qms_qcp_insappnentry + qms_qcp_inspecapplyn + qms_qcp_inspbill,可选 PurOrdDetail / SuppMaster。
  5. /// 路由:/api/ProcurementExecution/iqc-return/list
  6. /// </summary>
  7. [ApiDescriptionSettings(Order = 322, Description = "S4 IQC退货查询")]
  8. [Route("api/ProcurementExecution")]
  9. [AllowAnonymous]
  10. [NonUnify]
  11. public class IqcReturnQueryService : IDynamicApiController, ITransient
  12. {
  13. private readonly ISqlSugarClient _db;
  14. public IqcReturnQueryService(ISqlSugarClient db) => _db = db;
  15. /// <summary>
  16. /// 退货相关处理方式:NULL 视作 0;与 aidopdev 中 clfs 枚举一致时可再收紧为仅 clfs=3。
  17. /// </summary>
  18. private const string ReturnClfsPredicate = "(IFNULL(a.clfs, 0) IN (0, 3))";
  19. private static string NormalizeOrderBy(string field, string order)
  20. {
  21. var col = (field ?? "").Trim().ToLowerInvariant();
  22. var ord = string.Equals(order?.Trim(), "desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC";
  23. var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
  24. {
  25. ["fbillno"] = "t.FBillNo",
  26. ["ordnbr"] = "t.OrdNbr",
  27. ["pch"] = "t.Pch",
  28. ["fmaterialcfg"] = "t.FMaterialCfg",
  29. ["sortname"] = "t.SortName",
  30. ["supp"] = "t.Supp",
  31. ["gysmc"] = "t.Gysmc",
  32. ["wlmc"] = "t.Wlmc",
  33. ["ggxh"] = "t.Ggxh",
  34. ["frinsqty"] = "t.FrInsQty",
  35. ["bhgsl"] = "t.Bhgsl",
  36. ["clfs"] = "t.Clfs",
  37. ["finspectstatus"] = "t.FInspectStatus",
  38. ["fapplytime"] = "t.FApplyTime",
  39. ["finspeenddate"] = "t.FInspeEndDate",
  40. };
  41. if (!map.TryGetValue(col, out var sqlCol))
  42. sqlCol = "t.FApplyTime";
  43. return $"ORDER BY {sqlCol} {ord}, t.EntryId ASC";
  44. }
  45. [DisplayName("IQC退货查询分页列表")]
  46. [HttpGet("iqc-return/list")]
  47. public async Task<object> GetList([FromQuery] IqcReturnListInput input)
  48. {
  49. var page = input.Page <= 0 ? 1 : input.Page;
  50. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  51. var offset = (page - 1) * pageSize;
  52. var cond = new List<string> { ReturnClfsPredicate };
  53. var pars = new List<SugarParameter>();
  54. if (!string.IsNullOrWhiteSpace(input.OrdNbr))
  55. {
  56. cond.Add("(TRIM(IFNULL(c.FSRCORDERNUM,'')) LIKE @OrdNbr OR TRIM(IFNULL(pod.PurOrd,'')) LIKE @OrdNbr)");
  57. pars.Add(new SugarParameter("@OrdNbr", $"%{input.OrdNbr.Trim()}%"));
  58. }
  59. if (!string.IsNullOrWhiteSpace(input.Pch))
  60. {
  61. cond.Add("TRIM(IFNULL(COALESCE(a.pch, c.FLOTNUMBER, ''),'')) LIKE @Pch");
  62. pars.Add(new SugarParameter("@Pch", $"%{input.Pch.Trim()}%"));
  63. }
  64. if (!string.IsNullOrWhiteSpace(input.FMaterialCfg))
  65. {
  66. cond.Add("TRIM(IFNULL(COALESCE(c.FMATERIALCFG, a.FMATERIALCFG, pod.ItemNum),'')) = TRIM(@FMat)");
  67. pars.Add(new SugarParameter("@FMat", input.FMaterialCfg.Trim()));
  68. }
  69. if (!string.IsNullOrWhiteSpace(input.SortName))
  70. {
  71. cond.Add("""
  72. (
  73. EXISTS (
  74. SELECT 1 FROM SuppMaster s
  75. WHERE TRIM(IFNULL(c.FSUPPLIER,'')) <> ''
  76. AND s.Supp = TRIM(IFNULL(c.FSUPPLIER,''))
  77. AND (pod.Domain IS NULL OR s.Domain = pod.Domain)
  78. AND TRIM(IFNULL(s.SortName,'')) LIKE @SortName
  79. LIMIT 1
  80. )
  81. OR TRIM(IFNULL(COALESCE(c.gysmc, a.gysmc, ''),'')) LIKE @SortName
  82. )
  83. """);
  84. pars.Add(new SugarParameter("@SortName", $"%{input.SortName.Trim()}%"));
  85. }
  86. var where = string.Join(" AND ", cond);
  87. var baseSql = $"""
  88. SELECT
  89. CAST(c.id AS CHAR(32)) AS RowKey,
  90. c.id AS EntryId,
  91. TRIM(IFNULL(
  92. NULLIF(TRIM(CAST(IFNULL(b.FBILLNO,'') AS CHAR(512))), ''),
  93. TRIM(IFNULL(a.FBILLNO,''))
  94. )) AS FBillNo,
  95. TRIM(IFNULL(c.FSRCORDERNUM,'')) AS OrdNbr,
  96. TRIM(IFNULL(COALESCE(a.pch, c.FLOTNUMBER, ''),'')) AS Pch,
  97. TRIM(IFNULL(COALESCE(c.FMATERIALCFG, a.FMATERIALCFG, pod.ItemNum),'')) AS FMaterialCfg,
  98. (SELECT TRIM(IFNULL(s.SortName,''))
  99. FROM SuppMaster s
  100. WHERE TRIM(IFNULL(c.FSUPPLIER,'')) <> ''
  101. AND s.Supp = TRIM(IFNULL(c.FSUPPLIER,''))
  102. AND (pod.Domain IS NULL OR s.Domain = pod.Domain)
  103. LIMIT 1) AS SortName,
  104. TRIM(IFNULL(c.FSUPPLIER,'')) AS Supp,
  105. TRIM(IFNULL(COALESCE(c.gysmc, a.gysmc, ''),'')) AS Gysmc,
  106. TRIM(IFNULL(COALESCE(c.wlmc, a.wlmc, ''),'')) AS Wlmc,
  107. TRIM(IFNULL(COALESCE(c.ggxh, a.ggxh, ''),'')) AS Ggxh,
  108. CAST(IFNULL(a.FRINSQTY, 0) AS DECIMAL(18,4)) AS FrInsQty,
  109. CAST(IFNULL(a.bhgsl, 0) AS DECIMAL(18,4)) AS Bhgsl,
  110. a.clfs AS Clfs,
  111. TRIM(IFNULL(a.thyy,'')) AS Thyy,
  112. TRIM(IFNULL(c.FINSPECTSTATUS,'')) AS FInspectStatus,
  113. b.FAPPLYTIME AS FApplyTime,
  114. a.FINSPEENDDATE AS FInspeEndDate
  115. FROM qms_qcp_insappnentry c
  116. INNER JOIN qms_qcp_inspecapplyn b ON b.id = c.glid
  117. LEFT JOIN qms_qcp_inspbill a
  118. ON BINARY TRIM(IFNULL(a.lydjbh,'')) = BINARY TRIM(CAST(IFNULL(b.FBILLNO,'') AS CHAR(512)))
  119. LEFT JOIN PurOrdDetail pod
  120. ON TRIM(IFNULL(c.FSRCORDERNUM,'')) <> ''
  121. AND pod.PurOrd = TRIM(IFNULL(c.FSRCORDERNUM,''))
  122. AND TRIM(IFNULL(c.FSRCBILLENTRYSEQ,'')) <> ''
  123. AND CAST(pod.Line AS CHAR(32)) = TRIM(IFNULL(c.FSRCBILLENTRYSEQ,''))
  124. WHERE {where}
  125. """;
  126. var orderBy = NormalizeOrderBy(input.SortField, input.SortOrder);
  127. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) FROM ({baseSql}) t", pars);
  128. var list = await _db.Ado.SqlQueryAsync<IqcReturnListRow>(
  129. $"SELECT * FROM ({baseSql}) t {orderBy} LIMIT {pageSize} OFFSET {offset}", pars);
  130. return new { total, page, pageSize, list };
  131. }
  132. }