guoyu/用户导入操作指南.md
2025-12-11 23:28:07 +08:00

403 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📚 用户导入和课程分配操作指南
> 最后更新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`
- 历史遗留数据可通过脚本一键修复
**配套工具完善**
- 数据备份工具
- 一致性检查工具
- 自动修复工具
- 统计报表工具
**操作流程清晰**
- 导入前:备份 → 检查 → 准备
- 导入中:选择模式 → 执行 → 监控
- 导入后:验证 → 修复(如需) → 确认
**放心使用!** 🚀