liujc vor 2 Jahren
Ursprung
Commit
03f7cc6c0a
37 geänderte Dateien mit 1861 neuen und 94 gelöschten Zeilen
  1. 58 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAccountRecordController.java
  2. 5 12
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  3. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java
  4. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java
  5. 80 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java
  6. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  7. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  8. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAccountRecordMapper.java
  9. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  11. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  12. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberRecordService.java
  13. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberService.java
  14. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentMerchantConfigService.java
  15. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAccountRecordService.java
  16. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  17. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonPurchaseRecordService.java
  18. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  19. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  20. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  21. 827 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  22. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberServiceImpl.java
  23. 27 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentMerchantConfigServiceImpl.java
  24. 104 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAccountRecordServiceImpl.java
  25. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  26. 6 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  27. 197 31
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  28. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentOrderServiceImpl.java
  29. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  30. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  31. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderVo.java
  32. 135 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAccountRecordWrapper.java
  33. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java
  34. 59 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  35. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PaymentDivMemberRecordMapper.xml
  36. 70 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAccountRecordMapper.xml
  37. 32 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java

+ 58 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAccountRecordController.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.excel.UserAccountRecordExport;
+import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.easyexcel.ExcelUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/tenantAccountRecord")
+@Api(value = "机构账户流水表", tags = "机构账户流水表")
+public class TenantAccountRecordController extends BaseController {
+
+    @Autowired
+    private TenantAccountRecordService tenantAccountRecordService;
+
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "机构流水", notes = "TenantAccountRecordQuery")
+    @PreAuthorize("@pcs.hasPermissions('tenantAccountRecord/page')")
+    public HttpResponseResult<PageInfo<TenantAccountRecordWrapper.TenantAccountRecord>> page(@RequestBody TenantAccountRecordWrapper.TenantAccountRecordQuery query) {
+
+
+        IPage<TenantAccountRecordWrapper.TenantAccountRecord> pages = tenantAccountRecordService.selectPage(PageUtil.getPage(query), query);
+
+        // 统计数据
+        TenantAccountRecordWrapper.TenantAccountRecordStat statistics = tenantAccountRecordService.getStatistics(query);
+        if (statistics == null) {
+            statistics = new TenantAccountRecordWrapper.TenantAccountRecordStat();
+        }
+
+        PageInfo<TenantAccountRecordWrapper.TenantAccountRecord> tenantAccountRecordPageInfo = PageUtil.pageInfo(pages);
+        tenantAccountRecordPageInfo.setStatInfo(statistics);
+        return succeed(tenantAccountRecordPageInfo);
+    }
+
+}

+ 5 - 12
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -1,17 +1,6 @@
 package com.yonge.cooleshow.admin.task;
 
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanEvaluationService;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.service.CustomerServiceBatchSendingService;
-import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
-import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
-import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
-import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
-import com.yonge.cooleshow.biz.dal.service.UserOrderService;
-import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -71,6 +60,9 @@ public class TaskController extends BaseController {
     @Autowired
     private CustomerServiceBatchSendingService customerServiceBatchSendingService;
 
+    @Autowired
+    private UserPaymentCoreService userPaymentCoreService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -80,6 +72,7 @@ public class TaskController extends BaseController {
     @GetMapping("/pollingOrder")
     public HttpResponseResult pollingOrder() {
         userOrderService.pollingOrder();
+        userPaymentCoreService.scanPaymentTimeoutOrderRecord();
         return succeed();
     }
 

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java

@@ -51,7 +51,18 @@ public class UserAccountRecordSearch extends QueryInfo{
 	@ApiModelProperty("购买学生 ")
 	private String username;
 
-	public Long getUserId() {
+    @ApiModelProperty("机构ID")
+    private Long TenantId;
+
+    public Long getTenantId() {
+        return TenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        TenantId = tenantId;
+    }
+
+    public Long getUserId() {
 		return userId;
 	}
 

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PaymentDivMemberRecord.java

@@ -4,6 +4,7 @@ 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.Builder;
 import lombok.Data;
 
 import io.swagger.annotations.ApiModel;
@@ -19,6 +20,7 @@ import java.math.BigDecimal;
  * 2023-07-28 15:45:03
  */
 @Data
+@Builder
 @ApiModel(" PaymentDivMemberRecord-分账子账户记录表")
 @TableName("payment_div_member_record")
 public class PaymentDivMemberRecord implements Serializable {
@@ -43,6 +45,10 @@ public class PaymentDivMemberRecord implements Serializable {
 	@TableField(value = "order_no_")
     private String orderNo;
 
+    @ApiModelProperty("分账订单号")
+    @TableField(value = "div_order_no_")
+    private String divOrderNo;
+
     @ApiModelProperty("三方流水号") 
 	@TableField(value = "trans_no_")
     private String transNo;
@@ -61,7 +67,7 @@ public class PaymentDivMemberRecord implements Serializable {
 
     @ApiModelProperty("手续费标识") 
 	@TableField(value = "fee_flag_")
-    private String feeFlag;
+    private Boolean feeFlag;
 
     @ApiModelProperty("手续费") 
 	@TableField(value = "fee_amt_")

+ 80 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java

@@ -0,0 +1,80 @@
+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.Builder;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 机构流水表
+ * 2023-07-31 13:47:30
+ */
+@Data
+@Builder
+@ApiModel(" TenantAccountRecord-机构流水表")
+@TableName("tenant_account_record")
+public class TenantAccountRecord implements Serializable {
+
+    @ApiModelProperty("id") 
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("机构id") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("交易金额") 
+	@TableField(value = "trans_amount_")
+    private BigDecimal transAmount;
+
+    @ApiModelProperty("收支类型:IN、收入 OUT、支出") 
+	@TableField(value = "in_or_out_")
+    private String inOrOut;
+
+    @ApiModelProperty("入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消") 
+	@TableField(value = "post_status_")
+    private String postStatus;
+
+    @ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润") 
+	@TableField(value = "biz_type_")
+    private String bizType;
+
+    @ApiModelProperty("业务id") 
+	@TableField(value = "biz_id_")
+    private Long bizId;
+
+    @ApiModelProperty("业务名称") 
+	@TableField(value = "biz_name_")
+    private String bizName;
+
+    @ApiModelProperty("订单号") 
+	@TableField(value = "order_no_")
+    private String orderNo;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("是否异常入账") 
+	@TableField(value = "err_flag_")
+    private Integer errFlag;
+
+    @ApiModelProperty("异常信息") 
+	@TableField(value = "err_msg_")
+    private String errMsg;
+
+}

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

@@ -44,6 +44,10 @@ public class UserOrder implements Serializable {
     @TableField(value = "payment_version_")
     private EPaymentVersion paymentVersion;
 
+    @ApiModelProperty("机构ID ")
+    @TableField(value = "tenant_id_")
+    private Long tenantId;
+
     @ApiModelProperty("买家id ")
     @TableField(value = "user_id_")
     private Long userId;

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -21,6 +21,7 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     ACTI_REGIST("活动报名"),
     WITHDRAWAL("结算"),
     ALBUM("专辑"),
+    TENANT_ALBUM("机构专辑"),
 
     LIVE_SHARE("直播课分润"),
     VIDEO_SHARE("视频课分润"),

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantAccountRecordMapper.java

@@ -0,0 +1,29 @@
+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.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
+
+/**
+ * 机构流水表
+ * 2023-07-31 13:47:30
+ */
+@Repository
+public interface TenantAccountRecordMapper extends BaseMapper<TenantAccountRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<TenantAccountRecordWrapper.TenantAccountRecord>
+	 * @param param TenantAccountRecordWrapper.TenantAccountRecordQuery
+	 * @return List<TenantAccountRecordWrapper.TenantAccountRecord>
+	 */
+	List<TenantAccountRecordWrapper.TenantAccountRecord> selectPage(@Param("page") IPage<TenantAccountRecordWrapper.TenantAccountRecord> page,
+                                                                    @Param("param") TenantAccountRecordWrapper.TenantAccountRecordQuery param);
+
+    TenantAccountRecordWrapper.TenantAccountRecordStat getStatistics(@Param("param") TenantAccountRecordWrapper.TenantAccountRecordQuery query);
+}

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

@@ -144,6 +144,8 @@ public interface CourseGroupService extends IService<CourseGroup> {
      */
     void buyLiveCourseSuccess(UserOrderDetailVo orderParam);
 
+    void buyLiveSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup);
+
     /**
      * 学生购买直播课程-取消-回调
      */

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

@@ -224,6 +224,8 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      */
     Integer getWeekStudentRepliedCourseSchedule(Long userId);
 
+    void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo);
+
     void courseRemind();
 
     /**

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -35,7 +35,9 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -235,6 +237,15 @@ public interface MusicSheetService extends IService<MusicSheet> {
     boolean sendBuyMessage(Long teacherId, Long studentId, Long musicSheetId, ClientEnum orderClient, OrderTypeEnum orderType);
 
     /**
+     * 保存购买记录
+     *
+     * @param userOrderDetailVo 订单信息
+     * @param actualPrice       付款价格
+     * @param serviceFeeAmount  服务费
+     */
+    void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount);
+
+    /**
      * 订单生产后,创建记录
      *
      * @param userOrderDetailVo

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

@@ -2,10 +2,13 @@ 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.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.entity.PaymentDivMemberRecord;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -49,4 +52,44 @@ public interface PaymentDivMemberRecordService extends IService<PaymentDivMember
 
     //小程序首页订单详情
     PaymentDivMemberRecordWrapper.OrderDetailDto getOrderDetail(String orderNo,Long tenantId);
+
+    /**
+     * 专辑分账
+     *
+     * @param userPaymentOrder 订单
+     */
+    void tenantAlbum(UserOrderDetailVo userPaymentOrder);
+
+    /**
+     * 曲目分账
+     *
+     */
+    void musicSheet(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 陪练课
+     */
+    void practiceCourse(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 直播课
+     */
+    void liveCourse(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 视频课
+     *
+     */
+    void videoCourse(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * vip
+     *
+     */
+    void vip(UserOrderDetailVo userOrderDetailVo);
+
+    /**
+     * 活动
+     */
+    void activity(UserOrderDetailVo userOrderDetailVo);
 }

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentDivMemberService.java

@@ -39,5 +39,13 @@ public interface PaymentDivMemberService extends IService<PaymentDivMember>  {
      * @return Boolean
      */
      Boolean update(PaymentDivMemberWrapper.PaymentDivMember paymentDivMember);
-     
+
+    /**
+     * 子账户
+     *
+     * @param appId
+     * @param tenantId
+     * @return
+     */
+    PaymentDivMember getByAppIdAndTenantId(String appId, Long tenantId);
 }

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PaymentMerchantConfigService.java

@@ -39,5 +39,16 @@ public interface PaymentMerchantConfigService extends IService<PaymentMerchantCo
      * @return Boolean
      */
      Boolean update(PaymentMerchantConfigWrapper.PaymentMerchantConfig paymentMerchantConfig);
-     
+
+    /**
+     * 根据机构查询三方汇付主账户
+     *
+     * @param tenantId
+     * @return
+     */
+    PaymentMerchantConfig getByTenantId(Long tenantId);
+
+    PaymentMerchantConfig getDefault();
+
+    PaymentMerchantConfig getByPaymentVendor(String paymentVendor);
 }

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantAccountRecordService.java

@@ -0,0 +1,45 @@
+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.TenantAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantAccountRecord;
+
+/**
+ * 机构流水表
+ * 2023-07-31 13:47:30
+ */
+public interface TenantAccountRecordService extends IService<TenantAccountRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantAccountRecord
+     */
+	TenantAccountRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantAccountRecord>
+     * @param query TenantAccountRecordWrapper.TenantAccountRecordQuery
+     * @return IPage<TenantAccountRecord>
+     */
+    IPage<TenantAccountRecordWrapper.TenantAccountRecord> selectPage(IPage<TenantAccountRecordWrapper.TenantAccountRecord> page,
+                                                                     TenantAccountRecordWrapper.TenantAccountRecordQuery query);
+	
+    /**
+     * 添加
+     * @param tenantAccountRecord TenantAccountRecordWrapper.TenantAccountRecord
+     * @return Boolean
+     */
+     Boolean add(TenantAccountRecordWrapper.TenantAccountRecord tenantAccountRecord);   
+
+    /**
+     * 更新
+     * @param tenantAccountRecord TenantAccountRecordWrapper.TenantAccountRecord
+     * @return Boolean
+     */
+     Boolean update(TenantAccountRecordWrapper.TenantAccountRecord tenantAccountRecord);
+
+    TenantAccountRecordWrapper.TenantAccountRecordStat getStatistics(TenantAccountRecordWrapper.TenantAccountRecordQuery query);
+}

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java

@@ -70,4 +70,10 @@ public interface UserPaymentCoreService {
      */
     void scanPaymentTimeoutOrderRecord();
 
+    /**
+     * 检测订单支付方式
+     *
+     * @param payTypeReq UserPaymentOrderWrapper.OrderPayTypeReq
+     */
+    UserPaymentOrderWrapper.OrderPayTypeResp orderPayType(UserPaymentOrderWrapper.OrderPayTypeReq payTypeReq);
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VideoLessonPurchaseRecordService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonPurchaseRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
@@ -28,4 +29,6 @@ public interface VideoLessonPurchaseRecordService extends IService<VideoLessonPu
      *
      */
     void buyVideoCourse(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo);
+
+    void videoSend(Long teacherId, Long studentId, VideoLessonGroup lesson);
 }

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

@@ -956,7 +956,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @param studentPayment 学生购买信息
      * @param courseGroup    课程组信息
      */
-    private void buyLiveSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup) {
+    @Override
+    public void buyLiveSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup) {
         //查询老师信息
         SysUser teacherInfo = getSysUser(courseGroup.getTeacherId());
         //查询学生信息

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

@@ -1476,6 +1476,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/5/6
      */
+    @Override
     public void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo) {
         //查询老师&学生信息
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);

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

@@ -1115,7 +1115,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param actualPrice       付款价格
      * @param serviceFeeAmount  服务费
      */
-    private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
+    @Transactional
+    @Override
+    public void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
                 userOrderDetailVo.getUserId(),
                 userOrderDetailVo.getBizId(),

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

@@ -1,18 +1,52 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yonge.cooleshow.biz.dal.wrapper.TenantPersonStatWrapper;
+import com.beust.jcommander.internal.Lists;
+import com.google.common.collect.Maps;
+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.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
+import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseRelationTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.wrapper.*;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseRelationWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
+import com.yonge.cooleshow.common.enums.EStatus;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
+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.PaymentDivMemberRecord;
-import com.yonge.cooleshow.biz.dal.wrapper.PaymentDivMemberRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.PaymentDivMemberRecordMapper;
-import com.yonge.cooleshow.biz.dal.service.PaymentDivMemberRecordService;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 /**
  * 分账子账户记录表
@@ -22,12 +56,89 @@ import java.util.List;
 @Service
 public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMemberRecordMapper, PaymentDivMemberRecord> implements PaymentDivMemberRecordService {
 
-	/**
+    @Autowired
+    private PaymentDivMemberService paymentDivMemberService;
+
+    @Autowired
+    private PaymentMerchantConfigService paymentMerchantConfigService;
+
+    @Autowired
+    private TenantAccountRecordService tenantAccountRecordService;
+
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
+
+    @Autowired
+    private PaymentDivMemberRecordService paymentDivMemberRecordService;
+
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+
+    @Autowired
+    private UserOrderService userOrderService;
+
+    @Autowired
+    private UserAccountService userAccountService;
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private CourseScheduleStudentPaymentDao paymentDao;
+
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
+
+    @Autowired
+    private VideoLessonPurchaseRecordDao videoLessonPurchaseRecordDao;
+
+    @Autowired
+    private UserOrderDao userOrderDao;
+
+    @Autowired
+    private VideoLessonGroupDao videoLessonGroupDao;
+
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
+
+    @Autowired
+    private VideoLessonPurchaseRecordService videoLessonPurchaseRecordService;
+
+    @Autowired
+    private MemberPriceSettingsService memberPriceSettingsService;
+    @Autowired
+    private ActivityPlanService activityPlanService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return PaymentDivMemberRecord
      */
-	@Override
+    @Override
     public PaymentDivMemberRecord detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -44,15 +155,15 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
      * @param paymentDivMemberRecord PaymentDivMemberRecordWrapper.PaymentDivMemberRecord
      * @return Boolean
      */
     @Override
-    public Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord) {    	
-        
+    public Boolean add(PaymentDivMemberRecordWrapper.PaymentDivMemberRecord paymentDivMemberRecord) {
+
         return this.save(JSON.parseObject(paymentDivMemberRecord.jsonString(), PaymentDivMemberRecord.class));
     }
 
@@ -76,4 +187,709 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     public PaymentDivMemberRecordWrapper.OrderDetailDto getOrderDetail(String orderNo,Long tenantId) {
         return baseMapper.getOrderDetail(orderNo,tenantId);
     }
+
+    /**
+     * 专辑分账
+     *
+     * @param userPaymentOrder 订单
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void tenantAlbum(UserOrderDetailVo userPaymentOrder) {
+
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 计算商品分账数据
+        if (userPaymentOrder.getOrderClient().equals(ClientEnum.STUDENT)) {
+
+            // 专辑金额
+            TenantAlbumWrapper.TenantAlbumContent tenantAlbumContent = JSON
+                    .parseObject(userPaymentOrder.getBizContent(), TenantAlbumWrapper.TenantAlbumContent.class);
+
+            tenantdivMap.merge(-1L, tenantAlbumContent.getOriginalPrice(), BigDecimal::add);
+
+
+            BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice());
+
+            tenantdivMap.merge(userPaymentOrder.getTenantId(), tenantAmount, BigDecimal::add);
+            tenantdivMap.merge(-1L, tenantAmount, BigDecimal::subtract);
+
+        }
+
+        // 计算老师分润数据  平台的真实收益
+        BigDecimal platformFee = tenantdivMap.getOrDefault(-1L,BigDecimal.ZERO);
+
+        saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, platformFee);
+
+
+    }
+
+    /**
+     * 曲目分账
+     *
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void musicSheet(UserOrderDetailVo userPaymentOrder) {
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        // 计算商品分账数据
+        // 曲目服务费比例
+        String musicSheetServiceFee = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
+        BigDecimal serviceFee = new BigDecimal(musicSheetServiceFee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        //支付金额
+        BigDecimal actualPrice = userPaymentOrder.getActualPrice();
+        BigDecimal expectPrice = userPaymentOrder.getExpectPrice();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = expectPrice.multiply(serviceFee).subtract(userPaymentOrder.getCouponAmount()).setScale(2, RoundingMode.HALF_UP);
+        if (serviceFeeAmount.compareTo(BigDecimal.ZERO) <0) {
+            serviceFeeAmount = BigDecimal.ZERO;
+        }
+
+        // 保存购买记录
+        musicSheetService.addMusicSheetPurchaseRecord(userPaymentOrder, actualPrice, serviceFeeAmount);
+
+        // 曲目判断老师收入
+        if (userPaymentOrder.getOrderType().equals(OrderTypeEnum.MUSIC)) {
+            MusicSheet musicSheet = musicSheetService.getById(userPaymentOrder.getBizId());
+            if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+
+                // 老师收入
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+
+                // 判断分润给机构 还是给老师
+                Teacher teacher = teacherService.getById(musicSheet.getUserId());
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    // 分润给机构
+                    tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
+                    tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
+                    serviceFeeAmount = tenantdivMap.get(-1L);
+                } else {
+                    // 分润给老师
+                    bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
+                }
+            } else {
+                serviceFeeAmount = actualPrice;
+            }
+        }
+
+        // 消息通知
+        CompletableFuture.runAsync(() -> {
+                musicSheetService.sendBuyMessage(userPaymentOrder.getMerchId(), userPaymentOrder.getUserId(),
+                        userPaymentOrder.getBizId(), userPaymentOrder.getOrderClient(), userPaymentOrder.getOrderType());
+            }
+        );
+
+
+        saveData(userPaymentOrder, tenantdivMap, teacherMap,bizMap, serviceFeeAmount);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void practiceCourse(UserOrderDetailVo userPaymentOrder) {
+
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = BigDecimal.ZERO;
+
+        log.info("buyPracticeCourseSuccess  param:{}", JSON.toJSONString(userPaymentOrder));
+        String orderNo = userPaymentOrder.getOrderNo();
+        List<CourseScheduleStudentPaymentVo> paymentList = paymentDao.selectPaymentList(orderNo);
+        if (CollectionUtils.isEmpty(paymentList)) {
+            throw new BizException("订单不存在!");
+        }
+
+        //lock_改为0,课程组状态改为ING
+        List<Long> scheduleIds = paymentList.stream().map(CourseScheduleStudentPayment::getCourseId).collect(Collectors.toList());
+        courseScheduleService.getDao().updateLock(scheduleIds);
+        UpdateWrapper<CourseGroup> warp = new UpdateWrapper<>();
+        warp.set("status_", "ING").eq("id_", paymentList.get(0).getCourseGroupId());
+        courseGroupService.update(warp);
+
+        //查询陪练课服务费
+        String practiceServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE);
+        BigDecimal practiceServiceRate = new BigDecimal(practiceServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+
+        //写course_schedule_teacher_salary
+        Long teacherId = null;
+        Long studentId = null;
+        Date now = new Date();
+        List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
+        for (CourseScheduleStudentPaymentVo payment : paymentList) {
+            BigDecimal expectPrice = payment.getExpectPrice();//预计价格
+
+            CourseScheduleTeacherSalary teacherSalary = new CourseScheduleTeacherSalary();
+            teacherSalary.setTeacherId(payment.getTeacherId());
+            teacherSalary.setStudentId(payment.getUserId());
+            teacherSalary.setCourseScheduleId(payment.getCourseId());
+            teacherSalary.setCourseGroupType(payment.getCourseType());
+            teacherSalary.setCourseGroupId(payment.getCourseGroupId());
+            teacherSalary.setClassNum(payment.getClassNum());
+            teacherSalary.setExpectSalary(expectPrice);//预计薪水
+            BigDecimal actualSalary = expectPrice.subtract(expectPrice.multiply(practiceServiceRate)).setScale(2, RoundingMode.HALF_UP);
+            teacherSalary.setActualSalary(actualSalary);//实际薪水(扣除手续费)
+            teacherSalary.setReduceSalary(expectPrice.subtract(actualSalary));//扣除薪水 = 预计 - 实际
+            teacherSalary.setReduceSalaryRemark(SysConfigConstant.PRACTICE_SERVICE_FEE);//扣除原因
+            teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
+            teacherSalary.setCreateTime(now);
+
+            if (teacherSalary.getExpectSalary().compareTo(BigDecimal.ZERO) > 0) {
+                teacherSalaryList.add(teacherSalary);
+            }
+
+            teacherId = payment.getTeacherId();
+            studentId = payment.getUserId();
+        }
+        if (CollectionUtils.isNotEmpty(teacherSalaryList)) {
+            courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
+            log.info("buyPracticeCourseSuccess ok");
+
+            // 老师收入总金额
+            BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 判断分润给机构 还是给老师
+            Teacher teacher = teacherService.getById(teacherId);
+            if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                // 分润给机构
+                tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
+                tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
+                serviceFeeAmount = tenantdivMap.get(-1L);
+            } else {
+                // 分润给老师
+                bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
+            }
+
+            saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
+        }
+
+        Set<Long> studentIds = new HashSet();
+        studentIds.add(studentId);
+        try {
+            imUserFriendService.saveUserFriend(teacherId, studentIds);
+            log.info("保存用户通讯录成功,teacherId:{},studentIds:{}", teacherId, studentIds);
+        } catch (Exception e) {
+            log.error("保存用户通讯录失败,teacherId:{},studentIds:{},e:{}", teacherId, studentIds, e);
+        }
+
+        //消息推送
+        try {
+            courseScheduleService.practiceSend(paymentList.get(0).getTeacherId(), userPaymentOrder.getUserId(), paymentList.size() + "", orderNo);
+        } catch (Exception e) {
+            log.error("陪练课消息推送失败");
+        }
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void liveCourse(UserOrderDetailVo userPaymentOrder) {
+
+
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = BigDecimal.ZERO;
+
+        log.info("buyLiveCourseSuccess param :{}", JSON.toJSONString(userPaymentOrder));
+        String orderNo = userPaymentOrder.getOrderNo();
+        //更新课程组的购买人数+1
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
+        );
+        CourseScheduleStudentPayment studentPayment;
+        if (CollectionUtils.isEmpty(studentPaymentList)) {
+            log.info("buyLiveCourseSuccess >>> 订单不存在!orderParam: {}", JSON.toJSONString(userPaymentOrder));
+            throw new BizException("订单不存在");
+        } else {
+            studentPayment = studentPaymentList.get(0);
+        }
+        //课程组信息
+        CourseGroup courseGroup = courseGroupService.getOne(Wrappers.<CourseGroup>lambdaQuery()
+                .eq(CourseGroup::getId, studentPayment.getCourseGroupId()));
+        if (Objects.isNull(courseGroup)) {
+            log.info("buyLiveCourseSuccess >>> 课程组不存在!orderParam: {}", JSON.toJSONString(userPaymentOrder));
+            throw new BizException("课程组不存在");
+        }
+        //更新课程组的购买人数+1
+        courseGroupService.getDao().opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
+
+        // 课程组 人数 + 1
+        courseGroup.setPreStudentNum(courseGroup.getPreStudentNum() + 1);
+        //查询课程组课程列表
+        List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
+        //课程总金额
+        BigDecimal totalExpectPrice = WrapperUtil.sumList(studentPaymentList, CourseScheduleStudentPayment::getExpectPrice);
+        //查询直播课服务费
+        String liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
+        BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        //总课酬  1 - (1 * 手续费率)
+        BigDecimal totalRatePrice = totalExpectPrice.subtract(totalExpectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
+        //获取每节课的实际课酬 key 课堂数  value 课酬
+        Map<Integer, BigDecimal> singerActualCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
+        //获取每节课的预计原课酬 key 课堂数  value 课酬
+        Map<Integer, BigDecimal> singerExpectCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalExpectPrice);
+        //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
+        Date now = new Date();
+        List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
+        courseList.forEach(course -> {
+            CourseScheduleTeacherSalary teacherSalary = new CourseScheduleTeacherSalary();
+            teacherSalary.setTeacherId(course.getTeacherId());
+            teacherSalary.setStudentId(studentPayment.getUserId());
+            teacherSalary.setCourseScheduleId(course.getId());
+            teacherSalary.setCourseGroupType(course.getType());
+            teacherSalary.setCourseGroupId(course.getCourseGroupId());
+            teacherSalary.setClassNum(course.getClassNum());
+            teacherSalary.setCreateTime(now);
+            teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
+            //预计课酬
+            BigDecimal ex = singerExpectCourseSalary.get(course.getClassNum());
+            //实际课酬
+            BigDecimal ac = singerActualCourseSalary.get(course.getClassNum());
+            teacherSalary.setExpectSalary(ex);
+            teacherSalary.setActualSalary(ac);
+            //预计课酬-实际课酬 = 扣除费用
+            teacherSalary.setReduceSalary(ex.subtract(ac));
+            //备注是为直播课手续费
+            teacherSalary.setReduceSalaryRemark(SysConfigConstant.LIVE_SERVICE_RATE);
+            if (teacherSalary.getExpectSalary().compareTo(BigDecimal.ZERO) > 0) {
+                teacherSalaryList.add(teacherSalary);
+            }
+        });
+        if(CollectionUtils.isNotEmpty(teacherSalaryList)){
+            courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
+
+            // 老师收入总金额
+            BigDecimal teacherAmount = teacherSalaryList.stream().map(CourseScheduleTeacherSalary::getActualSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 判断分润给机构 还是给老师
+            Teacher teacher = teacherService.getById(courseGroup.getTeacherId());
+            if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                // 分润给机构
+                tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
+                tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
+                serviceFeeAmount = tenantdivMap.get(-1L);
+            } else {
+                // 分润给老师
+                bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
+            }
+
+            saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
+        }
+        log.info("buyLiveCourseSuccess ok");
+        //课程购买成功后进行消息推送
+        courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void videoCourse(UserOrderDetailVo userPaymentOrder) {
+
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = BigDecimal.ZERO;
+
+        log.info("buyVideoCourseSuccess  param:{}", JSON.toJSONString(userPaymentOrder));
+        String orderNo = userPaymentOrder.getOrderNo();
+        VideoLessonPurchaseRecord purchaseRecord = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+                .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
+        if (purchaseRecord == null) {
+            throw new BizException("课程组购买记录不存在!");
+        }
+
+        //查询订单状态
+        UserOrder userOrder = userOrderDao.selectOne(Wrappers.<UserOrder>lambdaQuery()
+                .eq(UserOrder::getOrderNo, orderNo));
+        if (userOrder == null) {
+            throw new BizException("订单不存在!");
+        }
+        //修改支付状态
+        videoLessonPurchaseRecordDao.updateStatus(orderNo, OrderStatusEnum.PAID.getCode());
+        //查询组信息
+        VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
+        //记录流水
+
+        //查询视频课服务费
+        BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
+                .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        //支付金额
+        BigDecimal expectPrice = userPaymentOrder.getExpectPrice();
+        //服务费
+        serviceFeeAmount = expectPrice.multiply(liveServiceRate).setScale(2, RoundingMode.HALF_UP);
+        //老师入账金额
+        BigDecimal teacherAmount = expectPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
+        // 判断分润给机构 还是给老师
+        Teacher teacher = teacherService.getById(lessonGroup.getTeacherId());
+        if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+            // 分润给机构
+            tenantdivMap.merge(teacher.getTenantId(), teacherAmount, BigDecimal::add);
+            tenantdivMap.merge(-1L, teacherAmount, BigDecimal::subtract);
+            serviceFeeAmount = tenantdivMap.get(-1L);
+        } else {
+            // 分润给老师
+            bizMap.merge(userPaymentOrder.getBizId(), teacherAmount, BigDecimal::add);
+        }
+
+        saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
+
+
+
+        videoLessonPurchaseRecordService.videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
+
+        // 赠品曲目、专辑插入用户曲目购买记录表
+        List<CourseRelationMusicAlbum> musicAlbums = courseRelationMusicAlbumService.lambdaQuery()
+                .eq(CourseRelationMusicAlbum::getCourseGroupId, lessonGroup.getId())
+                .eq(CourseRelationMusicAlbum::getDelFlog, EStatus.ENABLE.getValue())
+                .eq(CourseRelationMusicAlbum::getUseRelationType, CourseRelationTypeEnum.GIFT)
+                .list();
+
+        List<Long> giftIds = musicAlbums.stream()
+                .map(CourseRelationMusicAlbum::getId).distinct().collect(Collectors.toList());
+
+        Map<Long, Long> purchaseIdMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(giftIds)) {
+
+            // 查询用户购买记录
+            purchaseIdMap = musicSheetPurchaseRecordService.lambdaQuery()
+                    .eq(MusicSheetPurchaseRecord::getStudentId, userPaymentOrder.getUserId())
+                    .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
+                    .in(MusicSheetPurchaseRecord::getCourseMusicAlbumId, giftIds)
+                    .list().stream()
+                    .collect(Collectors.toMap(MusicSheetPurchaseRecord::getCourseMusicAlbumId, MusicSheetPurchaseRecord::getId, (o, n) -> n));
+        }
+
+        List<CourseRelationWrapper.MusicAlbumRecord> musicAlbumRecords = com.google.common.collect.Lists.newArrayList();
+
+        for (CourseRelationMusicAlbum item : musicAlbums) {
+
+            musicAlbumRecords.add(CourseRelationWrapper.MusicAlbumRecord
+                    .builder()
+                    .clientType(userPaymentOrder.getOrderClient())
+                    .musicSheetId(item.getMusicAlbumId())
+                    .orderNo(userPaymentOrder.getOrderNo())
+                    .purchasePrice(BigDecimal.ZERO)
+                    .purchaseTime(DateTime.now().toDate())
+                    .teacherId(userPaymentOrder.getMerchId())
+                    .originalPrice(BigDecimal.ZERO)
+                    .musicSheetServiceFee(BigDecimal.ZERO)
+                    .orderStatus(OrderStatusEnum.PAID)
+                    .studentId(userPaymentOrder.getUserId())
+                    .purchaseType(PurchaseRecordTypeEnum.valueOf(item.getRelationType().getCode()))
+                    .id(purchaseIdMap.get(item.getId()))
+                    .courseMusicAlbumId(item.getId())
+                    .build());
+        }
+
+        if (CollectionUtils.isNotEmpty(musicAlbumRecords)) {
+
+            List<MusicSheetPurchaseRecord> records = JSON.parseArray(JSON.toJSONString(musicAlbumRecords),
+                    MusicSheetPurchaseRecord.class);
+
+            // 批量插入课程赠送曲目、专辑数据
+            musicSheetPurchaseRecordService.saveBatch(records, 30);
+        }
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void vip(UserOrderDetailVo userPaymentOrder) {
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = userPaymentOrder.getActualPrice();
+
+        memberPriceSettingsService.orderSuccess(userPaymentOrder);
+
+        saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void activity(UserOrderDetailVo userPaymentOrder) {
+
+        // 先计算分账金额,写入流水,最后执行分账,在写入分账数据
+
+        // 分账
+        Map<Long,BigDecimal> tenantdivMap = new HashMap<>();
+        tenantdivMap.merge(-1L, userPaymentOrder.getActualPrice(), BigDecimal::add);
+        // 分润
+        Map<Long,BigDecimal> teacherMap = new HashMap<>();
+        // 老师收入
+        Map<Long,BigDecimal> bizMap = new HashMap<>();
+
+        //服务费  原价的平台服务费 ,减去优惠券金额
+        BigDecimal serviceFeeAmount = userPaymentOrder.getActualPrice();
+
+        activityPlanService.orderSuccess(userPaymentOrder);
+
+        saveData(userPaymentOrder, tenantdivMap, teacherMap, bizMap, serviceFeeAmount);
+    }
+
+
+    // 写入数据库
+    private void saveData(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap, Map<Long, BigDecimal> teacherMap, Map<Long, BigDecimal> bizMap, BigDecimal platformFee) {
+        // 计算分润
+        teacherAmount(userPaymentOrder, tenantdivMap, teacherMap, platformFee);
+
+
+        // 判断金额是否和支付金额一致
+        BigDecimal totalAmount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (!totalAmount.equals(userPaymentOrder.getActualPrice())) {
+            log.error("分账金额不一致 orderNo:{} totalAmount:{} actualPrice:{}", userPaymentOrder.getOrderNo(), totalAmount, userPaymentOrder.getActualPrice());
+            return;
+        }
+
+
+        // 写入机构收支表
+        tenantDivRecord(userPaymentOrder, tenantdivMap);
+
+        // 写入平台
+        platformDivRecord(userPaymentOrder, tenantdivMap);
+
+        //写入老师收入
+        //  老师分润
+        for (Map.Entry<Long, BigDecimal> e : bizMap.entrySet()) {
+            Long k = e.getKey();
+            BigDecimal value = e.getValue();
+            if (value.compareTo(BigDecimal.ZERO) > 0) {
+                teacherBizRecord(userPaymentOrder, k, value);
+            }
+        }
+        for (Map.Entry<Long, BigDecimal> entry : teacherMap.entrySet()) {
+            BigDecimal v = entry.getValue();
+            teacherShare(userPaymentOrder, v);
+        }
+
+        // 写入分账记录表
+        divRecord(userPaymentOrder, tenantdivMap);
+    }
+
+    private void teacherBizRecord(UserOrderDetailVo userPaymentOrder, Long bizId, BigDecimal amount) {
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(userPaymentOrder);
+
+        //老师待入账
+        List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
+        List<PlatformCashAccountRecord> platformCashAccountRecords = new ArrayList<>();
+        UserAccountRecordDto dto = new UserAccountRecordDto(userPaymentOrder.getMerchId(), PostStatusEnum.WAIT, amount,
+                InOrOutEnum.IN, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().getCode()), bizId, userPaymentOrder.getGoodName(), userPaymentOrder.getOrderNo(),
+                userPaymentOrder.getUserId(), accountPeriodTime);
+        userAccountRecordDtos.add(dto);
+
+        // 插入平台账户 支出
+        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
+                InOrOutEnum.OUT, PostStatusEnum.WAIT, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().getCode()), bizId,
+                userPaymentOrder.getOrderNo(), accountPeriodTime);
+        platformCashAccountRecords.add(platformCashAccountRecord);
+
+        if (CollectionUtils.isNotEmpty(userAccountRecordDtos)) {
+            userAccountService.accountRecord(userAccountRecordDtos);
+            platformCashAccountRecordService.saveBatch(platformCashAccountRecords);
+        }
+    }
+
+
+    private void divRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
+        UserOrderPayment newestPayment = userOrderPaymentService.getNewestPayment(null, userPaymentOrder.getOrderNo());
+
+        PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByPaymentVendor(userPaymentOrder.getPaymentVendor());
+        List<PaymentDivMemberRecord> paymentDivMemberRecords = new ArrayList<>();
+        tenantdivMap.forEach((k, v)->{
+
+            if (v.compareTo(BigDecimal.ZERO) > 0) {
+
+                Boolean tenantEnterFlag = false;
+                //  执行分账
+                PaymentDivMember paymentDivMember = null;
+                String divideOrderNo = IdWorker.getIdStr();
+                BigDecimal feeAmt = BigDecimal.ZERO;
+                if (merchantConfig != null && newestPayment != null) {
+                    paymentDivMember = paymentDivMemberService.getByAppIdAndTenantId(merchantConfig.getAppId(), userPaymentOrder.getTenantId());
+                    if (paymentDivMember != null) {
+                        // 执行分账逻辑
+                        BasePaymentService paymentService = paymentServiceContext.getPaymentService(merchantConfig.getPaymentVendor());
+                        DivideReq.DivMember divMember = DivideReq.DivMember.builder()
+                                .memberId(paymentDivMember.getMemberId())
+                                .amount(v)
+                                .feeFlag("Y")
+                                .build();
+                        DivideReq divideReq = DivideReq.builder()
+                                .transNo(newestPayment.getTransNo())
+                                .orderNo(userPaymentOrder.getOrderNo())
+                                .divideOrderNo(divideOrderNo)
+                                .divideAmount(v)
+                                .divMembers(Lists.newArrayList(divMember))
+                                .build();
+                        try {
+                            DivideResp divide = paymentService.divide(divideReq);
+                            feeAmt = divide.getFeeAmount();
+                            tenantEnterFlag= true;
+                        } catch (Exception e) {
+                            log.error("分账失败 分账对象 {} 分账数据 {} 分账订单号 {}", paymentDivMember, divideReq, divideOrderNo);
+                        }
+
+                    }
+                }
+
+                // 写入机构分账记录表
+                PaymentDivMemberRecord paymentDivMemberRecord = PaymentDivMemberRecord.builder()
+                        .tenantId(userPaymentOrder.getTenantId())
+                        .appId(merchantConfig!=null?merchantConfig.getAppId():null)
+                        .memberId(paymentDivMember !=null?paymentDivMember.getMemberId():null)
+                        .orderNo(userPaymentOrder.getOrderNo())
+                        .divOrderNo(divideOrderNo)
+                        .transNo(newestPayment!=null?newestPayment.getTransNo():null)
+                        .amount(v)
+                        .tenantEnterFlag(tenantEnterFlag)
+                        .status("SUCCESS")
+                        .feeFlag(true)
+                        .feeAmt(feeAmt)
+                        .build();
+                paymentDivMemberRecords.add(paymentDivMemberRecord);
+            }
+
+        });
+        paymentDivMemberRecordService.saveBatch(paymentDivMemberRecords);
+    }
+
+    private void teacherShare(UserOrderDetailVo userPaymentOrder, BigDecimal shareFee) {
+        //获取账期时间
+        Date accountPeriodTime = userOrderService.getAccountPeriodTime(userPaymentOrder);
+        AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().getCode() + "_SHARE");
+        if (null != bizTypeEnum) {
+            //插入分润老师账户变更记录-分润老师预收
+            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
+                    new UserAccountRecordDto(userPaymentOrder.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                            bizTypeEnum, userPaymentOrder.getBizId(), bizTypeEnum.getMsg(), userPaymentOrder.getOrderNo(), userPaymentOrder.getUserId(), accountPeriodTime));
+            if (recomRecordRes.getStatus()) {
+                //插入平台预支
+                PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getRecomUserId(), shareFee,
+                        InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(), userPaymentOrder.getOrderNo(), accountPeriodTime);
+                platformCashAccountRecordService.save(platformCashAccountRecord);
+            }
+        }
+    }
+
+    private void platformDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
+        // 写入平台收支表
+        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), tenantdivMap.get(-1L),
+                InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.TENANT_ALBUM, userPaymentOrder.getBizId(),
+                userPaymentOrder.getOrderNo(), new Date());
+        platformCashAccountRecordService.save(platformCashAccountRecord);
+    }
+
+    private void tenantDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
+        // 写入收支表
+        List<TenantAccountRecord> tenantAccountRecordList = new ArrayList<>();
+        tenantdivMap.forEach((tenantId, amount)->{
+            if (tenantId.equals(-1L)) {
+                return;
+            }
+
+            AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getGoodType().getCode());
+
+            // 写入机构流水表
+            TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
+                    .tenantId(userPaymentOrder.getTenantId())
+                    .transAmount(amount)
+                    .inOrOut(InOrOutEnum.IN.getCode())
+                    .postStatus(PostStatusEnum.RECORDED.getCode())
+                    .bizType(bizTypeEnum.getCode())
+                    .bizId(userPaymentOrder.getBizId())
+                    .bizName(userPaymentOrder.getGoodName())
+                    .orderNo(userPaymentOrder.getOrderNo())
+                    .build();
+            tenantAccountRecordList.add(tenantAccountRecord);
+        });
+        tenantAccountRecordService.saveBatch(tenantAccountRecordList);
+    }
+
+
+    // 计算分润
+    private void teacherAmount(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap, Map<Long, BigDecimal> teacherMap, BigDecimal platformFee) {
+
+        if (platformFee.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        //卖家不能分润自己 买家和分润人相同,不分润
+        if (null != userPaymentOrder.getRecomUserId() && userPaymentOrder.getRecomUserId() != 0
+                && !userPaymentOrder.getRecomUserId().equals(userPaymentOrder.getMerchId())
+                && !userPaymentOrder.getUserId().equals(userPaymentOrder.getRecomUserId())) {
+
+            //获取分润收益费率
+            BigDecimal shareFeeRate = userOrderService.getShareFreeByGoodType(userPaymentOrder.getGoodType()
+                    , userPaymentOrder.getBizId());
+            //入老师账户
+            BigDecimal shareFee = platformFee.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+            if (shareFee.compareTo(BigDecimal.ZERO) > 0) {
+                // 判断分润给机构 还是给老师
+                Teacher teacher = teacherService.getById(userPaymentOrder.getRecomUserId());
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    // 分润给机构
+                    tenantdivMap.merge(teacher.getTenantId(), shareFee, BigDecimal::add);
+                    tenantdivMap.merge(-1L, shareFee, BigDecimal::subtract);
+
+                } else {
+                    // 分润给老师
+                    teacherMap.merge(userPaymentOrder.getRecomUserId(), shareFee, BigDecimal::add);
+                }
+            }
+        }
+    }
 }

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

@@ -63,4 +63,21 @@ public class PaymentDivMemberServiceImpl extends ServiceImpl<PaymentDivMemberMap
 
         return this.updateById(JSON.parseObject(paymentDivMember.jsonString(), PaymentDivMember.class));       
     }
+
+    /**
+     * 子账户
+     *
+     * @param appId
+     * @param tenantId
+     * @return
+     */
+    @Override
+    public PaymentDivMember getByAppIdAndTenantId(String appId, Long tenantId) {
+        return this.lambdaQuery()
+                .eq(PaymentDivMember::getAppId, appId)
+                .eq(PaymentDivMember::getTenantId, tenantId)
+                .last("limit 1")
+                .one();
+
+    }
 }

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

@@ -9,7 +9,6 @@ import com.microsvc.toolkit.middleware.payment.properties.PayConfigProperties;
 import org.apache.commons.collections.CollectionUtils;
 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.PaymentMerchantConfig;
 import com.yonge.cooleshow.biz.dal.wrapper.PaymentMerchantConfigWrapper;
@@ -106,4 +105,31 @@ public class PaymentMerchantConfigServiceImpl extends ServiceImpl<PaymentMerchan
 
         return this.updateById(JSON.parseObject(paymentMerchantConfig.jsonString(), PaymentMerchantConfig.class));       
     }
+
+    /**
+     * 根据机构查询三方汇付主账户
+     *
+     * @param tenantId
+     * @return
+     */
+    @Override
+    public PaymentMerchantConfig getByTenantId(Long tenantId) {
+        return this.lambdaQuery()
+                .eq(PaymentMerchantConfig::getTenantId, tenantId)
+                .last("limit 1")
+                .one();
+    }
+
+    @Override
+    public PaymentMerchantConfig getDefault() {
+        return getByTenantId(-1L);
+    }
+
+    @Override
+    public PaymentMerchantConfig getByPaymentVendor(String paymentVendor) {
+        return this.lambdaQuery()
+                .eq(PaymentMerchantConfig::getPaymentVendor, paymentVendor)
+                .last("limit 1")
+                .one();
+    }
 }

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

@@ -0,0 +1,104 @@
+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.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import org.apache.commons.collections.CollectionUtils;
+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.TenantAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantAccountRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.TenantAccountRecordService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 机构流水表
+ * 2023-07-31 13:47:30
+ */
+@Slf4j
+@Service
+public class TenantAccountRecordServiceImpl extends ServiceImpl<TenantAccountRecordMapper, TenantAccountRecord> implements TenantAccountRecordService {
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantAccountRecord
+     */
+	@Override
+    public TenantAccountRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<TenantAccountRecord>
+     * @param query TenantAccountRecordWrapper.TenantAccountRecordQuery
+     * @return IPage<TenantAccountRecord>
+     */
+    @Override
+    public IPage<TenantAccountRecordWrapper.TenantAccountRecord> selectPage(IPage<TenantAccountRecordWrapper.TenantAccountRecord> page, TenantAccountRecordWrapper.TenantAccountRecordQuery query) {
+
+        List<TenantAccountRecordWrapper.TenantAccountRecord> tenantAccountRecords =
+                baseMapper.selectPage(page, query);
+
+        if (CollectionUtils.isEmpty(tenantAccountRecords)) {
+            return page;
+        }
+
+        // 设置机构名
+
+        // 机构ID集合
+        List<Long> tenantIds = tenantAccountRecords.stream().map(TenantAccountRecordWrapper.TenantAccountRecord::getTenantId).collect(Collectors.toList());
+
+        // 机构信息
+        Map<Long, TenantInfo> tenantInfoMap = tenantInfoService.getMapByIds(tenantIds);
+
+        tenantAccountRecords.forEach(tenantAccountRecord -> {
+            TenantInfo tenantInfo = tenantInfoMap.get(tenantAccountRecord.getTenantId());
+            if (tenantInfo != null) {
+                tenantAccountRecord.setTenantName(tenantInfo.getName());
+            }
+        });
+
+        return page.setRecords(tenantAccountRecords);
+    }
+	
+    /**
+     * 添加
+     * @param tenantAccountRecord TenantAccountRecordWrapper.TenantAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(TenantAccountRecordWrapper.TenantAccountRecord tenantAccountRecord) {    	
+        
+        return this.save(JSON.parseObject(tenantAccountRecord.jsonString(), TenantAccountRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param tenantAccountRecord TenantAccountRecordWrapper.TenantAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(TenantAccountRecordWrapper.TenantAccountRecord tenantAccountRecord){
+
+        return this.updateById(JSON.parseObject(tenantAccountRecord.jsonString(), TenantAccountRecord.class));       
+    }
+
+    @Override
+    public TenantAccountRecordWrapper.TenantAccountRecordStat getStatistics(TenantAccountRecordWrapper.TenantAccountRecordQuery query) {
+        return baseMapper.getStatistics(query);
+    }
+}

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

@@ -132,6 +132,8 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
             throw new BizException("订单商品信息为空");
         }
         tenantAlbumContent.setBuyCycle(tenantAlbum.getPurchaseCycle());
+        tenantAlbumContent.setSalePrice(tenantAlbum.getSalePrice());
+        tenantAlbumContent.setOriginalPrice(tenantAlbum.getOriginalPrice());
 
         // 查询专辑所在机构
         List<TenantAlbumRef> refList =

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

@@ -9,18 +9,8 @@ import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
-import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
-import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
-import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
-import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
-import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
-import com.yonge.cooleshow.biz.dal.entity.UserOrder;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
-import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
@@ -73,6 +63,7 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -110,6 +101,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     private PaymentProperties paymentProperties;
 
     @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
     private ActivityEvaluationRecordService activityEvaluationRecordService;
 
     @Autowired

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

@@ -17,24 +17,23 @@ import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentOrder;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentReq;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentResp;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
-import com.yonge.cooleshow.common.enums.CacheNameEnum;
-import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
-import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.enums.*;
 import com.yonge.cooleshow.common.enums.payment.EPaymentChannel;
 import com.yonge.cooleshow.common.enums.payment.EPaymentStatus;
 import com.yonge.cooleshow.common.enums.payment.EPaymentType;
-import com.yonge.cooleshow.common.service.IdGeneratorService;
-import com.yonge.toolset.payment.core.props.PaymentProperties;
-import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.payment.util.DistributedLock;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -55,7 +54,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import static com.yonge.cooleshow.common.enums.payment.EPaymentStatus.*;
+import static com.yonge.cooleshow.common.enums.payment.EPaymentStatus.PAID;
 
 /**
  * 用户支付订单服务
@@ -113,6 +112,20 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     @Autowired
     private TenantAlbumService tenantAlbumService;
 
+    @Autowired
+    private PaymentDivMemberRecordService paymentDivMemberRecordService;
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private PaymentMerchantConfigService paymentMerchantConfigService;
 
 
     // 订单商品参数校验,获取订单支付金额
@@ -127,7 +140,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
 
     // 订单完成后执行
-    private static final Map<EPaymentType, Consumer<UserPaymentOrderWrapper.UserPaymentOrder>> paymentSuccess = Maps.newHashMap();
+    private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> paymentSuccess = Maps.newHashMap();
 
 
 
@@ -164,6 +177,16 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         /**********订单完成后 数据处理******************/
         // 沿用以前的流程
 
+        // 分账处理 写入分账记录
+        paymentSuccess.put(GoodTypeEnum.TENANT_ALBUM, paymentDivMemberRecordService::tenantAlbum);
+        paymentSuccess.put(GoodTypeEnum.MUSIC, paymentDivMemberRecordService::musicSheet);
+        paymentSuccess.put(GoodTypeEnum.PRACTICE, paymentDivMemberRecordService::practiceCourse);
+        paymentSuccess.put(GoodTypeEnum.LIVE, paymentDivMemberRecordService::liveCourse);
+        paymentSuccess.put(GoodTypeEnum.VIDEO, paymentDivMemberRecordService::videoCourse);
+        paymentSuccess.put(GoodTypeEnum.ALBUM, paymentDivMemberRecordService::musicSheet);
+        paymentSuccess.put(GoodTypeEnum.VIP, paymentDivMemberRecordService::vip);
+        paymentSuccess.put(GoodTypeEnum.ACTI_REGIST, paymentDivMemberRecordService::activity);
+
         /**********订单取消后******************/
         // 沿用以前的流程
 
@@ -283,8 +306,10 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         }
         userPaymentOrderService.updateById(order);
 
-        // 不同订单类型支付成功,后续数据同步流程
-        userOrderService.paySuccess(userOrderService.detail(order.getId()));
+        // 分账处理
+
+        // 机构学生订单支付成功,处理分账
+        paySuccess(userOrderService.detail(order.getId()));
 
         // 生成协议
         try {
@@ -297,6 +322,48 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         log.info("executePaymentSuccess userId={}, biz={}, orderNo={}", paymentOrder.getUserId(), paymentOrder.getBizId(), paymentOrder.getOrderNo());
     }
 
+
+
+    /**
+     * 支付成功后续处理
+     *
+     * @param detail
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void paySuccess(UserOrderVo detail) {
+        //调用业务
+        List<UserOrderDetailVo> orderDetailList = userOrderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
+
+        for (UserOrderDetailVo orderDetailVo : orderDetailList) {
+            orderDetailVo.setUserId(detail.getUserId());
+            orderDetailVo.setOrderId(detail.getId());
+            orderDetailVo.setRecomUserId(detail.getRecomUserId());
+            orderDetailVo.setActivityId(detail.getActivityId());
+            orderDetailVo.setRewardId(detail.getRewardId());
+            orderDetailVo.setOrderType(detail.getOrderType());
+            orderDetailVo.setOrderClient(detail.getOrderClient());
+            orderDetailVo.setPaymentVendor(detail.getPaymentVendor());
+
+            //调用业务
+            Consumer<UserOrderDetailVo> userOrderVoConsumer = paymentSuccess.get(orderDetailVo.getGoodType());
+            if (!Objects.isNull(userOrderVoConsumer)) {
+                userOrderVoConsumer.accept(orderDetailVo);
+
+            }
+            //清除商家统计缓存
+            Long merchId = orderDetailVo.getMerchId();
+            if (merchId != null && merchId != 0) {
+                redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(merchId)).delete();
+            }
+        }
+        //清除买家统计缓存
+        if (ClientEnum.STUDENT.getCode().equals(detail.getPaymentClient())) {
+            redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(detail.getUserId())).delete();
+        } else if (ClientEnum.TEACHER.getCode().equals(detail.getPaymentClient())) {
+            redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(detail.getUserId())).delete();
+        }
+    }
+
     /**
      * 取消订单支付
      *
@@ -340,7 +407,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 String errorMessage = null;
                 try {
                     // 关闭三方支付订单状态
-                    PaymentClose paymentClose = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVender())
+                    PaymentClose paymentClose = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
                         .close(paymentOrder.getTransNo(), "用户取消支付", paymentOrder.getOrderNo());
 
                     if (Objects.nonNull(paymentClose)) {
@@ -451,21 +518,23 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 // 计算优惠券金额
                 {
                     if (StringUtils.isNotEmpty(orderReq.getCouponIds())) {
-
-                        couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
-                                CouponInfoQuery.CouponOrderQuery.builder()
-                                        .clientType(orderReq.getPaymentClient())
-                                        .couponTypes(CouponCategoryEnum.getCategory(orderReq.getOrderType().getCode()))
-                                        .useState(CouponUseStateEnum.USABLE)
-                                        .timestamp(DateTime.now().getMillis())
-                                        .amount(userOrderDetail.getExpectPrice().doubleValue())
-                                        .build()
-                                        .issueIds(orderReq.getCouponIds()));
+                        throw new BizException("暂不支持优惠券");
+//
+//                        couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
+//                                CouponInfoQuery.CouponOrderQuery.builder()
+//                                        .clientType(orderReq.getPaymentClient())
+//                                        .couponTypes(CouponCategoryEnum.getCategory(orderReq.getOrderType().getCode()))
+//                                        .useState(CouponUseStateEnum.USABLE)
+//                                        .timestamp(DateTime.now().getMillis())
+//                                        .amount(userOrderDetail.getExpectPrice().doubleValue())
+//                                        .build()
+//                                        .issueIds(orderReq.getCouponIds()));
                     }
 
                     // 优惠券优惠金额,暂时为0
-                    couponAmount = couponAmount.add(BigDecimal.valueOf(couponOrderWrapper.getDiscountedPrices()));
+//                    couponAmount = couponAmount.add(BigDecimal.valueOf(couponOrderWrapper.getDiscountedPrices()));
 
+                    //不许使用优惠券
                     if (couponAmount.compareTo(userOrderDetail.getExpectPrice()) > 0) {
                         couponAmount = userOrderDetail.getExpectPrice();
                     }
@@ -512,7 +581,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         // 验证成功后,订单入库
 
         // 查询支付三方配置
-        BasePaymentService paymentService = paymentServiceContext.getPaymentService(orderReq.getPaymentVender());
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(orderReq.getPaymentVendor());
         if (Objects.nonNull(paymentService)) {
             // 设置支付三方AppId
             orderReq.setPaymentAppId(paymentService.getPaymentConfig().getAppId());
@@ -545,7 +614,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
             .body(subject)
             .price(orderReq.getPaymentCashAmount().setScale(2, RoundingMode.HALF_UP))
             .expirationTime(DateTime.now().plusMinutes(30).toDate())
-            .wxAppId(paymentServiceContext.getPaymentService(orderReq.getPaymentVender()).getPaymentConfig().getWxAppId())
+            .wxAppId(paymentServiceContext.getPaymentService(orderReq.getPaymentVendor()).getPaymentConfig().getWxAppId())
             .userId(String.valueOf(orderReq.getUserId()))
             .build();
 
@@ -560,7 +629,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         return UserPaymentOrderWrapper.PaymentConfig.builder()
             .orderNo(orderReq.getOrderNo())
             .paymentConfig(reqConfig)
-            .paymentType(paymentServiceContext.getPaymentService(orderReq.getPaymentVender()).venderName())
+            .paymentType(paymentServiceContext.getPaymentService(orderReq.getPaymentVendor()).venderName())
             .build();
     }
 
@@ -685,7 +754,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (StringUtils.isBlank(paymentConfig)) {
 
                     // 支付配置已失效,待支付订单状态调整为已关闭,提醒用户重新购买
-                    PaymentClose paymentClose = paymentServiceContext.getPaymentService(userPaymentOrder.getPaymentVender())
+                    PaymentClose paymentClose = paymentServiceContext.getPaymentService(userPaymentOrder.getPaymentVendor())
                         .close(userPaymentOrder.getTransNo(), "订单支付已超时", userPaymentOrder.getOrderNo());
 
                     // 更新订单状态为已超时
@@ -720,7 +789,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
             log.info("executePayment reqConfig={}", config.jsonString());
 
             PaymentOrder paymentOrder = JSON.parseObject(config.jsonString(), PaymentOrder.class);
-            PaymentReq paymentReq = paymentServiceContext.getPaymentService(userPaymentOrder.getPaymentVender()).pay(paymentOrder);
+            PaymentReq paymentReq = paymentServiceContext.getPaymentService(userPaymentOrder.getPaymentVendor()).pay(paymentOrder);
             if (Objects.isNull(paymentReq)) {
                 throw BizException.from("生成支付参数异常");
             }
@@ -802,7 +871,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
             } else {
                 // 获取三方支付订单信息,根据订单状处理
-                PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVender())
+                PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
                     .query(paymentOrder.getTransNo(), paymentOrder.getOrderNo());
                 if (Objects.isNull(paymentResp)) {
                     throw new BizException("订单支付状态获取异常,稍后请重试");
@@ -853,6 +922,103 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
     }
 
+
+    /**
+     * 检测订单支付方式
+     *
+     * @param payTypeReq UserPaymentOrderWrapper.OrderPayTypeReq
+     */
+    @Override
+    public UserPaymentOrderWrapper.OrderPayTypeResp orderPayType(UserPaymentOrderWrapper.OrderPayTypeReq payTypeReq) {
+
+        UserPaymentOrderWrapper.OrderPayTypeResp resp = new UserPaymentOrderWrapper.OrderPayTypeResp();
+        resp.setPaymentVersion(EPaymentVersion.V1);
+        // 检测用户 是否为机构 或者机构的学生
+        if (payTypeReq.getClientType().equals(ClientEnum.TENANT)) {
+            resp.setPaymentVersion(EPaymentVersion.V2);
+        }
+        // 检测商品是属于老师,老师是否设置的结算给机构
+
+        switch (payTypeReq.getGoodType()) {
+            case VIDEO: {
+                VideoLessonGroup lessonGroup = videoLessonGroupService.getById(payTypeReq.getBizId());
+                if (Objects.isNull(lessonGroup)) {
+                    throw new BizException("课程信息不存在");
+                }
+                Teacher teacher = teacherService.getById(lessonGroup.getTeacherId());
+                if (Objects.isNull(teacher)) {
+                    throw new BizException("老师信息不存在");
+                }
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    resp.setPaymentVersion(EPaymentVersion.V2);
+                }
+                break;
+            }
+            case LIVE: {
+                CourseGroup courseGroup = courseGroupService.getById(payTypeReq.getBizId());
+                if (Objects.isNull(courseGroup)) {
+                    throw new BizException("课程信息不存在");
+                }
+                Teacher teacher = teacherService.getById(courseGroup.getTeacherId());
+                if (Objects.isNull(teacher)) {
+                    throw new BizException("老师信息不存在");
+                }
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    resp.setPaymentVersion(EPaymentVersion.V2);
+                }
+                break;
+            }
+            case PRACTICE: {
+                Teacher teacher = teacherService.getById(payTypeReq.getBizId());
+                if (Objects.isNull(teacher)) {
+                    throw new BizException("老师信息不存在");
+                }
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    resp.setPaymentVersion(EPaymentVersion.V2);
+                }
+                break;
+            }
+            case MUSIC: {
+                MusicSheet musicSheet = musicSheetService.getById(payTypeReq.getBizId());
+                if (Objects.isNull(musicSheet)) {
+                    throw new BizException("曲目信息不存在");
+                }
+                if (musicSheet.getSourceType().equals(SourceTypeEnum.PLATFORM)) {
+                    break;
+                }
+                Teacher teacher = teacherService.getById(musicSheet.getUserId());
+                if (Objects.isNull(teacher)) {
+                    throw new BizException("老师信息不存在");
+                }
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                    resp.setPaymentVersion(EPaymentVersion.V2);
+                }
+                break;
+            }
+            case TENANT_ALBUM:
+                resp.setPaymentVersion(EPaymentVersion.V2);
+        }
+
+        // 设置推荐人
+        if(payTypeReq.getRecomUserId() != null ) {
+            Teacher teacher = teacherService.getById(payTypeReq.getRecomUserId());
+            if (Objects.isNull(teacher)) {
+                throw new BizException("推荐人信息不存在");
+            }
+            if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                resp.setPaymentVersion(EPaymentVersion.V2);
+            }
+        }
+        
+        // 结算给机构的,检测机构的主账户,没有主账户的,查询-1的主账户
+        PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByTenantId(-1L);
+        if (Objects.isNull(merchantConfig)) {
+            throw new BizException("平台主账户信息不存在");
+        }
+        resp.setPaymentVendor(merchantConfig.getPaymentVendor());
+        return resp;
+    }
+
     /**
      * 定时更新订单状态
      * @param page IPage<UserPaymentOrderWrapper.UserPaymentOrder>
@@ -908,12 +1074,12 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                             && new DateTime(item.getCreateTime()).plusMinutes(120).isAfterNow()) {
 
                             // 支付同小消息
-                            PaymentResp paymentResp = paymentServiceContext.getPaymentService(item.getPaymentVender()).query(item.getTransNo(), item.getOrderNo());
+                            PaymentResp paymentResp = paymentServiceContext.getPaymentService(item.getPaymentVendor()).query(item.getTransNo(), item.getOrderNo());
                             if (Objects.nonNull(paymentResp)) {
 
                                 try {
 
-                                    log.info("scanPaymentTimeoutOrderRecord PAYMENT_SYNC, vendor={}, paymentResp={}", item.getPaymentVender(),
+                                    log.info("scanPaymentTimeoutOrderRecord PAYMENT_SYNC, vendor={}, paymentResp={}", item.getPaymentVendor(),
                                         JSON.toJSONString(paymentResp));
                                     // 支付成功
                                     if (PaymentStatus.SUCCESSED == paymentResp.getPaymentStatus()) {

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

@@ -178,7 +178,7 @@ public class UserPaymentOrderServiceImpl  implements UserPaymentOrderService {
         }
 
         newestPayment.setOrderNo(userOrder.getOrderNo());
-        newestPayment.setPaymentVendor(order.getPaymentVender());
+        newestPayment.setPaymentVendor(order.getPaymentVendor());
         newestPayment.setPaymentChannel(order.getPaymentChannel());
         newestPayment.setPaymentAppId(order.getPaymentAppId());
         newestPayment.setPaymentNo(order.getOrderNo());

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

@@ -345,6 +345,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
      * @Author: cy
      * @Date: 2022/5/6
      */
+    @Override
     public void videoSend(Long teacherId, Long studentId, VideoLessonGroup lesson) {
         //查询老师&学生信息
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
@@ -46,6 +47,29 @@ public class UserOrderDetailVo extends UserOrderDetail {
     // 透传订单类型
     private OrderTypeEnum orderType;
 
+    @ApiModelProperty("分账机构ID")
+    private Long tenantId;
+
+
+    @ApiModelProperty("支付厂商")
+    private String paymentVendor;
+
+    public String getPaymentVendor() {
+        return paymentVendor;
+    }
+
+    public void setPaymentVendor(String paymentVendor) {
+        this.paymentVendor = paymentVendor;
+    }
+
+    public Long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
     public Long getRewardId() {
         return rewardId;
     }

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderVo.java

@@ -40,7 +40,19 @@ public class UserOrderVo extends UserOrder {
 	@ApiModelProperty("优惠券抵扣金额 ")
 	private BigDecimal discountPrice;
 
-	public List<UserOrderDetailVo> getOrderDetailList() {
+
+    @ApiModelProperty("机构名称")
+    private String tenantName;
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public List<UserOrderDetailVo> getOrderDetailList() {
 		return orderDetailList;
 	}
 

+ 135 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAccountRecordWrapper.java

@@ -0,0 +1,135 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 机构流水表
+ * 2023-07-31 13:47:30
+ */
+@ApiModel(value = "TenantAccountRecordWrapper对象", description = "机构流水表查询对象")
+public class TenantAccountRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantAccountRecordQuery-机构流水表")
+    public static class TenantAccountRecordQuery extends QueryInfo {
+
+        @ApiModelProperty("关联订单号")
+        private String orderNo;
+
+        @ApiModelProperty("业务编号")
+        private Long bizId;
+
+        @ApiModelProperty("收支类型(IN-收入  OUT-支出)")
+        private String inOrOut;
+
+        @ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 ACTI_REGIST、活动报名 WITHDRAWAL、提现 " +
+                "LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润 ACTI_REGIST_SHARE、活动报名分润 ")
+        private AccountBizTypeEnum bizType;
+
+        @ApiModelProperty(value = "入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 退费 ")
+        private PostStatusEnum postStatus;
+
+        @ApiModelProperty("记录开始时间")
+        private Date startDate;
+
+        @ApiModelProperty("记录结束时间")
+        private Date endDate;
+
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantAccountRecordQuery from(String json) {
+            return JSON.parseObject(json, TenantAccountRecordQuery.class);
+        }
+    }  
+
+    @Data
+	@ApiModel(" TenantAccountRecord-机构流水表")
+    public static class TenantAccountRecord {
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("机构id")
+        private Long tenantId;
+
+        @ApiModelProperty("机构名称")
+        private String tenantName;
+
+        @ApiModelProperty("交易金额")
+        private BigDecimal transAmount;
+
+        @ApiModelProperty("收支类型:IN、收入 OUT、支出")
+        private String inOrOut;
+
+        @ApiModelProperty("入账状态 WAIT 待入账 FROZEN 冻结入账 RECORDED 已入账 CANCEL 取消")
+        private String postStatus;
+
+        @ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润")
+        private String bizType;
+
+        @ApiModelProperty("业务id")
+        private Long bizId;
+
+        @ApiModelProperty("业务名称")
+        private String bizName;
+
+        @ApiModelProperty("订单号")
+        private String orderNo;
+
+        @ApiModelProperty("更新时间")
+        @TableField(value = "update_time_")
+        private Date updateTime;
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantAccountRecord from(String json) {
+            return JSON.parseObject(json, TenantAccountRecord.class);
+        }
+	}
+
+
+    @Data
+    @ApiModel(" TenantAccountRecordStat-机构流水表")
+    public static class TenantAccountRecordStat {
+
+        @ApiModelProperty("收入")
+        private BigDecimal transAmountIn = BigDecimal.ZERO;
+
+        @ApiModelProperty("支出")
+        private BigDecimal transAmountOut = BigDecimal.ZERO;
+
+    }
+
+    }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantAlbumWrapper.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -114,5 +116,13 @@ public class TenantAlbumWrapper {
         @ApiModelProperty(value = "采购机构",hidden = true)
         private Long tenantId;
 
+
+        @ApiModelProperty("平台价格")
+        private BigDecimal originalPrice;
+
+        @ApiModelProperty("机构价格")
+        private BigDecimal salePrice;
+
+
     }
 }

+ 59 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
@@ -9,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.common.enums.EPaymentVersion;
 import com.yonge.cooleshow.common.enums.payment.EGoodsType;
 import com.yonge.cooleshow.common.enums.payment.EPaymentStatus;
 import com.yonge.cooleshow.common.enums.payment.EPaymentType;
@@ -56,7 +58,6 @@ public class UserPaymentOrderWrapper {
         private Date endTime;
 
 
-
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -72,7 +73,7 @@ public class UserPaymentOrderWrapper {
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" UserPaymentOrderQuery-平台订单表")
-    public static class UserPaymentOrderExportQuery{
+    public static class UserPaymentOrderExportQuery {
 
         @ApiModelProperty("城市编码")
         private Integer cityCode;
@@ -107,6 +108,7 @@ public class UserPaymentOrderWrapper {
             return JSON.parseObject(json, UserPaymentOrderQuery.class);
         }
     }
+
     @Data
     @Builder
     @NoArgsConstructor
@@ -132,7 +134,7 @@ public class UserPaymentOrderWrapper {
 
     @Data
     @ApiModel(" UserPaymentApplyOrder-平台订单表")
-    public static class UserPaymentApplyOrder{
+    public static class UserPaymentApplyOrder {
 
         @ApiModelProperty("业务编号")
         private String bizId;
@@ -155,7 +157,7 @@ public class UserPaymentOrderWrapper {
         private String paymentType;
 
         @ApiModelProperty("支付厂商")
-        private String paymentVender;
+        private String paymentVendor;
 
         @ApiModelProperty("支付厂商名")
         private String paymentVenderName;
@@ -187,6 +189,10 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("用户编号")
         private Long userId;
 
+
+        @ApiModelProperty("机构ID ")
+        private Long tenantId;
+
         @ApiModelProperty("商户订单号")
         private String orderNo;
 
@@ -266,7 +272,7 @@ public class UserPaymentOrderWrapper {
 
 
         public static UserPaymentOrder from(UserOrder userOrder, UserOrderPayment userOrderPayment) {
-            if (userOrder == null ) {
+            if (userOrder == null) {
                 return null;
             }
             if (userOrderPayment == null) {
@@ -275,13 +281,13 @@ public class UserPaymentOrderWrapper {
             return UserPaymentOrder.builder()
                     .id(userOrder.getId())
                     .paymentType(userOrder.getPaymentVendor())
-                    .paymentVender(userOrder.getPaymentVendor())
+                    .paymentVendor(userOrder.getPaymentVendor())
                     .paymentChannel(userOrder.getPaymentChannel())
                     .paymentClient(userOrder.getOrderClient())
                     .userId(userOrder.getUserId())
                     .orderNo(userOrder.getOrderNo())
                     .transNo(userOrderPayment.getTransNo())
-                    .bizId(null)
+                    .tenantId(userOrder.getTenantId())
                     .orderType(EPaymentType.valueOf(userOrder.getOrderType().name()))
                     .status(OrderStatusEnum.parse(userOrder.getStatus()))
                     .originalPrice(userOrder.getOriginalPrice())
@@ -311,14 +317,14 @@ public class UserPaymentOrderWrapper {
         public UserOrder toUserOrder() {
             return UserOrder.builder()
                     .id(getId())
-                    .paymentVendor(getPaymentVender())
+                    .paymentVendor(getPaymentVendor())
                     .paymentChannel(getPaymentChannel())
                     .paymentAppId(getPaymentAppId())
                     .orderClient(getPaymentClient())
                     .userId(getUserId())
                     .orderNo(getOrderNo())
-                    .orderType(getOrderType() !=null?OrderTypeEnum.valueOf(getOrderType().name()):null)
-                    .status(getStatus() !=null? OrderStatusEnum.parse(getStatus()):null)
+                    .orderType(getOrderType() != null ? OrderTypeEnum.valueOf(getOrderType().name()) : null)
+                    .status(getStatus() != null ? OrderStatusEnum.parse(getStatus()) : null)
                     .originalPrice(getOriginalPrice())
                     .expectPrice(getCurrentPrice())
                     .actualPrice(getPaymentCashAmount())
@@ -332,6 +338,7 @@ public class UserPaymentOrderWrapper {
                     .recomUserId(getRecomUserId())
                     .activityId(getActivityId())
                     .rewardId(getRewardId())
+                    .tenantId(getTenantId())
                     .build();
         }
 
@@ -382,8 +389,8 @@ public class UserPaymentOrderWrapper {
         }
 
         public UserPaymentOrder paymentVender(String paymentVender) {
-            if (StringUtils.isBlank(this.paymentVender)) {
-                this.paymentVender = paymentVender;
+            if (StringUtils.isBlank(this.paymentVendor)) {
+                this.paymentVendor = paymentVender;
             }
             return this;
         }
@@ -444,7 +451,6 @@ public class UserPaymentOrderWrapper {
         }
 
 
-
         public UserPaymentOrder updateTime(Date updateTime) {
             this.updateTime = updateTime;
             return this;
@@ -806,13 +812,13 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("优惠券Id")
         private Long couponId;
 
-        @ApiModelProperty(value = "活动id",hidden = true)
+        @ApiModelProperty(value = "活动id", hidden = true)
         private Long activityId;
 
-        @ApiModelProperty(value = "订单号 ",hidden = true)
+        @ApiModelProperty(value = "订单号 ", hidden = true)
         private String orderNo;
 
-        @ApiModelProperty(value = "订单详情号 ",hidden = true)
+        @ApiModelProperty(value = "订单详情号 ", hidden = true)
         private String subOrderNo;
 
         @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
@@ -830,14 +836,14 @@ public class UserPaymentOrderWrapper {
         @ApiModelProperty("商品名称 ")
         private String goodName;
 
-        @ApiModelProperty(value = "购买人ID ",hidden = true)
+        @ApiModelProperty(value = "购买人ID ", hidden = true)
         private Long userId;
 
 
-        @ApiModelProperty(value = "用户身份",hidden = true)
+        @ApiModelProperty(value = "用户身份", hidden = true)
         private ClientEnum paymentClient;
 
-        @ApiModelProperty(value = "生成的订单详情信息",hidden = true)
+        @ApiModelProperty(value = "生成的订单详情信息", hidden = true)
         private UserOrderDetail userOrderDetail;
 
         public Integer getGoodNum() {
@@ -845,4 +851,38 @@ public class UserPaymentOrderWrapper {
         }
     }
 
+
+    @Data
+    @ApiModel("OrderPayTypeReq-订单支付方式")
+    public static class OrderPayTypeReq implements Serializable {
+
+        @ApiModelProperty("订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ACTI_REGIST、活动报名) 老师端(VIP、开通会员 PIANO_ROOM、琴房时长)")
+        private GoodTypeEnum goodType;
+
+        @ApiModelProperty("业务id ")
+        private Long bizId;
+
+        @ApiModelProperty(value = "购买人ID",hidden = true)
+        private Long buyId;
+
+        @ApiModelProperty(value = "购买人身份",hidden = true)
+        private ClientEnum clientType;
+
+
+        @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
+        private Long recomUserId;
+    }
+
+
+    @Data
+    @ApiModel("OrderPayTypeReq-订单支付方式")
+    public static class OrderPayTypeResp implements Serializable {
+
+        @ApiModelProperty("支付版本")
+        private EPaymentVersion paymentVersion;
+
+
+        @ApiModelProperty("支付厂商")
+        private String paymentVendor;
+    }
 }

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

@@ -9,6 +9,7 @@
         , t.app_id_ AS appId
         , t.member_id_ AS memberId
         , t.order_no_ AS orderNo
+        , t.div_order_no_ AS divOrderNo
         , t.trans_no_ AS transNo
         , t.amount_ AS amount
         , t.tenant_enter_flag_ AS tenantEnterFlag

+ 70 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAccountRecordMapper.xml

@@ -0,0 +1,70 @@
+<?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.TenantAccountRecordMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.trans_amount_ AS transAmount
+        , t.in_or_out_ AS inOrOut
+        , t.post_status_ AS postStatus
+        , t.biz_type_ AS bizType
+        , t.biz_id_ AS bizId
+        , t.biz_name_ AS bizName
+        , t.order_no_ AS orderNo
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        , t.err_flag_ AS errFlag
+        , t.err_msg_ AS errMsg
+        </sql> 
+    
+    <sql id="selectSql">
+        <where>
+            <if test="param.orderNo != null and param.orderNo != ''">
+                AND t.order_no_ = #{param.orderNo}
+            </if>
+            <if test="param.bizId != null">
+                AND t.biz_id_ = #{param.bizId}
+            </if>
+            <if test="param.inOrOut != null and param.inOrOut != ''">
+                and t.in_or_out_ = #{param.inOrOut}
+            </if>
+            <if test="param.bizType != null">
+                and t.biz_type_ = #{param.bizType}
+            </if>
+
+            <if test="param.postStatus != null">
+                and t.post_status_ = #{param.postStatus}
+            </if>
+
+            <if test="param.startDate != null">
+                and t.update_time_ &gt;= #{param.startDate}
+            </if>
+            <if test="param.endDate != null">
+                and t.update_time_ &lt;= #{param.endDate}
+            </if>
+            <if test="param.tenantId != null">
+                and t.tenant_id_ = #{param.tenantId}
+            </if>
+
+        </where>
+    </sql>
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper$TenantAccountRecord">
+		SELECT
+            t.*
+		FROM tenant_account_record t
+        <include refid="selectSql"/>
+	</select>
+
+    <select id="getStatistics"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAccountRecordWrapper$TenantAccountRecordStat">
+        SELECT
+        sum(if(t.in_or_out_ = 'IN',t.trans_amount_,0)) transAmountIn,
+        sum(if(t.in_or_out_ = 'OUT',t.trans_amount_,0)) transAmountOut
+        FROM tenant_account_record t
+        <include refid="selectSql"/>
+    </select>
+</mapper>

+ 32 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/UserOrderController.java

@@ -8,8 +8,10 @@ import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
 import com.yonge.cooleshow.biz.dal.service.UserPaymentCoreService;
 import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -46,6 +48,9 @@ public class UserOrderController {
     @Autowired
     private UserPaymentCoreService userPaymentCoreService;
 
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
     @ApiOperation(value = "用户下单", notes = "用户下单")
     @PostMapping("/executeOrder/v2")
     public R<UserPaymentOrderWrapper.PaymentConfig> executeOrder(@Validated @RequestBody UserPaymentOrderVo.OrderReq orderReq) {
@@ -61,6 +66,13 @@ public class UserOrderController {
 
         // 用户下单请求
         UserPaymentOrderWrapper.UserPaymentOrder order = JSON.parseObject(orderReq.jsonString(), UserPaymentOrderWrapper.UserPaymentOrder.class);
+
+        TenantStaff tenantStaff = tenantStaffService.getByUserId(sysUser.getId());
+        if (Objects.isNull(tenantStaff)) {
+            throw BizException.from("用户信息不存在");
+        }
+
+        order.setTenantId(tenantStaff.getTenantId());
         // 新增数据
         UserPaymentOrderWrapper.PaymentConfig paymentConfig = userPaymentCoreService.executeOrderCreate(order);
         if (Objects.isNull(paymentConfig)) {
@@ -115,4 +127,24 @@ public class UserOrderController {
         return HttpResponseResult.status(true);
     }
 
+
+    @ApiOperation(value = "检测订单应该使用哪种支付方式")
+    @PostMapping("/orderPayType")
+    public HttpResponseResult<UserPaymentOrderWrapper.OrderPayTypeResp> orderPayType(@ApiIgnore @RequestBody UserPaymentOrderWrapper.OrderPayTypeReq payTypeReq) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        payTypeReq.setBuyId(user.getId());
+        payTypeReq.setClientType(ClientEnum.TENANT);
+
+        // 用户取消支付
+
+
+        return HttpResponseResult.succeed(userPaymentCoreService.orderPayType(payTypeReq));
+    }
+
+
+
 }