212 lines
6.4 KiB
SQL
212 lines
6.4 KiB
SQL
-- =============================================================================
|
||
-- 运输计划 · 车辆/人员/证书重构 — 数据迁移
|
||
-- 日期: 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
|
||
);
|