瀏覽代碼

Merge remote-tracking branch 'origin/master'

wujiefeng 1 年之前
父節點
當前提交
0dc4d18cbf

+ 1 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/RefundState.java

@@ -10,6 +10,7 @@ public enum RefundState {
     Refunding("退款中"),
     Refunded("已退款"),
     Refuse("已拒绝"),
+    Fail("退款失败"),
     ;
 
     @Getter

+ 3 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.server.core.domain.payment;
 
 import com.github.microservice.models.type.OrderFromType;
+import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
 import com.github.microservice.types.payment.PaymentDeviceType;
 import com.github.microservice.types.payment.PaymentType;
 import com.github.microservice.types.OrderModeType;
@@ -199,7 +200,7 @@ public class ExpenseFlow extends SuperMain {
     private Long payMillis = 0L;
 
     @Schema(description = "支付账单流水ID集合")
-    private List<String> transactionIds = new ArrayList<String>();
+    private List<TransactionLogModel> transactionIds = new ArrayList<TransactionLogModel>();
 
     //-----------------------退款 start--------------------------
 
@@ -231,7 +232,7 @@ public class ExpenseFlow extends SuperMain {
     private String refundNo;
 
     @Schema(description = "退款账单流量")
-    private List<String> refundTransactionIds = new ArrayList<String>();
+    private List<TransactionLogModel> refundTransactionIds = new ArrayList<TransactionLogModel>();
 
     //-------------------------结算信息 start ----------------
 

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -749,6 +749,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         if (expenseFlow.getSettlementState() == SettlementState.AlreadySettled) {
             return ResultContent.buildFail("订单已结算,不能退款");
         }
+        // 开始调用退款方法
         ResultContent resultContent = payCallService.refund(expenseFlow, param);
         if (resultContent.isFailed()) {
             return ResultContent.buildFail(resultContent.getMsg());

+ 12 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/OrderNoInfoService.java

@@ -40,15 +40,27 @@ public class OrderNoInfoService extends SuperService {
         orderNoInfo.setOrderNoType(orderNoType);
         orderNoInfo.setPaymentType(paymentType);
         orderNoInfo.setTtl(new Date(System.currentTimeMillis() + 24 * 7 * 60 * 60 * 100L));
+        orderNoInfo.setIsSuccess(Boolean.FALSE);
         orderNoInfoDao.save(orderNoInfo);
         return ResultContent.buildSuccess();
     }
 
+    public void markSuccess(String paymentNo) {
+        OrderNoInfo orderNoInfo = orderNoInfoDao.findByPaymentNo(paymentNo);
+        if (ObjectUtils.isNotEmpty(orderNoInfo)) {
+            orderNoInfo.setIsSuccess(Boolean.TRUE);
+            orderNoInfoDao.save(orderNoInfo);
+        }
+    }
+
     public OrderNoType getOrderNoType(String paymentNo) {
         OrderNoInfo orderNoInfo = orderNoInfoDao.findByPaymentNo(paymentNo);
         if (ObjectUtils.isEmpty(orderNoInfo)) {
             return OrderNoType.UnKnow;
         }
+        if (orderNoInfo.getIsSuccess() != null && orderNoInfo.getIsSuccess()) {
+            return OrderNoType.UnKnow;
+        }
         return orderNoInfo.getOrderNoType();
     }
 }

+ 72 - 38
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/PayCallService.java

@@ -40,7 +40,6 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 /**
  * @author TRX
@@ -178,7 +177,7 @@ public class PayCallService extends SuperService {
             // 关联参数
             String msg = "支付成功";
             List<TransactionLogModel> list = resultContent.getContent();
-            entity.setTransactionIds(list.stream().map(it -> it.getId()).collect(Collectors.toUnmodifiableList()));
+            entity.setTransactionIds(list);
             entity.setPaymentStatus(msg);
             entity.setIsPaySuccess(Boolean.TRUE);
             entity.setPayRemark(msg);
@@ -332,11 +331,11 @@ public class PayCallService extends SuperService {
      * @param paymentNo
      * @return
      */
-    public ResultContent unionFrictionlessPayFinish(String paymentNo,
-            com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent, String state) {
+    public ResultContent unionFrictionlessPayFinish(String paymentNo, com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent, String state) {
         if (StringUtils.isEmpty(paymentNo)) {
             return ResultContent.buildFail("paymentNo为空");
         }
+        orderNoInfoService.markSuccess(paymentNo);
         log.info("云闪付支付回调: {}", paymentNo);
         ExpenseFlow entity = expenseFlowDao.findTopByPaymentNo(paymentNo);
         PaymentProcess paymentProcess = paymentProcessDao.findTopByPaymentNoAndPaymentTypeOrderByCreateTimeDesc(paymentNo, PaymentType.UnionFrictionlessPay);
@@ -350,9 +349,7 @@ public class PayCallService extends SuperService {
                 paymentProcess.setIsPaying(Boolean.FALSE);
                 if (resultContent.getState() == ResultState.Success) {
                     List<TransactionLogModel> list = resultContent.getContent();
-                    if (ObjectUtils.isNotEmpty(list)) {
-                        entity.setTransactionIds(list.stream().map(it -> it.getId()).collect(Collectors.toUnmodifiableList()));
-                    }
+                    entity.setTransactionIds(list);
                 }
             } else {
                 entity.setOrderType(OrderState.PAID_ERROR);
@@ -364,6 +361,8 @@ public class PayCallService extends SuperService {
             }
             expenseFlowDao.save(entity);
             paymentProcessDao.save(paymentProcess);
+
+
         }
         return ResultContent.buildSuccess();
     }
@@ -414,34 +413,11 @@ public class PayCallService extends SuperService {
             return ResultContent.buildFail("数据为空");
         }
         if (entity.getPaymentType() == PaymentType.UserWallet) {
-            ResultContent<List<TransactionLogModel>> resultContent = walletRefund(entity, param);
-            if (resultContent.isSuccess()) {
-                entity.setIsRefund(Boolean.TRUE);
-                entity.setRefundRemark(param.getRemark());
-                entity.setRefundTime(System.currentTimeMillis());
-
-                List<TransactionLogModel> list = resultContent.getContent();
-                if (ObjectUtils.isNotEmpty(list)) {
-                    entity.setRefundTransactionIds(list.stream().map(it -> it.getId()).collect(Collectors.toUnmodifiableList()));
-                }
-                // 申请人
-                entity.setApplicant(getCurrentUserId());
-                // 退款人
-                entity.setRefundUserId(getCurrentUserId());
-                // 退款金额
-                entity.setRefundAMount(entity.getPayAmount());
-                // 订单状态
-                entity.setOrderType(OrderState.REFUNDED);
-                // 退款状态
-                entity.setRefundState(RefundState.Refunded);
-                entity.setRefuseRemark("退款成功");
-                expenseFlowDao.save(entity);
-                return ResultContent.buildSuccess();
-            } else {
-                return ResultContent.buildFail(resultContent.getMsg());
-            }
+            // 钱包退款
+            return walletRefund(entity, param);
         } else if (entity.getPaymentType() == PaymentType.UnionFrictionlessPay) {
-            unionFrictionlessPayRefund(entity, param);
+            // 云闪付退款
+            return unionFrictionlessPayRefund(entity, param);
         }
         return ResultContent.buildFail("不支持退款");
     }
@@ -452,32 +428,68 @@ public class PayCallService extends SuperService {
      * @param entity
      * @return
      */
-    public ResultContent<List<TransactionLogModel>> walletRefund(ExpenseFlow entity, ExpenseRefundParam param) {
+    public ResultContent walletRefund(ExpenseFlow entity, ExpenseRefundParam param) {
         String refundNo = NextNoUtil.getNextPaymentNo(null);
         entity.setRefundNo(refundNo);
         orderNoInfoService.saveInfo(refundNo, OrderNoType.Refund, entity.getPaymentType());
 
         com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.refund(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), refundNo, entity.getPayAmount(), param.getRemark());
         if (resultContent.getState() == ResultState.Success) {
-            return ResultContent.buildSuccess(resultContent.getContent());
+            entity.setIsRefund(Boolean.TRUE);
+            entity.setRefundRemark(param.getRemark());
+            entity.setRefundTime(System.currentTimeMillis());
+
+            List<TransactionLogModel> list = resultContent.getContent();
+            if (ObjectUtils.isNotEmpty(list)) {
+                entity.setRefundTransactionIds(list);
+            }
+            // 申请人
+            entity.setApplicant(getCurrentUserId());
+            // 退款人
+            entity.setRefundUserId(getCurrentUserId());
+            // 退款金额
+            entity.setRefundAMount(entity.getPayAmount());
+            // 订单状态
+            entity.setOrderType(OrderState.REFUNDED);
+            // 退款状态
+            entity.setRefundState(RefundState.Refunded);
+            entity.setRefuseRemark("退款成功");
+            expenseFlowDao.save(entity);
+            return ResultContent.buildSuccess();
         } else {
             return ResultContent.buildFail(String.format("退款失败:%s", resultContent.getMsg()));
         }
     }
 
     /**
+     * 云闪付开始退款
+     *
      * @param entity
      * @param param
      * @return
      */
-    public ResultContent<List<TransactionLogModel>> unionFrictionlessPayRefund(ExpenseFlow entity, ExpenseRefundParam param) {
+    public ResultContent unionFrictionlessPayRefund(ExpenseFlow entity, ExpenseRefundParam param) {
         String refundNo = NextNoUtil.getNextPaymentNo(null);
         entity.setRefundNo(refundNo);
         String paymentNo = entity.getPaymentNo();
         orderNoInfoService.saveInfo(refundNo, OrderNoType.Refund, entity.getPaymentType());
 
-        ResultContent resultContent = chinaumsSenselessPayService.refund(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), entity.getPayAmount(), paymentNo, refundNo, param.getRemark());
+        BigDecimal payAmount = entity.getPayAmount();
+        ResultContent resultContent = chinaumsSenselessPayService.refund(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), payAmount, paymentNo, refundNo, param.getRemark());
         if (resultContent.isSuccess()) {
+            entity.setIsRefund(Boolean.FALSE);
+            entity.setRefundRemark(param.getRemark());
+            entity.setRefundTime(System.currentTimeMillis());
+            // 申请人
+            entity.setApplicant(getCurrentUserId());
+            // 退款人
+            entity.setRefundUserId(getCurrentUserId());
+            // 退款金额
+            entity.setRefundAMount(payAmount);
+            // 退款状态
+            entity.setRefundState(RefundState.Refunding);
+            entity.setRefuseRemark("退款中");
+            expenseFlowDao.save(entity);
             return ResultContent.buildSuccess(resultContent.getContent());
         } else {
             return ResultContent.buildFail(String.format("退款失败:%s", resultContent.getMsg()));
@@ -497,7 +509,29 @@ public class PayCallService extends SuperService {
      * @return
      */
     public ResultContent unionFrictionlessPayRefundFinish(String paymentNo, com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent, String state) {
+        // 退款完成
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(paymentNo);
+        orderNoInfoService.markSuccess(paymentNo);
+
+        if (ObjectUtils.isNotEmpty(expenseFlow)) {
+            if (state.equals("TRADE_REFUND")) {
+                // 退款流程 成功
+                expenseFlow.setIsRefund(Boolean.TRUE);
+                expenseFlow.setRefundState(RefundState.Refunded);
+                expenseFlow.setRefuseRemark("退款成功");
+                expenseFlow.setOrderType(OrderState.REFUNDED);
 
+                if (resultContent.getState() == ResultState.Success) {
+                    expenseFlow.setRefundTransactionIds(resultContent.getContent());
+                }
+            } else {
+                // 退款失败
+                expenseFlow.setIsRefund(Boolean.TRUE);
+                expenseFlow.setRefundState(RefundState.Fail);
+                expenseFlow.setRefuseRemark("退款失败");
+            }
+            expenseFlowDao.save(expenseFlow);
+        }
         return ResultContent.buildSuccess();
     }