liujc 1 gadu atpakaļ
vecāks
revīzija
70fe557312

+ 10 - 4
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -1,10 +1,7 @@
 package com.yonge.cooleshow.teacher.task;
 
 import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
-import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
-import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import io.swagger.annotations.ApiOperation;
@@ -33,6 +30,8 @@ public class TaskController extends BaseController {
     @Autowired
     private LiveRoomService liveRoomService;
 
+    @Autowired
+    private DivBackRecordService divBackRecordService;
 
     /***
      * 查询所有老师统计数据
@@ -89,4 +88,11 @@ public class TaskController extends BaseController {
         scheduleService.teacherSalaryTask();
         return HttpResponseResult.succeed();
     }
+
+
+    @GetMapping("/divBack")
+    public HttpResponseResult<Object> divBack() {
+        divBackRecordService.divBack();
+        return HttpResponseResult.succeed();
+    }
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/DivBackRecord.java

@@ -26,6 +26,11 @@ public class DivBackRecord implements Serializable {
 	    @TableId(value = "id_",type = IdType.AUTO)
 	    private Long id;
 
+
+    @ApiModelProperty("支付三方")
+    @TableField(value = "payment_vendor_")
+    private String  paymentVendor;
+
     @ApiModelProperty("分账记录ID") 
 	@TableField(value = "payment_div_member_record_id_")
     private Long paymentDivMemberRecordId;

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java

@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -21,6 +23,8 @@ import java.math.BigDecimal;
  */
 @Data
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @ApiModel(" PaymentDivMemberRecord-分账子账户记录表")
 @TableName("payment_div_member_record")
 public class PaymentDivMemberRecord implements Serializable {

+ 5 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/DivBackRecordService.java

@@ -39,5 +39,9 @@ public interface DivBackRecordService extends IService<DivBackRecord>  {
      * @return Boolean
      */
      Boolean update(DivBackRecordWrapper.DivBackRecord divBackRecord);
-     
+
+    /**
+     * 分账回归
+     */
+    void divBack();
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java

@@ -4,7 +4,6 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.RefundResp;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
-import com.yonge.cooleshow.common.enums.payment.EPaymentType;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -85,4 +84,6 @@ public interface UserPaymentCoreService {
     void refundPaymentCallback(RefundResp refundResp);
 
     void refundPayment(String orderNo,  String reason);
+
+    void refundOnly(String reason, String orderNo);
 }

+ 85 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/DivBackRecordServiceImpl.java

@@ -3,13 +3,27 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideReq;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.DivideResp;
+import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
+import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
+import com.yonge.cooleshow.common.enums.EPayerType;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import com.yonge.cooleshow.biz.dal.entity.DivBackRecord;
 import com.yonge.cooleshow.biz.dal.wrapper.DivBackRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.DivBackRecordMapper;
-import com.yonge.cooleshow.biz.dal.service.DivBackRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 /**
  * 分账归还记录
@@ -19,12 +33,27 @@ import com.yonge.cooleshow.biz.dal.service.DivBackRecordService;
 @Service
 public class DivBackRecordServiceImpl extends ServiceImpl<DivBackRecordMapper, DivBackRecord> implements DivBackRecordService {
 
-	/**
+    @Autowired
+    private TenantMemberService tenantMemberService;
+
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
+
+    @Autowired
+    private PaymentDivMemberRecordService paymentDivMemberRecordService;
+
+    @Autowired
+    private UserPaymentOrderService userPaymentOrderService;
+
+    @Autowired
+    private UserPaymentCoreService userPaymentCoreService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return DivBackRecord
      */
-	@Override
+    @Override
     public DivBackRecord detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -41,15 +70,15 @@ public class DivBackRecordServiceImpl extends ServiceImpl<DivBackRecordMapper, D
         
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
      * @param divBackRecord DivBackRecordWrapper.DivBackRecord
      * @return Boolean
      */
     @Override
-    public Boolean add(DivBackRecordWrapper.DivBackRecord divBackRecord) {    	
-        
+    public Boolean add(DivBackRecordWrapper.DivBackRecord divBackRecord) {
+
         return this.save(JSON.parseObject(divBackRecord.jsonString(), DivBackRecord.class));
     }
 
@@ -63,4 +92,54 @@ public class DivBackRecordServiceImpl extends ServiceImpl<DivBackRecordMapper, D
 
         return this.updateById(JSON.parseObject(divBackRecord.jsonString(), DivBackRecord.class));       
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void divBack() {
+        // 查询分账回归在等待中的状态 ,遍历调用查询分账回归接口 回归成功的 修改回归状态,在调用退款接口
+        List<DivBackRecord> list = this.lambdaQuery()
+            .eq(DivBackRecord::getStatus, DivideBackStatus.PROCESSING.name())
+            .list();
+
+        for (DivBackRecord divBackRecord : list) {
+
+            PaymentDivMemberRecord divMemberRecord = paymentDivMemberRecordService.getById(divBackRecord.getId());
+            if (divMemberRecord == null){
+                continue;
+            }
+            UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService
+                .getUserPaymentOrderByOrderNo(divMemberRecord.getOrderNo());
+            if (paymentOrder == null) {
+                continue;
+            }
+
+
+            BasePaymentService paymentService = paymentServiceContext.getPaymentService(divBackRecord.getPaymentVendor());
+
+            DivideReq.MemberDivideBack memberDivideBack = DivideReq.MemberDivideBack.builder()
+                .payerName(EPayerType.YEEPAY.getDesc())
+                .memberId(divMemberRecord.getMemberId())
+                .platformPayeeMemberId(paymentService.getPaymentConfig().getMerchantId())
+                .divideBackOrderNo(divBackRecord.getDivideBackOrderNo())
+                .payOrderNo(paymentOrder.getOrderNo())
+                .transNo(paymentOrder.getTransNo())
+                .build();
+            DivideResp.DivideBack divideBack = paymentService.queryDivideBack(tenantMemberService.getMerchantConfig(divBackRecord.getPaymentVendor()), memberDivideBack);
+            if (divideBack == null) {
+                continue;
+            }
+            if (divideBack.getStatus() == DivideBackStatus.SUCCESS) {
+                // 修改回归状态
+                divBackRecord.setStatus(DivideBackStatus.SUCCESS.name());
+                this.updateById(divBackRecord);
+                // 调用退款接口
+                userPaymentCoreService.refundOnly("退款",paymentOrder.getOrderNo());
+            } else if (divideBack.getStatus() == DivideBackStatus.FAIL) {
+                // 修改回归状态
+                divBackRecord.setStatus(DivideBackStatus.FAIL.name());
+                this.updateById(divBackRecord);
+            }
+        }
+
+    }
 }

+ 67 - 43
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -1283,49 +1283,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
             }
 
             if (refundFlag) {
-                // 提交退款申请记录
-                UserOrderRefund userRefundOrder = new UserOrderRefund();
-                userRefundOrder.setUserId(paymentOrder.getId());
-                userRefundOrder.setOrderId(paymentOrder.getId());
-                userRefundOrder.setOrderNo(paymentOrder.getOrderNo());
-                userRefundOrder.setOredrDetilIds(detail.getOrderDetailList().stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
-                userRefundOrder.setStatus(AuthStatusEnum.PASS);
-                userRefundOrder.setApplyAmount(paymentOrder.getPaymentCashAmount());
-                userRefundOrder.setActualAmount(paymentOrder.getPaymentCashAmount());
-                userRefundOrder.setReason(reason);
-                userOrderRefundService.save(userRefundOrder);
-
-                //入退款单表
-                UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
-                orderRefundBill.setRefundId(userRefundOrder.getId());
-                orderRefundBill.setBillNo(IdWorker.getIdStr());
-                orderRefundBill.setRefundAmt(userRefundOrder.getActualAmount());
-
-
-                RefundOrder refundOrder = new RefundOrder();
-                refundOrder.setUserId(paymentOrder.getUserId().toString());
-                refundOrder.setMerOrderNo(orderRefundBill.getBillNo());
-                refundOrder.setRefundAmount(orderRefundBill.getRefundAmt());
-                refundOrder.setOrderAmount(paymentOrder.getPaymentCashAmount());
-                refundOrder.setReason(reason);
-                refundOrder.setTransNo(paymentOrder.getTransNo());
-                refundOrder.setPaymentOrderNo(paymentOrder.getOrderNo());
-
-                // 执行状态锁定
-                String lockNameInner = redisCacheService.getPaymentCacheKey(orderRefundBill.getBillNo());
-                DistributedLock.of(redissonClient).runIfLockCanGet(lockNameInner, () -> {
-                    RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor()).refund(refundOrder);
-                    // 申请请求失败
-                    if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
-                        orderRefundBill.setStatus(TradeStatusEnum.failed);
-                        orderRefundBill.setPayFailMsg(refundResp.getMsg());
-                    } else {
-                        orderRefundBill.setTransNo(refundResp.getTransNo());
-                        orderRefundBill.setStatus(TradeStatusEnum.pending);
-                    }
-                    userOrderRefundBillService.save(orderRefundBill);
-
-                }, 10L, TimeUnit.SECONDS);
+                refundOnly(reason, paymentOrder.getOrderNo());
             }
 
             //处理退款业务
@@ -1334,6 +1292,71 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
     }
 
+    /**
+     * 退款
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void refundOnly(String reason, String orderNo) {
+
+        // 查询订单信息,支付状态
+        UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo(orderNo);
+        if (Objects.isNull(paymentOrder)) {
+            throw new BizException("订单信息不存在");
+        }
+        if (!OrderStatusEnum.PAID.getCode().equals(paymentOrder.getStatus().getCode())) {
+            throw  new BizException("订单状态异常");
+        }
+        UserOrderVo detail = userOrderService.detail(paymentOrder.getId());
+        if (Objects.isNull(detail)) {
+            throw new BizException("订单信息不存在");
+        }
+
+        // 提交退款申请记录
+        UserOrderRefund userRefundOrder = new UserOrderRefund();
+        userRefundOrder.setUserId(paymentOrder.getId());
+        userRefundOrder.setOrderId(paymentOrder.getId());
+        userRefundOrder.setOrderNo(paymentOrder.getOrderNo());
+        userRefundOrder.setOredrDetilIds(detail.getOrderDetailList().stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
+        userRefundOrder.setStatus(AuthStatusEnum.PASS);
+        userRefundOrder.setApplyAmount(paymentOrder.getPaymentCashAmount());
+        userRefundOrder.setActualAmount(paymentOrder.getPaymentCashAmount());
+        userRefundOrder.setReason(reason);
+        userOrderRefundService.save(userRefundOrder);
+
+        //入退款单表
+        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill();
+        orderRefundBill.setRefundId(userRefundOrder.getId());
+        orderRefundBill.setBillNo(IdWorker.getIdStr());
+        orderRefundBill.setRefundAmt(userRefundOrder.getActualAmount());
+
+
+        RefundOrder refundOrder = new RefundOrder();
+        refundOrder.setUserId(paymentOrder.getUserId().toString());
+        refundOrder.setMerOrderNo(orderRefundBill.getBillNo());
+        refundOrder.setRefundAmount(orderRefundBill.getRefundAmt());
+        refundOrder.setOrderAmount(paymentOrder.getPaymentCashAmount());
+        refundOrder.setReason(reason);
+        refundOrder.setTransNo(paymentOrder.getTransNo());
+        refundOrder.setPaymentOrderNo(paymentOrder.getOrderNo());
+
+        // 执行状态锁定
+        String lockNameInner = redisCacheService.getPaymentCacheKey(orderRefundBill.getBillNo());
+        DistributedLock.of(redissonClient).runIfLockCanGet(lockNameInner, () -> {
+            RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor()).refund(refundOrder);
+            // 申请请求失败
+            if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
+                orderRefundBill.setStatus(TradeStatusEnum.failed);
+                orderRefundBill.setPayFailMsg(refundResp.getMsg());
+            } else {
+                orderRefundBill.setTransNo(refundResp.getTransNo());
+                orderRefundBill.setStatus(TradeStatusEnum.pending);
+            }
+            userOrderRefundBillService.save(orderRefundBill);
+
+        }, 10L, TimeUnit.SECONDS);
+    }
+
     private boolean saveDivBackRecord(UserPaymentOrderWrapper.UserPaymentOrder paymentOrder, PaymentDivMemberRecord record) {
 
 
@@ -1344,6 +1367,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         divBackRecord.setPaymentDivMemberRecordId(record.getId());
         divBackRecord.setDivideBackOrderNo(IdWorker.getIdStr());
         divBackRecord.setTimes(1);
+        divBackRecord.setPaymentVendor(paymentOrder.getPaymentVendor());
 
         // 分账数据
         DivideReq.DivideBackDetail divideBackDetail = DivideReq.DivideBackDetail.builder()

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/DivBackRecordMapper.xml

@@ -7,6 +7,7 @@
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ AS id
+        , t.payment_vendor_ AS paymentVendor
         , t.payment_div_member_record_id_ AS paymentDivMemberRecordId
         , t.divide_back_order_no_ AS divideBackOrderNo
         , t.divide_back_trans_no_ AS divideBackTransNo