瀏覽代碼

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 5 年之前
父節點
當前提交
486e4abd19
共有 20 個文件被更改,包括 875 次插入513 次删除
  1. 15 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  3. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountDetailDao.java
  4. 198 189
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  5. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  6. 63 42
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  7. 27 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  8. 31 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  9. 361 231
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  10. 37 12
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  11. 6 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  12. 2 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml
  13. 10 0
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml
  14. 16 8
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  15. 10 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  16. 18 0
      mec-task/src/main/java/com/ym/mec/task/jobs/StudentHomeworkRemaindTask.java
  17. 18 0
      mec-task/src/main/java/com/ym/mec/task/jobs/TeacherCoursesScheduleRemaindTask.java
  18. 18 0
      mec-task/src/main/java/com/ym/mec/task/jobs/TeacherSignInRemaindTask.java
  19. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  20. 17 4
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 15 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -438,16 +438,28 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 	List<CourseSchedule> findByDateZone(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
 
 	/**
-	 * 查询用户明天的课程数
+	 * 查询学生明天的课程数
 	 * @return
 	 */
 	List<Mapper> queryStudentCoursesTimesOfTomorrow();
 
 	/**
-	 * 查询90分钟内未上的课程
+	 * 查询学生90分钟内未上的课程
 	 * @return
 	 */
-	List<Mapper> queryNotStartCourseScheduleIn90Mins();
+	List<Mapper> queryStudentNotStartCourseScheduleIn90Mins();
+	
+	/**
+	 * 查询老师明天的课程数
+	 * @return
+	 */
+	List<Mapper> queryTeacherCoursesTimesOfTomorrow();
+
+	/**
+	 * 查询老师30分钟内未上的课程
+	 * @return
+	 */
+	List<Mapper> queryTeacherNotStartCourseScheduleIn30Mins();
 
 	/**
 	 * @describe 获取课程编号和与之对应教师编号列表

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -7,7 +7,6 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -124,4 +123,13 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @return
 	 */
     List<CourseScheduleTeachersDto> queryTeacherSalary(Integer courseScheduleId);
+
+    /**
+     * @describe 根据课程获取课程相关的老师课酬记录
+     * @author Joburgess
+     * @date 2019/11/3
+     * @param courseScheduleIds: 课程编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    List<CourseScheduleTeacherSalary> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 }

+ 14 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountDetailDao.java

@@ -2,8 +2,21 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysUserCashAccountDetailDao extends BaseDAO<Long, SysUserCashAccountDetail> {
 
     SysUserCashAccountDetail selectDetailByTransNo(String transNo);
-}
+
+    /**
+     * @describe 批量插入
+     * @author Joburgess
+     * @date 2019/11/4
+     * @param sysUserCashAccountDetails: 现金账户明细
+     * @return int
+     */
+    int batchInsert(@Param("sysUserCashAccountDetails") List<SysUserCashAccountDetail> sysUserCashAccountDetails);
+
+}

+ 198 - 189
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -19,170 +19,169 @@ import java.util.Map;
 
 public interface CourseScheduleService extends BaseService<Long, CourseSchedule> {
 
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/10
-     * 根据课程ID获取当前课程的信息
-     */
-    TeacherAttendanceDto getCurrentCourseDetail(Long courseID);
-
-    /**
-     * @describe 根据课程编号删除课程计划及对应的学生缴费、教师课酬记录
-     * @author Joburgess
-     * @date 2019/10/31
-     * @param courseScheduleIds:
-     * @return int
-     */
-    void deleteCourseSchedules(List<Long> courseScheduleIds);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/10/16
-     * @params [teacherAttendanceDto, userId]
-     * @return YesOrNoEnum
-     * @describe 判断该课程是否只能进行正常签到
-     */
-    YesOrNoEnum enableOnlyNormalAttendance(TeacherAttendanceDto teacherAttendanceDto, Long userId);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 批量插入课程计划
-     */
-    void batchAddCourseSchedule(List<CourseSchedule> courseSchedules);
-
-    /**
-     * @describe 创建乐团课课程计划
-     * @author Joburgess
-     * @date 2019/10/24
-     * @param courseSchedules: 课程计划列表
-     * @return void
-     */
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/10
+	 * 根据课程ID获取当前课程的信息
+	 */
+	TeacherAttendanceDto getCurrentCourseDetail(Long courseID);
+
+	/**
+	 * @describe 根据课程编号删除课程计划及对应的学生缴费、教师课酬记录
+	 * @author Joburgess
+	 * @date 2019/10/31
+	 * @param courseScheduleIds:
+	 * @return int
+	 */
+	void deleteCourseSchedules(List<Long> courseScheduleIds);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/16
+	 * @params [teacherAttendanceDto, userId]
+	 * @return YesOrNoEnum
+	 * @describe 判断该课程是否只能进行正常签到
+	 */
+	YesOrNoEnum enableOnlyNormalAttendance(TeacherAttendanceDto teacherAttendanceDto, Long userId);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 批量插入课程计划
+	 */
+	void batchAddCourseSchedule(List<CourseSchedule> courseSchedules);
+
+	/**
+	 * @describe 创建乐团课课程计划
+	 * @author Joburgess
+	 * @date 2019/10/24
+	 * @param courseSchedules: 课程计划列表
+	 * @return void
+	 */
 	void createCourseSchedules(List<CourseSchedule> courseSchedules);
 
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 批量更新课程计划
-     */
-    void batchUpdateCourseSchedule(List<CourseSchedule> courseSchedules,Long musicGroupID);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据日期获取当日排课信息
-     */
-    List<CourseScheduleDto> getCourseSchedulesWithDate(Date classDate);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据日期获取当日排课信息
-     */
-    Map getStudentCourseSchedulesWithDate(Date classDate);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据日期获取当日排课信息
-     */
-    List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId,Date classDate,String type);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据日期获取当日排课信息
-     */
-    PageInfo getCourseSchedulesWithDateByEdu(CourseScheduleQueryInfo queryInfo);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据月份获取乐团在该月有课的日期
-     */
-    List<Date> getCourseScheduleDateByMonth(Long musicGroupID, Date month);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 根据学生获取乐团在该月有课的日期
-     */
-    List<Date> getCourseScheduleDateByStudent(Date month, Integer isAttend);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/17
-     * 获取教师在该月有课的日期
-     */
-    List<Date> getCourseScheduleDateByTeacher(Date month,String type);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/10/11
-     * @params [month]
-     * @return java.util.List<java.util.Date>
-     * @describe 获取
-     */
-    List<Date> getCourseScheduleDates(Date month);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/23
-     * 课时调整
-     */
-    void classStartDateAdjust(List<CourseSchedule> newCourseSchedules);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/24
-     * 课程交换
-     */
-    void courseSwap(Long courseScheduleId1,Long courseScheduleId2);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/10/14
-     * @params [day1, day2]
-     * @return void
-     * @describe 对调两天的课程
-     */
-    void courseSwapWithDay(Date day1,Date day2);
-
-    /**
-     * @describe 检测数据库不存在的课程是否存在错误
-     * @author Joburgess
-     * @date 2019/10/31
-     * @param courseSchedules: 课程列表
-     * @return void
-     */
-    void checkNewCourseSchedules(List<CourseSchedule> courseSchedules);
-
-    /**
-     * 获取班级未开始的课程计划
-     *
-     * @param classGroupTeacherMapperList
-     * @return
-     */
-    List<CourseSchedule> findClassGroupNoStartCourseSchedules(List<ClassGroupTeacherMapper> classGroupTeacherMapperList);
-
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/9/30
-     * 获取学生上课记录
-     */
-    Object findStudentCourseScheduleRecords(StudentCourseScheduleRecordQueryInfo queryInfo);
-
-    /**
-     * @Author: Joburgess
-     * @Date: 2019/10/3
-     * @params [courseScheduleComplaints]
-     * @return void
-     * @describe 课程投诉
-     */
-    void courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints);
-
-    /**
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 批量更新课程计划
+	 */
+	void batchUpdateCourseSchedule(List<CourseSchedule> courseSchedules, Long musicGroupID);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据日期获取当日排课信息
+	 */
+	List<CourseScheduleDto> getCourseSchedulesWithDate(Date classDate);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据日期获取当日排课信息
+	 */
+	Map getStudentCourseSchedulesWithDate(Date classDate);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据日期获取当日排课信息
+	 */
+	List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId, Date classDate, String type);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据日期获取当日排课信息
+	 */
+	PageInfo getCourseSchedulesWithDateByEdu(CourseScheduleQueryInfo queryInfo);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据月份获取乐团在该月有课的日期
+	 */
+	List<Date> getCourseScheduleDateByMonth(Long musicGroupID, Date month);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 根据学生获取乐团在该月有课的日期
+	 */
+	List<Date> getCourseScheduleDateByStudent(Date month, Integer isAttend);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/17
+	 * 获取教师在该月有课的日期
+	 */
+	List<Date> getCourseScheduleDateByTeacher(Date month, String type);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/11
+	 * @params [month]
+	 * @return java.util.List<java.util.Date>
+	 * @describe 获取
+	 */
+	List<Date> getCourseScheduleDates(Date month);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/23
+	 * 课时调整
+	 */
+	void classStartDateAdjust(List<CourseSchedule> newCourseSchedules);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/24
+	 * 课程交换
+	 */
+	void courseSwap(Long courseScheduleId1, Long courseScheduleId2);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/14
+	 * @params [day1, day2]
+	 * @return void
+	 * @describe 对调两天的课程
+	 */
+	void courseSwapWithDay(Date day1, Date day2);
+
+	/**
+	 * @describe 检测数据库不存在的课程是否存在错误
+	 * @author Joburgess
+	 * @date 2019/10/31
+	 * @param courseSchedules: 课程列表
+	 * @return void
+	 */
+	void checkNewCourseSchedules(List<CourseSchedule> courseSchedules);
+
+	/**
+	 * 获取班级未开始的课程计划
+	 *
+	 * @param classGroupTeacherMapperList
+	 * @return
+	 */
+	List<CourseSchedule> findClassGroupNoStartCourseSchedules(List<ClassGroupTeacherMapper> classGroupTeacherMapperList);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/9/30
+	 * 获取学生上课记录
+	 */
+	Object findStudentCourseScheduleRecords(StudentCourseScheduleRecordQueryInfo queryInfo);
+
+	/**
+	 * @Author: Joburgess
+	 * @Date: 2019/10/3
+	 * @params [courseScheduleComplaints]
+	 * @return void
+	 * @describe 课程投诉
+	 */
+	void courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints);
+
+	/**
 	 * @Author: Joburgess
 	 * @Date: 2019/10/3
 	 * @params [id] 申诉编号
@@ -193,12 +192,12 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @describe 课程投诉审核
 	 */
 	void courseScheduleCommplaintAudit(Long id, Double teacherLiabilityRatio, Double studentLiabilityRatio, AuditStatusEnum status);
-    
-    /**
-     * 更新课程至结束状态
-     * @return
-     */
-    boolean updateCourseScheduleToOverStatus();
+
+	/**
+	 * 更新课程至结束状态
+	 * @return
+	 */
+	boolean updateCourseScheduleToOverStatus();
 
 	/**
 	 * 推送未签到消息提醒
@@ -222,7 +221,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @param courseScheduleId: 课程编号
 	 * @return com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto
 	 */
-    CourseAttendanceDetailHeadInfoDto findCourseAttendanceDetailHeadInfo(Long courseScheduleId);
+	CourseAttendanceDetailHeadInfoDto findCourseAttendanceDetailHeadInfo(Long courseScheduleId);
 
 	/**
 	 * @describe 检测指定乐团下所有班级是否已排课
@@ -240,24 +239,34 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @param courseSchedules:
 	 * @return java.util.Map<java.lang.Integer,java.lang.Integer>
 	 */
-	Map<Integer,Integer> findCourseScheduleCurrentTimes(List<Integer> courseSchedules);
-
-    /**
-     * 查询班级未开始的课程
-     *
-     * @param classGroupId
-     * @return
-     */
-    List<CourseSchedule> findNoStartCoursesByClassGroupId(Integer classGroupId);
-
-    /**
-     * 有课提醒
-     * @return
-     */
-    void studentCoursesScheduleRemind();
-    
-    /**
-     * 上课提醒
-     */
-    void studentSignInRemind();
+	Map<Integer, Integer> findCourseScheduleCurrentTimes(List<Integer> courseSchedules);
+
+	/**
+	 * 查询班级未开始的课程
+	 *
+	 * @param classGroupId
+	 * @return
+	 */
+	List<CourseSchedule> findNoStartCoursesByClassGroupId(Integer classGroupId);
+
+	/**
+	 * 学生有课提醒
+	 * @return
+	 */
+	void studentCoursesScheduleRemind();
+
+	/**
+	 * 学生上课提醒
+	 */
+	void studentSignInRemind();
+
+	/**
+	 * 老师课程提醒
+	 */
+	void teacherCoursesScheduleRemind();
+
+	/**
+	 * 老师上课提醒
+	 */
+	void teacherSignInRemind();
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -92,6 +92,10 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 	/** 乐团课90分钟课酬计算时的收费类型 */
 	String MUSIC_GROUP_CHARGE_TYPE_90_="music_group_charge_type_90_";
 
+	String MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES="music_group_settlement_class_minutes";
+
+	String MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES="music_group_settlement_single_class_minutes";
+
 	/**
 	 * @params paramName
 	 * @return com.ym.mec.biz.dal.entity.SysConfig

+ 63 - 42
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -831,7 +831,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         Integer schoolId = musicGroup.getSchoolId();
@@ -954,20 +954,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-//                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                     }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                    }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1030,7 +1037,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         ClassGroup classgroup = classGroupDao.get(classGroup4MixDto.getClassGroupId());
@@ -1155,20 +1162,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-//                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1235,7 +1249,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         Integer schoolId = musicGroup.getSchoolId();
@@ -1358,20 +1372,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());

+ 27 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -8,10 +8,7 @@ import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -47,6 +44,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private ImFeignService imFeignService;
     @Autowired
     private ClassGroupService classGroupService;
+    @Autowired
+    private MusicGroupService musicGroupService;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -104,7 +103,11 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<ClassGroupTeacherSalary> classGroupTeacherSalaryList = new ArrayList<>();
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
 
+        String musicGroupId = classGroupTeacherMapperList.get(0).getMusicGroupId();
+        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+
         List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupTeacherMapperList);
+
         for (CourseSchedule classGroupNoStartCourseSchedule : classGroupNoStartCourseSchedules) {
 
             if (!classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE) &&
@@ -122,20 +125,26 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 BigDecimal salary = new BigDecimal("0");
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaryList = classGroupTeacherMapper.getTeacherDefaultMusicGroupSalaryList();
 
-                for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherDefaultMusicGroupSalaryList) {
-                    //对应基准课酬
-//                    BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-//                    //基准课酬
-//                    if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                        salary = new BigDecimal(duration).divide(new BigDecimal(30),8,BigDecimal.ROUND_HALF_UP).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                        break;
-//                    }
-//                    //阶梯课酬
-//                    if (duration >= teacherDefaultMusicGroupSalary.getDurationMin() && duration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                        salary = baseSalary;
-//                        break;
-//                    }
+                Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherDefaultMusicGroupSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroupNoStartCourseSchedule.getType());
+
+                //对应基准课酬
+                BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                //基准课酬
+                if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                    //课程时长与结算单位时长占比
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30));
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 }
+                //阶梯课酬
+                if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                    //课程时长与结算单位时长占比
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                }
+                salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -271,7 +280,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
             //课程时长与结算单位时长占比
             BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
-            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
             teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         }
         return new CourseScheduleTeacherSalary(

+ 31 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -16,6 +16,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -298,7 +299,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 //                    .map(CourseSchedule::getId)
 //                    .collect(Collectors.toList());
 
-        courseScheduleDao.findCourseScheduleIdAndUserIdsMap(new ArrayList<>());
+//        courseScheduleDao.findCourseScheduleIdAndUserIdsMap(new ArrayList<>());
 
 		//将课程计划按照开课时间排序
 		allCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
@@ -861,7 +862,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 	@Override
 	public void studentSignInRemind() {
-		List<Mapper> mapperList = courseScheduleDao.queryNotStartCourseScheduleIn90Mins();
+		List<Mapper> mapperList = courseScheduleDao.queryStudentNotStartCourseScheduleIn90Mins();
 		if(mapperList != null && mapperList.size() > 0){
 			for(Mapper mapper : mapperList){
 				Map<Integer, String> receivers = new HashMap<Integer, String>();
@@ -871,4 +872,32 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 		}
 	}
+
+	@Override
+	public void teacherCoursesScheduleRemind() {
+		List<Mapper> mapperList = courseScheduleDao.queryTeacherCoursesTimesOfTomorrow();
+		for (Mapper mapper : mapperList) {
+			Integer userId = (Integer) mapper.getKey();
+			String teacherName = (String) mapper.getValue();
+
+			Map<Integer, String> receivers = new HashMap<Integer, String>();
+			receivers.put(userId, userId + "");
+
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_HAVE_COURSE_MESSAGE, receivers, null, 0, "", teacherName);
+		}
+	}
+
+	@Override
+	public void teacherSignInRemind() {
+		List<Mapper> mapperList = courseScheduleDao.queryTeacherNotStartCourseScheduleIn30Mins();
+		for (Mapper mapper : mapperList) {
+			Integer userId = (Integer) mapper.getKey();
+			String scheduleName = (String) mapper.getValue();
+
+			Map<Integer, String> receivers = new HashMap<Integer, String>();
+			receivers.put(userId, userId + "");
+
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_ATTEND_CLASS_MESSAGE, receivers, null, 0, "", scheduleName);
+		}
+	}
 }

+ 361 - 231
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,235 +21,364 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
-public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long, CourseScheduleTeacherSalary>  implements CourseScheduleTeacherSalaryService {
-	
-	@Autowired
-	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	@Autowired
-	private VipGroupActivityDao vipGroupActivityDao;
-	@Autowired
-	private CourseScheduleComplaintsDao courseScheduleComplaintsDao;
-	@Autowired
-	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-	@Autowired
-	private SysUserCashAccountService sysUserCashAccountService;
-	@Autowired
-	private VipGroupService vipGroupService;
-	@Autowired
-	private SchoolService schoolService;
-	@Autowired
-	private CourseScheduleDao courseScheduleDao;
-	@Autowired
-	private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
-	
-	@Autowired
-	private SysConfigDao sysConfigDao;
-
-	private static final Logger LOGGER = LoggerFactory
-			.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
-
-	@Override
-	public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
-		return courseScheduleTeacherSalaryDao;
-	}
-
-	@Override
-	public int createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
-													List<CourseSchedule> vipCourseSchedules,
-													BigDecimal onlineTeacherSalary,
-													BigDecimal offlineTeacherSalary) {
-
-		School school = schoolService.get(vipGroup.getTeacherSchoolId());
-		if(Objects.isNull(school)){
-			throw new BizException("未找到该教学点");
-		}
-
-		//获取活动信息
-		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
-
-		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries=new ArrayList<>();
-		Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroupByTeachMode = vipCourseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
-
-		for(TeachModeEnum teachModeEnum:courseScheduleGroupByTeachMode.keySet()){
-			List<CourseSchedule> courseSchedules = courseScheduleGroupByTeachMode.get(teachModeEnum)
-					.stream()
-					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime)).collect(Collectors.toList());
-			for(int i=0;i<courseSchedules.size();i++){
-				//创建教师课程薪水记录
-				CourseScheduleTeacherSalary courseScheduleTeacherSalary=new CourseScheduleTeacherSalary();
-				courseScheduleTeacherSalary.setCourseScheduleId(courseSchedules.get(i).getId());
-				courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
-				courseScheduleTeacherSalary.setUserId(courseSchedules.get(i).getActualTeacherId().intValue());
-				courseScheduleTeacherSalary.setClassGroupId(courseSchedules.get(i).getClassGroupId());
-				courseScheduleTeacherSalary.setSubsidy(school.getSubsidy());
-
-				Map<String,BigDecimal> feeInfo = vipGroupService.countVipGroupPredictFee(vipGroup,
-						courseSchedules.get(i).getActualTeacherId().intValue(),
-						onlineTeacherSalary,
-						offlineTeacherSalary,
-						false,
-						false);
-
-				if(vipGroupActivity.getType()== VipGroupActivityTypeEnum.GIVE_CLASS
-						&&vipGroup.getGiveTeachMode()==teachModeEnum
-						&&i>=Integer.parseInt(vipGroupActivity.getAttribute1())
-						&&"0".equals(vipGroupActivity.getGiveClassPaySalaryFlag())){
-					courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
-				}else {
-					if(teachModeEnum==TeachModeEnum.ONLINE){
-						courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("onlineTeacherSalary"));
-					}else{
-						courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("offlineTeacherSalary"));
-					}
-				}
-				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
-			}
-		}
-		return courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void teacherSalarySettlement() {
-		
-		int days = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.VIP_SETTLEMENT_CYCLE));
-
-		//获取教师未结算课程记录
-		List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(days);
-		if(CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)){
-			LOGGER.info("未获取到未结算课酬记录!");
-			return;
-		}
-		Date now=new Date();
-		//获取未结算课程编号列表
-		List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
-		//获取未结算课程投诉记录
-		List<CourseScheduleComplaints> courseScheduleComplaints = courseScheduleComplaintsDao.findByCourseScheduleIds(courseScheduleIds);
-		//获取未结算课程学生缴费信息
-		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
-
-		//根据课程将投诉信息分组
-		Map<Long, List<CourseScheduleComplaints>> complaintsGroupByCourse = courseScheduleComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getCourseScheduleId));
-		//根据课程将学生缴费信息分组
-		Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
-
-		//需更新教师课程结算记录
-		List<CourseScheduleTeacherSalary> updateTeacherSalarys=new ArrayList<>();
-		//需更新学生课程缴费记录
-		List<CourseScheduleStudentPayment> updateStudentPayments=new ArrayList<>();
-
-		//用户账户自己变动信息列表
-		List<SysUserCashAccountDetail> userCashAccountDetails=new ArrayList<>();
-
-		//处理课酬信息
-		someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
-			//获取当前课程学生缴费记录
-			List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
-			//当前课程缴费学生数量
-			BigDecimal courseStudentNum=new BigDecimal(studentPaymentsWithCourse.size());
-			//教师预计课酬
-			BigDecimal expectSalary=courseScheduleTeacherSalary.getExpectSalary();
-			//当前课程每个学生平均课酬
-			BigDecimal avgSalary=expectSalary.divide(courseStudentNum);
-			//教师当前课程责任总占比,当前课程应得课酬
-			BigDecimal teacherLiabilityAllratio;
-
-			//当前课程学生投诉记录
-			List<CourseScheduleComplaints> courseStudentComplaints=complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
-
-			//如果存在投诉记录,需要扣除相应费用
-			if(Objects.nonNull(courseStudentComplaints)){
-				//获取审批中的投诉
-				List<CourseScheduleComplaints> auditIng = courseStudentComplaints.stream().filter(courseScheduleComplaint -> courseScheduleComplaint.getStatus() == AuditStatusEnum.ING).collect(Collectors.toList());
-				if(!CollectionUtils.isEmpty(auditIng)){
-					//如果当前课程存在未处理的投诉,则不做结算处理
-					return;
-				}
-				//计算教师责任总占比
-				double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(CourseScheduleComplaints::getTeacherLiabilityRatio).sum();
-				teacherLiabilityAllratio=new BigDecimal(teacherLiabilityRatioSum);
-			}else{
-				//如果没有投诉,则教师和学生的责任占比为0
-				teacherLiabilityAllratio=new BigDecimal(0);
-			}
-
-			//教师应扣除费用
-			BigDecimal deductPrice=avgSalary.multiply(teacherLiabilityAllratio);
-			//教师实际课酬
-			BigDecimal actualSalary=expectSalary.subtract(deductPrice).add(courseScheduleTeacherSalary.getSubsidy());
-
-			//更新教师结算信息
-			courseScheduleTeacherSalary.setActualSalary(actualSalary);
-			courseScheduleTeacherSalary.setSettlementTime(now);
-			courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-			updateTeacherSalarys.add(courseScheduleTeacherSalary);
-
-			//生成教师账户资金变动记录
-			sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(),actualSalary);
-			SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
-			SysUserCashAccountDetail teacherCashAccountDetail=new SysUserCashAccountDetail();
-			teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
-			teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-			teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-			teacherCashAccountDetail.setAmount(actualSalary);
-			teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
-			teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
-
-			userCashAccountDetails.add(teacherCashAccountDetail);
-
-			//根据学生进行投诉分组
-			Map<Integer, List<CourseScheduleComplaints>> complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
-
-			//计算学生当前课程应缴费用
-			studentPaymentsWithCourse.forEach(studentPayment -> {
-				//当前课程学生应缴费用
-				BigDecimal studentExpectPrice=studentPayment.getExpectPrice();
-				//当前课程学生责任占比
-				BigDecimal studentLiabilityRatio;
-				List<CourseScheduleComplaints> currentCourseScheduleComplaints = complainsGroupByStudent.get(studentPayment.getUserId());
-				if(CollectionUtils.isEmpty(currentCourseScheduleComplaints)){
-					Double temp=currentCourseScheduleComplaints.get(0).getStudentLiabilityRatio();
-					studentLiabilityRatio=new BigDecimal(temp);
-				}else{
-					studentLiabilityRatio=new BigDecimal(0);
-				}
-
-				//当前课程学生应退费用
-				BigDecimal returnPrice=studentExpectPrice.multiply(studentLiabilityRatio);
-				//当前课程学生实际缴费
-				BigDecimal actualPrice=expectSalary.subtract(returnPrice);
-				//更新学生结算信息
-				studentPayment.setActualPrice(actualPrice);
-				studentPayment.setSettlementTime(now);
-				courseScheduleStudentPaymentDao.update(studentPayment);
-				updateStudentPayments.add(studentPayment);
-
-				//生成学生账户资金变动记录
-				sysUserCashAccountService.updateBalance(studentPayment.getUserId(),returnPrice);
-				SysUserCashAccount studentCashAccount = sysUserCashAccountService.get(studentPayment.getUserId().intValue());
-				SysUserCashAccountDetail studentAccountDetail=new SysUserCashAccountDetail();
-				studentAccountDetail.setUserId(studentPayment.getUserId());
-				studentAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-				studentAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-				studentAccountDetail.setAmount(returnPrice);
-				studentAccountDetail.setBalance(studentCashAccount.getBalance());
-				studentAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
-
-				userCashAccountDetails.add(studentAccountDetail);
-
-			});
-
-		});
-
-	}
-
-	@Override
-	public void musicGroupTeacherSalarySettlement() {
-		Date now=new Date();
-		Date yesterday= DateUtil.addDays1(now,-1);
-		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
-		//获取昨天的课程计划
-		List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(yesterday);
-
-	}
+public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long, CourseScheduleTeacherSalary> implements CourseScheduleTeacherSalaryService {
+
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private VipGroupActivityDao vipGroupActivityDao;
+    @Autowired
+    private CourseScheduleComplaintsDao courseScheduleComplaintsDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private SchoolService schoolService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
+    private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
+    @Autowired
+    private SysConfigService sysConfigDao;
+
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
+
+    @Override
+    public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
+        return courseScheduleTeacherSalaryDao;
+    }
+
+    @Override
+    public int createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
+                                                    List<CourseSchedule> vipCourseSchedules,
+                                                    BigDecimal onlineTeacherSalary,
+                                                    BigDecimal offlineTeacherSalary) {
+
+        School school = schoolService.get(vipGroup.getTeacherSchoolId());
+        if (Objects.isNull(school)) {
+            throw new BizException("未找到该教学点");
+        }
+
+        //获取活动信息
+        VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroupByTeachMode = vipCourseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
+
+        for (TeachModeEnum teachModeEnum : courseScheduleGroupByTeachMode.keySet()) {
+            List<CourseSchedule> courseSchedules = courseScheduleGroupByTeachMode.get(teachModeEnum)
+                    .stream()
+                    .sorted(Comparator.comparing(CourseSchedule::getStartClassTime)).collect(Collectors.toList());
+            for (int i = 0; i < courseSchedules.size(); i++) {
+                //创建教师课程薪水记录
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setCourseScheduleId(courseSchedules.get(i).getId());
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+                courseScheduleTeacherSalary.setUserId(courseSchedules.get(i).getActualTeacherId().intValue());
+                courseScheduleTeacherSalary.setClassGroupId(courseSchedules.get(i).getClassGroupId());
+                courseScheduleTeacherSalary.setSubsidy(school.getSubsidy());
+
+                Map<String, BigDecimal> feeInfo = vipGroupService.countVipGroupPredictFee(vipGroup,
+                        courseSchedules.get(i).getActualTeacherId().intValue(),
+                        onlineTeacherSalary,
+                        offlineTeacherSalary,
+                        false,
+                        false);
+
+                if (vipGroupActivity.getType() == VipGroupActivityTypeEnum.GIVE_CLASS
+                        && vipGroup.getGiveTeachMode() == teachModeEnum
+                        && i >= Integer.parseInt(vipGroupActivity.getAttribute1())
+                        && "0".equals(vipGroupActivity.getGiveClassPaySalaryFlag())) {
+                    courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
+                } else {
+                    if (teachModeEnum == TeachModeEnum.ONLINE) {
+                        courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("onlineTeacherSalary"));
+                    } else {
+                        courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("offlineTeacherSalary"));
+                    }
+                }
+                courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+            }
+        }
+        return courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void teacherSalarySettlement() {
+
+        int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_SETTLEMENT_CYCLE).getParanValue());
+
+        //获取教师未结算课程记录
+        List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(days);
+        if (CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
+            LOGGER.info("未获取到未结算课酬记录!");
+            return;
+        }
+        Date now = new Date();
+        //获取未结算课程编号列表
+        List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
+        //获取未结算课程投诉记录
+        List<CourseScheduleComplaints> courseScheduleComplaints = courseScheduleComplaintsDao.findByCourseScheduleIds(courseScheduleIds);
+        //获取未结算课程学生缴费信息
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
+
+        //根据课程将投诉信息分组
+        Map<Long, List<CourseScheduleComplaints>> complaintsGroupByCourse = courseScheduleComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getCourseScheduleId));
+        //根据课程将学生缴费信息分组
+        Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
+
+        //需更新教师课程结算记录
+        List<CourseScheduleTeacherSalary> updateTeacherSalarys = new ArrayList<>();
+        //需更新学生课程缴费记录
+        List<CourseScheduleStudentPayment> updateStudentPayments = new ArrayList<>();
+
+        //用户账户自己变动信息列表
+        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+
+        //处理课酬信息
+        someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+            //获取当前课程学生缴费记录
+            List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            //当前课程缴费学生数量
+            BigDecimal courseStudentNum = new BigDecimal(studentPaymentsWithCourse.size());
+            //教师预计课酬
+            BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+            //当前课程每个学生平均课酬
+            BigDecimal avgSalary = expectSalary.divide(courseStudentNum);
+            //教师当前课程责任总占比,当前课程应得课酬
+            BigDecimal teacherLiabilityAllratio;
+
+            //当前课程学生投诉记录
+            List<CourseScheduleComplaints> courseStudentComplaints = complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
+
+            //如果存在投诉记录,需要扣除相应费用
+            if (Objects.nonNull(courseStudentComplaints)) {
+                //获取审批中的投诉
+                List<CourseScheduleComplaints> auditIng = courseStudentComplaints.stream().filter(courseScheduleComplaint -> courseScheduleComplaint.getStatus() == AuditStatusEnum.ING).collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(auditIng)) {
+                    //如果当前课程存在未处理的投诉,则不做结算处理
+                    return;
+                }
+                //计算教师责任总占比
+                double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(CourseScheduleComplaints::getTeacherLiabilityRatio).sum();
+                teacherLiabilityAllratio = new BigDecimal(teacherLiabilityRatioSum);
+            } else {
+                //如果没有投诉,则教师和学生的责任占比为0
+                teacherLiabilityAllratio = new BigDecimal(0);
+            }
+
+            //教师应扣除费用
+            BigDecimal deductPrice = avgSalary.multiply(teacherLiabilityAllratio);
+            //教师实际课酬
+            BigDecimal actualSalary = expectSalary.subtract(deductPrice).add(courseScheduleTeacherSalary.getSubsidy());
+
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setActualSalary(actualSalary);
+            courseScheduleTeacherSalary.setSettlementTime(now);
+            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+            updateTeacherSalarys.add(courseScheduleTeacherSalary);
+
+            //生成教师账户资金变动记录
+            sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(), actualSalary);
+            SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
+            SysUserCashAccountDetail teacherCashAccountDetail = new SysUserCashAccountDetail();
+            teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
+            teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+            teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            teacherCashAccountDetail.setAmount(actualSalary);
+            teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
+            teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+
+            userCashAccountDetails.add(teacherCashAccountDetail);
+
+            //根据学生进行投诉分组
+            Map<Integer, List<CourseScheduleComplaints>> complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
+
+            //计算学生当前课程应缴费用
+            studentPaymentsWithCourse.forEach(studentPayment -> {
+                //当前课程学生应缴费用
+                BigDecimal studentExpectPrice = studentPayment.getExpectPrice();
+                //当前课程学生责任占比
+                BigDecimal studentLiabilityRatio;
+                List<CourseScheduleComplaints> currentCourseScheduleComplaints = complainsGroupByStudent.get(studentPayment.getUserId());
+                if (CollectionUtils.isEmpty(currentCourseScheduleComplaints)) {
+                    Double temp = currentCourseScheduleComplaints.get(0).getStudentLiabilityRatio();
+                    studentLiabilityRatio = new BigDecimal(temp);
+                } else {
+                    studentLiabilityRatio = new BigDecimal(0);
+                }
+
+                //当前课程学生应退费用
+                BigDecimal returnPrice = studentExpectPrice.multiply(studentLiabilityRatio);
+                //当前课程学生实际缴费
+                BigDecimal actualPrice = expectSalary.subtract(returnPrice);
+                //更新学生结算信息
+                studentPayment.setActualPrice(actualPrice);
+                studentPayment.setSettlementTime(now);
+                courseScheduleStudentPaymentDao.update(studentPayment);
+                updateStudentPayments.add(studentPayment);
+
+                //生成学生账户资金变动记录
+                sysUserCashAccountService.updateBalance(studentPayment.getUserId(), returnPrice);
+                SysUserCashAccount studentCashAccount = sysUserCashAccountService.get(studentPayment.getUserId().intValue());
+                SysUserCashAccountDetail studentAccountDetail = new SysUserCashAccountDetail();
+                studentAccountDetail.setUserId(studentPayment.getUserId());
+                studentAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+                studentAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+                studentAccountDetail.setAmount(returnPrice);
+                studentAccountDetail.setBalance(studentCashAccount.getBalance());
+                studentAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+
+                userCashAccountDetails.add(studentAccountDetail);
+
+            });
+
+        });
+        sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void musicGroupTeacherSalarySettlement() {
+        Date now = new Date();
+        Date yesterday = DateUtil.addDays1(now, -1);
+        Integer settlementClassMinutes = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES).getParanValue());
+        Integer singleClassTime = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES).getParanValue());
+        //获取昨天的课程计划
+        List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(yesterday);
+        //课程编号列表
+        List<Long> courseScheduleIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+        //获取课程对应教学点补贴
+        List<Map<Integer, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertMybatisMap(courseSubsidyByCourses);
+
+        //课程编号与课程对应集合
+        Map<Long, CourseSchedule> courseScheduleIdMap = yesterdayCourseSchedules.stream()
+                .collect(Collectors.toMap(CourseSchedule::getId, courseSchedule -> courseSchedule));
+
+        //课程教师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+
+        //课程对应乐团结算方式集合
+        List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
+        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
+
+        //教师对应课程列表集合
+        Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalarysByTeacher = courseScheduleTeacherSalaries.stream()
+                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
+
+        //所有老师编号
+        List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
+                .map(CourseScheduleTeacherSalary::getUserId)
+                .collect(Collectors.toList());
+
+        //所有老师默认乐团课酬
+        List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(allTeacherIds);
+        Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
+
+
+        //教师对应的每个教学点的总课时
+        Map<Integer, Map<Integer, Integer>> teacherClassMinutesMap = new HashMap<>();
+        //计算老师对应的总课时
+        teacherSalarysByTeacher.forEach((teacherId, teacherSalarys) -> {
+            //当前老师所在课程的编号列表
+            List<Long> currentTeacherCourscheduleIds = teacherSalarys.stream()
+                    .map(CourseScheduleTeacherSalary::getCourseScheduleId)
+                    .collect(Collectors.toList());
+            //当前老师的课程列表
+            List<CourseSchedule> currentTeacherCourseSchedules = yesterdayCourseSchedules.stream()
+                    .filter(courseSchedule -> currentTeacherCourscheduleIds.contains(courseSchedule.getId()))
+                    .collect(Collectors.toList());
+            //根据教学点将当前老师的课程分组
+            Map<Integer, List<CourseSchedule>> schoolCourseSchedules = currentTeacherCourseSchedules.stream()
+                    .collect(Collectors.groupingBy(CourseSchedule::getSchoolId));
+            Map<Integer, Integer> schoolClassMinutesMap = new HashMap<>();
+            for (Integer schoolId : schoolCourseSchedules.keySet()) {
+                Integer classMinutes = 0;
+                //当前教学点的课程
+                List<CourseSchedule> currentSchoolCourseSchedules = schoolCourseSchedules.get(schoolId);
+                for (CourseSchedule courseSchedule : currentSchoolCourseSchedules) {
+                    //如果课程为单机课或者为合奏课,则算入总课时长
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
+                            || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                        classMinutes += DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+                    }
+                }
+                schoolClassMinutesMap.put(schoolId, classMinutes);
+            }
+            teacherClassMinutesMap.put(teacherId, schoolClassMinutesMap);
+        });
+        //用户账户自己变动信息列表
+        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+        //计算课酬
+        courseScheduleTeacherSalaries.forEach(courseScheduleTeacherSalary -> {
+            //当前课酬对应的课程信息
+            CourseSchedule courseSchedule = courseScheduleIdMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            Map<Integer, Integer> schoolClassMinutesMap = teacherClassMinutesMap.get(courseScheduleTeacherSalary.getUserId());
+            Integer schoolClassMinutes = schoolClassMinutesMap.get(courseSchedule.getSchoolId());
+            //当前课程的时长
+            int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+            //如果是单技课或者合奏课
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
+                    || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                if (schoolClassMinutes >= settlementClassMinutes && duration < singleClassTime) {
+                    duration = singleClassTime;
+                }
+            }
+            //根据课程类型获取对应的默认课酬设置列表
+            List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
+            if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
+                throw new BizException("存在未指定结算方式的课程类型");
+            }
+
+            //根据教师编号将对应结算方式下的默认课酬设置分组
+            Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId,teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId=teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
+
+            //教师课酬
+            BigDecimal teacherSalary = new BigDecimal(0);
+
+            String settlementType=musicGroupSettlementsMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            //如果结算方式是教师默认课酬
+            if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30));
+                BigDecimal teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
+                BigDecimal teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getSchoolId());
+            teacherSalary=teacherSalary.add(subsidy);
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
+            courseScheduleTeacherSalary.setSettlementTime(now);
+            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+
+            //生成教师账户资金变动记录
+            sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(), teacherSalary);
+            SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
+            SysUserCashAccountDetail teacherCashAccountDetail = new SysUserCashAccountDetail();
+            teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
+            teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+            teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            teacherCashAccountDetail.setAmount(teacherSalary);
+            teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
+            teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+            userCashAccountDetails.add(teacherCashAccountDetail);
+
+        });
+        sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
+    }
 }

+ 37 - 12
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -326,8 +326,8 @@
             cs.status_,
             cs.subsidy_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
             cs.teacher_id_,
             csts.user_id_ actual_teacher_id_,
             cs.create_time_,
@@ -527,8 +527,8 @@
             cs.status_,
             cs.subsidy_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
             cs.teacher_id_,
             csts.user_id_ actual_teacher_id_,
             cs.create_time_,
@@ -674,8 +674,8 @@
         cs.id_ course_schedule_id_,
         cs.name_,
         cs.class_date_,
-        cs.start_class_time_,
-        cs.end_class_time_,
+        CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+        CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         cs.teacher_id_,
         cs.teach_mode_
         FROM
@@ -702,8 +702,8 @@
         cs.id_ course_schedule_id_,
         cs.name_,
         cs.class_date_,
-        cs.start_class_time_,
-        cs.end_class_time_,
+        CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+        CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         cs.teach_mode_,
         (cg.total_class_times_-cg.current_class_times_) rest_of_class_
         FROM
@@ -1045,8 +1045,8 @@
             cg.student_num_ total_student_num_,
             cs.leave_student_num_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         FROM
             course_schedule cs
             LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_ AND csts.teacher_role_='BISHOP'
@@ -1099,9 +1099,17 @@
     	select cssp.user_id_ key_,count(1) value_ from course_schedule cs right join course_schedule_student_payment cssp on cs.id_ = cssp.course_schedule_id_ where class_date_ = date(DATE_ADD(now(),INTERVAL 1 DAY)) group by cssp.user_id_
     </select>
     
-    <select id="queryNotStartCourseScheduleIn90Mins" resultMap="Mapper">
+    <select id="queryStudentNotStartCourseScheduleIn90Mins" resultMap="Mapper">
     	select cssp.user_id_ key_,cs.name_ value_ from course_schedule cs right join course_schedule_student_payment cssp on cs.id_ = cssp.course_schedule_id_ where CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) &lt; DATE_ADD(now(),INTERVAL 90 MINUTE) and cs.status_ = 'NOT_START'
     </select>
+    
+    <select id="queryTeacherCoursesTimesOfTomorrow" resultMap="Mapper">
+    	select csts.user_id_ key_,u.real_name_ value_ from course_schedule cs right join course_schedule_teacher_salary csts on cs.id_ = csts.course_schedule_id_ left join sys_user u on csts.user_id_ = u.id_ where class_date_ = date(DATE_ADD(now(),INTERVAL 1 DAY)) group by csts.user_id_
+    </select>
+    
+    <select id="queryTeacherNotStartCourseScheduleIn30Mins" resultMap="Mapper">
+    	select csts.user_id_ key_,cs.name_ value_ from course_schedule cs right join course_schedule_teacher_salary csts on cs.id_ = csts.course_schedule_id_ where CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) &lt; DATE_ADD(now(),INTERVAL 30 MINUTE) and cs.status_ = 'NOT_START'
+    </select>
 
     <resultMap id="IntegerAndIntegerListDto" type="com.ym.mec.biz.dal.dto.IntegerAndIntegerListDto">
         <result property="id" column="id_"/>
@@ -1133,9 +1141,26 @@
     </select>
     <select id="findCourseScheduleWithDate" resultMap="CourseSchedule">
         SELECT
-            cs.*
+            cs.id_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.subsidy_,
+            cs.class_date_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.teacher_id_,
+            csts.actual_teacher_id_,
+            cs.create_time_,
+            cs.update_time_,
+            cs.teach_mode_,
+            cs.type_,
+            cs.name_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.schoole_id_
         FROM
             course_schedule cs
         WHERE cs.class_date_=DATE_FORMAT(#{date},'%Y-%m-%d %H:%i:%s')
+        AND cs.type_!='VIP'
     </select>
 </mapper>

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

@@ -232,6 +232,12 @@
 		LEFT JOIN sys_user su ON su.id_ = csts.user_id_
 		WHERE csts.course_schedule_id_ = #{courseScheduleId}
 	</select>
+	<select id="findByCourseSchedules" resultMap="CourseScheduleTeacherSalary">
+		SELECT * FROM  course_schedule_teacher_salary WHERE course_schedule_id_ IN
+		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+			#{courseScheduleId}
+		</foreach>
+	</select>
 
 	<update id="batchUpdateWages" parameterType="map">
 		UPDATE course_schedule_teacher_salary set

+ 2 - 1
mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml

@@ -101,7 +101,8 @@
         <collection property="goodsList" resultMap="com.ym.mec.biz.dal.dao.GoodsDao.Goods" columnPrefix="g_" />
     </resultMap>
     <select id="findGoodsGroup" resultMap="findGoodsGroupMap">
-        SELECT mgs.*, g.id_ g_id_,g.name_ g_name_,g.image_ g_image_,g.brief_ g_brief_, g.group_purchase_price_ g_group_purchase_price_,g.market_price_ g_market_price_,g.complement_goods_id_list_
+        SELECT mgs.*, g.id_ g_id_,g.name_ g_name_,g.image_ g_image_,g.brief_ g_brief_, g.group_purchase_price_ g_group_purchase_price_,
+        g.specification_ g_specification_,g.brand_ g_brand,g.desc_ g_desc, g.market_price_ g_market_price_,g.complement_goods_id_list_
         g_complement_goods_id_list_
         FROM music_group_subject_goods_group mgs,goods g
         WHERE FIND_IN_SET (g.id_ ,mgs.goods_id_list_)

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml

@@ -45,6 +45,16 @@
         VALUES(#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},#{comment},now(),now(),#{attribute})
     </insert>
 
+    <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountDetail" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO sys_user_cash_account_detail
+        (user_id_,trans_no_,type_,amount_,balance_,description_,comment_,create_time_,update_time_,attribute1_)
+        VALUE
+        <foreach collection="sysUserCashAccountDetails" item="sysUserCashAccountDetail" separator=",">
+            (#{sysUserCashAccountDetail.userId},#{sysUserCashAccountDetail.transNo},#{sysUserCashAccountDetail.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{sysUserCashAccountDetail.amount},#{sysUserCashAccountDetail.balance},#{sysUserCashAccountDetail.description},#{sysUserCashAccountDetail.comment},now(),now(),#{sysUserCashAccountDetail.attribute})
+        </foreach>
+    </insert>
+
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountDetail">
         UPDATE sys_user_cash_account_detail

+ 16 - 8
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -14,31 +14,39 @@ public interface TaskRemoteService {
 
 	@GetMapping(value = "task/vipGroupAwardedMonthlyRewards")
 	public void vipGroupAwardedMonthlyRewards();
-	
+
 	@GetMapping(value = "task/updateCourseScheduleToOverStatus")
-    boolean updateCourseScheduleToOverStatus();
-	
+	boolean updateCourseScheduleToOverStatus();
+
 	@GetMapping("task/pushNoSignInMessage")
 	// 推送未签到消息提醒
 	public void pushNoSignInMessage();
-	
+
 	@GetMapping("task/pushNoSignOutMessage")
 	// 推送未签退消息提醒
 	public void pushNoSignOutMessage();
-	
+
 	@GetMapping("task/vipGroupTeacherSalarySettlement")
 	// vip课课酬结算
 	public void vipGroupTeacherSalarySettlement();
-	
+
 	@GetMapping("task/studentCoursesScheduleRemind")
 	// 学生有课提醒
 	public void studentCoursesScheduleRemind();
-	
+
 	@GetMapping("task/studentSignInRemind")
 	// 学生上课提醒
 	public void studentSignInRemind();
-	
+
 	@GetMapping("task/studentHomeworkRemind")
 	// 学生作业提醒
 	public void studentHomeworkRemind();
+
+	@GetMapping("task/teacherCoursesScheduleRemind")
+	// 老师有课提醒
+	public void teacherCoursesScheduleRemind();
+
+	@GetMapping("task/teacherSignInRemind")
+	// 老师上课提醒
+	public void teacherSignInRemind();
 }

+ 10 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -57,4 +57,14 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 		logger.info("学生作业提醒的服务调用失败");
 	}
 
+	@Override
+	public void teacherCoursesScheduleRemind() {
+		logger.info("老师有课提醒的服务调用失败");
+	}
+
+	@Override
+	public void teacherSignInRemind() {
+		logger.info("老师上课提醒的服务调用失败");
+	}
+
 }

+ 18 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/StudentHomeworkRemaindTask.java

@@ -0,0 +1,18 @@
+package com.ym.mec.task.jobs;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+
+public class StudentHomeworkRemaindTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.studentHomeworkRemind();
+	}
+}

+ 18 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/TeacherCoursesScheduleRemaindTask.java

@@ -0,0 +1,18 @@
+package com.ym.mec.task.jobs;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+
+public class TeacherCoursesScheduleRemaindTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.teacherCoursesScheduleRemind();
+	}
+}

+ 18 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/TeacherSignInRemaindTask.java

@@ -0,0 +1,18 @@
+package com.ym.mec.task.jobs;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+
+public class TeacherSignInRemaindTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.teacherSignInRemind();
+	}
+}

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -209,7 +209,7 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "调整班级(临时调整)")
     @PostMapping("/revisionClassGroup")
     @PreAuthorize("@pcs.hasPermissions('classGroup/revisionClassGroup')")
-    @ApiImplicitParams({@ApiImplicitParam(name = "classGroupIds", value = "添加班级结构", required = true, dataType = "String")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "ClassGroup4MixDto", value = "添加班级结构", required = true, dataType = "String")})
     public HttpResponseResult revisionClassGroup(@RequestBody ClassGroup4MixDto classGroup4MixDto) throws Exception {
         return succeed(classGroupService.classGroupSnap(classGroup4MixDto));
     }

+ 17 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -25,16 +25,16 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private CourseScheduleService courseScheduleService;
-	
+
 	@Autowired
 	private TeacherAttendanceService teacherAttendanceService;
-	
+
 	@Autowired
 	private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
-	
+
 	@Autowired
 	private StudentCourseHomeworkService studentCourseHomeworkService;
-	
+
 	@GetMapping("/refreshPaymentFeeStatus")
 	// 刷新付费状态
 	public void refreshPaymentFeeStatus() {
@@ -88,4 +88,17 @@ public class TaskController extends BaseController {
 	public void studentHomeworkRemind() {
 		studentCourseHomeworkService.homeworkRemind();
 	}
+
+	@GetMapping("/teacherCoursesScheduleRemind")
+	// 老师有课提醒
+	public void teacherCoursesScheduleRemind() {
+		courseScheduleService.teacherCoursesScheduleRemind();
+	}
+
+	@GetMapping("/teacherSignInRemind")
+	// 老师上课提醒
+	public void teacherSignInRemind() {
+		courseScheduleService.teacherSignInRemind();
+	}
+
 }