xinli/用户导入重复问题说明.md

108 lines
3.6 KiB
Markdown
Raw Normal View History

2025-12-02 15:12:55 +08:00
# 用户导入"信息编号已存在"问题说明
## 📋 问题描述
导入 3800 条用户数据时,有 11 条失败,提示"信息编号 XX 已存在"
- 信息编号34, 99, 114, 120, 121, 122, 123, 124 等
## 🔍 问题原因
经过代码分析,"信息编号已存在"有**两种可能**
### 1. Excel 文件内部重复 ⭐ **最可能**
- Excel 文件中有多条记录使用了相同的信息编号
- 第一条记录导入成功
- 第二条相同信息编号的记录尝试导入时,发现数据库中已存在(刚刚导入的那条),导致失败
**示例:**
```
Excel 中:
行100: 信息编号=34, 姓名=张三
行500: 信息编号=34, 姓名=李四 ← 这条会失败,提示"34 已存在"
```
### 2. 数据库中已存在
- 这些信息编号在之前的导入中已经创建过
- 本次导入时没有勾选"是否更新已存在数据",导致失败
## ✅ 已修复内容
### 1. 添加 Excel 内部重复检查
现在导入时会先检查 Excel 文件内部是否有重复的信息编号,提前拦截并给出明确提示。
**修改位置:** `PsyUserProfileServiceImpl.java` 第 529-536 行
```java
// 检查Excel文件内部是否有重复的信息编号
if (infoNumberSet.contains(profile.getInfoNumber())) {
failureMsg.append("、信息编号 ").append(profile.getInfoNumber())
.append(" 在导入文件中重复出现");
continue;
}
```
### 2. 改进错误提示
现在错误提示更清晰,能区分两种情况:
- **Excel 内部重复**`信息编号 XX 在导入文件中重复出现`
- **数据库中已存在**`信息编号 XX 在数据库中已存在(若需更新请勾选"是否更新已存在数据"`
## 🔧 排查方法
### 方法 1运行 SQL 脚本检查
执行 `检查重复信息编号.sql` 脚本,查看:
1. 这些信息编号在数据库中是否真的存在
2. 数据库中是否有其他重复的信息编号
3. 最近导入的记录情况
### 方法 2检查 Excel 文件
在 Excel 中使用以下步骤检查重复:
1. 选中信息编号列
2. 点击"条件格式" → "突出显示单元格规则" → "重复值"
3. Excel 会自动标记重复的信息编号
### 方法 3使用 Excel 公式查找重复
在新列输入公式:
```excel
=COUNTIF($A$2:$A$3801, A2)
```
如果结果 > 1说明该信息编号重复出现。
## 📝 建议
### 给用户的建议
1. **导入前清理 Excel**
- 检查并删除重复的信息编号
- 或修改重复的信息编号,确保唯一性
2. **如果需要更新已存在数据**
- 导入时勾选"是否更新已存在数据"选项
- 系统会自动更新而不是提示失败
3. **使用 SQL 脚本检查**
- 导入前运行 `检查重复信息编号.sql`
- 确认哪些信息编号已在数据库中存在
### 下次导入优化建议
1. ✅ 已添加 Excel 内部重复检查
2. ✅ 已改进错误提示信息
3. 🔄 建议:添加导入预检查功能,在实际导入前先检查并报告所有问题
4. 🔄 建议:提供"忽略重复"选项,跳过重复记录继续导入其他数据
## 🚀 部署说明
修改已完成,需要重新编译后端:
```bash
cd c:\Users\Administrator\Desktop\Project\xinli
mvn clean package -DskipTests
```
重启后端服务后,新的检查逻辑即可生效。
## 📊 问题总结
| 问题类型 | 新错误提示 | 解决方法 |
|---------|-----------|---------|
| Excel 内部重复 | `信息编号 XX 在导入文件中重复出现` | 清理 Excel 中的重复记录 |
| 数据库已存在 | `信息编号 XX 在数据库中已存在(若需更新请勾选"是否更新已存在数据"` | 勾选更新选项,或修改信息编号 |