liujc 1 rok temu
rodzic
commit
bfdf3c578e
27 zmienionych plików z 687 dodań i 161 usunięć
  1. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.java
  2. 97 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantTeacherAccountRecord.java
  3. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  4. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantTeacherAccountRecordMapper.java
  5. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  6. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantMemberService.java
  7. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantTeacherAccountRecordService.java
  8. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  9. 2 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  10. 4 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  11. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  12. 5 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  13. 200 84
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  14. 2 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  15. 38 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  16. 7 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  17. 14 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantMemberServiceImpl.java
  18. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantTeacherAccountRecordServiceImpl.java
  19. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  20. 2 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  21. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java
  22. 63 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantTeacherAccountRecordWrapper.java
  23. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java
  24. 8 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantMemberMapper.xml
  25. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantTeacherAccountRecordMapper.xml
  26. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  27. 38 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantAccountRecord.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 com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -41,6 +42,12 @@ public class TenantAccountRecord implements Serializable {
     @TableField(value = "platform_cash_account_record_id_")
     private Long platformCashAccountRecordId;
 
+
+    @ApiModelProperty("数据类型(平台,老师)")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+
     @ApiModelProperty("交易金额") 
 	@TableField(value = "trans_amount_")
     private BigDecimal transAmount;

+ 97 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantTeacherAccountRecord.java

@@ -0,0 +1,97 @@
+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 com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import java.math.BigDecimal;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(" TenantTeacherAccountRecord-机构老师流水表")
+@TableName("tenant_teacher_account_record")
+public class TenantTeacherAccountRecord implements Serializable {
+
+    @ApiModelProperty("id") 
+	    @TableId(value = "id_",type = IdType.AUTO)
+	    private Long id;
+
+    @ApiModelProperty("机构id") 
+	@TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("老师id") 
+	@TableField(value = "teacher_id_")
+    private Long teacherId;
+
+    @ApiModelProperty("机构流水ID") 
+	@TableField(value = "account_record_id_")
+    private Long accountRecordId;
+
+    @ApiModelProperty("数据类型(平台,机构,老师)") 
+	@TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+    @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/UserOrderDetail.java

@@ -76,6 +76,10 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("平台服务费比例% ")
     @TableField(value = "plantform_fee_rate_")
     private BigDecimal plantformFeeRate;
+
+    @TableField(value = "account_config_")
+    private String accountConfig;
+
     @ApiModelProperty("下单时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

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

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantTeacherAccountRecordWrapper;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Repository
+public interface TenantTeacherAccountRecordMapper extends BaseMapper<TenantTeacherAccountRecord> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord>
+	 * @param param TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+	 * @return List<TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord>
+	 */
+	List<TenantTeacherAccountRecord> selectPage(@Param("page") IPage<TenantTeacherAccountRecord> page, @Param("param") TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery param);
+	
+}

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
@@ -178,5 +179,5 @@ public interface TeacherService extends IService<Teacher> {
 
     void updateTenant(TeacherWrapper.UpdateTenant updateTenant,Long userId);
 
-    Long teacherSettlementFrom(Long teacherId);
+    UserPaymentOrderWrapper.AccountTenantTo teacherSettlementFrom(Long teacherId,Long recomUserId);
 }

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

@@ -59,4 +59,6 @@ public interface TenantMemberService extends IService<TenantMember>  {
     TenantMember getByMemberId(String memberId, EPayerType payerType);
 
     TenantMember getByRequestNo(String requestNo);
+
+    TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType);
 }

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

@@ -0,0 +1,43 @@
+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.TenantTeacherAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+public interface TenantTeacherAccountRecordService extends IService<TenantTeacherAccountRecord>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantTeacherAccountRecord
+     */
+	TenantTeacherAccountRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantTeacherAccountRecord>
+     * @param query TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+     * @return IPage<TenantTeacherAccountRecord>
+     */
+    IPage<TenantTeacherAccountRecord> selectPage(IPage<TenantTeacherAccountRecord> page, TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery query);
+	
+    /**
+     * 添加
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+     Boolean add(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord);   
+
+    /**
+     * 更新
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+     Boolean update(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord);
+     
+}

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

@@ -995,15 +995,10 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
-
-        // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -398,17 +398,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         log.info("buyLiveCourse  return {}", userOrderDetail);
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
-
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(courseGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-
-        accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(courseGroup.getTeacherId()));
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(courseGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -2493,16 +2493,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         RLock lock = redissonClient.getLock("teacherId:" + scheduleDto.getTeacherId());
         try {
             if (lock.tryLock(10, 60, TimeUnit.SECONDS)) {
-                orderGoodsInfo.setUserOrderDetail( buyPracticeCourseTranV2(orderGoodsInfo));
-
+                UserOrderDetail userOrderDetail = buyPracticeCourseTranV2(orderGoodsInfo);
+                orderGoodsInfo.setUserOrderDetail(userOrderDetail);
+                userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(scheduleDto.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
                 // 设置金额入账去向
-                UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-                if (orderGoodsInfo.getRecomUserId() !=null) {
-                    accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-                }
-                accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(scheduleDto.getTeacherId()));
                 // 存入缓存
-                redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//                redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(scheduleDto.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
                 return;
             }

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

@@ -288,14 +288,11 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice().subtract(couponAmount));
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        userOrderDetail.setAccountConfig( teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -1118,7 +1118,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
 
                 // 老师收入
-                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice).setScale(2, RoundingMode.HALF_UP);
 
                 // 判断是否结算给老师,不结算,不写入老师入账记录
                 Teacher teacher = teacherService.getById(musicSheet.getUserId());
@@ -1722,18 +1722,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
+        Long teacherId = null;
         if (orderGoodsInfo.getGoodType().equals(GoodTypeEnum.MUSIC)) {
             MusicSheet musicSheet = this.getById(orderGoodsInfo.getUserOrderDetail().getBizId());
             if (musicSheet != null && musicSheet.getSourceType().equals(SourceTypeEnum.TEACHER)) {
-                accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(musicSheet.getUserId()));
+                teacherId = musicSheet.getUserId();
             }
         }
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(teacherId,orderGoodsInfo.getRecomUserId()).jsonString());
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(teacherId,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -6,8 +6,12 @@ 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.google.common.collect.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;
@@ -54,7 +58,7 @@ import java.util.stream.Collectors;
 public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMemberRecordMapper, PaymentDivMemberRecord> implements PaymentDivMemberRecordService {
 
     @Autowired
-    private PaymentDivMemberService paymentDivMemberService;
+    private TenantMemberService tenantMemberService;
 
     @Autowired
     private PaymentMerchantConfigService paymentMerchantConfigService;
@@ -138,6 +142,9 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private TenantTeacherAccountRecordService tenantTeacherAccountRecordService;
+
 
     /**
      * 查询详情
@@ -246,7 +253,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
 
 
             BigDecimal tenantAmount = tenantAlbumContent.getSalePrice().subtract(tenantAlbumContent.getOriginalPrice())
-                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple()));
+                    .multiply(BigDecimal.valueOf(tenantAlbumContent.getBuyMultiple())).setScale(2, RoundingMode.HALF_UP);
 
             tenantdivMap.merge(tenantAlbumContent.getTenantId(), tenantAmount, BigDecimal::add);
             tenantdivMap.merge(-1L, tenantAmount, BigDecimal::subtract);
@@ -297,7 +304,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 保存购买记录
         musicSheetService.addMusicSheetPurchaseRecord(userPaymentOrder, actualPrice, serviceFeeAmount);
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -311,7 +318,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
 
                 // 老师收入
-                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice);
+                BigDecimal teacherAmount = BigDecimal.ONE.subtract(serviceFee).multiply(expectPrice).setScale(2, RoundingMode.HALF_UP);
 
                 // 判断分润给机构 还是给老师
                 // 机构ID = 0 老师设置了不分润
@@ -431,7 +438,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             log.info("buyPracticeCourseSuccess ok");
 
 
-            String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
             UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
             if (StringUtils.isBlank(userAccountConfig)) {
                 accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -567,7 +574,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
 
 
-            String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
             UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
             if (StringUtils.isBlank(userAccountConfig)) {
                 accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -652,7 +659,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         BigDecimal teacherAmount = expectPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
         // 判断分润给机构 还是给老师
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
@@ -798,12 +805,28 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         // 计算分润
         teacherAmount(userPaymentOrder, tenantdivMap, teacherMap,tenantShare, tenantdivMap.get(-1L));
 
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
 
-        // 写入机构收支表
-        tenantDivRecord(userPaymentOrder, tenantdivMap,false);
 
-        // 写入平台
-        platformDivRecord(userPaymentOrder, tenantdivMap);
+        if (accountTenantTo.getIncomeTenant() >0 ){
+
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+        } else {
+            // 写入平台
+            platformDivRecord(userPaymentOrder, tenantdivMap);
+            // 写入机构收支表
+            tenantDivRecord(userPaymentOrder, tenantdivMap,false);
+
+        }
 
         // 写入机构分润
         tenantDivRecord(userPaymentOrder, tenantShare,true);
@@ -855,63 +878,65 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         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(), k);
-//                    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(k)
-                        .appId(merchantConfig != null ? merchantConfig.getAppId() : null)
-                        .memberId(paymentDivMember != null ? paymentDivMember.getMemberId() : null)
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+
+        BigDecimal amount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        boolean tenantEnterFlag = false;
+        //  执行分账
+        TenantMember tenantMember = null;
+        String divideOrderNo = IdWorker.getIdStr();
+        BigDecimal feeAmt = BigDecimal.ZERO;
+        if (merchantConfig != null && newestPayment != null) {
+            if (accountTenantTo.getIncomeTenant() > 0) {
+                tenantMember = tenantMemberService
+                        .getByAppIdAndTenantId(merchantConfig.getAppId(), accountTenantTo.getIncomeTenant(),merchantConfig.getPayerType());
+            }
+            if (tenantMember != null) {
+                // 执行分账逻辑
+                BasePaymentService paymentService = paymentServiceContext.getPaymentService(merchantConfig.getPaymentVendor());
+                DivideReq.DivMember divMember = DivideReq.DivMember.builder()
+                        .memberId(tenantMember.getMemberId())
+                        .amount(amount)
+                        .feeFlag("Y")
+                        .build();
+                DivideReq divideReq = DivideReq.builder()
+                        .transNo(newestPayment.getTransNo())
                         .orderNo(userPaymentOrder.getOrderNo())
-                        .divOrderNo(divideOrderNo)
-                        .transNo(newestPayment != null ? newestPayment.getTransNo() : null)
-                        .amount(v)
-                        .tenantEnterFlag(tenantEnterFlag)
-                        .status("SUCCESS")
-                        .feeFlag(true)
-                        .feeAmt(feeAmt)
+                        .divideOrderNo(divideOrderNo)
+                        .divideAmount(amount)
+                        .divMembers(Lists.newArrayList(divMember))
                         .build();
-                paymentDivMemberRecords.add(paymentDivMemberRecord);
-            }
+                try {
+                    DivideResp divide = paymentService.divide(divideReq);
+                    feeAmt = divide.getFeeAmount();
+                    tenantEnterFlag = true;
+                } catch (Exception e) {
+                    log.error("分账失败 分账对象 {} 分账数据 {} 分账订单号 {}", tenantMember, divideReq, divideOrderNo);
+                }
 
-        });
-        paymentDivMemberRecordService.saveBatch(paymentDivMemberRecords);
+            }
+        }
+        // 写入分账记录表
+        PaymentDivMemberRecord paymentDivMemberRecord = PaymentDivMemberRecord.builder()
+                .tenantId(accountTenantTo.getIncomeTenant())
+                .appId(merchantConfig != null ? merchantConfig.getAppId() : null)
+                .memberId(tenantMember != null ? tenantMember.getMemberId() : null)
+                .orderNo(userPaymentOrder.getOrderNo())
+                .divOrderNo(divideOrderNo)
+                .transNo(newestPayment != null ? newestPayment.getTransNo() : null)
+                .amount(amount)
+                .tenantEnterFlag(tenantEnterFlag)
+                .status("SUCCESS")
+                .feeFlag(true)
+                .feeAmt(feeAmt)
+                .build();
+        paymentDivMemberRecordService.save(paymentDivMemberRecord);
     }
 
     private void teacherShare(UserOrderDetailVo userPaymentOrder, BigDecimal shareFee) {
@@ -935,58 +960,149 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
     private void platformDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap) {
         // 写入平台收入表
         Date date = new Date();
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+        if (StringUtils.isBlank(userAccountConfig)) {
+            accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+        } else {
+            accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+        }
+        AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name());
         BigDecimal amount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+        PostStatusEnum platformPostStatus = PostStatusEnum.RECORDED;
+        if (accountTenantTo.getIncomeTenant() >0 ){
+            amount = tenantdivMap.get(-1L);
+            platformPostStatus = PostStatusEnum.WAIT;
+
+        }
 
         if (amount.compareTo(BigDecimal.ZERO) <= 0) {
             return;
         }
+
         PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
-                InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.valueOf(userPaymentOrder.getOrderType().name()), userPaymentOrder.getBizId(),
+                InOrOutEnum.IN, platformPostStatus, bizTypeEnum, userPaymentOrder.getBizId(),
                 userPaymentOrder.getOrderNo(), date);
         platformCashAccountRecordService.save(platformCashAccountRecord);
+        if (accountTenantTo.getIncomeTenant() >0 ){
+            // 写入机构支出到平台
+            // 写入机构流水表
+            TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
+                    .tenantId(accountTenantTo.getIncomeTenant())
+                    .transAmount(amount)
+                    .platformCashAccountRecordId(platformCashAccountRecord.getId())
+                    .sourceType(SourceTypeEnum.PLATFORM)
+                    .inOrOut(InOrOutEnum.OUT.getCode())
+                    .postStatus(PostStatusEnum.WAIT.getCode())
+                    .bizType(bizTypeEnum.getCode())
+                    .bizId(userPaymentOrder.getBizId())
+                    .bizName(userPaymentOrder.getGoodName())
+                    .orderNo(userPaymentOrder.getOrderNo())
+                    .build();
+            tenantAccountRecordService.save(tenantAccountRecord);
+        }
     }
 
     private void tenantDivRecord(UserOrderDetailVo userPaymentOrder, Map<Long, BigDecimal> tenantdivMap,boolean share) {
         // 写入收支表
-        List<TenantAccountRecord> tenantAccountRecordList = new ArrayList<>();
         Date date = new Date();
-        tenantdivMap.forEach((tenantId, amount) -> {
+        for (Map.Entry<Long, BigDecimal> entry : tenantdivMap.entrySet()) {
+            Long tenantId = entry.getKey();
+            BigDecimal amount = entry.getValue();
+            BigDecimal tenantAmount = amount;
             if (tenantId.equals(-1L)) {
-                return;
+                continue;
             }
-            if (amount.compareTo(BigDecimal.ZERO) <=0) {
-                return;
+            if (amount.compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
             }
-            String type = userPaymentOrder.getGoodType().getCode() ;
+            String type = userPaymentOrder.getGoodType().getCode();
             if (share) {
                 type = type + "_SHARE";
             }
 
             AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(type);
 
+            // 如果是机构入账
+            String userAccountConfig = userPaymentOrder.getAccountConfig();
+            UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
+            if (StringUtils.isBlank(userAccountConfig)) {
+                accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+            } else {
+                accountTenantTo = JSON.parseObject(userAccountConfig, UserPaymentOrderWrapper.AccountTenantTo.class);
+            }
+            PostStatusEnum tenantPostStatus = PostStatusEnum.WAIT;
+            boolean isIncomeTenant = false;
+            if (accountTenantTo.getIncomeTenant() > 0 && tenantId.equals(accountTenantTo.getIncomeTenant()) && !share) {
+                tenantAmount = tenantdivMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                tenantPostStatus = PostStatusEnum.RECORDED;
+                isIncomeTenant = true;
+            }
 
-            // 写入平台支出表
-            PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
-                    InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(),
-                    userPaymentOrder.getOrderNo(), date);
-            platformCashAccountRecordService.save(platformCashAccountRecord2);
+            Long platformCashAccountRecordId = null;
+            if (!isIncomeTenant) {
+                // 写入平台支出表
+                PlatformCashAccountRecord platformCashAccountRecord2 = new PlatformCashAccountRecord(userPaymentOrder.getUserId(), amount,
+                        InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, userPaymentOrder.getBizId(),
+                        userPaymentOrder.getOrderNo(), date);
+                platformCashAccountRecordService.save(platformCashAccountRecord2);
+                platformCashAccountRecordId = platformCashAccountRecord2.getId();
+            }
 
             // 写入机构流水表
             TenantAccountRecord tenantAccountRecord = TenantAccountRecord.builder()
                     .tenantId(tenantId)
-                    .transAmount(amount)
-                    .platformCashAccountRecordId(platformCashAccountRecord2.getId())
+                    .transAmount(tenantAmount)
+                    .platformCashAccountRecordId(platformCashAccountRecordId)
+                    .sourceType(SourceTypeEnum.ORDER)
                     .inOrOut(InOrOutEnum.IN.getCode())
-                    .postStatus(PostStatusEnum.WAIT.getCode())
+                    .postStatus(tenantPostStatus.getCode())
                     .bizType(bizTypeEnum.getCode())
                     .bizId(userPaymentOrder.getBizId())
                     .bizName(userPaymentOrder.getGoodName())
                     .orderNo(userPaymentOrder.getOrderNo())
                     .build();
-            tenantAccountRecordList.add(tenantAccountRecord);
 
-        });
-        tenantAccountRecordService.saveBatch(tenantAccountRecordList);
+            if (!isIncomeTenant) {
+                tenantAccountRecord.setSourceType(SourceTypeEnum.PLATFORM);
+            }
+            tenantAccountRecordService.save(tenantAccountRecord);
+            // 是否结算到老师, 结算到老师的,写入机构支出 和老师机构收入
+            if ((accountTenantTo.isIncomeTeacher()&& !share) || (share && accountTenantTo.isShareTeacher())) {
+                TenantAccountRecord tenantAccountRecordOut = TenantAccountRecord.builder()
+                        .tenantId(tenantId)
+                        .transAmount(amount)
+                        .platformCashAccountRecordId(null)
+                        .sourceType(SourceTypeEnum.TEACHER)
+                        .inOrOut(InOrOutEnum.OUT.getCode())
+                        .postStatus(PostStatusEnum.WAIT.getCode())
+                        .bizType(bizTypeEnum.getCode())
+                        .bizId(userPaymentOrder.getBizId())
+                        .bizName(userPaymentOrder.getGoodName())
+                        .orderNo(userPaymentOrder.getOrderNo())
+                        .build();
+                tenantAccountRecordService.save(tenantAccountRecordOut);
+
+                TenantTeacherAccountRecord tenantTeacherAccountRecord = TenantTeacherAccountRecord.builder()
+                        .tenantId(tenantId)
+                        .teacherId(userPaymentOrder.getMerchId())
+                        .accountRecordId(tenantAccountRecordOut.getId())
+                        .sourceType(SourceTypeEnum.TENANT)
+                        .transAmount(amount)
+                        .inOrOut(InOrOutEnum.IN.getCode())
+                        .postStatus(PostStatusEnum.WAIT.getCode())
+                        .bizType(bizTypeEnum.getCode())
+                        .bizId(userPaymentOrder.getBizId())
+                        .bizName(userPaymentOrder.getGoodName())
+                        .orderNo(userPaymentOrder.getOrderNo())
+                        .build();
+                tenantTeacherAccountRecordService.save(tenantTeacherAccountRecord);
+                tenantAccountRecordOut.setPlatformCashAccountRecordId(tenantTeacherAccountRecord.getId());
+                tenantAccountRecordService.updateById(tenantAccountRecordOut);
+
+            }
+
+        }
     }
 
 
@@ -998,7 +1114,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             return;
         }
 
-        String userAccountConfig = redisCacheService.getUserAccountConfig(userPaymentOrder.getSubOrderNo());
+        String userAccountConfig = userPaymentOrder.getAccountConfig();
         UserPaymentOrderWrapper.AccountTenantTo accountTenantTo;
         if (StringUtils.isBlank(userAccountConfig)) {
             accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();

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

@@ -154,14 +154,11 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(null,orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

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

@@ -54,6 +54,7 @@ import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.UserPaymentOrderWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
@@ -1108,19 +1109,45 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     }
 
     @Override
-    public Long teacherSettlementFrom(Long teacherId) {
+    public UserPaymentOrderWrapper.AccountTenantTo teacherSettlementFrom(Long teacherId, Long recomUserId) {
         // 判断分润给机构 还是给老师
-        if (teacherId == null) {
-            return -1L;
+
+
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
+
+        if (teacherId != null) {
+            Teacher teacher = getById(teacherId);
+            if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
+                accountTenantTo.setIncomeTenant(0L);
+            } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
+                accountTenantTo.setIncomeTenant(teacher.getTenantId());
+                if (ESettlementFrom.TEACHER.equals(teacher.getSettlementFrom())) {
+                    accountTenantTo.setIncomeTeacher(true);
+                }
+            } else {
+                // 分润给老师
+                accountTenantTo.setIncomeTenant(-1L);
+                accountTenantTo.setIncomeTeacher(true);
+            }
         }
-        Teacher teacher = getById(teacherId);
-        if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
-            return 0L;
-        } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
-            return teacher.getTenantId();
-        } else {
-            // 分润给老师
-            return  -1L;
+
+
+        if (recomUserId != null) {
+            Teacher teacher = getById(recomUserId);
+            if (teacher.getIsSettlement() !=null && !teacher.getIsSettlement()) {
+                accountTenantTo.setShareTenant(0L);
+            } else if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
+                accountTenantTo.setShareTenant(teacher.getTenantId());
+                if (ESettlementFrom.TEACHER.equals(teacher.getSettlementFrom())) {
+                    accountTenantTo.setShareTeacher(true);
+                }
+            } else {
+                // 分润给老师
+                accountTenantTo.setShareTenant(-1L);
+                accountTenantTo.setShareTeacher(true);
+            }
         }
+
+        return accountTenantTo;
     }
 }

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

@@ -209,6 +209,9 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
 
         UserOrderDetail userOrderDetail = JSON.parseObject(JSON.toJSONString(orderGoodsInfo), UserOrderDetail.class);
 
+
+        // 设置金额入账去向
+        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = teacherService.teacherSettlementFrom(null, orderGoodsInfo.getRecomUserId());
         BigDecimal price = BigDecimal.ZERO;
         // 学生购买机构专辑
         switch (orderGoodsInfo.getPaymentClient()) {
@@ -229,6 +232,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 tenantAlbumContent.setBuyNumber(1);
                 tenantAlbumContent.setBuyCycle(tenantAlbumContent.getBuyCycle()*tenantAlbumContent.getBuyMultiple());
                 tenantAlbumContent.setTenantId(tenantInfo.getId());
+                accountTenantTo.setIncomeTenant(tenantInfo.getId());
                 break;
             }
 
@@ -262,18 +266,13 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
         userOrderDetail.setCouponAmount(BigDecimal.ZERO);
         userOrderDetail.setExpectPrice(userOrderDetail.getOriginalPrice());
         userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
+        userOrderDetail.setAccountConfig(accountTenantTo.jsonString());
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
-
-        // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-
+        userOrderDetail.setAccountConfig(accountTenantTo.jsonString());
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
 
     }
 

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

@@ -13,10 +13,10 @@ import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysAreaMapper;
 import com.yonge.cooleshow.biz.dal.service.PaymentMerchantConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.enums.EPayerType;
 import com.yonge.toolset.base.exception.BizException;
@@ -265,4 +265,17 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .one();
     }
 
+    @Override
+    public TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType) {
+        return this.lambdaQuery()
+                .eq(TenantMember::getAppId, appId)
+                .eq(TenantMember::getTenantId, tenantId)
+                .eq(TenantMember::getStatus, AuthStatusEnum.PASS)
+                .eq(TenantMember::getPayerType, payerType)
+                .orderByDesc(TenantMember::getUpdateTime)
+                .last("limit 1")
+                .one();
+
+    }
+
 }

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

@@ -0,0 +1,66 @@
+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 org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantTeacherAccountRecordWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantTeacherAccountRecordMapper;
+import com.yonge.cooleshow.biz.dal.service.TenantTeacherAccountRecordService;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@Slf4j
+@Service
+public class TenantTeacherAccountRecordServiceImpl extends ServiceImpl<TenantTeacherAccountRecordMapper, TenantTeacherAccountRecord> implements TenantTeacherAccountRecordService {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantTeacherAccountRecord
+     */
+	@Override
+    public TenantTeacherAccountRecord detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+    
+    /**
+     * 分页查询
+     * @param page IPage<TenantTeacherAccountRecord>
+     * @param query TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery
+     * @return IPage<TenantTeacherAccountRecord>
+     */
+    @Override
+    public IPage<TenantTeacherAccountRecord> selectPage(IPage<TenantTeacherAccountRecord> page, TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecordQuery query) {
+        
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+	
+    /**
+     * 添加
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord) {    	
+        
+        return this.save(JSON.parseObject(tenantTeacherAccountRecord.jsonString(), TenantTeacherAccountRecord.class));
+    }
+
+    /**
+     * 更新
+     * @param tenantTeacherAccountRecord TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(TenantTeacherAccountRecordWrapper.TenantTeacherAccountRecord tenantTeacherAccountRecord){
+
+        return this.updateById(JSON.parseObject(tenantTeacherAccountRecord.jsonString(), TenantTeacherAccountRecord.class));       
+    }
+}

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

@@ -1003,7 +1003,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1017,7 +1017,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1027,7 +1027,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1044,7 +1044,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 if (Objects.isNull(teacher)) {
                     throw new BizException("老师信息不存在");
                 }
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 ) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
                 break;
@@ -1060,7 +1060,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 throw new BizException("推荐人信息不存在");
             }
             if (!payTypeReq.getClientType().equals(ClientEnum.TEACHER)) {
-                if (teacher.getTenantId() != null && teacher.getTenantId() > 0 && ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
+                if (teacher.getTenantId() != null && teacher.getTenantId() > 0) {
                     resp.setPaymentVersion(EPaymentVersion.V2);
                 }
             }

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

@@ -342,15 +342,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
 
         orderGoodsInfo.setUserOrderDetail(userOrderDetail);
 
-
+        userOrderDetail.setAccountConfig(teacherService.teacherSettlementFrom(lessonGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
         // 设置金额入账去向
-        UserPaymentOrderWrapper.AccountTenantTo accountTenantTo = new UserPaymentOrderWrapper.AccountTenantTo();
-        if (orderGoodsInfo.getRecomUserId() !=null) {
-            accountTenantTo.setShareTenant(teacherService.teacherSettlementFrom(orderGoodsInfo.getRecomUserId()));
-        }
-        accountTenantTo.setIncomeTenant(teacherService.teacherSettlementFrom(lessonGroup.getTeacherId()));
         // 存入缓存
-        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), accountTenantTo.jsonString());
+//        redisCacheService.saveUserAccountConfig(orderGoodsInfo.getSubOrderNo(), teacherService.teacherSettlementFrom(lessonGroup.getTeacherId(),orderGoodsInfo.getRecomUserId()).jsonString());
 
     }
 

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java

@@ -2,6 +2,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.enums.AuthStatusEnum;
 import com.yonge.cooleshow.common.enums.EPayerType;
@@ -52,6 +53,11 @@ public class TenantMemberWrapper {
         @ApiModelProperty("公司名称")
         private String name;
 
+        @ApiModelProperty("类型")
+        private EPayerType payerType;
+
+        @ApiModelProperty("状态")
+        private AuthStatusEnum status;
 
 
         public String jsonString() {

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

@@ -0,0 +1,63 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 机构老师流水表
+ * 2023-10-09 17:39:42
+ */
+@ApiModel(value = "TenantTeacherAccountRecordWrapper对象", description = "机构老师流水表查询对象")
+public class TenantTeacherAccountRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantTeacherAccountRecordQuery-机构老师流水表")
+    public static class TenantTeacherAccountRecordQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantTeacherAccountRecordQuery from(String json) {
+            return JSON.parseObject(json, TenantTeacherAccountRecordQuery.class);
+        }
+    }  
+
+	@ApiModel(" TenantTeacherAccountRecord-机构老师流水表")
+    public static class TenantTeacherAccountRecord {
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantTeacherAccountRecord from(String json) {
+            return JSON.parseObject(json, TenantTeacherAccountRecord.class);
+        }
+	}
+
+}

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserPaymentOrderWrapper.java

@@ -911,13 +911,18 @@ public class UserPaymentOrderWrapper {
     @ApiModel("AccountTo-订单金额接收方")
     public static class AccountTenantTo implements Serializable {
 
-        @ApiModelProperty("收入机构  -1 默认老师自己 0不分润")
+        @ApiModelProperty("收入机构  -1 默认平台 0不分润")
         private Long incomeTenant = -1L;
 
+        @ApiModelProperty("是否到老师")
+        private boolean incomeTeacher = false;
 
-        @ApiModelProperty("分享机构  -1 默认老师自己 0不分润")
+
+        @ApiModelProperty("分享机构  -1 默认平台 0不分润")
         private Long shareTenant = -1L;
 
+        @ApiModelProperty("是否到老师")
+        private boolean shareTeacher = false;
 
         public String jsonString() {
             return JSON.toJSONString(this);

+ 8 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantMemberMapper.xml

@@ -48,10 +48,16 @@
         FROM tenant_member t
         <where>
             <if test="param.memberId != null and param.memberId != ''">
-                and t.member_id_ = #{param.memberId}
+                and t.member_id_ like concat('%',#{param.memberId},'%')
             </if>
             <if test="param.name != null and param.name != ''">
-                and t.name_ = #{param.name}
+                and t.name_ like concat('%',#{param.name},'%')
+            </if>
+            <if test="param.payerType != null">
+                and t.payer_type_ = #{param.payerType}
+            </if>
+            <if test="param.status != null">
+                and t.status_ = #{param.status}
             </if>
         </where>
     </select>

+ 33 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantTeacherAccountRecordMapper.xml

@@ -0,0 +1,33 @@
+<?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.TenantTeacherAccountRecordMapper">
+
+	 
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.teacher_id_ AS teacherId
+        , t.account_record_id_ AS accountRecordId
+        , t.source_type_ AS sourceType
+        , 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> 
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantTeacherAccountRecord">
+		SELECT         
+        	<include refid="baseColumns" />
+		FROM tenant_teacher_account_record t
+	</select>
+    
+</mapper>

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

@@ -42,6 +42,7 @@
         , t.good_price_ as goodPrice
         , t.plantform_fee_ as plantformFee
         , t.plantform_fee_rate_ as plantformFeeRate
+        , t.account_config_ as accountConfig
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>

+ 38 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -28,8 +28,10 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * 即时通讯群组(ImGroup)表控制层
@@ -69,6 +71,42 @@ public class ImGroupController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation("创建群聊")
+    @PostMapping(value = "/create/v2")
+    public HttpResponseResult createV2(@Valid @RequestBody ImGroupWrapper.ImGroup imGroup, BindingResult bindingResult) throws Exception {
+
+        // 将imUserId 转为userId
+        Set<String> imUserIdList = imGroup.getImUserIdList();
+
+        Set<Long> studentIdList = new HashSet<>();
+        for (String imUserId : imUserIdList) {
+            studentIdList.add(Long.parseLong(imGroupService.analysisImUserId(imUserId)));
+        }
+        imGroup.setStudentIdList(studentIdList);
+
+        ValidationKit.ignoreFields(bindingResult,"id");
+        imGroup.setCreateBy(sysUserService.getUserId());
+        imGroupService.create(imGroup);
+        return succeed();
+    }
+
+    @ApiOperation("添加群成员")
+    @PostMapping(value = "/addGroupMember/v2")
+    public HttpResponseResult addGroupMemberV2(@Valid @RequestBody ImGroupWrapper.ImGroup imGroup,
+                                               BindingResult bindingResult) throws Exception {
+        // 将imUserId 转为userId
+        Set<String> imUserIdList = imGroup.getImUserIdList();
+
+        Set<Long> studentIdList = new HashSet<>();
+        for (String imUserId : imUserIdList) {
+            studentIdList.add(Long.parseLong(imGroupService.analysisImUserId(imUserId)));
+        }
+        imGroup.setStudentIdList(studentIdList);
+
+        imGroupService.addGroupMember(imGroup.getGroupId(), imGroup.getStudentIdList());
+        return succeed();
+    }
+
     @ApiOperation("解散群聊")
     @PostMapping(value = "/dismiss/{groupId}")
     public HttpResponseResult dismiss(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {