From a8ecc8a11f7c1311b323bec59a9c7f9a564a6ec1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 28 Jan 2026 17:11:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A7=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=92=89=E9=92=89=E7=99=BB=E5=BD=95=E6=8A=A5=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=94=AE=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化钉钉登录用户查找逻辑: - 优先通过ding_user_id查找用户(处理旧账户数据) - 其次通过unionId生成的email查找 - 解决非钉钉创建的用户使用钉钉登录时的重复键约束错误 --- .../com/designhub/service/UserService.java | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index 2d79335..459fe24 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -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() - .eq(User::getEmail, email) - ); + User user = null; + + // 优先通过钉钉用户ID查找 + if (dingtalkUserId != null) { + user = userMapper.selectOne( + new LambdaQueryWrapper() + .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() + .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() - .eq(User::getEmail, email) - ); + User user = null; + + // 🔥 优先通过钉钉用户ID查找(处理旧用户数据) + if (dingtalkUserId != null) { + user = userMapper.selectOne( + new LambdaQueryWrapper() + .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() + .eq(User::getEmail, email) + ); + } if (user == null) { // 首次登录:创建用户但不分配部门