xinli/用户导入登录账号被错误修改问题修复说明.md
2025-12-02 15:12:55 +08:00

5.5 KiB
Raw Blame History

用户导入登录账号被错误修改问题修复说明

🐛 问题描述

导入用户时,出现了奇怪的登录账号,例如:

-- 日志显示
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为信息编号不变。

影响评估:

  • 已导入的异常用户需要手动修复
  • 修复后不再出现此问题
  • 不影响正常的用户创建和更新

风险:优先级: 高(影响用户登录)