| | |
| | | import com.tcm.training.admin.app.auth.vo.AppLoginUserVO; |
| | | import com.tcm.training.admin.app.auth.vo.AppPasswordResetVerifyResponse; |
| | | import com.tcm.training.admin.app.auth.vo.AppSmsCodeSendResponse; |
| | | import com.tcm.training.admin.app.share.service.AppShareService; |
| | | import com.tcm.training.admin.member.entity.AppUser; |
| | | import com.tcm.training.admin.member.mapper.UserMapper; |
| | | import cn.dev33.satoken.stp.SaTokenInfo; |
| | |
| | | private final AppAuthSessionService appAuthSessionService; |
| | | private final AppWechatAuthClient appWechatAuthClient; |
| | | private final AppAppleAuthClient appAppleAuthClient; |
| | | private final AppShareService appShareService; |
| | | private final StringRedisTemplate stringRedisTemplate; |
| | | |
| | | /** |
| | |
| | | AppAuthSessionService appAuthSessionService, |
| | | AppWechatAuthClient appWechatAuthClient, |
| | | AppAppleAuthClient appAppleAuthClient, |
| | | AppShareService appShareService, |
| | | StringRedisTemplate stringRedisTemplate) { |
| | | this.userMapper = userMapper; |
| | | this.appSmsCodeService = appSmsCodeService; |
| | |
| | | this.appAuthSessionService = appAuthSessionService; |
| | | this.appWechatAuthClient = appWechatAuthClient; |
| | | this.appAppleAuthClient = appAppleAuthClient; |
| | | this.appShareService = appShareService; |
| | | this.stringRedisTemplate = stringRedisTemplate; |
| | | } |
| | | |
| | |
| | | AppUser user = findUserByWechatOpenid(profile.getOpenid()); |
| | | if (user == null) { |
| | | user = buildWechatUser(profile); |
| | | bindInviteRelationIfAbsent(user, request.getInviteCode()); |
| | | userMapper.insert(user); |
| | | return createLoginResponse(user); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 用户尚未绑定诊所关系时,根据医生邀请码补齐上下级关系。 |
| | | */ |
| | | private void bindInviteRelationIfAbsent(AppUser user, String inviteCode) { |
| | | if (user.getClinicId() != null || user.getSuperiorClinicUserId() != null) { |
| | | return; |
| | | } |
| | | String normalizedInviteCode = normalizeInviteCode(inviteCode); |
| | | if (normalizedInviteCode == null) { |
| | | return; |
| | | } |
| | | AppShareService.InviteBindingTarget bindingTarget = appShareService.resolveInviteBindingTarget(normalizedInviteCode); |
| | | user.setClinicId(bindingTarget.getClinicId()); |
| | | user.setSuperiorClinicUserId(bindingTarget.getSuperiorClinicUserId()); |
| | | } |
| | | |
| | | /** |
| | | * 基于苹果资料构造首次登录时的本地普通用户。 |
| | | */ |
| | | private AppUser buildAppleUser(AppAppleUserProfile profile) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 归一化医生邀请码,非法时忽略以保持第三方登录主流程可用。 |
| | | */ |
| | | private String normalizeInviteCode(String inviteCode) { |
| | | String normalized = trimToNull(inviteCode); |
| | | if (normalized == null) { |
| | | return null; |
| | | } |
| | | String upperInviteCode = normalized.toUpperCase(); |
| | | return upperInviteCode.matches("^[A-Z0-9]{6}$") ? upperInviteCode : null; |
| | | } |
| | | |
| | | /** |
| | | * 归一化并校验忘记密码场景下的新密码格式。 |
| | | */ |
| | | private String normalizeNewPassword(String password) { |