IqcReturnQueryService.cs 6.5 KB

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