From 2a3c3cdbf2398695d61633e072f98ee2757e9e27 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 11 八月 2026 11:20:26 +0800
Subject: [PATCH] feat(appointment): 添加访客预约系统解除绑定功能

---
 backend/src/main/java/com/sinata/appointment/service/MiniAuthApplicationService.java |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/MiniAuthApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/MiniAuthApplicationService.java
index 905f21e..64c9a4d 100644
--- a/backend/src/main/java/com/sinata/appointment/service/MiniAuthApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/MiniAuthApplicationService.java
@@ -37,6 +37,7 @@
     private static final String OFFICIAL_BIND_TOKEN_PREFIX = "official:bind:";
     private static final Duration OFFICIAL_BIND_TOKEN_TTL = Duration.ofMinutes(10);
     private static final String OFFICIAL_OPEN_ID_PLACEHOLDER_PREFIX = "OA_PLACEHOLDER_";
+    private static final String UNBOUND_OPEN_ID_PREFIX = "UNBOUND_";
 
     private final MpUserMapper mpUserMapper;
     private final SysDeptMapper sysDeptMapper;
@@ -263,7 +264,8 @@
         String currentOpenId = user.getOpenId();
         if (StringUtils.hasText(currentOpenId)
                 && !Objects.equals(currentOpenId, openId)
-                && !MpStaffConstants.isPlaceholderOpenId(currentOpenId)) {
+                && !MpStaffConstants.isPlaceholderOpenId(currentOpenId)
+                && !isUnboundOpenId(currentOpenId)) {
             throw new BizException(BizErrorCode.AUTH_FORBIDDEN, "该手机号已绑定其他微信账号");
         }
         if (MiniUserType.EMPLOYEE.equals(user.getUserType())
@@ -437,6 +439,18 @@
         MiniStpUtil.logout();
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void unbindMiniOpenIdAndLogout() {
+        MpUser user = currentMpUser();
+        user.setOpenId(UNBOUND_OPEN_ID_PREFIX + UUID.randomUUID().toString().replace("-", ""));
+        mpUserMapper.updateById(user);
+        MiniStpUtil.logout(user.getId());
+    }
+
+    private boolean isUnboundOpenId(String openId) {
+        return StringUtils.hasText(openId) && openId.startsWith(UNBOUND_OPEN_ID_PREFIX);
+    }
+
     private MiniLoginResponse buildResponse(MpUser user) {
         String name =
                 user.getNickName() != null && !user.getNickName().isBlank()

--
Gitblit v1.7.1