Files
shanxia2.0/docs/sql/20260619_pl_personnel_cert_migration.sql
T
2026-06-21 09:19:07 +08:00

212 lines
6.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 运输计划 · 车辆/人员/证书重构 — 数据迁移
-- 日期: 2026-06-19
-- 前置: 先执行 docs/sql/20260619_pl_personnel_cert.sql
-- 说明: 从 pl_driver / pl_vehicle_driver 迁移至新表;可重复执行(幂等)
-- =============================================================================
SET NAMES utf8mb4;
-- -----------------------------------------------------------------------------
-- 1. pl_driver → pl_personnel(保留 id)
-- -----------------------------------------------------------------------------
INSERT IGNORE INTO `pl_personnel` (
`id`, `personnel_name`, `phone_no`, `age`, `id_card_no`, `status`,
`tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
d.`id`,
d.`driver_name`,
NULLIF(TRIM(d.`phone_no`), ''),
NULL,
d.`id_card_no`,
'1',
d.`tenant_no`,
d.`order_num`,
d.`remark`,
d.`create_by`,
d.`create_dept_id`,
d.`create_time`,
d.`update_by`,
d.`update_time`,
d.`del_flag`
FROM `pl_driver` d
WHERE d.`del_flag` = 0
AND NOT EXISTS (SELECT 1 FROM `pl_personnel` p WHERE p.`id` = d.`id`);
-- -----------------------------------------------------------------------------
-- 2. 司机证件 → pl_cert(owner_type=personnel, remind_days=30)
-- 证书 id 使用确定性前缀,便于幂等
-- -----------------------------------------------------------------------------
-- 驾驶证
INSERT INTO `pl_cert` (
`id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`,
`status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
CONCAT(d.`id`, '-dl'),
'personnel',
d.`id`,
'驾驶证',
d.`driving_license_no`,
d.`driving_license_expire`,
30,
'valid',
d.`tenant_no`,
d.`order_num`,
d.`remark`,
d.`create_by`,
d.`create_dept_id`,
d.`create_time`,
d.`update_by`,
d.`update_time`,
0
FROM `pl_driver` d
WHERE d.`del_flag` = 0
AND d.`driving_license_expire` IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-dl'));
-- 行驶证(原存于司机表,迁移后挂人员;业务上可后续调整到车辆)
INSERT INTO `pl_cert` (
`id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`,
`status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
CONCAT(d.`id`, '-vl'),
'personnel',
d.`id`,
'行驶证',
d.`vehicle_license_no`,
d.`vehicle_license_expire`,
30,
'valid',
d.`tenant_no`,
d.`order_num`,
d.`remark`,
d.`create_by`,
d.`create_dept_id`,
d.`create_time`,
d.`update_by`,
d.`update_time`,
0
FROM `pl_driver` d
WHERE d.`del_flag` = 0
AND d.`vehicle_license_expire` IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-vl'));
-- 危化品从业资格证
INSERT INTO `pl_cert` (
`id`, `owner_type`, `owner_id`, `cert_name`, `cert_no`, `expire_date`, `remind_days`,
`status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
CONCAT(d.`id`, '-hc'),
'personnel',
d.`id`,
'危化品从业资格证',
d.`hazmat_cert_no`,
d.`hazmat_cert_expire`,
30,
'valid',
d.`tenant_no`,
d.`order_num`,
d.`remark`,
d.`create_by`,
d.`create_dept_id`,
d.`create_time`,
d.`update_by`,
d.`update_time`,
0
FROM `pl_driver` d
WHERE d.`del_flag` = 0
AND d.`hazmat_cert_expire` IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM `pl_cert` c WHERE c.`id` = CONCAT(d.`id`, '-hc'));
-- -----------------------------------------------------------------------------
-- 3. pl_vehicle_driver → pl_vehicle_personnel(driver_id → personnel_id, role=driver)
-- -----------------------------------------------------------------------------
INSERT IGNORE INTO `pl_vehicle_personnel` (
`id`, `vehicle_id`, `personnel_id`, `role`, `is_default`,
`tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
vd.`id`,
vd.`vehicle_id`,
vd.`driver_id`,
'driver',
vd.`is_default`,
vd.`tenant_no`,
vd.`order_num`,
vd.`remark`,
vd.`create_by`,
vd.`create_dept_id`,
vd.`create_time`,
vd.`update_by`,
vd.`update_time`,
vd.`del_flag`
FROM `pl_vehicle_driver` vd
WHERE vd.`del_flag` = 0
AND NOT EXISTS (SELECT 1 FROM `pl_vehicle_personnel` vp WHERE vp.`id` = vd.`id`);
-- -----------------------------------------------------------------------------
-- 4. 从 pl_vehicle.default_driver_id 修正 is_default(每车最多一条 is_default=1)
-- -----------------------------------------------------------------------------
-- 先清零所有关联的 is_default
UPDATE `pl_vehicle_personnel` vp
INNER JOIN `pl_vehicle` v ON v.`id` = vp.`vehicle_id` AND v.`del_flag` = 0
SET vp.`is_default` = 0
WHERE vp.`del_flag` = 0
AND vp.`role` = 'driver'
AND v.`default_driver_id` IS NOT NULL
AND v.`default_driver_id` != '';
-- 按车辆 default_driver_id 设置默认司机
UPDATE `pl_vehicle_personnel` vp
INNER JOIN `pl_vehicle` v ON v.`id` = vp.`vehicle_id` AND v.`del_flag` = 0
SET vp.`is_default` = 1
WHERE vp.`del_flag` = 0
AND vp.`role` = 'driver'
AND vp.`personnel_id` = v.`default_driver_id`
AND v.`default_driver_id` IS NOT NULL
AND v.`default_driver_id` != '';
-- 若 default_driver_id 有值但尚无关联行,补插一条
INSERT IGNORE INTO `pl_vehicle_personnel` (
`id`, `vehicle_id`, `personnel_id`, `role`, `is_default`,
`tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
CONCAT('mig-vp-', v.`id`, '-', v.`default_driver_id`),
v.`id`,
v.`default_driver_id`,
'driver',
1,
v.`tenant_no`,
NULL,
'迁移自 default_driver_id',
v.`create_by`,
v.`create_dept_id`,
v.`create_time`,
v.`update_by`,
v.`update_time`,
0
FROM `pl_vehicle` v
WHERE v.`del_flag` = 0
AND v.`default_driver_id` IS NOT NULL
AND v.`default_driver_id` != ''
AND EXISTS (SELECT 1 FROM `pl_personnel` p WHERE p.`id` = v.`default_driver_id` AND p.`del_flag` = 0)
AND NOT EXISTS (
SELECT 1 FROM `pl_vehicle_personnel` vp
WHERE vp.`vehicle_id` = v.`id`
AND vp.`personnel_id` = v.`default_driver_id`
AND vp.`role` = 'driver'
AND vp.`del_flag` = 0
);