5.5 KiB
5.5 KiB
用户导入登录账号被错误修改问题修复说明
🐛 问题描述
导入用户时,出现了奇怪的登录账号,例如:
-- 日志显示
updateUserName - Parameters: 这是导入的(String), 6571(Long)
-- 正常应该是
updateUserName - Parameters: 13466(String), 13466(String), 6671(Long)
问题现象:
- Excel中某些行的姓名列填写了异常数据(如"这是导入的")
- 更新用户档案时,系统把姓名同步到了登录账号(userName)
- 用户无法登录,因为登录账号被改成了姓名
🔍 问题根源
系统设计
登录账号(userName) = 信息编号(如"3466") 昵称(nickName) = 姓名(如"张三")
代码逻辑
1. 创建新用户时(正确):
// autoCreateUserByProfile
user.setUserName(信息编号); // 登录账号 = 信息编号 ✅
user.setNickName(Excel姓名); // 昵称 = Excel姓名 ✅
2. 更新用户时(错误):
// updateProfile → syncUserName
userService.updateUserName(userId, userName, userName);
// 同时更新了登录账号和昵称为Excel姓名 ❌
问题流程
导入Excel → profile.userName = "这是导入的"(来自Excel姓名列)
↓
updateProfile() → syncUserName(userId, "这是导入的")
↓
updateUserName(userId, "这是导入的", "这是导入的")
↓
sys_user表:
user_name (登录账号) = "这是导入的" ← 错误!应该保持为信息编号
nick_name (昵称) = "这是导入的" ← 正确
✅ 修复方案
修改内容
文件: PsyUserProfileServiceImpl.java 第448-461行
修改前:
private void syncUserName(Long userId, String userName)
{
if (userId == null || StringUtils.isEmpty(userName))
{
return;
}
userService.updateUserName(userId, userName, userName);
}
修改后:
private void syncUserName(Long userId, String userName)
{
if (userId == null || StringUtils.isEmpty(userName))
{
return;
}
// 只更新昵称(nickName),不修改登录账号(userName保持为信息编号)
// 获取当前用户,保持原有的登录账号不变
SysUser user = userService.selectUserById(userId);
if (user != null)
{
userService.updateUserName(userId, user.getUserName(), userName);
}
}
修复效果
修复前:
更新用户 → user_name和nick_name都变成Excel姓名 ❌
修复后:
更新用户 → user_name保持为信息编号,nick_name变成Excel姓名 ✅
🔧 影响范围
已影响的用户
执行SQL查询受影响的用户:
-- 查找登录账号不是纯数字的用户(异常)
SELECT
user_id,
user_name AS 登录账号,
nick_name AS 昵称,
create_time AS 创建时间
FROM sys_user
WHERE user_name REGEXP '[^0-9]' -- 包含非数字字符
AND del_flag = '0';
-- 查找对应的档案信息
SELECT
u.user_id,
u.user_name AS 当前登录账号,
u.nick_name AS 昵称,
p.info_number AS 正确的信息编号
FROM sys_user u
LEFT JOIN psy_user_profile p ON u.user_id = p.user_id
WHERE u.user_name REGEXP '[^0-9]'
AND u.del_flag = '0';
修复受影响的用户
手动修复SQL:
-- 将登录账号恢复为信息编号
UPDATE sys_user u
INNER JOIN psy_user_profile p ON u.user_id = p.user_id
SET u.user_name = p.info_number
WHERE u.user_name REGEXP '[^0-9]' -- 包含非数字字符
AND u.del_flag = '0'
AND p.info_number IS NOT NULL
AND p.info_number REGEXP '^[0-9]+$'; -- 信息编号是纯数字
-- 验证修复结果
SELECT
u.user_id,
u.user_name AS 登录账号,
u.nick_name AS 昵称,
p.info_number AS 信息编号
FROM sys_user u
LEFT JOIN psy_user_profile p ON u.user_id = p.user_id
WHERE u.user_id IN (
SELECT user_id FROM sys_user
WHERE user_name REGEXP '[^0-9]'
);
📦 部署步骤
1. 备份数据库
-- 备份sys_user表
CREATE TABLE sys_user_backup_20251202 AS SELECT * FROM sys_user;
2. 修复已影响的用户(可选)
运行上面的修复SQL,将异常的登录账号恢复为信息编号。
3. 重新编译后端
cd c:\Users\Administrator\Desktop\Project\xinli
mvn clean package -DskipTests
4. 重启后端服务
重启后,新的更新操作将不再修改登录账号。
📝 预防措施
1. Excel数据验证
导入前检查Excel数据:
- 姓名列:只能包含汉字和数字
- 信息编号列:只能包含数字
- 使用Excel条件格式标记异常数据
2. 用户登录规则
记住:
- 登录账号 = 信息编号(纯数字)
- 昵称 = 姓名(显示用)
- 更新姓名不会影响登录账号
3. 导入最佳实践
- ✅ 导入前检查数据规范性
- ✅ 小批量测试导入
- ✅ 导入后验证用户是否能正常登录
- ✅ 备份数据后再大批量导入
🎯 总结
| 项目 | 修复前 | 修复后 |
|---|---|---|
| 创建用户 | userName=信息编号 ✅ | userName=信息编号 ✅ |
| 更新用户 | userName=姓名 ❌ | userName=信息编号(保持不变)✅ |
| 用户能否登录 | ❌ 无法登录 | ✅ 正常登录 |
核心修复: 更新用户档案时,只同步姓名到昵称(nickName),保持登录账号(userName)为信息编号不变。
影响评估:
- 已导入的异常用户需要手动修复
- 修复后不再出现此问题
- 不影响正常的用户创建和更新
风险: 低 优先级: 高(影响用户登录)