PurchaseOrderService.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. namespace Admin.NET.Plugin.AiDOP.Supply;
  2. /// <summary>
  3. /// 物料采购订单服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 309, Description = "物料采购订单")]
  6. [Route("api/Supply")]
  7. [AllowAnonymous]
  8. [NonUnify]
  9. public class PurchaseOrderService : IDynamicApiController, ITransient
  10. {
  11. private readonly ISqlSugarClient _db;
  12. public PurchaseOrderService(ISqlSugarClient db)
  13. {
  14. _db = db;
  15. }
  16. [DisplayName("物料采购订单列表")]
  17. [HttpGet("purchase-order/list")]
  18. public async Task<object> GetList([FromQuery] PurchaseOrderListInput input)
  19. {
  20. var page = input.Page <= 0 ? 1 : input.Page;
  21. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  22. var offset = (page - 1) * pageSize;
  23. var where = new List<string> { "1=1" };
  24. var pars = new List<SugarParameter>();
  25. if (!string.IsNullOrWhiteSpace(input.Cgdd))
  26. {
  27. where.Add("a.cgdd LIKE @Cgdd");
  28. pars.Add(new SugarParameter("@Cgdd", $"%{input.Cgdd.Trim()}%"));
  29. }
  30. if (!string.IsNullOrWhiteSpace(input.Wlbm))
  31. {
  32. where.Add("a.wlbm LIKE @Wlbm");
  33. pars.Add(new SugarParameter("@Wlbm", $"%{input.Wlbm.Trim()}%"));
  34. }
  35. if (!string.IsNullOrWhiteSpace(input.Gysdm))
  36. {
  37. where.Add("a.gysdm LIKE @Gysdm");
  38. pars.Add(new SugarParameter("@Gysdm", $"%{input.Gysdm.Trim()}%"));
  39. }
  40. if (!string.IsNullOrWhiteSpace(input.Sffbcx))
  41. {
  42. where.Add("(CASE WHEN b2.b2id IS NULL THEN 'X' ELSE 'V' END)=@Sffbcx");
  43. pars.Add(new SugarParameter("@Sffbcx", input.Sffbcx.Trim().ToUpperInvariant()));
  44. }
  45. var fromSql = $"""
  46. FROM (
  47. SELECT
  48. a.id, a.wlbm, a.wlms, a.wlgg, a.cgdd, a.jhdsl, a.wjhsl, a.jhd, a.yjjhrq, a.gysdm, a.gysmc,
  49. DATE_FORMAT(DATE(a.yjjhrq), '%Y-%m-%d') AS jhrq,
  50. CASE
  51. WHEN IFNULL(b.jqhf,'')='' AND IFNULL(b.qhdj,'')='' THEN 'wait'
  52. WHEN IFNULL(b.jqhf,'')='' AND IFNULL(b.qhdj,'')<>'' THEN 'refuse'
  53. WHEN b.jqhf IS NOT NULL AND DATEDIFF(DATE(a.yjjhrq), DATE(b.jqhf))>=0 THEN 'OK'
  54. ELSE 'NO'
  55. END AS sfyq,
  56. b.jqhf, a.ddhh, a.th, a.bbh, a.StdCost, a.PurCost, a.PurCost * a.jhdsl AS je,
  57. a.createtime, a.buyer, a.type AS ddlx, a.dw, a.payumconv, a.orddate
  58. FROM vscm_jhjh a
  59. LEFT JOIN (
  60. SELECT glid, MAX(jqhf) AS jqhf, GROUP_CONCAT(qhdj SEPARATOR '') AS qhdj
  61. FROM scm_jhjh_jq
  62. WHERE flag = 0
  63. GROUP BY glid
  64. ) b ON a.id = b.glid
  65. ) a
  66. LEFT JOIN (
  67. SELECT OrdNbr, OrdLine, SUM(ReceiptQty + yssl) AS zshl, SUM(yssl) AS rksl, SUM(QtyReturn) AS bhgsl, SUM(QtyReturned) AS thsl
  68. FROM vscm_cgshrk
  69. GROUP BY OrdNbr, OrdLine
  70. ) b ON a.cgdd = b.OrdNbr AND a.ddhh = b.OrdLine
  71. LEFT JOIN (
  72. SELECT po_bill, po_billline, SUM(sh_delivery_quantity) AS zfhl
  73. FROM scm_shdzb a
  74. INNER JOIN scm_shd b ON a.glid = b.id
  75. WHERE b.state = 0
  76. GROUP BY po_bill, po_billline
  77. ) c ON a.cgdd = c.po_bill AND a.ddhh = c.po_billline
  78. LEFT JOIN (
  79. SELECT cgdd, ddhh, MIN(id) AS b2id, MIN(hfsj) AS hfsj
  80. FROM scm_jhjh_jq
  81. WHERE flag = 2
  82. GROUP BY cgdd, ddhh
  83. ) b2 ON a.cgdd = b2.cgdd AND a.ddhh = b2.ddhh
  84. WHERE {string.Join(" AND ", where)}
  85. """;
  86. var orderBy = BuildOrderBy(input.SortField, input.SortOrder);
  87. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) {fromSql}", pars);
  88. var list = await _db.Ado.SqlQueryAsync<PurchaseOrderListRow>(
  89. $"""
  90. SELECT
  91. a.gysdm AS Gysdm,
  92. a.gysmc AS Gysmc,
  93. a.cgdd AS Cgdd,
  94. a.ddhh AS Ddhh,
  95. a.buyer AS Buyer,
  96. a.orddate AS Orddate,
  97. a.wlbm AS Wlbm,
  98. a.wlms AS Wlms,
  99. a.ddlx AS Ddlx,
  100. a.jhdsl AS Jhdsl,
  101. a.wjhsl AS Wjhsl,
  102. a.jhrq AS Jhrq,
  103. a.th AS Th,
  104. CASE WHEN b2.b2id IS NULL THEN 'X' ELSE DATE_FORMAT(b2.hfsj, '%Y.%m.%d') END AS Sffb,
  105. CASE WHEN b2.b2id IS NULL THEN 'X' ELSE 'V' END AS Sffbcx
  106. {fromSql}
  107. ORDER BY {orderBy}
  108. LIMIT {pageSize} OFFSET {offset}
  109. """,
  110. pars);
  111. return new { total, page, pageSize, list };
  112. }
  113. private static string BuildOrderBy(string? sortField, string? sortOrder)
  114. {
  115. var dir = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  116. return sortField?.ToLowerInvariant() switch
  117. {
  118. "gysdm" => $"a.gysdm {dir}",
  119. "gysmc" => $"a.gysmc {dir}",
  120. "cgdd" => $"a.cgdd {dir}",
  121. "ddhh" => $"a.ddhh {dir}",
  122. "buyer" => $"a.buyer {dir}",
  123. "orddate" => $"a.orddate {dir}",
  124. "wlbm" => $"a.wlbm {dir}",
  125. "wlms" => $"a.wlms {dir}",
  126. "ddlx" => $"a.ddlx {dir}",
  127. "jhdsl" => $"a.jhdsl {dir}",
  128. "wjhsl" => $"a.wjhsl {dir}",
  129. "jhrq" => $"a.jhrq {dir}",
  130. "th" => $"a.th {dir}",
  131. "sffb" => $"b2.hfsj {dir}",
  132. _ => "a.id DESC"
  133. };
  134. }
  135. private sealed class PurchaseOrderListRow
  136. {
  137. public string? Gysdm { get; set; }
  138. public string? Gysmc { get; set; }
  139. public string? Cgdd { get; set; }
  140. public string? Ddhh { get; set; }
  141. public string? Buyer { get; set; }
  142. public DateTime? Orddate { get; set; }
  143. public string? Wlbm { get; set; }
  144. public string? Wlms { get; set; }
  145. public string? Ddlx { get; set; }
  146. public decimal? Jhdsl { get; set; }
  147. public decimal? Wjhsl { get; set; }
  148. public string? Jhrq { get; set; }
  149. public string? Th { get; set; }
  150. public string? Sffb { get; set; }
  151. public string? Sffbcx { get; set; }
  152. }
  153. }