SupplierDeliveryManagementService.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  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 tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  24. var pars = new List<SugarParameter> { new("@TenantId", tenantId) };
  25. var conditions = new List<string>();
  26. if (!string.IsNullOrWhiteSpace(input.Cgdd))
  27. {
  28. conditions.Add("v.cgdd LIKE @cgdd");
  29. pars.Add(new SugarParameter("@cgdd", $"%{input.Cgdd.Trim()}%"));
  30. }
  31. if (!string.IsNullOrWhiteSpace(input.DsNum))
  32. {
  33. conditions.Add("v.dsnum LIKE @dsnum");
  34. pars.Add(new SugarParameter("@dsnum", $"%{input.DsNum.Trim()}%"));
  35. }
  36. if (!string.IsNullOrWhiteSpace(input.Wlbm))
  37. {
  38. conditions.Add("v.wlbm LIKE @wlbm");
  39. pars.Add(new SugarParameter("@wlbm", $"%{input.Wlbm.Trim()}%"));
  40. }
  41. if (!string.IsNullOrWhiteSpace(input.Gys))
  42. {
  43. conditions.Add("(v.gysdm LIKE @gys OR v.gysmc LIKE @gys)");
  44. pars.Add(new SugarParameter("@gys", $"%{input.Gys.Trim()}%"));
  45. }
  46. var where = conditions.Count > 0 ? $" WHERE {string.Join(" AND ", conditions)} " : string.Empty;
  47. var orderBy = BuildOrderBy(input.SortField, input.SortOrder);
  48. var offset = (input.Page - 1) * input.PageSize;
  49. var wrapped = $"{BuildBaseSql()} {where}";
  50. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({wrapped}) t", pars);
  51. var list = await _db.Ado.SqlQueryAsync<SupplierDeliveryListRow>(
  52. $"SELECT * FROM ({wrapped}) t {orderBy} LIMIT {input.PageSize} OFFSET {offset}", pars);
  53. return new { total, page = input.Page, pageSize = input.PageSize, list };
  54. }
  55. [DisplayName("供应商交货管理发布")]
  56. [HttpPost("supplier-delivery/publish")]
  57. public async Task<object> Publish([FromBody] SupplierDeliveryBatchInput input)
  58. {
  59. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  60. var userId = _userManager.UserId.ToString();
  61. var userName = _userManager.Account ?? "system";
  62. var sql = """
  63. INSERT INTO `scm_jhjh_jq`
  64. (
  65. `id`,
  66. `glid1`,
  67. `wlbm`, `wlms`, `wlgg`, `cgdd`,
  68. `jhdsl`, `wjhsl`, `jhd`, `yjjhrq`, `jqhf`,
  69. `type`, `flag`, `scrq`, `scrid`, `scrxm`,
  70. `gysdm`, `gysmc`,
  71. `hfrid`, `hfrxm`, `hfsj`,
  72. `qhdj`, `ddhh`, `dw`, `bzsl`, `ly`
  73. )
  74. SELECT
  75. UUID() AS id,
  76. ds.id AS glid1,
  77. ds.itemnum AS wlbm,
  78. im.Descr AS wlms,
  79. im.Descr1 AS wlgg,
  80. ds.ponumber AS cgdd,
  81. ds.schedqty AS jhdsl,
  82. a.wjhsl AS wjhsl,
  83. ds.dsnum AS jhd,
  84. a.yjjhrq AS yjjhrq,
  85. DATE_FORMAT(DATE(a.yjjhrq), '%Y-%m-%d') AS jqhf,
  86. a.`type` AS `type`,
  87. 2 AS flag,
  88. a.scrq AS scrq,
  89. a.scrid AS scrid,
  90. a.scrxm AS scrxm,
  91. a.gysdm AS gysdm,
  92. a.gysmc AS gysmc,
  93. @hfrid AS hfrid,
  94. @hfrxm AS hfrxm,
  95. DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS hfsj,
  96. a.qhdj AS qhdj,
  97. a.ddhh AS ddhh,
  98. a.dw AS dw,
  99. a.bzsl AS bzsl,
  100. a.ly AS ly
  101. FROM srm_polist_ds ds
  102. LEFT JOIN ItemMaster im
  103. ON ds.itemnum = im.ItemNum
  104. LEFT JOIN vscm_jhjh a
  105. ON a.cgdd = ds.ponumber
  106. AND a.ddhh = ds.poline
  107. WHERE FIND_IN_SET(CAST(ds.id AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
  108. AND ds.tenant_id = @TenantId
  109. AND NOT EXISTS (
  110. SELECT 1 FROM scm_jhjh_jq x
  111. WHERE x.glid1 = ds.id
  112. AND FIND_IN_SET(CAST(x.glid1 AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
  113. );
  114. """;
  115. await _db.Ado.ExecuteCommandAsync(sql, new List<SugarParameter>
  116. {
  117. new("@ids", input.Ids),
  118. new("@hfrid", userId),
  119. new("@hfrxm", userName),
  120. new("@TenantId", tenantId)
  121. });
  122. return new { message = "发布成功" };
  123. }
  124. [DisplayName("供应商交货管理按计划日期回复")]
  125. [HttpPost("supplier-delivery/reply-by-plan-date")]
  126. public async Task<object> ReplyByPlanDate([FromBody] SupplierDeliveryBatchInput input)
  127. {
  128. if (string.IsNullOrWhiteSpace(input.Ids))
  129. throw Oops.Oh("缺少勾选行ID(ids)");
  130. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  131. var userId = _userManager.UserId.ToString();
  132. var userName = _userManager.Account ?? "system";
  133. // 列表勾选 id 为 srm_polist_ds.id,须以交货计划表驱动(与发布一致),不能从 vscm_jhjh 驱动否则匹配不到行。
  134. var sql = """
  135. INSERT INTO `scm_jhjh_jq`
  136. (
  137. `id`, `glid`, `wlbm`, `wlms`, `wlgg`, `cgdd`, `jhdsl`, `wjhsl`,
  138. `jhd`, `yjjhrq`, `jqhf`, `type`, `flag`,
  139. `scrq`, `scrid`, `scrxm`,
  140. `gysdm`, `gysmc`,
  141. `hfrid`, `hfrxm`, `hfsj`,
  142. `qhdj`, `ddhh`, `dw`, `bzsl`, `ly`
  143. )
  144. SELECT
  145. UUID() AS id,
  146. ds.id AS glid,
  147. ds.itemnum AS wlbm,
  148. im.Descr AS wlms,
  149. im.Descr1 AS wlgg,
  150. ds.ponumber AS cgdd,
  151. CAST(ds.schedqty AS CHAR(50)) AS jhdsl,
  152. CAST(IFNULL(a.wjhsl, 0) AS CHAR(50)) AS wjhsl,
  153. ds.dsnum AS jhd,
  154. CAST(IFNULL(a.yjjhrq, ds.requestDate) AS CHAR(50)) AS yjjhrq,
  155. DATE_FORMAT(DATE(IFNULL(a.yjjhrq, ds.requestDate)), '%Y-%m-%d') AS jqhf,
  156. a.`type` AS `type`,
  157. 0 AS flag,
  158. a.scrq AS scrq,
  159. a.scrid AS scrid,
  160. a.scrxm AS scrxm,
  161. IFNULL(a.gysdm, ds.suppliercode) AS gysdm,
  162. IFNULL(a.gysmc, ds.supplier) AS gysmc,
  163. @userid AS hfrid,
  164. @username AS hfrxm,
  165. DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS hfsj,
  166. a.qhdj AS qhdj,
  167. ds.poline AS ddhh,
  168. a.dw AS dw,
  169. a.bzsl AS bzsl,
  170. a.ly AS ly
  171. FROM srm_polist_ds ds
  172. LEFT JOIN ItemMaster im
  173. ON ds.itemnum = im.ItemNum
  174. LEFT JOIN vscm_jhjh a
  175. ON a.cgdd = ds.ponumber
  176. AND a.ddhh = ds.poline
  177. WHERE FIND_IN_SET(CAST(ds.id AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
  178. AND ds.isactive = 1
  179. AND ds.status = 'P'
  180. AND ds.tenant_id = @TenantId;
  181. """;
  182. var affected = await _db.Ado.ExecuteCommandAsync(sql, new List<SugarParameter>
  183. {
  184. new("@ids", input.Ids),
  185. new("@userid", userId),
  186. new("@username", userName),
  187. new("@TenantId", tenantId),
  188. });
  189. if (affected <= 0)
  190. throw Oops.Oh("未插入任何回复记录。请确认勾选的是本列表中的交货计划行,且交货单 status=P、isactive=1。");
  191. return new { message = "按计划日期回复成功" };
  192. }
  193. [DisplayName("供应商交货管理回复交期")]
  194. [HttpPost("supplier-delivery/reply-due-date")]
  195. public async Task<object> ReplyDueDate([FromBody] SupplierDeliveryReplyDueDateInput input)
  196. {
  197. if (string.IsNullOrWhiteSpace(input.Ids))
  198. throw Oops.Oh("缺少勾选行ID(ids)");
  199. if (string.IsNullOrWhiteSpace(input.Jqhf))
  200. throw Oops.Oh("缺少交期回复日期(jqhf)");
  201. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  202. var userId = _userManager.UserId.ToString();
  203. var userName = _userManager.Account ?? "system";
  204. // 列表勾选 id 为 srm_polist_ds.id,须以交货计划表驱动(与发布一致)。
  205. var sql = """
  206. INSERT INTO `scm_jhjh_jq`
  207. (
  208. `id`,
  209. `glid`, `wlbm`, `wlms`, `wlgg`, `cgdd`,
  210. `jhdsl`, `wjhsl`, `jhd`, `yjjhrq`, `jqhf`,
  211. `type`, `flag`,
  212. `scrq`, `scrid`, `scrxm`,
  213. `gysdm`, `gysmc`,
  214. `hfrid`, `hfrxm`, `hfsj`,
  215. `qhdj`, `ddhh`, `dw`, `bzsl`, `ly`
  216. )
  217. SELECT
  218. UUID() AS id,
  219. ds.id AS glid,
  220. ds.itemnum AS wlbm,
  221. im.Descr AS wlms,
  222. im.Descr1 AS wlgg,
  223. ds.ponumber AS cgdd,
  224. CAST(ds.schedqty AS CHAR(50)) AS jhdsl,
  225. CAST(IFNULL(a.wjhsl, 0) AS CHAR(50)) AS wjhsl,
  226. ds.dsnum AS jhd,
  227. CAST(IFNULL(a.yjjhrq, ds.requestDate) AS CHAR(50)) AS yjjhrq,
  228. @jqhf AS jqhf,
  229. a.`type` AS `type`,
  230. 0 AS flag,
  231. a.scrq AS scrq,
  232. a.scrid AS scrid,
  233. a.scrxm AS scrxm,
  234. IFNULL(a.gysdm, ds.suppliercode) AS gysdm,
  235. IFNULL(a.gysmc, ds.supplier) AS gysmc,
  236. @userid AS hfrid,
  237. @username AS hfrxm,
  238. DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS hfsj,
  239. a.qhdj AS qhdj,
  240. ds.poline AS ddhh,
  241. a.dw AS dw,
  242. a.bzsl AS bzsl,
  243. a.ly AS ly
  244. FROM srm_polist_ds ds
  245. LEFT JOIN ItemMaster im
  246. ON ds.itemnum = im.ItemNum
  247. LEFT JOIN vscm_jhjh a
  248. ON a.cgdd = ds.ponumber
  249. AND a.ddhh = ds.poline
  250. WHERE FIND_IN_SET(CAST(ds.id AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
  251. AND ds.isactive = 1
  252. AND ds.status = 'P'
  253. AND ds.tenant_id = @TenantId;
  254. """;
  255. var affected = await _db.Ado.ExecuteCommandAsync(sql, new List<SugarParameter>
  256. {
  257. new("@ids", input.Ids),
  258. new("@jqhf", input.Jqhf.Trim()),
  259. new("@userid", userId),
  260. new("@username", userName),
  261. new("@TenantId", tenantId),
  262. });
  263. if (affected <= 0)
  264. throw Oops.Oh("未插入任何回复记录。请确认勾选的是本列表中的交货计划行,且交货单 status=P、isactive=1。");
  265. return new { message = "回复交期成功" };
  266. }
  267. [DisplayName("交货单关闭")]
  268. [HttpPost("supplier-delivery/close")]
  269. public async Task<object> CloseDelivery([FromBody] DeliveryCloseInput input)
  270. {
  271. var tenantId = AidopTenantHelper.Resolve(App.HttpContext);
  272. // 检查是否已有关联的发货单明细(scm_shdzb.jhdbh = 交货单号)
  273. var shipmentCount = await _db.Ado.GetIntAsync(
  274. """
  275. SELECT COUNT(*)
  276. FROM scm_shdzb d
  277. INNER JOIN scm_shd m ON CAST(m.id AS CHAR) = d.glid
  278. WHERE d.jhdbh = @jhdbh
  279. AND m.tenant_id = @TenantId
  280. AND IFNULL(m.state, 1) <> 0
  281. """,
  282. new List<SugarParameter> { new("@jhdbh", input.DsNum), new("@TenantId", tenantId) });
  283. if (shipmentCount > 0)
  284. throw Oops.Oh("此发货单还未收完货,无法关闭交货单");
  285. await _db.Ado.ExecuteCommandAsync(
  286. "UPDATE srm_polist_ds SET status='C' WHERE DSNum=@jhdbh AND tenant_id=@TenantId",
  287. new List<SugarParameter> { new("@jhdbh", input.DsNum), new("@TenantId", tenantId) });
  288. return new { message = "交货单关闭成功" };
  289. }
  290. private static string BuildOrderBy(string? sortField, string? sortOrder)
  291. {
  292. var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
  293. {
  294. ["sffb"] = "t.sffb",
  295. ["wlbm"] = "t.wlbm",
  296. ["wlms"] = "t.wlms",
  297. ["buyer"] = "t.buyer",
  298. ["gysdm"] = "t.gysdm",
  299. ["gysmc"] = "t.gysmc",
  300. ["cgdd"] = "t.cgdd",
  301. ["ddhh"] = "t.ddhh",
  302. ["jhdsl"] = "t.jhdsl",
  303. ["dfhsl"] = "t.dfhsl",
  304. ["dsnum"] = "t.dsnum",
  305. ["requestdate"] = "t.requestdate",
  306. ["schedqty"] = "t.schedqty",
  307. ["jqhfnew"] = "t.jqhfnew",
  308. ["ztsl"] = "t.ztsl",
  309. ["zsl1"] = "t.zsl1",
  310. ["rksl"] = "t.rksl",
  311. ["bhgsl"] = "t.bhgsl",
  312. ["thsl"] = "t.thsl",
  313. ["bz"] = "t.bz"
  314. };
  315. var field = map.TryGetValue(sortField ?? string.Empty, out var sqlField) ? sqlField : "t.requestdate";
  316. var order = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  317. return $" ORDER BY {field} {order} ";
  318. }
  319. private static string BuildBaseSql() => """
  320. SELECT
  321. v.*,
  322. CASE
  323. WHEN v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0) > v.wjhsl THEN v.wjhsl
  324. ELSE v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0)
  325. END AS dfhsl,
  326. CASE
  327. WHEN IFNULL(v.zsl18, 0) - IFNULL(v.thsl, 0) <= IFNULL(v.zshl, 0) THEN 0
  328. ELSE IFNULL(v.zsl18, 0) - IFNULL(v.thsl, 0) - IFNULL(v.zshl, 0)
  329. END AS ztsl,
  330. IFNULL(v.zsl, 0) AS zsl1,
  331. v.thsl AS bhgsl,
  332. CONCAT(
  333. CASE
  334. WHEN v.sfyqnew = 'wait' OR v.sfyqnew = 'NO' THEN 'jqhfnew:yellow'
  335. WHEN v.sfyqnew = 'refuse' THEN 'jqhfnew:red'
  336. WHEN v.sfyqnew = 'OK' THEN 'jqhfnew:#99FF00'
  337. ELSE ''
  338. END,
  339. v.sffbgrdnew
  340. ) AS background,
  341. CASE
  342. WHEN v.jhdsl - IFNULL(v.zfhl, 0) + IFNULL(v.thsl, 0) <= 0 THEN '完成'
  343. ELSE '待交'
  344. END AS yjzt
  345. FROM
  346. (
  347. SELECT
  348. p.PurOrd,
  349. p.Line,
  350. p.ItemNum,
  351. s.fhsl - IFNULL(dor.thsl, 0) AS zfhl,
  352. p.ReceiptQty + p.RctQty AS zshl,
  353. i.zjsl AS zsl,
  354. CASE WHEN p.PurOrd LIKE 'DO%' THEN p.RctQty ELSE p.RctQty - IFNULL(i.zjsl, 0) END AS rksl,
  355. CASE
  356. WHEN p.PurOrd LIKE 'DO%' THEN IF(p.QtyReturned > 0, p.QtyReturned, dor.thsl)
  357. ELSE IF(p.QtyReturned > 0, p.QtyReturned, p.QtyReturned + dor.thsl)
  358. END AS thsl,
  359. s.fhsl AS zsl18,
  360. sh.jhdyj,
  361. jy.jhdzj,
  362. IFNULL(ds.SchedQty, 0) - IFNULL(sh.jhdyj, 0) AS jhddj,
  363. p.QtyOrded - p.RctQty - p.ReceiptQty + p.QtyReturned AS wjhsl,
  364. p.QtyOrded AS jhdsl,
  365. ds.SchedQty,
  366. ds.DSNum,
  367. CASE WHEN b2.id IS NULL THEN 'X' ELSE b2.hfsj END AS sffb,
  368. p.ItemNum AS wlbm,
  369. im.Descr AS wlms,
  370. ds.supplier AS gysmc,
  371. p.PurOrd AS cgdd,
  372. p.Line AS ddhh,
  373. pm.Buyer AS buyer,
  374. IFNULL(ds.requestDate, p.DueDate) AS requestdate,
  375. IFNULL(b.jqhf, '') AS jqhfnew,
  376. IFNULL(b.fpjh, '') AS fpjhnew,
  377. ds.SentQty,
  378. IFNULL(im.Drawing, p.Drawing) AS th,
  379. IFNULL(im.Rev, p.Rev) AS bbh,
  380. CAST(ds.id AS CHAR) AS id,
  381. '' AS jhd,
  382. ds.suppliercode AS gysdm,
  383. CASE WHEN IFNULL(ds.id, '') = '' THEN p.Remarks ELSE ds.Remarks END AS bz,
  384. '' AS shd,
  385. ds.id AS jhdid,
  386. p.DueDate AS jhrq,
  387. p.RecID AS polid,
  388. im.Descr1 AS wlgg,
  389. CASE WHEN b2.id IS NULL THEN '' ELSE ';sffb:#99FF00' END AS sffbgrdnew,
  390. CASE
  391. WHEN IFNULL(b.jqhf, '') = '' THEN 'wait'
  392. WHEN TIMESTAMPDIFF(DAY, IFNULL(ds.requestDate, p.DueDate), b.jqhf) <= 2 THEN 'OK'
  393. WHEN TIMESTAMPDIFF(DAY, IFNULL(ds.requestDate, p.DueDate), b.jqhf) > 2 THEN 'NO'
  394. WHEN b.jqhf = '' AND IFNULL(b.qhdj, '') <> '' THEN 'refuse'
  395. ELSE 'wait'
  396. END AS sfyqnew
  397. FROM PurOrdDetail p
  398. LEFT JOIN PurOrdMaster pm ON p.PurOrd = pm.PurOrd
  399. LEFT JOIN (
  400. SELECT SUM(sh_delivery_quantity) AS fhsl, po_bill, po_billline
  401. FROM scm_shdzb
  402. GROUP BY po_bill, po_billline
  403. ) s ON s.po_bill = p.PurOrd AND s.po_billline = p.Line
  404. LEFT JOIN (
  405. SELECT SUM(Qty) AS zjsl, PurOrd, PurLine
  406. FROM MissedPrint
  407. WHERE Status = 'I'
  408. GROUP BY PurOrd, PurLine
  409. ) i ON i.PurOrd = p.PurOrd AND i.PurLine = p.Line
  410. LEFT JOIN (
  411. SELECT SUM(QtyReturn) AS thsl, OrdNbr, OrdLine
  412. FROM PurOrdRctDetail
  413. WHERE rcttype IN ('pt', 'temp')
  414. GROUP BY OrdNbr, OrdLine
  415. ) dor ON dor.OrdNbr = p.PurOrd AND dor.OrdLine = p.Line
  416. LEFT JOIN srm_polist_ds ds ON p.PurOrd = ds.ponumber AND p.Line = ds.poline
  417. LEFT JOIN (
  418. SELECT SUM(sh_delivery_quantity) AS jhdyj, jhdbh
  419. FROM scm_shdzb
  420. GROUP BY jhdbh
  421. ) sh ON ds.dsnum = sh.jhdbh
  422. LEFT JOIN (
  423. SELECT SUM(IFNULL(Qty, 0)) AS jhdzj, PurOrdDetBatchNbr
  424. FROM MissedPrint
  425. WHERE Status = 'I'
  426. GROUP BY PurOrdDetBatchNbr
  427. ) jy ON ds.dsnum = jy.PurOrdDetBatchNbr
  428. LEFT JOIN (
  429. SELECT glid1, MIN(id) AS id, MIN(DATE_FORMAT(hfsj, '%Y.%m.%d')) AS hfsj
  430. FROM scm_jhjh_jq
  431. WHERE flag = 2
  432. GROUP BY glid1
  433. ) b2 ON ds.id = b2.glid1
  434. LEFT JOIN ItemMaster im ON p.ItemNum = im.ItemNum
  435. LEFT JOIN (
  436. SELECT
  437. glid,
  438. GROUP_CONCAT(CONCAT(CAST(jhdsl AS CHAR(10)), '(', DATE_FORMAT(jqhf, '%Y-%m-%d'), ')') SEPARATOR '<br>') AS fpjh,
  439. GROUP_CONCAT(qhdj SEPARATOR '') AS qhdj,
  440. MAX(jqhf) AS jqhf
  441. FROM scm_jhjh_jq
  442. WHERE flag = 0
  443. GROUP BY glid
  444. ) b ON ds.id = b.glid
  445. WHERE p.Status <> 'C'
  446. AND ds.schedqty >= 0
  447. AND ds.isactive = 1
  448. AND ds.status = 'P'
  449. AND p.tenant_id = @TenantId
  450. ) v
  451. """;
  452. private sealed class SupplierDeliveryListRow
  453. {
  454. public string? Sffb { get; set; }
  455. public string? Wlbm { get; set; }
  456. public string? Wlms { get; set; }
  457. public string? Buyer { get; set; }
  458. public string? Gysdm { get; set; }
  459. public string? Gysmc { get; set; }
  460. public string? Cgdd { get; set; }
  461. public int? Ddhh { get; set; }
  462. public decimal? Jhdsl { get; set; }
  463. public decimal? Dfhsl { get; set; }
  464. public string? Dsnum { get; set; }
  465. public DateTime? Requestdate { get; set; }
  466. public decimal? Schedqty { get; set; }
  467. public string? Jqhfnew { get; set; }
  468. public decimal? Ztsl { get; set; }
  469. public decimal? Zsl1 { get; set; }
  470. public decimal? Rksl { get; set; }
  471. public decimal? Bhgsl { get; set; }
  472. public decimal? Thsl { get; set; }
  473. public string? Bz { get; set; }
  474. public string? Id { get; set; }
  475. public decimal? Wjhsl { get; set; }
  476. public decimal? Zfhl { get; set; }
  477. }
  478. }