|
@@ -1,5 +1,6 @@
|
|
package com.ym.mec.biz.service.impl;
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.ym.mec.biz.dal.dao.*;
|
|
import com.ym.mec.biz.dal.dao.*;
|
|
import com.ym.mec.biz.dal.dto.*;
|
|
import com.ym.mec.biz.dal.dto.*;
|
|
@@ -18,10 +19,8 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
|
|
import com.ym.mec.util.collection.MapUtil;
|
|
import com.ym.mec.util.collection.MapUtil;
|
|
import com.ym.mec.util.date.DateUtil;
|
|
import com.ym.mec.util.date.DateUtil;
|
|
|
|
|
|
-import org.apache.poi.util.StringUtil;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.context.annotation.Lazy;
|
|
import org.springframework.context.annotation.Lazy;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -31,6 +30,8 @@ import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.StringUtils;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
+import java.time.Duration;
|
|
|
|
+import java.time.LocalDateTime;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -86,6 +87,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
private SysMessageService sysMessageService;
|
|
private SysMessageService sysMessageService;
|
|
@Autowired
|
|
@Autowired
|
|
private TeacherCourseRewardDao teacherCourseRewardDao;
|
|
private TeacherCourseRewardDao teacherCourseRewardDao;
|
|
|
|
+ @Autowired
|
|
|
|
+ private MusicGroupDao musicGroupDao;
|
|
|
|
+ @Autowired
|
|
|
|
+ private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
|
|
|
|
|
|
private static final Logger LOGGER = LoggerFactory
|
|
private static final Logger LOGGER = LoggerFactory
|
|
.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
|
|
.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
|
|
@@ -1096,4 +1101,182 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
teacherSalaryComplaintsDao.updateComplaintStatusTuDoneWithMonth(month);
|
|
teacherSalaryComplaintsDao.updateComplaintStatusTuDoneWithMonth(month);
|
|
teacherCourseRewardDao.updateTeacherRewardConfirmStatusWithMonth(month, null, TeacherSalaryConfirmStatus.COMPLETED);
|
|
teacherCourseRewardDao.updateTeacherRewardConfirmStatusWithMonth(month, null, TeacherSalaryConfirmStatus.COMPLETED);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds) {
|
|
|
|
+ if(Objects.isNull(courseSchedule.getType())){
|
|
|
|
+ throw new BizException("请指定课程类型");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
|
|
|
|
+ Date now = new Date();
|
|
|
|
+ for (Integer teacherId : teacherIds) {
|
|
|
|
+ CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
|
|
|
|
+ courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
|
|
|
|
+ courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
|
|
|
|
+ courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
|
|
|
|
+ courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
|
|
|
|
+ if(teacherId.equals(courseSchedule.getActualTeacherId())){
|
|
|
|
+ courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
|
|
|
|
+ }else{
|
|
|
|
+ courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.TEACHING);
|
|
|
|
+ }
|
|
|
|
+ courseScheduleTeacherSalary.setUserId(teacherId);
|
|
|
|
+ courseScheduleTeacherSalary.setCreateTime(now);
|
|
|
|
+ courseScheduleTeacherSalary.setUpdateTime(now);
|
|
|
|
+ }
|
|
|
|
+ switch (courseSchedule.getGroupType()){
|
|
|
|
+ case MUSIC:
|
|
|
|
+ //生成乐团课课酬
|
|
|
|
+ createMusicGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
+ break;
|
|
|
|
+ case VIP:
|
|
|
|
+ //生成vip课课酬
|
|
|
|
+ createVipGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
+ break;
|
|
|
|
+ case PRACTICE:
|
|
|
|
+ //生成网管课课酬
|
|
|
|
+ createPracticeGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return courseScheduleTeacherSalaries;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @describe 创建课程指定教师的课酬记录-乐团课
|
|
|
|
+ * @author Joburgess
|
|
|
|
+ * @date 2020.10.22
|
|
|
|
+ * @param courseSchedule: 课程计划
|
|
|
|
+ * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
|
|
+ * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
|
|
+ */
|
|
|
|
+ private void createMusicGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
|
|
|
|
+ MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
|
|
|
|
+
|
|
|
|
+ List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ List<Teacher> teachers = teacherDao.findByTeacherIds(teacherIds);
|
|
|
|
+ Map<Integer, Teacher> teacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
|
|
|
|
+
|
|
|
|
+ List<TeacherDefaultMusicGroupSalary> allTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
|
|
|
|
+ Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap = allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
|
|
|
|
+
|
|
|
|
+ Date now = new Date();
|
|
|
|
+ Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
|
|
|
|
+
|
|
|
|
+ long classCourseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
|
|
+
|
|
|
|
+ for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
|
|
+ List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
+
|
|
|
|
+ BigDecimal salary;
|
|
|
|
+
|
|
|
|
+ Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
|
|
|
|
+
|
|
|
|
+ TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
|
|
|
|
+
|
|
|
|
+ Teacher teacher = teacherMap.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
+ if (teacherDefaultMusicGroupSalary == null) {
|
|
|
|
+ throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //对应基准课酬
|
|
|
|
+ BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
|
|
|
|
+
|
|
|
|
+ SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
|
|
|
|
+ if (Objects.nonNull(teacher.getEntryDate())
|
|
|
|
+ && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
|
|
|
|
+ settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //基准课酬
|
|
|
|
+ if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
|
|
|
|
+ //课程时长与结算单位时长占比
|
|
|
|
+ classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
|
+ baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
+ }
|
|
|
|
+ //阶梯课酬
|
|
|
|
+ if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
|
|
|
|
+ //课程时长与结算单位时长占比
|
|
|
|
+ classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
|
+ baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //课堂课课酬改为按分钟数计算,并且时长占比向下取整
|
|
|
|
+ if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
|
|
|
|
+ baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
+ classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+
|
|
|
|
+ //基础技能提高课
|
|
|
|
+ if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
|
|
|
|
+ salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
+ if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
|
|
|
|
+ salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //线上小班课
|
|
|
|
+ if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
|
|
|
|
+ Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
|
|
|
|
+ if (studentNum < 3 || studentNum > 5) {
|
|
|
|
+ String numWaring = studentNum < 3 ? "小班课人数不能小于3," : "小班课人数不能大于5,";
|
|
|
|
+ throw new BizException( numWaring + "请调整");
|
|
|
|
+ }
|
|
|
|
+ salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
|
|
|
|
+ salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
|
|
|
|
+ courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
|
|
|
|
+ courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
|
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(salary);
|
|
|
|
+ courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
|
|
|
|
+ courseScheduleTeacherSalary.setCreateTime(now);
|
|
|
|
+ courseScheduleTeacherSalary.setUpdateTime(now);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @describe 创建课程指定教师的课酬记录-VIP课
|
|
|
|
+ * @author Joburgess
|
|
|
|
+ * @date 2020.10.22
|
|
|
|
+ * @param courseSchedule: 课程计划
|
|
|
|
+ * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
|
|
+ * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
|
|
+ */
|
|
|
|
+ private void createVipGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
|
|
+ VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
|
|
|
|
+ for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
|
|
+ Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, courseSchedule.getActualTeacherId(), null, null);
|
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @describe 创建课程指定教师的课酬记录-网管课
|
|
|
|
+ * @author Joburgess
|
|
|
|
+ * @date 2020.10.22
|
|
|
|
+ * @param courseSchedule: 课程计划
|
|
|
|
+ * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
|
|
+ * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
|
|
+ */
|
|
|
|
+ private void createPracticeGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
|
|
+ List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);
|
|
|
|
+ Map<Integer, List<TeacherDefaultPracticeGroupSalary>> teacherSalaryMap = allTeacherDefaultPracticeGroupSalaryList.stream().collect(Collectors.groupingBy(TeacherDefaultPracticeGroupSalary::getUserId));
|
|
|
|
+ for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
|
|
+ final List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
+ if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
|
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
|
|
|
|
+ } else {
|
|
|
|
+ throw new BizException("请设置老师 的网管课课酬");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|