RequirementExamineDetailService.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. namespace Admin.NET.Plugin.AiDOP.Order;
  2. /// <summary>
  3. /// 需求明细核验(资源检查运算明细,只读查询)
  4. /// 路由前缀:/api/Order/examine-detail/...
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 255, Description = "需求明细核验")]
  7. [Route("api/Order")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class RequirementExamineDetailService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. public RequirementExamineDetailService(ISqlSugarClient db)
  14. {
  15. _db = db;
  16. }
  17. /// <summary>
  18. /// 分页查询需求明细核验(扁平行;前端组树)
  19. /// </summary>
  20. [DisplayName("需求明细分页列表")]
  21. [HttpGet("examine-detail/list")]
  22. public async Task<object> PageRequirementExamineDetail([FromQuery] RequirementExamineDetailListInput input)
  23. {
  24. var pars = new List<SugarParameter>();
  25. var where = new List<string> { "bce.is_use = 1" };
  26. if (!string.IsNullOrWhiteSpace(input.BillNo))
  27. {
  28. where.Add("sen.bill_no LIKE @BillNo");
  29. pars.Add(new SugarParameter("@BillNo", $"%{input.BillNo.Trim()}%"));
  30. }
  31. if (!string.IsNullOrWhiteSpace(input.MorderNo))
  32. {
  33. where.Add("ber.morder_no LIKE @MorderNo");
  34. pars.Add(new SugarParameter("@MorderNo", $"%{input.MorderNo.Trim()}%"));
  35. }
  36. if (!string.IsNullOrWhiteSpace(input.ItemNumber))
  37. {
  38. where.Add("bce.item_number = @ItemNumber");
  39. pars.Add(new SugarParameter("@ItemNumber", input.ItemNumber.Trim()));
  40. }
  41. var whereSql = string.Join(" AND ", where);
  42. var orderExpr = ResolveOrderClause(input.OrderBy, input.Sort);
  43. var baseSql = $"""
  44. SELECT
  45. bce.id AS RowId,
  46. CASE
  47. WHEN bce.num = 1 THEN NULL
  48. ELSE (
  49. SELECT MIN(x.id)
  50. FROM b_bom_child_examine x
  51. WHERE x.examine_id = bce.examine_id AND x.num = 1 AND x.is_use = 1
  52. )
  53. END AS ParentRowId,
  54. CAST(bce.num AS CHAR) AS Num,
  55. bce.item_number AS ItemNumber,
  56. bce.item_name AS ItemName,
  57. bce.bom_number AS BomNumber,
  58. bce.model AS Model,
  59. DATE_FORMAT(bce.kitting_time, '%Y-%m-%d') AS KittingTime,
  60. CASE WHEN bce.type = 1 THEN '替代件' ELSE '标准件' END AS Type,
  61. CASE bce.erp_cls
  62. WHEN 0 THEN '配置类'
  63. WHEN 1 THEN '自制'
  64. WHEN 2 THEN '委外加工'
  65. WHEN 3 THEN '外购'
  66. WHEN 4 THEN '虚拟件'
  67. END AS ErpClsName,
  68. CAST(bce.qty AS DECIMAL(18,4)) AS Qty,
  69. CAST(IFNULL(bce.wastage, 0) AS DECIMAL(18,4)) AS Wastage,
  70. CAST(bce.needCount AS DECIMAL(18,4)) AS NeedCount,
  71. CAST(bce.sqty AS DECIMAL(18,4)) AS Sqty,
  72. CAST(bce.use_qty AS DECIMAL(18,4)) AS UseQty,
  73. CAST(bce.self_lack_qty AS DECIMAL(18,4)) AS SelfLackQty,
  74. CAST(bce.lack_qty AS DECIMAL(18,4)) AS LackQty,
  75. CAST(bce.mo_qty AS DECIMAL(18,4)) AS MoQty,
  76. CAST(IF(bce.make_qty = 0 AND bce.erp_cls = 1, bce.lack_qty, bce.make_qty) AS DECIMAL(18,4)) AS MakeQty,
  77. CAST(bce.purchase_qty AS DECIMAL(18,4)) AS PurchaseQty,
  78. CAST(bce.purchase_occupy_qty AS DECIMAL(18,4)) AS PurchaseOccupyQty,
  79. DATE_FORMAT(bce.satisfy_time, '%Y-%m-%d') AS SatisfyTime,
  80. CASE WHEN bce.haveicsubs = 1 THEN '是' ELSE '否' END AS HaveIcSubs,
  81. bce.substitute_code AS SubstituteCode,
  82. sen.bill_no AS BillNo,
  83. ber.morder_no AS MorderNo,
  84. ber.create_time AS CreateTime
  85. FROM b_examine_result ber
  86. INNER JOIN b_bom_child_examine bce ON ber.Id = bce.examine_id
  87. LEFT JOIN crm_seorderentry sen ON ber.sentry_id = sen.id
  88. WHERE {whereSql}
  89. """;
  90. var countSql = $"SELECT COUNT(*) FROM ({baseSql}) AS t";
  91. var total = await _db.Ado.GetIntAsync(countSql, pars);
  92. var offset = (input.Page - 1) * input.PageSize;
  93. var dataSql = $"""
  94. SELECT * FROM ({baseSql}) AS t
  95. ORDER BY {orderExpr}
  96. LIMIT {input.PageSize} OFFSET {offset}
  97. """;
  98. var list = await _db.Ado.SqlQueryAsync<RequirementExamineDetailRow>(dataSql, pars);
  99. // 分页内重算序号(与当前页一致)
  100. var snoStart = offset + 1;
  101. for (var i = 0; i < list.Count; i++)
  102. list[i].Sno = snoStart + i;
  103. return new
  104. {
  105. total,
  106. page = input.Page,
  107. pageSize = input.PageSize,
  108. list
  109. };
  110. }
  111. private static string ResolveOrderClause(string? orderBy, string? sort)
  112. {
  113. var desc = string.Equals(sort?.Trim(), "desc", StringComparison.OrdinalIgnoreCase);
  114. var dir = desc ? "DESC" : "ASC";
  115. var key = orderBy?.Trim();
  116. var col = key?.ToLowerInvariant() switch
  117. {
  118. "sno" => "t.RowId",
  119. "rowid" => "t.RowId",
  120. "billno" => "t.BillNo",
  121. "morderno" => "t.MorderNo",
  122. "itemnumber" => "t.ItemNumber",
  123. "kittingtime" => "t.KittingTime",
  124. _ => "t.RowId"
  125. };
  126. return $"{col} {dir}, t.RowId ASC";
  127. }
  128. }