From dca59720bfa206a360b75a2b2f609bf339ab0e31 Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Mon, 26 Oct 2026 15:32:11 +0800 Subject: [PATCH] =?UTF-8?q?:adhesive=5Fbandage:=20code-review=20=E4=BF=AE?= =?UTF-8?q?=E8=AE=A2=EF=BC=9A=E6=94=B9=E5=8F=B7=E5=90=8C=E6=AD=A5=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=8B=E6=9C=BA=E5=8F=B7=E8=84=B1=E6=95=8F=E3=80=81?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=20feign=20=E5=A5=91=E7=BA=A6=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/support/MpLoginSupport.java | 4 ++-- .../transport/feign/IDriverClient.java | 3 ++- .../system/support/MpPhoneChangePlan.java | 8 +------ .../support/MpUserPhoneChangeSupport.java | 21 +++++++++++-------- .../service/impl/MpUserServiceImplTest.java | 2 +- .../impl/UserPhoneServiceImplTest.java | 2 +- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/blade-auth/src/main/java/org/springblade/auth/support/MpLoginSupport.java b/blade-auth/src/main/java/org/springblade/auth/support/MpLoginSupport.java index 9e8154bd..030e2502 100644 --- a/blade-auth/src/main/java/org/springblade/auth/support/MpLoginSupport.java +++ b/blade-auth/src/main/java/org/springblade/auth/support/MpLoginSupport.java @@ -89,7 +89,7 @@ public class MpLoginSupport { // ③ 身份含 driver 才建档;纯 admin 不建 String loginNotice = ensureProfile(account, phone, tenantId); // ④ 微信登录把 openid 覆盖写为本次值留痕;失败只 WARN - bindOpenid(account, openid); + bindOpenId(account, openid); MpUserInfo userInfo = loadUserInfo(account); attachNotice(userInfo, loginNotice); return TokenUtil.convertMpUser(userInfo); @@ -187,7 +187,7 @@ public class MpLoginSupport { /** * ④ 微信登录把 openid 覆盖写为本次值:「该账号最近一次登录用的微信」,不参与识别;失败只 WARN */ - private void bindOpenid(MpUser account, String openid) { + private void bindOpenId(MpUser account, String openid) { if (account == null || StringUtil.isBlank(openid)) { return; } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/feign/IDriverClient.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/feign/IDriverClient.java index 7a81e0d5..ed954ea2 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/feign/IDriverClient.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/feign/IDriverClient.java @@ -63,7 +63,8 @@ public interface IDriverClient { *

* 幂等入口:档案 mobile 已是新号时返回成功且不写库。只在档案属于该账号 * (user_id + tenant_id 命中)且档案 mobile 等于 oldPhone 时改这一列; - * 不满足时不动档案,通过返回值的 message 说明原因,不抛异常给调用方的账号更新。 + * 不满足时不动档案,通过返回值的 message 说明原因。入参不合法时服务端抛 ServiceException, + * feign 以调用异常返回,调用方按失败处理并自行决定是否影响账号更新。 * * @param param 租户、小程序账号、账号旧号与新号 * @return 档案ID与本次是否同步 diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/support/MpPhoneChangePlan.java b/blade-service/blade-system/src/main/java/org/springblade/system/support/MpPhoneChangePlan.java index f1c9320e..8db6adb4 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/support/MpPhoneChangePlan.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/support/MpPhoneChangePlan.java @@ -97,13 +97,7 @@ public final class MpPhoneChangePlan { && !submittedAccount.equals(oldAccount) && !isMasked(submittedAccount)) { return submittedAccount; } - if (oldAccount == null) { - return newPhone; - } - if (oldAccount.equals(oldPhone)) { - return newPhone; - } - return oldAccount; + return shouldSyncAccount() ? newPhone : oldAccount; } /** diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/support/MpUserPhoneChangeSupport.java b/blade-service/blade-system/src/main/java/org/springblade/system/support/MpUserPhoneChangeSupport.java index 2e7ca953..31f35456 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/support/MpUserPhoneChangeSupport.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/support/MpUserPhoneChangeSupport.java @@ -22,6 +22,7 @@ */ package org.springblade.system.support; +import cn.hutool.core.util.DesensitizedUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.api.R; @@ -34,12 +35,12 @@ import org.springframework.stereotype.Component; /** * 改号后同步司机档案手机号 *

- * 只在后台编辑与 App 内改号两个入口调用:登录链路上 transport 会回调本服务的 updateUser, - * 若那里再回调用 transport,会形成 transport(持 driver 行锁) → system → transport 的嵌套更新, - * 内层等同一行的锁直到超时。 + * 只在后台编辑与 App 内改号两个入口调用。登录链路的账号更新不得回调 transport: + * transport 的司机档案编辑会回调本服务的 updateUser,互相回调会形成 transport(持 driver 行锁) + * → system → transport 的嵌套更新,内层等同一行的锁直到超时。 *

- * 档案同步是账号更新之后的补偿动作:任何失败只记日志、不抛异常,账号更新照常提交。 - * 调用方据此能看出「账号改了、档案没改」。 + * 档案同步在账号更新之后执行:任何失败只记日志、不抛异常,账号更新照常提交。 + * 日志里的手机号一律脱敏;tenantId / mpUserId / driverId 保持原值用于定位。 * * @author Chill */ @@ -63,6 +64,8 @@ public class MpUserPhoneChangeSupport { || oldMobile.contains("*") || newMobile.contains("*") || oldMobile.equals(newMobile)) { return false; } + String maskedOldPhone = DesensitizedUtil.mobilePhone(oldMobile); + String maskedNewPhone = DesensitizedUtil.mobilePhone(newMobile); DriverSyncMobileDTO param = new DriverSyncMobileDTO(); param.setTenantId(tenant); param.setMpUserId(userId); @@ -72,24 +75,24 @@ public class MpUserPhoneChangeSupport { R result = driverClient.syncMobile(param); if (result == null || !result.isSuccess()) { log.error("小程序用户改号:账号已更新,司机档案同步调用失败。tenantId={} mpUserId={} oldPhone={} newPhone={} reason={}", - tenant, userId, oldMobile, newMobile, result == null ? "无响应" : result.getMsg()); + tenant, userId, maskedOldPhone, maskedNewPhone, result == null ? "无响应" : result.getMsg()); return false; } DriverSyncMobileVO data = result.getData(); if (data == null) { log.error("小程序用户改号:账号已更新,司机档案同步无返回数据。tenantId={} mpUserId={} oldPhone={} newPhone={}", - tenant, userId, oldMobile, newMobile); + tenant, userId, maskedOldPhone, maskedNewPhone); return false; } if (!Boolean.TRUE.equals(data.getSynced())) { log.warn("小程序用户改号:账号已更新,司机档案未同步。tenantId={} mpUserId={} oldPhone={} newPhone={} driverId={} reason={}", - tenant, userId, oldMobile, newMobile, data.getDriverId(), data.getMessage()); + tenant, userId, maskedOldPhone, maskedNewPhone, data.getDriverId(), data.getMessage()); return false; } return true; } catch (Exception exception) { log.error("小程序用户改号:账号已更新,司机档案同步异常。tenantId={} mpUserId={} oldPhone={} newPhone={}", - tenant, userId, oldMobile, newMobile, exception); + tenant, userId, maskedOldPhone, maskedNewPhone, exception); return false; } } diff --git a/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/MpUserServiceImplTest.java b/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/MpUserServiceImplTest.java index daa5c803..31298ccf 100644 --- a/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/MpUserServiceImplTest.java +++ b/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/MpUserServiceImplTest.java @@ -324,7 +324,7 @@ class MpUserServiceImplTest { assertTrue(scope.isAllDept()); } - // ------------------------------------------------------------ 改号三处一致(票 05 场景 6) + // ------------------------------------------------------------ 改号三处一致 @Test @DisplayName("后台改号(account 就是旧号):手机号、登录账号、司机档案电话三处一致") diff --git a/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/UserPhoneServiceImplTest.java b/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/UserPhoneServiceImplTest.java index 85fdfc14..80b289c1 100644 --- a/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/UserPhoneServiceImplTest.java +++ b/blade-service/blade-system/src/test/java/org/springblade/system/service/impl/UserPhoneServiceImplTest.java @@ -28,7 +28,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** - * App 内改号(票 05 场景 6 的小程序侧入口)。 + * App 内改号(小程序侧改号入口)。 *

* 只验证「交给 updateUser 之前」的三处一致性判据:手机号是新号、账号是否跟随取库里的旧号、 * 以及必须走带司机档案同步的更新入口(否则档案电话会停在旧号)。