-- ============================================================
|
-- 安全生产 - 人员与车间字段全面改为主数据关联
|
-- 生成时间:2026-10-29
|
--
|
-- 背景:模块初版把「负责人 / 巡检人 / 上报人 / 整改人 / 复查人 / 申请人 /
|
-- 审批人 / 监护人 / 保管人 / 讲师 / 组织人 / 车间」全部做成了纯文本,
|
-- 与人力资源员工档案、MES 车间主数据完全脱节,人名靠手打、车间靠手输。
|
--
|
-- 做法(统一模式,与 safety_certificate 一致):
|
-- 1. 新增 xxx_id 关联主数据:employee 关联 hrm_employee.id,workshop 关联 mes_md_workshop.id
|
-- 2. 原文本列保留,降级为「快照」:保存时从主数据带出,查询时用主数据最新值覆盖;
|
-- 主数据被删或历史脏数据时回退到快照,保证老记录仍可读(即「特别的可以手打」)
|
-- 3. id 列一律 NULL 允许,避免迁移卡住历史数据
|
--
|
-- 幂等:全部用 information_schema 判断后再 ALTER,可重复执行
|
-- ============================================================
|
|
-- ---------- 通用:新增列的过程式写法(MySQL 无 ADD COLUMN IF NOT EXISTS) ----------
|
DROP PROCEDURE IF EXISTS sp_safety_add_col;
|
DELIMITER $$
|
CREATE PROCEDURE sp_safety_add_col(IN p_table VARCHAR(64), IN p_col VARCHAR(64),
|
IN p_def VARCHAR(255), IN p_comment VARCHAR(255), IN p_after VARCHAR(64))
|
BEGIN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
WHERE table_schema = DATABASE() AND table_name = p_table AND column_name = p_col) THEN
|
SET @s = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_col, '` ', p_def,
|
' COMMENT ''', p_comment, ''' AFTER `', p_after, '`');
|
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
|
END IF;
|
IF NOT EXISTS (SELECT 1 FROM information_schema.statistics
|
WHERE table_schema = DATABASE() AND table_name = p_table AND index_name = CONCAT('idx_', p_col)) THEN
|
SET @s2 = CONCAT('CREATE INDEX `idx_', p_col, '` ON `', p_table, '` (`', p_col, '`)');
|
PREPARE st2 FROM @s2; EXECUTE st2; DEALLOCATE PREPARE st2;
|
END IF;
|
END$$
|
DELIMITER ;
|
|
-- ---------- 1. 安全组织架构:负责人 ----------
|
CALL sp_safety_add_col('safety_org', 'leader_id', 'bigint NULL', '负责人(员工编号,关联 hrm_employee.id)', 'name');
|
|
-- ---------- 2. 巡检点位:所属车间 + 责任人 ----------
|
CALL sp_safety_add_col('safety_inspection_point', 'workshop_id', 'bigint NULL', '所属车间(关联 mes_md_workshop.id)', 'point_type');
|
CALL sp_safety_add_col('safety_inspection_point', 'owner_id', 'bigint NULL', '责任人(员工编号,关联 hrm_employee.id)', 'inspect_cycle');
|
|
-- ---------- 3. 巡检记录:巡检人 ----------
|
CALL sp_safety_add_col('safety_inspection', 'inspector_id', 'bigint NULL', '巡检人(员工编号,关联 hrm_employee.id)', 'inspector');
|
|
-- ---------- 4. 隐患:上报人 / 整改责任人 / 复查人 ----------
|
CALL sp_safety_add_col('safety_hazard', 'reporter_id', 'bigint NULL', '上报人(员工编号,关联 hrm_employee.id)', 'reporter');
|
CALL sp_safety_add_col('safety_hazard', 'assignee_id', 'bigint NULL', '整改责任人(员工编号,关联 hrm_employee.id)', 'assignee');
|
CALL sp_safety_add_col('safety_hazard', 'rechecker_id', 'bigint NULL', '复查人(员工编号,关联 hrm_employee.id)', 'rechecker');
|
|
-- ---------- 5. 高危作业票:作业车间 / 申请人 / 审批人 / 监护人 ----------
|
CALL sp_safety_add_col('safety_work_permit', 'workshop_id', 'bigint NULL', '作业车间(关联 mes_md_workshop.id)', 'permit_type');
|
CALL sp_safety_add_col('safety_work_permit', 'applicant_id', 'bigint NULL', '申请人(员工编号,关联 hrm_employee.id)', 'applicant');
|
CALL sp_safety_add_col('safety_work_permit', 'approver_id', 'bigint NULL', '审批人(员工编号,关联 hrm_employee.id)', 'approver');
|
CALL sp_safety_add_col('safety_work_permit', 'guardian_id', 'bigint NULL', '监护人(员工编号,关联 hrm_employee.id)', 'guardian');
|
|
-- ---------- 6. 作业监护记录:监护人 ----------
|
CALL sp_safety_add_col('safety_work_permit_monitor', 'guardian_id', 'bigint NULL', '监护人(员工编号,关联 hrm_employee.id)', 'guardian');
|
|
-- ---------- 7. 应急物资:保管人 ----------
|
CALL sp_safety_add_col('safety_material', 'manager_id', 'bigint NULL', '保管人(员工编号,关联 hrm_employee.id)', 'manager');
|
|
-- ---------- 8. 安全培训:讲师/组织人 ----------
|
CALL sp_safety_add_col('safety_training', 'trainer_id', 'bigint NULL', '讲师/组织人(员工编号,关联 hrm_employee.id)', 'trainer');
|
|
-- ---------- 9. 消防演练:组织人 ----------
|
CALL sp_safety_add_col('safety_drill', 'organizer_id', 'bigint NULL', '组织人(员工编号,关联 hrm_employee.id)', 'organizer');
|
|
-- ---------- 10. 事故登记:所属车间 + 登记人 ----------
|
CALL sp_safety_add_col('safety_accident', 'workshop_id', 'bigint NULL', '所属车间(关联 mes_md_workshop.id)', 'accident_type');
|
CALL sp_safety_add_col('safety_accident', 'reporter_id', 'bigint NULL', '登记人(员工编号,关联 hrm_employee.id)', 'reporter');
|
|
-- ---------- 11. 原文本列注释改为「快照」语义 ----------
|
ALTER TABLE `safety_org` MODIFY COLUMN `leader_name` varchar(50) DEFAULT NULL COMMENT '负责人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_inspection_point` MODIFY COLUMN `workshop_name` varchar(100) DEFAULT NULL COMMENT '所属车间(快照,由车间主数据带出)',
|
MODIFY COLUMN `owner_name` varchar(50) DEFAULT NULL COMMENT '责任人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_inspection` MODIFY COLUMN `inspector` varchar(50) DEFAULT NULL COMMENT '巡检人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_hazard` MODIFY COLUMN `reporter` varchar(50) DEFAULT NULL COMMENT '上报人姓名(快照,由员工档案带出)',
|
MODIFY COLUMN `assignee` varchar(50) DEFAULT NULL COMMENT '整改责任人姓名(快照,由员工档案带出)',
|
MODIFY COLUMN `rechecker` varchar(50) DEFAULT NULL COMMENT '复查人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_work_permit` MODIFY COLUMN `workshop_name` varchar(100) DEFAULT NULL COMMENT '作业车间(快照,由车间主数据带出)',
|
MODIFY COLUMN `applicant` varchar(50) DEFAULT NULL COMMENT '申请人姓名(快照,由员工档案带出)',
|
MODIFY COLUMN `approver` varchar(50) DEFAULT NULL COMMENT '审批人姓名(快照,由员工档案带出)',
|
MODIFY COLUMN `guardian` varchar(50) DEFAULT NULL COMMENT '监护人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_work_permit_monitor` MODIFY COLUMN `guardian` varchar(50) DEFAULT NULL COMMENT '监护人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_material` MODIFY COLUMN `manager` varchar(50) DEFAULT NULL COMMENT '保管人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_training` MODIFY COLUMN `trainer` varchar(50) DEFAULT NULL COMMENT '讲师/组织人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_drill` MODIFY COLUMN `organizer` varchar(50) DEFAULT NULL COMMENT '组织人姓名(快照,由员工档案带出)';
|
ALTER TABLE `safety_accident` MODIFY COLUMN `workshop_name` varchar(100) DEFAULT NULL COMMENT '所属车间(快照,由车间主数据带出)',
|
MODIFY COLUMN `reporter` varchar(50) DEFAULT NULL COMMENT '登记人姓名(快照,由员工档案带出)';
|
|
-- ---------- 12. 清理临时过程 ----------
|
DROP PROCEDURE IF EXISTS sp_safety_add_col;
|
|
-- ---------- 13. 校验 ----------
|
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT
|
FROM information_schema.columns
|
WHERE table_schema = DATABASE() AND TABLE_NAME LIKE 'safety%'
|
AND (COLUMN_NAME LIKE '%\_id' OR COLUMN_NAME IN ('inspector','reporter','assignee','rechecker','applicant','approver','guardian','manager','trainer','organizer','workshop_name','leader_name'))
|
ORDER BY TABLE_NAME, ORDINAL_POSITION;
|