RequirementExamineDetailService.cs 5.0 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. private readonly UserManager _userManager;
  14. public RequirementExamineDetailService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. /// <summary>
  20. /// 分页查询需求明细核验(扁平行;前端组树)
  21. /// </summary>
  22. [DisplayName("需求明细分页列表")]
  23. [HttpGet("examine-detail/list")]
  24. public async Task<object> PageRequirementExamineDetail([FromQuery] RequirementExamineDetailListInput input)
  25. {
  26. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  27. var pars = new List<SugarParameter> { new("@TenantId", tenantId) };
  28. var where = new List<string>
  29. {
  30. "er.tenant_id = @TenantId",
  31. "IFNULL(er.IsDeleted, 0) = 0",
  32. "IFNULL(bce.is_use, 0) = 1"
  33. };
  34. if (!string.IsNullOrWhiteSpace(input.BillNo))
  35. {
  36. where.Add("er.bill_no LIKE @BillNo");
  37. pars.Add(new SugarParameter("@BillNo", $"%{input.BillNo.Trim()}%"));
  38. }
  39. if (!string.IsNullOrWhiteSpace(input.MorderNo))
  40. {
  41. where.Add("er.morder_no LIKE @MorderNo");
  42. pars.Add(new SugarParameter("@MorderNo", $"%{input.MorderNo.Trim()}%"));
  43. }
  44. if (!string.IsNullOrWhiteSpace(input.ItemNumber))
  45. {
  46. where.Add("bce.item_number = @ItemNumber");
  47. pars.Add(new SugarParameter("@ItemNumber", input.ItemNumber.Trim()));
  48. }
  49. var whereSql = string.Join(" AND ", where);
  50. var orderExpr = ResolveOrderClause(input.OrderBy, input.Sort);
  51. var baseSql = $"""
  52. SELECT
  53. bce.Id AS RowId,
  54. bce.parent_id AS ParentRowId,
  55. bce.num AS Num,
  56. bce.item_number AS ItemNumber,
  57. bce.item_name AS ItemName,
  58. bce.bom_number AS BomNumber,
  59. bce.model AS Model,
  60. DATE_FORMAT(bce.kitting_time, '%Y-%m-%d') AS KittingTime,
  61. bce.type AS Type,
  62. bce.erp_cls_name AS ErpClsName,
  63. bce.qty AS Qty,
  64. IFNULL(bce.wastage, 0) AS Wastage,
  65. bce.needCount AS NeedCount,
  66. bce.sqty AS Sqty,
  67. bce.use_qty AS UseQty,
  68. bce.self_lack_qty AS SelfLackQty,
  69. bce.lack_qty AS LackQty,
  70. bce.mo_qty AS MoQty,
  71. bce.make_qty AS MakeQty,
  72. bce.purchase_qty AS PurchaseQty,
  73. bce.purchase_occupy_qty AS PurchaseOccupyQty,
  74. DATE_FORMAT(bce.satisfy_time, '%Y-%m-%d') AS SatisfyTime,
  75. bce.haveicsubs AS HaveIcSubs,
  76. bce.substitute_code AS SubstituteCode,
  77. er.bill_no AS BillNo,
  78. er.morder_no AS MorderNo,
  79. bce.create_time AS CreateTime
  80. FROM b_examine_result er
  81. INNER JOIN (
  82. SELECT morder_no, MAX(Id) AS MaxId
  83. FROM b_examine_result
  84. WHERE tenant_id = @TenantId AND IFNULL(IsDeleted, 0) = 0
  85. GROUP BY morder_no
  86. ) latest ON er.Id = latest.MaxId
  87. INNER JOIN b_bom_child_examine bce ON er.Id = bce.examine_id AND bce.tenant_id = er.tenant_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. }