| | |
| | | import com.tcm.training.admin.app.settings.vo.AppSettingsNotificationVO; |
| | | import com.tcm.training.admin.app.settings.vo.AppSettingsProfileVO; |
| | | import com.tcm.training.admin.app.settings.vo.AppSettingsWechatBindingVO; |
| | | 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 com.tcm.training.admin.upload.ObsUploadService; |
| | |
| | | private final AppSmsCodeService appSmsCodeService; |
| | | private final BCryptPasswordEncoder passwordEncoder; |
| | | private final AppWechatAuthClient appWechatAuthClient; |
| | | private final AppShareService appShareService; |
| | | private final AppUserNotificationSettingMapper appUserNotificationSettingMapper; |
| | | private final ObsUploadService obsUploadService; |
| | | |
| | |
| | | AppSmsCodeService appSmsCodeService, |
| | | BCryptPasswordEncoder passwordEncoder, |
| | | AppWechatAuthClient appWechatAuthClient, |
| | | AppShareService appShareService, |
| | | AppUserNotificationSettingMapper appUserNotificationSettingMapper, |
| | | ObsUploadService obsUploadService) { |
| | | this.appAuthSessionService = appAuthSessionService; |
| | |
| | | this.appSmsCodeService = appSmsCodeService; |
| | | this.passwordEncoder = passwordEncoder; |
| | | this.appWechatAuthClient = appWechatAuthClient; |
| | | this.appShareService = appShareService; |
| | | this.appUserNotificationSettingMapper = appUserNotificationSettingMapper; |
| | | this.obsUploadService = obsUploadService; |
| | | } |
| | |
| | | requirePhoneAvailable(newPhone, user.getId()); |
| | | appSmsCodeService.validatePhoneChangeCode(newPhone, code); |
| | | user.setPhone(newPhone); |
| | | bindInviteRelationIfAbsent(user, request.getInviteCode()); |
| | | userMapper.updateById(user); |
| | | return toProfileVO(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 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 Integer normalizeAdvanceMinutes(Integer advanceMinutes) { |