1.0.322.sql 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. -- 1.0.322.sql S2 排程正确性重构 G1:按产线补齐工作日历。
  2. -- 使 S1 CapacityDateCalculator(按 ProdLine + ShiftsHours1)与后续 S2 产线维度排程可用。
  3. -- 班制已决策:周一~周五 IsWorkDay=1,周六周日=0,ShiftsHours1=10.5(待办 P-027 业务复核)。
  4. -- 幂等:以 (tenant_id, TRIM(ProdLine), WeekDay) 判存在,只新增不修改。
  5. -- 强制 TRIM(Line):避免尾随空格导致同一产线播种 14 行、触发 Count!=7 静默退化。
  6. -- ============================================================================
  7. SET NAMES utf8mb4;
  8. INSERT INTO ShopCalendarWorkCtr
  9. (ProdLine, WorkCtr, WeekDay, IsWorkDay, ShiftsHours1,
  10. IsActive, IsConfirm, tenant_id, CreateUser, UpdateUser, CreateTime, UpdateTime)
  11. SELECT
  12. l.ProdLine,
  13. '',
  14. d.WeekDay,
  15. CASE WHEN d.WeekDay BETWEEN 1 AND 5 THEN 1 ELSE 0 END,
  16. 10.5,
  17. 1,
  18. 0,
  19. l.tenant_id,
  20. 'sys', 'sys', NOW(), NOW()
  21. FROM (
  22. SELECT DISTINCT tenant_id, TRIM(Line) AS ProdLine
  23. FROM ProdLineDetail
  24. WHERE IFNULL(IsActive, 0) = 1
  25. AND TRIM(IFNULL(Line, '')) <> ''
  26. ) l
  27. CROSS JOIN (
  28. SELECT 0 AS WeekDay UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
  29. UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
  30. ) d
  31. LEFT JOIN (
  32. SELECT tenant_id AS t, TRIM(IFNULL(ProdLine, '')) AS pl, WeekDay AS wd
  33. FROM ShopCalendarWorkCtr
  34. ) c ON c.t = l.tenant_id AND c.pl = l.ProdLine AND c.wd = d.WeekDay
  35. WHERE c.t IS NULL;
  36. -- G2 存量回填:修正 WorkOrdRouting 错误映射(Rate 曾误写入 MachBdnRate)
  37. -- 仅回填仍能关联到 ProdLineDetail 的活跃关键工序行。
  38. UPDATE WorkOrdRouting r
  39. INNER JOIN ProdLineDetail b
  40. ON b.Part = r.ItemNum AND b.Op = r.OP AND b.tenant_id = r.tenant_id
  41. SET
  42. r.StdRunTime = CASE WHEN IFNULL(b.Rate, 0) > 0 THEN 1.0 / b.Rate ELSE r.StdRunTime END,
  43. r.RunCrew = CAST(IFNULL(NULLIF(TRIM(IFNULL(b.RunCrew, '')), ''), '0') AS DECIMAL(18, 4)),
  44. r.Line = LEFT(TRIM(IFNULL(b.Line, '')), 8),
  45. r.ProdLine = LEFT(TRIM(IFNULL(b.Line, '')), 8),
  46. r.MachBdnRate = 0,
  47. r.UpdateTime = NOW()
  48. WHERE IFNULL(r.IsActive, 0) = 1
  49. AND IFNULL(r.MilestoneOp, 0) = 1
  50. AND IFNULL(b.IsActive, 0) = 1;