migration_20260713_pl_personnel_cert_split.sql 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. -- 人员从业资格证拆分:cert_name 重命名(可重复执行)
  2. -- 前置 spec: docs/superpowers/specs/2026-07-13-pl-personnel-cert-split-design.md
  3. -- 1) 押运员证 → 押运员从业资格证(全部 personnel 证书)
  4. UPDATE pl_cert c
  5. INNER JOIN pl_personnel p ON p.id = c.owner_id AND p.del_flag = 0
  6. SET c.cert_name = '押运员从业资格证',
  7. c.update_time = NOW()
  8. WHERE c.del_flag = 0
  9. AND c.owner_type = 'personnel'
  10. AND c.cert_name = '押运员证';
  11. -- 2) 泛称从业资格证 → 驾驶员从业资格证(driver / both)
  12. UPDATE pl_cert c
  13. INNER JOIN pl_personnel p ON p.id = c.owner_id AND p.del_flag = 0
  14. SET c.cert_name = '驾驶员从业资格证',
  15. c.update_time = NOW()
  16. WHERE c.del_flag = 0
  17. AND c.owner_type = 'personnel'
  18. AND c.cert_name = '从业资格证'
  19. AND p.personnel_type IN ('driver', 'both');
  20. -- 3) 泛称从业资格证 → 押运员从业资格证(escort)
  21. UPDATE pl_cert c
  22. INNER JOIN pl_personnel p ON p.id = c.owner_id AND p.del_flag = 0
  23. SET c.cert_name = '押运员从业资格证',
  24. c.update_time = NOW()
  25. WHERE c.del_flag = 0
  26. AND c.owner_type = 'personnel'
  27. AND c.cert_name = '从业资格证'
  28. AND p.personnel_type = 'escort';
  29. -- 4) both 人员:若迁移后仍缺驾/押任一从业证,供运营补录(验证查询,不修改数据)
  30. SELECT
  31. p.id AS personnel_id,
  32. p.personnel_name,
  33. p.personnel_type,
  34. GROUP_CONCAT(c.cert_name ORDER BY c.cert_name SEPARATOR '、') AS cert_names
  35. FROM pl_personnel p
  36. LEFT JOIN pl_cert c
  37. ON c.owner_id = p.id
  38. AND c.owner_type = 'personnel'
  39. AND c.del_flag = 0
  40. WHERE p.del_flag = 0
  41. AND p.personnel_type = 'both'
  42. GROUP BY p.id, p.personnel_name, p.personnel_type
  43. HAVING SUM(CASE WHEN c.cert_name IN ('驾驶员从业资格证') THEN 1 ELSE 0 END) = 0
  44. OR SUM(CASE WHEN c.cert_name IN ('押运员从业资格证', '押运员证') THEN 1 ELSE 0 END) = 0;
  45. -- 5) 危化品从业资格证:不自动迁移(人工清单)
  46. SELECT
  47. p.id AS personnel_id,
  48. p.personnel_name,
  49. p.personnel_type,
  50. c.id AS cert_id,
  51. c.cert_name
  52. FROM pl_cert c
  53. INNER JOIN pl_personnel p ON p.id = c.owner_id AND p.del_flag = 0
  54. WHERE c.del_flag = 0
  55. AND c.owner_type = 'personnel'
  56. AND c.cert_name = '危化品从业资格证';
  57. -- 6) both + 仍保留泛称「从业资格证」的歧义记录(需人工处理,不自动改)
  58. SELECT
  59. p.id AS personnel_id,
  60. p.personnel_name,
  61. c.id AS cert_id,
  62. c.cert_name
  63. FROM pl_cert c
  64. INNER JOIN pl_personnel p ON p.id = c.owner_id AND p.del_flag = 0
  65. WHERE c.del_flag = 0
  66. AND c.owner_type = 'personnel'
  67. AND c.cert_name = '从业资格证'
  68. AND p.personnel_type = 'both';
  69. -- 7) 字典 pl_cert_name 增量(可选,可重复执行)
  70. INSERT INTO sys_dict_data (id, dict_label, dict_value, tag_type, dict_type, tenant_no, order_num, del_flag, create_time, update_time)
  71. SELECT 'PL_CERT_DRIVER_QUAL', '驾驶员从业资格证', '驾驶员从业资格证', 'primary', 'pl_cert_name', 'shanxia2.0', 6, 0, NOW(), NOW()
  72. FROM DUAL
  73. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE id = 'PL_CERT_DRIVER_QUAL');
  74. INSERT INTO sys_dict_data (id, dict_label, dict_value, tag_type, dict_type, tenant_no, order_num, del_flag, create_time, update_time)
  75. SELECT 'PL_CERT_ESCORT_QUAL', '押运员从业资格证', '押运员从业资格证', 'warning', 'pl_cert_name', 'shanxia2.0', 7, 0, NOW(), NOW()
  76. FROM DUAL
  77. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE id = 'PL_CERT_ESCORT_QUAL');