liweifan 2 سال پیش
والد
کامیت
e296c286e6
17فایلهای تغییر یافته به همراه553 افزوده شده و 178 حذف شده
  1. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java
  2. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java
  3. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  4. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java
  5. 23 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  6. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  7. 2 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  8. 5 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  9. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  10. 156 50
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  11. 125 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  12. 9 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  13. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountRecordVo.java
  14. 3 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml
  15. 4 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  16. 9 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  17. 155 24
      toolset/utils/src/main/java/com/yonge/toolset/utils/collection/ListUtil.java

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountDao.java

@@ -77,8 +77,8 @@ public interface UserAccountDao extends BaseMapper<UserAccount>{
     List<AccountTotal> accountTotal(@Param("timeType")String timeType,@Param("param")TotalReq totalReq);
 	/**
 	 * 统计本次变更前已经变更的金额
-	 * @param accountRecordDto
+	 * @param orderNo
 	 * @return
 	 */
-    BigDecimal totalTransAmount(@Param("param") UserAccountRecordDto accountRecordDto);
+    BigDecimal totalTransAmountByOrderNo(@Param("orderNo") String orderNo);
 }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PlatformCashAccountRecord.java

@@ -67,6 +67,20 @@ public class PlatformCashAccountRecord implements Serializable {
     @ApiModelProperty(value = "修改时间")
     private Date updateTime;
 
+    public PlatformCashAccountRecord() {
+    }
+
+    public PlatformCashAccountRecord(Long accountId, BigDecimal transAmount, InOrOutEnum inOrOut, PostStatusEnum postStatus, AccountBizTypeEnum bizType, Long bizId, String orderNo) {
+        this.accountId = accountId;
+        this.transAmount = transAmount;
+        this.inOrOut = inOrOut;
+        this.postStatus = postStatus;
+        this.bizType = bizType;
+        this.bizId = bizId;
+        this.orderNo = orderNo;
+        this.createTime = new Date();
+        this.updateTime = new Date();
+    }
 
     public Long getId() {
         return id;

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

@@ -22,6 +22,10 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     VIP_SHARE("会员分润", InOrOutEnum.IN),
     MALL_SHARE("商品分润", InOrOutEnum.IN),
 
+
+    //老师账户暂未记录
+    PIAON_ROOM("琴房充值", InOrOutEnum.OUT),
+
     ;
     @EnumValue
     private String code;

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountService.java

@@ -12,6 +12,8 @@ import com.yonge.cooleshow.biz.dal.vo.res.AccountTotal;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 
+import java.util.List;
+
 /**
  * 用户账户表 服务类
  * 入账逻辑:
@@ -55,8 +57,9 @@ public interface UserAccountService extends IService<UserAccount>  {
      * @author liweifan
      * @date 2022-07-20
      */
-    HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto);
+    HttpResponseResult accountRecord(UserAccountRecordDto accountRecordDto);
 
+    HttpResponseResult<UserAccountRecord> accountRecord(List<UserAccountRecordDto> accountRecordDtos);
     /***
      * 入账结算(入账状态变更)
      * @author liweifan

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alipay.api.domain.AccountRecord;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto.CoursePlanDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
@@ -24,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -88,9 +91,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private SysMessageService sysMessageService;
     @Autowired
     private ImGroupMemberService imGroupMemberService;
-
     @Autowired
     private UserOrderRefundService userOrderRefundService;
+    @Autowired
+    private UserAccountService userAccountService;
 
     @Override
     public CourseGroupDao getDao() {
@@ -776,11 +780,25 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             teacherSalaryList.add(teacherSalary);
         });
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
+        //写老师账户
+        addTeacherAccount(orderParam, teacherSalaryList, totalExpectPrice);
         log.info("buyLiveCourseSuccess ok");
         //课程购买成功后进行消息推送
         buyLiveSendMessage(studentPayment, courseGroup);
     }
 
+    //写入老师账户
+    private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList, BigDecimal totalExpectPrice) {
+        //老师待入账
+        List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
+        for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
+            UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
+                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo());
+            userAccountRecordDtos.add(dto);
+        }
+        userAccountService.accountRecord(userAccountRecordDtos);
+    }
+
     /**
      * 课程购买成功后进行消息推送
      *
@@ -1010,8 +1028,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             try {
                 this.updateById(courseGroup);
             } catch (Exception e) {
-                log.error("openCourseGroup error >>> courseGroup: {} ",  JSON.toJSONString(courseGroup));
-                log.error("openCourseGroup error >>> ",  e.getCause());
+                log.error("openCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
+                log.error("openCourseGroup error >>> ", e.getCause());
             }
         });
     }
@@ -1058,8 +1076,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 courseGroup.setUpdatedTime(new Date());
                 this.updateById(courseGroup);
             } catch (Exception e) {
-                log.error("closeCourseGroup error >>> courseGroup: {} ",  JSON.toJSONString(courseGroup));
-                log.error("closeCourseGroup error >>> ",  e.getCause());
+                log.error("closeCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
+                log.error("closeCourseGroup error >>> ", e.getCause());
             }
         });
     }

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

@@ -1121,6 +1121,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyPracticeCourseSuccess ok");
 
+        //写老师账户
+        addTeacherAccount(orderParam, teacherSalaryList);
+
         Set<Long> studentIds = new HashSet();
         studentIds.add(studentId);
         try {
@@ -1138,6 +1141,18 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
     }
 
+    //写入老师账户
+    private void addTeacherAccount(UserOrderDetailVo orderParam, List<CourseScheduleTeacherSalary> teacherSalaryList) {
+        //老师待入账
+        List<UserAccountRecordDto> userAccountRecordDtos = new ArrayList<>();
+        for (CourseScheduleTeacherSalary salary : teacherSalaryList) {
+            UserAccountRecordDto dto = new UserAccountRecordDto(orderParam.getMerchId(), PostStatusEnum.WAIT, salary.getActualSalary(),
+                    InOrOutEnum.IN, AccountBizTypeEnum.LIVE, salary.getCourseScheduleId(), orderParam.getGoodName(), orderParam.getOrderNo());
+            userAccountRecordDtos.add(dto);
+        }
+        userAccountService.accountRecord(userAccountRecordDtos);
+    }
+
     /**
      * 学生购买陪练课-失败-回调
      */

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

@@ -5,14 +5,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -94,11 +93,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         studentService.updateById(studentVo);
         //会员购买记录入库
         vipCardRecordService.save(vipCardRecord);
-        //记录平台收入
-        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord();
-        platformCashAccountRecord.setAccountId(orderDetailVo.getUserId());
-//        platformCashAccountRecord.setTransAmount(ClientEnum.STUDENT.getCode());
-//        platformCashAccountRecordService.save();
         //会员购买消息推送
         authSend(studentVo.getUserId(), studentVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN));
     }

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

@@ -462,9 +462,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         // 检查已经购买
         checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId());
 
-
         orderCreateRes.setRes(true);
-        orderCreateRes.setMerchId(musicSheet.getUserId());
+        if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+            orderCreateRes.setMerchId(musicSheet.getUserId());
+        }
         orderCreateRes.setGoodType(orderCreateRes.getGoodType());
         orderCreateRes.setBizId(musicSheet.getId());
         orderCreateRes.setGoodNum(1);
@@ -602,40 +603,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount,
                                    Long musicSheetId) {
-
         BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
-
-        //插入老师账户变更记录
-        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+        //插入老师账户变更记录-老师预收
+        userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
                         AccountBizTypeEnum.MUSIC, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
-
-        if (recordRes.getStatus()) {
-            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
-        }
-
-        //todo 插入平台实收
-
-        //判断是否分润
-        if (null != userOrderDetailVo.getRecomUserId()) {
-            // 分润比例
-            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHARE_FEE))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
-            //分润金额
-            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
-
-            //插入分润老师账户变更记录
-            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
-                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
-                            AccountBizTypeEnum.MUSIC_SHARE, musicSheetId, userOrderDetailVo.getGoodName(), userOrderDetailVo.getOrderNo()));
-
-            if (recomRecordRes.getStatus()) {
-                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
-            }
-
-            //todo 插入平台分润支出
-        }
     }
 
     @Override

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

@@ -5,10 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
@@ -31,6 +35,8 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
     private PianoRoomTimeService pianoRoomTimeService;
     @Autowired
     private TeacherService teacherService;
+    @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
 
     @Override
     public PianoRoomBuyRecordVo detail(Long id) {
@@ -89,6 +95,11 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
             pianoRoomTime.setUpdateTime(new Date());
             pianoRoomTimeService.updateById(pianoRoomTime);
         }
+
+        //计入平台实收
+        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), orderDetailVo.getExpectPrice(),
+                InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.PIAON_ROOM, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+        platformCashAccountRecordService.save(platformCashAccountRecord);
     }
 
 }

+ 156 - 50
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -2,12 +2,14 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TotalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
@@ -20,10 +22,12 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
+import com.yonge.toolset.utils.collection.ListUtil;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserAccount;
@@ -35,10 +39,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -67,66 +70,133 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
     }
 
     @Override
-    public HttpResponseResult<UserAccountRecord> accountRecord(UserAccountRecordDto accountRecordDto) {
-        if (null == accountRecordDto.getInOrOut()
-                || null == accountRecordDto.getPostStatus()
-                || (!PostStatusEnum.WAIT.equals(accountRecordDto.getPostStatus()) && !PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()))
-        ) {
-            throw new BizException("记录入账-入账状态异常: param is {}", JSONObject.toJSONString(accountRecordDto));
-        }
+    public HttpResponseResult accountRecord(UserAccountRecordDto accountRecordDto) {
+        return accountRecord(Arrays.asList(accountRecordDto));
+    }
 
-        if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
-                || null == accountRecordDto.getBizType()) {
-            throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+    @Override
+    public HttpResponseResult accountRecord(List<UserAccountRecordDto> accountRecordDtos) {
+        if (CollectionUtils.isEmpty(accountRecordDtos)) {
+            return HttpResponseResult.succeed();
         }
-        if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) < 0) {
-            throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+        //校验参数
+        for (UserAccountRecordDto accountRecordDto : accountRecordDtos) {
+            if (null == accountRecordDto.getInOrOut()
+                    || null == accountRecordDto.getPostStatus()
+                    || (!PostStatusEnum.WAIT.equals(accountRecordDto.getPostStatus()) && !PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()))
+            ) {
+                throw new BizException("记录入账-入账状态异常: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
+
+            if (null == accountRecordDto.getTransAmount() || null == accountRecordDto.getBizId()
+                    || null == accountRecordDto.getBizType()) {
+                throw new BizException("记录入账-缺少入账参数: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
+            if (BigDecimal.ZERO.compareTo(accountRecordDto.getTransAmount()) < 0) {
+                throw new BizException("记录入账-变动金额不能为负数: param is {}", JSONObject.toJSONString(accountRecordDto));
+            }
         }
+        //按照不同的账户分组
+        Map<Long, List<UserAccountRecordDto>> accountMap = accountRecordDtos.stream().collect(Collectors.groupingBy(UserAccountRecordDto::getAccountId));
+        Set<Long> accountIds = accountMap.keySet();
 
-        HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
-                .runIfLockToFunction(CacheNameEnum.LOCK_RECORD_ACCOUNT.getRedisKey(accountRecordDto.getAccountId())
-                        , this::doAccountRecord, accountRecordDto, 10L);
-        if (null != res) {
-            return res;
-        } else {
-            throw new BizException("记录入账-插入账户记录失败: param is {}", JSONObject.toJSONString(accountRecordDto));
+        for (Long accountId : accountIds) {
+            List<UserAccountRecordDto> userAccountRecordDtos = accountMap.get(accountId);
+            HttpResponseResult<UserAccountRecord> res = DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_RECORD_ACCOUNT.getRedisKey(accountId)
+                            , this::doAccountRecords, userAccountRecordDtos, 10L);
+            if (null != res) {
+                return res;
+            } else {
+                throw new BizException("记录入账-插入账户记录失败: param is {}", JSONObject.toJSONString(userAccountRecordDtos));
+            }
         }
+        return HttpResponseResult.succeed();
     }
 
+
     @Transactional(rollbackFor = Exception.class)
-    HttpResponseResult<UserAccountRecord> doAccountRecord(UserAccountRecordDto accountRecordDto) {
-        //收入要校验金额
-        if (InOrOutEnum.IN.equals(accountRecordDto.getInOrOut())) {
-            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
-                    .eq(UserOrder::getOrderNo, accountRecordDto.getOrderNo()));
-            if (null == userOrder) {
-                throw new BizException("记录入账-未找到入账对应订单信息: param is {}", JSONObject.toJSONString(accountRecordDto));
-            }
-            //收入判断订单金额,所有收入不能大于订单用户付款
-            BigDecimal totalTransAmount = baseMapper.totalTransAmount(accountRecordDto);
-            if (null == totalTransAmount) {
-                totalTransAmount = BigDecimal.ZERO;
+    HttpResponseResult doAccountRecords(List<UserAccountRecordDto> accountRecordDtos) {
+        if (CollectionUtils.isEmpty(accountRecordDtos)) {
+            return HttpResponseResult.succeed();
+        }
+        Long accountId = accountRecordDtos.get(0).getAccountId();
+        //收入入账
+        List<UserAccountRecordDto> collectIn = accountRecordDtos.stream().filter(dto -> InOrOutEnum.IN.equals(dto.getInOrOut())).collect(Collectors.toList());
+        //支出入账
+        List<UserAccountRecordDto> collectOut = accountRecordDtos.stream().filter(dto -> InOrOutEnum.OUT.equals(dto.getInOrOut())).collect(Collectors.toList());
+
+        //******************************************收入***********************************//
+        if (!CollectionUtils.isEmpty(collectIn)) {
+            //收入按照 业务类型-订单号-入账记录 进行分组
+            Map<AccountBizTypeEnum, Map<String, List<UserAccountRecordDto>>> collectInMap = collectIn.stream().collect(
+                    Collectors.groupingBy(UserAccountRecordDto::getBizType,
+                            Collectors.groupingBy(UserAccountRecordDto::getOrderNo)
+                    )
+            );
+
+            for (AccountBizTypeEnum bizType : collectInMap.keySet()) {
+                Map<String, List<UserAccountRecordDto>> collectBizTypeMap = collectInMap.get(bizType);
+                for (String orderNo : collectBizTypeMap.keySet()) {
+                    List<UserAccountRecordDto> userAccountRecords = collectBizTypeMap.get(orderNo);
+                    //本组入账金额
+                    BigDecimal transAmount = BigDecimal.ZERO;
+                    //冻结入账金额
+                    BigDecimal frozenTransAmount = BigDecimal.ZERO;
+
+                    for (UserAccountRecordDto o : userAccountRecords) {
+                        transAmount = transAmount.add(o.getTransAmount());
+                        if (PostStatusEnum.FROZEN.equals(o.getPostStatus())) {
+                            frozenTransAmount = frozenTransAmount.add(o.getTransAmount());
+                        }
+                    }
+                    if (!checkInOrderAmount(bizType, orderNo, transAmount)) {
+                        log.error("记录入账-订单入账金额异常: bizType is {} ,orderNo is {} , transAmount is {} ", bizType.getCode(), orderNo, transAmount);
+                        throw new BizException("记录入账-订单入账金额有误");
+                    }
+                    //冻结入账
+                    if (frozenTransAmount.compareTo(BigDecimal.ZERO) > 0) {
+                        //有冻结金额入账
+                        baseMapper.frozenChangeAccount(accountId, frozenTransAmount, InOrOutEnum.IN.getCode());
+                    }
+                    //批量入账
+                    List<UserAccountRecord> records = ListUtil.convertList(userAccountRecords, UserAccountRecord.class);
+                    userAccountRecordService.saveBatch(records);
+                }
             }
-            //金额校验失败
-            if (null == userOrder || totalTransAmount.add(accountRecordDto.getTransAmount()).compareTo(userOrder.getActualPrice()) > 0) {
-                log.error("记录入账-订单入账总金额大于购买金额: param is {}" + JSONObject.toJSONString(accountRecordDto));
-                accountRecordDto.setErrFlag(1);
-                accountRecordDto.setErrMsg("账户变更异常,订单入账总金额大于购买金额,订单号:" + accountRecordDto.getOrderNo());
+        }
+
+        //******************************************支出***********************************//
+        if (!CollectionUtils.isEmpty(collectOut)) {
+            //支出入账金额
+            BigDecimal outTransAmount = BigDecimal.ZERO;
+            //冻结入账金额
+            BigDecimal frozenTransAmount = BigDecimal.ZERO;
+
+            for (UserAccountRecordDto o : collectOut) {
+                outTransAmount = outTransAmount.add(o.getTransAmount());
+                if (PostStatusEnum.FROZEN.equals(o.getPostStatus())) {
+                    frozenTransAmount = frozenTransAmount.add(o.getTransAmount());
+                }
             }
-        } else {
+
             //支出 需要判断所有支出金额不能大于账户余额
-            UserAccountVo detail = baseMapper.detail(accountRecordDto.getAccountId());
-            if (detail.getAmountUsable().compareTo(accountRecordDto.getTransAmount()) < 0) {
-                throw new BizException("记录入账-账户余额不足: param is {}", JSONObject.toJSONString(accountRecordDto));
+            UserAccountVo detail = baseMapper.detail(accountId);
+
+            if (detail.getAmountUsable().compareTo(outTransAmount) < 0) {
+                log.error("记录入账-订单入账金额异常: param is {} ", JSONObject.toJSONString(collectOut));
+                throw new BizException("记录入账-账户余额不足");
             }
+            //冻结入账
+            if (frozenTransAmount.compareTo(BigDecimal.ZERO) > 0) {
+                //有冻结金额入账
+                baseMapper.frozenChangeAccount(accountId, frozenTransAmount, InOrOutEnum.OUT.getCode());
+            }
+            //批量入账
+            List<UserAccountRecord> records = ListUtil.convertList(collectOut, UserAccountRecord.class);
+            userAccountRecordService.saveBatch(records);
         }
-        //如果是冻结入账,需要修改主账户冻结金额和可用余额
-        if (PostStatusEnum.FROZEN.equals(accountRecordDto.getPostStatus()) && accountRecordDto.getErrFlag() == 0) {
-            baseMapper.frozenChangeAccount(accountRecordDto.getAccountId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-        }
-        //插入账户变更记录
-        userAccountRecordService.save(accountRecordDto);
-        return HttpResponseResult.succeed(accountRecordDto);
+        return HttpResponseResult.succeed();
     }
 
     @Override
@@ -154,6 +224,10 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         if (null == detail) {
             throw new BizException("入账状态变更, 未找到记录信息: recordId is {} postStatus is {}", param.getId(), param.getPostStatus().getCode());
         }
+        if (!PostStatusEnum.WAIT.equals(detail.getPostStatus())
+                && !PostStatusEnum.FROZEN.equals(detail.getPostStatus())) {
+            return HttpResponseResult.succeed();
+        }
         detail.setPostStatus(param.getPostStatus());
         //待入账
         if (PostStatusEnum.WAIT.equals(detail.getPostStatus())) {
@@ -279,5 +353,37 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         return HttpResponseResult.succeed(total);
     }
 
+    /**
+     * 判断是否可以入账
+     *
+     * @param bizType     入账类型
+     * @param orderNo     该笔入账对应订单号
+     * @param transAmount 入账金额
+     * @return
+     */
+    private Boolean checkInOrderAmount(AccountBizTypeEnum bizType, String orderNo, BigDecimal transAmount) {
+        BigDecimal orderExpectPrice = BigDecimal.ZERO;
+        if (AccountBizTypeEnum.MALL_SHARE.equals(bizType)) {
+            //todo 查询商城订单价格
+        } else {
+            UserOrder userOrder = orderService.getOne(Wrappers.<UserOrder>lambdaQuery()
+                    .eq(UserOrder::getOrderNo, orderNo));
+            if (null == userOrder) {
+                return false;
+            }
+            orderExpectPrice = userOrder.getExpectPrice();
+        }
+
+        //收入判断订单金额,所有收入不能大于订单用户付款
+        BigDecimal totalTransAmount = baseMapper.totalTransAmountByOrderNo(orderNo);
+        if (null == totalTransAmount) {
+            totalTransAmount = BigDecimal.ZERO;
+        }
+        //金额校验失败
+        if (totalTransAmount.add(transAmount).compareTo(orderExpectPrice) > 0) {
+            return false;
+        }
+        return true;
+    }
 
 }

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

@@ -4,7 +4,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
@@ -76,10 +80,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Autowired
     private PianoRoomBuyRecordService pianoRoomBuyRecordService;
     @Autowired
+    private PlatformCashAccountRecordService platformCashAccountRecordService;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
     private RedissonClient redissonClient;
     @Autowired
     private PaymentProperties paymentProperties;
 
+
     //验证订单是否可以下单,获取订单金额信息
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
@@ -116,15 +125,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderSuccess.put(GoodTypeEnum.VIP, memberPriceSettingsService::orderSuccess);
         //直播课程购买
         orderSuccess.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseSuccess);
-
         //陪练课购买
         orderSuccess.put(GoodTypeEnum.PRACTICE, scheduleService::buyPracticeCourseSuccess);
         //视频课购买
         orderSuccess.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseSuccess);
-
         //曲目购买
         orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
-
         //琴房时长
         orderSuccess.put(GoodTypeEnum.PINAO_ROOM, pianoRoomBuyRecordService::orderSuccess);
 
@@ -135,7 +141,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCancel.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourseFailed);
         //直播课购买
         orderCancel.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseCancel);
-
         // 曲目购买
         orderCancel.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCancel);
     }
@@ -258,7 +263,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderReq.setOrderNo(Long.toString(orderNo));
 
         //分润人为自己,不是分润订单
-        if(null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())){
+        if (null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())) {
             orderReq.setRecomUserId(null);
         }
 
@@ -768,6 +773,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (!Objects.isNull(userOrderVoConsumer)) {
                 userOrderVoConsumer.accept(orderDetailVo);
             }
+            //记录平台收入和用户分润收入(未记录卖家收益,卖家收益业务逻辑处理)
+            savePlatformAccountRecord(orderDetailVo);
             //清除商家统计缓存
             Long merchId = orderDetailVo.getMerchId();
             if (merchId != null && merchId != 0) {
@@ -782,6 +789,119 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         }
     }
 
+    /**
+     * 记录平台收入和用户分润收入
+     *
+     * @param orderDetailVo
+     */
+    private void savePlatformAccountRecord(UserOrderDetailVo orderDetailVo) {
+        BigDecimal expectPrice = orderDetailVo.getExpectPrice();
+        if (expectPrice.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        //平台收入
+        //获取平台服务费率
+        BigDecimal platformFeeRate = getPlatformFreeByGoodType(orderDetailVo.getGoodType());
+        if (platformFeeRate.compareTo(BigDecimal.ZERO) > 0) {
+            //没有卖家的为平台订单,平台全额收益
+            if(null == orderDetailVo.getMerchId() || orderDetailVo.getMerchId().equals(0L)){
+                platformFeeRate = BigDecimal.ONE;
+            }
+
+            BigDecimal platformFee = expectPrice.multiply(platformFeeRate).setScale(2, RoundingMode.HALF_UP);
+
+            PlatformCashAccountRecord platformCashAccountRecord;
+            if (GoodTypeEnum.PINAO_ROOM.equals(orderDetailVo.getGoodType())) {
+                platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
+                        InOrOutEnum.IN, PostStatusEnum.RECORDED, AccountBizTypeEnum.PIAON_ROOM, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+            } else {
+                AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(orderDetailVo.getGoodType().getCode());
+                platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getUserId(), platformFee,
+                        InOrOutEnum.IN, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+            }
+            platformCashAccountRecordService.save(platformCashAccountRecord);
+        }
+
+        //分润
+        if (null != orderDetailVo.getRecomUserId()) {
+            //获取分润收益费率
+            BigDecimal shareFeeRate = getShareFreeByGoodType(orderDetailVo.getGoodType());
+            if (shareFeeRate.compareTo(BigDecimal.ZERO) > 0) {
+                //入老师账户
+                BigDecimal shareFee = expectPrice.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
+                AccountBizTypeEnum bizTypeEnum = AccountBizTypeEnum.valueOf(orderDetailVo.getGoodType().getCode() + "_SHARE");
+                if(null != bizTypeEnum){
+                    //插入分润老师账户变更记录-分润老师预收
+                    HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
+                            new UserAccountRecordDto(orderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
+                                    bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getGoodName(), orderDetailVo.getOrderNo()));
+                    if(recomRecordRes.getStatus()){
+                        //插入平台预支
+                        PlatformCashAccountRecord platformCashAccountRecord = new PlatformCashAccountRecord(orderDetailVo.getRecomUserId(), shareFee,
+                                InOrOutEnum.OUT, PostStatusEnum.WAIT, bizTypeEnum, orderDetailVo.getBizId(), orderDetailVo.getOrderNo());
+                        platformCashAccountRecordService.save(platformCashAccountRecord);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取分润收益费率
+     *
+     * @param goodType
+     * @return
+     */
+    private BigDecimal getShareFreeByGoodType(GoodTypeEnum goodType) {
+        if (GoodTypeEnum.VIP.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIP_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.LIVE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.LIVE_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.VIDEO.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.MUSIC.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHARE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        return BigDecimal.ZERO;
+    }
+
+    /**
+     * 获取平台服务费率
+     *
+     * @param goodType
+     * @return
+     */
+    private BigDecimal getPlatformFreeByGoodType(GoodTypeEnum goodType) {
+        //会员|琴房时长,平台全额收益
+        if (GoodTypeEnum.VIP.equals(goodType) || GoodTypeEnum.PINAO_ROOM.equals(goodType)) {
+            return BigDecimal.ONE;
+        }
+        if (GoodTypeEnum.PRACTICE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.LIVE.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.VIDEO.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        if (GoodTypeEnum.MUSIC.equals(goodType)) {
+            return new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE))
+                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        }
+        return BigDecimal.ZERO;
+    }
+
     private void testOrderSuccess(UserOrderVo detail) {
         if (null == detail || StringUtil.isEmpty(detail.getOrderNo())) {
             return;

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

@@ -146,7 +146,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         //查询组信息
         VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
         //记录流水
-        addTeacherAccount(orderParam, purchaseRecord, lessonGroup);
+        addTeacherAccount(orderParam, lessonGroup);
         videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
     }
 
@@ -154,53 +154,26 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
      * 记录老师账户记录
      *
      * @param userOrderDetailVo
-     * @param purchaseRecord
+     * @param lessonGroup
      */
-    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonPurchaseRecord purchaseRecord, VideoLessonGroup lessonGroup) {
-        //查询直播课服务费
+    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonGroup lessonGroup) {
+        if(null == userOrderDetailVo.getMerchId()){
+
+        }
+        //查询视频课服务费
         BigDecimal liveServiceRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE))
                 .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //支付金额
         BigDecimal actualPrice = userOrderDetailVo.getActualPrice();
-        //学生支付金额
-        //BigDecimal payMoney = purchaseRecord.getPayMoney();
         //服务费
         BigDecimal serviceFeeAmount = actualPrice.multiply(liveServiceRate).setScale(2, RoundingMode.HALF_UP);
-
         //老师入账金额
         BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
 
-        //插入老师账户变更记录
-        HttpResponseResult<UserAccountRecord> recordRes = userAccountService.accountRecord(
+        //插入老师账户变更记录-老师预收
+        userAccountService.accountRecord(
                 new UserAccountRecordDto(userOrderDetailVo.getMerchId(), PostStatusEnum.WAIT, transAmount, InOrOutEnum.IN,
                         AccountBizTypeEnum.VIDEO, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
-        //
-        if (recordRes.getStatus()) {
-            userAccountService.accountChange(recordRes.getData().getId(), PostStatusEnum.RECORDED);
-        }
-
-        //todo 插入平台实收
-
-        //判断是否分润
-        if (null != userOrderDetailVo.getRecomUserId()) {
-            // 分润比例
-            BigDecimal shareFeeRate = new BigDecimal(sysConfigService.findConfigValue(SysConfigConstant.VIDEO_SHARE_FEE))
-                    .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
-            //分润金额
-            BigDecimal shareFee = serviceFeeAmount.multiply(shareFeeRate).setScale(2, RoundingMode.HALF_UP);
-
-            //插入分润老师账户变更记录
-            HttpResponseResult<UserAccountRecord> recomRecordRes = userAccountService.accountRecord(
-                    new UserAccountRecordDto(userOrderDetailVo.getRecomUserId(), PostStatusEnum.WAIT, shareFee, InOrOutEnum.IN,
-                            AccountBizTypeEnum.VIDEO_SHARE, lessonGroup.getId(), lessonGroup.getLessonName(), userOrderDetailVo.getOrderNo()));
-
-            if (recomRecordRes.getStatus()) {
-                userAccountService.accountChange(recomRecordRes.getData().getId(), PostStatusEnum.RECORDED);
-            }
-
-            //todo 插入平台分润支出
-        }
     }
 
     /**

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserAccountRecordVo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -16,6 +17,9 @@ import java.util.Date;
 public class UserAccountRecordVo extends UserAccountRecord{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("用户名称 ")
+	private String accountName;
+
 	@ApiModelProperty("发生时间(mm-dd) ")
 	private String timeDay;
 
@@ -29,6 +33,14 @@ public class UserAccountRecordVo extends UserAccountRecord{
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date endTime;
 
+	public String getAccountName() {
+		return accountName;
+	}
+
+	public void setAccountName(String accountName) {
+		this.accountName = accountName;
+	}
+
 	public String getTimeDay() {
 		return timeDay;
 	}

+ 3 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountMapper.xml

@@ -151,13 +151,9 @@
         order by t.sys_day_ymd_
     </select>
 
-    <select id="totalTransAmount" resultType="java.math.BigDecimal">
+    <select id="totalTransAmountByOrderNo" resultType="java.math.BigDecimal">
         select sum(trans_amount_) from user_cash_account_record
-        <where>
-            and post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
-            <if test="param.orderNo != null and param.orderNo != ''">
-                and order_no_ = #{param.orderNo}
-            </if>
-        </where>
+        where post_status_ in ('WAIT','FROZEN','RECORDED') and in_or_out_ = 'IN' and err_flag_ = 0
+            and order_no_ = #{orderNo}
     </select>
 </mapper>

+ 4 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -48,7 +48,6 @@
         <if test="null != param.orderNo and '' != param.orderNo">
             AND t.order_no_ LIKE CONCAT('%', #{param.orderNo}, '%')
         </if>
-
         <if test="null != param.userId">
             AND t.account_id_ = #{param.userId}
         </if>
@@ -72,6 +71,7 @@
     <sql id="selectSql">
         select
             <include refid="baseColumns" />,
+            ifnull(u.username_,u.real_name_) as accountName,
             DATE_FORMAT(t.create_time_,'%m-%d') as timeDay,
             a.start_time_ as startTime,
             a.end_time_ as endTime
@@ -81,9 +81,9 @@
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
-                u.user_id_ LIKE CONCAT('%', #{param.search}, '%') or
-                u.username_ LIKE CONCAT('%', #{param.search}, '%') or
-                u.phone_ LIKE CONCAT('%', #{param.search}, '%')
+                    u.id_ LIKE CONCAT('%', #{param.search}, '%') or
+                    u.username_ LIKE CONCAT('%', #{param.search}, '%') or
+                    u.phone_ LIKE CONCAT('%', #{param.search}, '%')
                 )
             </if>
             <include refid="selectCondition"/>

+ 9 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -49,7 +49,8 @@
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
-               o.user_id_ as userId
+                o.user_id_ as userId,
+                o.recom_user_id_ as recomUserId
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_
         where t.id_ = #{id}
@@ -57,7 +58,8 @@
     <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns"/>,
-            o.user_id_ as userId
+            o.user_id_ as userId,
+            o.recom_user_id_ as recomUserId
         FROM user_order_detail t
         left join user_order o on t.order_no_ = o.order_no_
         where t.order_no_ = #{orderNo}
@@ -65,8 +67,10 @@
 
     <sql id="selectSql">
         SELECT
-            <include refid="baseColumns" />
+            <include refid="baseColumns" />,
+            o.recom_user_id_ as recomUserId
         FROM user_order_detail t
+        left join user_order o on t.order_no_ = o.order_no_
         <where>
             <if test="param.orderNo != null and param.orderNo != ''">
                 AND t.order_no_ = #{orderNo}
@@ -91,10 +95,12 @@
     <select id="getOrderDetilListByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
         SELECT
             <include refid="baseColumns" />,
+            o.recom_user_id_ as recomUserId,
             u.avatar_ as avatar,
             u.username_ as username,
             a.star_grade_ as starGrade
         FROM user_order_detail t
+        left join user_order o on t.order_no_ = o.order_no_
         left join sys_user u on t.merch_id_ = u.id_
         left join teacher_total a on t.merch_id_ = a.user_id_
         where t.order_no_ = #{orderNo}

+ 155 - 24
toolset/utils/src/main/java/com/yonge/toolset/utils/collection/ListUtil.java

@@ -1,32 +1,163 @@
 package com.yonge.toolset.utils.collection;
 
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 
 public class ListUtil {
+    private final static Logger log = LoggerFactory.getLogger(ListUtil.class);
+
+    /**
+     * 两个集合是否相等,与元素顺序无关
+     *
+     * @param list1
+     * @param list2
+     * @return
+     */
+    public static boolean isEquals(List<?> list1, List<?> list2) {
+        if (list1 == list2) {
+            return true;
+        }
+        if (list1 == null && list2 == null) {
+            return true;
+        }
+        if (list1 == null || list2 == null) {
+            return false;
+        }
+        if (list1.size() != list2.size()) {
+            return false;
+        }
+        if (list1.containsAll(list2) && list2.containsAll(list1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 将list转成queue
+     *
+     * @return java.util.Queue<T>
+     * @Author weifanl
+     * @Date 14:49 2020/6/12
+     * @Param [list]
+     **/
+    public static <T> Queue<T> convertListToQueue(List<T> list, Class<T> clazz) {
+        Queue<T> queue = new LinkedList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            return queue;
+        }
+        list.forEach(obj -> {
+            T clone = obj;
+            if (null != obj && !isBaseType(obj.getClass())) {
+                try {
+                    T t = clazz.newInstance();
+                    BeanUtils.copyProperties(obj, t);
+                    clone = t;
+                } catch (InstantiationException e) {
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+            queue.add(clone);
+        });
+        return queue;
+    }
+
+    /**
+     * list对象转换
+     *
+     * @return java.util.List<T>
+     * @Author weifanl
+     * @Date 17:43 2020/6/17
+     * @Param [list, clazz]
+     **/
+    public static <T> List<T> convertList(List list, Class<T> clazz) {
+        List<T> retList = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            return retList;
+        }
+
+        list.forEach(item -> {
+            try {
+                T t = clazz.newInstance();
+                BeanUtils.copyProperties(item, t);
+                retList.add(t);
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        });
+        return retList;
+    }
+
+
+    public static boolean isBaseType(Class className) {
+        return className.equals(String.class) ||
+                className.equals(Integer.class) ||
+                className.equals(int.class) ||
+                className.equals(Byte.class) ||
+                className.equals(byte.class) ||
+                className.equals(Long.class) ||
+                className.equals(long.class) ||
+                className.equals(Double.class) ||
+                className.equals(double.class) ||
+                className.equals(Float.class) ||
+                className.equals(float.class) ||
+                className.equals(Character.class) ||
+                className.equals(char.class) ||
+                className.equals(Short.class) ||
+                className.equals(short.class) ||
+                className.equals(Boolean.class) ||
+                className.equals(boolean.class);
+    }
+
+    public static <T> T convertToBaseType(Object source, Class<T> clazz) {
+        try {
+            if (clazz.equals(String.class)) {
+                return (T) source.toString();
+            } else if (clazz.equals(Integer.class) || clazz.equals(int.class)) {
+                return (T) (Integer) Integer.parseInt(source.toString());
+            } else if (clazz.equals(Byte.class) || clazz.equals(byte.class)) {
+                return (T) (Byte) Byte.parseByte(source.toString());
+            } else if (clazz.equals(Long.class) || clazz.equals(long.class)) {
+                return (T) (Long) Long.parseLong(source.toString());
+            } else if (clazz.equals(Double.class) || clazz.equals(double.class)) {
+                return (T) (Double) Double.parseDouble(source.toString());
+            } else if (clazz.equals(Float.class) || clazz.equals(float.class)) {
+                return (T) (Float) Float.parseFloat(source.toString());
+            } else if (clazz.equals(Character.class) || clazz.equals(char.class)) {
+                return (T) (Integer) Integer.parseInt(source.toString());
+            } else if (clazz.equals(Short.class) || clazz.equals(short.class)) {
+                return (T) (Short) Short.parseShort(source.toString());
+            } else if (clazz.equals(Boolean.class) || clazz.equals(boolean.class)) {
+                return (T) (Boolean) Boolean.parseBoolean(source.toString());
+            }
 
-	/**
-	 * 两个集合是否相等,与元素顺序无关
-	 * @param list1
-	 * @param list2
-	 * @return
-	 */
-	public static boolean isEquals(List<?> list1, List<?> list2) {
-		if (list1 == list2) {
-			return true;
-		}
-		if (list1 == null && list2 == null) {
-			return true;
-		}
-		if (list1 == null || list2 == null) {
-			return false;
-		}
-		if (list1.size() != list2.size()) {
-			return false;
-		}
-		if (list1.containsAll(list2) && list2.containsAll(list1)) {
-			return true;
-		}
-		return false;
-	}
+            try {
+                T t = clazz.newInstance();
+                BeanUtils.copyProperties(source, t);
+                return t;
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        } catch (NumberFormatException e) {
+            log.error("转换基础类型异常!");
+            log.error("异常方法:ListUtil.convertToBaseType()");
+            log.error("异常参数:" + JSONObject.toJSONString(source));
+            log.error("异常参数:" + clazz);
+            log.error("异常内容:" + e.getMessage());
+        }
+        return null;
+    }
 }