Browse Source

Merge branch 'local/share_1008' into online

liujc 1 year ago
parent
commit
3c68e3acbf
21 changed files with 636 additions and 53 deletions
  1. 4 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  2. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  3. 10 4
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java
  4. 20 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/DivBackTask.java
  5. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/DivBackRecord.java
  6. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java
  7. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/DivBackRecordMapper.java
  8. 47 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/DivBackRecordService.java
  9. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberRecordService.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  11. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  12. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  13. 152 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/DivBackRecordServiceImpl.java
  14. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  15. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  16. 147 43
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  17. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/DivBackRecordWrapper.java
  18. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  19. 27 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/DivBackRecordMapper.xml
  20. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberRecordMapper.xml
  21. 11 4
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

+ 4 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java

@@ -72,4 +72,8 @@ public interface TeacherFeignService {
      */
     @GetMapping("/open/teacher/identity/{ID}")
     HttpResponseResult<Boolean> userTeacherIdentityInfo(@PathVariable("ID") Long userId);
+
+
+    @GetMapping("/task/divBack")
+    public HttpResponseResult<Object> divBack();
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java

@@ -52,4 +52,9 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
     public HttpResponseResult<Boolean> userTeacherIdentityInfo(Long userId) {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Object> divBack() {
+        return null;
+    }
 }

+ 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();
+    }
 }

+ 20 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/DivBackTask.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DivBackTask extends BaseTask {
+
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = teacherFeignService.divBack();
+    }
+}

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

@@ -0,0 +1,66 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+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.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 分账归还记录
+ * 2023-10-18 10:59:05
+ */
+@Data
+@ApiModel(" DivBackRecord-分账归还记录")
+@TableName("div_back_record")
+public class DivBackRecord implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @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;
+
+    @ApiModelProperty("分账归还订单号") 
+	@TableField(value = "divide_back_order_no_")
+    private String divideBackOrderNo;
+
+    @ApiModelProperty("分账归还三方号") 
+	@TableField(value = "divide_back_trans_no_")
+    private String divideBackTransNo;
+
+    @ApiModelProperty("分账归还状态") 
+	@TableField(value = "status_")
+    private String status;
+
+    @ApiModelProperty("失败原因") 
+	@TableField(value = "reason_")
+    private String reason;
+
+    @ApiModelProperty("尝试次数")
+    @TableField(value = "times_")
+    private Integer times;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 9 - 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 {
@@ -54,6 +58,11 @@ public class PaymentDivMemberRecord implements Serializable {
 	@TableField(value = "trans_no_")
     private String transNo;
 
+
+    @ApiModelProperty("分账对象")
+    @TableField(value = "div_member_json_")
+    private String divMemberJson;
+
     @ApiModelProperty("分账金额") 
 	@TableField(value = "amount_")
     private BigDecimal amount;

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/DivBackRecordMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.DivBackRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.DivBackRecordWrapper;
+
+/**
+ * 分账归还记录
+ * 2023-10-18 10:59:05
+ */
+@Repository
+public interface DivBackRecordMapper extends BaseMapper<DivBackRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<DivBackRecordWrapper.DivBackRecord>
+	 * @param param DivBackRecordWrapper.DivBackRecordQuery
+	 * @return List<DivBackRecordWrapper.DivBackRecord>
+	 */
+	List<DivBackRecord> selectPage(@Param("page") IPage<DivBackRecord> page, @Param("param") DivBackRecordWrapper.DivBackRecordQuery param);
+	
+}

+ 47 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/DivBackRecordService.java

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.DivBackRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.DivBackRecord;
+
+/**
+ * 分账归还记录
+ * 2023-10-18 10:59:05
+ */
+public interface DivBackRecordService extends IService<DivBackRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return DivBackRecord
+     */
+	DivBackRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<DivBackRecord>
+     * @param query DivBackRecordWrapper.DivBackRecordQuery
+     * @return IPage<DivBackRecord>
+     */
+    IPage<DivBackRecord> selectPage(IPage<DivBackRecord> page, DivBackRecordWrapper.DivBackRecordQuery query);
+	
+    /**
+     * 添加
+     * @param divBackRecord DivBackRecordWrapper.DivBackRecord
+     * @return Boolean
+     */
+     Boolean add(DivBackRecordWrapper.DivBackRecord divBackRecord);   
+
+    /**
+     * 更新
+     * @param divBackRecord DivBackRecordWrapper.DivBackRecord
+     * @return Boolean
+     */
+     Boolean update(DivBackRecordWrapper.DivBackRecord divBackRecord);
+
+    /**
+     * 分账回归
+     */
+    void divBack();
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberRecordService.java

@@ -95,4 +95,12 @@ public interface PaymentDivMemberRecordService extends IService<PaymentDivMember
      * 活动
      */
     void activity(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 根据订单查询分账记录
+     *
+     * @param orderNo 订单编号
+     * @return
+     */
+    List<PaymentDivMemberRecord> getByOrderNo(String orderNo);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -84,4 +84,6 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	HttpResponseResult<UserOrderRefundBill> orderRefound(String orderNo);
 
 	void orderRefundSuccessBizHandle(Long refundId);
+
+    void orderRefundSuccessBizHandleByOrderNo(String orderNo);
 }

+ 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);
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.beust.jcommander.internal.Lists;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;

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

@@ -0,0 +1,152 @@
+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 org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 分账归还记录
+ * 2023-10-18 10:59:05
+ */
+@Slf4j
+@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
+    public DivBackRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<DivBackRecord>
+     * @param query DivBackRecordWrapper.DivBackRecordQuery
+     * @return IPage<DivBackRecord>
+     */
+    @Override
+    public IPage<DivBackRecord> selectPage(IPage<DivBackRecord> page, DivBackRecordWrapper.DivBackRecordQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param divBackRecord DivBackRecordWrapper.DivBackRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(DivBackRecordWrapper.DivBackRecord divBackRecord) {
+
+        return this.save(JSON.parseObject(divBackRecord.jsonString(), DivBackRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param divBackRecord DivBackRecordWrapper.DivBackRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(DivBackRecordWrapper.DivBackRecord divBackRecord){
+
+        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.getPaymentDivMemberRecordId());
+            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;
+            try {
+                divideBack = paymentService.queryDivideBack(tenantMemberService.getMerchantConfig(divBackRecord.getPaymentVendor()), memberDivideBack);
+                if (divideBack == null) {
+                    continue;
+                }
+            } catch (Exception e) {
+                log.error("分账回归查询异常", e);
+                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);
+            }
+        }
+
+    }
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java

@@ -780,6 +780,13 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
     }
 
+    @Override
+    public List<PaymentDivMemberRecord> getByOrderNo(String orderNo) {
+        return this.lambdaQuery()
+            .eq(PaymentDivMemberRecord::getOrderNo, orderNo)
+            .list();
+    }
+
 
     // 写入数据库
     private void saveData(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap, Map<Long, BigDecimal> teacherMap, Map<Long, BigDecimal> bizMap, BigDecimal serviceFeeAmount) {
@@ -938,6 +945,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
                 .divOrderNo(divideOrderNo)
                 .transNo(newestPayment != null ? newestPayment.getTransNo() : null)
                 .amount(amount)
+                .divMemberJson(CollectionUtils.isNotEmpty(divide.getDivMembers())?JSON.toJSONString(divide.getDivMembers()):"")
                 .tenantEnterFlag(divide.getStatus()!=null && divide.getStatus().equals(PaymentStatus.SUCCESSED))
                 .status("SUCCESS")
                 .feeFlag(true)

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

@@ -637,6 +637,31 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
+
+    /**
+     * 处理退款业务
+     *
+     * @param orderNo 退款单id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void orderRefundSuccessBizHandleByOrderNo(String orderNo) {
+        //处理业务
+        OrderDetailSearch search = new OrderDetailSearch();
+        search.setOrderNo(orderNo);
+        List<UserOrderDetailVo> userOrderDetails = orderDetailService.selectList(search);
+        UserOrder order = userOrderService.getByOrderNo(orderNo);
+
+        for (UserOrderDetailVo vo : userOrderDetails) {
+            Consumer<UserOrderDetailVo> refundAfterConsumer = refundSuccess.get(vo.getGoodType());
+            if (!Objects.isNull(refundAfterConsumer)) {
+                refundAfterConsumer.accept(vo);
+            }
+            vo.setPaymentVersion(order.getPaymentVersion());
+            accountHandle(vo);
+        }
+    }
+
     /**
      * 处理退款后账户
      *

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

@@ -12,6 +12,7 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 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.*;
+import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
@@ -131,6 +132,11 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     private UserOrderRefundBillService userOrderRefundBillService;
 
 
+    @Autowired
+    private TenantMemberService tenantMemberService;
+
+    @Autowired
+    private DivBackRecordService divBackRecordService;
 
 
     // 订单商品参数校验,获取订单支付金额
@@ -1261,55 +1267,153 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         // 执行状态锁定
         String lockName = redisCacheService.getPaymentCacheKey(paymentOrder.getOrderNo());
         DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
-            // 提交退款申请记录
-            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);
+
+            // 如果是易宝的订单,查询分账是否给到子账户,没有给子账户的直接退款
+
+            // 分账给子账户的 先 分账归还,如果归还成功,再退款,归还失败,不退款,退款后的逻辑还是继续走
+
+            boolean refundFlag = true;
+            if (paymentOrder.getPaymentVendor().equals(EPayerType.YEEPAY.getDesc())) {
+                List<PaymentDivMemberRecord> records = paymentDivMemberRecordService.getByOrderNo(paymentOrder.getOrderNo());
+
+                for (PaymentDivMemberRecord record : records) {
+                    if (record.getTenantEnterFlag()) {
+
+                        refundFlag = saveDivBackRecord(paymentOrder, record);
+
+                    }
                 }
-                userOrderRefundBillService.save(orderRefundBill);
+            }
+
+            if (refundFlag) {
+                refundOnly(reason, paymentOrder.getOrderNo());
+            }
+
+            //处理退款业务
+            userOrderRefundService.orderRefundSuccessBizHandleByOrderNo(paymentOrder.getOrderNo());
+        }, 10L, TimeUnit.SECONDS);
 
-                //处理退款业务
-               userOrderRefundService.orderRefundSuccessBizHandle(userRefundOrder.getId());
+    }
 
-            }, 10L, TimeUnit.SECONDS);
+    /**
+     * 退款
+     */
+    @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) {
+
 
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor());
+
+        boolean refundFlag = true;
+        DivBackRecord divBackRecord = new DivBackRecord();
+        divBackRecord.setPaymentDivMemberRecordId(record.getId());
+        divBackRecord.setDivideBackOrderNo(IdWorker.getIdStr());
+        divBackRecord.setTimes(1);
+        divBackRecord.setPaymentVendor(paymentOrder.getPaymentVendor());
+
+        // 分账数据
+        DivideReq.DivideBackDetail divideBackDetail = DivideReq.DivideBackDetail.builder()
+            .amount(record.getAmount())
+            .divideDetailNo(record.getTransNo())
+            .divideBackReason("订单退款")
+            .build();
+
+        List<DivideResp.DivMember> divMembers = JSON.parseArray(record.getDivMemberJson(), DivideResp.DivMember.class);
+        if (CollectionUtils.isNotEmpty(divMembers)) {
+            divideBackDetail.setDivideDetailNo(divMembers.get(0).getDetailNo());
+        }
+
+        DivideReq.MemberDivideBack memberDivideBack = DivideReq.MemberDivideBack.builder()
+            .payerName(EPayerType.YEEPAY.getDesc())
+            .memberId(record.getMemberId())
+            .devOrderNo(record.getDivOrderNo())
+            .platformPayeeMemberId(paymentService.getPaymentConfig().getMerchantId())
+            .divideBackOrderNo(divBackRecord.getDivideBackOrderNo())
+            .payOrderNo(paymentOrder.getOrderNo())
+            .transNo(paymentOrder.getTransNo())
+            .divideBackDetail(Lists.newArrayList(divideBackDetail))
+            .build();
+
+
+        try {
+
+            DivideResp.DivideBack divideBack = paymentService.divideBack(tenantMemberService
+                .getMerchantConfig(paymentOrder.getPaymentVendor()), memberDivideBack);
+            if (divideBack.getStatus() != DivideBackStatus.SUCCESS) {
+                refundFlag = false;
+            }
+            divBackRecord.setReason(divideBack.getReason());
+            divBackRecord.setDivideBackTransNo(divideBack.getDivideBackTransNo());
+            divBackRecord.setStatus(divideBack.getStatus().name());
+
+        }catch (Exception e) {
+            log.error("分账回归失败orderNo={}", memberDivideBack.getDivideBackOrderNo(), e);
+            refundFlag = false;
+            divBackRecord.setReason(e.getMessage());
+        }
+        divBackRecordService.save(divBackRecord);
+        return refundFlag;
     }
 
 }

+ 63 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/DivBackRecordWrapper.java

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 分账归还记录
+ * 2023-10-18 10:59:05
+ */
+@ApiModel(value = "DivBackRecordWrapper对象", description = "分账归还记录查询对象")
+public class DivBackRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" DivBackRecordQuery-分账归还记录")
+    public static class DivBackRecordQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static DivBackRecordQuery from(String json) {
+            return JSON.parseObject(json, DivBackRecordQuery.class);
+        }
+    }  
+
+	@ApiModel(" DivBackRecord-分账归还记录")
+    public static class DivBackRecord {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static DivBackRecord from(String json) {
+            return JSON.parseObject(json, DivBackRecord.class);
+        }
+	}
+
+}

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

@@ -792,7 +792,7 @@
         FROM course_schedule_student_payment p
         LEFT JOIN sys_user u ON p.user_id_=u.id_
         LEFT JOIN course_schedule c ON p.course_id_=c.id_
-        LEFT JOIN student_attendance a ON p.user_id_=a.student_id_  and a.course_group_type_ = c.type_
+        LEFT JOIN student_attendance a ON p.user_id_=a.student_id_  and a.course_schedule_id_ = c.id_
         <where>
             <if test="courseId !=null">
                 AND p.course_id_=#{courseId}

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

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.mapper.DivBackRecordMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <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
+        , t.status_ AS status
+        , t.reason_ AS reason
+        , t.times_ AS times
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        </sql> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.DivBackRecord">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM div_back_record t
+	</select>
+    
+</mapper>

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

@@ -11,6 +11,7 @@
         , t.order_no_ AS orderNo
         , t.div_order_no_ AS divOrderNo
         , t.trans_no_ AS transNo
+        , t.div_member_json_ AS divMemberJson
         , t.amount_ AS amount
         , t.tenant_enter_flag_ AS tenantEnterFlag
         , t.status_ AS status

+ 11 - 4
cooleshow-user/user-teacher/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,9 @@ public class TaskController extends BaseController {
     @Autowired
     private LiveRoomService liveRoomService;
 
+    @Autowired
+    private DivBackRecordService divBackRecordService;
+
 
     /***
      * 查询所有老师统计数据
@@ -89,4 +89,11 @@ public class TaskController extends BaseController {
         scheduleService.teacherSalaryTask();
         return HttpResponseResult.succeed();
     }
+
+
+    @GetMapping("/divBack")
+    public HttpResponseResult<Object> divBack() {
+        divBackRecordService.divBack();
+        return HttpResponseResult.succeed();
+    }
 }