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

164 lines
8.6 KiB
SQL

-- =============================================================================
-- 运输计划 · 车辆/人员/证书重构 — 增量 DDL
-- 日期: 2026-06-19
-- 说明: 在已有 pl_ 表基础上新增/扩展,不删除 pl_driver(迁移后另脚本处理)
-- =============================================================================
SET NAMES utf8mb4;
-- -----------------------------------------------------------------------------
-- 1. pl_personnel(人员主表)
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `pl_personnel` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`personnel_name` varchar(100) NOT NULL COMMENT '姓名',
`phone_no` varchar(32) DEFAULT NULL COMMENT '手机号(非必填)',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`id_card_no` varchar(32) DEFAULT NULL COMMENT '身份证号',
`status` char(1) NOT NULL DEFAULT '1' COMMENT '状态 1-在职 0-停用',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint(6) NOT NULL DEFAULT 0 COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_no`),
KEY `idx_phone` (`phone_no`),
KEY `idx_personnel_name` (`personnel_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-人员表';
-- -----------------------------------------------------------------------------
-- 2. pl_cert(证书实例表)
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `pl_cert` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`owner_type` varchar(20) NOT NULL COMMENT '归属类型 vehicle-车辆 personnel-人员',
`owner_id` varchar(64) NOT NULL COMMENT '归属主体ID',
`cert_name` varchar(100) NOT NULL COMMENT '证书名称',
`cert_no` varchar(64) DEFAULT NULL COMMENT '证号',
`expire_date` date DEFAULT NULL COMMENT '有效期',
`remind_days` int(11) NOT NULL DEFAULT 30 COMMENT '提前提醒天数',
`attachment_urls` varchar(2000) DEFAULT NULL COMMENT '附件URL(逗号分隔)',
`status` varchar(20) NOT NULL DEFAULT 'valid' COMMENT '状态 valid-有效 expired-已过期 revoked-已作废',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint(6) NOT NULL DEFAULT 0 COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_no`),
KEY `idx_owner` (`owner_type`, `owner_id`),
KEY `idx_expire_date` (`expire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='运输计划-证书表';
-- -----------------------------------------------------------------------------
-- 3. pl_vehicle_personnel(车辆-人员关联,由 pl_vehicle_driver 演进)
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `pl_vehicle_personnel` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`vehicle_id` varchar(64) NOT NULL COMMENT '车辆ID',
`personnel_id` varchar(64) NOT NULL COMMENT '人员ID',
`role` varchar(20) NOT NULL DEFAULT 'driver' COMMENT '角色 driver-司机 escort-押运员',
`is_default` smallint(6) NOT NULL DEFAULT 0 COMMENT '是否默认司机 0-否 1-是',
`tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '关联备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint(6) NOT NULL DEFAULT 0 COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_vehicle_id` (`vehicle_id`),
KEY `idx_personnel_id` (`personnel_id`),
KEY `idx_tenant` (`tenant_no`),
KEY `idx_vehicle_role` (`vehicle_id`, `role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车辆-人员关联表';
-- 若存在旧表 pl_vehicle_driver 且无 pl_vehicle_personnel 数据,由迁移脚本处理
-- -----------------------------------------------------------------------------
-- 4. pl_document_reminder 扩展字段
-- -----------------------------------------------------------------------------
-- cert_id
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'cert_id'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pl_document_reminder` ADD COLUMN `cert_id` varchar(64) DEFAULT NULL COMMENT ''证书ID'' AFTER `id`',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- owner_type
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'owner_type'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pl_document_reminder` ADD COLUMN `owner_type` varchar(20) DEFAULT NULL COMMENT ''归属类型 vehicle/personnel'' AFTER `cert_id`',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- owner_id
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'owner_id'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pl_document_reminder` ADD COLUMN `owner_id` varchar(64) DEFAULT NULL COMMENT ''归属主体ID'' AFTER `owner_type`',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- owner_label
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'owner_label'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pl_document_reminder` ADD COLUMN `owner_label` varchar(200) DEFAULT NULL COMMENT ''归属展示名(车牌/姓名)'' AFTER `owner_id`',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- driver_id 改为可空(兼容车辆主体提醒)
SET @col_nullable = (
SELECT IS_NULLABLE FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'driver_id'
);
SET @sql = IF(@col_nullable = 'NO',
'ALTER TABLE `pl_document_reminder` MODIFY COLUMN `driver_id` varchar(64) DEFAULT NULL COMMENT ''司机/人员ID(兼容)''',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @col_nullable = (
SELECT IS_NULLABLE FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND COLUMN_NAME = 'driver_name'
);
SET @sql = IF(@col_nullable = 'NO',
'ALTER TABLE `pl_document_reminder` MODIFY COLUMN `driver_name` varchar(100) DEFAULT NULL COMMENT ''司机/人员姓名(兼容)''',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- document_type 扩长以存 cert_name
ALTER TABLE `pl_document_reminder`
MODIFY COLUMN `document_type` varchar(100) NOT NULL COMMENT '证件类型/证书名称';
-- 新索引
SET @idx_exists = (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pl_document_reminder' AND INDEX_NAME = 'idx_cert_id'
);
SET @sql = IF(@idx_exists = 0,
'ALTER TABLE `pl_document_reminder` ADD KEY `idx_cert_id` (`cert_id`)',
'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;