Explorar el Código

平衡关系导出

zouxuan hace 10 meses
padre
commit
c4c19147ff
Se han modificado 21 ficheros con 667 adiciones y 87 borrados
  1. 13 1
      mec-application/src/main/resources/exportColumnMapper.ini
  2. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExportDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  4. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailLogDao.java
  5. 169 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportWrapper.java
  6. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentStudentCourseDetailLog.java
  7. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  9. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  10. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailLogService.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  12. 27 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  13. 11 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  14. 91 52
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  15. 35 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  16. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailLogServiceImpl.java
  17. 13 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java
  18. 81 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  19. 107 0
      mec-biz/src/main/resources/config/mybatis/ExportMapper.xml
  20. 26 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  21. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailLogMapper.xml

+ 13 - 1
mec-application/src/main/resources/exportColumnMapper.ini

@@ -374,6 +374,10 @@ fieldColumns = ["organName","musicGroupName","musicGroupId","studentId","student
 headColumns = ["分部","学员编号","学员姓名","手机号","学员声部","云教练类型","数量","缴费金额(元)","状态","取消原因","操作人","操作时间","获得资格时间"]
 fieldColumns = ["organName","studentId","name","phone","subjectName","type.msg","time","amount","status == 1 ? '待激活':'已取消'","cancelReason","operatorName","operateTime","createTime"]
 
+[平衡关系-乐团课1]
+headColumns = ["分部","乐团名称","乐团编号","班级名称","班级类型","班级编号","课程类型","期初预收款","期初剩余课次","期初课酬","期初被合并课预收款","期初被合并课剩余课次","期初被合并课课酬","当月新增预收","当月新增课酬","当月新增课次","当月被合并新增预收","当月被合并新增课酬","当月被合并新增课次","当月课耗收入","当月消耗课酬","当月消耗课次","当月被合并课耗收入","当月被合并消耗课酬","当月被合并消耗课次","期末预收款","期末剩余课次","期末课酬","期末被合并课预收款","期末被合并课剩余课次","期末被合并课课酬"]
+fieldColumns = ["organName","musicGroupName","musicGroupId","className","classType","classId","courseType","firstMonthPreAmount","firstMonthSubCourseNum","firstMonthCourseSalary","firstMonthPreMergeAmount","firstMonthSubMergeCourseNum","firstMonthMergeCourseSalary","currentMonthAddCourseAmount","currentMonthAddReward","currentMonthAdd","currentMonthAddMergeCourseAmount","currentMonthMergedAddReward","currentMonthMergedAdd","currentMonthCourseAmount","currentMonthConsumeReward","currentMonthConsume","currentMonthMergeCourseAmount","currentMonthMergedConsumeReward","currentMonthMergedConsume","lastMonthPreAmount","lastMonthSubCourseNum","lastMonthCourseSalary","lastMonthPreMergeAmount","lastMonthSubMergeCourseNum","lastMonthMergeCourseSalary"]
+
 [平衡关系-乐团课]
 headColumns = ["分部","乐团名称","乐团编号","班级名称","班级类型","班级编号","课程类型","剩余课次","剩余课次课酬","剩余被合并课次","剩余被合并课次课酬","已上课次","已上课次课酬","已上被合并课次","已上被合并课次课酬","当月新增","当月新增课酬","当月被合并新增","当月被合并新增课酬","当月消耗","当月消耗课酬","当月被合并消耗","当月被合并消耗课酬"]
 fieldColumns = ["organName","musicGroupName","musicGroupId","className","classType","classId","courseType","surplusCourse","surplusCourseReward","surplusMergedCourse","surplusMergedCourseReward","alreadyCourse","alreadyCourseReward","alreadyMergedCourse","alreadyMergedCourseReward","currentMonthAdd","currentMonthAddReward","currentMonthMergedAdd","currentMonthMergedAddReward","currentMonthConsume","currentMonthConsumeReward","currentMonthMergedConsume","currentMonthMergedConsumeReward"]
@@ -408,4 +412,12 @@ fieldColumns = ["organizationName","memberNum","noPlayNum","playTimeLess10","pla
 
 [云课堂统计详情导出]
 headColumns = ["声部老师","会员人数","无练习人数","0-10分钟","10-60分钟","60-120分钟","120-240分钟",">240分钟","平均时长(分钟)"]
-fieldColumns = ["teacherName","memberNum","noPlayNum","playTimeLess10","playTimeLess60","playTimeLess120","playTimeLess240","playTimeRather240","avgPlayTime"]
+fieldColumns = ["teacherName","memberNum","noPlayNum","playTimeLess10","playTimeLess60","playTimeLess120","playTimeLess240","playTimeRather240","avgPlayTime"]
+
+[平衡关系-已分班未排课]
+headColumns = ["分部","乐团名称","乐团编号","班级名称","班级类型","班级编号","课程类型","剩余可排课时长","总预收","总课酬"]
+fieldColumns = ["organName","musicGroupName","musicGroupId","className","classType","classId","courseType","subCourseMinutes","totalCoursePrice","totalCourseSalary"]
+
+[平衡关系-VIP剩余课时及金额明细]
+headColumns = ["分部","学校","学生编号","学生姓名","课程类型","期初预收款(已排)","期初预收款(未排)","期初剩余课次(已排)","期初剩余课次(未排)","期初课酬成本(已排)","期初课酬成本(未排)","当月现金收款","当月余额收款","当月新增课次","当月新增课酬(已排)","当月新增课酬(未排)","当月消耗课次","当月课酬","当月课耗总收入","期末预收款(已排)","期末预收款(未排)","期末余额(已排)","期末余额(未排)","期末课酬(已排)","期末课酬(未排)"]
+fieldColumns = ["organName","coopName","userId","username","courseType","firstMonthPreCourseAmount","firstMonthPreNoCourseAmount","firstMonthSubCourseNum","firstMonthSubNoCourseNum","firstMonthCourseSalary","firstMonthNoCourseSalary","currentMonthActualAmount","currentMonthBalanceAmount","currentMonthAddCourseNum","currentMonthAddCourseSalary","currentMonthAddNoCourseSalary","currentMonthConsumeCourseNum","currentMonthCourseSalary","currentMonthCourseAmount","lastMonthPreCourseAmount","lastMonthPreNoCourseAmount","lastMonthSubCourseNum","lastMonthSubNoCourseNum","lastMonthCourseSalary","lastMonthNoCourseSalary"]

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExportDao.java

@@ -11,6 +11,8 @@ public interface ExportDao {
 
     //平衡关系-乐团课
     List<ExportWrapper.ExportBalancedRelationshipMusicCourse> exportBalancedRelationshipMusicCourse(@Param("month") String month, @Param("organIds") String organIds);
+    //平衡关系-乐团课
+    List<ExportWrapper.ExportBalancedRelationshipMusicCourse> exportBalancedRelationshipMusicCourse1(@Param("month") String month, @Param("organIds") String organIds);
 
     //平衡关系-VIP已排课
     List<ExportWrapper.ExportBalancedRelationshipVipCourse> exportBalancedRelationshipVipCourse(@Param("month") String month, @Param("organIds") String organIds);
@@ -35,4 +37,9 @@ public interface ExportDao {
 
     //小组课学员课程导出
     List<ExportStudentCourseInfoDto> queryStudentCourseInfo(@Param("organId") String organId, @Param("tenantId") Integer tenantId, @Param("groupType") String groupType);
+
+    //平衡关系-VIP剩余课时及金额明细
+    List<ExportWrapper.ExportBalancedRelationshipVipSubCourseDetail> exportBalancedRelationshipVipSubCourseDetail(@Param("month") String month, @Param("organIds") String organIds);
+
+    List<ExportWrapper.ExportBalancedRelationshipVipSubCourseDetail> exportBalancedRelationshipVipSubCourseSum(@Param("month") String month);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -546,4 +546,6 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<ExportMusicGroupEchelonDataDto> queryMusicGroupEchelonData(@Param("musicGroupIds") List<String> musicGroupIds);
 
     List<String> getDelImGroupId();
+
+    List<ExportWrapper.ExportBalancedRelationshipMusicNoCourse> exportBalancedRelationshipMusicNoCourse(@Param("month") String month,@Param("organIds") String organIds);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailLogDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetailLog;
+
+public interface MusicGroupPaymentStudentCourseDetailLogDao extends BaseMapper<MusicGroupPaymentStudentCourseDetailLog> {
+
+
+}

+ 169 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportWrapper.java

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * @author zx
  */
@@ -254,6 +256,24 @@ public class ExportWrapper {
         @ApiModelProperty("课程类型")
         private String courseType;
 
+        @ApiModelProperty("期初预收款")
+        private Integer firstMonthPreAmount;
+
+        @ApiModelProperty("期初剩余课次")
+        private Integer firstMonthSubCourseNum;
+
+        @ApiModelProperty("期初课酬")
+        private String firstMonthCourseSalary;
+
+        @ApiModelProperty("期初被合并课预收款")
+        private Integer firstMonthPreMergeAmount;
+
+        @ApiModelProperty("期初被合并课剩余课次")
+        private Integer firstMonthSubMergeCourseNum;
+
+        @ApiModelProperty("期初被合并课课酬")
+        private String firstMonthMergeCourseSalary;
+
         @ApiModelProperty("剩余课次")
         private Integer surplusCourse;
 
@@ -281,25 +301,174 @@ public class ExportWrapper {
         @ApiModelProperty("当月新增")
         private Integer currentMonthAdd;
 
+        @ApiModelProperty("当月新增预收")
+        private String currentMonthAddCourseAmount;
+
         @ApiModelProperty("当月新增课酬")
         private String currentMonthAddReward;
 
         @ApiModelProperty("当月被合并新增")
         private Integer currentMonthMergedAdd;
 
+        @ApiModelProperty("当月被合并新增预收")
+        private String currentMonthAddMergeCourseAmount;
+
         @ApiModelProperty("当月被合并新增课酬")
         private String currentMonthMergedAddReward;
 
         @ApiModelProperty("当月消耗")
         private Integer currentMonthConsume;
 
+        @ApiModelProperty("当月课耗收入")
+        private String currentMonthCourseAmount;
+
         @ApiModelProperty("当月消耗课酬")
         private String currentMonthConsumeReward;
 
         @ApiModelProperty("当月被合并消耗")
         private Integer currentMonthMergedConsume;
 
+        @ApiModelProperty("当月被合并课耗收入")
+        private String currentMonthMergeCourseAmount;
+
         @ApiModelProperty("当月被合并消耗课酬")
         private String currentMonthMergedConsumeReward;
+
+        @ApiModelProperty("期末预收款")
+        private Integer lastMonthPreAmount;
+
+        @ApiModelProperty("期末剩余课次")
+        private Integer lastMonthSubCourseNum;
+
+        @ApiModelProperty("期末课酬")
+        private String lastMonthCourseSalary;
+
+        @ApiModelProperty("期末被合并课预收款")
+        private Integer lastMonthPreMergeAmount;
+
+        @ApiModelProperty("期末被合并课剩余课次")
+        private Integer lastMonthSubMergeCourseNum;
+
+        @ApiModelProperty("期末被合并课课酬")
+        private String lastMonthMergeCourseSalary;
+    }
+
+    @Data
+    @ApiModel("平衡关系-已分班未排课")
+    public static class ExportBalancedRelationshipMusicNoCourse {
+        @ApiModelProperty("分部")
+        private String organName;
+
+        @ApiModelProperty("乐团名称")
+        private String musicGroupName;
+
+        @ApiModelProperty("乐团编号")
+        private String musicGroupId;
+
+        @ApiModelProperty("班级名称")
+        private String className;
+
+        @ApiModelProperty("班级类型")
+        private String classType;
+
+        @ApiModelProperty("班级编号")
+        private String classId;
+
+        @ApiModelProperty("学生人数")
+        private Integer studentNum;
+
+        @ApiModelProperty("课程类型")
+        private String courseType;
+
+        @ApiModelProperty("老师编号")
+        private Integer teacherId;
+
+        @ApiModelProperty("剩余可排课时长")
+        private BigDecimal subCourseMinutes = BigDecimal.ZERO;
+
+        @ApiModelProperty("总预收")
+        private BigDecimal totalCoursePrice = BigDecimal.ZERO;
+
+        @ApiModelProperty("总课酬")
+        private BigDecimal totalCourseSalary = BigDecimal.ZERO;
+    }
+
+    @Data
+    @ApiModel("平衡关系-VIP剩余课时及金额明细")
+    public static class ExportBalancedRelationshipVipSubCourseDetail {
+        @ApiModelProperty("分部")
+        private String organName;
+
+        @ApiModelProperty("学校")
+        private String coopName;
+
+        @ApiModelProperty("学生编号")
+        private Integer userId;
+
+        @ApiModelProperty("学生姓名")
+        private String username;
+
+        @ApiModelProperty("课程类型")
+        private String courseType;
+
+        @ApiModelProperty("期初预收款(已排)")
+        private BigDecimal firstMonthPreCourseAmount;
+
+        @ApiModelProperty("期初预收款(未排)")
+        private BigDecimal firstMonthPreNoCourseAmount;
+
+        @ApiModelProperty("期初剩余课次(已排)")
+        private Integer firstMonthSubCourseNum;
+
+        @ApiModelProperty("期初剩余课次(未排)")
+        private Integer firstMonthSubNoCourseNum;
+
+        @ApiModelProperty("期初课酬成本(已排)")
+        private BigDecimal firstMonthCourseSalary;
+
+        @ApiModelProperty("期初课酬成本(未排)")
+        private BigDecimal firstMonthNoCourseSalary;
+
+        @ApiModelProperty("当月现金收款")
+        private BigDecimal currentMonthActualAmount;
+
+        @ApiModelProperty("当月余额收款")
+        private BigDecimal currentMonthBalanceAmount;
+
+        @ApiModelProperty("当月新增课次")
+        private Integer currentMonthAddCourseNum;
+
+        @ApiModelProperty("当月新增课酬(已排)")
+        private BigDecimal currentMonthAddCourseSalary;
+
+        @ApiModelProperty("当月新增课酬(未排)")
+        private BigDecimal currentMonthAddNoCourseSalary;
+
+        @ApiModelProperty("当月消耗课次")
+        private Integer currentMonthConsumeCourseNum;
+
+        @ApiModelProperty("当月课酬")
+        private BigDecimal currentMonthCourseSalary;
+
+        @ApiModelProperty("当月课耗总收入")
+        private BigDecimal currentMonthCourseAmount;
+
+        @ApiModelProperty("期末预收款(已排)")
+        private BigDecimal lastMonthPreCourseAmount;
+
+        @ApiModelProperty("期末预收款(未排)")
+        private BigDecimal lastMonthPreNoCourseAmount;
+
+        @ApiModelProperty("期末余额(已排)")
+        private Integer lastMonthSubCourseNum;
+
+        @ApiModelProperty("期末余额(未排)")
+        private Integer lastMonthSubNoCourseNum;
+
+        @ApiModelProperty("期末课酬(已排)")
+        private BigDecimal lastMonthCourseSalary;
+
+        @ApiModelProperty("期末课酬(未排)")
+        private BigDecimal lastMonthNoCourseSalary;
     }
 }

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentStudentCourseDetailLog.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 对应数据库表(music_group_payment_student_course_detail_log):
+ */
+@Data
+public class MusicGroupPaymentStudentCourseDetailLog{
+	private Long id;
+
+	@ApiModelProperty(value = "排课时长编号")
+	private Long musicGroupPaymentStudentCourseDetailId;
+
+	@ApiModelProperty(value = "本次排课预收款")
+	private BigDecimal coursePrice = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "本次排课总课酬")
+	private BigDecimal courseSalary = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "本次消耗排课时长")
+	private Integer usedCourseMinutes = 0;
+
+	@ApiModelProperty(value = "本次排课次数")
+	private Integer courseNum = 0;
+	
+	private java.util.Date createTime;
+	
+	private java.util.Date updateTime;
+
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -105,6 +105,9 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL("EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL","平衡关系(分表)-乐团退团学员"),
     VIDEO_PLAY_STAT("VIDEO_PLAY_STAT","云课堂统计导出"),
     VIDEO_PLAY_DETAIL_STAT("VIDEO_PLAY_DETAIL_STAT","云课堂统计详情导出"),
+    EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE("EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE","平衡关系-已分班未排课"),
+    EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL("EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL","平衡关系-VIP剩余课时及金额明细"),
+    EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_SUM("EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_SUM","平衡关系-VIP剩余课时及金额汇总"),
     ;
 
     private String code;

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -43,6 +43,8 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL(36,"平衡关系(分表)-乐团退团学员"),
 	VIDEO_PLAY_STAT(37,"云课堂统计导出"),
 	VIDEO_PLAY_DETAIL_STAT(38,"云课堂统计详情导出"),
+	EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE(39,"平衡关系-已分班未排课"),
+	EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL(40,"平衡关系-VIP剩余课时及金额明细"),
 	;
 
 	private Integer code;

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -70,7 +71,7 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 * @param studentIds: 课程学员列表
 	 * @return void
 	 */
-	void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds);
+	void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds,Map<Long, BigDecimal> salaryMap);
 
 	/**
 	 * @describe 创建课程缴费记录-会员乐团
@@ -91,7 +92,7 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 * @param studentIds: 课程学员列表
 	 * @return void
 	 */
-	void createForMusicGroup(List<CourseSchedule> courseSchedules, List<Integer> studentIds,Integer musicGroupStudentClassAdjustId);
+	void createForMusicGroup(List<CourseSchedule> courseSchedules, List<Integer> studentIds,Integer musicGroupStudentClassAdjustId,Map<Long,BigDecimal> salaryMap);
 
 	/**
 	 * 获取班级未开始的的课程

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailLogService.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetailLog;
+
+
+public interface MusicGroupPaymentStudentCourseDetailLogService extends IService<MusicGroupPaymentStudentCourseDetailLog>  {
+
+}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -486,4 +486,6 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
     List<Subject> getSubjectListByIdAndCoopId(String musicGroupId, Integer coopId);
 
     Map<String, List<ExportMusicGroupEchelonDataDto>> queryMusicGroupEchelonData(List<Integer> organIds);
+
+    List<ExportWrapper.ExportBalancedRelationshipMusicNoCourse> exportBalancedRelationshipMusicNoCourse(String month, String organIds);
 }

+ 27 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -2242,18 +2242,23 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
         }
 
-        if (courseScheduleList.size() > 0) {
+        if (CollectionUtils.isNotEmpty(courseScheduleList)) {
             //检测新排课冲突
             courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
         }
 
         //老师结算表
-        if (courseScheduleTeacherSalaryList.size() > 0) {
+        if (CollectionUtils.isNotEmpty(courseScheduleTeacherSalaryList)) {
             courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
         }
         //学生结算表
-        if (courseScheduleList.size() > 0) {
-            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList);
+        if (CollectionUtils.isNotEmpty(courseScheduleList)){
+            Map<Long,BigDecimal> salaryMap = new HashMap<>();
+            if (CollectionUtils.isNotEmpty(courseScheduleTeacherSalaryList)) {
+                salaryMap = courseScheduleTeacherSalaryList.stream()
+                        .collect(Collectors.toMap(CourseScheduleTeacherSalary::getCourseScheduleId, CourseScheduleTeacherSalary::getExpectSalary));
+            }
+            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList,salaryMap);
             studentService.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
         }
         //创建IM群组
@@ -2518,7 +2523,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
             Integer musicGroupStudentClassAdjustId = classGroup4MixDto.getMusicGroupStudentClassAdjustId();
             //学生结算表
-            courseScheduleStudentPaymentService.createForMusicGroup(courseScheduleList, studentIdList, musicGroupStudentClassAdjustId);
+            Map<Long,BigDecimal> salaryMap = new HashMap<>();
+            if (org.apache.commons.collections.CollectionUtils.isNotEmpty(courseScheduleTeacherSalaryList)) {
+                salaryMap = courseScheduleTeacherSalaryList.stream()
+                        .collect(Collectors.toMap(CourseScheduleTeacherSalary::getCourseScheduleId, CourseScheduleTeacherSalary::getExpectSalary));
+            }
+            courseScheduleStudentPaymentService.createForMusicGroup(courseScheduleList, studentIdList, musicGroupStudentClassAdjustId,salaryMap);
             return classGroup;
         }
         return null;
@@ -2832,9 +2842,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         if (!CollectionUtils.isEmpty(studentList)) {
             studentService.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
-
+            Map<Long,BigDecimal> salaryMap = new HashMap<>();
+            if (CollectionUtils.isNotEmpty(courseScheduleTeacherSalaryList)) {
+                salaryMap = courseScheduleTeacherSalaryList.stream()
+                        .collect(Collectors.toMap(CourseScheduleTeacherSalary::getCourseScheduleId, CourseScheduleTeacherSalary::getExpectSalary));
+            }
             //学生结算表
-            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIds);
+            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIds,salaryMap);
         }
         //学校端推送
         courseScheduleModifyLogService.pushSchoolCourseCreate(courseScheduleList.get(0),musicGroup);
@@ -3482,7 +3496,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         //学生结算表
         if (!CollectionUtils.isEmpty(studentIdList)) {
-            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList);
+            Map<Long,BigDecimal> salaryMap = new HashMap<>();
+            if (CollectionUtils.isNotEmpty(courseScheduleTeacherSalaryList)) {
+                salaryMap = courseScheduleTeacherSalaryList.stream()
+                        .collect(Collectors.toMap(CourseScheduleTeacherSalary::getCourseScheduleId, CourseScheduleTeacherSalary::getExpectSalary));
+            }
+            courseScheduleStudentPaymentService.createForMusicGroup(musicGroupId, courseScheduleList, studentIdList,salaryMap);
             studentService.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
         }
         return classGroup;

+ 11 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -550,10 +550,10 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, new ArrayList<>(removeStudentIds));
         }
 
-        if (!CollectionUtils.isEmpty(addStudentIds)) {
+        /*if (!CollectionUtils.isEmpty(addStudentIds)) {
             courseScheduleStudentPaymentService.createForMusicGroup(classGroup.getMusicGroupId(), classGroupNotStartCourse, new ArrayList<>(addStudentIds));
             studentDao.updateStudentServiceTag(null, new ArrayList<>(addStudentIds), YesOrNoEnum.YES.getCode());
-        }
+        }*/
 
         //4、调整未上课课酬
         if(!CollectionUtils.isEmpty(classGroupNotStartCourse)){
@@ -573,6 +573,15 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
             courseScheduleTeacherSalaryService.batchInsert(oldCourseSalaries);
+            if (!CollectionUtils.isEmpty(addStudentIds)) {
+                Map<Long,BigDecimal> salaryMap = new HashMap<>();
+                if (org.apache.commons.collections.CollectionUtils.isNotEmpty(oldCourseSalaries)) {
+                    salaryMap = oldCourseSalaries.stream()
+                            .collect(Collectors.toMap(CourseScheduleTeacherSalary::getCourseScheduleId, CourseScheduleTeacherSalary::getExpectSalary));
+                }
+                courseScheduleStudentPaymentService.createForMusicGroup(classGroup.getMusicGroupId(), classGroupNotStartCourse, new ArrayList<>(addStudentIds),salaryMap);
+                studentDao.updateStudentServiceTag(null, new ArrayList<>(addStudentIds), YesOrNoEnum.YES.getCode());
+            }
         }
 
         if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){

+ 91 - 52
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -10,10 +10,7 @@ import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.OperatingReportCloudService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -22,13 +19,12 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -60,6 +56,8 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	@Autowired
 	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
 	@Autowired
+	private MusicGroupPaymentStudentCourseDetailLogService musicGroupPaymentStudentCourseDetailLogService;
+	@Autowired
 	private TeacherDao teacherDao;
 	@Autowired
 	private StudentAttendanceDao studentAttendanceDao;
@@ -123,39 +121,39 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 			List<CourseSchedule> courseSchedules = courseScheduleGroupByTeachMode.get(teachModeEnum)
 					.stream()
 					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime)).collect(Collectors.toList());
-			for(int i=0;i<courseSchedules.size();i++) {
-				//创建学生课程应缴费记录
-				CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
-				courseScheduleStudentPayment.setUserId(userId);
-	            courseScheduleStudentPayment.setGroupType(courseSchedules.get(i).getGroupType());
-	            courseScheduleStudentPayment.setMusicGroupId(courseSchedules.get(i).getMusicGroupId());
-				courseScheduleStudentPayment.setCourseScheduleId(courseSchedules.get(i).getId());
-				courseScheduleStudentPayment.setClassGroupId(courseSchedules.get(i).getClassGroupId());
-
-				if (teachModeEnum == TeachModeEnum.ONLINE) {
-					//学生线上单节课应缴费计算
-					courseScheduleStudentPayment.setExpectPrice(
-							vipGroup.getOnlineClassesUnitPrice().multiply(vipGroupActivity.getDiscount())
-									.divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP)
-									.subtract(couponFee));
-				}else{
-					//学生线下单节课应缴费计算
-					courseScheduleStudentPayment.setExpectPrice(
-							vipGroup.getOfflineClassesUnitPrice().multiply(vipGroupActivity.getDiscount())
-									.divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP)
-									.subtract(couponFee));
-				}
-                courseScheduleStudentPayment.setOriginalPrice(TeachModeEnum.ONLINE.equals(teachModeEnum)?vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice():vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
-				courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
-				courseScheduleStudentPayments.add(courseScheduleStudentPayment);
-			}
+            for (CourseSchedule courseSchedule : courseSchedules) {
+                //创建学生课程应缴费记录
+                CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+                courseScheduleStudentPayment.setUserId(userId);
+                courseScheduleStudentPayment.setGroupType(courseSchedule.getGroupType());
+                courseScheduleStudentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+                courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+                courseScheduleStudentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+
+                if (teachModeEnum == TeachModeEnum.ONLINE) {
+                    //学生线上单节课应缴费计算
+                    courseScheduleStudentPayment.setExpectPrice(
+                            vipGroup.getOnlineClassesUnitPrice().multiply(vipGroupActivity.getDiscount())
+                                    .divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, RoundingMode.HALF_UP)
+                                    .subtract(couponFee));
+                } else {
+                    //学生线下单节课应缴费计算
+                    courseScheduleStudentPayment.setExpectPrice(
+                            vipGroup.getOfflineClassesUnitPrice().multiply(vipGroupActivity.getDiscount())
+                                    .divide(new BigDecimal(100), CommonConstants.DECIMAL_FINAL_PLACE, RoundingMode.HALF_UP)
+                                    .subtract(couponFee));
+                }
+                courseScheduleStudentPayment.setOriginalPrice(TeachModeEnum.ONLINE.equals(teachModeEnum) ? vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice() : vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
+                courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
+                courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+            }
 		}
 		return courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 	}
 
     @Override
     public int deleteStudentCourseSchedule(Integer userId, List<CourseSchedule> courseScheduleList) {
-		if(courseScheduleList.size() == 0){
+		if(CollectionUtils.isEmpty(courseScheduleList)){
 			return 0;
 		}
 		List<Long> courseScheduleIdList = courseScheduleList.stream().map(CourseSchedule :: getId).collect(Collectors.toList());
@@ -286,7 +284,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void createForMusicGroup(List<CourseSchedule> courseSchedules, List<Integer> studentIds,Integer musicGroupStudentClassAdjustId) {
+	public void createForMusicGroup(List<CourseSchedule> courseSchedules, List<Integer> studentIds,Integer musicGroupStudentClassAdjustId,Map<Long,BigDecimal> salaryMap) {
 		//获取提交的合班申请
 		MusicGroupStudentClassAdjust classAdjust = musicGroupStudentClassAdjustDao.get(musicGroupStudentClassAdjustId);
 		List<Long> studentPaymentIds = JSON.parseArray(classAdjust.getStudentPaymentIds(), Long.class);
@@ -297,18 +295,19 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 //		String courseDefaultMinutes = sysConfigDao.findConfigValue("music_course_default_minutes");
 		JSONObject jsonObject = JSON.parseObject(classAdjust.getDefaultCourseTypeMinute());
 		List<CourseScheduleStudentPayment> totalCourseScheduleStudentPayments = new ArrayList<>();
+		List<MusicGroupPaymentStudentCourseDetailLog> musicGroupPaymentStudentCourseDetailLogs = new ArrayList<>();
 		for (Integer studentId : studentIds) {
 			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = null;
 			BigDecimal typeCourseTotalOriginalPrice = new BigDecimal("0"), typeCourseTotalCurrentPrice = new BigDecimal("0");
-			List<CourseScheduleStudentPayment> oldCourseScheduleStudentPayments = new ArrayList<>();
+//			List<CourseScheduleStudentPayment> oldCourseScheduleStudentPayments = new ArrayList<>();
 			List<CourseScheduleStudentPayment> newCourseScheduleStudentPayments = new ArrayList<>();
 			for (int i = 0; i < courseSchedules.size(); i++) {
 				CourseSchedule courseSchedule = courseSchedules.get(i);
 				//优先处理之前的剩余课程
 				//获取调班之前,学员剩余的课程列表
-				if(studentPaymentIds != null && studentPaymentIds.size() > 0){
+				if(CollectionUtils.isNotEmpty(studentPaymentIds)){
 					List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentDao.queryByIdsAndStudentId(studentPaymentIds,studentId,courseSchedule.getType().getCode());
-					if(studentPayments != null && studentPayments.size() > 0){
+					if(CollectionUtils.isNotEmpty(studentPayments)){
 						CourseScheduleStudentPayment studentPayment = new CourseScheduleStudentPayment();
 						try {
 							BeanUtils.copyProperties(studentPayment, studentPayments.get(0));
@@ -322,7 +321,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 						studentPayment.setSettlementTime(null);
 						studentPayment.setExamSongDownloadJson(null);
 						studentPayment.setId(null);
-						oldCourseScheduleStudentPayments.add(studentPayment);
+//						oldCourseScheduleStudentPayments.add(studentPayment);
 						totalCourseScheduleStudentPayments.add(studentPayment);
 						continue ;
 					}
@@ -331,7 +330,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 				if(musicGroupPaymentStudentCourseDetails == null){
 					musicGroupPaymentStudentCourseDetails = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(studentId,courseSchedule.getType(),courseSchedule.getMusicGroupId());
 				}
-				if(musicGroupPaymentStudentCourseDetails == null || musicGroupPaymentStudentCourseDetails.size() == 0){
+				if(CollectionUtils.isEmpty(musicGroupPaymentStudentCourseDetails)){
 					throw new BizException("学员缴费详情获取失败");
 				}
 				//获取合班时的缴费项目
@@ -339,17 +338,17 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 				List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalendersAndCourseType(calenderIds, courseSchedule.getType());
 				MusicGroupPaymentCalenderCourseSettings courseSetting = musicGroupPaymentCalenderCourseSettings.get(0);
 				//课程每分钟原价
-				BigDecimal unitMinuteOriginalPrice = courseSetting.getCourseOriginalPrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal unitMinuteOriginalPrice = courseSetting.getCourseOriginalPrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, RoundingMode.DOWN);
 
 				//课程每分钟现价
-				BigDecimal unitMinuteCurrentPrice = courseSetting.getOverflowCoursePrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal unitMinuteCurrentPrice = courseSetting.getOverflowCoursePrice().divide(new BigDecimal(courseSetting.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, RoundingMode.DOWN);
 
 				//默认课程时长
 				int courseDuration = Integer.parseInt(jsonObject.get(courseSchedule.getType().getCode()).toString());
-				BigDecimal courseOriginalPrice = unitMinuteOriginalPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal courseOriginalPrice = unitMinuteOriginalPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, RoundingMode.DOWN);
 				typeCourseTotalOriginalPrice = typeCourseTotalOriginalPrice.add(courseOriginalPrice);
 				//课程现价
-				BigDecimal courseCurrentPrice = unitMinuteCurrentPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal courseCurrentPrice = unitMinuteCurrentPrice.multiply(new BigDecimal(courseDuration)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, RoundingMode.DOWN);
 				typeCourseTotalCurrentPrice = typeCourseTotalCurrentPrice.add(courseCurrentPrice);
 				CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
 				cssp.setGroupType(courseSchedule.getGroupType());
@@ -372,16 +371,31 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 				}
 				//获取课程类型默认排课时长
 				int typeCourseDuration = Integer.parseInt(jsonObject.get(courseSchedule.getType().getCode()).toString());
+				Map<Long,MusicGroupPaymentStudentCourseDetailLog> courseDetailLogsMap = musicGroupPaymentStudentCourseDetailLogs
+						.stream().collect(Collectors.toMap(MusicGroupPaymentStudentCourseDetailLog::getMusicGroupPaymentStudentCourseDetailId, a -> a,(k1,k2)->k1));
 				for (MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail : musicGroupPaymentStudentCourseDetails) {
+					MusicGroupPaymentStudentCourseDetailLog detailLog = courseDetailLogsMap.get(musicGroupPaymentStudentCourseDetail.getId());
+					if(detailLog == null){
+						detailLog = new MusicGroupPaymentStudentCourseDetailLog();
+						musicGroupPaymentStudentCourseDetailLogs.add(detailLog);
+						detailLog.setMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentStudentCourseDetail.getId());
+					}
+					detailLog.setCourseNum(detailLog.getCourseNum() + 1);
+					detailLog.setCoursePrice(detailLog.getCoursePrice().add(courseCurrentPrice));
+					detailLog.setCourseSalary(detailLog.getCourseSalary().add(salaryMap.get(courseSchedule.getId()) == null ? BigDecimal.ZERO : salaryMap.get(courseSchedule.getId())));
 					if(typeCourseDuration > musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes()){
+						detailLog.setUsedCourseMinutes(detailLog.getUsedCourseMinutes() + musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes());
 						musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes());
 					}else{
+						detailLog.setUsedCourseMinutes(detailLog.getUsedCourseMinutes() + typeCourseDuration);
 						musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(musicGroupPaymentStudentCourseDetail.getUsedCourseMinutes() + typeCourseDuration);
 					}
 				}
 			}
-			if(musicGroupPaymentStudentCourseDetails != null && musicGroupPaymentStudentCourseDetails.size() > 0){
+			if(CollectionUtils.isNotEmpty(musicGroupPaymentStudentCourseDetails)){
 				musicGroupPaymentStudentCourseDetailDao.batchUpdate(musicGroupPaymentStudentCourseDetails);
+				//保存排课日志
+				musicGroupPaymentStudentCourseDetailLogService.saveBatch(musicGroupPaymentStudentCourseDetailLogs);
 			}
 		}
 		courseScheduleStudentPaymentDao.batchInsert(totalCourseScheduleStudentPayments);
@@ -390,12 +404,12 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 	@Override
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds) {
+	public void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds,Map<Long,BigDecimal> salaryMap) {
 		Map<Integer, List<CourseSchedule>> memberCourseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getMemberFlag));
 		Map<Long,List<Long>> courseCalenderMap = new HashMap<>(10);
 		for (Integer memberFlag : memberCourseMap.keySet()) {
 			List<CourseSchedule> courseScheduleList = memberCourseMap.get(memberFlag);
-			if(courseScheduleList != null && courseScheduleList.size() > 0){
+			if(CollectionUtils.isNotEmpty(courseScheduleList)){
 				if(memberFlag == 1){
 					createForMemberMusicGroup(musicGroupId,courseScheduleList,studentIds);
 				}else {
@@ -453,6 +467,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 							List<CourseScheduleStudentPayment> typeCourseStudentPayments = new ArrayList<>();
 							courseScheduleTypeListEntry.getValue().sort(Comparator.comparing(CourseSchedule::getStartClassTime));
 							List<CourseSchedule> scheduleList = courseScheduleTypeListEntry.getValue();
+							List<MusicGroupPaymentStudentCourseDetailLog> musicGroupPaymentStudentCourseDetailLogs = new ArrayList<>();
 							for (CourseSchedule courseSchedule : scheduleList) {
 								if(existCourseIds.contains(courseSchedule.getId())){
 									throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
@@ -463,18 +478,21 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 								cssp.setUserId(studentId);
 								//扣除可排课时长
 								//处理经营报表
-								this.calcCourseMinutes(musicGroupPaymentStudentCourseDetails,courseDuration,cssp,musicGroupPaymentCalenders,courseCalenderMap);
+								this.calcCourseMinutes(musicGroupPaymentStudentCourseDetails,courseDuration,
+										cssp,musicGroupPaymentCalenders,courseCalenderMap,musicGroupPaymentStudentCourseDetailLogs,salaryMap.get(courseSchedule.getId()));
 								typeCourseStudentPayments.add(cssp);
 							}
 							courseScheduleStudentPayments.addAll(typeCourseStudentPayments);
 							musicGroupPaymentStudentCourseDetailDao.batchUpdate(musicGroupPaymentStudentCourseDetails);
+							//记录排课日志
+							musicGroupPaymentStudentCourseDetailLogService.saveBatch(musicGroupPaymentStudentCourseDetailLogs);
 						}
 					}
 					courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 				}
 			}
 		}
-		if(!CollectionUtils.isEmpty(courseCalenderMap)){
+		if(!courseCalenderMap.isEmpty()){
 			for (Long calenderId : courseCalenderMap.keySet()) {
 				List<Long> courseIds = courseCalenderMap.get(calenderId);
 				operatingReportCloudService.updateSet(calenderId,courseIds);
@@ -482,22 +500,36 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 		}
 	}
 
-	private Boolean calcCourseMinutes(List<MusicGroupPaymentStudentCourseDetail> courseDetails,
+	private void calcCourseMinutes(List<MusicGroupPaymentStudentCourseDetail> courseDetails,
 									  Integer courseDuration,
 									  CourseScheduleStudentPayment studentPayment,
 									  List<MusicGroupPaymentCalender> musicGroupPaymentCalenders,
-									  Map<Long,List<Long>> courseCalenderMap){
+									  Map<Long,List<Long>> courseCalenderMap,
+								      List<MusicGroupPaymentStudentCourseDetailLog> musicGroupPaymentStudentCourseDetailLogs,BigDecimal salary){
 		Boolean result = true;
 		Integer courseMinutes = courseDuration;
 		Map<Long, List<MusicGroupPaymentCalender>> calenderMap = musicGroupPaymentCalenders.stream().collect(Collectors.groupingBy(MusicGroupPaymentCalender::getId));
+		Map<Long, MusicGroupPaymentStudentCourseDetailLog> courseDetailLogMap = musicGroupPaymentStudentCourseDetailLogs.stream().
+				collect(Collectors.toMap(MusicGroupPaymentStudentCourseDetailLog::getMusicGroupPaymentStudentCourseDetailId, a -> a, (k1, k2) -> k1));
 		for (int i = 0; i < courseDetails.size(); i++) {
 			MusicGroupPaymentStudentCourseDetail detail = courseDetails.get(i);
+			MusicGroupPaymentStudentCourseDetailLog detailLog = courseDetailLogMap.get(detail.getId());
 			if(detail.getSubCourseMinutes() > 0){
 				if(!detail.getCloudTeacherPaymentFlag()){
 					result = false;
 				}
+				if (detailLog == null){
+					detailLog = new MusicGroupPaymentStudentCourseDetailLog();
+					detailLog.setMusicGroupPaymentStudentCourseDetailId(detail.getId());
+					musicGroupPaymentStudentCourseDetailLogs.add(detailLog);
+				}
 				if(courseMinutes >= detail.getSubCourseMinutes()){
 					courseMinutes = courseMinutes - detail.getSubCourseMinutes();
+					//记录排课日志
+					detailLog.setCourseNum(detailLog.getCourseNum() + 1);
+					detailLog.setCoursePrice(detailLog.getCoursePrice().add(detail.getSubCourseCurrentPrice()));
+					detailLog.setUsedCourseMinutes(detailLog.getUsedCourseMinutes() + detail.getSubCourseMinutes());
+
 					detail.setUsedCourseMinutes(detail.getUsedCourseMinutes() + detail.getSubCourseMinutes());
 					detail.setSubCourseMinutes(0);
 					studentPayment.setOriginalPrice(studentPayment.getOriginalPrice().add(detail.getSubCourseOriginalPrice()));
@@ -505,6 +537,10 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					detail.setSubCourseCurrentPrice(BigDecimal.ZERO);
 					detail.setSubCourseOriginalPrice(BigDecimal.ZERO);
 				}else{
+					//记录排课日志
+					detailLog.setCourseNum(detailLog.getCourseNum() + 1);
+					detailLog.setUsedCourseMinutes(detailLog.getUsedCourseMinutes() + courseMinutes);
+
 					detail.setUsedCourseMinutes(detail.getUsedCourseMinutes() + courseMinutes);
 					detail.setSubCourseMinutes(detail.getSubCourseMinutes() - courseMinutes);
 					//课程每分钟现价
@@ -515,6 +551,9 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					studentPayment.setOriginalPrice(studentPayment.getOriginalPrice().add(originalPrice));
 					studentPayment.setExpectPrice(studentPayment.getExpectPrice().add(expectPrice));
 					detail.setSubCourseCurrentPrice(detail.getSubCourseCurrentPrice().subtract(expectPrice));
+					//记录排课日志
+					detailLog.setCoursePrice(detailLog.getCoursePrice().add(expectPrice));
+
 					detail.setSubCourseOriginalPrice(detail.getSubCourseOriginalPrice().subtract(originalPrice));
 					courseMinutes = 0;
 				}
@@ -540,14 +579,14 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 //					operatingReportCloudService.updateSet(calender,courseIds);
 				}
 				if(courseMinutes == 0){
-					return result;
+					detailLog.setCourseSalary(salary == null?BigDecimal.ZERO:salary);
+					return;
 				}
 			}
 			if(i == courseDetails.size() - 1 && courseMinutes > 0){
 				throw new BizException("操作失败:学员可排课时长不足");
 			}
 		}
-		return result;
 	}
 
 

+ 35 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -171,8 +171,6 @@ public class ExportServiceImpl implements ExportService {
     @Resource
     private StudentCourseConsumerService studentCourseConsumerService;
     @Resource
-    private StudentTeacherMapperDao studentTeacherMapperDao;
-    @Resource
     private TeacherCloudCourseReportService teacherCloudCourseReportService;
     @Resource
     private OssPluginContext ossPluginContext;
@@ -390,6 +388,9 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL, this::exportBalancedRelationshipStudentQuitDetail);
         exportManageFuncMap.put(ExportEnum.VIDEO_PLAY_STAT, this::exportVideoPlayStat);
         exportManageFuncMap.put(ExportEnum.VIDEO_PLAY_DETAIL_STAT, this::exportVideoPlayDetailStat);
+        exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE, this::exportBalancedRelationshipMusicNoCourse);
+        exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL, this::exportBalancedRelationshipVipSubCourseDetail);
+        exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_SUM, this::exportBalancedRelationshipVipSubCourseSum);
     }
 
     private HttpResponseResult<String> exportVideoPlayStat(Map<String, Object> info) {
@@ -461,7 +462,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         String organIds = organizationService.getEmployeeOrgan(sysUser.getId(), null, sysUser.getIsSuperAdmin() && sysUser.getTenantId() == -1);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_BALANCED_RELATIONSHIP_MUSIC_COURSE,sysUser.getId());
-        return this.asyncExport(() -> this.initExportInfo(exportDao.exportBalancedRelationshipMusicCourse(month,organIds),
+        return this.asyncExport(() -> this.initExportInfo(exportDao.exportBalancedRelationshipMusicCourse1(month,organIds),
                         managerDownload,ExportEnum.EXPORT_BALANCED_RELATIONSHIP_MUSIC_COURSE),
                 managerDownload.getName());
     }
@@ -510,6 +511,7 @@ public class ExportServiceImpl implements ExportService {
                         managerDownload,ExportEnum.EXPORT_BALANCED_RELATIONSHIP_STUDENT_NORMAL_DETAIL),
                 managerDownload.getName());
     }
+
     private HttpResponseResult<String> exportBalancedRelationshipStudentQuitDetail(Map<String, Object> info){
         String month = getParam(info, "month", String.class);
         SysUser sysUser = sysUserService.getUser();
@@ -520,6 +522,36 @@ public class ExportServiceImpl implements ExportService {
                 managerDownload.getName());
     }
 
+    private HttpResponseResult<String> exportBalancedRelationshipMusicNoCourse(Map<String, Object> info){
+        String month = getParam(info, "month", String.class);
+        SysUser sysUser = sysUserService.getUser();
+        String organIds = organizationService.getEmployeeOrgan(sysUser.getId(), null, sysUser.getIsSuperAdmin() && sysUser.getTenantId() == -1);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE,sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(musicGroupService.exportBalancedRelationshipMusicNoCourse(month,organIds),
+                        managerDownload,ExportEnum.EXPORT_BALANCED_RELATIONSHIP_MUSIC_NO_COURSE),
+                managerDownload.getName());
+    }
+
+    private HttpResponseResult<String> exportBalancedRelationshipVipSubCourseDetail(Map<String, Object> info){
+        String month = getParam(info, "month", String.class);
+        SysUser sysUser = sysUserService.getUser();
+        String organIds = organizationService.getEmployeeOrgan(sysUser.getId(), null, sysUser.getIsSuperAdmin() && sysUser.getTenantId() == -1);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL,sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(exportDao.exportBalancedRelationshipVipSubCourseDetail(month,organIds),
+                        managerDownload,ExportEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL),
+                managerDownload.getName());
+    }
+
+    private HttpResponseResult<String> exportBalancedRelationshipVipSubCourseSum(Map<String, Object> info){
+        String month = getParam(info, "month", String.class);
+        SysUser sysUser = sysUserService.getUser();
+//        String organIds = organizationService.getEmployeeOrgan(sysUser.getId(), null, sysUser.getIsSuperAdmin() && sysUser.getTenantId() == -1);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL,sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(exportDao.exportBalancedRelationshipVipSubCourseSum(month),
+                        managerDownload,ExportEnum.EXPORT_BALANCED_RELATIONSHIP_VIP_SUB_COURSE_DETAIL),
+                managerDownload.getName());
+    }
+
     private HttpResponseResult<String> exportOperatingSummaryIncome(Map<String, Object> info) {
         String month = getParam(info, "month", String.class);
         Map<String, Object> params = new HashMap<>(1);

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailLogServiceImpl.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailLogDao;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetailLog;
+import com.ym.mec.biz.service.MusicGroupPaymentStudentCourseDetailLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+
+@Slf4j
+@Service
+public class MusicGroupPaymentStudentCourseDetailLogServiceImpl extends ServiceImpl<MusicGroupPaymentStudentCourseDetailLogDao, MusicGroupPaymentStudentCourseDetailLog> implements MusicGroupPaymentStudentCourseDetailLogService {
+
+
+
+}

+ 13 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java

@@ -1,19 +1,17 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.service.MusicGroupPaymentStudentCourseDetailService;
-import com.ym.mec.biz.service.StudentMusicCourseFeeService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -25,21 +23,19 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.ST
 @Service
 public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentStudentCourseDetail>  implements MusicGroupPaymentStudentCourseDetailService {
 	
-	@Autowired
+	@Resource
 	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
-	@Autowired
+	@Resource
 	private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
-	@Autowired
-	private StudentMusicCourseFeeService studentMusicCourseFeeService;
-	@Autowired
+	@Resource
 	private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-	@Autowired
+	@Resource
 	private MusicGroupDao musicGroupDao;
-	@Autowired
+	@Resource
 	private StudentRegistrationDao studentRegistrationDao;
-	@Autowired
+	@Resource
 	private ChargeTypeSubjectMapperDao chargeTypeSubjectMapperDao;
-	@Autowired
+	@Resource
 	private StudentCourseFeeDetailDao studentCourseFeeDetailDao;
 
 	@Override
@@ -54,7 +50,7 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 							Map<Integer, Long> userCalenderDetailMap) {
 		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(calender.getId());
 		//创建学生课排课分钟数
-		if (courseSettingsList != null && courseSettingsList.size() > 0) {
+		if (CollectionUtils.isNotEmpty(courseSettingsList)) {
 			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
 			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
 			Long calenderId = calender.getId();
@@ -94,7 +90,7 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 //					studentMusicCourseFeeService.addExpectPrice(studentId,musicGroupId,reduce);
 //				}
 			}
-			if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
+			if (CollectionUtils.isNotEmpty(musicGroupPaymentStudentCourseDetailList)) {
 				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
 			}
 		}
@@ -172,7 +168,7 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 				musicGroupPaymentStudentCourseDetail.setCloudTeacherPaymentFlag(cloudTeacherPaymentFlag);
 				musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
 			}
-			if (musicGroupPaymentStudentCourseDetails.size() > 0) {
+			if (CollectionUtils.isNotEmpty(musicGroupPaymentStudentCourseDetails)) {
 				if(musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroup.getCourseViewType() == CourseViewTypeEnum.FREE) {
 					List<StudentPaymentOrderDetail> instrumentDtos = studentPaymentOrderDetailDao.getWithUserAndOrderType(userId, musicGroupId, OrderDetailTypeEnum.MUSICAL);
 					//是否买过乐器
@@ -201,7 +197,7 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 		}
 		BigDecimal remainingAmount = totalAmount;
 		int lastIndex = courseDetails.size() - 1;
-		BigDecimal totalUnitPrice = courseDetails.stream().map(e -> e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal totalUnitPrice = courseDetails.stream().map(MusicGroupPaymentStudentCourseDetail::getCourseOriginalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 
 		// 分摊总金额
 		for (int i = 0; i < lastIndex; i++) {
@@ -250,7 +246,7 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 
     void delByDetails(List<MusicGroupPaymentStudentCourseDetail> courseDetails){
 		if(CollectionUtils.isNotEmpty(courseDetails)){
-			List<Long> courseDetailIds = courseDetails.stream().map(e -> e.getId()).collect(Collectors.toList());
+			List<Long> courseDetailIds = courseDetails.stream().map(MusicGroupPaymentStudentCourseDetail::getId).collect(Collectors.toList());
 			musicGroupPaymentStudentCourseDetailDao.delByIds(courseDetailIds);
 			//汇总学员乐团课费,如果有溢出的乐器费用、云教练费用,也一并汇总,用于计算经营报表
 			/*courseDetails = courseDetails.stream().filter(e -> e.getCourseCurrentPrice().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());

+ 81 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -23,6 +24,7 @@ import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.event.source.GroupEventSource;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -222,6 +224,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private SysMessageConfigDao sysMessageConfigDao;
 
+    @Autowired
+    private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
     private SimpleDateFormat sdf_hms = new SimpleDateFormat("HH:mm:ss");
@@ -4234,7 +4239,82 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		return resultMap;
 	}
 
-	// 辅助方法:创建年级映射
+    @Override
+    public List<ExportWrapper.ExportBalancedRelationshipMusicNoCourse> exportBalancedRelationshipMusicNoCourse(String month, String organIds) {
+		List<ExportWrapper.ExportBalancedRelationshipMusicNoCourse> exportBalancedRelationshipMusicNoCourses = musicGroupDao.exportBalancedRelationshipMusicNoCourse(month, organIds);
+		if(CollectionUtils.isNotEmpty(exportBalancedRelationshipMusicNoCourses)){
+			//计算课酬
+			this.createMusicGroupCourseTeacherSalaries(exportBalancedRelationshipMusicNoCourses);
+		}
+		return exportBalancedRelationshipMusicNoCourses;
+	}
+
+	private void createMusicGroupCourseTeacherSalaries(List<ExportWrapper.ExportBalancedRelationshipMusicNoCourse> noCours) {
+		List<Integer> teacherIds = noCours.stream().map(ExportWrapper.ExportBalancedRelationshipMusicNoCourse::getTeacherId).distinct().collect(Collectors.toList());
+
+		List<TeacherDefaultMusicGroupSalary> allTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
+		Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap =
+				allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
+
+		for (ExportWrapper.ExportBalancedRelationshipMusicNoCourse noCour : noCours) {
+			List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(noCour.getTeacherId());
+			if(CollectionUtils.isEmpty(teacherSalaryList)){
+				continue;
+			}
+
+			BigDecimal salary;
+
+			Map<String, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(e->e.getCourseScheduleType().getCode(), teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+			TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary =
+					collect.get(StringUtils.equals(noCour.getCourseType(),CourseSchedule.CourseScheduleType.HIGH.getCode())? CourseSchedule.CourseScheduleType.HIGH_ONLINE.getCode():noCour.getCourseType());
+
+			if (teacherDefaultMusicGroupSalary == null) {
+				continue;
+			}
+
+			//基准课酬
+			//课程时长与结算单位时长占比
+			BigDecimal classTimeDuty = noCour.getSubCourseMinutes().divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+			BigDecimal baseSalary = teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary();
+			if(Objects.isNull(baseSalary)){
+				continue;
+			}
+
+			salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+			//课堂课课酬
+			if (StringUtils.equals(noCour.getCourseType(),CourseSchedule.CourseScheduleType.CLASSROOM.getCode())) {
+				salary = teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary();
+			}
+			//基础技能提高课
+			if (StringUtils.equals(noCour.getCourseType(),CourseSchedule.CourseScheduleType.HIGH_ONLINE.getCode()) || StringUtils.equals(noCour.getCourseType(),CourseSchedule.CourseScheduleType.HIGH.getCode())) {
+
+				if(StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())){
+					continue;
+				}
+
+				int studentNum = noCour.getStudentNum();
+				if(studentNum <= 0){
+					return;
+				}
+				if(studentNum>5){
+					studentNum=5;
+				}
+				salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum+"");
+			}
+
+			if (StringUtils.equals(noCour.getCourseType(),CourseSchedule.CourseScheduleType.MUSIC_NETWORK.getCode())) {
+				salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+			}
+
+			if(Objects.isNull(salary)){
+				throw new BizException("课酬设置异常");
+			}
+			noCour.setTotalCourseSalary(salary);
+		}
+	}
+
+    // 辅助方法:创建年级映射
 	private static Map<String, String> createGradeMap() {
 		Map<String, String> gradeMap = new HashMap<>();
 		gradeMap.put("1", "一年级");

+ 107 - 0
mec-biz/src/main/resources/config/mybatis/ExportMapper.xml

@@ -2,6 +2,53 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
 <mapper namespace="com.ym.mec.biz.dal.dao.ExportDao">
+    <select id="exportBalancedRelationshipMusicCourse1"
+            resultType="com.ym.mec.biz.dal.dto.ExportWrapper$ExportBalancedRelationshipMusicCourse">
+        select o.name_ organName,mg.name_ musicGroupName,mg.id_ musicGroupId,cg.name_ className,mm.class_group_id_ classId,
+               CASE WHEN cg.type_ = 'NORMAL' THEN '声部班'
+                    WHEN cg.type_ = 'MIX' THEN '合奏班'
+                    WHEN cg.type_ = 'HIGH' THEN '基础技能班'
+                    WHEN cg.type_ = 'VIP' THEN 'vip课'
+                    WHEN cg.type_ = 'DEMO' THEN '试听课'
+                    WHEN cg.type_ = 'PRACTICE' THEN '网管课'
+                    WHEN cg.type_ = 'SNAP' THEN '临时班'
+                    WHEN cg.type_ = 'COMM' THEN '对外课程'
+                    WHEN cg.type_ = 'HIGH_ONLINE' THEN '线上基础技能班'
+                    WHEN cg.type_ = 'MUSIC_NETWORK' THEN '乐团网管课'
+                    WHEN cg.type_ = 'LIVE' THEN '直播课' END classType,
+               CASE WHEN mm.course_type_ = 'SINGLE' THEN '声部课'
+                    WHEN mm.course_type_ = 'MIX' THEN '合奏课'
+                    WHEN mm.course_type_ = 'HIGH' THEN '基础技能课'
+                    WHEN mm.course_type_ = 'VIP' THEN 'vip课'
+                    WHEN mm.course_type_ = 'DEMO' THEN '试听课'
+                    WHEN mm.course_type_ = 'COMPREHENSIVE' THEN '综合课'
+                    WHEN mm.course_type_ = 'PRACTICE' THEN '网管课'
+                    WHEN mm.course_type_ = 'ENLIGHTENMENT' THEN '启蒙课'
+                    WHEN mm.course_type_ = 'TRAINING_SINGLE' THEN '集训声部课'
+                    WHEN mm.course_type_ = 'TRAINING_MIX' THEN '集训合奏课'
+                    WHEN mm.course_type_ = 'CLASSROOM' THEN '课堂课'
+                    WHEN mm.course_type_ = 'COMM' THEN '对外课程'
+                    WHEN mm.course_type_ = 'HIGH_ONLINE' THEN '线上基础技能课'
+                    WHEN mm.course_type_ = 'MUSIC_NETWORK' THEN '乐团网管课'
+                    WHEN mm.course_type_ = 'LIVE' THEN '直播课' END courseType,
+               first_month_pre_amount_ firstMonthPreAmount, first_month_sub_course_num_ firstMonthSubCourseNum,
+               first_month_course_salary_ firstMonthCourseSalary, first_month_pre_merge_amount_ firstMonthPreMergeAmount, first_month_sub_merge_course_num_ firstMonthSubMergeCourseNum,
+               first_month_merge_course_salary_ firstMonthMergeCourseSalary, current_month_add_course_amount_ currentMonthAddCourseAmount, current_month_add_course_num_ currentMonthAdd,
+               current_month_add_course_salary_ currentMonthAddReward, current_month_add_merge_course_amount_ currentMonthAddMergeCourseAmount, current_month_add_merge_course_num_ currentMonthMergedAdd,
+               current_month_add_merge_course_salary_ currentMonthMergedAddReward, current_month_consume_course_num_ currentMonthConsume, current_month_course_salary_ currentMonthConsumeReward,
+               current_month_course_amount_ currentMonthCourseAmount, current_month_consume_merge_course_num_ currentMonthMergedConsume, current_month_merge_course_salary_ currentMonthMergedConsumeReward,
+               current_month_merge_course_amount_ currentMonthMergeCourseAmount, last_month_pre_amount_ lastMonthPreAmount, last_month_sub_course_num_ lastMonthSubCourseNum, last_month_course_salary_ lastMonthCourseSalary,
+               last_month_pre_merge_amount_ lastMonthPreMergeAmount, last_month_sub_merge_course_num_ lastMonthSubMergeCourseNum, last_month_merge_course_salary_ lastMonthMergeCourseSalary
+        from month_music_class_report_statis mm
+                 left join class_group cg ON cg.id_ = mm.class_group_id_
+                 left join music_group mg ON mg.id_ = cg.music_group_id_
+                 left join organization o ON o.id_ = mg.organ_id_
+        where mm.month_ = #{month}
+        <if test="organIds != null and organIds != ''">
+            AND FIND_IN_SET(mg.organ_id_,#{organIds})
+        </if>
+        order by mg.organ_id_,cg.id_,mm.course_type_
+    </select>
     <select id="exportBalancedRelationshipMusicCourse"
             resultType="com.ym.mec.biz.dal.dto.ExportWrapper$ExportBalancedRelationshipMusicCourse">
         select o.name_ organName,mg.name_ musicGroupName,mg.id_ musicGroupId,cg.name_ className,
@@ -228,6 +275,66 @@
         <include refid="hasStudentMusicTheoryCourseInfo"/>
         LIMIT 1
     </select>
+    <select id="exportBalancedRelationshipVipSubCourseDetail"
+            resultType="com.ym.mec.biz.dal.dto.ExportWrapper$ExportBalancedRelationshipVipSubCourseDetail">
+        select sbi.organ_name_ organName,sbi.cooperation_organ_name_ coopName,sbi.user_id_ userId,sbi.user_name_ username,
+               vgc.name_ courseType,
+               first_month_pre_no_course_amount_ AS firstMonthPreNoCourseAmount,
+               first_month_sub_course_num_ AS firstMonthSubCourseNum,
+               first_month_sub_no_course_num_ AS firstMonthSubNoCourseNum,
+               first_month_course_salary_ AS firstMonthCourseSalary,
+               first_month_no_course_salary_ AS firstMonthNoCourseSalary,
+               current_month_actual_amount_ AS currentMonthActualAmount,
+               current_month_balance_amount_ AS currentMonthBalanceAmount,
+               current_month_add_course_num_ AS currentMonthAddCourseNum,
+               current_month_add_course_salary_ AS currentMonthAddCourseSalary,
+               current_month_add_no_course_salary_ AS currentMonthAddNoCourseSalary,
+               current_month_consume_course_num_ AS currentMonthConsumeCourseNum,
+               current_month_course_salary_ AS currentMonthCourseSalary,
+               current_month_course_amount_ AS currentMonthCourseAmount,
+               last_month_pre_course_amount_ AS lastMonthPreCourseAmount,
+               last_month_pre_no_course_amount_ AS lastMonthPreNoCourseAmount,
+               last_month_sub_course_num_ AS lastMonthSubCourseNum,
+               last_month_sub_no_course_num_ AS lastMonthSubNoCourseNum,
+               last_month_course_salary_ AS lastMonthCourseSalary,
+               last_month_no_course_salary_ AS lastMonthNoCourseSalary
+        from month_vip_report_statis mv
+                 left join student_basic_info sbi ON sbi.user_id_ = mv.user_id_
+                 left join vip_group_category vgc ON vgc.id_ = mv.course_type_
+        where mv.month_ = #{month}
+        <if test="organIds != null and organIds.size > 0">
+            AND sbi.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        order by sbi.organ_id_,sbi.user_id_,mv.course_type_
+    </select>
+    <select id="exportBalancedRelationshipVipSubCourseSum"
+            resultType="com.ym.mec.biz.dal.dto.ExportWrapper$ExportBalancedRelationshipVipSubCourseDetail">
+        select
+            SUM(mv.first_month_pre_no_course_amount_) AS firstMonthPreNoCourseAmount,
+            SUM(mv.first_month_sub_course_num_) AS firstMonthSubCourseNum,
+            SUM(mv.first_month_sub_no_course_num_) AS firstMonthSubNoCourseNum,
+            SUM(mv.first_month_course_salary_) AS firstMonthCourseSalary,
+            SUM(mv.first_month_no_course_salary_) AS firstMonthNoCourseSalary,
+            SUM(mv.current_month_actual_amount_) AS currentMonthActualAmount,
+            SUM(mv.current_month_balance_amount_) AS currentMonthBalanceAmount,
+            SUM(mv.current_month_add_course_num_) AS currentMonthAddCourseNum,
+            SUM(mv.current_month_add_course_salary_) AS currentMonthAddCourseSalary,
+            SUM(mv.current_month_add_no_course_salary_) AS currentMonthAddNoCourseSalary,
+            SUM(mv.current_month_consume_course_num_) AS currentMonthConsumeCourseNum,
+            SUM(mv.current_month_course_salary_) AS currentMonthCourseSalary,
+            SUM(mv.current_month_course_amount_) AS currentMonthCourseAmount,
+            SUM(mv.last_month_pre_course_amount_) AS lastMonthPreCourseAmount,
+            SUM(mv.last_month_pre_no_course_amount_) AS lastMonthPreNoCourseAmount,
+            SUM(mv.last_month_sub_course_num_) AS lastMonthSubCourseNum,
+            SUM(mv.last_month_sub_no_course_num_) AS lastMonthSubNoCourseNum,
+            SUM(mv.last_month_course_salary_) AS lastMonthCourseSalary,
+            SUM(mv.last_month_no_course_salary_) AS lastMonthNoCourseSalary
+        from month_vip_report_statis mv
+        where mv.month_ = #{month}
+    </select>
     <sql id="hasStudentMusicTheoryCourseInfo">
         <where>
             cssp.`group_type_` = 'VIP' AND cs.`del_flag_` != 1 AND cs.`is_lock_` != 1

+ 26 - 1
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -1331,6 +1331,31 @@
         select distinct ig.id_ from music_group mg
                              left join class_group cg ON cg.music_group_id_ = mg.id_
                              left join im_group ig ON ig.id_ = cg.id_
-        where mg.status_ IN ('CANCELED','CLOSE') and cg.group_type_ = 'MUSIC';
+        where mg.status_ IN ('CANCELED','CLOSE') and cg.group_type_ = 'MUSIC'
+    </select>
+    <select id="exportBalancedRelationshipMusicNoCourse"
+            resultType="com.ym.mec.biz.dal.dto.ExportWrapper$ExportBalancedRelationshipMusicNoCourse">
+        select o.name_ organName,mg.name_ musicGroupName,cgtm.user_id_,cgsm.class_group_id_ classId,
+               mgpscd.music_group_id_ musicGroupId,cg.name_ className,cg.type_ classType,cgtm.user_id_ teacherId,
+               mgpscd.course_type_ courseType,SUM(mgpscd.sub_course_current_price_) totalCoursePrice,
+               SUM(mgpscd.sub_course_minutes_) subCourseMinutes,COUNT(DISTINCT cgsm.user_id_) studentNum
+        from music_group_payment_student_course_detail mgpscd
+                 left join class_group_student_mapper cgsm ON cgsm.music_group_id_ = mgpscd.music_group_id_ and cgsm.user_id_ = mgpscd.user_id_ AND cgsm.status_ = 'NORMAL'
+                 left join class_group cg ON cg.id_ = cgsm.class_group_id_
+                 left join music_group mg ON mg.id_ = cg.music_group_id
+                 left join organization o ON o.id_ = mg.organ_id__
+                 left join class_group_teacher_mapper cgtm ON cgtm.class_group_id_ = cg.id_ AND cgtm.teacher_role_ = 'BISHOP'
+        where mgpscd.sub_course_current_price_ > 0 AND mgpscd.sub_course_minutes_ > 0
+          AND (cg.type_ = mgpscd.course_type_ OR
+                   (cg.type_ = 'NORMAL' AND mgpscd.course_type_ IN ('SINGLE','TRAINING_SINGLE')) OR
+                   (cg.type_ = 'MIX' AND mgpscd.course_type_ IN ('MIX','TRAINING_MIX')) OR cg.type_ = 'SNAP')
+        <if test="organIds != null and organIds.size > 0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        group by mg.organ_id_,cgsm.class_group_id_,mgpscd.course_type_
+        order by mg.organ_id_,cgsm.class_group_id_,mgpscd.course_type_
     </select>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailLogMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ym.mec.biz.dal.dao.InstrumentDao">
+
+
+</mapper>