From 7844f5af457ff3b7d3f8eeac8799e8d281e635a1 Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期一, 21 九月 2026 11:04:46 +0800
Subject: [PATCH] 更新....

---
 talent-card-server/src/main/java/com/talentcard/server/business/auth/TalentAuthService.java |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/auth/TalentAuthService.java b/talent-card-server/src/main/java/com/talentcard/server/business/auth/TalentAuthService.java
index 400c5fd..3a29659 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/auth/TalentAuthService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/auth/TalentAuthService.java
@@ -125,11 +125,17 @@
                 """, openId);
         if (!binding.isEmpty() && number(binding.get(0).get("id")) != talentId) {
             long previousTalentId = number(binding.get(0).get("id"));
-            jdbc.update("update talent_user set openid = null where id = ?", previousTalentId);
             jdbc.update("update talent_session set revoked_at = coalesce(revoked_at, now()) where talent_id = ? and revoked_at is null", previousTalentId);
         }
+        // uk_openid 是唯一索引:已软删/停用的历史账号照样占着这个 openid,不先摘掉就会撞唯一键(接口报「服务器内部错误」)。
+        releaseOpenId(openId, talentId);
         jdbc.update("update talent_user set openid = ? where id = ?", openId, talentId);
         return issueSession(talentId);
+    }
+
+    /** 把 openid 从除 keepTalentId 之外的所有行上摘掉(含软删、停用的历史账号)。 */
+    private void releaseOpenId(String openId, long keepTalentId) {
+        jdbc.update("update talent_user set openid = null where openid = ? and id <> ?", openId, keepTalentId);
     }
 
     private long registerVisitor(String openId, String mobile) {
@@ -144,6 +150,8 @@
             jdbc.update("update talent_user set mobile = ? where id = ?", mobile, talentId);
             return talentId;
         }
+        // 没有可用的绑定时要把历史占用清掉,否则下面这条 insert 会撞 uk_openid。
+        jdbc.update("update talent_user set openid = null where openid = ?", openId);
         jdbc.update("""
                 insert into talent_user(openid, name, mobile, talent_level, source_area_type, status)
                 values (?, '普通游客', ?, '普通游客', 'LOCAL', 1)

--
Gitblit v1.7.1