Files
hzdyjs/docs/设计文档/database/学工管理-学生信息管理/06-data-migration-phase1.sql
T
2025-07-19 10:18:27 +08:00

336 lines
9.2 KiB
SQL

-- 第一阶段:数据迁移脚本
-- 说明:将现有学生信息数据迁移到新的批次管理结构中
-- 执行时间:2025-01-13
-- ===========================================
-- 1. 检查现有数据表结构
-- ===========================================
-- 检查学生信息表是否存在
SELECT '🔍 检查学生信息表结构' as 'Step';
SHOW CREATE TABLE xg_stu_msg;
-- 检查现有数据量
SELECT
'📊 现有数据统计' as 'Info',
COUNT(*) as '学生信息总数'
FROM xg_stu_msg
WHERE deleted = 0;
-- ===========================================
-- 2. 创建默认批次(如果不存在)
-- ===========================================
-- 创建默认的信息采集批次
INSERT INTO xg_collection_batch (
batch_id,
batch_code,
batch_name,
batch_type,
academic_year,
semester,
description,
start_time,
end_time,
batch_status,
publish_status,
create_by,
create_time,
update_by,
update_time,
tenant_id,
deleted
) VALUES (
1,
'DEFAULT_2024_2025',
'2024-2025学年默认批次',
'ANNUAL',
'2024-2025',
'FULL_YEAR',
'系统自动创建的默认批次,用于迁移现有学生信息数据',
'2024-09-01 00:00:00',
'2025-08-31 23:59:59',
'ACTIVE',
'PUBLISHED',
1,
NOW(),
1,
NOW(),
'000000',
0
) ON DUPLICATE KEY UPDATE
batch_name = VALUES(batch_name),
description = VALUES(description),
update_time = NOW();
-- ===========================================
-- 3. 数据迁移前的备份
-- ===========================================
-- 创建学生信息备份表
SELECT '💾 创建数据备份' as 'Step';
CREATE TABLE IF NOT EXISTS xg_stu_msg_backup_20250113 AS
SELECT * FROM xg_stu_msg WHERE deleted = 0;
-- 记录备份信息
SELECT
'✅ 备份完成' as 'Status',
COUNT(*) as '备份记录数'
FROM xg_stu_msg_backup_20250113;
-- ===========================================
-- 4. 学生信息表字段迁移
-- ===========================================
-- 为现有学生信息添加批次相关字段(如果不存在)
ALTER TABLE xg_stu_msg
ADD COLUMN IF NOT EXISTS batch_id BIGINT(20) COMMENT '所属批次ID',
ADD COLUMN IF NOT EXISTS submission_status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '提交状态:DRAFT-草稿,SUBMITTED-已提交,APPROVED-已审核,REJECTED-已拒绝',
ADD COLUMN IF NOT EXISTS submission_time DATETIME COMMENT '提交时间',
ADD COLUMN IF NOT EXISTS approval_time DATETIME COMMENT '审核时间',
ADD COLUMN IF NOT EXISTS approval_by BIGINT(20) COMMENT '审核人ID',
ADD COLUMN IF NOT EXISTS approval_comments TEXT COMMENT '审核意见',
ADD COLUMN IF NOT EXISTS last_edit_time DATETIME COMMENT '最后编辑时间';
-- 添加索引
ALTER TABLE xg_stu_msg
ADD INDEX IF NOT EXISTS idx_batch_id (batch_id),
ADD INDEX IF NOT EXISTS idx_submission_status (submission_status),
ADD INDEX IF NOT EXISTS idx_submission_time (submission_time);
-- ===========================================
-- 5. 数据迁移执行
-- ===========================================
-- 将现有学生信息关联到默认批次
UPDATE xg_stu_msg
SET
batch_id = 1,
submission_status = 'APPROVED',
submission_time = create_time,
approval_time = create_time,
approval_by = create_by,
approval_comments = '系统迁移:原有数据自动审核通过',
last_edit_time = update_time
WHERE deleted = 0
AND batch_id IS NULL;
-- ===========================================
-- 6. 创建批次学生关联关系
-- ===========================================
-- 插入批次学生关联数据
INSERT INTO xg_batch_student_relation (
relation_id,
batch_id,
student_id,
student_number,
submission_status,
submission_time,
approval_status,
approval_time,
approval_by,
approval_comments,
create_by,
create_time,
update_by,
update_time,
tenant_id,
deleted
)
SELECT
msg.id * 10000 + 1 as relation_id, -- 生成唯一ID
1 as batch_id, -- 默认批次ID
msg.id as student_id, -- 学生信息ID
msg.student_number as student_number,
'SUBMITTED' as submission_status,
msg.create_time as submission_time,
'APPROVED' as approval_status,
msg.create_time as approval_time,
msg.create_by as approval_by,
'系统迁移:原有数据自动审核通过' as approval_comments,
msg.create_by as create_by,
msg.create_time as create_time,
msg.update_by as update_by,
msg.update_time as update_time,
msg.tenant_id as tenant_id,
0 as deleted
FROM xg_stu_msg msg
WHERE msg.deleted = 0
AND msg.batch_id = 1
AND NOT EXISTS (
SELECT 1 FROM xg_batch_student_relation r
WHERE r.batch_id = 1 AND r.student_id = msg.id AND r.deleted = 0
);
-- ===========================================
-- 7. 创建批次操作日志
-- ===========================================
-- 记录批次操作日志
INSERT INTO xg_batch_operation_log (
log_id,
batch_id,
operation_type,
operation_description,
operator_id,
operator_name,
operation_time,
operation_result,
operation_details,
create_by,
create_time,
tenant_id,
deleted
) VALUES (
1,
1,
'DATA_MIGRATION',
'系统数据迁移:将现有学生信息迁移到批次管理结构',
1,
'System',
NOW(),
'SUCCESS',
CONCAT('迁移完成,共处理 ', (SELECT COUNT(*) FROM xg_stu_msg WHERE deleted = 0 AND batch_id = 1), ' 条学生信息记录'),
1,
NOW(),
'000000',
0
);
-- ===========================================
-- 8. 数据完整性验证
-- ===========================================
-- 验证迁移结果
SELECT '📋 数据迁移验证' as 'Verification';
-- 检查学生信息表数据
SELECT
'学生信息表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN batch_id IS NOT NULL THEN 1 END) as '已关联批次数',
COUNT(CASE WHEN submission_status = 'APPROVED' THEN 1 END) as '已审核数'
FROM xg_stu_msg
WHERE deleted = 0;
-- 检查批次学生关联表数据
SELECT
'批次学生关联表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN approval_status = 'APPROVED' THEN 1 END) as '已审核数'
FROM xg_batch_student_relation
WHERE deleted = 0;
-- 检查批次表数据
SELECT
'信息采集批次表' as '表名',
COUNT(*) as '总记录数',
COUNT(CASE WHEN batch_status = 'ACTIVE' THEN 1 END) as '活跃批次数'
FROM xg_collection_batch
WHERE deleted = 0;
-- 检查操作日志
SELECT
'批次操作日志表' as '表名',
COUNT(*) as '总记录数'
FROM xg_batch_operation_log
WHERE deleted = 0;
-- ===========================================
-- 9. 数据一致性检查
-- ===========================================
-- 检查数据一致性
SELECT '🔍 数据一致性检查' as 'Consistency Check';
-- 检查是否有学生信息未关联到批次
SELECT
'未关联批次的学生信息' as '检查项',
COUNT(*) as '记录数'
FROM xg_stu_msg
WHERE deleted = 0 AND batch_id IS NULL;
-- 检查是否有批次学生关联记录缺失对应的学生信息
SELECT
'孤立的批次学生关联记录' as '检查项',
COUNT(*) as '记录数'
FROM xg_batch_student_relation r
WHERE r.deleted = 0
AND NOT EXISTS (
SELECT 1 FROM xg_stu_msg s
WHERE s.id = r.student_id AND s.deleted = 0
);
-- 检查学号是否一致
SELECT
'学号不一致的记录' as '检查项',
COUNT(*) as '记录数'
FROM xg_batch_student_relation r
JOIN xg_stu_msg s ON r.student_id = s.id
WHERE r.deleted = 0
AND s.deleted = 0
AND r.student_number != s.student_number;
-- ===========================================
-- 10. 迁移完成报告
-- ===========================================
SELECT '✅ 第一阶段数据迁移完成' as 'Migration Status';
-- 生成迁移报告
SELECT
'📊 迁移统计报告' as 'Report',
(SELECT COUNT(*) FROM xg_stu_msg WHERE deleted = 0) as '学生信息总数',
(SELECT COUNT(*) FROM xg_batch_student_relation WHERE deleted = 0) as '批次关联总数',
(SELECT COUNT(*) FROM xg_collection_batch WHERE deleted = 0) as '批次总数',
(SELECT COUNT(*) FROM xg_batch_operation_log WHERE deleted = 0) as '操作日志总数',
NOW() as '迁移完成时间';
-- 记录迁移完成日志
INSERT INTO xg_batch_operation_log (
log_id,
batch_id,
operation_type,
operation_description,
operator_id,
operator_name,
operation_time,
operation_result,
operation_details,
create_by,
create_time,
tenant_id,
deleted
) VALUES (
2,
1,
'MIGRATION_COMPLETE',
'第一阶段数据迁移完成',
1,
'System',
NOW(),
'SUCCESS',
'数据迁移成功完成,所有现有学生信息已迁移到批次管理结构',
1,
NOW(),
'000000',
0
);
-- ===========================================
-- 11. 后续清理建议
-- ===========================================
-- 以下语句仅作为参考,请在确认迁移成功后手动执行
-- 清理备份表(30天后执行)
-- DROP TABLE IF EXISTS xg_stu_msg_backup_20250113;
-- 优化表结构
-- OPTIMIZE TABLE xg_stu_msg;
-- OPTIMIZE TABLE xg_batch_student_relation;
-- OPTIMIZE TABLE xg_collection_batch;
-- OPTIMIZE TABLE xg_batch_operation_log;
SELECT '🎉 数据迁移脚本执行完成!' as 'Final Status';