|  | @@ -10,12 +10,14 @@ import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.common.enums.CacheNameEnum;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.FrozenTypeEnum;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.common.entity.HttpResponseResult;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.base.exception.BizException;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.payment.util.DistributedLock;
 | 
	
		
			
				|  |  |  import org.redisson.api.RLock;
 | 
	
		
			
				|  |  |  import org.redisson.api.RedissonClient;
 | 
	
		
			
				|  |  |  import org.slf4j.Logger;
 | 
	
	
		
			
				|  | @@ -46,6 +48,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |      private RedissonClient redissonClient;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private UserOrderService orderService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public UserAccountVo detail(Long id) {
 | 
	
		
			
				|  |  |          UserAccountVo detail = baseMapper.detail(id);
 | 
	
	
		
			
				|  | @@ -67,17 +70,13 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |                  || null == accountRecordDto.getInOrOut() || null == accountRecordDto.getBizType()) {
 | 
	
		
			
				|  |  |              return HttpResponseResult.failed("缺少参数");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        String lockName = CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        RLock lock = redissonClient.getLock(lockName);
 | 
	
		
			
				|  |  | -        if (Objects.isNull(lock)) {
 | 
	
		
			
				|  |  | -            log.info("callIfLockCanGet lock is null lockName : {}", lockName);
 | 
	
		
			
				|  |  | -            return HttpResponseResult.failed("账户变更失败");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        ExecutorService executor = Executors.newCachedThreadPool();
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -            if (lock.tryLock(10L, 60L, TimeUnit.SECONDS)) {
 | 
	
		
			
				|  |  | -                return doAccountChange(accountRecordDto);
 | 
	
		
			
				|  |  | +            HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
 | 
	
		
			
				|  |  | +                    .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId())
 | 
	
		
			
				|  |  | +                            , this::doAccountChange, accountRecordDto, 10L);
 | 
	
		
			
				|  |  | +            if (null != res) {
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  return HttpResponseResult.failed("账户变更失败");
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -85,13 +84,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |              return HttpResponseResult.failed(e.getMessage());
 | 
	
		
			
				|  |  |          } catch (Exception e) {
 | 
	
		
			
				|  |  |              e.printStackTrace();
 | 
	
		
			
				|  |  | -            log.error("callIfLockCanGet error lockKey {}", lockName);
 | 
	
		
			
				|  |  | -            return HttpResponseResult.failed("账户变更失败");
 | 
	
		
			
				|  |  | -        } finally {
 | 
	
		
			
				|  |  | -            executor.shutdown();
 | 
	
		
			
				|  |  | -            if (lock.getHoldCount() != 0) {
 | 
	
		
			
				|  |  | -                lock.unlock();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            return HttpResponseResult.failed("付款失败");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -143,7 +136,6 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private HttpResponseResult<UserAccountRecord> doAccountChange(UserAccountRecordDto accountRecordDto) {
 | 
	
		
			
				|  |  | -        UserAccountVo detail = detail(accountRecordDto.getUserId());
 | 
	
		
			
				|  |  |          //收入要校验金额
 | 
	
		
			
				|  |  |          if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
 | 
	
		
			
				|  |  |              UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
 | 
	
	
		
			
				|  | @@ -173,6 +165,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |              baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        UserAccountVo detail = detail(accountRecordDto.getUserId());
 | 
	
		
			
				|  |  |          if (detail.getAmountTotal().doubleValue() < 0
 | 
	
		
			
				|  |  |                  || detail.getAmountUsable().doubleValue() < 0 || detail.getAmountFrozen().doubleValue() < 0) {
 | 
	
		
			
				|  |  |              throw new BizException("账户变更失败");
 | 
	
	
		
			
				|  | @@ -181,7 +174,6 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
 | 
	
		
			
				|  |  |              //插入账户变更记录
 | 
	
		
			
				|  |  |              accountRecordDto.setAccountId(accountRecordDto.getUserId());
 | 
	
		
			
				|  |  |              accountRecordDto.setAccountBalance(detail.getAmountUsable());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              userAccountRecordService.save(accountRecordDto);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return HttpResponseResult.succeed(accountRecordDto);
 |