Browse Source

Merge remote-tracking branch 'origin/master'

周箭河 5 years ago
parent
commit
90beba2c2a

+ 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);
+
+}

+ 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

+ 60 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -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());
@@ -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());
@@ -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(

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

@@ -298,7 +298,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));

+ 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);
+    }
 }

+ 28 - 11
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'
@@ -1133,9 +1133,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

+ 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