Explorar el Código

订单退款/老师入账修改

liweifan hace 3 años
padre
commit
e00683b073

+ 24 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -18,6 +18,8 @@ import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 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.base.util.StringUtil;
+import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +35,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+import java.util.Objects;
+import java.util.concurrent.*;
 
 
 @Service
@@ -66,18 +69,32 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     public HttpResponseResult<UserAccountRecord> accountChange(UserAccountRecordDto accountRecordDto) {
         if (null == accountRecordDto.getUserId() || null == accountRecordDto.getTransAmount()
                 || null == accountRecordDto.getInOrOut() || null == accountRecordDto.getBizType()) {
-            throw new BizException("缺少参数");
+            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 {
-            return DistributedLock.of(redissonClient)
-                    .runIfLockCanGet(CacheNameEnum.LOCK_CHANGE_ACCOUNT.getRedisKey(accountRecordDto.getUserId())
-                            , () -> doAccountChange(accountRecordDto), 60L, TimeUnit.SECONDS);
+            if (lock.tryLock(10L, 60L, TimeUnit.SECONDS)) {
+                return doAccountChange(accountRecordDto);
+            } else {
+                return HttpResponseResult.failed("账户变更失败");
+            }
         } catch (BizException e) {
             return HttpResponseResult.failed(e.getMessage());
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new BizException("账户变更失败");
+            log.error("callIfLockCanGet error lockKey {}", lockName);
+            return HttpResponseResult.failed("账户变更失败");
+        } finally {
+            executor.shutdown();
+            if (lock.getHoldCount() != 0) {
+                lock.unlock();
+            }
         }
     }
 

+ 49 - 30
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -178,7 +178,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user) {
         Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
         for (Long id : ids) {
@@ -196,7 +195,6 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             orderRefund.setOperateId(user.getId());
             orderRefund.setOperateReason(authOperaReq.getReason());
             orderRefund.setUpdateTime(new Date());
-            updateById(orderRefund);
 
             if (authOperaReq.getPass()) {
                 //通过调用退款接口
@@ -220,7 +218,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     }
 
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<UserOrderRefundBill> orderRefund(String orderNo, String reason) {
         UserOrderVo detail = orderService.detail(orderNo, null);
 
@@ -289,12 +287,12 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 }
             }
         }
-
         return doOrderRefund(orderRefunds);
     }
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void refundPaymentCallBack(PaymentCallBack data) {
         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//退款成功
             paymentRefundSucceededHandle(data);
@@ -303,7 +301,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
-    private HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
+    @Transactional(rollbackFor = Exception.class)
+    HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())
                 .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded)
@@ -313,20 +312,22 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             throw new BizException("订单状态异常");
         }
 
-        //单号生成
-        Long billNo = idGeneratorService.generatorId("billNo");
-
         RefundBill refundBill = new RefundBill(payment.getOpenType(),
                 PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
         refundBill.setTradeNo(payment.getTransNo());
         refundBill.setPaymentNo(payment.getPaymentNo());
+
+        //单号生成
+        Long billNo = idGeneratorService.generatorId("billNo");
         refundBill.setRefundNo(billNo.toString());
+
         refundBill.setOrderAmt(payment.getPayAmt());
         refundBill.setRefundAmt(orderRefund.getActualAmount());
         refundBill.setReason(orderRefund.getReason());
 
         BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundBill);
         log.info("退款返回: {} ", JSONObject.toJSONString(refundBillBaseResult));
+
         //入退款单表
         UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
         orderRefundBill.setRefundId(orderRefund.getId());
@@ -340,6 +341,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             orderRefundBill.setPayFailMsg(refundBillBaseResult.getMsg());
         }
         refundBillService.save(orderRefundBill);
+        updateById(orderRefund);
         return HttpResponseResult.succeed(orderRefundBill);
     }
 
@@ -366,26 +368,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         one.setUpdateTime(new Date());
         refundBillService.updateById(one);
 
-        //处理业务
-        UserOrderRefund orderRefund = getById(one.getRefundId());
-        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
-            List<Long> ids = new ArrayList<>();
-            for (String id : orderRefund.getOredrDetilIds().split(",")) {
-                ids.add(Long.parseLong(id));
-            }
-            OrderDetailSearch search = new OrderDetailSearch();
-            search.setIds(ids);
-            search.setOrderNo(orderRefund.getOrderNo());
-            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
-
-            for (UserOrderDetailVo vo : userOrderDetails) {
-                Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
-                if (!Objects.isNull(refundAfterConsumer)) {
-                    refundAfterConsumer.accept(vo);
-                }
-            }
-
-        }
+        orderRefundSuccessBizHandle(one.getRefundId());
     }
 
     /***
@@ -413,8 +396,17 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         one.setUpdateTime(new Date());
         refundBillService.updateById(one);
 
+        orderRefundFailBizHandle(one.getRefundId());
+    }
+
+    /**
+     * 处理退款成功业务
+     *
+     * @param refundId 退款单id
+     */
+    private void orderRefundSuccessBizHandle(Long refundId) {
         //处理业务
-        UserOrderRefund orderRefund = getById(one.getRefundId());
+        UserOrderRefund orderRefund = getById(refundId);
         if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
             List<Long> ids = new ArrayList<>();
             for (String id : orderRefund.getOredrDetilIds().split(",")) {
@@ -426,12 +418,39 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
             List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
 
             for (UserOrderDetailVo vo : userOrderDetails) {
-                Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
                 if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
             }
+        }
+    }
 
+    /**
+     * 处理退款失败业务
+     *
+     * @param refundId 退款单id
+     */
+    private void orderRefundFailBizHandle(Long refundId) {
+        //处理业务
+        UserOrderRefund orderRefund = getById(refundId);
+
+        if (StringUtil.isEmpty(orderRefund.getOredrDetilIds())) {
+            List<Long> ids = new ArrayList<>();
+            for (String id : orderRefund.getOredrDetilIds().split(",")) {
+                ids.add(Long.parseLong(id));
+            }
+            OrderDetailSearch search = new OrderDetailSearch();
+            search.setIds(ids);
+            search.setOrderNo(orderRefund.getOrderNo());
+            List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
+
+            for (UserOrderDetailVo vo : userOrderDetails) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundFailed.get(vo.getGoodType());
+                if (!Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
         }
     }
 }