migrate-estimated-duration-min-to-h.sql 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. -- 预估耗时单位:分钟 → 小时
  2. -- 适用表:biz_process、biz_process_route_step、biz_production_task_step
  3. -- 执行前请先备份,并用下方预检语句确认数据格式。
  4. --
  5. -- 生产预检样例(2026-06):biz_production_task_step 存在 '6h'(5 条),
  6. -- 属「已是小时、仅去单位后缀」,不可 ÷60。
  7. --
  8. -- 迁移规则:
  9. -- 1) 纯数字(如 30、480) → ÷60,视为原分钟值
  10. -- 2) 带 h/小时(如 6h、2.5 小时) → 去掉单位,数值不变
  11. -- 3) 带 min/分钟(如 30min) → 去掉单位后 ÷60
  12. -- 4) 其它格式 → 不自动处理,需人工核对
  13. -- ---------- 预检:迁移前查看当前值(只读,可直接执行)----------
  14. -- 注意:biz_production_task_step 与其它两表 collation 可能不一致,UNION 时需显式 COLLATE
  15. -- A. 三表汇总:各值、条数、迁移动作、迁移后预览(小时)
  16. SELECT
  17. src_table,
  18. estimated_duration,
  19. row_cnt,
  20. CASE
  21. WHEN estimated_duration REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN '会换算(÷60)' COLLATE utf8mb4_unicode_ci
  22. WHEN LOWER(TRIM(estimated_duration)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(h|小时)$' THEN '规范化(去h)' COLLATE utf8mb4_unicode_ci
  23. WHEN LOWER(TRIM(estimated_duration)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(min|分钟)$' THEN '会换算(去min÷60)' COLLATE utf8mb4_unicode_ci
  24. ELSE '跳过(需人工)' COLLATE utf8mb4_unicode_ci
  25. END AS migrate_action,
  26. CASE
  27. WHEN estimated_duration REGEXP '^[0-9]+(\\.[0-9]+)?$' THEN TRIM(
  28. TRAILING '.'
  29. FROM TRIM(
  30. TRAILING '0'
  31. FROM CAST(CAST(estimated_duration AS DECIMAL(12, 4)) / 60 AS CHAR)
  32. )
  33. )
  34. WHEN LOWER(TRIM(estimated_duration)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(h|小时)$' THEN TRIM(
  35. TRAILING '.'
  36. FROM TRIM(
  37. TRAILING '0'
  38. FROM CAST(
  39. CAST(
  40. TRIM(
  41. REPLACE(REPLACE(LOWER(TRIM(estimated_duration)), '小时', ''), 'h', '')
  42. ) AS DECIMAL(12, 4)
  43. ) AS CHAR
  44. )
  45. )
  46. )
  47. WHEN LOWER(TRIM(estimated_duration)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(min|分钟)$' THEN TRIM(
  48. TRAILING '.'
  49. FROM TRIM(
  50. TRAILING '0'
  51. FROM CAST(
  52. CAST(
  53. TRIM(
  54. REPLACE(REPLACE(LOWER(TRIM(estimated_duration)), '分钟', ''), 'min', '')
  55. ) AS DECIMAL(12, 4)
  56. ) / 60 AS CHAR
  57. )
  58. )
  59. )
  60. ELSE NULL
  61. END AS after_migration_h
  62. FROM (
  63. SELECT 'biz_process' COLLATE utf8mb4_unicode_ci AS src_table,
  64. estimated_duration COLLATE utf8mb4_unicode_ci AS estimated_duration,
  65. COUNT(*) AS row_cnt
  66. FROM biz_process
  67. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  68. GROUP BY estimated_duration
  69. UNION ALL
  70. SELECT 'biz_process_route_step' COLLATE utf8mb4_unicode_ci,
  71. estimated_duration COLLATE utf8mb4_unicode_ci,
  72. COUNT(*)
  73. FROM biz_process_route_step
  74. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  75. GROUP BY estimated_duration
  76. UNION ALL
  77. SELECT 'biz_production_task_step' COLLATE utf8mb4_unicode_ci,
  78. estimated_duration COLLATE utf8mb4_unicode_ci,
  79. COUNT(*)
  80. FROM biz_production_task_step
  81. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  82. GROUP BY estimated_duration
  83. ) t
  84. ORDER BY src_table, row_cnt DESC, estimated_duration;
  85. -- B. 明细:带工序代码/名称,便于逐条核对
  86. SELECT 'biz_process' COLLATE utf8mb4_unicode_ci AS src_table,
  87. id COLLATE utf8mb4_unicode_ci AS id,
  88. process_code COLLATE utf8mb4_unicode_ci AS process_code,
  89. process_name COLLATE utf8mb4_unicode_ci AS process_name,
  90. estimated_duration COLLATE utf8mb4_unicode_ci AS estimated_duration
  91. FROM biz_process
  92. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  93. UNION ALL
  94. SELECT 'biz_process_route_step' COLLATE utf8mb4_unicode_ci,
  95. id COLLATE utf8mb4_unicode_ci,
  96. process_code COLLATE utf8mb4_unicode_ci,
  97. process_name COLLATE utf8mb4_unicode_ci,
  98. estimated_duration COLLATE utf8mb4_unicode_ci
  99. FROM biz_process_route_step
  100. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  101. UNION ALL
  102. SELECT 'biz_production_task_step' COLLATE utf8mb4_unicode_ci,
  103. id COLLATE utf8mb4_unicode_ci,
  104. process_code COLLATE utf8mb4_unicode_ci,
  105. process_name COLLATE utf8mb4_unicode_ci,
  106. estimated_duration COLLATE utf8mb4_unicode_ci
  107. FROM biz_production_task_step
  108. WHERE del_flag = 0 AND estimated_duration IS NOT NULL AND estimated_duration != ''
  109. ORDER BY src_table, process_code, id;
  110. -- ---------- 迁移(确认预检结果后再执行下方 UPDATE)----------
  111. -- 每张表按 ①纯数字÷60 → ②去min÷60 → ③去h 顺序执行
  112. -- biz_process
  113. UPDATE `biz_process`
  114. SET `estimated_duration` = TRIM(
  115. TRAILING '.'
  116. FROM TRIM(
  117. TRAILING '0'
  118. FROM CAST(CAST(`estimated_duration` AS DECIMAL(12, 4)) / 60 AS CHAR)
  119. )
  120. )
  121. WHERE `del_flag` = 0
  122. AND `estimated_duration` IS NOT NULL
  123. AND `estimated_duration` != ''
  124. AND `estimated_duration` REGEXP '^[0-9]+(\\.[0-9]+)?$';
  125. UPDATE `biz_process`
  126. SET `estimated_duration` = TRIM(
  127. TRAILING '.'
  128. FROM TRIM(
  129. TRAILING '0'
  130. FROM CAST(
  131. CAST(
  132. TRIM(
  133. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '分钟', ''), 'min', '')
  134. ) AS DECIMAL(12, 4)
  135. ) / 60 AS CHAR
  136. )
  137. )
  138. )
  139. WHERE `del_flag` = 0
  140. AND `estimated_duration` IS NOT NULL
  141. AND `estimated_duration` != ''
  142. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(min|分钟)$';
  143. UPDATE `biz_process`
  144. SET `estimated_duration` = TRIM(
  145. TRAILING '.'
  146. FROM TRIM(
  147. TRAILING '0'
  148. FROM CAST(
  149. CAST(
  150. TRIM(
  151. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '小时', ''), 'h', '')
  152. ) AS DECIMAL(12, 4)
  153. ) AS CHAR
  154. )
  155. )
  156. )
  157. WHERE `del_flag` = 0
  158. AND `estimated_duration` IS NOT NULL
  159. AND `estimated_duration` != ''
  160. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(h|小时)$';
  161. -- biz_process_route_step
  162. UPDATE `biz_process_route_step`
  163. SET `estimated_duration` = TRIM(
  164. TRAILING '.'
  165. FROM TRIM(
  166. TRAILING '0'
  167. FROM CAST(CAST(`estimated_duration` AS DECIMAL(12, 4)) / 60 AS CHAR)
  168. )
  169. )
  170. WHERE `del_flag` = 0
  171. AND `estimated_duration` IS NOT NULL
  172. AND `estimated_duration` != ''
  173. AND `estimated_duration` REGEXP '^[0-9]+(\\.[0-9]+)?$';
  174. UPDATE `biz_process_route_step`
  175. SET `estimated_duration` = TRIM(
  176. TRAILING '.'
  177. FROM TRIM(
  178. TRAILING '0'
  179. FROM CAST(
  180. CAST(
  181. TRIM(
  182. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '分钟', ''), 'min', '')
  183. ) AS DECIMAL(12, 4)
  184. ) / 60 AS CHAR
  185. )
  186. )
  187. )
  188. WHERE `del_flag` = 0
  189. AND `estimated_duration` IS NOT NULL
  190. AND `estimated_duration` != ''
  191. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(min|分钟)$';
  192. UPDATE `biz_process_route_step`
  193. SET `estimated_duration` = TRIM(
  194. TRAILING '.'
  195. FROM TRIM(
  196. TRAILING '0'
  197. FROM CAST(
  198. CAST(
  199. TRIM(
  200. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '小时', ''), 'h', '')
  201. ) AS DECIMAL(12, 4)
  202. ) AS CHAR
  203. )
  204. )
  205. )
  206. WHERE `del_flag` = 0
  207. AND `estimated_duration` IS NOT NULL
  208. AND `estimated_duration` != ''
  209. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(h|小时)$';
  210. -- biz_production_task_step(生产环境存在 6h 等值,走第 3 步「去h」)
  211. UPDATE `biz_production_task_step`
  212. SET `estimated_duration` = TRIM(
  213. TRAILING '.'
  214. FROM TRIM(
  215. TRAILING '0'
  216. FROM CAST(CAST(`estimated_duration` AS DECIMAL(12, 4)) / 60 AS CHAR)
  217. )
  218. )
  219. WHERE `del_flag` = 0
  220. AND `estimated_duration` IS NOT NULL
  221. AND `estimated_duration` != ''
  222. AND `estimated_duration` REGEXP '^[0-9]+(\\.[0-9]+)?$';
  223. UPDATE `biz_production_task_step`
  224. SET `estimated_duration` = TRIM(
  225. TRAILING '.'
  226. FROM TRIM(
  227. TRAILING '0'
  228. FROM CAST(
  229. CAST(
  230. TRIM(
  231. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '分钟', ''), 'min', '')
  232. ) AS DECIMAL(12, 4)
  233. ) / 60 AS CHAR
  234. )
  235. )
  236. )
  237. WHERE `del_flag` = 0
  238. AND `estimated_duration` IS NOT NULL
  239. AND `estimated_duration` != ''
  240. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(min|分钟)$';
  241. UPDATE `biz_production_task_step`
  242. SET `estimated_duration` = TRIM(
  243. TRAILING '.'
  244. FROM TRIM(
  245. TRAILING '0'
  246. FROM CAST(
  247. CAST(
  248. TRIM(
  249. REPLACE(REPLACE(LOWER(TRIM(`estimated_duration`)), '小时', ''), 'h', '')
  250. ) AS DECIMAL(12, 4)
  251. ) AS CHAR
  252. )
  253. )
  254. )
  255. WHERE `del_flag` = 0
  256. AND `estimated_duration` IS NOT NULL
  257. AND `estimated_duration` != ''
  258. AND LOWER(TRIM(`estimated_duration`)) REGEXP '^[0-9]+(\\.[0-9]+)?\\s*(h|小时)$';
  259. -- 列注释同步(可选,与语义一致)
  260. ALTER TABLE `biz_process`
  261. MODIFY COLUMN `estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时(小时)';
  262. ALTER TABLE `biz_process_route_step`
  263. MODIFY COLUMN `estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时(小时)';
  264. ALTER TABLE `biz_production_task_step`
  265. MODIFY COLUMN `estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时(小时)';