|
@@ -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);
|