SupplierDeliveryManagementService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using Admin.NET.Plugin.AiDOP.ProcurementExecution.Dto;
  2. namespace Admin.NET.Plugin.AiDOP.ProcurementExecution;
  3. /// <summary>
  4. /// S4 供应商交货管理
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 320, Description = "S4供应商交货管理")]
  7. [Route("api/ProcurementExecution")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class SupplierDeliveryManagementService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. private readonly UserManager _userManager;
  14. public SupplierDeliveryManagementService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. [DisplayName("供应商交货管理列表")]
  20. [HttpGet("supplier-delivery/list")]
  21. public async Task<object> GetList([FromQuery] SupplierDeliveryListInput input)
  22. {
  23. var pars = new List<SugarParameter>();
  24. var conditions = new List<string>();
  25. if (!string.IsNullOrWhiteSpace(input.Cgdd))
  26. {
  27. conditions.Add("v.cgdd LIKE @cgdd");
  28. pars.Add(new SugarParameter("@cgdd", $"%{input.Cgdd.Trim()}%"));
  29. }
  30. if (!string.IsNullOrWhiteSpace(input.DsNum))
  31. {
  32. conditions.Add("v.dsnum LIKE @dsnum");
  33. pars.Add(new SugarParameter("@dsnum", $"%{input.DsNum.Trim()}%"));
  34. }
  35. if (!string.IsNullOrWhiteSpace(input.Wlbm))
  36. {
  37. conditions.Add("v.wlbm LIKE @wlbm");
  38. pars.Add(new SugarParameter("@wlbm", $"%{input.Wlbm.Trim()}%"));
  39. }
  40. if (!string.IsNullOrWhiteSpace(input.Gys))
  41. {
  42. conditions.Add("(v.gysdm LIKE @gys OR v.gysmc LIKE @gys)");
  43. pars.Add(new SugarParameter("@gys", $"%{input.Gys.Trim()}%"));
  44. }
  45. var where = conditions.Count > 0 ? $" WHERE {string.Join(" AND ", conditions)} " : string.Empty;
  46. var orderBy = BuildOrderBy(input.SortField, input.SortOrder);
  47. var offset = (input.Page - 1) * input.PageSize;
  48. var wrapped = $"{BuildBaseSql()} {where}";
  49. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({wrapped}) t", pars);
  50. var list = await _db.Ado.SqlQueryAsync<SupplierDeliveryListRow>(
  51. $"SELECT * FROM ({wrapped}) t {orderBy} LIMIT {input.PageSize} OFFSET {offset}", pars);
  52. return new { total, page = input.Page, pageSize = input.PageSize, list };
  53. }
  54. [DisplayName("供应商交货管理发布")]
  55. [HttpPost("supplier-delivery/publish")]
  56. public async Task<object> Publish([FromBody] SupplierDeliveryBatchInput input)
  57. {
  58. var userId = _userManager.UserId.ToString();
  59. var userName = _userManager.Account ?? "system";
  60. var sql = """
  61. INSERT INTO `scm_jhjh_jq`
  62. (
  63. `id`,`glid`, `wlbm`, `wlms`, `wlgg`, `cgdd`,
  64. `jhdsl`, `wjhsl`, `jhd`, `yjjhrq`, `jqhf`,
  65. `type`, `flag`, `scrq`, `scrid`, `scrxm`,
  66. `gysdm`, `gysmc`, `hfrid`, `hfrxm`, `hfsj`,
  67. `qhdj`, `ddhh`, `dw`, `bzsl`, `ly`,`glid1`
  68. )
  69. SELECT
  70. UUID(),
  71. CAST(d.RecID AS CHAR(50)) AS glid,
  72. d.ItemNum AS wlbm,
  73. i.Descr AS wlms,
  74. i.Descr1 AS wlgg,
  75. p.PurOrd AS cgdd,
  76. CAST(d.QtyOrded AS CHAR(20)) AS jhdsl,
  77. (d.QtyOrded - d.RctQty - d.ReceiptQty + d.QtyReturned) AS wjhsl,
  78. '' AS jhd,
  79. DATE_FORMAT(DATE(d.DueDate), '%Y-%m-%d') AS yjjhrq,
  80. '' AS jqhf,
  81. p.Potype AS `type`,
  82. 2 AS flag,
  83. '' AS scrq,
  84. '' AS scrid,
  85. '' AS scrxm,
  86. p.Supp AS gysdm,
  87. s.SortName AS gysmc,
  88. @hfrid AS hfrid,
  89. @hfrxm AS hfrxm,
  90. DATE_FORMAT(NOW(), '%Y-%m-%d') AS hfsj,
  91. '' AS qhdj,
  92. d.Line AS ddhh,
  93. d.UM AS dw,
  94. d.StdPackQty AS bzsl,
  95. '2' AS ly,
  96. CAST(IFNULL(ds.id, d.RecID) AS CHAR(50)) AS glid1
  97. FROM PurOrdMaster p
  98. LEFT JOIN PurOrdDetail d
  99. ON p.Domain = d.Domain
  100. AND p.Potype = d.Potype
  101. AND p.PurOrd = d.PurOrd
  102. LEFT JOIN SuppMaster s
  103. ON p.Domain = s.Domain
  104. AND p.Supp = s.Supp
  105. LEFT JOIN ItemMaster i
  106. ON d.Domain = i.Domain
  107. AND d.ItemNum = i.ItemNum
  108. LEFT JOIN srm_polist_ds ds
  109. ON p.PurOrd = ds.ponumber
  110. AND p.Line = ds.poline
  111. WHERE p.IsActive = 1
  112. AND IFNULL(p.Status, '') <> 'C'
  113. AND IFNULL(d.Status, '') <> 'C'
  114. AND FIND_IN_SET(CAST(IFNULL(ds.id, d.RecID) AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
  115. AND NOT EXISTS (
  116. SELECT 1 FROM scm_jhjh_jq x
  117. WHERE x.flag = 2
  118. AND x.glid1 = CAST(IFNULL(ds.id, d.RecID) AS CHAR(50))
  119. );
  120. """;
  121. await _db.Ado.ExecuteCommandAsync(sql, new List<SugarParameter>
  122. {
  123. new("@ids", input.Ids),
  124. new("@hfrid", userId),
  125. new("@hfrxm", userName)
  126. });
  127. return new { message = "发布成功" };
  128. }
  129. [DisplayName("交货单关闭")]
  130. [HttpPost("supplier-delivery/close")]
  131. public async Task<object> CloseDelivery([FromBody] DeliveryCloseInput input)
  132. {
  133. await _db.Ado.ExecuteCommandAsync(
  134. "UPDATE srm_polist_ds SET status='C' WHERE DSNum=@jhdbh",
  135. new List<SugarParameter> { new("@jhdbh", input.DsNum) });
  136. return new { message = "交货单关闭成功" };
  137. }
  138. private static string BuildOrderBy(string? sortField, string? sortOrder)
  139. {
  140. var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
  141. {
  142. ["sffb"] = "t.sffb",
  143. ["wlbm"] = "t.wlbm",
  144. ["wlms"] = "t.wlms",
  145. ["buyer"] = "t.buyer",
  146. ["gysdm"] = "t.gysdm",
  147. ["gysmc"] = "t.gysmc",
  148. ["cgdd"] = "t.cgdd",
  149. ["ddhh"] = "t.ddhh",
  150. ["jhdsl"] = "t.jhdsl",
  151. ["dfhsl"] = "t.dfhsl",
  152. ["dsnum"] = "t.dsnum",
  153. ["requestdate"] = "t.requestdate",
  154. ["schedqty"] = "t.schedqty",
  155. ["jqhfnew"] = "t.jqhfnew",
  156. ["ztsl"] = "t.ztsl",
  157. ["zsl1"] = "t.zsl1",
  158. ["rksl"] = "t.rksl",
  159. ["bhgsl"] = "t.bhgsl",
  160. ["thsl"] = "t.thsl",
  161. ["bz"] = "t.bz"
  162. };
  163. var field = map.TryGetValue(sortField ?? string.Empty, out var sqlField) ? sqlField : "t.requestdate";
  164. var order = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  165. return $" ORDER BY {field} {order} ";
  166. }
  167. private static string BuildBaseSql() => """
  168. SELECT
  169. v.*,
  170. CASE
  171. WHEN v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0) > v.wjhsl THEN v.wjhsl
  172. ELSE v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0)
  173. END AS dfhsl,
  174. CASE
  175. WHEN IFNULL(v.zsl18, 0) - IFNULL(v.thsl, 0) <= IFNULL(v.zshl, 0) THEN 0
  176. ELSE IFNULL(v.zsl18, 0) - IFNULL(v.thsl, 0) - IFNULL(v.zshl, 0)
  177. END AS ztsl,
  178. IFNULL(v.zsl, 0) AS zsl1,
  179. v.thsl AS bhgsl,
  180. CONCAT(
  181. CASE
  182. WHEN v.sfyqnew = 'wait' OR v.sfyqnew = 'NO' THEN 'jqhfnew:yellow'
  183. WHEN v.sfyqnew = 'refuse' THEN 'jqhfnew:red'
  184. WHEN v.sfyqnew = 'OK' THEN 'jqhfnew:#99FF00'
  185. ELSE ''
  186. END,
  187. v.sffbgrdnew
  188. ) AS background,
  189. CASE
  190. WHEN v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0) <= 0 THEN '完成'
  191. ELSE '待交'
  192. END AS yjzt
  193. FROM
  194. (
  195. SELECT
  196. p.PurOrd,
  197. p.Line,
  198. p.ItemNum,
  199. s.fhsl - IFNULL(dor.thsl, 0) AS zfhl,
  200. p.ReceiptQty + p.RctQty AS zshl,
  201. i.zjsl AS zsl,
  202. CASE WHEN p.PurOrd LIKE 'DO%' THEN p.RctQty ELSE p.RctQty - IFNULL(i.zjsl, 0) END AS rksl,
  203. CASE
  204. WHEN p.PurOrd LIKE 'DO%' THEN IF(p.QtyReturned > 0, p.QtyReturned, dor.thsl)
  205. ELSE IF(p.QtyReturned > 0, p.QtyReturned, p.QtyReturned + dor.thsl)
  206. END AS thsl,
  207. s.fhsl AS zsl18,
  208. sh.jhdyj,
  209. jy.jhdzj,
  210. IFNULL(ds.SchedQty, 0) - IFNULL(sh.jhdyj, 0) AS jhddj,
  211. p.QtyOrded - p.RctQty - p.ReceiptQty + p.QtyReturned AS wjhsl,
  212. p.QtyOrded AS jhdsl,
  213. ds.SchedQty,
  214. ds.DSNum,
  215. CASE WHEN b2.id IS NULL THEN 'X' ELSE b2.hfsj END AS sffb,
  216. p.ItemNum AS wlbm,
  217. im.Descr AS wlms,
  218. ds.supplier AS gysmc,
  219. p.PurOrd AS cgdd,
  220. p.Line AS ddhh,
  221. pm.Buyer AS buyer,
  222. IFNULL(ds.requestDate, p.DueDate) AS requestdate,
  223. IFNULL(b.jqhf, '') AS jqhfnew,
  224. IFNULL(b.fpjh, '') AS fpjhnew,
  225. ds.SentQty,
  226. IFNULL(im.Drawing, p.Drawing) AS th,
  227. IFNULL(im.Rev, p.Rev) AS bbh,
  228. IFNULL(ds.id, p.RecID) AS id,
  229. '' AS jhd,
  230. ds.suppliercode AS gysdm,
  231. CASE WHEN IFNULL(ds.id, '') = '' THEN p.Remarks ELSE ds.Remarks END AS bz,
  232. '' AS shd,
  233. ds.id AS jhdid,
  234. p.DueDate AS jhrq,
  235. p.RecID AS polid,
  236. im.Descr1 AS wlgg,
  237. CASE WHEN b2.id IS NULL THEN '' ELSE ';sffb:#99FF00' END AS sffbgrdnew,
  238. CASE
  239. WHEN IFNULL(b.jqhf, '') = '' THEN 'wait'
  240. WHEN TIMESTAMPDIFF(DAY, IFNULL(ds.requestDate, p.DueDate), b.jqhf) <= 2 THEN 'OK'
  241. WHEN TIMESTAMPDIFF(DAY, IFNULL(ds.requestDate, p.DueDate), b.jqhf) > 2 THEN 'NO'
  242. WHEN b.jqhf = '' AND IFNULL(b.qhdj, '') <> '' THEN 'refuse'
  243. ELSE 'wait'
  244. END AS sfyqnew
  245. FROM PurOrdDetail p
  246. LEFT JOIN PurOrdMaster pm ON p.PurOrd = pm.PurOrd
  247. LEFT JOIN (
  248. SELECT SUM(sh_delivery_quantity) AS fhsl, po_bill, po_billline
  249. FROM scm_shdzb
  250. GROUP BY po_bill, po_billline
  251. ) s ON s.po_bill = p.PurOrd AND s.po_billline = p.Line
  252. LEFT JOIN (
  253. SELECT SUM(Qty) AS zjsl, PurOrd, PurLine
  254. FROM MissedPrint
  255. WHERE Status = 'I'
  256. GROUP BY PurOrd, PurLine
  257. ) i ON i.PurOrd = p.PurOrd AND i.PurLine = p.Line
  258. LEFT JOIN (
  259. SELECT SUM(QtyReturn) AS thsl, OrdNbr, OrdLine
  260. FROM PurOrdRctDetail
  261. WHERE rcttype IN ('pt', 'temp')
  262. GROUP BY OrdNbr, OrdLine
  263. ) dor ON dor.OrdNbr = p.PurOrd AND dor.OrdLine = p.Line
  264. LEFT JOIN srm_polist_ds ds ON p.PurOrd = ds.ponumber AND p.Line = ds.poline
  265. LEFT JOIN (
  266. SELECT SUM(sh_delivery_quantity) AS jhdyj, jhdbh
  267. FROM scm_shdzb
  268. GROUP BY jhdbh
  269. ) sh ON ds.dsnum = sh.jhdbh
  270. LEFT JOIN (
  271. SELECT SUM(IFNULL(Qty, 0)) AS jhdzj, PurOrdDetBatchNbr
  272. FROM MissedPrint
  273. WHERE Status = 'I'
  274. GROUP BY PurOrdDetBatchNbr
  275. ) jy ON ds.dsnum = jy.PurOrdDetBatchNbr
  276. LEFT JOIN (
  277. SELECT glid1, MIN(id) AS id, MIN(DATE_FORMAT(hfsj, '%Y.%m.%d')) AS hfsj
  278. FROM scm_jhjh_jq
  279. WHERE flag = 2
  280. GROUP BY glid1
  281. ) b2 ON ds.id = b2.glid1
  282. LEFT JOIN ItemMaster im ON p.ItemNum = im.ItemNum
  283. LEFT JOIN (
  284. SELECT
  285. glid,
  286. GROUP_CONCAT(CONCAT(CAST(jhdsl AS CHAR(10)), '(', DATE_FORMAT(jqhf, '%Y-%m-%d'), ')') SEPARATOR '<br>') AS fpjh,
  287. GROUP_CONCAT(qhdj SEPARATOR '') AS qhdj,
  288. MAX(jqhf) AS jqhf
  289. FROM scm_jhjh_jq
  290. WHERE flag = 0
  291. GROUP BY glid
  292. ) b ON ds.id = b.glid
  293. WHERE p.Status <> 'C'
  294. AND ds.schedqty >= 0
  295. AND ds.isactive = 1
  296. AND ds.status = 'P'
  297. ) v
  298. """;
  299. private sealed class SupplierDeliveryListRow
  300. {
  301. public string? Sffb { get; set; }
  302. public string? Wlbm { get; set; }
  303. public string? Wlms { get; set; }
  304. public string? Buyer { get; set; }
  305. public string? Gysdm { get; set; }
  306. public string? Gysmc { get; set; }
  307. public string? Cgdd { get; set; }
  308. public int? Ddhh { get; set; }
  309. public decimal? Jhdsl { get; set; }
  310. public decimal? Dfhsl { get; set; }
  311. public string? Dsnum { get; set; }
  312. public DateTime? Requestdate { get; set; }
  313. public decimal? Schedqty { get; set; }
  314. public string? Jqhfnew { get; set; }
  315. public decimal? Ztsl { get; set; }
  316. public decimal? Zsl1 { get; set; }
  317. public decimal? Rksl { get; set; }
  318. public decimal? Bhgsl { get; set; }
  319. public decimal? Thsl { get; set; }
  320. public string? Bz { get; set; }
  321. public string? Id { get; set; }
  322. public decimal? Wjhsl { get; set; }
  323. public decimal? Zfhl { get; set; }
  324. }
  325. }