Files
hzdyjs/docs/设计文档/database/学工管理-学生信息管理/xg-collection-batch-redesign.sql
T
2025-07-19 10:18:27 +08:00

412 lines
18 KiB
SQL

-- 学生信息采集批次功能重新设计 - 数据库脚本
-- 创建时间: 2025-01-13
-- 说明: 将信息采集批次功能集成到学生信息管理中,支持按条件创建批次
-- 1. 修改现有批次表结构,增加目标条件字段
ALTER TABLE xg_collection_batch
ADD COLUMN target_grade VARCHAR(50) COMMENT '目标届别(如:2021,2022,2023)',
ADD COLUMN target_college_ids TEXT COMMENT '目标学院ID列表(JSON格式)',
ADD COLUMN target_major_ids TEXT COMMENT '目标专业ID列表(JSON格式)',
ADD COLUMN target_class_ids TEXT COMMENT '目标班级ID列表(JSON格式)',
ADD COLUMN remind_before_start INT DEFAULT 24 COMMENT '开始前提醒时间(小时)',
ADD COLUMN remind_before_end INT DEFAULT 24 COMMENT '结束前提醒时间(小时)',
ADD COLUMN auto_close TINYINT DEFAULT 1 COMMENT '是否自动关闭',
ADD COLUMN notification_sent TINYINT DEFAULT 0 COMMENT '是否已发送通知',
ADD COLUMN created_by_module VARCHAR(50) DEFAULT 'student_info' COMMENT '创建模块';
-- 2. 创建批次学生关联表(用于快速查询和统计)
CREATE TABLE xg_collection_batch_student (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id BIGINT NOT NULL COMMENT '批次ID',
student_id BIGINT NOT NULL COMMENT '学生ID',
student_code VARCHAR(50) NOT NULL COMMENT '学号',
student_name VARCHAR(100) NOT NULL COMMENT '学生姓名',
college_id BIGINT COMMENT '学院ID',
college_name VARCHAR(100) COMMENT '学院名称',
major_id BIGINT COMMENT '专业ID',
major_name VARCHAR(100) COMMENT '专业名称',
class_id BIGINT COMMENT '班级ID',
class_name VARCHAR(100) COMMENT '班级名称',
grade VARCHAR(50) COMMENT '届别',
can_edit TINYINT DEFAULT 1 COMMENT '是否可编辑',
has_submitted TINYINT DEFAULT 0 COMMENT '是否已提交',
submit_time DATETIME COMMENT '提交时间',
last_edit_time DATETIME COMMENT '最后编辑时间',
edit_count INT DEFAULT 0 COMMENT '编辑次数',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_by BIGINT COMMENT '创建者',
update_by BIGINT COMMENT '更新者',
deleted TINYINT DEFAULT 0 COMMENT '删除标志',
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
INDEX idx_batch_id (batch_id),
INDEX idx_student_id (student_id),
INDEX idx_batch_student (batch_id, student_id),
INDEX idx_college_id (college_id),
INDEX idx_grade (grade),
INDEX idx_create_time (create_time),
FOREIGN KEY (batch_id) REFERENCES xg_collection_batch(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息采集批次学生关联表';
-- 3. 创建批次操作日志表
CREATE TABLE xg_collection_batch_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id BIGINT NOT NULL COMMENT '批次ID',
student_id BIGINT COMMENT '学生ID',
operation_type VARCHAR(50) NOT NULL COMMENT '操作类型(CREATE,UPDATE,SUBMIT,ADMIN_MODIFY,BATCH_PUBLISH,BATCH_CLOSE)',
operation_desc TEXT COMMENT '操作描述',
old_data TEXT COMMENT '修改前数据(JSON格式)',
new_data TEXT COMMENT '修改后数据(JSON格式)',
operator_id BIGINT COMMENT '操作人ID',
operator_name VARCHAR(100) COMMENT '操作人姓名',
operator_type VARCHAR(50) COMMENT '操作人类型(STUDENT,ADMIN,SYSTEM)',
ip_address VARCHAR(50) COMMENT 'IP地址',
user_agent TEXT COMMENT '用户代理',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
INDEX idx_batch_id (batch_id),
INDEX idx_student_id (student_id),
INDEX idx_operation_type (operation_type),
INDEX idx_create_time (create_time),
INDEX idx_operator_id (operator_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息采集批次操作日志表';
-- 4. 创建批次权限配置表
CREATE TABLE xg_collection_batch_permission (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id BIGINT NOT NULL COMMENT '批次ID',
permission_type VARCHAR(50) NOT NULL COMMENT '权限类型(EDIT,VIEW,SUBMIT,ADMIN)',
role_id BIGINT COMMENT '角色ID',
user_id BIGINT COMMENT '用户ID',
college_id BIGINT COMMENT '学院ID',
is_granted TINYINT DEFAULT 1 COMMENT '是否授权',
grant_time DATETIME COMMENT '授权时间',
expire_time DATETIME COMMENT '过期时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_by BIGINT COMMENT '创建者',
update_by BIGINT COMMENT '更新者',
deleted TINYINT DEFAULT 0 COMMENT '删除标志',
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
INDEX idx_batch_id (batch_id),
INDEX idx_permission_type (permission_type),
INDEX idx_role_id (role_id),
INDEX idx_user_id (user_id),
INDEX idx_college_id (college_id),
FOREIGN KEY (batch_id) REFERENCES xg_collection_batch(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息采集批次权限配置表';
-- 5. 创建批次统计表
CREATE TABLE xg_collection_batch_statistics (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id BIGINT NOT NULL COMMENT '批次ID',
total_students INT DEFAULT 0 COMMENT '总学生数',
submitted_students INT DEFAULT 0 COMMENT '已提交学生数',
pending_students INT DEFAULT 0 COMMENT '待提交学生数',
completion_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '完成率',
college_id BIGINT COMMENT '学院ID(按学院统计时使用)',
college_name VARCHAR(100) COMMENT '学院名称',
major_id BIGINT COMMENT '专业ID(按专业统计时使用)',
major_name VARCHAR(100) COMMENT '专业名称',
class_id BIGINT COMMENT '班级ID(按班级统计时使用)',
class_name VARCHAR(100) COMMENT '班级名称',
grade VARCHAR(50) COMMENT '届别',
statistics_type VARCHAR(50) DEFAULT 'TOTAL' COMMENT '统计类型(TOTAL,COLLEGE,MAJOR,CLASS,GRADE)',
last_updated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
INDEX idx_batch_id (batch_id),
INDEX idx_college_id (college_id),
INDEX idx_major_id (major_id),
INDEX idx_class_id (class_id),
INDEX idx_grade (grade),
INDEX idx_statistics_type (statistics_type),
FOREIGN KEY (batch_id) REFERENCES xg_collection_batch(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息采集批次统计表';
-- 6. 修改学生信息表,添加批次相关字段
ALTER TABLE xg_student_info
ADD COLUMN last_batch_id BIGINT COMMENT '最后参与的批次ID',
ADD COLUMN last_edit_batch_id BIGINT COMMENT '最后编辑的批次ID',
ADD COLUMN info_lock_status TINYINT DEFAULT 0 COMMENT '信息锁定状态(0:正常,1:锁定)',
ADD COLUMN lock_reason VARCHAR(500) COMMENT '锁定原因',
ADD COLUMN last_batch_submit_time DATETIME COMMENT '最后批次提交时间';
-- 7. 创建视图:当前活跃批次
CREATE VIEW v_current_active_batch AS
SELECT
b.*,
COUNT(bs.id) as total_students,
SUM(CASE WHEN bs.has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
ROUND(SUM(CASE WHEN bs.has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(bs.id), 2) as completion_rate
FROM xg_collection_batch b
LEFT JOIN xg_collection_batch_student bs ON b.id = bs.batch_id AND bs.deleted = 0
WHERE b.deleted = 0
AND b.status = 'active'
AND b.is_published = 1
AND NOW() BETWEEN b.start_time AND b.end_time
GROUP BY b.id;
-- 8. 创建视图:学生批次权限
CREATE VIEW v_student_batch_permission AS
SELECT
bs.student_id,
bs.student_code,
bs.student_name,
b.id as batch_id,
b.batch_name,
b.batch_code,
b.start_time,
b.end_time,
b.status as batch_status,
bs.can_edit,
bs.has_submitted,
bs.submit_time,
CASE
WHEN b.status != 'active' THEN 0
WHEN b.is_published != 1 THEN 0
WHEN NOW() < b.start_time THEN 0
WHEN NOW() > b.end_time THEN 0
WHEN bs.can_edit != 1 THEN 0
WHEN bs.has_submitted = 1 THEN 0
ELSE 1
END as can_edit_now
FROM xg_collection_batch_student bs
JOIN xg_collection_batch b ON bs.batch_id = b.id
WHERE bs.deleted = 0 AND b.deleted = 0;
-- 9. 创建存储过程:批量生成批次学生关联
DELIMITER //
CREATE PROCEDURE sp_generate_batch_students(
IN p_batch_id BIGINT,
IN p_target_grade VARCHAR(50),
IN p_target_college_ids TEXT,
IN p_target_major_ids TEXT,
IN p_target_class_ids TEXT,
IN p_creator_id BIGINT
)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_student_id BIGINT;
DECLARE v_student_code VARCHAR(50);
DECLARE v_student_name VARCHAR(100);
DECLARE v_college_id BIGINT;
DECLARE v_college_name VARCHAR(100);
DECLARE v_major_id BIGINT;
DECLARE v_major_name VARCHAR(100);
DECLARE v_class_id BIGINT;
DECLARE v_class_name VARCHAR(100);
DECLARE v_grade VARCHAR(50);
-- 声明游标
DECLARE student_cursor CURSOR FOR
SELECT
s.id, s.student_code, s.student_name,
s.college_id, c.college_name,
s.major_id, m.major_name,
s.class_id, cl.class_name,
s.grade
FROM xg_student_info s
LEFT JOIN xg_college c ON s.college_id = c.id
LEFT JOIN xg_major m ON s.major_id = m.id
LEFT JOIN xg_class_info cl ON s.class_id = cl.id
WHERE s.deleted = 0
AND (p_target_grade IS NULL OR s.grade = p_target_grade)
AND (p_target_college_ids IS NULL OR FIND_IN_SET(s.college_id, p_target_college_ids))
AND (p_target_major_ids IS NULL OR FIND_IN_SET(s.major_id, p_target_major_ids))
AND (p_target_class_ids IS NULL OR FIND_IN_SET(s.class_id, p_target_class_ids));
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 清空该批次的现有学生关联
DELETE FROM xg_collection_batch_student WHERE batch_id = p_batch_id;
-- 打开游标
OPEN student_cursor;
read_loop: LOOP
FETCH student_cursor INTO v_student_id, v_student_code, v_student_name,
v_college_id, v_college_name, v_major_id, v_major_name,
v_class_id, v_class_name, v_grade;
IF done THEN
LEAVE read_loop;
END IF;
-- 插入批次学生关联
INSERT INTO xg_collection_batch_student (
batch_id, student_id, student_code, student_name,
college_id, college_name, major_id, major_name,
class_id, class_name, grade, can_edit, has_submitted,
create_by, tenant_id
) VALUES (
p_batch_id, v_student_id, v_student_code, v_student_name,
v_college_id, v_college_name, v_major_id, v_major_name,
v_class_id, v_class_name, v_grade, 1, 0,
p_creator_id, 0
);
END LOOP;
CLOSE student_cursor;
-- 更新批次统计
CALL sp_update_batch_statistics(p_batch_id);
END //
DELIMITER ;
-- 10. 创建存储过程:更新批次统计
DELIMITER //
CREATE PROCEDURE sp_update_batch_statistics(IN p_batch_id BIGINT)
BEGIN
-- 删除现有统计
DELETE FROM xg_collection_batch_statistics WHERE batch_id = p_batch_id;
-- 插入总体统计
INSERT INTO xg_collection_batch_statistics (
batch_id, total_students, submitted_students, pending_students,
completion_rate, statistics_type
)
SELECT
p_batch_id,
COUNT(*) as total_students,
SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
SUM(CASE WHEN has_submitted = 0 THEN 1 ELSE 0 END) as pending_students,
ROUND(SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as completion_rate,
'TOTAL' as statistics_type
FROM xg_collection_batch_student
WHERE batch_id = p_batch_id AND deleted = 0;
-- 插入按学院统计
INSERT INTO xg_collection_batch_statistics (
batch_id, total_students, submitted_students, pending_students,
completion_rate, college_id, college_name, statistics_type
)
SELECT
p_batch_id,
COUNT(*) as total_students,
SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
SUM(CASE WHEN has_submitted = 0 THEN 1 ELSE 0 END) as pending_students,
ROUND(SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as completion_rate,
college_id,
college_name,
'COLLEGE' as statistics_type
FROM xg_collection_batch_student
WHERE batch_id = p_batch_id AND deleted = 0 AND college_id IS NOT NULL
GROUP BY college_id, college_name;
-- 插入按专业统计
INSERT INTO xg_collection_batch_statistics (
batch_id, total_students, submitted_students, pending_students,
completion_rate, college_id, college_name, major_id, major_name, statistics_type
)
SELECT
p_batch_id,
COUNT(*) as total_students,
SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
SUM(CASE WHEN has_submitted = 0 THEN 1 ELSE 0 END) as pending_students,
ROUND(SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as completion_rate,
college_id,
college_name,
major_id,
major_name,
'MAJOR' as statistics_type
FROM xg_collection_batch_student
WHERE batch_id = p_batch_id AND deleted = 0 AND major_id IS NOT NULL
GROUP BY college_id, college_name, major_id, major_name;
-- 插入按班级统计
INSERT INTO xg_collection_batch_statistics (
batch_id, total_students, submitted_students, pending_students,
completion_rate, college_id, college_name, major_id, major_name,
class_id, class_name, statistics_type
)
SELECT
p_batch_id,
COUNT(*) as total_students,
SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
SUM(CASE WHEN has_submitted = 0 THEN 1 ELSE 0 END) as pending_students,
ROUND(SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as completion_rate,
college_id,
college_name,
major_id,
major_name,
class_id,
class_name,
'CLASS' as statistics_type
FROM xg_collection_batch_student
WHERE batch_id = p_batch_id AND deleted = 0 AND class_id IS NOT NULL
GROUP BY college_id, college_name, major_id, major_name, class_id, class_name;
-- 插入按届别统计
INSERT INTO xg_collection_batch_statistics (
batch_id, total_students, submitted_students, pending_students,
completion_rate, grade, statistics_type
)
SELECT
p_batch_id,
COUNT(*) as total_students,
SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) as submitted_students,
SUM(CASE WHEN has_submitted = 0 THEN 1 ELSE 0 END) as pending_students,
ROUND(SUM(CASE WHEN has_submitted = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as completion_rate,
grade,
'GRADE' as statistics_type
FROM xg_collection_batch_student
WHERE batch_id = p_batch_id AND deleted = 0 AND grade IS NOT NULL
GROUP BY grade;
END //
DELIMITER ;
-- 11. 创建触发器:学生提交时自动更新统计
DELIMITER //
CREATE TRIGGER tr_batch_student_submit_update
AFTER UPDATE ON xg_collection_batch_student
FOR EACH ROW
BEGIN
IF OLD.has_submitted != NEW.has_submitted THEN
CALL sp_update_batch_statistics(NEW.batch_id);
END IF;
END //
DELIMITER ;
-- 12. 创建索引优化查询性能
CREATE INDEX idx_xg_student_info_batch ON xg_student_info(last_batch_id, last_edit_batch_id);
CREATE INDEX idx_xg_student_info_grade_college ON xg_student_info(grade, college_id);
CREATE INDEX idx_xg_student_info_major_class ON xg_student_info(major_id, class_id);
-- 13. 插入系统配置数据
INSERT INTO sys_config (config_name, config_key, config_value, config_type, remark, create_by, create_time) VALUES
('学生信息采集批次默认提醒时间', 'student.batch.default.remind.hours', '24', 'Y', '创建批次时的默认提醒时间(小时)', 1, NOW()),
('学生信息采集批次自动关闭', 'student.batch.auto.close', 'true', 'Y', '批次是否自动关闭', 1, NOW()),
('学生信息采集批次最大编辑次数', 'student.batch.max.edit.count', '10', 'Y', '学生在批次期间最大编辑次数', 1, NOW()),
('学生信息采集批次通知开关', 'student.batch.notification.enabled', 'true', 'Y', '是否启用批次通知', 1, NOW());
-- 14. 创建定时任务相关表(如果需要)
-- 用于自动关闭过期批次、发送提醒通知等
CREATE TABLE xg_batch_scheduled_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
batch_id BIGINT NOT NULL COMMENT '批次ID',
task_type VARCHAR(50) NOT NULL COMMENT '任务类型(REMIND_START,REMIND_END,AUTO_CLOSE)',
task_time DATETIME NOT NULL COMMENT '执行时间',
task_status VARCHAR(20) DEFAULT 'PENDING' COMMENT '任务状态(PENDING,EXECUTED,FAILED)',
execute_time DATETIME COMMENT '实际执行时间',
error_message TEXT COMMENT '错误信息',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_batch_id (batch_id),
INDEX idx_task_type (task_type),
INDEX idx_task_time (task_time),
INDEX idx_task_status (task_status),
FOREIGN KEY (batch_id) REFERENCES xg_collection_batch(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='信息采集批次定时任务表';
-- 15. 数据迁移脚本(如果有现有数据)
-- 将现有的独立批次数据迁移到新的学生信息管理集成结构中
UPDATE xg_collection_batch SET created_by_module = 'student_info' WHERE created_by_module IS NULL;
-- 16. 创建权限数据
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES
('学生信息采集批次', (SELECT menu_id FROM sys_menu WHERE menu_name = '学生信息管理' LIMIT 1), 2, '', '', 1, 0, 'F', '1', '1', 'xg:studentInfo:batchManage', '', 1, NOW(), '学生信息采集批次管理权限');
-- 脚本执行完成
SELECT 'Database redesign completed successfully!' as message;