# 📚 用户导入和课程分配操作指南 > 最后更新:2025-12-11 > 目的:确保用户导入和课程分配数据一致性 --- ## 📋 目录 1. [导入前准备](#导入前准备) 2. [执行导入](#执行导入) 3. [导入后验证](#导入后验证) 4. [常见问题](#常见问题) 5. [数据修复](#数据修复) --- ## 🔧 导入前准备 ### 第一步:数据备份(必须!) ```bash # 运行备份脚本 双击运行:导入前数据备份.bat ``` **备份内容:** - `sys_user` - 用户表 - `student_class` - 班级关联表 - `class` - 班级表 **备份位置:** `log\backup\backup_YYYYMMDD_HHMMSS\` --- ### 第二步:检查当前数据状态 ```bash # 运行检查脚本 双击运行:检查班级数据一致性.bat ``` **检查项目:** 1. ✅ 各班级学生数量(有效 vs 总数) 2. ✅ 存在问题的班级 3. ✅ 学生重复分配情况 4. ✅ 孤儿记录(已删除学生的分配记录) **如果检查发现问题:** ```bash # 先修复现有数据 双击运行:修复所有班级status问题.bat ``` --- ### 第三步:准备导入文件 **Excel格式要求:** | 信息编号 | 罪犯姓名 | 监狱 | 监区 | 性别 | 民族 | 文化程度 | 罪名 | 刑期 | 刑期起日 | 刑期止日 | 入监日期 | 班级名称 | 学员状态 | |---------|---------|-----|------|------|------|---------|------|------|---------|---------|---------|---------|---------| | 101 | 张三 | 某监狱 | 一监区 | 男 | 汉族 | 初中 | 盗窃 | 3年 | 2023-01-01 | 2026-01-01 | 2023-01-01 | 攻坚转换班2班 | 在押 | **⚠️ 重要字段说明:** 1. **信息编号**:必填,纯数字,作为用户ID 2. **罪犯姓名**:必填 3. **监区**:必填 4. **班级名称**: - 可选 - 如果填写,必须是系统中已存在的班级名称 - 如果班级不存在,导入会失败 5. **学员状态**:可选,默认为"在押" **班级名称验证:** ```sql -- 查询所有可用班级 SELECT id, class_name, prison_area FROM class ORDER BY class_name; ``` --- ## 📥 执行导入 ### 方式1:后台管理系统导入(推荐) 1. 登录后台管理系统 2. 进入 **学生管理** 页面 3. 点击 **导入** 按钮 4. 选择Excel文件 5. 选择导入模式: - **不更新**:只导入新用户,跳过已存在的 - **覆盖更新**:更新已存在的用户信息 **导入逻辑:** - 根据 `信息编号` 判断用户是否存在 - 新用户:创建用户 → 分配角色 → 分配班级(status=1)✅ - 已存在用户(更新模式): - 更新用户信息 - 移除旧班级(status=0) - 分配新班级(status=1)✅ **异步处理:** - 大批量导入(>100条)会异步处理 - 可在页面查看实时进度 - 支持中途取消 --- ### 方式2:数据库直接导入 ⚠️ **不推荐**,仅用于紧急情况或批量修复。 ```sql -- 1. 导入用户数据 LOAD DATA INFILE 'path/to/users.csv' INTO TABLE sys_user FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 2. 批量分配班级(status必须设为1) INSERT INTO student_class (student_id, class_id, status, join_time) SELECT u.user_id, 9, 1, NOW() FROM sys_user u WHERE u.prison_area = '一监区' AND u.del_flag = '0' AND NOT EXISTS ( SELECT 1 FROM student_class sc WHERE sc.student_id = u.user_id AND sc.status = 1 ); ``` --- ## ✅ 导入后验证 ### 第一步:检查导入结果 **后台管理系统:** 1. 查看导入任务结果 2. 记录成功数、更新数、失败数 **命令行检查:** ```bash # 运行检查脚本 双击运行:检查班级数据一致性.bat ``` --- ### 第二步:验证关键数据 ```bash # 运行统计脚本 双击运行:统计课程分配情况.bat ``` **验证要点:** 1. ✅ 各班级学生数是否正确 2. ✅ 学生管理显示人数 = 课程分配显示人数 3. ✅ 监区筛选结果准确 4. ✅ 没有学生同时在多个有效班级(status=1) --- ### 第三步:前端界面验证 **学生管理页面:** ``` 筛选条件:一监区 + 攻坚转换班2班 预期结果:显示所有该班级的学生(12人或14人等) ``` **课程分配页面:** ``` 选择课程 → 选择监区:一监区 → 选择班级:攻坚转换班2班 预期结果:显示的学生数与学生管理页面一致 ``` **⚠️ 如果不一致:** ```bash # 运行修复脚本 双击运行:修复所有班级status问题.bat ``` --- ## ❓ 常见问题 ### Q1: 导入后人数不一致怎么办? **症状:** - 学生管理筛选:12人 - 课程分配显示:14人 **原因:** - 存在 `status=0` 的无效分配记录 - 学生管理只统计 `status=1` - 课程分配可能统计了所有记录 **解决:** ```bash 双击运行:修复所有班级status问题.bat ``` --- ### Q2: 导入时提示"班级不存在"? **原因:** - Excel中的班级名称在系统中不存在 - 班级名称拼写错误 **解决:** 1. 检查班级是否存在: ```sql SELECT id, class_name FROM class WHERE class_name LIKE '%攻坚%'; ``` 2. 修正Excel中的班级名称,或先创建班级 --- ### Q3: 学生同时在多个班级? **原因:** - 历史遗留数据 - 多次导入未正确处理旧班级 **解决:** ```sql -- 查询有多个有效班级的学生 SELECT u.user_id, u.nick_name, GROUP_CONCAT(c.class_name) AS classes FROM sys_user u INNER JOIN student_class sc ON u.user_id = sc.student_id INNER JOIN class c ON sc.class_id = c.id WHERE sc.status = 1 AND u.del_flag = '0' GROUP BY u.user_id, u.nick_name HAVING COUNT(*) > 1; -- 手动调整:保留最新的,移除旧的 UPDATE student_class SET status = 0 WHERE id = XXX; -- 旧记录的ID ``` --- ### Q4: 导入后课程分配页面看不到学生? **可能原因:** 1. 班级筛选条件不对 2. 学生的 `status` 字段不是 `0`(正常) 3. 学生的 `del_flag` 是 `2`(已删除) **检查:** ```sql SELECT u.user_id, u.nick_name, u.status AS 账号状态, u.del_flag AS 删除标志, sc.status AS 班级状态 FROM sys_user u LEFT JOIN student_class sc ON u.user_id = sc.student_id WHERE u.user_id = XXX; -- 具体学生ID ``` --- ## 🔧 数据修复 ### 修复所有status问题(推荐) ```bash 双击运行:修复所有班级status问题.bat ``` **修复内容:** - 将所有正常学员的班级分配改为有效(status=1) - 不影响已删除学员的记录 --- ### 手动修复特定班级 ```sql -- 修复"攻坚转换班2班" UPDATE student_class sc INNER JOIN sys_user u ON sc.student_id = u.user_id SET sc.status = 1 WHERE sc.class_id = 9 -- 班级ID AND u.del_flag = '0' AND sc.status = 0; ``` --- ### 清理孤儿记录 ```sql -- 删除已删除学员的分配记录 DELETE sc FROM student_class sc LEFT JOIN sys_user u ON sc.student_id = u.user_id WHERE u.user_id IS NULL OR u.del_flag = '2'; ``` --- ## 📊 监控和维护 ### 定期检查(建议每周一次) ```bash # 1. 数据一致性检查 双击运行:检查班级数据一致性.bat # 2. 课程分配统计 双击运行:统计课程分配情况.bat ``` ### 数据库视图(高级) ```bash # 创建辅助视图 mysql -u root -proot study < 创建辅助视图.sql # 使用视图快速查询 USE study; SELECT * FROM v_student_current_class; -- 学生当前班级 SELECT * FROM v_class_statistics; -- 班级统计 SELECT * FROM v_prison_area_statistics; -- 监区统计 ``` --- ## 🎯 最佳实践 ### ✅ 导入前必做: 1. 备份数据(`导入前数据备份.bat`) 2. 检查数据状态(`检查班级数据一致性.bat`) 3. 验证Excel格式和班级名称 ### ✅ 导入后必做: 1. 检查导入结果(成功数/失败数) 2. 运行数据一致性检查 3. 前端界面验证 ### ✅ 遇到问题时: 1. 先运行 `检查班级数据一致性.bat` 定位问题 2. 运行 `修复所有班级status问题.bat` 修复 3. 如果问题仍存在,查看日志或联系技术支持 --- ## 📞 技术支持 **相关文件位置:** - 备份文件:`log\backup\` - 日志文件:后台管理系统的日志目录 - 辅助脚本:项目根目录 **关键数据表:** - `sys_user` - 用户表 - `student_class` - 学员-班级关联表(重点关注 `status` 字段) - `class` - 班级表 - `course_assignment` - 课程分配表 **重要字段说明:** - `student_class.status`: - `1` = 有效分配(正在读) - `0` = 无效分配(已移除) - `sys_user.del_flag`: - `0` = 正常 - `2` = 已删除 - `sys_user.status`: - `0` = 正常 - `1` = 停用 --- ## 🎉 总结 ✅ **代码层面已完美解决**: - 所有新导入都会正确设置 `status=1` - 手动分配班级也会正确设置 `status=1` - 历史遗留数据可通过脚本一键修复 ✅ **配套工具完善**: - 数据备份工具 - 一致性检查工具 - 自动修复工具 - 统计报表工具 ✅ **操作流程清晰**: - 导入前:备份 → 检查 → 准备 - 导入中:选择模式 → 执行 → 监控 - 导入后:验证 → 修复(如需) → 确认 **放心使用!** 🚀