| 
					
				 | 
			
			
				@@ -1,26 +1,25 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.ym.mec.biz.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.dao.VipGroupActivityDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.dao.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.dto.VipGroupSalarySettlementDto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.entity.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.enums.TeachModeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.enums.TeachTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ym.mec.biz.dal.enums.VipGroupActivityTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.enums.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.service.SysUserCashAccountDetailService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.service.SysUserCashAccountService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.common.dal.BaseDAO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.common.exception.BizException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.common.service.impl.BaseServiceImpl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.util.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.Comparator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Service 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -32,6 +31,17 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private TeacherDefaultVipGroupSalaryDao teacherDefaultVipGroupSalaryDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private VipGroupActivityDao vipGroupActivityDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private CourseScheduleComplaintsDao courseScheduleComplaintsDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SysUserCashAccountService sysUserCashAccountService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SysUserCashAccountDetailService sysUserCashAccountDetailService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final Logger LOGGER = LoggerFactory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.getLogger(CourseScheduleTeacherSalaryServiceImpl.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -107,4 +117,136 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void teacherSalarySettlement() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//获取教师未结算课程记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			LOGGER.info("未获取到未结算课酬记录!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		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,teacherCourseSalary; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//当前课程学生投诉记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//更新教师结算信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |