RequirementExamineDetailService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 = _userManager.TenantId;
  27. var pars = new List<SugarParameter> { new("@TenantId", tenantId) };
  28. var where = new List<string>
  29. {
  30. "d.tenant_id = @TenantId",
  31. """
  32. d.calc_batch_id = (
  33. SELECT r.batch_id
  34. FROM mdp_transform_run_log r
  35. WHERE r.job_code = 'S1_MDP_SYNC_TRANSFORM'
  36. AND r.status = 'SUCCESS'
  37. ORDER BY r.start_time DESC, r.id DESC
  38. LIMIT 1
  39. )
  40. """
  41. };
  42. if (!string.IsNullOrWhiteSpace(input.BillNo))
  43. {
  44. where.Add("d.bill_no LIKE @BillNo");
  45. pars.Add(new SugarParameter("@BillNo", $"%{input.BillNo.Trim()}%"));
  46. }
  47. if (!string.IsNullOrWhiteSpace(input.MorderNo))
  48. {
  49. where.Add("d.morder_no LIKE @MorderNo");
  50. pars.Add(new SugarParameter("@MorderNo", $"%{input.MorderNo.Trim()}%"));
  51. }
  52. if (!string.IsNullOrWhiteSpace(input.ItemNumber))
  53. {
  54. where.Add("d.item_number = @ItemNumber");
  55. pars.Add(new SugarParameter("@ItemNumber", input.ItemNumber.Trim()));
  56. }
  57. var whereSql = string.Join(" AND ", where);
  58. var orderExpr = ResolveOrderClause(input.OrderBy, input.Sort);
  59. var baseSql = $"""
  60. SELECT
  61. d.row_id AS RowId,
  62. d.parent_row_id AS ParentRowId,
  63. d.num AS Num,
  64. d.item_number AS ItemNumber,
  65. d.item_name AS ItemName,
  66. d.bom_number AS BomNumber,
  67. d.model AS Model,
  68. DATE_FORMAT(d.kitting_time, '%Y-%m-%d') AS KittingTime,
  69. d.item_type AS Type,
  70. d.erp_cls_name AS ErpClsName,
  71. d.qty AS Qty,
  72. IFNULL(d.wastage, 0) AS Wastage,
  73. d.need_count AS NeedCount,
  74. d.sqty AS Sqty,
  75. d.use_qty AS UseQty,
  76. d.self_lack_qty AS SelfLackQty,
  77. d.lack_qty AS LackQty,
  78. d.mo_qty AS MoQty,
  79. d.make_qty AS MakeQty,
  80. d.purchase_qty AS PurchaseQty,
  81. d.purchase_occupy_qty AS PurchaseOccupyQty,
  82. DATE_FORMAT(d.satisfy_time, '%Y-%m-%d') AS SatisfyTime,
  83. d.have_ic_subs AS HaveIcSubs,
  84. d.substitute_code AS SubstituteCode,
  85. d.bill_no AS BillNo,
  86. d.morder_no AS MorderNo,
  87. d.create_time AS CreateTime
  88. FROM dwd_requirement_examine_detail d
  89. WHERE {whereSql}
  90. """;
  91. var countSql = $"SELECT COUNT(*) FROM ({baseSql}) AS t";
  92. var total = await _db.Ado.GetIntAsync(countSql, pars);
  93. var offset = (input.Page - 1) * input.PageSize;
  94. var dataSql = $"""
  95. SELECT * FROM ({baseSql}) AS t
  96. ORDER BY {orderExpr}
  97. LIMIT {input.PageSize} OFFSET {offset}
  98. """;
  99. var list = await _db.Ado.SqlQueryAsync<RequirementExamineDetailRow>(dataSql, pars);
  100. // 分页内重算序号(与当前页一致)
  101. var snoStart = offset + 1;
  102. for (var i = 0; i < list.Count; i++)
  103. list[i].Sno = snoStart + i;
  104. return new
  105. {
  106. total,
  107. page = input.Page,
  108. pageSize = input.PageSize,
  109. list
  110. };
  111. }
  112. private static string ResolveOrderClause(string? orderBy, string? sort)
  113. {
  114. var desc = string.Equals(sort?.Trim(), "desc", StringComparison.OrdinalIgnoreCase);
  115. var dir = desc ? "DESC" : "ASC";
  116. var key = orderBy?.Trim();
  117. var col = key?.ToLowerInvariant() switch
  118. {
  119. "sno" => "t.RowId",
  120. "rowid" => "t.RowId",
  121. "billno" => "t.BillNo",
  122. "morderno" => "t.MorderNo",
  123. "itemnumber" => "t.ItemNumber",
  124. "kittingtime" => "t.KittingTime",
  125. _ => "t.RowId"
  126. };
  127. return $"{col} {dir}, t.RowId ASC";
  128. }
  129. }