2026-08-26_fix_linkageplan_tenant.sql 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. -- 修复计划联动看板存储过程:增加租户隔离
  2. -- 执行方式:CALL pr_Mes_LinkagePlan(租户ID)
  3. DELIMITER //
  4. DROP PROCEDURE IF EXISTS `pr_Mes_LinkagePlan`//
  5. CREATE PROCEDURE `pr_Mes_LinkagePlan`(IN p_tenant_id BIGINT)
  6. BEGIN
  7. DECLARE RowCnt INT DEFAULT 0;
  8. -- 只清空当前租户数据
  9. DELETE FROM LinkagePlan WHERE tenant_id = p_tenant_id OR tenant_id IS NULL;
  10. -- 第一部分:插入计划数据和实际数据
  11. INSERT INTO LinkagePlan(
  12. id, bill_no, custom_no, order_type, item_number, Descr, Descr1, ItemType,
  13. qty, update_time, sys_capacity_date, bomstart, bomend, linestart, lineend,
  14. productstart, productend, needtime, sys_material_date, cgneedtime, cgend,
  15. blstart, blend, starttime, endtime, ipqcjystart, ipqcjyend, fqcjystart,
  16. fqcjyend, rkstart, rkend, fystarttime, fyendtime, `type`, levelnum, isuse, tenant_id
  17. )
  18. SELECT
  19. id, bill_no, custom_no, order_type, item_number, Descr, Descr1, ItemType,
  20. qty, update_time, sys_capacity_date, bomstart, bomend, linestart, lineend,
  21. productstart, productend, needtime, sys_material_date, cgneedtime, cgend,
  22. blstart, blend, starttime, endtime, ipqcjystart, ipqcjyend, fqcjystart,
  23. fqcjyend, rkstart, rkend, fystarttime, fyendtime, `type`, levelnum, isuse, p_tenant_id
  24. FROM (
  25. -- 计划数据查询
  26. SELECT
  27. b.id,
  28. a.bill_no,
  29. a.custom_no,
  30. IF(a.order_type='1', '销售', '计划') as order_type,
  31. b.item_number,
  32. c.Descr,
  33. c.Descr1,
  34. c.ownerapplication as ItemType,
  35. b.qty,
  36. h.create_time as update_time,
  37. b.sys_capacity_date,
  38. h.create_time as bomstart,
  39. DATE_ADD(h.create_time, INTERVAL IFNULL(c.BOMDesignTime, 0) DAY) as bomend,
  40. DATE_ADD(h.create_time, INTERVAL IFNULL(c.BOMDesignTime, 0) DAY) as linestart,
  41. DATE_ADD(h.create_time, INTERVAL (IFNULL(c.BOMDesignTime, 0) + IFNULL(c.RoutingDesignTime, 0)) DAY) as lineend,
  42. DATE_ADD(h.create_time, INTERVAL (IFNULL(c.BOMDesignTime, 0) + IFNULL(c.RoutingDesignTime, 0)) DAY) as productstart,
  43. DATE_ADD(h.create_time, INTERVAL (IFNULL(c.BOMDesignTime, 0) + IFNULL(c.RoutingDesignTime, 0) +
  44. CEILING(IFNULL(((b.qty-1)*d.maxruntime+d.runtime)/8, 0))) DAY) as productend,
  45. h.create_time as needtime,
  46. b.sys_material_date,
  47. h.create_time as cgneedtime,
  48. e.kitting_time as cgend,
  49. e.kitting_time as blstart,
  50. DATE_ADD(e.kitting_time, INTERVAL IFNULL(c.mfgmttr, 0) DAY) as blend,
  51. g.starttime,
  52. g.endtime,
  53. g.endtime as ipqcjystart,
  54. DATE_ADD(g.endtime, INTERVAL IFNULL(c.InsLT, 0) DAY) as ipqcjyend,
  55. g.endtime as fqcjystart,
  56. DATE_ADD(g.endtime, INTERVAL IFNULL(c.InsLT, 0) DAY) as fqcjyend,
  57. DATE_ADD(g.endtime, INTERVAL IFNULL(c.InsLT, 0) DAY) as rkstart,
  58. DATE_ADD(g.endtime, INTERVAL (IFNULL(c.InsLT, 0) + 1) DAY) as rkend,
  59. DATE_ADD(g.endtime, INTERVAL (IFNULL(c.InsLT, 0) + 1) DAY) as fystarttime,
  60. DATE_ADD(g.endtime, INTERVAL (IFNULL(c.InsLT, 0) + 2) DAY) as fyendtime,
  61. '计划' as `type`,
  62. 2 as levelnum,
  63. 0 as isuse
  64. FROM crm_seorder a
  65. LEFT JOIN crm_seorderentry b ON a.bill_no = b.bill_no AND b.tenant_id = a.tenant_id
  66. LEFT JOIN ItemMaster c ON b.item_number = c.ItemNum AND c.tenant_id = a.tenant_id
  67. LEFT JOIN (
  68. SELECT RoutingCode, SUM(runtime) as runtime, MAX(runtime) as maxruntime
  69. FROM RoutingOpDetail
  70. GROUP BY RoutingCode
  71. ) d ON c.ItemNum = d.RoutingCode
  72. LEFT JOIN (
  73. SELECT sentry_id, MAX(kitting_time) as kitting_time
  74. FROM (
  75. SELECT
  76. ar.sentry_id,
  77. bce.kitting_time,
  78. ROW_NUMBER() OVER (PARTITION BY ar.sentry_id ORDER BY ar.create_time DESC) AS rn
  79. FROM b_examine_result ar
  80. JOIN b_bom_child_examine bce ON ar.id = bce.examine_id
  81. WHERE ar.sorderid IS NOT NULL AND bce.erp_cls IN ('2','3')
  82. AND ar.tenant_id = p_tenant_id
  83. ) ex
  84. WHERE rn = 1
  85. GROUP BY sentry_id
  86. ) e ON b.id = e.sentry_id
  87. LEFT JOIN mes_moentry f ON b.id = f.soentry_id AND f.tenant_id = a.tenant_id
  88. LEFT JOIN mes_morder h ON f.moentry_mono = h.morder_no AND h.parent_id IS NULL AND h.tenant_id = a.tenant_id
  89. LEFT JOIN (
  90. SELECT workords, MIN(plandate) as starttime, MAX(plandate) as endtime
  91. FROM PeriodSequenceDet
  92. GROUP BY workords
  93. ) g ON f.moentry_mono = g.workords
  94. WHERE a.IsDeleted = 0 AND h.create_time IS NOT NULL
  95. AND a.tenant_id = p_tenant_id
  96. UNION ALL
  97. -- 实际数据查询
  98. SELECT
  99. b.id,
  100. a.bill_no,
  101. a.custom_no,
  102. IF(a.order_type='1', '销售', '计划') as order_type,
  103. b.item_number,
  104. c.Descr,
  105. c.Descr1,
  106. c.ownerapplication as ItemType,
  107. b.qty,
  108. h.create_time as update_time,
  109. b.sys_capacity_date,
  110. h.create_time as bomstart,
  111. nb.CreateTime as bomend,
  112. h.create_time as linestart,
  113. nb.CreateTime as lineend,
  114. d.starttime as productstart,
  115. d.endtime as productend,
  116. h.create_time as needtime,
  117. b.sys_material_date,
  118. e.cgneedtime as cgneedtime,
  119. e.kitting_time as cgend,
  120. nb.CreateTime as blstart,
  121. nd.blend as blend,
  122. g.starttime,
  123. g.endtime,
  124. e.FAPPLYTIME as ipqcjystart,
  125. e.FINSPESTARTDATE as ipqcjyend,
  126. g.endtime as fqcjystart,
  127. fqc.fqcDate as fqcjyend,
  128. i.starttime as rkstart,
  129. i.endtime as rkend,
  130. asn.starttime as fystarttime,
  131. asn.endtime as fyendtime,
  132. '实际' as `type`,
  133. 1 as levelnum,
  134. 0 as isuse
  135. FROM crm_seorder a
  136. LEFT JOIN crm_seorderentry b ON a.bill_no = b.bill_no AND b.tenant_id = a.tenant_id
  137. LEFT JOIN ItemMaster c ON b.item_number = c.ItemNum AND c.tenant_id = a.tenant_id
  138. LEFT JOIN (
  139. SELECT
  140. pr.sentry_id,
  141. MAX(sh.createtime) as kitting_time,
  142. MIN(jq.jqhf) as cgneedtime,
  143. MIN(iqcjy.FINSPESTARTDATE) as FINSPESTARTDATE,
  144. MAX(iqcjy.FAPPLYTIME) as FAPPLYTIME
  145. FROM srm_pr_main pr
  146. LEFT JOIN PurOrdDetail pod ON pr.pr_billno = pod.Req AND pod.tenant_id = pr.tenant_id
  147. LEFT JOIN vscm_cgshrk sh ON pod.PurOrd = sh.OrdNbr AND pod.Line = sh.OrdLine
  148. LEFT JOIN scm_jhjh_jq jq ON pod.PurOrd = jq.cgdd AND pod.Line = jq.ddhh
  149. LEFT JOIN (
  150. SELECT
  151. f.po_bill,
  152. f.po_billline,
  153. MIN(a.FINSPESTARTDATE) as FINSPESTARTDATE,
  154. MAX(b.FAPPLYTIME) as FAPPLYTIME
  155. FROM qms_qcp_inspbill a
  156. LEFT JOIN qms_qcp_inspecapplyn b ON a.lydjbh = b.FBILLNO
  157. LEFT JOIN qms_qcp_insappnentry c ON b.id = c.glid
  158. JOIN scm_shd cd ON c.shdh = cd.shddh
  159. LEFT JOIN scm_shdzb f ON f.shpc = c.FLOTNUMBER
  160. AND f.sh_material_code = c.FMATERIALCFG
  161. AND f.glid = cd.id
  162. GROUP BY f.po_bill, f.po_billline
  163. ) iqcjy ON pod.PurOrd = iqcjy.po_bill AND pod.Line = iqcjy.po_billline
  164. WHERE jq.flag = '1' AND pr.sentry_id IS NOT NULL
  165. AND pr.tenant_id = p_tenant_id
  166. GROUP BY pr.sentry_id
  167. ) e ON e.sentry_id = b.id
  168. LEFT JOIN mes_moentry f ON b.id = f.soentry_id AND f.tenant_id = a.tenant_id
  169. LEFT JOIN mes_morder h ON f.moentry_mono = h.morder_no AND h.parent_id IS NULL AND h.tenant_id = a.tenant_id
  170. LEFT JOIN (
  171. SELECT workords, MIN(plandate) as starttime, MAX(plandate) as endtime
  172. FROM PeriodSequenceDet
  173. GROUP BY workords
  174. ) d ON h.morder_no = d.workords
  175. LEFT JOIN (
  176. SELECT WorkOrd, MIN(CreateTime) as CreateTime
  177. FROM NbrMaster
  178. WHERE Type = 'SM'
  179. GROUP BY WorkOrd
  180. ) nb ON h.morder_no = nb.WorkOrd
  181. LEFT JOIN (
  182. SELECT WorkOrd, MIN(UpdateTime) as blend
  183. FROM NbrDetail
  184. GROUP BY WorkOrd
  185. ) nd ON h.morder_no = nd.WorkOrd
  186. LEFT JOIN (
  187. SELECT workords, MIN(plandate) as starttime, MAX(plandate) as endtime
  188. FROM PeriodSequenceDet
  189. WHERE CompQty > 0
  190. GROUP BY workords
  191. ) g ON f.moentry_mono = g.workords
  192. LEFT JOIN (
  193. SELECT WorkOrd, MIN(CreateTime) as starttime, MAX(CreateTime) as endtime
  194. FROM InvTransHist
  195. WHERE TransType = 'rct-wo' AND QtyChange > 0
  196. GROUP BY WorkOrd
  197. ) i ON h.morder_no = i.WorkOrd
  198. LEFT JOIN (
  199. SELECT
  200. ad.OrdNbr,
  201. ad.ContainerItem,
  202. ad.OrdLine,
  203. MIN(ad.CreateTime) as starttime,
  204. MAX(ad.UpdateTime) as endtime
  205. FROM ASNBOLShipperDetail ad
  206. INNER JOIN ASNBOLShipperMaster am ON ad.ASNBOLShipperRecID = am.RecID
  207. WHERE am.shtype = 'SH' AND am.typed <> 'S'
  208. GROUP BY ad.OrdNbr, ad.ContainerItem, ad.OrdLine
  209. ) asn ON b.bill_no = asn.OrdNbr AND b.item_number = asn.ContainerItem
  210. LEFT JOIN WorkOrdMaster wm ON h.morder_no = wm.WorkOrd AND wm.tenant_id = a.tenant_id
  211. LEFT JOIN (
  212. SELECT sczld, MAX(FINSPEENDDATE) as fqcDate
  213. FROM qms_qcpp_inspbill
  214. GROUP BY sczld
  215. ) fqc ON wm.Batch = fqc.sczld
  216. WHERE a.IsDeleted = 0 AND h.create_time IS NOT NULL
  217. AND a.tenant_id = p_tenant_id
  218. ) as viewall;
  219. -- 第二部分:插入偏差数据
  220. INSERT INTO LinkagePlan(
  221. id, bill_no, custom_no, order_type, item_number, Descr, Descr1, ItemType,
  222. qty, update_time, sys_capacity_date, bomstart, bomend, linestart, lineend,
  223. productstart, productend, needtime, sys_material_date, cgneedtime, cgend,
  224. blstart, blend, starttime, endtime, ipqcjystart, ipqcjyend, fqcjystart,
  225. fqcjyend, rkstart, rkend, fystarttime, fyendtime, `type`, levelnum, isuse, tenant_id
  226. )
  227. SELECT
  228. a.id,
  229. a.bill_no,
  230. a.custom_no,
  231. a.order_type,
  232. b.item_number,
  233. a.Descr,
  234. a.Descr1,
  235. a.ItemType,
  236. b.qty,
  237. a.update_time,
  238. b.sys_capacity_date,
  239. DATEDIFF(b.bomstart, a.bomstart) as bomstart,
  240. DATEDIFF(b.bomend, a.bomend) as bomend,
  241. DATEDIFF(b.linestart, a.linestart) as linestart,
  242. DATEDIFF(b.lineend, a.lineend) as lineend,
  243. DATEDIFF(b.productstart, a.productstart) as productstart,
  244. DATEDIFF(b.productend, a.productend) as productend,
  245. DATEDIFF(b.needtime, a.needtime) as needtime,
  246. DATEDIFF(b.sys_material_date, a.sys_material_date) as sys_material_date,
  247. DATEDIFF(b.cgneedtime, a.cgneedtime) as cgneedtime,
  248. DATEDIFF(b.cgend, a.cgend) as cgend,
  249. DATEDIFF(b.blstart, a.blstart) as blstart,
  250. DATEDIFF(b.blend, a.blend) as blend,
  251. DATEDIFF(b.starttime, a.starttime) as starttime,
  252. DATEDIFF(b.endtime, a.endtime) as endtime,
  253. DATEDIFF(b.ipqcjystart, a.ipqcjystart) as ipqcjystart,
  254. DATEDIFF(b.ipqcjyend, a.ipqcjyend) as ipqcjyend,
  255. DATEDIFF(b.fqcjystart, a.fqcjystart) as fqcjystart,
  256. DATEDIFF(b.fqcjyend, a.fqcjyend) as fqcjyend,
  257. DATEDIFF(b.rkstart, a.rkstart) as rkstart,
  258. DATEDIFF(b.rkend, a.rkend) as rkend,
  259. DATEDIFF(b.fystarttime, a.fystarttime) as fystarttime,
  260. DATEDIFF(b.fyendtime, a.fyendtime) as fyendtime,
  261. '偏差' as `type`,
  262. 0 as levelnum,
  263. 0 as isuse,
  264. p_tenant_id
  265. FROM (SELECT * FROM LinkagePlan WHERE `type` = '计划' AND tenant_id = p_tenant_id) a
  266. LEFT JOIN (SELECT * FROM LinkagePlan WHERE `type` = '实际' AND tenant_id = p_tenant_id) b ON a.id = b.id;
  267. -- 第三部分:更新背景色标记
  268. UPDATE LinkagePlan a
  269. LEFT JOIN (
  270. SELECT
  271. a.id,
  272. a.`type`,
  273. CONCAT(
  274. CASE WHEN a.`type` = '计划' THEN
  275. CASE WHEN a.bomstart IS NOT NULL AND b.bomstart IS NULL AND DATEDIFF(NOW(), a.bomstart) > 7 THEN 'bomstart:red;'
  276. WHEN a.bomstart IS NOT NULL AND b.bomstart IS NULL AND DATEDIFF(NOW(), a.bomstart) > 0 THEN 'bomstart:yellow;'
  277. ELSE '' END
  278. WHEN a.`type` = '偏差' THEN
  279. CASE WHEN IFNULL(CAST(a.bomstart AS SIGNED), 0) > 7 THEN 'bomstart:red;'
  280. WHEN IFNULL(CAST(a.bomstart AS SIGNED), 0) > 0 THEN 'bomstart:yellow;'
  281. ELSE '' END
  282. ELSE '' END,
  283. CASE WHEN a.`type` = '计划' THEN
  284. CASE WHEN a.bomend IS NOT NULL AND b.bomend IS NULL AND DATEDIFF(NOW(), a.bomend) > 7 THEN 'bomend:red;'
  285. WHEN a.bomend IS NOT NULL AND b.bomend IS NULL AND DATEDIFF(NOW(), a.bomend) > 0 THEN 'bomend:yellow;'
  286. ELSE '' END
  287. WHEN a.`type` = '偏差' THEN
  288. CASE WHEN IFNULL(CAST(a.bomend AS SIGNED), 0) > 7 THEN 'bomend:red;'
  289. WHEN IFNULL(CAST(a.bomend AS SIGNED), 0) > 0 THEN 'bomend:yellow;'
  290. ELSE '' END
  291. ELSE '' END,
  292. CASE WHEN a.`type` = '计划' THEN
  293. CASE WHEN a.starttime IS NOT NULL AND b.starttime IS NULL AND DATEDIFF(NOW(), a.starttime) > 7 THEN 'starttime:red;'
  294. WHEN a.starttime IS NOT NULL AND b.starttime IS NULL AND DATEDIFF(NOW(), a.starttime) > 0 THEN 'starttime:yellow;'
  295. ELSE '' END
  296. WHEN a.`type` = '偏差' THEN
  297. CASE WHEN IFNULL(CAST(a.starttime AS SIGNED), 0) > 7 THEN 'starttime:red;'
  298. WHEN IFNULL(CAST(a.starttime AS SIGNED), 0) > 0 THEN 'starttime:yellow;'
  299. ELSE '' END
  300. ELSE '' END,
  301. CASE WHEN a.`type` = '计划' THEN
  302. CASE WHEN a.endtime IS NOT NULL AND b.endtime IS NULL AND DATEDIFF(NOW(), a.endtime) > 7 THEN 'endtime:red;'
  303. WHEN a.endtime IS NOT NULL AND b.endtime IS NULL AND DATEDIFF(NOW(), a.endtime) > 0 THEN 'endtime:yellow;'
  304. ELSE '' END
  305. WHEN a.`type` = '偏差' THEN
  306. CASE WHEN IFNULL(CAST(a.endtime AS SIGNED), 0) > 7 THEN 'endtime:red;'
  307. WHEN IFNULL(CAST(a.endtime AS SIGNED), 0) > 0 THEN 'endtime:yellow;'
  308. ELSE '' END
  309. ELSE '' END
  310. ) AS background
  311. FROM LinkagePlan a
  312. LEFT JOIN (SELECT * FROM LinkagePlan WHERE `type` = '实际' AND tenant_id = p_tenant_id) b ON a.id = b.id
  313. LEFT JOIN (SELECT * FROM LinkagePlan WHERE `type` = '偏差' AND tenant_id = p_tenant_id) c ON a.id = c.id
  314. WHERE a.tenant_id = p_tenant_id
  315. ) AS bg ON a.id = bg.id AND a.`type` = bg.`type`
  316. SET a.background = bg.background
  317. WHERE a.tenant_id = p_tenant_id;
  318. END//
  319. DELIMITER ;