fix: 修复旧用户钉钉登录报重复键错误的问题

优化钉钉登录用户查找逻辑:
- 优先通过ding_user_id查找用户(处理旧账户数据)
- 其次通过unionId生成的email查找
- 解决非钉钉创建的用户使用钉钉登录时的重复键约束错误
This commit is contained in:
Your Name 2026-01-28 17:11:07 +08:00
parent 3d6c649388
commit a8ecc8a11f

View File

@ -678,12 +678,29 @@ public class UserService {
}
}
// 3. 查找或创建用户(使用unionId作为唯一标识)
// 3. 查找或创建用户
// 🔥 优先通过ding_user_id查找(处理旧用户数据),其次通过unionId生成的email查找
String email = "dingtalk_" + unionId + "@dingtalk.local";
User user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getEmail, email)
);
User user = null;
// 优先通过钉钉用户ID查找
if (dingtalkUserId != null) {
user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getDingUserId, dingtalkUserId)
);
if (user != null) {
log.info("通过ding_user_id找到已有用户(免登): userId={}, realName={}", user.getId(), user.getRealName());
}
}
// 如果通过ding_user_id找不到,再通过email查找
if (user == null) {
user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getEmail, email)
);
}
if (user == null) {
// 首次登录:创建用户
@ -809,12 +826,28 @@ public class UserService {
}
// 4. 查找或创建用户
// 使用unionId作为唯一标识
// 优先通过ding_user_id查找(更可靠),其次通过unionId生成的email查找
String email = "dingtalk_" + unionId + "@dingtalk.local";
User user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getEmail, email)
);
User user = null;
// 🔥 优先通过钉钉用户ID查找(处理旧用户数据)
if (dingtalkUserId != null) {
user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getDingUserId, dingtalkUserId)
);
if (user != null) {
log.info("通过ding_user_id找到已有用户: userId={}, realName={}", user.getId(), user.getRealName());
}
}
// 如果通过ding_user_id找不到,再通过email查找
if (user == null) {
user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getEmail, email)
);
}
if (user == null) {
// 首次登录:创建用户但不分配部门