xiaoyi
10 天以前 fae95228037f0c1304c1917ae5fff452f2160c5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
-- ============================================================
-- 安全生产 - 人员与车间字段全面改为主数据关联
-- 生成时间: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;