xinli/用户档案导入问题修复说明.md
2025-12-02 15:12:55 +08:00

155 lines
4.8 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.

# 用户档案导入问题修复说明
## 问题描述
用户在导入用户档案数据时,明明某些用户已被删除(在系统中看不到),但系统仍提示"用户已存在",导致无法正常导入。
## 问题原因
`PsyUserProfileMapper.xml` 中,多个档案查询方法缺少对已删除用户的过滤条件:
1. **`selectProfilesByInfoNumbers`** - 批量查询档案(导入时使用)
2. **`selectProfileByInfoNumber`** - 根据信息编号查询(唯一性验证时使用)
3. **`selectProfileById`** - 根据档案ID查询
4. **`selectProfileByUserId`** - 根据用户ID查询
这些查询没有添加 `u.del_flag = '0'` 过滤条件,导致:
- 当用户被删除(`del_flag = '2'`)后,在列表中看不到(列表查询有过滤)
- 但导入时仍能查到这些已删除用户的档案(导入查询无过滤)
- 系统误判为"用户已存在",拒绝导入
## 修复内容
### 1. 修复 `selectProfilesByInfoNumbers`(批量查询)
**位置**: `PsyUserProfileMapper.xml` 第279-288行
```xml
<!-- 修复前 -->
<select id="selectProfilesByInfoNumbers" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where p.info_number in
<foreach item="infoNumber" collection="list" open="(" separator="," close=")">
#{infoNumber}
</foreach>
</select>
<!-- 修复后 -->
<select id="selectProfilesByInfoNumbers" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where u.del_flag = '0'
and p.info_number in
<foreach item="infoNumber" collection="list" open="(" separator="," close=")">
#{infoNumber}
</foreach>
</select>
```
### 2. 修复 `selectProfileByInfoNumber`(单个查询)
**位置**: `PsyUserProfileMapper.xml` 第62-68行
```xml
<!-- 修复前 -->
<select id="selectProfileByInfoNumber" parameterType="String" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where p.info_number = #{infoNumber}
</select>
<!-- 修复后 -->
<select id="selectProfileByInfoNumber" parameterType="String" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where p.info_number = #{infoNumber}
and u.del_flag = '0'
</select>
```
### 3. 修复 `selectProfileById`
**位置**: `PsyUserProfileMapper.xml` 第46-52行
```xml
<!-- 修复后 -->
<select id="selectProfileById" parameterType="Long" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where p.profile_id = #{profileId}
and u.del_flag = '0'
</select>
```
### 4. 修复 `selectProfileByUserId`
**位置**: `PsyUserProfileMapper.xml` 第54-60行
```xml
<!-- 修复后 -->
<select id="selectProfileByUserId" parameterType="Long" resultMap="PsyUserProfileResult">
<include refid="selectProfileVo"/>
from psy_user_profile p
left join sys_user u on p.user_id = u.user_id
where p.user_id = #{userId}
and u.del_flag = '0'
</select>
```
## 修复效果
修复后,系统在以下场景中的行为将更加合理:
1. **导入档案时**: 不会再将已删除用户的档案识别为"已存在",可以正常导入
2. **信息编号唯一性验证**: 不会因已删除用户的旧信息编号而拒绝新用户使用
3. **查询档案**: 所有档案查询统一过滤已删除用户,保持数据一致性
## 测试建议
### 测试场景1导入已删除用户的档案
1. 删除一个有档案的用户(设置 `del_flag = '2'`
2. 准备Excel文件包含该用户的信息编号
3. 导入档案数据
4. **预期结果**: 成功导入,系统自动创建新用户
### 测试场景2信息编号唯一性
1. 删除用户A信息编号001
2. 创建新档案使用信息编号001
3. **预期结果**: 成功创建,不提示"信息编号已存在"
### 测试场景3正常导入未删除用户
1. 准备包含现有用户信息编号的Excel
2. 不勾选"更新已存在数据"
3. 导入档案
4. **预期结果**: 提示"信息编号已存在"(行为不变)
## 影响范围
**修改文件**:
- `ry-xinli-system/src/main/resources/mapper/system/psychology/PsyUserProfileMapper.xml`
**影响模块**:
- 用户档案导入功能
- 用户档案查询功能
- 信息编号唯一性验证
**兼容性**: 完全向后兼容,只是增加了已删除用户的过滤条件
## 部署说明
1. 更新代码后重新编译项目
2. 重启应用服务器
3. 无需数据库变更
4. 建议清理旧的已删除用户档案数据(可选)
---
**修复日期**: 2024年12月2日
**修复人**: Cascade AI Assistant