|
@@ -106,6 +106,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
private MusicGroupService musicGroupService;
|
|
|
@Autowired
|
|
|
private SysConfigService sysConfigService;
|
|
|
+ @Autowired
|
|
|
+ private SchoolDao schoolDao;
|
|
|
|
|
|
@Autowired
|
|
|
private CourseHomeworkService courseHomeworkService;
|
|
@@ -245,84 +247,128 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public boolean batchAddCourseSchedule(Integer classGroupId, int coursesTimes, Date startDate, String teachingArrangement, TeachModeEnum teachMode,
|
|
|
- CourseScheduleType type, Integer schoolId) {
|
|
|
- ClassGroup classGroup = classGroupService.get(classGroupId);
|
|
|
- if(classGroup == null){
|
|
|
- throw new BizException("排课失败,班级信息不存在");
|
|
|
- }
|
|
|
-
|
|
|
- if(teachMode == TeachModeEnum.OFFLINE && schoolId == null){
|
|
|
- throw new BizException("线下课请指定教学点");
|
|
|
- }
|
|
|
-
|
|
|
- if(type == null){
|
|
|
- throw new BizException("请指定课程类型");
|
|
|
- }
|
|
|
-
|
|
|
- if (type == CourseScheduleType.VIP){
|
|
|
- throw new BizException("暂不支持vip课加课");
|
|
|
- }
|
|
|
-
|
|
|
- List<CourseTimeDto> teachingArrangementList = JsonUtil.parseArray(teachingArrangement, CourseTimeDto.class);
|
|
|
- if(teachingArrangementList == null || teachingArrangementList.size() == 0){
|
|
|
- throw new BizException("请设置课时安排");
|
|
|
- }
|
|
|
-
|
|
|
- //查询班级老师信息
|
|
|
- List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
|
|
|
-
|
|
|
- //查询主教老师
|
|
|
- Integer teacherId = null;
|
|
|
- for(ClassGroupTeacherMapper cgtm : classGroupTeacherMapperList){
|
|
|
- if(cgtm.getTeacherRole() == TeachTypeEnum.BISHOP){
|
|
|
- teacherId = cgtm.getUserId();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(teacherId == null){
|
|
|
- throw new BizException("班级缺少主教老师");
|
|
|
- }
|
|
|
-
|
|
|
- //查询老师默认课酬
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean batchAddCourseSchedule(Integer classGroupId, int coursesTimes, Date startDate, List<CourseTimeDto> teachingArrangementList,
|
|
|
+ TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday) {
|
|
|
+ ClassGroup classGroup = classGroupService.get(classGroupId);
|
|
|
+ if (classGroup == null) {
|
|
|
+ throw new BizException("排课失败,班级信息不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (teachMode == TeachModeEnum.OFFLINE && schoolId == null) {
|
|
|
+ throw new BizException("线下课请指定教学点");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (type == null) {
|
|
|
+ throw new BizException("请指定课程类型");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (type == CourseScheduleType.VIP) {
|
|
|
+ throw new BizException("暂不支持vip课加课");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (teachingArrangementList == null || teachingArrangementList.size() == 0) {
|
|
|
+ throw new BizException("请设置课时安排");
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal subSidy = new BigDecimal(0);
|
|
|
+ // 查询教学点补贴
|
|
|
+ if (schoolId != null) {
|
|
|
+ School school = schoolDao.get(schoolId);
|
|
|
+ if (school == null) {
|
|
|
+ throw new BizException("指定的教学点不存在");
|
|
|
+ }
|
|
|
+ subSidy = school.getSubsidy();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询班级老师信息
|
|
|
+ List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
|
|
|
+
|
|
|
+ // 查询主教老师
|
|
|
+ Integer teacherId = null;
|
|
|
+ for (ClassGroupTeacherMapper cgtm : classGroupTeacherMapperList) {
|
|
|
+ if (cgtm.getTeacherRole() == TeachTypeEnum.BISHOP) {
|
|
|
+ teacherId = cgtm.getUserId();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (teacherId == null) {
|
|
|
+ throw new BizException("班级缺少主教老师");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Integer> teacherIdList = classGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 查询老师列表
|
|
|
+ List<Teacher> teacherList = teacherDao.findByTeacherIds(teacherIdList);
|
|
|
+ Map<Integer, Teacher> teacherMap = teacherList.stream().collect(Collectors.toMap(Teacher::getId, t -> t));
|
|
|
+
|
|
|
+ Map<Integer, BigDecimal> teacherPracticeSalaryMap = new HashMap<Integer, BigDecimal>();
|
|
|
+ Map<Integer, TeacherDefaultMusicGroupSalary> teacherMusicSalaryMap = new HashMap<Integer, TeacherDefaultMusicGroupSalary>();
|
|
|
+
|
|
|
+ Date entryDate = null;
|
|
|
+ String settlementType = null;
|
|
|
+
|
|
|
+ // 查询老师默认课酬
|
|
|
if (type == CourseScheduleType.PRACTICE) {
|
|
|
|
|
|
List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
|
|
|
- .queryByUserId(teacherId);
|
|
|
-
|
|
|
+ .queryByUserIdList(teacherIdList);
|
|
|
+
|
|
|
+ teacherPracticeSalaryMap = teacherDefaultPracticeGroupSalaryList.stream().collect(
|
|
|
+ Collectors.toMap(TeacherDefaultPracticeGroupSalary::getUserId, TeacherDefaultPracticeGroupSalary::getMainTeacherSalary));
|
|
|
+
|
|
|
} else {
|
|
|
+ MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
|
|
|
+ if (musicGroup == null) {
|
|
|
+ throw new BizException("找不到乐团信息");
|
|
|
+ }
|
|
|
+ // 乐团结算方式
|
|
|
+ settlementType = musicGroup.getSettlementType().getCode();
|
|
|
+
|
|
|
+ // 老师入职的分界线
|
|
|
+ entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
|
|
|
+
|
|
|
// 所有老师默认乐团课酬
|
|
|
- /*List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(newTeacherIdList);
|
|
|
+ List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIdList);
|
|
|
+
|
|
|
for (TeacherDefaultMusicGroupSalary tdms : teacherDefaultMusicGroupSalaries) {
|
|
|
- Map<CourseScheduleType, TeacherDefaultMusicGroupSalary> map = musicGroupSalaryMap.get(tdms.getUserId());
|
|
|
- if (map == null) {
|
|
|
- map = new HashMap<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary>();
|
|
|
+ if (tdms.getCourseScheduleType() == type) {
|
|
|
+ teacherMusicSalaryMap.put(tdms.getUserId(), tdms);
|
|
|
}
|
|
|
- map.put(tdms.getCourseScheduleType(), tdms);
|
|
|
- musicGroupSalaryMap.put(tdms.getUserId(), map);
|
|
|
- }*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询班级学生信息
|
|
|
+ List<ClassGroupStudentMapper> classGroupStudentMapperList = classGroupStudentMapperDao.findByClassGroup(classGroupId);
|
|
|
+
|
|
|
+ Map<Integer, CourseTimeDto> dayOfWeekMap = teachingArrangementList.stream().collect(Collectors.toMap(CourseTimeDto::getDayOfWeek, ct -> ct));
|
|
|
+
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ Date now = new Date();
|
|
|
+ CourseTimeDto courseTimeDto = null;
|
|
|
+ List<CourseSchedule> courseScheduleList = new ArrayList<CourseSchedule>();
|
|
|
+ List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<CourseScheduleTeacherSalary>();
|
|
|
+ List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
|
|
|
+ List<TeacherAttendance> teacherAttendances = new ArrayList<TeacherAttendance>();
|
|
|
+ Map<String, Integer> holidayDays = new HashMap<>();
|
|
|
+ if (isJumpHoliday) {
|
|
|
+ try {
|
|
|
+ Map<Integer, Map<String, Integer>> holiday = new HashMap<>();
|
|
|
+ holiday = jiaRiFeignService.query(calendar.get(Calendar.YEAR));
|
|
|
+ holidayDays = holiday.get(calendar.get(Calendar.YEAR));
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("获取节假日失败",e);
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- //查询班级学生信息
|
|
|
- List<ClassGroupStudentMapper> classGroupStudentMapperList = classGroupStudentMapperDao.findByClassGroup(classGroupId);
|
|
|
-
|
|
|
- //查询教学点补贴
|
|
|
-
|
|
|
- Map<Integer,CourseTimeDto> dayOfWeekMap = teachingArrangementList.stream().collect(Collectors.toMap(CourseTimeDto :: getDayOfWeek, ct -> ct));
|
|
|
-
|
|
|
- Calendar calendar = Calendar.getInstance();
|
|
|
- Date now = new Date();
|
|
|
- CourseTimeDto courseTimeDto = null;
|
|
|
- List<CourseSchedule> courseScheduleList = new ArrayList<CourseSchedule>();
|
|
|
- List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<CourseScheduleTeacherSalary>();
|
|
|
- List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
|
|
|
- List<TeacherAttendance> teacherAttendances = new ArrayList<TeacherAttendance>();
|
|
|
+ calendar.setTime(startDate);
|
|
|
for (int i = 0; i < coursesTimes; i++) {
|
|
|
while (true) {
|
|
|
- startDate = DateUtil.addDays1(startDate, 1);
|
|
|
- calendar.setTime(startDate);
|
|
|
+ if (holidayDays.containsKey(DateUtil.format(calendar.getTime(), "MMdd"))) {
|
|
|
+ calendar.add(Calendar.DATE, 1);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
// 查询当前日期是周几
|
|
|
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
|
|
|
if (dayOfWeek == 1) {
|
|
@@ -337,7 +383,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
|
|
|
courseSchedule.setClassGroupId(classGroup.getId());
|
|
|
courseSchedule.setStatus(CourseStatusEnum.NOT_START);
|
|
|
- courseSchedule.setClassDate(startDate);
|
|
|
+ courseSchedule.setClassDate(calendar.getTime());
|
|
|
|
|
|
String dateYmdStr = DateUtil.dateToString(calendar.getTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
|
|
|
|
|
@@ -348,11 +394,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
dateYmdStr = dateYmdStr + " " + courseTimeDto.getEndClassTime();
|
|
|
Date courseEndTime = DateUtil.stringToDate(dateYmdStr, "yyyy-MM-dd HH:mm");
|
|
|
courseSchedule.setEndClassTime(courseEndTime);
|
|
|
-
|
|
|
- if(courseEndTime.before(courseStartTime)){
|
|
|
+
|
|
|
+ if (courseEndTime.before(courseStartTime)) {
|
|
|
throw new BizException("课时上课时间安排错误");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
courseSchedule.setTeacherId(teacherId);
|
|
|
courseSchedule.setActualTeacherId(teacherId);
|
|
|
courseSchedule.setCreateTime(now);
|
|
@@ -362,6 +408,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
courseSchedule.setGroupType(classGroup.getGroupType());
|
|
|
courseSchedule.setName(classGroup.getName());
|
|
|
courseSchedule.setSchoolId(schoolId);
|
|
|
+ courseSchedule.setSubsidy(subSidy);
|
|
|
courseScheduleList.add(courseSchedule);
|
|
|
|
|
|
// 课程与老师薪水表
|
|
@@ -372,10 +419,58 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
courseScheduleTeacherSalary.setMusicGroupId(classGroup.getMusicGroupId());
|
|
|
courseScheduleTeacherSalary.setTeacherRole(cgtm.getTeacherRole());
|
|
|
courseScheduleTeacherSalary.setUserId(cgtm.getUserId());
|
|
|
- //courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
|
|
|
+ if (type == CourseScheduleType.PRACTICE) {
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(teacherPracticeSalaryMap.get(cgtm.getUserId()));
|
|
|
+ } else if (type == CourseScheduleType.VIP) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ TeacherDefaultMusicGroupSalary tdms = teacherMusicSalaryMap.get(cgtm.getUserId());
|
|
|
+
|
|
|
+ int newMinutes = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
|
+
|
|
|
+ int unitMinutes = 30;
|
|
|
+
|
|
|
+ // 如果当前教师是在指定日期之后入职的,则按照3.0的方式结算
|
|
|
+ if (type != CourseScheduleType.CLASSROOM) {
|
|
|
+ Teacher teacher = teacherMap.get(teacherId);
|
|
|
+ if (Objects.nonNull(teacher.getEntryDate())
|
|
|
+ && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
|
|
|
+ settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.equals(settlementType, "TEACHER_DEFAULT")) {
|
|
|
+ if (type == CourseScheduleType.CLASSROOM) {
|
|
|
+ unitMinutes = 40;
|
|
|
+ } else if (type == CourseScheduleType.HIGH) {
|
|
|
+ unitMinutes = 45;
|
|
|
+ }
|
|
|
+ if (courseScheduleTeacherSalary.getTeacherRole() == TeachTypeEnum.BISHOP) {
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(tdms.getMainTeacher30MinSalary().doubleValue() * newMinutes
|
|
|
+ / unitMinutes));
|
|
|
+ } else {
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher30MinSalary().doubleValue() * newMinutes
|
|
|
+ / unitMinutes));
|
|
|
+ }
|
|
|
+ } else if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
|
|
|
+ unitMinutes = 90;
|
|
|
+ if (type == CourseScheduleType.CLASSROOM) {
|
|
|
+ unitMinutes = 40;
|
|
|
+ } else if (type == CourseScheduleType.HIGH) {
|
|
|
+ unitMinutes = 45;
|
|
|
+ }
|
|
|
+ if (courseScheduleTeacherSalary.getTeacherRole() == TeachTypeEnum.BISHOP) {
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(tdms.getMainTeacher90MinSalary().doubleValue() * newMinutes
|
|
|
+ / unitMinutes));
|
|
|
+ } else {
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher90MinSalary().doubleValue() * newMinutes
|
|
|
+ / unitMinutes));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
courseScheduleTeacherSalary.setCreateTime(now);
|
|
|
courseScheduleTeacherSalary.setUpdateTime(now);
|
|
|
courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
|
|
|
+ courseScheduleTeacherSalary.setSubsidy(subSidy);
|
|
|
courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
|
|
|
}
|
|
|
|
|
@@ -406,28 +501,33 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ calendar.add(Calendar.DATE, 1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if(courseScheduleList.size() > 0){
|
|
|
+ //检查冲突
|
|
|
+ checkNewCourseSchedules(courseScheduleList, false);
|
|
|
+ createCourseScheduleName(courseScheduleList);
|
|
|
+
|
|
|
+ if (courseScheduleList.size() > 0) {
|
|
|
courseScheduleDao.batchAddCourseSchedules(courseScheduleList);
|
|
|
}
|
|
|
-
|
|
|
- if(courseScheduleTeacherSalaries.size() > 0){
|
|
|
+
|
|
|
+ if (courseScheduleTeacherSalaries.size() > 0) {
|
|
|
courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
|
|
|
}
|
|
|
-
|
|
|
- if(courseScheduleStudentPayments.size() > 0){
|
|
|
+
|
|
|
+ if (courseScheduleStudentPayments.size() > 0) {
|
|
|
courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
|
|
|
}
|
|
|
-
|
|
|
- if(teacherAttendances.size() > 0){
|
|
|
+
|
|
|
+ if (teacherAttendances.size() > 0) {
|
|
|
teacherAttendanceDao.batchInsert(teacherAttendances);
|
|
|
}
|
|
|
-
|
|
|
- //更新班级信息
|
|
|
+
|
|
|
+ // 更新班级信息
|
|
|
classGroupService.updateClassGroupInfo(classGroupId);
|
|
|
-
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|