|
@@ -30,6 +30,7 @@ import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
@@ -43,12 +44,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
@Autowired
|
|
|
private VipGroupActivityDao vipGroupActivityDao;
|
|
|
@Autowired
|
|
|
- private CourseScheduleComplaintsDao courseScheduleComplaintsDao;
|
|
|
- @Autowired
|
|
|
private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
|
|
|
@Autowired
|
|
|
- private SysUserCashAccountService sysUserCashAccountService;
|
|
|
- @Autowired
|
|
|
@Lazy
|
|
|
private VipGroupService vipGroupService;
|
|
|
@Autowired
|
|
@@ -58,8 +55,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
@Autowired
|
|
|
private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
|
|
|
@Autowired
|
|
|
- private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
|
|
|
- @Autowired
|
|
|
private SysConfigService sysConfigDao;
|
|
|
@Autowired
|
|
|
private TeacherAttendanceDao teacherAttendanceDao;
|
|
@@ -70,14 +65,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
@Autowired
|
|
|
private ClassGroupStudentMapperDao classGroupStudentMapperDao;
|
|
|
@Autowired
|
|
|
- private ClassGroupTeacherSalaryDao classGroupTeacherSalaryDao;
|
|
|
- @Autowired
|
|
|
private TeacherDefaultVipGroupSalaryDao teacherDefaultVipGroupSalaryDao;
|
|
|
@Autowired
|
|
|
private CourseScheduleRewardsRulesService courseScheduleRewardsRulesService;
|
|
|
@Autowired
|
|
|
- private VipGroupCategoryDao vipGroupCategoryDao;
|
|
|
- @Autowired
|
|
|
private StudentAttendanceDao studentAttendanceDao;
|
|
|
@Autowired
|
|
|
private TeacherSalaryComplaintsDao teacherSalaryComplaintsDao;
|
|
@@ -91,6 +82,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
private MusicGroupDao musicGroupDao;
|
|
|
@Autowired
|
|
|
private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
|
|
|
+ @Autowired
|
|
|
+ private VipGroupDao vipGroupDao;
|
|
|
|
|
|
private static final Logger LOGGER = LoggerFactory
|
|
|
.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
|
|
@@ -221,7 +214,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(startDate,endDate);
|
|
|
if (!CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
|
|
|
someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
|
|
|
- courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getTeacherActualSalary());
|
|
|
+ courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
|
|
|
courseScheduleTeacherSalary.setSettlementTime(now);
|
|
|
courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
|
|
|
});
|
|
@@ -295,15 +288,38 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void teacherSalarySettlement() {
|
|
|
-// int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_APPEAL_DAYS_RANGE).getParanValue());
|
|
|
-// int days = 0;
|
|
|
- BigDecimal percent = new BigDecimal(10);
|
|
|
Date now = new Date();
|
|
|
Date date = DateUtil.addMonths(now, -1);
|
|
|
String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
|
|
|
|
|
|
- vipGroupService.updateHistoryTeacherSalaryOfOnline(startDate, endDate);
|
|
|
+ // 查询需要修改的课酬记录
|
|
|
+ List<TeacherVipSalaryDto> teacherSalaryList = courseScheduleTeacherSalaryDao.queryOnlineCourseByGroupType(startDate, endDate);
|
|
|
+
|
|
|
+ for (TeacherVipSalaryDto ts : teacherSalaryList) {
|
|
|
+ // 修复兼职老师不管1v?和全职老师1vn的课酬为系统默认课酬(不管线上还是线下课)
|
|
|
+ if (ts.getTeacherJobNature() != JobNatureEnum.FULL_TIME || !org.apache.commons.lang3.StringUtils.equalsIgnoreCase("1v1", ts.getVipGroupCategoryName())) {
|
|
|
+ // 查询默认课酬
|
|
|
+ TeacherDefaultVipGroupSalary tdvs = teacherDefaultVipGroupSalaryDao.findByTeacherAndCategory(ts.getUserId(), ts.getVipGroupCategoryId());
|
|
|
+ if (tdvs != null) {
|
|
|
+ if (ts.getTeachMode() == TeachModeEnum.ONLINE) {
|
|
|
+ ts.setExpectSalary(tdvs.getOfflineClassesSalary());
|
|
|
+ } else {
|
|
|
+ ts.setExpectSalary(tdvs.getOfflineClassesSalary());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //按照活动重新计算课酬
|
|
|
+ VipGroup vipGroup = vipGroupService.get(Long.valueOf(ts.getMusicGroupId()));
|
|
|
+ Map<String, BigDecimal> teachModeSalaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, ts.getUserId(), null, null);
|
|
|
+ if(TeachModeEnum.ONLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("onlineTeacherSalary")){
|
|
|
+ ts.setExpectSalary(teachModeSalaryMap.get("onlineTeacherSalary"));
|
|
|
+ }else if(TeachModeEnum.OFFLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("offlineTeacherSalary")){
|
|
|
+ ts.setExpectSalary(teachModeSalaryMap.get("offlineTeacherSalary"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ courseScheduleTeacherSalaryDao.update(ts);
|
|
|
+ }
|
|
|
|
|
|
//获取教师未结算课程记录
|
|
|
List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(startDate,endDate);
|
|
@@ -314,31 +330,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
//获取未结算课程编号列表
|
|
|
List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
|
|
|
|
|
|
- //所有课程的学生考勤记录
|
|
|
-// List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
|
|
|
-// Map<Long, List<StudentAttendance>> courseStudentAttendancesMap = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
|
|
|
-
|
|
|
- //所有课程的教师考勤记录
|
|
|
-// List<TeacherAttendance> teacherAttendancesByCourseSchedule = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
|
|
|
-// Map<Long, List<TeacherAttendance>> courseTeacherAttendancesMap = teacherAttendancesByCourseSchedule.stream().collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
|
|
|
-
|
|
|
- //获取未结算课程投诉记录
|
|
|
- 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 -> {
|
|
@@ -349,160 +348,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
if (CollectionUtils.isEmpty(studentPaymentsWithCourse)) {
|
|
|
return;
|
|
|
}
|
|
|
+ BigDecimal expectSalary = courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
-// List<StudentAttendance> courseStudentAttendances = courseStudentAttendancesMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
|
|
|
-// int normalStudentNum=0;
|
|
|
-// if(CollectionUtils.isEmpty(courseStudentAttendances)){
|
|
|
-// return;
|
|
|
-// }
|
|
|
-// for (StudentAttendance courseStudentAttendance : courseStudentAttendances) {
|
|
|
-// if(Objects.nonNull(courseStudentAttendance.getStatus())&&courseStudentAttendance.getStatus().equals(StudentAttendanceStatusEnum.NORMAL)){
|
|
|
-// normalStudentNum+=1;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// if(normalStudentNum==0){
|
|
|
-// return;
|
|
|
-// }
|
|
|
-
|
|
|
-// List<TeacherAttendance> teacherAttendances = courseTeacherAttendancesMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
|
|
|
-// if(CollectionUtils.isEmpty(teacherAttendances)){
|
|
|
-// return;
|
|
|
-// }
|
|
|
-// int teacherAttendanceNum=0;
|
|
|
-// for (TeacherAttendance teacherAttendance : teacherAttendances) {
|
|
|
-// if(Objects.nonNull(teacherAttendance.getSignInTime())||Objects.nonNull(teacherAttendance.getSignOutTime())){
|
|
|
-// teacherAttendanceNum+=1;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// if(teacherAttendanceNum==0){
|
|
|
-// return;
|
|
|
-// }
|
|
|
-
|
|
|
- //当前课程缴费学生数量
|
|
|
-// BigDecimal courseStudentNum = new BigDecimal(studentPaymentsWithCourse.size());
|
|
|
-
|
|
|
- //教师预计课酬
|
|
|
- BigDecimal expectSalary = courseScheduleTeacherSalary.getTeacherActualSalary();
|
|
|
- //当前课程每个学生平均课酬
|
|
|
-// BigDecimal avgSalary = expectSalary.divide(courseStudentNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
|
|
|
- //教师当前课程责任总占比,当前课程应得课酬
|
|
|
-// 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(courseScheduleComplaint -> Objects.isNull(courseScheduleComplaint.getTeacherLiabilityRatio()) ? 0 : courseScheduleComplaint.getTeacherLiabilityRatio()).sum();
|
|
|
- teacherLiabilityAllratio = new BigDecimal(teacherLiabilityRatioSum).divide(percent,CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN);
|
|
|
- } else {
|
|
|
- //如果没有投诉,则教师和学生的责任占比为0
|
|
|
- teacherLiabilityAllratio = new BigDecimal(0);
|
|
|
- }*/
|
|
|
-
|
|
|
- //教师应扣除费用
|
|
|
- /*BigDecimal deductPrice = avgSalary.multiply(teacherLiabilityAllratio);
|
|
|
- //教师实际课酬
|
|
|
- BigDecimal schoolSubsidy = new BigDecimal(0);
|
|
|
- if (Objects.nonNull(courseScheduleTeacherSalary.getSubsidy())) {
|
|
|
- schoolSubsidy = courseScheduleTeacherSalary.getSubsidy();
|
|
|
- }
|
|
|
- BigDecimal actualSalary = expectSalary.subtract(deductPrice).add(schoolSubsidy);
|
|
|
-
|
|
|
- //更新教师结算信息
|
|
|
- courseScheduleTeacherSalary.setActualSalary(actualSalary);*/
|
|
|
courseScheduleTeacherSalary.setActualSalary(expectSalary);
|
|
|
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.WAGE);
|
|
|
-// teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
|
|
|
-// teacherCashAccountDetail.setAmount(actualSalary);
|
|
|
-// if(Objects.isNull(teacherCashAccount)){
|
|
|
-// teacherCashAccountDetail.setBalance(new BigDecimal(0));
|
|
|
-// }else{
|
|
|
-// teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
|
|
|
-// }
|
|
|
-// teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
|
|
|
-//
|
|
|
-// userCashAccountDetails.add(teacherCashAccountDetail);
|
|
|
-
|
|
|
- //根据学生进行投诉分组
|
|
|
- Map<Integer, List<CourseScheduleComplaints>> complainsGroupByStudent = null;
|
|
|
- if (Objects.nonNull(courseStudentComplaints)) {
|
|
|
- complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
|
|
|
- }
|
|
|
-
|
|
|
-// BigDecimal zero=new BigDecimal(0);
|
|
|
-
|
|
|
- //计算学生当前课程应缴费用
|
|
|
- for (CourseScheduleStudentPayment studentPayment : studentPaymentsWithCourse) {
|
|
|
- //当前课程学生应缴费用
|
|
|
- BigDecimal studentExpectPrice = studentPayment.getExpectPrice();
|
|
|
- if (Objects.isNull(studentExpectPrice)) {
|
|
|
- studentExpectPrice = new BigDecimal(0);
|
|
|
- }
|
|
|
- //当前课程学生责任占比
|
|
|
- BigDecimal studentLiabilityRatio;
|
|
|
- List<CourseScheduleComplaints> currentCourseScheduleComplaints = null;
|
|
|
- if (!CollectionUtils.isEmpty(complainsGroupByStudent)) {
|
|
|
- currentCourseScheduleComplaints = complainsGroupByStudent.get(studentPayment.getUserId());
|
|
|
- }
|
|
|
- if (!CollectionUtils.isEmpty(currentCourseScheduleComplaints)) {
|
|
|
- Double temp = currentCourseScheduleComplaints.get(0).getStudentLiabilityRatio();
|
|
|
- if (Objects.isNull(temp)) {
|
|
|
- temp = 0.0;
|
|
|
- }
|
|
|
- studentLiabilityRatio = new BigDecimal(temp).divide(percent,CommonConstants.DECIMAL_PLACE,BigDecimal.ROUND_DOWN);
|
|
|
- } else {
|
|
|
- studentLiabilityRatio = new BigDecimal(1);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //当前课程学生实际缴费
|
|
|
- BigDecimal actualPrice = studentExpectPrice.multiply(studentLiabilityRatio);
|
|
|
- //当前课程学生应退费用
|
|
|
- BigDecimal returnPrice = studentExpectPrice.subtract(actualPrice);
|
|
|
- //更新学生结算信息
|
|
|
- studentPayment.setActualPrice(actualPrice);
|
|
|
- studentPayment.setSettlementTime(now);
|
|
|
- courseScheduleStudentPaymentDao.update(studentPayment);
|
|
|
- updateStudentPayments.add(studentPayment);
|
|
|
-
|
|
|
-
|
|
|
-// if(returnPrice.compareTo(zero)!=0){
|
|
|
-// //生成学生账户资金变动记录
|
|
|
-// 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);
|
|
|
-// }
|
|
|
- }
|
|
|
-
|
|
|
});
|
|
|
-// if(!CollectionUtils.isEmpty(userCashAccountDetails)){
|
|
|
-// sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
|
|
|
-// }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -555,7 +408,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
Map<Long, Long> courseNormalStudentsMap = new HashMap<>();
|
|
|
if(!CollectionUtils.isEmpty(studentAttendances)){
|
|
|
courseNormalStudentsMap =studentAttendances.stream()
|
|
|
- .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
|
|
|
+// .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
|
|
|
.collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
|
|
|
}
|
|
|
|
|
@@ -671,7 +524,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
|
|
|
|
|
|
}
|
|
|
|
|
|
- BigDecimal finalSalary = teacherSalary.subtract(deductCost);
|
|
|
+ BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
//更新教师结算信息
|
|
|
courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
|