|  | @@ -4,20 +4,20 @@ import cn.hutool.core.io.IoUtil;
 | 
	
		
			
				|  |  |  import cn.hutool.core.util.IdUtil;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
 | 
	
		
			
				|  |  | -import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
	
		
			
				|  |  | +import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserInfoRespVO;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.member.controller.user.vo.MbrUserUpdateMobileReqVO;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.member.convert.user.UserProfileConvert;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
 | 
	
		
			
				|  |  | -import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
 | 
	
		
			
				|  |  |  import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
 | 
	
		
			
				|  |  |  import com.google.common.annotations.VisibleForTesting;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.springframework.security.crypto.password.PasswordEncoder;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  |  import javax.validation.Valid;
 | 
	
	
		
			
				|  | @@ -28,7 +28,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
 | 
	
		
			
				|  |  |  import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
 | 
	
		
			
				|  |  |  import static cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants.USER_NOT_EXISTS;
 | 
	
		
			
				|  |  |  import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED;
 | 
	
		
			
				|  |  | -import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.USER_SMS_CODE_NOT_CORRECT;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * User Service 实现类
 | 
	
	
		
			
				|  | @@ -49,9 +48,6 @@ public class MbrUserServiceImpl implements MbrUserService {
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private PasswordEncoder passwordEncoder;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  | -    private SysAuthService sysAuthService;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private SysSmsCodeService smsCodeService;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -130,24 +126,23 @@ public class MbrUserServiceImpl implements MbrUserService {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public void updateMobile(Long userId, MbrUserUpdateMobileReqVO reqVO) {
 | 
	
		
			
				|  |  |          // 检测用户是否存在
 | 
	
		
			
				|  |  |          checkUserExists(userId);
 | 
	
		
			
				|  |  | -        // 校验验证码,并标记为已使用
 | 
	
		
			
				|  |  | -        smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), reqVO.getCode(),getClientIP());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 检测新手机和旧手机的验证码是否在30分钟内
 | 
	
		
			
				|  |  | -        SysSmsCodeDO smsOldCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene());
 | 
	
		
			
				|  |  | -        SysSmsCodeDO smsNewCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getMobile(), reqVO.getCode(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        // 判断新旧code是否未被使用,如果是,抛出异常
 | 
	
		
			
				|  |  | -        if (Boolean.FALSE.equals(smsOldCodeDO.getUsed()) || Boolean.FALSE.equals(smsNewCodeDO.getUsed())){
 | 
	
		
			
				|  |  | +        // 校验旧手机和旧验证码
 | 
	
		
			
				|  |  | +        SysSmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene());
 | 
	
		
			
				|  |  | +        // 判断旧code是否未被使用,如果是,抛出异常
 | 
	
		
			
				|  |  | +        if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){
 | 
	
		
			
				|  |  |              throw exception(USER_SMS_CODE_IS_UNUSED);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        // 使用新验证码
 | 
	
		
			
				|  |  | +        smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), reqVO.getCode(),getClientIP());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 更新用户手机
 | 
	
		
			
				|  |  | -        MbrUserDO userDO = MbrUserDO.builder().build();
 | 
	
		
			
				|  |  | -        userDO.setMobile(reqVO.getMobile());
 | 
	
		
			
				|  |  | +        MbrUserDO userDO = MbrUserDO.builder().id(userId).mobile(reqVO.getMobile()).build();
 | 
	
		
			
				|  |  |          userMapper.updateById(userDO);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |