liweifan 3 år sedan
förälder
incheckning
cb97737a34
14 ändrade filer med 430 tillägg och 245 borttagningar
  1. 5 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  2. 73 31
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  3. 0 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java
  4. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/UserAccountRecordSearch.java
  5. 29 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  6. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  7. 112 90
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  8. 52 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  9. 29 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  10. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  11. 17 37
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  12. 59 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  13. 0 29
      cooleshow-user/user-biz/src/main/java/controller/PlatformCashAccountRecordController.java
  14. 40 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

+ 5 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -225,4 +225,9 @@ public interface SysConfigConstant {
      * 敏感词-白名单
      */
     String WHITE_LIST = "white_list";
+
+    /**
+     * 平台分润比例
+     */
+    String SHARE_FEE = "share_fee";
 }

+ 73 - 31
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -5,11 +5,14 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
+import org.springframework.security.core.parameters.P;
 
 /**
  * 账户记账规则
@@ -18,38 +21,77 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
  * 用户购买老师乐谱后 记录入账
  */
 public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
-	/**
-	 * 查询详情
-	 * @author liweifan
-	 * @date 2022-03-30 13:53:51
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
-	 */
-	UserAccountRecordVo detail(@Param("id") Long id);
-
-	/**
-	 * 分页查询
-	 *
-	 * @author liweifan
-	 * @date 2022-03-30 13:53:51
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
-	 */
-	List<UserAccountRecordVo> selectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
-
-	List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
-
-
-	/**
-	 * 老师本月收入
-	 *
-	 * @param userId 老师id
-	 * @return
-	 */
+    /**
+     * 查询详情
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    UserAccountRecordVo detail(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    List<UserAccountRecordVo> selectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
+
+    List<UserAccountRecordVo> selectAllPage(@Param("param") UserAccountRecordSearch userAccountRecord);
+
+    /**
+     * app查询详情
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    UserAccountRecordVo appDetail(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
+     * @author liweifan
+     * @date 2022-03-30 13:53:51
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo
+     */
+    List<UserAccountRecordVo> appSelectPage(@Param("page") IPage page, @Param("param") UserAccountRecordSearch userAccountRecord);
+
+    /**
+     * 老师本月收入
+     *
+     * @param userId 老师id
+     * @return
+     */
     BigDecimal selectMonthDecimal(@Param("userId") Long userId);
 
-	/**
-	 * 老师当天收入
-	 *
-	 * @return
-	 */
+    /**
+     * 老师当天收入
+     *
+     * @return
+     */
     List<TeacherEarningVo> selectTodayTeacherEarning();
+
+    /**
+     * 通过订单详情和业务id查询该详情对应的所有账户记录
+     *
+     * @param param
+     * @param bizIds
+     * @return
+     */
+    List<UserAccountRecord> selectRecordByOrderDetail(@Param("param") UserOrderDetailVo param, @Param("bizIds") List<Long> bizIds);
+
+    /**
+     * 入账记录可以通过以下三个字段确定唯一
+     *
+     * @param orderNo 订单号
+     * @param bizType 业务类型
+     * @param bizId   业务id
+     * @return
+     */
+    UserAccountRecordVo detailByBiz(@Param("orderNo") String orderNo,
+                                    @Param("bizType") AccountBizTypeEnum bizType,
+                                    @Param("bizId") Long bizId);
 }

+ 0 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserAccountRecordDto.java

@@ -18,9 +18,6 @@ import java.math.BigDecimal;
  */
 @ApiModel(value = "UserAccountRecordDto对象", description = "账户变更传输对象")
 public class UserAccountRecordDto extends UserAccountRecord {
-    public UserAccountRecordDto() {
-    }
-
     public UserAccountRecordDto(Long accountId, PostStatusEnum postStatus, BigDecimal transAmount, InOrOutEnum inOrOut, AccountBizTypeEnum bizType,
                                 Long bizId, String bizName, String orderNo) {
         this.setAccountId(accountId);

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

@@ -28,7 +28,7 @@ public class UserAccountRecordSearch extends QueryInfo{
 	@ApiModelProperty("收支类型:IN、收入 OUT、支出 ")
 	private InOrOutEnum inOrOut;
 
-	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 MUSIC、乐谱 WITHDRAWAL、结算 ")
+	@ApiModelProperty("业务类型:PRACTICE、陪练课 LIVE、直播课 VIDEO、视频课 MUSIC、乐谱 WITHDRAWAL、提现 LIVE_SHARE、直播课分润 VIDEO_SHARE、视频课分润 MUSIC_SHARE、乐谱分润 VIP_SHARE、会员分润 MALL_SHARE、商品分润 ")
 	private AccountBizTypeEnum bizType;
 
 	@ApiModelProperty("查询时间(yyyy-mm) ")

+ 29 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java

@@ -2,43 +2,58 @@ 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.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 用户账户流水表 服务类
+ *
  * @author liweifan
  * @date 2022-03-30
  */
-public interface UserAccountRecordService extends IService<UserAccountRecord>  {
+public interface UserAccountRecordService extends IService<UserAccountRecord> {
 
-	/**
+    /**
      * 查询详情
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
-	UserAccountRecordVo detail(Long id);
+    UserAccountRecordVo detail(Long id);
 
+    UserAccountRecordVo detail(String orderNo, AccountBizTypeEnum bizType, Long bizId);
     /**
      * 分页查询
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
     IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query);
 
-	/**
-	 * 老师本月收入
-	 *
-	 * @param userId 老师id
-	 * @return 老师本月收入
-	 */
+    List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query);
+
+    /**
+     * 老师本月收入
+     *
+     * @param userId 老师id
+     * @return 老师本月收入
+     */
     BigDecimal getMonthDecimal(Long userId);
 
-	/**
-	 * 老师课酬收入通知
-	 */
+    /**
+     * 老师课酬收入通知
+     */
     void sendTeacherEarning();
+
+    /**
+     * 通过订单详情查询该详情对应的所有账户记录
+     */
+    List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo);
 }

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

@@ -22,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -114,6 +115,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private ImUserFriendService imUserFriendService;
     @Autowired
     private UserAccountService userAccountService;
+    @Autowired
+    private UserAccountRecordService userAccountRecordService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -1759,9 +1762,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<UserAccountRecordDto> list = baseMapper.selectWaitCourse(day);
         if (CollectionUtils.isNotEmpty(list)) {
             for (UserAccountRecordDto dto : list) {
-                userAccountService.accountChange(dto);
+                UserAccountRecordVo record = userAccountRecordService.detail(dto.getOrderNo(), dto.getBizType(), dto.getBizId());
+                if (null != record) {
+                    userAccountService.accountChange(record.getId(), PostStatusEnum.RECORDED);
+                }
             }
-
             Set<Long> bizIds = list.stream().map(UserAccountRecordDto::getBizId).collect(Collectors.toSet());
             courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
                     .set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.COMPLETE.getCode())

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
@@ -45,14 +46,15 @@ import java.util.stream.Collectors;
 
 /**
  * MusicSheetService服务实现类
+ *
  * @author yzp
- * @date 2022-03-26 00:01:37
  * @version v1.0
+ * @date 2022-03-26 00:01:37
  **/
 @Service
-public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet> implements MusicSheetService {
+public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet> implements MusicSheetService {
 
-    private static final  Logger log = LoggerFactory.getLogger(MusicSheetServiceImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(MusicSheetServiceImpl.class);
 
     @Autowired
     private MusicSheetDao musicSheetDao;
@@ -107,7 +109,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveMp3AndAccompaniment(MusicSheetDto musicSheetDto,Long userId) {
+    public boolean saveMp3AndAccompaniment(MusicSheetDto musicSheetDto, Long userId) {
         MusicSheet musicSheet = new MusicSheet();
         BeanUtils.copyProperties(musicSheetDto, musicSheet);
         //保存主表
@@ -138,7 +140,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public boolean state(Long id) {
         MusicSheet musicSheet = this.getById(id);
         if (musicSheet == null) {
-            throw  new BizException("未找到曲目信息");
+            throw new BizException("未找到曲目信息");
         }
         if (YesOrNoEnum.NO.getCode().equals(musicSheet.getState().getCode())) {
             musicSheet.setState(YesOrNoEnum.YES);
@@ -172,14 +174,14 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         musicSheetShareVo.setName(sysUser.getUsername());
         musicSheetShareVo.setAvatar(sysUser.getAvatar());
 
-        String teacherMusicShareUrl= sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_URL);
+        String teacherMusicShareUrl = sysConfigService.findConfigValue(SysConfigConstant.TEACHER_MUSIC_SHEET_SHARE_URL);
         musicSheetShareVo.setUrl(MessageFormatter.arrayFormat(teacherMusicShareUrl, sysUser.getId()));
 
         return musicSheetShareVo;
     }
 
     @Override
-    public MusicSheetDetailVo detail(Long id, SysUser sysUser,SysUserType userType) {
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser, SysUserType userType) {
         MusicSheetDetailVo detail = baseMapper.detail(id);
         if (detail == null) {
             throw new BizException("未找到曲目信息");
@@ -193,7 +195,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
         if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
-        }  else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
+        } else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
             setStudentMusicSheet(sysUser.getId(), detail);
         } else {
             detail.setPlay(YesOrNoEnum.YES);
@@ -209,7 +211,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
      * 设置学生曲目信息
      *
      * @param studentId 学生id
-     * @param detail 曲目详情
+     * @param detail    曲目详情
      */
     private void setStudentMusicSheet(Long studentId, MusicSheetDetailVo detail) {
         detail.setPlay(YesOrNoEnum.NO);
@@ -225,7 +227,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     detail.setPlay(YesOrNoEnum.YES);
                 }
             }
-        } else if  (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
+        } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
             // 会员 判断是否为会员, 会员可播放
             StudentVo studentVo = studentService.detail(studentId);
             if (studentVo != null && YesOrNoEnum.YES.getCode().equals(studentVo.getIsVip().getCode())) {
@@ -272,26 +274,26 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     @Override
     public IPage<MusicSheetVo> myMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectMyMusicPage(page,query));
+        return page.setRecords(baseMapper.selectMyMusicPage(page, query));
     }
 
     @Override
     public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectFavoriteMusicPage(page,query));
+        return page.setRecords(baseMapper.selectFavoriteMusicPage(page, query));
     }
 
     @Override
     public IPage<MusicSheetVo> practiceMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
         // 预计最近练习表数据量会很多
         // 先找到最近练习的曲目id 在根据曲目id进行精确查找
-        IPage<Long> practiceMusicIdPage = musicSheetPracticeRecordService.selectPracticeMusic(query,page.getPages(),page.getSize());
+        IPage<Long> practiceMusicIdPage = musicSheetPracticeRecordService.selectPracticeMusic(query, page.getPages(), page.getSize());
         List<Long> practiceMusicIdList = practiceMusicIdPage.getRecords();
         if (CollectionUtils.isEmpty(practiceMusicIdList)) {
             page.setRecords(new ArrayList<>());
             return page;
         }
         // 构建分页信息
-        page.setRecords(baseMapper.selectPracticeMusicPage(query,practiceMusicIdList));
+        page.setRecords(baseMapper.selectPracticeMusicPage(query, practiceMusicIdList));
         page.setPages(practiceMusicIdPage.getPages());
         page.setCurrent(practiceMusicIdPage.getCurrent());
         page.setSize(practiceMusicIdPage.getSize());
@@ -301,17 +303,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     @Override
     public IPage<StudentMusicSheetOrderVo> selectStudentOrderPage(IPage<StudentMusicSheetOrderVo> page, StudentMusicSheetOrderSearch query) {
-        return page.setRecords(baseMapper.selectStudentOrderPage(page,query));
+        return page.setRecords(baseMapper.selectStudentOrderPage(page, query));
     }
 
     @Override
     public IPage<TeacherMusicSheetVo> selectTeacherPage(IPage<TeacherMusicSheetVo> page, TeacherMusicSheetSearch query) {
-        return page.setRecords(baseMapper.selectTeacherPage(page,query));
+        return page.setRecords(baseMapper.selectTeacherPage(page, query));
     }
 
     @Override
     public IPage<TeacherMusicSheetVo> selectAuditPage(IPage<TeacherMusicSheetVo> page, TeacherMusicSheetAuditSearch query) {
-        return page.setRecords(baseMapper.selectAuditPage(page,query));
+        return page.setRecords(baseMapper.selectAuditPage(page, query));
     }
 
     @Override
@@ -320,31 +322,31 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
         MusicSheet musicSheet = this.getById(param.getMusicSheetId());
         if (musicSheet == null) {
-            throw  new BizException("未找到曲目信息");
+            throw new BizException("未找到曲目信息");
         }
         if (!AuthStatusEnum.DOING.getCode().equals(musicSheet.getAuditStatus().getCode())) {
-            throw  new BizException("曲目已经过审批");
+            throw new BizException("曲目已经过审批");
         }
 
         boolean flag = false;
-        if (musicSheetAuthRecordService.audit(param,userId)) {
+        if (musicSheetAuthRecordService.audit(param, userId)) {
             musicSheet.setAuditStatus(param.getAuthStatus());
             musicSheet.setUpdateBy(userId);
             musicSheet.setUpdateTime(new Date());
             if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
                 musicSheet.setState(YesOrNoEnum.YES);
             }
-            flag =  this.updateById(musicSheet);
+            flag = this.updateById(musicSheet);
         }
 
         // 发送审核通知
-        Map<Long,String> receivers = new HashMap<>();
+        Map<Long, String> receivers = new HashMap<>();
         SysUser teacher = sysUserFeignService.queryUserById(musicSheet.getUserId());
         receivers.put(musicSheet.getUserId(), teacher.getPhone());
         try {
             sendMusicSheetAuditMessage(param, musicSheet, receivers);
         } catch (Exception e) {
-            log.warn("曲目审核消息发送失败,{}",e.getMessage());
+            log.warn("曲目审核消息发送失败,{}", e.getMessage());
         }
 
         return flag;
@@ -354,11 +356,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     private void sendMusicSheetAuditMessage(TeacherMusicSheetAuditReq param, MusicSheet musicSheet, Map<Long, String> receivers) {
         if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_PASS,
-                           receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName());
-        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())){
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName());
+        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())) {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_UNPASS,
-                   receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName(),
-                   param.getRemark());
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName(),
+                    param.getRemark());
         }
     }
 
@@ -377,17 +379,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Override
     public Integer countTeacherMusicSheet(SysUser sysUser) {
         return this.lambdaQuery()
-                .eq(MusicSheet::getAuditStatus,AuthStatusEnum.PASS)
-                .eq(MusicSheet::getCreateBy,sysUser.getId())
-                .eq(MusicSheet::getState,YesOrNoEnum.YES)
-                .eq(MusicSheet::getDelFlag,YesOrNoEnum.NO)
-                .eq(MusicSheet::getSourceType,SourceTypeEnum.TEACHER.getCode())
+                .eq(MusicSheet::getAuditStatus, AuthStatusEnum.PASS)
+                .eq(MusicSheet::getCreateBy, sysUser.getId())
+                .eq(MusicSheet::getState, YesOrNoEnum.YES)
+                .eq(MusicSheet::getDelFlag, YesOrNoEnum.NO)
+                .eq(MusicSheet::getSourceType, SourceTypeEnum.TEACHER.getCode())
                 .count();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveMusicSheet(MusicSheetDto musicSheetDto,Long userId) {
+    public boolean saveMusicSheet(MusicSheetDto musicSheetDto, Long userId) {
 
         if (musicSheetDto.getId() != null) {
             musicSheetAccompanimentService.delByMusicSheetId(musicSheetDto.getId());
@@ -398,15 +400,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
 
         // 删除曲目专辑关联
-        delAlbumSheetRef(musicSheetDto.getId(),musicSheetDto.getMusicSubject());
+        delAlbumSheetRef(musicSheetDto.getId(), musicSheetDto.getMusicSubject());
 
         List<MusicSheetAccompaniment> list;
-        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())){
+        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
             list = musicSheetDto.getBackground();
-            if (CollectionUtils.isEmpty(list)){
+            if (CollectionUtils.isEmpty(list)) {
                 throw new BizException("mp3音频文件对应的主音或者伴奏文件没有提供");
             }
-            return saveMp3AndAccompaniment(musicSheetDto,userId);
+            return saveMp3AndAccompaniment(musicSheetDto, userId);
         } else {
             MusicSheet musicSheet = new MusicSheet();
             BeanUtils.copyProperties(musicSheetDto, musicSheet);
@@ -425,12 +427,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     /**
      * 删除专辑曲目关联
      *
-     * @param id 曲目id
+     * @param id        曲目id
      * @param subjectId 声部id
      */
-    private void delAlbumSheetRef(Long id,String subjectId) {
+    private void delAlbumSheetRef(Long id, String subjectId) {
 
-        if (id == null ) {
+        if (id == null) {
             return;
         }
         MusicSheet musicSheet = this.getById(id);
@@ -458,8 +460,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         }
 
         // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(),musicSheetPayDto.getMusicSheetId());
-
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId());
 
 
         orderCreateRes.setRes(true);
@@ -469,14 +470,14 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         orderCreateRes.setGoodNum(1);
         orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
         orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
-        return  HttpResponseResult.succeed(orderCreateRes);
+        return HttpResponseResult.succeed(orderCreateRes);
 
     }
 
     /**
      * 检查是否已购买当前曲目
      *
-     * @param userId 用户id
+     * @param userId       用户id
      * @param musicSheetId 曲目id
      */
     private void checkoutPay(Long userId, Long musicSheetId) {
@@ -484,21 +485,19 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                .eq(MusicSheetPurchaseRecord::getOrderStatus,OrderStatusEnum.PAID)
+                .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
-            throw  new BizException("已经购买了当前曲目");
+            throw new BizException("已经购买了当前曲目");
         }
     }
 
     @Override
     @Transactional
     public void buyMusicSheetSuccess(UserOrderDetailVo userOrderDetailVo) {
-
         MusicSheet musicSheet = this.getById(userOrderDetailVo.getBizId());
-
         // 曲目服务费比例
-        String musicSheetServiceFee= sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
+        String musicSheetServiceFee = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
         BigDecimal serviceFee = new BigDecimal(musicSheetServiceFee).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //支付金额
         BigDecimal actualPrice = userOrderDetailVo.getActualPrice();
@@ -516,17 +515,17 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
         // 消息通知
         try {
-            sendBuyMessage(userOrderDetailVo.getMerchId(),userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
-        }catch (Exception e) {
-            log.warn("学生购买曲目消息推送失败 {}",e.getMessage());
+            sendBuyMessage(userOrderDetailVo.getMerchId(), userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
+        } catch (Exception e) {
+            log.warn("学生购买曲目消息推送失败 {}", e.getMessage());
         }
     }
 
     /**
      * 发送购买消息通知
      *
-     * @param teacherId 老师id
-     * @param studentId 学生id
+     * @param teacherId    老师id
+     * @param studentId    学生id
      * @param musicSheetId 曲目id
      */
     @Override
@@ -535,35 +534,35 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
         SysUser student = sysUserFeignService.queryUserById(studentId);
         if (StringUtil.isEmpty(teacher.getPhone())) {
-            log.warn("teacher id {} name {} 手机号不存在,消息推送失败",teacher.getId(),teacher.getUsername());
+            log.warn("teacher id {} name {} 手机号不存在,消息推送失败", teacher.getId(), teacher.getUsername());
         }
 
         MusicSheet musicSheet = this.getById(musicSheetId);
         // 推送老师
-        Map<Long,String> teacherReceivers = new HashMap<>();
+        Map<Long, String> teacherReceivers = new HashMap<>();
         teacherReceivers.put(teacherId, teacher.getPhone());
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                                           MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
-                                           0, null,ClientEnum.TEACHER.getCode(),student.getUsername(),musicSheet.getMusicSheetName());
+                MessageTypeEnum.STUDENT_BUY_TEACHER_MUSIC_SHEET, teacherReceivers, null,
+                0, null, ClientEnum.TEACHER.getCode(), student.getUsername(), musicSheet.getMusicSheetName());
 
         // 推送学生
-        Map<Long,String> studentReceivers = new HashMap<>();
+        Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
 
 
         String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
-                                           MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
-                                           0, url,ClientEnum.STUDENT.getCode(),musicSheet.getMusicSheetName());
+                MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
+                0, url, ClientEnum.STUDENT.getCode(), musicSheet.getMusicSheetName());
         // 推送学生
-        Map<Long,String> studentSMS = new HashMap<>();
+        Map<Long, String> studentSMS = new HashMap<>();
         studentSMS.put(studentId, student.getPhone());
         // 推送短信
         url = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS.getCode());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS,
-        studentSMS,null,0,url,null,musicSheet.getMusicSheetName());
+                studentSMS, null, 0, url, null, musicSheet.getMusicSheetName());
 
         return true;
     }
@@ -572,8 +571,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
      * 保存购买记录
      *
      * @param userOrderDetailVo 订单信息
-     * @param actualPrice  付款价格
-     * @param serviceFeeAmount 服务费
+     * @param actualPrice       付款价格
+     * @param serviceFeeAmount  服务费
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
@@ -597,23 +596,46 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
      * 添加金额到老师账户
      *
      * @param userOrderDetailVo 订单信息
-     * @param actualPrice 付款价格
-     * @param serviceFeeAmount 服务费
-     * @param musicSheetId 曲目id
+     * @param actualPrice       付款价格
+     * @param serviceFeeAmount  服务费
+     * @param musicSheetId      曲目id
      */
     private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount,
                                    Long musicSheetId) {
-        UserAccountRecordDto userAccountRecordDto = new UserAccountRecordDto();
-        userAccountRecordDto.setUserId(userOrderDetailVo.getMerchId());
-        userAccountRecordDto.setFrozenType(FrozenTypeEnum.NONE);
 
-        userAccountRecordDto.setTransAmount(actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP));
-        userAccountRecordDto.setInOrOut(InOrOutEnum.IN);
-        userAccountRecordDto.setBizType(AccountBizTypeEnum.MUSIC);
-        userAccountRecordDto.setBizId(musicSheetId);
-        userAccountRecordDto.setBizName(userOrderDetailVo.getGoodName());
-        userAccountRecordDto.setOrderNo(userOrderDetailVo.getOrderNo());
-        userAccountService.accountChange(userAccountRecordDto);
+        BigDecimal transAmount = actualPrice.subtract(serviceFeeAmount).setScale(2, RoundingMode.HALF_UP);
+
+        //插入老师账户变更记录
+        HttpResponseResult<UserAccountRecord> recordRes = 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.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
@@ -621,7 +643,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -638,7 +660,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
         MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId());
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());
     }
@@ -688,9 +710,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                 continue;
             }
             MusicSheetExport sheetExport = readerProperty.getClazz();
-            BeanUtils.copyProperties(sheetExport,musicSheetDto);
+            BeanUtils.copyProperties(sheetExport, musicSheetDto);
 
-            if(AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
+            if (AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())) {
                 musicSheetDto.setMp3Type(null);
             }
 
@@ -703,7 +725,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             StringBuilder musicTagIds = new StringBuilder();
             if (musicTags == null || musicTags.equals("")) {
                 errMsgList.add(new ErrMsg(readerProperty.getRowIndex(), "曲目标签不能为空"));
-            }  else {
+            } else {
                 String[] stringList = musicTags.split("[,,]");
                 List<MusicTag> childrenMusicTag = new ArrayList<>();
                 for (MusicTagVo musicTagVo : musicTagVoList) {
@@ -739,8 +761,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     childrenSubject.addAll(subject.getSubjects());
                 }
                 List<Subject> collect = childrenSubject.stream()
-                       .filter(subject -> subject.getName().equals(sheetExport.getMusicSubjects()))
-                       .collect(Collectors.toList());
+                        .filter(subject -> subject.getName().equals(sheetExport.getMusicSubjects()))
+                        .collect(Collectors.toList());
                 if (CollectionUtils.isEmpty(collect)) {
                     errMsgList.add(new ErrMsg(readerProperty.getRowIndex(), "曲目声部名错误:" + sheetExport.getMusicSubjects()));
                 } else {
@@ -764,11 +786,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             musicSheetDtoList.add(musicSheetDto);
         }
 
-        if(!CollectionUtils.isEmpty(errMsgList)) {
+        if (!CollectionUtils.isEmpty(errMsgList)) {
             throw new ExcelException("导入异常", errMsgList);
         }
 
-        musicSheetDtoList.forEach(musicSheetDto -> saveMusicSheet(musicSheetDto,userId));
+        musicSheetDtoList.forEach(musicSheetDto -> saveMusicSheet(musicSheetDto, userId));
 
     }
 
@@ -776,7 +798,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser) {
         MusicSheetDetailVo detail = detail(musicSheetId, null, null);
         MusicSheetWebsiteDetailVo musicSheetWebsiteDetailVo = new MusicSheetWebsiteDetailVo();
-        BeanUtils.copyProperties(detail,musicSheetWebsiteDetailVo);
+        BeanUtils.copyProperties(detail, musicSheetWebsiteDetailVo);
 
         // 曲目收藏数
         long musicSheetFavoriteNum = musicFavoriteService.getMusicSheetFavoriteNum(musicSheetId);
@@ -836,7 +858,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
 
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
-                       .map(sysUserFeignService::queryUserById)
-                       .orElseThrow(() -> new BizException("用户不存在"));
+                .map(sysUserFeignService::queryUserById)
+                .orElseThrow(() -> new BizException("用户不存在"));
     }
 }

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

@@ -1,11 +1,17 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 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.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,6 +27,7 @@ import org.springframework.util.CollectionUtils;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,20 +41,33 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
     @Autowired
     private SysMessageService sysMessageService;
 
-	@Override
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
+    @Override
     public UserAccountRecordVo detail(Long id) {
         UserAccountRecordVo detail = baseMapper.detail(id);
         return detail;
     }
-    
-     @Override
-    public IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query){
+
+    @Override
+    public UserAccountRecordVo detail(String orderNo, AccountBizTypeEnum bizType, Long bizId) {
+        UserAccountRecordVo detail = baseMapper.detailByBiz(orderNo,bizType,bizId);
+        return detail;
+    }
+
+    @Override
+    public IPage<UserAccountRecordVo> selectPage(IPage<UserAccountRecordVo> page, UserAccountRecordSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
     @Override
-    public BigDecimal getMonthDecimal(Long userId) {
+    public List<UserAccountRecordVo> selectAllPage(UserAccountRecordSearch query) {
+        return baseMapper.selectAllPage(query);
+    }
 
+    @Override
+    public BigDecimal getMonthDecimal(Long userId) {
         return baseMapper.selectMonthDecimal(userId);
 
     }
@@ -65,12 +85,37 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
             String dateString = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COURSE_SETTLEMENT,
-                                                   receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
+                        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
                 log.info(" COURSE_SETTLEMENT ok");
             } catch (Exception e) {
-                log.warn("老师课酬结算消息推送失败,{}",e.getMessage());
+                log.warn("老师课酬结算消息推送失败,{}", e.getMessage());
             }
         }
     }
 
+
+    @Override
+    public List<UserAccountRecord> selectRecordByOrderDetail(UserOrderDetailVo userOrderDetailVo) {
+        //todo 这里需要测试
+        //订单类型: 学生端( VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ) 老师端(PINAO_ROOM、琴房时长)
+        //获取业务id
+        List<Long> bizIds = new ArrayList<>();
+        if (GoodTypeEnum.VIP.equals(userOrderDetailVo.getGoodType())
+                || GoodTypeEnum.VIDEO.equals(userOrderDetailVo.getGoodType())
+                || GoodTypeEnum.MUSIC.equals(userOrderDetailVo.getGoodType())) {
+            bizIds.add(userOrderDetailVo.getBizId());
+        } else if (GoodTypeEnum.PRACTICE.equals(userOrderDetailVo.getGoodType()) || GoodTypeEnum.LIVE.equals(userOrderDetailVo.getGoodType())) {
+            //查询课程组下所有课程id
+            List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                    .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())
+                    .ne(CourseSchedule::getStatus, "CANCEL")
+            );
+            cancel.stream().forEach(o->bizIds.add(o.getId()));
+        }
+        if (CollectionUtils.isEmpty(bizIds)) {
+            return new ArrayList<>();
+        }
+        return baseMapper.selectRecordByOrderDetail(userOrderDetailVo, bizIds);
+    }
+
 }

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

@@ -11,10 +11,8 @@ import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderRefundReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundSearch;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
@@ -24,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
@@ -66,6 +65,10 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private IdGeneratorService idGeneratorService;
     @Autowired
     private PaymentClient paymentClient;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
+    private UserAccountRecordService userAccountRecordService;
 
     //验证是否可以退款,获取退款金额信息
     private static final Map<GoodTypeEnum, Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>>> refundCreate = new HashMap<>();
@@ -122,7 +125,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         if (CollectionUtils.isEmpty(refundReq.getOredrDetilIds())) {
             //查询订单下未退款的所有详情订单
             List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
-            if(CollectionUtils.isEmpty(orderDetails)){
+            if (CollectionUtils.isEmpty(orderDetails)) {
                 return HttpResponseResult.failed("订单中没有可退款商品");
             }
             refundReq.setOredrDetilIds(orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList()));
@@ -236,7 +239,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
         //查询订单下未退款的所有详情订单
         List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
-        if(CollectionUtils.isEmpty(orderDetails)){
+        if (CollectionUtils.isEmpty(orderDetails)) {
             return HttpResponseResult.failed("订单中没有可退款商品");
         }
 
@@ -509,8 +512,28 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
                 if (!Objects.isNull(refundAfterConsumer)) {
                     refundAfterConsumer.accept(vo);
                 }
+                accountHandle(vo);
+            }
+
+
+        }
+    }
+
+    /**
+     * 处理退款后账户
+     *
+     * @param vo
+     */
+    private void accountHandle(UserOrderDetailVo vo) {
+        List<UserAccountRecord> dataList = userAccountRecordService.selectRecordByOrderDetail(vo);
+        for (UserAccountRecord userAccountRecord : dataList) {
+            if (PostStatusEnum.WAIT.equals(userAccountRecord.getPostStatus())
+                    || PostStatusEnum.FROZEN.equals(userAccountRecord.getPostStatus())) {
+                userAccountService.accountChange(userAccountRecord.getId(), PostStatusEnum.CANCEL);
             }
         }
+
+        //todo 处理平台入账
     }
 
     /**

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

@@ -256,6 +256,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //订单号生成
         Long orderNo = idGeneratorService.generatorId("orderNo");
         orderReq.setOrderNo(Long.toString(orderNo));
+
+        //分润人为自己,不是分润订单
+        if(null != orderReq.getRecomUserId() && orderReq.getUserId().equals(orderReq.getRecomUserId())){
+            orderReq.setRecomUserId(null);
+        }
+
         //验证参数,必须验证参数
         BigDecimal actualPrice = BigDecimal.ZERO;
         for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {

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

@@ -11,6 +11,8 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
+import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -67,6 +69,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     private IdGeneratorService idGeneratorService;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private UserAccountRecordService accountRecordService;
 
     @Override
     public UserWithdrawalVo detail(Long id) {
@@ -159,13 +163,10 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         //插入用户结算表
         UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee, withdrawalAuthSwitch, withdrawalAuthFee);
         //插入账户变更
-        UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                user.getId(), withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+        HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountRecord(new UserAccountRecordDto(user.getId(), PostStatusEnum.FROZEN,
+                withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
                 userWithdrawal.getId(), "老师结算", null
-        );
-        accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
-        accountRecordDto.setSaveRecord(false);
-        HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
+        ));
 
         if (accountChange.getStatus()) {
             if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)
@@ -198,7 +199,7 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         List<Long> ids = Arrays.asList(StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId()));
 
         //先判断三方余额是否充足
-        if(authOperaReq.getPass()){
+        if (authOperaReq.getPass()) {
             List<UserWithdrawal> userWithdrawals = baseMapper.selectList(Wrappers.<UserWithdrawal>lambdaQuery()
                     .in(UserWithdrawal::getId, ids)
                     .eq(UserWithdrawal::getAuthStatus, AuthStatusEnum.DOING));
@@ -277,24 +278,13 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
                 build.setErrorMsg(withdraw.getMsg());
                 res = HttpResponseResult.failed("结算" + authOperaReq.getId() + "失败,失败原因:" + withdraw.getMsg());
 
-                //审核不通过,账户解冻
-                UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                        build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                        build.getId(), "老师结算", null
-                );
-                accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-                accountRecordDto.setSaveRecord(false);
-                userAccountService.accountChange(accountRecordDto);
+                UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
+                userAccountService.accountChange(detail.getId(),PostStatusEnum.CANCEL);
             }
         } else {
             //审核不通过,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    build.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-            accountRecordDto.setSaveRecord(false);
-            userAccountService.accountChange(accountRecordDto);
+            UserAccountRecordVo detail = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, Long.parseLong(authOperaReq.getId()));
+            userAccountService.accountChange(detail.getId(),PostStatusEnum.CANCEL);
 
             //发生审核未通过通知
             unpassSend(build.getUserId(), build.getPhone(), authOperaReq.getReason());
@@ -366,13 +356,8 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             detail.setTransferTime(callback.getEndTime());
 
             //结算成功,账户解冻,入账户明细
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    detail.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_DEDUCT);
-            accountRecordDto.setSaveRecord(true);
-            userAccountService.accountChange(accountRecordDto);
+            UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
+            userAccountService.accountChange(recordVo.getId(),PostStatusEnum.RECORDED);
             //发生结算成功通知
             successSend(detail.getUserId(), detail.getPhone());
         } else if ("2".equals(callback.getStatus())) {
@@ -382,14 +367,9 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             detail.setErrorCode(callback.getErrorCode());
             detail.setErrorMsg(callback.getErrorMsg());
 
-            //审核不通过,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    detail.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-            accountRecordDto.setSaveRecord(false);
-            userAccountService.accountChange(accountRecordDto);
+            //结算失败,账户解冻
+            UserAccountRecordVo recordVo = accountRecordService.detail(null, AccountBizTypeEnum.WITHDRAWAL, detail.getId());
+            userAccountService.accountChange(recordVo.getId(),PostStatusEnum.CANCEL);
 
             //发生结算失败通知
             unpassSend(detail.getUserId(), detail.getPhone(), callback.getErrorMsg());

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

@@ -20,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 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.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.obj.ObjectUtil;
@@ -128,7 +129,6 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
     public void buyVideoCourseSuccess(UserOrderDetailVo orderParam) {
         log.info("buyVideoCourseSuccess  param:{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
-
         VideoLessonPurchaseRecord purchaseRecord = videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
                 .eq(VideoLessonPurchaseRecord::getOrderNo, orderNo));
         if (purchaseRecord == null) {
@@ -143,30 +143,64 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         }
         //修改支付状态
         videoLessonPurchaseRecordDao.updateStatus(orderNo, OrderStatusEnum.PAID.getCode());
-
-        //查询直播课服务费
-        String videoServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE);
-        BigDecimal liveServiceRate = new BigDecimal(videoServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
         //查询组信息
         VideoLessonGroup lessonGroup = videoLessonGroupDao.selectById(purchaseRecord.getVideoLessonGroupId());
-        Long teacherId = lessonGroup.getTeacherId();
-        Long studentId = purchaseRecord.getStudentId();
         //记录流水
-        BigDecimal payMoney = purchaseRecord.getPayMoney();//学生支付金额
-        UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
-        userAccountRecord.setUserId(teacherId);
-        //扣除手续费后所得金额
-        userAccountRecord.setTransAmount(payMoney.subtract(payMoney.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP));
-        userAccountRecord.setInOrOut(InOrOutEnum.IN);
-        userAccountRecord.setBizType(AccountBizTypeEnum.VIDEO);
-        userAccountRecord.setBizId(lessonGroup.getId());
-        userAccountRecord.setBizName(lessonGroup.getLessonName());
-        userAccountRecord.setOrderNo(orderNo);
-        userAccountService.accountChange(userAccountRecord);
-        log.info("buyVideoCourseSuccess ok");
-
-        videoSend(teacherId, studentId, lessonGroup);
+        addTeacherAccount(orderParam, purchaseRecord, lessonGroup);
+        videoSend(lessonGroup.getTeacherId(), purchaseRecord.getStudentId(), lessonGroup);
+    }
+
+    /**
+     * 记录老师账户记录
+     *
+     * @param userOrderDetailVo
+     * @param purchaseRecord
+     */
+    private void addTeacherAccount(UserOrderDetailVo userOrderDetailVo, VideoLessonPurchaseRecord purchaseRecord, VideoLessonGroup lessonGroup) {
+        //查询直播课服务费
+        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(
+                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.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 插入平台分润支出
+        }
     }
 
     /**
@@ -230,10 +264,10 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
 
         //学生端-购买视频课
         try {
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(),lesson.getId());
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(), lesson.getId());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
-                    studentReceivers, null, 0, url , ClientEnum.STUDENT.getCode(),
-                    teacher.getUsername(), lesson.getLessonName() );
+                    studentReceivers, null, 0, url, ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername(), lesson.getLessonName());
             log.info("send success {}", MessageTypeEnum.VIDEO_BUY);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.VIDEO_BUY);

+ 0 - 29
cooleshow-user/user-biz/src/main/java/controller/PlatformCashAccountRecordController.java

@@ -1,29 +0,0 @@
-package controller;
-
-
-import com.ym.mec.biz.dal.entity.PlatformCashAccountRecord;
-import com.ym.mec.biz.service.PlatformCashAccountRecordService;
-import org.springframework.web.bind.annotation.*;
-import com.ym.mec.common.controller.BaseController;
-import io.swagger.annotations.Api;
-
-import javax.annotation.Resource;
-
-/**
- * 平台账户流水表(PlatformCashAccountRecord)表控制层
- *
- * @author zx
- * @since 2022-07-21 10:32:05
- */
-@Api(tags = "平台账户流水表")
-@RestController
-@RequestMapping("/platformCashAccountRecord")
-public class PlatformCashAccountRecordController extends BaseController {
-    /**
-     * 服务对象
-     */
-    @Resource
-    private PlatformCashAccountRecordService platformCashAccountRecordService;
-
-}
-

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

@@ -191,4 +191,44 @@
         where post_status_ = 'RECORDED' and ucar.create_time_ > date_format(now(),'%Y-%m-%d')
         group by su.id_, su.phone_
     </select>
+
+    <select id="selectRecordByOrderDetail" resultType="com.yonge.cooleshow.biz.dal.entity.UserAccountRecord">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM user_cash_account_record t
+        where t.order_no_ = #{param.orderNo}
+        <if test="null != param.goodType">
+            <if test="param.goodType.code == 'VIP'">
+                and t.biz_type_ = 'VIP_SHARE'
+            </if>
+            <if test="param.goodType.code == 'PRACTICE'">
+                and t.biz_type_ = 'PRACTICE'
+            </if>
+            <if test="param.goodType.code == 'LIVE'">
+                and t.biz_type_ in ('LIVE','LIVE_SHARE')
+            </if>
+            <if test="param.goodType.code == 'VIDEO'">
+                and t.biz_type_ in ('VIDEO','VIDEO_SHARE')
+            </if>
+            <if test="param.goodType.code == 'MUSIC'">
+                and t.biz_type_ in ('MUSIC','MUSIC_SHARE')
+            </if>
+        </if>
+        and t.biz_id_ IN
+        <foreach collection="bizIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="detailByBiz" resultType="com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo">
+        select
+            <include refid="baseColumns"/>
+        from user_cash_account_record t
+        <where>
+            t.biz_type_ = #{bizType} and t.biz_id_ = #{bizId}
+            <if test="orderNo != null and orderNo != ''">
+                and t.order_no_ = #{orderNo}
+            </if>
+        </where>
+    </select>
 </mapper>