fix(hrm): 撤回误建的审批分类,清理无效请假数据,下线重复菜单
## 1. 撤回上一轮误建的 BPM 分类
上一轮我误判「请假审批缺少 BPM 分类」,新建了 4 个分类并把 qingjia 流程
复制了一份挂过去。实际请假审批本来就归在「考勤异常审批 hrm_attendance_approve」
分类下(原绑定 id=13/14 一直都在)。
撤回内容:
- 删除我复制的 2 条流程绑定(model_id 带 -leave 后缀)
- 删除 4 个误建分类:hrm_leave_approve / overtime_approve /
hrm_resignation_approve / hrm_transfer_approve
- 代码 HrmLeaveApplicationService.APPROVE_CATEGORY_CODE
改为 hrm_attendance_approve,与原绑定一致
验证:分类总数回到 14,hrm_attendance_approve 完好,
approve-process-definition-list 正常返回 qingjia v2。
## 2. 清理无效请假存量数据
两套互相重复、且都从未走过真实审批的数据:
A. bpm_oa_leave(10 条)
process_instance_id 是伪造字符串(OA-LEAVE-20260922001),
act_hi_procinst 里没有对应实例 → 审批中心点「进度」报
「流程实例不存在」→ 详情页崩溃。
B. hrm_leave_application(12 条)
process_instance_id 全为 NULL/空,状态是直接改库写死的。
经确认无任何外键或业务表引用,考勤记录也没有依赖它们的行,全部清除。
## 3. 下线重复的「审批中心→请假」菜单
菜单 1118「请假查询」挂在 visible=0 的「OA 示例」下,只授权给租户管理员,
普通员工访问 403,且数据已清空。与 HRM 的请假功能完全重复。
软删除 1118/1119/1120 及角色关联。代码保留,回滚:
UPDATE system_menu SET deleted=b''0'' WHERE id IN (1118,1119,1120);
## 备份
/data/backup/mysql/manual/pre_rollback_bpm_20261030164422.sql
/data/backup/mysql/manual/pre_cleanup_leave_20261030164516.sql
/data/backup/mysql/manual/pre_del_oa_menu_20261030164805.sql
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- æ¸
çæ æç请ååéæ°æ® |
| | | -- çææ¶é´ï¼2026-10-30 |
| | | -- |
| | | -- èæ¯ï¼åºéåå¨ä¸¤å¥äºç¸éå¤çè¯·åæ°æ®ï¼ä¸é½ä»æªèµ°è¿çå®å®¡æ¹æµç¨ââ |
| | | -- |
| | | -- A. bpm_oa_leaveï¼10 æ¡ï¼ |
| | | -- process_instance_id åçæ¯ä¼ªé å符串ï¼OA-LEAVE-20260922001 è¿ç§ï¼ï¼ |
| | | -- act_hi_procinst éæ ¹æ¬æ²¡æå¯¹åºå®ä¾ã |
| | | -- åæï¼å®¡æ¹ä¸å¿è¯·å页é¢ç¹ãè¿åº¦ãâ è° get-approval-detail |
| | | -- â åç«¯ãæµç¨å®ä¾ä¸åå¨ãâ é¡µé¢ 500ã |
| | | -- |
| | | -- B. hrm_leave_applicationï¼12 æ¡ï¼ |
| | | -- process_instance_id å
¨ä¸º NULL æç©ºä¸²ï¼ç¶æï¼å®¡æ¹éè¿/驳åï¼ |
| | | -- æ¯ç´æ¥æ¹åºåæ»çï¼ä»æªèµ°è¿ BPMã |
| | | -- åªæ id=13ï¼LA202610300002ï¼æ¯ä»å¤©æ°æäº¤çï¼ç¶æå®¡æ¹éè¿ï¼ |
| | | -- åæ ·æ²¡ææµç¨å®ä¾ã |
| | | -- |
| | | -- 䏤奿°æ®å
容ä¸ä¸å¯¹åºï¼åæ ·ç user_id / æ¥æ / ç±»åï¼ï¼ææ¾æ¯å䏿¹ |
| | | -- æµè¯æ°æ®å¯¼äºä¸¤æ¬¡ãç»ç¡®è®¤æ ä»»ä½å¤é®æä¸å¡è¡¨å¼ç¨ï¼ä¿¡æ¯æ¨¡å¼çä¾èµæ£æ¥ä¸ºç©ºï¼ï¼ |
| | | -- èå¤è®°å½é乿²¡æ leave_flag=1 çè¡ä¾èµå®ä»¬ã |
| | | -- |
| | | -- å¤çï¼ç©çå é¤è¿ä¸¤æ¹æ°æ®ï¼è®©è¯·ååè½ä»å¹²åç¶æå¼å§ã |
| | | -- å é¤åå工鿰æäº¤ç请åä¼çæ£èµ° BPMï¼process_instance_id 为çå®å®ä¾ã |
| | | -- |
| | | -- å¤ä»½ï¼/data/backup/mysql/manual/pre_cleanup_leave_*.sql |
| | | -- å¹çï¼å¯é夿§è¡ |
| | | -- ============================================================ |
| | | |
| | | -- ---------- 1. æ¸
çåå¿«ç
§ ---------- |
| | | SELECT 'bpm_oa_leave' AS 表å, COUNT(*) AS æ¡æ° FROM bpm_oa_leave |
| | | UNION ALL |
| | | SELECT 'hrm_leave_application', COUNT(*) FROM hrm_leave_application WHERE deleted = b'0'; |
| | | |
| | | -- ---------- 2. å é¤ bpm_oa_leave å
¨é¨ï¼10 æ¡ï¼å
¨æ¯ä¼ªé æµç¨å®ä¾ï¼---------- |
| | | DELETE FROM bpm_oa_leave; |
| | | |
| | | -- ---------- 3. å é¤ hrm_leave_applicationï¼12 æ¡ï¼å
¨é¨æ æµç¨å®ä¾ï¼---------- |
| | | DELETE FROM hrm_leave_application WHERE process_instance_id IS NULL OR process_instance_id = ''; |
| | | |
| | | -- ---------- 4. æ¸
çå¯è½æ®ççéä»¶å
³è ---------- |
| | | -- é件表å®é
å忝 record_type / record_id / application |
| | | DELETE FROM system_storage_attachment |
| | | WHERE record_type = 'hrm_leave_application' |
| | | AND record_id NOT IN (SELECT id FROM hrm_leave_application); |
| | | |
| | | -- ---------- 5. æ ¡éª ---------- |
| | | SELECT 'bpm_oa_leave' AS 表å, COUNT(*) AS å©ä½æ¡æ° FROM bpm_oa_leave |
| | | UNION ALL |
| | | SELECT 'hrm_leave_application', COUNT(*) FROM hrm_leave_application WHERE deleted = b'0'; |
| | | |
| | | SELECT 'æ æµç¨å®ä¾ç请åå' AS æ£æ¥é¡¹, COUNT(*) AS æ¡æ° |
| | | FROM hrm_leave_application |
| | | WHERE deleted = b'0' AND (process_instance_id IS NULL OR process_instance_id = ''); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- ä¸çº¿ã审æ¹ä¸å¿ â 请åãéå¤èå页 |
| | | -- çææ¶é´ï¼2026-10-30 |
| | | -- |
| | | -- èæ¯ï¼ç³»ç»éåå¨ä¸¤å¥è¯·ååè½ââ |
| | | -- |
| | | -- A. 审æ¹ä¸å¿ â OAç¤ºä¾ â è¯·åæ¥è¯¢ï¼èå 1118ï¼ |
| | | -- æ°æ®æº bpm_oa_leaveï¼å·²æ¸
空ï¼10 æ¡å
¨æ¯ä¼ªé æµç¨å®ä¾ï¼ |
| | | -- æå¨ visible=0 çãOA 示ä¾ãä¸ï¼åªææç»ç§æ·ç®¡çå |
| | | -- æ®éå工访é®è¿å 403ï¼ç¹ãè¿åº¦ãä¼å æµç¨å®ä¾ä¸åå¨èæ¥é |
| | | -- |
| | | -- B. 人äºå®¡æ¹ â 请åç³è¯·ï¼èå 6003ï¼ |
| | | -- æ°æ®æº hrm_leave_applicationï¼ä¸èå¤/èªèµæé |
| | | -- å·²é
ç½® BPM 审æ¹ï¼qingjia v2ï¼æå¨ hrm_attendance_approve åç±»ä¸ï¼ |
| | | -- æ¯æ£è§å¨ç¨çé£ä¸å¥ |
| | | -- |
| | | -- ç»è®ºï¼A æ¯æ§æ¼ç¤ºé¡µé¢ï¼ä¸ B å®å
¨éå¤ä¸å·²æ æ°æ®ï¼ç´æ¥ä¸çº¿ã |
| | | -- 代ç ï¼bpm/oa/leaveï¼ä¿çï¼æ¥åéè¦æ¶å¯æ¢å¤èåã |
| | | -- |
| | | -- åæ³ï¼è½¯å é¤èå 1118 åå
¶ä¸¤ä¸ªæé®æéï¼1119 æ¥è¯¢ / 1120 åå»ºï¼ |
| | | -- ä¸ç©çå é¤ï¼å¯åæ» |
| | | -- åæ»ï¼UPDATE system_menu SET deleted=b'0' WHERE id IN (1118,1119,1120); |
| | | -- ============================================================ |
| | | |
| | | -- ---------- 1. å¤çåå¿«ç
§ ---------- |
| | | SELECT id, name, parent_id, path, component, permission, type, visible+0 AS vis |
| | | FROM system_menu WHERE id IN (1118, 1119, 1120) AND deleted = b'0'; |
| | | |
| | | -- ---------- 2. 软å é¤èååå
¶æé®æé ---------- |
| | | UPDATE system_menu |
| | | SET deleted = b'1', updater = '1', update_time = NOW() |
| | | WHERE id IN (1118, 1119, 1120) |
| | | AND deleted = b'0'; |
| | | |
| | | -- ---------- 3. æ¸
çè§è²èåå
³èï¼é¿å
æ®çæé ---------- |
| | | DELETE FROM system_role_menu WHERE menu_id IN (1118, 1119, 1120); |
| | | |
| | | -- ---------- 4. æ ¡éª ---------- |
| | | SELECT COUNT(*) AS å©ä½ææèåæ° FROM system_menu |
| | | WHERE id IN (1118, 1119, 1120) AND deleted = b'0'; |
| | | |
| | | SELECT COUNT(*) AS å©ä½è§è²å
³èæ° FROM system_role_menu |
| | | WHERE menu_id IN (1118, 1119, 1120); |
| | | |
| | | -- ---------- 5. 确认 HRM 请åèåå®å¥½ ---------- |
| | | SELECT id, name, path, component, visible+0 AS vis |
| | | FROM system_menu WHERE id = 6003 AND deleted = b'0'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- æ¤åï¼å 餿ä¹å误建ç HRM 审æ¹åç±» |
| | | -- çææ¶é´ï¼2026-10-30 |
| | | -- |
| | | -- èæ¯ï¼ä¸ä¸è½®æè¯¯å¤è¯·å审æ¹ç¼ºå° BPM åç±»ï¼æ°å»ºäº 4 个åç±»ï¼ |
| | | -- å¹¶æ qingjia çæµç¨å®ä¹å¤å¶äºä¸ä»½æå° hrm_leave_approve ä¸ã |
| | | -- |
| | | -- å®é
æ
åµï¼è¯·åå®¡æ¹æ¬æ¥å°±è¯¥å½å¨ãèå¤å¼å¸¸å®¡æ¹ hrm_attendance_approveã |
| | | -- åç±»ä¸ï¼åç»å® id=13/14 ä¸ç´é½å¨ï¼ï¼ä¸éè¦åç¬åç±»ã |
| | | -- |
| | | -- æ¬æ¬¡å¤çï¼ |
| | | -- 1. å 餿å¤å¶ç 2 æ¡æµç¨ç»å®ï¼id=20/21ï¼model_id 带 -leave åç¼ï¼ |
| | | -- 2. å é¤ 4 个误建åç±»ï¼å
¶ä¸ hrm_leave_approve æç»å®ï¼å¦ 3 个æ¯ç©ºå£³ï¼ |
| | | -- 3. 代ç ä¾§ HrmLeaveApplicationService.APPROVE_CATEGORY_CODE |
| | | -- å·²æ¹ä¸º hrm_attendance_approveï¼ä¿æä¸åç»å®ä¸è´ |
| | | -- |
| | | -- ä¿çï¼hrm_attendance_approve åç±»åå
¶åæç 2 æ¡ qingjia ç»å®ï¼id=13/14ï¼ |
| | | -- å¹çï¼å¯é夿§è¡ |
| | | -- ============================================================ |
| | | |
| | | -- ---------- 1. å¤çåå¿«ç
§ ---------- |
| | | SELECT 'åç±»' AS 项, id, name, code FROM bpm_category |
| | | WHERE code IN ('hrm_leave_approve','overtime_approve','hrm_resignation_approve','hrm_transfer_approve') |
| | | AND deleted = b'0' |
| | | UNION ALL |
| | | SELECT 'ç»å®', id, model_id, category FROM bpm_process_definition_info |
| | | WHERE category = 'hrm_leave_approve' AND deleted = b'0'; |
| | | |
| | | -- ---------- 2. å 餿å¤å¶çæµç¨ç»å®ï¼åªå model_id 带 -leave åç¼çï¼---------- |
| | | DELETE FROM bpm_process_definition_info |
| | | WHERE category = 'hrm_leave_approve' |
| | | AND model_id LIKE '%-leave'; |
| | | |
| | | -- ---------- 3. å é¤ 4 个误建åç±» ---------- |
| | | DELETE FROM bpm_category |
| | | WHERE code IN ('hrm_leave_approve','overtime_approve','hrm_resignation_approve','hrm_transfer_approve') |
| | | AND deleted = b'0'; |
| | | |
| | | -- ---------- 4. æ ¡éªï¼è¿äºåç±»åºå·²ä¸åå¨ ---------- |
| | | SELECT COUNT(*) AS æ®çåç±»æ° FROM bpm_category |
| | | WHERE code IN ('hrm_leave_approve','overtime_approve','hrm_resignation_approve','hrm_transfer_approve'); |
| | | |
| | | SELECT COUNT(*) AS æ®çç»å®ä½æ° FROM bpm_process_definition_info |
| | | WHERE category = 'hrm_leave_approve'; |
| | | |
| | | -- ---------- 5. 确认åç»å®å®å¥½ï¼åºä¸º 2 æ¡ï¼qingjia v1/v2ï¼---------- |
| | | SELECT id, process_definition_id, category FROM bpm_process_definition_info |
| | | WHERE category = 'hrm_attendance_approve' AND deleted = b'0' |
| | | ORDER BY id; |
| | |
| | | |
| | | /** |
| | | * BPM 请å审æ¹åç±»ç¼ç |
| | | * |
| | | * è¯·åæµç¨ç»ä¸å½å¨ãèå¤å¼å¸¸å®¡æ¹ãåç±»ä¸ï¼ä¸èå¤å¼å¸¸å
±ç¨åä¸ä¸ªå®¡æ¹åç±»ï¼ |
| | | * ä¸ååç¬å»º hrm_leave_approve åç±»ã |
| | | */ |
| | | String APPROVE_CATEGORY_CODE = "hrm_leave_approve"; |
| | | String APPROVE_CATEGORY_CODE = "hrm_attendance_approve"; |
| | | |
| | | /** |
| | | * å建请åç³è¯· |