|
@@ -19,6 +19,7 @@ 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.commons.lang3.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -27,12 +28,8 @@ import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Isolation;
|
|
import org.springframework.transaction.annotation.Isolation;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
-import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
-import java.math.RoundingMode;
|
|
|
|
-import java.time.Duration;
|
|
|
|
-import java.time.LocalDateTime;
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -82,15 +79,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
private MusicGroupDao musicGroupDao;
|
|
private MusicGroupDao musicGroupDao;
|
|
@Autowired
|
|
@Autowired
|
|
private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
|
|
private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
|
|
- @Autowired
|
|
|
|
- private VipGroupDao vipGroupDao;
|
|
|
|
|
|
|
|
private static final Logger LOGGER = LoggerFactory
|
|
private static final Logger LOGGER = LoggerFactory
|
|
.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
|
|
.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
|
|
|
|
|
|
- //按节数计算课酬的课程类型
|
|
|
|
- protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
|
|
public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
|
|
return courseScheduleTeacherSalaryDao;
|
|
return courseScheduleTeacherSalaryDao;
|
|
@@ -204,85 +196,54 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public void practiceTeacherSalarySettlement() {
|
|
public void practiceTeacherSalarySettlement() {
|
|
-// int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_APPEAL_DAYS_RANGE).getParanValue());
|
|
|
|
-// int days = 0;
|
|
|
|
//获取教师未结算课程记录
|
|
//获取教师未结算课程记录
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
Date date = DateUtil.addMonths(now, -1);
|
|
Date date = DateUtil.addMonths(now, -1);
|
|
String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(startDate,endDate);
|
|
List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(startDate,endDate);
|
|
- if (!CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
|
|
|
|
- someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
|
|
|
|
- courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
|
|
|
|
- courseScheduleTeacherSalary.setSettlementTime(now);
|
|
|
|
- courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
|
|
- });
|
|
|
|
|
|
+
|
|
|
|
+ Set<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toSet());
|
|
|
|
+
|
|
|
|
+ //教师签到记录
|
|
|
|
+ List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(new ArrayList<>(courseScheduleIds));
|
|
|
|
+ Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
|
|
|
|
+
|
|
|
|
+ if (CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
- //获取未转结的
|
|
|
|
- List<TeacherCourseReward> teacherCourseRewards = teacherCourseRewardService.findBySettlementStatus(0);
|
|
|
|
- if(teacherCourseRewards.size() > 0){
|
|
|
|
- //逗号分隔的课程拆分
|
|
|
|
- List<String> collect = teacherCourseRewards.stream().map(e -> e.getCourseScheduleIdList()).collect(Collectors.toList());
|
|
|
|
- List<Long> courseScheduleIds = new ArrayList<>();
|
|
|
|
- collect.forEach(e->{
|
|
|
|
- if(!StringUtils.isEmpty(e)){
|
|
|
|
- String[] split = e.split(",");
|
|
|
|
- for (String s : split) {
|
|
|
|
- courseScheduleIds.add(Long.parseLong(s));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- if (courseScheduleIds.size() > 0){
|
|
|
|
- //去掉有未结束课程的数据
|
|
|
|
- List<Long> mapList = courseScheduleDao.findNotStartCourseByIds(courseScheduleIds);
|
|
|
|
- List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
|
|
|
|
- Map<Long, TeacherAttendance> teacherAttendancesMap = teacherAttendances.stream().collect(Collectors.toMap(TeacherAttendance::getCourseScheduleId,t -> t));
|
|
|
|
- String courseScheduleIdList = null;
|
|
|
|
- StringBuffer memo;
|
|
|
|
- BigDecimal multiply;
|
|
|
|
- BigDecimal add;
|
|
|
|
- outer1:for (TeacherCourseReward e : teacherCourseRewards) {
|
|
|
|
- memo = new StringBuffer();
|
|
|
|
- courseScheduleIdList = e.getCourseScheduleIdList();
|
|
|
|
- if(!StringUtils.isEmpty(courseScheduleIdList)){
|
|
|
|
- String[] split = courseScheduleIdList.split(",");
|
|
|
|
- for (String s : split) {
|
|
|
|
- //如果包含未结算的课程,不转结
|
|
|
|
- if(mapList.contains(Long.parseLong(s))){
|
|
|
|
- continue outer1;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //转结,是否正常签到,签退
|
|
|
|
- BigDecimal expectRewardAmount = e.getExpectRewardAmount().divide(new BigDecimal(split.length));
|
|
|
|
- multiply = expectRewardAmount.multiply(new BigDecimal(0.5));
|
|
|
|
- add = expectRewardAmount.multiply(new BigDecimal(0));
|
|
|
|
- for (String s : split) {
|
|
|
|
- //如果包含未结算的课程,不转结
|
|
|
|
- TeacherAttendance teacherAttendance = teacherAttendancesMap.get(Long.parseLong(s));
|
|
|
|
- if(teacherAttendance == null){
|
|
|
|
- throw new BizException("教师签到记录不存在 : courseScheduleId:{}",s);
|
|
|
|
- }
|
|
|
|
- if(teacherAttendance.getSignInStatus() == null || teacherAttendance.getSignInStatus() == YesOrNoEnum.NO){
|
|
|
|
- expectRewardAmount = expectRewardAmount.subtract(multiply);
|
|
|
|
- memo.append("课程").append(s).append("异常签到;");
|
|
|
|
- }
|
|
|
|
- if(teacherAttendance.getSignOutStatus() == null || teacherAttendance.getSignOutStatus() == YesOrNoEnum.NO){
|
|
|
|
- expectRewardAmount = expectRewardAmount.subtract(multiply);
|
|
|
|
- memo.append("课程").append(s).append("异常签退;");
|
|
|
|
- }
|
|
|
|
- add = add.add(expectRewardAmount);
|
|
|
|
- expectRewardAmount = e.getExpectRewardAmount().divide(new BigDecimal(split.length));
|
|
|
|
- }
|
|
|
|
- e.setMemo(memo.toString());
|
|
|
|
- e.setActualRewardAmount(add);
|
|
|
|
- e.setSettlementStatus(YesOrNoEnum.YES);
|
|
|
|
- e.setSettlementDate(now);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- teacherCourseRewardService.batchUpdate(teacherCourseRewards);
|
|
|
|
|
|
+
|
|
|
|
+ someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
|
|
|
|
+
|
|
|
|
+ //扣除费用
|
|
|
|
+ BigDecimal deductCost = new BigDecimal(0);
|
|
|
|
+ List<String> deductReasons = new ArrayList<>();
|
|
|
|
+ List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
|
|
|
|
+
|
|
|
|
+ TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
|
|
|
|
+ if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
|
+ //未签到或异常签到扣除一半课酬
|
|
|
|
+ deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
|
|
|
|
+ deductReasons.add("未签到或异常签到扣除一半课酬");
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
|
+ //未签退或异常签退扣除一半课酬
|
|
|
|
+ deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
|
|
|
|
+ deductReasons.add("未签退或异常签退扣除一半课酬");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
+
|
|
|
|
+ if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
|
+ deductReasons.add("扣除总费用:" + deductCost);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(finalSalary);
|
|
|
|
+ courseScheduleTeacherSalary.setSettlementTime(now);
|
|
|
|
+ courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
|
|
|
|
+ courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -330,31 +291,41 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
//获取未结算课程编号列表
|
|
//获取未结算课程编号列表
|
|
List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
|
|
List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
|
|
|
|
|
|
- //获取未结算课程学生缴费信息
|
|
|
|
- List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
|
|
|
|
-
|
|
|
|
- //根据课程将学生缴费信息分组
|
|
|
|
- Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
|
|
|
|
-
|
|
|
|
- //需更新教师课程结算记录
|
|
|
|
- List<CourseScheduleTeacherSalary> updateTeacherSalarys = new ArrayList<>();
|
|
|
|
|
|
+ //教师签到记录
|
|
|
|
+ List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
|
|
|
|
+ Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
|
|
|
|
|
|
//处理课酬信息
|
|
//处理课酬信息
|
|
someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
|
|
someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
|
|
|
|
|
|
- //获取当前课程学生缴费记录
|
|
|
|
- List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
|
|
|
|
|
|
+ //扣除费用
|
|
|
|
+ BigDecimal deductCost = new BigDecimal(0);
|
|
|
|
+ List<String> deductReasons = new ArrayList<>();
|
|
|
|
+ List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
|
|
|
|
+
|
|
|
|
+ TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
|
|
|
|
+ if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
|
|
|
|
+ //未签到或异常签到扣除一半课酬
|
|
|
|
+ deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
|
|
|
|
+ deductReasons.add("未签到或异常签到扣除一半课酬");
|
|
|
|
+ }
|
|
|
|
|
|
- if (CollectionUtils.isEmpty(studentPaymentsWithCourse)) {
|
|
|
|
- return;
|
|
|
|
|
|
+ if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
|
|
|
|
+ //未签退或异常签退扣除一半课酬
|
|
|
|
+ deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
|
|
|
|
+ deductReasons.add("未签退或异常签退扣除一半课酬");
|
|
}
|
|
}
|
|
- BigDecimal expectSalary = courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
|
|
- courseScheduleTeacherSalary.setActualSalary(expectSalary);
|
|
|
|
|
|
+ if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
|
+ deductReasons.add("扣除总费用:" + deductCost);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
+
|
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(finalSalary);
|
|
|
|
+ courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
- updateTeacherSalarys.add(courseScheduleTeacherSalary);
|
|
|
|
-
|
|
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -412,6 +383,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
.collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
|
|
.collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ //课程对应乐团结算方式集合
|
|
|
|
+ List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
|
|
|
|
+ Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
|
|
|
|
+
|
|
//所有老师编号
|
|
//所有老师编号
|
|
List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
|
|
List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
|
|
.map(CourseScheduleTeacherSalary::getUserId)
|
|
.map(CourseScheduleTeacherSalary::getUserId)
|
|
@@ -456,7 +431,40 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
teacherSalary = BigDecimal.ZERO;
|
|
teacherSalary = BigDecimal.ZERO;
|
|
}
|
|
}
|
|
}else if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
|
|
}else if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
|
|
|
|
+ //根据课程类型获取对应的默认课酬设置列表
|
|
|
|
+ List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
|
|
|
|
+ if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
|
|
|
|
+ LOGGER.error("存在未指定结算方式的课程类型[{}]", courseScheduleTeacherSalary.getId());
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //根据教师编号将对应结算方式下的默认课酬设置分组
|
|
|
|
+ Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
|
|
|
|
+
|
|
|
|
+ TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
+
|
|
|
|
+ Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
|
|
|
|
+ if(Objects.isNull(normalStudentNum)){
|
|
|
|
+ normalStudentNum = Long.valueOf(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //结算方式
|
|
|
|
+ String settlementType = musicGroupSettlementsMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
|
|
|
|
+ if(StringUtils.isEmpty(settlementType)){
|
|
|
|
+ LOGGER.error("未指定课酬结算方式[{}]", courseScheduleTeacherSalary.getId());
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ teacherSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
|
|
|
|
+ if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
|
|
|
|
+ teacherSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if(Objects.isNull(teacherSalary)){
|
|
|
|
+ LOGGER.error("教师课酬设置异常{}", courseSchedule.getId());
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ teacherSalary = teacherSalary.multiply(new BigDecimal(normalStudentNum));
|
|
}else{
|
|
}else{
|
|
teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
|
|
teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
|
|
}
|
|
}
|
|
@@ -519,6 +527,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
|
|
+ if(BigDecimal.ZERO.compareTo(deductCost)<0){
|
|
|
|
+ deductReasons.add("扣除总费用:" + deductCost);
|
|
|
|
+ }
|
|
|
|
+
|
|
//更新教师结算信息
|
|
//更新教师结算信息
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
@@ -865,20 +877,28 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
switch (courseSchedule.getGroupType()){
|
|
switch (courseSchedule.getGroupType()){
|
|
case MUSIC:
|
|
case MUSIC:
|
|
//生成乐团课课酬
|
|
//生成乐团课课酬
|
|
- createMusicGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
|
|
+ createMusicGroupCourseTeacherSalaries(null, courseSchedule, courseScheduleTeacherSalaries);
|
|
break;
|
|
break;
|
|
case VIP:
|
|
case VIP:
|
|
//生成vip课课酬
|
|
//生成vip课课酬
|
|
- createVipGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
|
|
+ createVipGroupCourseTeacherSalaries(courseSchedule, courseScheduleTeacherSalaries);
|
|
break;
|
|
break;
|
|
case PRACTICE:
|
|
case PRACTICE:
|
|
//生成网管课课酬
|
|
//生成网管课课酬
|
|
- createPracticeGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
|
|
|
|
|
|
+ createPracticeGroupCourseTeacherSalaries(courseSchedule, courseScheduleTeacherSalaries);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
return courseScheduleTeacherSalaries;
|
|
return courseScheduleTeacherSalaries;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary) {
|
|
|
|
+ List<CourseScheduleTeacherSalary> teacherSalaries = new ArrayList<>();
|
|
|
|
+ teacherSalaries.add(courseScheduleTeacherSalary);
|
|
|
|
+ createMusicGroupCourseTeacherSalaries(musicGroup,courseSchedule,teacherSalaries);
|
|
|
|
+ courseScheduleTeacherSalary.setExpectSalary(teacherSalaries.get(0).getExpectSalary());
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @describe 创建课程指定教师的课酬记录-乐团课
|
|
* @describe 创建课程指定教师的课酬记录-乐团课
|
|
* @author Joburgess
|
|
* @author Joburgess
|
|
@@ -887,22 +907,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
* @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());
|
|
|
|
|
|
+ private void createMusicGroupCourseTeacherSalaries(MusicGroup musicGroup, CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
|
|
|
|
+ if(Objects.isNull(musicGroup)){
|
|
|
|
+ musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
|
|
|
|
+ }
|
|
|
|
|
|
List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
|
|
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);
|
|
List<TeacherDefaultMusicGroupSalary> allTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
|
|
Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap = allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
|
|
Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap = allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
|
|
|
|
|
|
- Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
|
|
|
|
-
|
|
|
|
long classCourseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
long classCourseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
|
|
|
|
|
|
for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
|
|
+ if(Objects.isNull(courseScheduleTeacherSalary.getTeacherRole())){
|
|
|
|
+ throw new BizException("请指定教师类型");
|
|
|
|
+ }
|
|
List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
|
|
List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
|
|
BigDecimal salary;
|
|
BigDecimal salary;
|
|
@@ -911,8 +931,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
|
|
TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
|
|
|
|
|
|
- Teacher teacher = teacherMap.get(courseScheduleTeacherSalary.getUserId());
|
|
|
|
if (teacherDefaultMusicGroupSalary == null) {
|
|
if (teacherDefaultMusicGroupSalary == null) {
|
|
|
|
+ Teacher teacher = teacherDao.get(courseScheduleTeacherSalary.getUserId());
|
|
throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
|
|
throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
|
|
}
|
|
}
|
|
|
|
|
|
@@ -920,27 +940,23 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
|
|
BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
|
|
|
|
|
|
SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
|
|
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) {
|
|
if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
|
|
//课程时长与结算单位时长占比
|
|
//课程时长与结算单位时长占比
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
- baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
|
|
+ baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
}
|
|
}
|
|
//阶梯课酬
|
|
//阶梯课酬
|
|
if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
|
|
if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
|
|
//课程时长与结算单位时长占比
|
|
//课程时长与结算单位时长占比
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
- baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
|
|
|
|
+ baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
}
|
|
}
|
|
|
|
|
|
//课堂课课酬改为按分钟数计算,并且时长占比向下取整
|
|
//课堂课课酬改为按分钟数计算,并且时长占比向下取整
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
|
|
- baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
|
|
+ baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
|
|
classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -948,17 +964,21 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
//基础技能提高课
|
|
//基础技能提高课
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
|
|
- salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
|
|
|
|
+ salary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
|
|
if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
|
|
if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
|
|
- salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
|
|
|
|
+ salary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
|
|
|
|
+ }
|
|
|
|
+ if(Objects.isNull(salary)){
|
|
|
|
+ throw new BizException("课酬设置异常");
|
|
}
|
|
}
|
|
|
|
+ Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
|
|
|
|
+ salary = salary.multiply(new BigDecimal(studentNum));
|
|
}
|
|
}
|
|
//线上小班课
|
|
//线上小班课
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
|
|
if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
|
|
Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
|
|
Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
|
|
- if (studentNum < 3 || studentNum > 5) {
|
|
|
|
- String numWaring = studentNum < 3 ? "小班课人数不能小于3," : "小班课人数不能大于5,";
|
|
|
|
- throw new BizException( numWaring + "请调整");
|
|
|
|
|
|
+ if(studentNum>5){
|
|
|
|
+ studentNum=5;
|
|
}
|
|
}
|
|
salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
|
|
salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
|
|
}
|
|
}
|
|
@@ -967,6 +987,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
|
|
salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(Objects.isNull(salary)){
|
|
|
|
+ throw new BizException("课酬设置异常");
|
|
|
|
+ }
|
|
|
|
+
|
|
courseScheduleTeacherSalary.setExpectSalary(salary);
|
|
courseScheduleTeacherSalary.setExpectSalary(salary);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -979,10 +1003,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
* @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
*/
|
|
*/
|
|
- private void createVipGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
|
|
|
|
+ private void createVipGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
|
|
VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
|
|
for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
|
|
- Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, courseSchedule.getActualTeacherId(), null, null);
|
|
|
|
|
|
+ Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupCoursePredictFee(vipGroup, courseSchedule.getActualTeacherId(), courseSchedule.getId());
|
|
courseScheduleTeacherSalary.setExpectSalary(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary"));
|
|
courseScheduleTeacherSalary.setExpectSalary(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -995,7 +1019,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
|
|
* @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
* @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
|
|
*/
|
|
*/
|
|
- private void createPracticeGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
|
|
|
|
+ private void createPracticeGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
|
|
List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
|
|
List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
|
|
|
|
|
|
List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);
|
|
List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);
|