feat(xg): 请假审批修复、点名今日汇总与寝室扣分条例脚本

同步请假/销假审批上下文与状态、宿舍点名今日汇总与假期留宿标识,并补充寝室检查扣分条例生产 SQL 与执行说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
“wuzhen”andCursor committed 2026-10-20 18:01:12 +08:00
1 parent 3e6349112c
commit 7cea0566ac
48 files changed
+1966 -116

No files matched your search

@@ -0,0 +1,164 @@
-- =============================================================================
-- 寝室检查扣分项同步:按「扣分条例10月15日」重建宿舍区违纪类型
-- 文件:update_20261020_dorm_hygiene_deduction_types.sql
-- 依据:宿管《扣分条例10月15日》
-- 影响表:xskh_discipline_type(仅 area_type='1' 宿舍区)
-- 不影响:教学区违纪(area_type=2)、历史检查明细中的旧 type_id(仅停用不删除)
-- =============================================================================
-- 【重要】执行前请完整阅读配套说明:
-- docs/开发文档/寝室检查扣分条例生产执行说明-20261020.md
-- =============================================================================
-- USE your_prod_database; -- 如有需要请取消注释并改成生产库名
SET NAMES utf8mb4;
-- -----------------------------------------------------------------------------
-- 步骤0:备份(强烈建议先做)
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS xskh_discipline_type_bak_20261020 AS
SELECT * FROM xskh_discipline_type WHERE 1 = 0;
INSERT INTO xskh_discipline_type_bak_20261020
SELECT t.*
FROM xskh_discipline_type t
LEFT JOIN xskh_discipline_type_bak_20261020 b ON b.id = t.id
WHERE t.area_type = '1'
AND t.deleted = 0
AND b.id IS NULL;
-- 核对备份行数
SELECT COUNT(*) AS bak_dorm_type_count FROM xskh_discipline_type_bak_20261020;
-- -----------------------------------------------------------------------------
-- 步骤1:执行前核对(只读)
-- -----------------------------------------------------------------------------
SELECT id, type_code, type_name, min_score, max_score, status, sort_order
FROM xskh_discipline_type
WHERE area_type = '1' AND deleted = 0
ORDER BY status, sort_order, id;
-- -----------------------------------------------------------------------------
-- 步骤2:停用旧的宿舍区违纪类型(不物理删除,保留历史引用)
-- 仅停用非本次批次编码(sskf202610_ 开头的视为本脚本数据,可重复执行)
-- -----------------------------------------------------------------------------
UPDATE xskh_discipline_type
SET status = '1',
update_time = NOW(),
update_by = 1,
remark = CONCAT(IFNULL(remark, ''), ' [2026-10-20停用:切换至10月15日扣分条例]')
WHERE area_type = '1'
AND deleted = 0
AND status = '0'
AND type_code NOT LIKE 'sskf202610_%';
SELECT ROW_COUNT() AS disabled_old_count;
-- -----------------------------------------------------------------------------
-- 步骤3:清理本脚本同批次数据(支持幂等重跑)
-- 注意:若生产已用新类型做过检查,请勿再执行 DELETE,改为手工调整
-- -----------------------------------------------------------------------------
DELETE t FROM xskh_discipline_type t
WHERE t.type_code LIKE 'sskf202610_%'
AND NOT EXISTS (
SELECT 1
FROM xg_dorm_hygiene_check_deduction d
WHERE d.discipline_type_id = t.id
AND IFNULL(d.deleted, 0) = 0
);
-- -----------------------------------------------------------------------------
-- 步骤4:插入新条例(区域=宿舍区1,分类=违纪类型1,状态=正常0)
-- ID 区间:2210610150000000001 ~ ...(专用号段,避免与雪花ID冲突概率极低)
-- -----------------------------------------------------------------------------
INSERT INTO xskh_discipline_type (
id, type_code, type_name, type_category, area_type, remark,
min_score, max_score, is_equalized, equalized_threshold, status, sort_order,
create_by, create_time, update_by, update_time, create_dept, deleted, tenant_id
) VALUES
(2210610150000000001, 'sskf202610_ws_01', '地面未拖扫', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 1, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000002, 'sskf202610_ws_02', '床沿、床边、床内乱挂', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 2, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000003, 'sskf202610_ws_03', '被子质量、摆放问题', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 3, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000004, 'sskf202610_ws_04', '床铺未整齐', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 4, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000005, 'sskf202610_ws_05', '鞋子未摆放整齐', '1', '1', '卫生方面', 0.50, 1.00, '0', NULL, '0', 5, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000006, 'sskf202610_ws_06', '椅子未摆放到位', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 6, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000007, 'sskf202610_ws_07', '桌面有污渍、灰尘', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 7, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000008, 'sskf202610_ws_08', '桌面摆放不整齐', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 8, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000009, 'sskf202610_ws_09', '公区未打扫', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 9, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000010, 'sskf202610_ws_10', '劳动工具未摆放好', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 10, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000011, 'sskf202610_ws_11', '毛巾未挂齐', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 11, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000012, 'sskf202610_ws_12', '椅地床鞋架脸盆架阳台有杂物', '1', '1', '卫生方面;椅子/地面/床铺/鞋架/脸盆架/阳台有杂物', 0.50, 3.00, '0', NULL, '0', 12, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000013, 'sskf202610_ws_13', '垃圾桶未倒', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 13, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000014, 'sskf202610_ws_14', '便池有污垢', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 14, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000015, 'sskf202610_ws_15', '箱包未摆放整齐或未在指定位置', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 15, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000016, 'sskf202610_ws_16', '柜子底部收纳不整齐', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 16, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000017, 'sskf202610_ws_17', '蚊帐未拉起', '1', '1', '卫生方面', 0.50, 3.00, '0', NULL, '0', 17, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000018, 'sskf202610_ws_18', '洗脸台摆放', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 18, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000019, 'sskf202610_ws_19', '洗脸台有水渍、垃圾', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 19, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000020, 'sskf202610_ws_20', '镜子有明显水渍', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 20, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000021, 'sskf202610_ws_21', '墙壁柜子乱贴乱画', '1', '1', '卫生方面', 0.50, 0.50, '0', NULL, '0', 21, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000022, 'sskf202610_jl_01', '晚出寝', '1', '1', '纪律方面', 0.50, 3.00, '0', NULL, '0', 22, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000023, 'sskf202610_jl_02', '就寝未熄灯', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 23, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000024, 'sskf202610_jl_03', '就寝纪律差', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 24, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000025, 'sskf202610_jl_04', '卫生间电灯未关', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 25, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000026, 'sskf202610_jl_05', '走道上方电灯未关', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 26, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000027, 'sskf202610_jl_06', '书桌电灯未关', '1', '1', '纪律方面', 0.50, 3.00, '0', NULL, '0', 27, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000028, 'sskf202610_jl_07', '空调未关', '1', '1', '纪律方面', 2.00, 2.00, '0', NULL, '0', 28, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000029, 'sskf202610_jl_08', '上周五备忘录晚交', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 29, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000030, 'sskf202610_jl_09', '没有电脑进寝单', '1', '1', '纪律方面', 2.00, 12.00, '0', NULL, '0', 30, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000031, 'sskf202610_jl_10', '阳台电灯未关', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 31, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000032, 'sskf202610_jl_11', '熄灯串寝', '1', '1', '纪律方面', 0.50, 3.00, '0', NULL, '0', 32, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000033, 'sskf202610_jl_12', '晚归', '1', '1', '纪律方面', 0.50, 3.00, '0', NULL, '0', 33, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000034, 'sskf202610_jl_13', '住其他寝室(未报备)', '1', '1', '纪律方面', 1.00, 6.00, '0', NULL, '0', 34, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000035, 'sskf202610_jl_14', '带外卖进寝室', '1', '1', '纪律方面', 1.00, 6.00, '0', NULL, '0', 35, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000036, 'sskf202610_jl_15', '往窗外扔垃圾', '1', '1', '纪律方面', 1.00, 6.00, '0', NULL, '0', 36, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000037, 'sskf202610_jl_16', '猫眼堵住', '1', '1', '纪律方面', 0.50, 0.50, '0', NULL, '0', 37, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000038, 'sskf202610_zd_01', '烟头、香烟、烟盒', '1', '1', '重大违纪', 0.50, 30.00, '0', NULL, '0', 38, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000039, 'sskf202610_zd_02', '抽烟', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 39, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000040, 'sskf202610_zd_03', '插座未拔、私拉电线、私装插座', '1', '1', '重大违纪', 0.50, 12.00, '0', NULL, '0', 40, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000041, 'sskf202610_zd_04', '对消防产生隐患行为', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 41, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000042, 'sskf202610_zd_05', '喝酒、酗酒', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 42, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000043, 'sskf202610_zd_06', '酒瓶', '1', '1', '重大违纪', 0.50, 30.00, '0', NULL, '0', 43, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000044, 'sskf202610_zd_07', '扑克牌', '1', '1', '重大违纪', 0.50, 0.50, '0', NULL, '0', 44, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000045, 'sskf202610_zd_08', '违禁电器、管制刀具等违禁物品', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 45, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000046, 'sskf202610_zd_09', '不服从管理、有顶撞、对抗行为', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 46, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000047, 'sskf202610_zd_10', '存放易燃易爆物品', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 47, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000048, 'sskf202610_zd_11', '影响公共安全稳定', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 48, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000049, 'sskf202610_zd_12', '留宿外人', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 49, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000050, 'sskf202610_zd_13', '破坏寝室公物', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 50, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000051, 'sskf202610_zd_14', '赌博', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 51, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000052, 'sskf202610_zd_15', '进入异性寝室', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 52, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000053, 'sskf202610_zd_16', '一夜未归', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 53, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000054, 'sskf202610_zd_17', '爬围墙、爬围栏', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 54, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000055, 'sskf202610_zd_18', '打架斗殴', '1', '1', '重大违纪', 2.00, 12.00, '0', NULL, '0', 55, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000056, 'sskf202610_zd_19', '养宠物', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 56, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000057, 'sskf202610_zd_20', '偷窃', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 57, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000058, 'sskf202610_zd_21', '吸毒、贩毒', '1', '1', '重大违纪;条例原文未写分值,暂按2-12录入,请宿管确认后可改', 2.00, 12.00, '0', NULL, '0', 58, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000059, 'sskf202610_zd_22', '敲诈勒索', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 59, 1, NOW(), 1, NOW(), 103, 0, '000000'),
(2210610150000000060, 'sskf202610_zd_23', '焚烧废纸杂物', '1', '1', '重大违纪', 2.00, 2.00, '0', NULL, '0', 60, 1, NOW(), 1, NOW(), 103, 0, '000000');
-- -----------------------------------------------------------------------------
-- 步骤5:执行后核对
-- -----------------------------------------------------------------------------
SELECT COUNT(*) AS new_active_dorm_types
FROM xskh_discipline_type
WHERE area_type = '1' AND deleted = 0 AND status = '0' AND type_code LIKE 'sskf202610_%';
SELECT type_code, type_name, min_score, max_score, sort_order, remark
FROM xskh_discipline_type
WHERE area_type = '1' AND deleted = 0 AND status = '0' AND type_code LIKE 'sskf202610_%'
ORDER BY sort_order;
-- 仍启用的旧宿舍区类型(应为0)
SELECT id, type_code, type_name, status
FROM xskh_discipline_type
WHERE area_type = '1' AND deleted = 0 AND status = '0' AND type_code NOT LIKE 'sskf202610_%';
-- =============================================================================
-- 回滚参考(慎用):
-- 1) DELETE FROM xskh_discipline_type WHERE type_code LIKE 'sskf202610_%';
-- 2) UPDATE xskh_discipline_type t
-- INNER JOIN xskh_discipline_type_bak_20261020 b ON b.id = t.id
-- SET t.status = b.status, t.remark = b.remark, t.update_time = NOW()
-- WHERE t.area_type = '1';
-- =============================================================================
@@ -0,0 +1,32 @@
-- 宿舍点名:假期留宿状态与统计
-- 执行库:hzdyjs_xg
-- 1. 主表增加假期留宿人数
ALTER TABLE `xg_dorm_roll_call`
ADD COLUMN `holiday_stay_count` int(11) DEFAULT '0' COMMENT '假期留宿人数' AFTER `leave_count`;
-- 2. 明细表增加假期留宿关联字段
ALTER TABLE `xg_dorm_roll_call_detail`
ADD COLUMN `holiday_stay_id` bigint(20) DEFAULT NULL COMMENT '关联假期留宿记录ID' AFTER `leave_end_time`,
ADD COLUMN `holiday_type` varchar(50) DEFAULT NULL COMMENT '假期类型' AFTER `holiday_stay_id`,
ADD COLUMN `holiday_start_date` datetime DEFAULT NULL COMMENT '留宿开始日期' AFTER `holiday_type`,
ADD COLUMN `holiday_end_date` datetime DEFAULT NULL COMMENT '留宿结束日期' AFTER `holiday_start_date`;
-- 3. 点名状态字典补充「假期留宿」
INSERT INTO `sys_dict_data` (
`dict_code`, `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`,
`css_class`, `list_class`, `is_default`, `create_dept`, `create_by`, `create_time`,
`update_by`, `update_time`, `remark`
)
SELECT 7463495598327466504, '000000', 5, '假期留宿', '4', 'xg_dorm_roll_call_status',
'', 'primary', 'N', 103, 1, NOW(), 1, NOW(), '假期留宿中'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `sys_dict_data`
WHERE `dict_type` = 'xg_dorm_roll_call_status' AND `dict_value` = '4'
);
-- 4. 明细状态注释同步(可选,不影响运行)
-- ALTER TABLE `xg_dorm_roll_call_detail`
-- MODIFY COLUMN `roll_call_status` char(1) NOT NULL DEFAULT '0'
-- COMMENT '点名状态(0在寝 1请假 2不在 3空床位 4假期留宿)';
@@ -0,0 +1,83 @@
-- =============================================================================
-- 修复:请假/销假业务状态与流程实例不同步(含打回后重提残留 back/draft)
-- 日期:2026-10-20
-- 现象:流程已 waiting、业务表仍为 draft/back,办理页无「审批」按钮
-- 范围:xg_student_leave.approval_status、xg_student_cancel_leave.cancel_status
-- 及请假表上同步的 cancel_status
-- =============================================================================
-- 执行顺序:先 SELECT 核对 → 再 UPDATE
-- =============================================================================
-- -----------------------------------------------------------------------------
-- 一、请假:实例 waiting,业务非 waiting(draft/back 等)
-- -----------------------------------------------------------------------------
SELECT
l.id,
l.student_name,
l.approval_status AS leave_approval_status,
i.id AS instance_id,
i.flow_status,
i.node_name,
l.update_time
FROM xg_student_leave l
INNER JOIN flow_instance i
ON i.business_id = CAST(l.id AS CHAR)
AND i.del_flag = '0'
WHERE l.deleted = 0
AND i.flow_status = 'waiting'
AND IFNULL(l.approval_status, '') <> 'waiting'
ORDER BY l.update_time DESC;
UPDATE xg_student_leave l
INNER JOIN flow_instance i
ON i.business_id = CAST(l.id AS CHAR)
AND i.del_flag = '0'
SET l.approval_status = 'waiting',
l.update_time = NOW()
WHERE l.deleted = 0
AND i.flow_status = 'waiting'
AND IFNULL(l.approval_status, '') <> 'waiting';
-- -----------------------------------------------------------------------------
-- 二、销假:实例 waiting,销假表状态非 waiting
-- -----------------------------------------------------------------------------
SELECT
c.id AS cancel_leave_id,
c.leave_id,
c.cancel_status AS cancel_leave_status,
i.id AS instance_id,
i.flow_status,
i.node_name,
c.update_time
FROM xg_student_cancel_leave c
INNER JOIN flow_instance i
ON i.business_id = CAST(c.id AS CHAR)
AND i.del_flag = '0'
WHERE c.deleted = 0
AND i.flow_status = 'waiting'
AND IFNULL(c.cancel_status, '') <> 'waiting'
ORDER BY c.update_time DESC;
UPDATE xg_student_cancel_leave c
INNER JOIN flow_instance i
ON i.business_id = CAST(c.id AS CHAR)
AND i.del_flag = '0'
SET c.cancel_status = 'waiting',
c.update_time = NOW()
WHERE c.deleted = 0
AND i.flow_status = 'waiting'
AND IFNULL(c.cancel_status, '') <> 'waiting';
-- 同步请假表上的销假状态
UPDATE xg_student_leave l
INNER JOIN xg_student_cancel_leave c
ON c.leave_id = l.id
AND c.deleted = 0
INNER JOIN flow_instance i
ON i.business_id = CAST(c.id AS CHAR)
AND i.del_flag = '0'
SET l.cancel_status = 'waiting',
l.update_time = NOW()
WHERE l.deleted = 0
AND i.flow_status = 'waiting'
AND IFNULL(l.cancel_status, '') <> 'waiting';