SupplierDeliveryManagementService.cs 19 KB

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