소스 검색

更新!

TRX 1 년 전
부모
커밋
964c3fd7dd

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/payment/RefundMethodType.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.client.type.payment;
+
+import lombok.Getter;
+
+/**
+ * 退款方式
+ */
+public enum RefundMethodType {
+    BusRefund("商家退款"),
+    UseRefund("用户申请退款"),
+    ;
+
+    @Getter
+    private String remark;
+
+    RefundMethodType(String remark) {
+        this.remark = remark;
+    }
+}

+ 22 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/RefundRecordDao.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.server.core.dao.payment;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.payment.extend.ExpenseFlowDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.payment.RefundRecord;
+
+/**
+ * 订单退款Dao
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface RefundRecordDao extends MongoDao<RefundRecord> {
+
+    RefundRecord findTopById(String id);
+
+    RefundRecord findTopByPaymentNo(String paymentNo);
+
+    RefundRecord findTopByRefundNo(String refundNo);
+
+}

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

@@ -237,6 +237,10 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "退款账单流量")
     private List<TransactionLogModel> refundTransactionIds = new ArrayList<TransactionLogModel>();
 
+    @Schema(description = "最新关联的退款数据")
+    @DBRef(lazy = true)
+    private RefundRecord refundRecord;
+
     //-------------------------结算信息 start ----------------
 
     @Schema(description = "结算状态")

+ 73 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/RefundRecord.java

@@ -0,0 +1,73 @@
+package com.zhongshu.card.server.core.domain.payment;
+
+import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
+import com.zhongshu.card.client.type.RefundState;
+import com.zhongshu.card.client.type.payment.RefundMethodType;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 订单退款记录
+ *
+ * @author TRX
+ * @date 2024/11/19
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class RefundRecord extends SuperMain {
+
+    @Indexed
+    @Schema(description = "支付订单号")
+    private String paymentNo;
+
+    @Indexed
+    @Schema(description = "退款订单号")
+    private String refundNo;
+
+    @Schema(description = "退款状态")
+    private RefundState refundState;
+
+    @Schema(description = "退款方式")
+    private RefundMethodType refundMethodType = RefundMethodType.BusRefund;
+
+    //--------------申请人 start---------------------
+    @Schema(description = "退款申请人userId")
+    private String applicant;
+
+    @Schema(description = "退款金额")
+    private BigDecimal refundAMount;
+
+    @Schema(description = "申请退款时间")
+    private Long refundTime;
+
+    @Schema(description = "申请退款备注")
+    private String refundRemark;
+
+    //-------------------审核 start--------------------
+
+    @Schema(description = "操作退款用户userId(审核人)")
+    private String refundUserId;
+
+    @Schema(description = "审核时间")
+    private Long examineTime;
+
+    @Schema(description = "退款处理备注")
+    private String refuseRemark;
+
+    @Schema(description = "退款账单流量")
+    private List<TransactionLogModel> refundTransactionIds = new ArrayList<TransactionLogModel>();
+
+}

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

@@ -20,6 +20,7 @@ import com.zhongshu.card.server.core.dao.payment.PaymentProcessDao;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
 import com.zhongshu.card.server.core.domain.payment.PaymentProcess;
+import com.zhongshu.card.server.core.domain.payment.RefundRecord;
 import com.zhongshu.card.server.core.domain.schedule.ScheduleTaskConfig;
 import com.zhongshu.card.server.core.model.pay.UnionFrictionlessPayFinishModel;
 import com.zhongshu.card.server.core.service.base.CommonService;
@@ -84,6 +85,9 @@ public class PayCallService extends SuperService {
     @Autowired
     private OrderNoInfoService orderNoInfoService;
 
+    @Autowired
+    private RefundRecordService refundRecordService;
+
     /**
      * 统一调用支付服务
      *
@@ -452,7 +456,18 @@ public class PayCallService extends SuperService {
         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());
+        // 退款记录
+        RefundRecord refundRecord = new RefundRecord();
+        refundRecord.setPaymentNo(entity.getPaymentNo());
+        // 申请人
+        refundRecord.setApplicant(getCurrentUserId());
+        BigDecimal payAmount = entity.getPayAmount();
+        refundRecord.setRefundAMount(payAmount);
+        refundRecord.setRefundTime(System.currentTimeMillis());
+        refundRecord.setRefundRemark(param.getRemark());
+        refundRecord.setRefundNo(refundNo);
+
+        com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.refund(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), refundNo, payAmount, param.getRemark());
         if (resultContent.getState() == ResultState.Success) {
             entity.setIsRefund(Boolean.TRUE);
             entity.setRefundRemark(param.getRemark());
@@ -474,8 +489,20 @@ public class PayCallService extends SuperService {
             entity.setRefundState(RefundState.Refunded);
             entity.setRefuseRemark("退款成功");
             expenseFlowDao.save(entity);
+
+            // 保存退款记录
+            refundRecord.setRefundUserId(getCurrentUserId());
+            refundRecord.setExamineTime(System.currentTimeMillis());
+            refundRecord.setRefuseRemark("退款成功");
+            refundRecord.setRefundState(RefundState.Refunded);
+            refundRecordService.saveEntity(refundRecord);
             return ResultContent.buildSuccess();
         } else {
+            refundRecord.setRefundUserId(getCurrentUserId());
+            refundRecord.setExamineTime(System.currentTimeMillis());
+            refundRecord.setRefuseRemark(resultContent.getMsg());
+            refundRecord.setRefundState(RefundState.Fail);
+            refundRecordService.saveEntity(refundRecord);
             return ResultContent.buildFail(String.format("退款失败:%s", resultContent.getMsg()));
         }
     }

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

@@ -0,0 +1,32 @@
+package com.zhongshu.card.server.core.service.payment;
+
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.dao.payment.RefundRecordDao;
+import com.zhongshu.card.server.core.domain.payment.RefundRecord;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 退款记录管理
+ *
+ * @author TRX
+ * @date 2024/11/19
+ */
+@Slf4j
+@Service
+public class RefundRecordService extends SuperService {
+
+    @Autowired
+    private RefundRecordDao refundRecordDao;
+
+    public ResultContent saveEntity(RefundRecord entity) {
+        if (ObjectUtils.isNotEmpty(entity)) {
+            refundRecordDao.save(entity);
+        }
+        return ResultContent.buildSuccess();
+    }
+
+}