Jelajahi Sumber

完善保证金订单退款、扣除及超时处理
- 中标订单超时未支付时,扣除对应保证金并将拍品置为流拍
- 拍品保证金在拍品结束后按中标及支付结果执行退款或扣除
- 拍卖会保证金在整场结束后按订单结果执行退款或扣除
- 新增未支付保证金订单超时状态,拍品或拍卖会结束后置为超时
- 限制保证金状态仅按有效流转更新,避免重复处理或迟到支付覆盖超时状态
- 统一保证金订单状态

hr~ 3 minggu lalu
induk
melakukan
7d13b60a23

+ 19 - 6
bid/src/main/java/cn/hobbystocks/auc/task/BidTask.java

@@ -42,6 +42,7 @@ public class BidTask implements CacheMap {
     private static final String DEPOSIT_TYPE_AUCTION = "拍卖会";
     private static final Integer DEPOSIT_STATUS_WAITING_PAYMENT = 0;
     private static final Integer DEPOSIT_STATUS_PAID = 1;
+    private static final Integer DEPOSIT_STATUS_PENDING_REFUND = 5;
 
     // region params
 	private static final ConcurrentHashMap<String, ConcurrentHashMap<String, Live>> liveCacheMap = new ConcurrentHashMap<>();
@@ -276,7 +277,7 @@ public class BidTask implements CacheMap {
             Lot lot = lotMapper.selectLotById(order.getLotId());
             if (isIndividualDeposit(lot) && isTerminalLot(lot)) {
                 selectPendingDeposit(order.getUserId(), lot)
-                        .forEach(deposit -> depositOrderService.refundDepositOrder(deposit.getOrderNo()));
+                        .forEach(deposit -> depositOrderService.markRefundPending(deposit.getOrderNo()));
             }
             log.info("paid lot order synced, lotId={}", order.getLotId());
         }
@@ -408,6 +409,19 @@ public class BidTask implements CacheMap {
     //拍卖会结束发起退保证金,每五分钟执行一次
     @Scheduled(fixedRate = 1000*60*5)
     public void depositOrderRefund(){
+        refundPendingDepositOrders();
+        markRefundablePaidDepositOrders();
+        timeoutUnpaidDepositOrders();
+    }
+
+    private void refundPendingDepositOrders() {
+        DepositOrder waitingRefund = new DepositOrder();
+        waitingRefund.setStatus(DEPOSIT_STATUS_PENDING_REFUND);
+        depositOrderService.selectDepositOrder(waitingRefund)
+                .forEach(deposit -> depositOrderService.refundDepositOrder(deposit.getOrderNo()));
+    }
+
+    private void markRefundablePaidDepositOrders() {
         DepositOrder pending = new DepositOrder();
         pending.setStatus(DEPOSIT_STATUS_PAID);
         List<DepositOrder> depositOrders = depositOrderService.selectDepositOrder(pending);
@@ -418,7 +432,6 @@ public class BidTask implements CacheMap {
                 settleAuctionDeposit(deposit);
             }
         }
-        timeoutUnpaidDepositOrders();
     }
 
     private void timeoutUnpaidDepositOrders() {
@@ -452,13 +465,13 @@ public class BidTask implements CacheMap {
         Order winningOrder = orderService.getOne(query);
         if (Objects.isNull(winningOrder)) {
             if (!isWinningUser(deposit, lot)) {
-                depositOrderService.refundDepositOrder(deposit.getOrderNo());
+                depositOrderService.markRefundPending(deposit.getOrderNo());
             }
             return;
         }
         if (Objects.equals(lot.getPaid(), 1L)
                 || Constants.LOT_STATUS_CANCELLED.equals(lot.getStatus())) {
-            depositOrderService.refundDepositOrder(deposit.getOrderNo());
+            depositOrderService.markRefundPending(deposit.getOrderNo());
         } else if (Constants.LOT_STATUS_PASS.equals(lot.getStatus())) {
             depositOrderService.reduceDeposit(deposit.getOrderNo());
         }
@@ -475,7 +488,7 @@ public class BidTask implements CacheMap {
             return;
         }
         if (CollectionUtils.isEmpty(winningOrders)) {
-            depositOrderService.refundDepositOrder(deposit.getOrderNo());
+            depositOrderService.markRefundPending(deposit.getOrderNo());
             return;
         }
         for (Order winningOrder : winningOrders) {
@@ -489,7 +502,7 @@ public class BidTask implements CacheMap {
                 return;
             }
         }
-        depositOrderService.refundDepositOrder(deposit.getOrderNo());
+        depositOrderService.markRefundPending(deposit.getOrderNo());
     }
 
     private boolean hasWinningLotWithoutOrder(DepositOrder deposit, List<Order> winningOrders) {

+ 1 - 1
lot/src/main/java/cn/hobbystocks/auc/domain/DepositOrder.java

@@ -20,7 +20,7 @@ public class DepositOrder extends BaseEntity {
     private Long auctionId;
     private String name;
     private String depositType;
-    //保证金订单状态,0、待支付,1、已支付待退款,2、已退款,3、已扣款,4、超时
+    //保证金订单状态,0、待支付,1、已支付,2、已退款,3、已扣款,4、超时,5、待退款
     private Integer status;
     private Long amount;//订单金额
     private String orderNo;

+ 1 - 1
lot/src/main/java/cn/hobbystocks/auc/dto/DepositOrderDTO.java

@@ -33,6 +33,6 @@ public class DepositOrderDTO extends BaseEntity {
     //商家id
     @ApiModelProperty("商家id")
     private Long merchantId;
-    @ApiModelProperty("保证金订单状态:0、待支付,1、已支付待退款,2、已退款,3、已扣款,4、超时")
+    @ApiModelProperty("保证金订单状态:0、待支付,1、已支付,2、已退款,3、已扣款,4、超时,5、待退款")
     private Integer status;
 }

+ 6 - 0
lot/src/main/java/cn/hobbystocks/auc/service/DepositOrderService.java

@@ -22,6 +22,12 @@ public interface DepositOrderService extends IService<DepositOrder> {
      */
     void refundDepositOrder(String orderNo);
 
+    /**
+     * Mark a paid deposit order as waiting for refund.
+     * @param orderNo deposit order number
+     */
+    void markRefundPending(String orderNo);
+
     /**
      * 扣减保证金
      * @param orderNo 保证金订单编号

+ 11 - 1
lot/src/main/java/cn/hobbystocks/auc/service/impl/DepositOrderServiceImpl.java

@@ -42,6 +42,7 @@ public class DepositOrderServiceImpl extends ServiceImpl<DepositOrderMapper, Dep
     private static final Integer DEPOSIT_STATUS_WAITING_PAYMENT = 0;
     private static final Integer DEPOSIT_STATUS_PAID = 1;
     private static final Integer DEPOSIT_STATUS_TIMEOUT = 4;
+    private static final Integer DEPOSIT_STATUS_PENDING_REFUND = 5;
 
     @Override
     @Transactional
@@ -99,11 +100,20 @@ public class DepositOrderServiceImpl extends ServiceImpl<DepositOrderMapper, Dep
 //        return orderApi.refundDepositOrder(orderVO);
         this.lambdaUpdate()
                 .eq(DepositOrder::getOrderNo, orderNo)
-                .eq(DepositOrder::getStatus, DEPOSIT_STATUS_PAID)
+                .eq(DepositOrder::getStatus, DEPOSIT_STATUS_PENDING_REFUND)
                 .set(DepositOrder::getStatus, 2)
                 .update();
     }
 
+    @Override
+    public void markRefundPending(String orderNo) {
+        this.lambdaUpdate()
+                .eq(DepositOrder::getOrderNo, orderNo)
+                .eq(DepositOrder::getStatus, DEPOSIT_STATUS_PAID)
+                .set(DepositOrder::getStatus, DEPOSIT_STATUS_PENDING_REFUND)
+                .update();
+    }
+
     @Override
     public void reduceDeposit(String orderNo) {
 //        OrderVO orderVO=new OrderVO();