浏览代码

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 4 年之前
父节点
当前提交
8ff5f154a7

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -29,7 +29,7 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      * @param studentIds:
      * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail>
      */
-    List<MusicGroupPaymentStudentCourseDetail> getUnUseWithStudents(@Param("studentIds") List<Integer> studentIds);
+    List<MusicGroupPaymentStudentCourseDetail> getUnUseWithStudents(@Param("musicGroupId") String musicGroupId, @Param("studentIds") List<Integer> studentIds);
 
 	int batchInsert(List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList);
 

+ 23 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -11,7 +11,7 @@ import java.math.BigDecimal;
 /**
  * 对应数据库表(course_schedule_student_payment):
  */
-public class CourseScheduleStudentPayment {
+public class CourseScheduleStudentPayment implements Comparable<CourseScheduleStudentPayment> {
 
 	/**  */
 	private Long id;
@@ -25,6 +25,8 @@ public class CourseScheduleStudentPayment {
 	/**  */
 	private Long courseScheduleId;
 	
+	private CourseSchedule courseSchedule;
+	
 	/**  */
 	private Integer userId;
 
@@ -168,9 +170,29 @@ public class CourseScheduleStudentPayment {
 		this.batchNo = batchNo;
 	}
 
+	public CourseSchedule getCourseSchedule() {
+		return courseSchedule;
+	}
+
+	public void setCourseSchedule(CourseSchedule courseSchedule) {
+		this.courseSchedule = courseSchedule;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
 
+	@Override
+	public int compareTo(CourseScheduleStudentPayment cssp) {
+		if(courseSchedule != null){
+			int r = courseSchedule.getClassDate().compareTo(cssp.getCourseSchedule().getClassDate());
+			if(r == 0){
+				return courseSchedule.getStartClassTime().compareTo(cssp.getCourseSchedule().getStartClassTime());
+			}
+			return r;
+		}
+		return 0;
+	}
+
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java

@@ -28,6 +28,8 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "状态", required = false)
 	private StaffStatusEnum status;
 	
+	private String operator;
+	
 	private Date startDate;
 	
 	private Date endDate;
@@ -95,4 +97,12 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	public void setEndDate(Date endDate) {
 		this.endDate = endDate;
 	}
+
+	public String getOperator() {
+		return operator;
+	}
+
+	public void setOperator(String operator) {
+		this.operator = operator;
+	}
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
@@ -184,7 +185,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param classGroupIdListStr
      * @return
      */
-    boolean addStudentToClassGroupAndCourseArranging(Integer studentId, String classGroupIdListStr);
+    boolean addStudentToClassGroupAndCourseArranging(Integer studentId, String classGroupIdListStr, List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList);
 
     /**
      * 获取未分配合奏的单技班列表

+ 137 - 97
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -24,6 +24,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -82,6 +83,7 @@ import com.ym.mec.biz.dal.entity.ClassGroupRelation;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
@@ -89,6 +91,7 @@ import com.ym.mec.biz.dal.entity.CoursesGroup;
 import com.ym.mec.biz.dal.entity.Group;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.Subject;
@@ -114,16 +117,6 @@ import com.ym.mec.biz.dal.page.StudentPayLogQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherMusicClassQueryInfo;
 import com.ym.mec.biz.dal.page.VipClassQueryInfo;
 import com.ym.mec.biz.dal.page.queryMusicGroupCourseScheduleQueryInfo;
-import com.ym.mec.biz.service.ClassGroupRelationService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.SubjectService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -220,6 +213,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private SysConfigService sysConfigService;
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private MusicGroupPaymentCalenderCourseSettingsService musicGroupPaymentCalenderCourseSettingsService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -1132,89 +1127,99 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-	public boolean addStudentToClassGroupAndCourseArranging(Integer studentId, String classGroupIdListStr) {
-    	
-    	List<ClassGroup> classGroupList = classGroupDao.findClassGroupByIds(classGroupIdListStr);
-    	if(classGroupList == null || classGroupList.size() == 0){
-    		throw new BizException("班级查询失败");
-    	}
-
-        Date date = new Date();
-        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
-        
-    	for(ClassGroup classGroup : classGroupList){
-    		//1、增加班级人数
-    		classGroupDao.addStudentNum(classGroup);
-    		
-    		//2、插入关联关系
-    		ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
-            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
-            classGroupStudentMapper.setClassGroupId(classGroup.getId());
-            classGroupStudentMapper.setUserId(studentId);
-            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
-            classGroupStudentMapper.setGroupType(classGroup.getGroupType());
-            classGroupStudentMapper.setCreateTime(date);
-            classGroupStudentMapperDao.insert(classGroupStudentMapper);
-          
-            //3、学生加入级未开始课程
-            List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroup.getId());
-            for (CourseSchedule courseSchedule : courseScheduleList) {
-                CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
-                courseScheduleStudentPayment.setGroupType(classGroup.getGroupType());
-                courseScheduleStudentPayment.setMusicGroupId(classGroup.getMusicGroupId());
-                courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
-                courseScheduleStudentPayment.setUserId(studentId);
-                courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
-                courseScheduleStudentPayment.setCreateTime(date);
-                courseScheduleStudentPayment.setUpdateTime(date);
-                courseScheduleStudentPayments.add(courseScheduleStudentPayment);
-            }
-
-            List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-            //4、调整线上基础技能班未上课课酬
-            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroup.getId());
-            int hasTeacherSalaryCount = 0;
-            if (courseScheduleIds.size() > 0) {
-                hasTeacherSalaryCount = courseScheduleTeacherSalaryDao.getHasTeacherSalaryCount(courseScheduleIds);
-            }
-            if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && hasTeacherSalaryCount > 0) {
-                Integer studentNum = classGroup.getStudentNum() + 1;
-                List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
-                courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
-                for (CourseSchedule courseSchedule : courseScheduleList) {
-                    for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), ClassGroupTypeEnum.HIGH_ONLINE.getCode(), null);
-                        Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-                        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
-                        BigDecimal salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-
-                        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-                        courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-                        courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-                        courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-                        courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
-                        courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
-                        courseScheduleTeacherSalary.setExpectSalary(salary);
-                        courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-                        courseScheduleTeacherSalary.setCreateTime(date);
-                        courseScheduleTeacherSalary.setUpdateTime(date);
-                        courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-                    }
-                }
-                courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
-            }
-
-            //5、加入班级群组
-            ImGroupMember[] imGroupMembers = new ImGroupMember[]{new ImGroupMember(studentId.toString())};
-            imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
-
-    	}
-
-        if (courseScheduleStudentPayments.size() != 0) {
-            courseScheduleStudentPaymentService.batchInsert(courseScheduleStudentPayments);
-        }
-
-    	return true;
+	public boolean addStudentToClassGroupAndCourseArranging(Integer studentId, String classGroupIdListStr,
+			List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList) {
+
+		List<ClassGroup> classGroupList = classGroupDao.findClassGroupByIds(classGroupIdListStr);
+		if (classGroupList == null || classGroupList.size() == 0) {
+			throw new BizException("班级查询失败");
+		}
+
+		Date date = new Date();
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
+
+		// 计算单价
+		Map<CourseScheduleType, BigDecimal> unitPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
+		Map<CourseScheduleType, BigDecimal> OriginTotalPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
+		for (MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings : musicGroupPaymentCalenderCourseSettingsList) {
+			unitPriceMap.put(
+					musicGroupPaymentCalenderCourseSettings.getCourseType(),
+					musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().divide(
+							new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties())));
+			
+			OriginTotalPriceMap.put(musicGroupPaymentCalenderCourseSettings.getCourseType(), musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice());
+		}
+
+		Map<CourseScheduleType, BigDecimal> totalPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
+
+		BigDecimal unitPrice = new BigDecimal(0);
+		CourseScheduleType courseType = null;
+		for (ClassGroup classGroup : classGroupList) {
+			// 1、增加班级人数
+			classGroupDao.addStudentNum(classGroup);
+
+			// 2、插入关联关系
+			ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+			classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+			classGroupStudentMapper.setClassGroupId(classGroup.getId());
+			classGroupStudentMapper.setUserId(studentId);
+			classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+			classGroupStudentMapper.setGroupType(classGroup.getGroupType());
+			classGroupStudentMapper.setCreateTime(date);
+			classGroupStudentMapperDao.insert(classGroupStudentMapper);
+
+			// 3、学生加入级未开始课程
+			List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroup.getId());
+			for (CourseSchedule courseSchedule : courseScheduleList) {
+				CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+				courseScheduleStudentPayment.setCourseSchedule(courseSchedule);
+				courseScheduleStudentPayment.setGroupType(classGroup.getGroupType());
+				courseScheduleStudentPayment.setMusicGroupId(classGroup.getMusicGroupId());
+				courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+				courseScheduleStudentPayment.setUserId(studentId);
+
+				unitPrice = unitPriceMap.get(courseSchedule.getType());
+				if (unitPrice != null) {
+					courseType = courseSchedule.getType();
+					BigDecimal duration = new BigDecimal(DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime()));
+					courseScheduleStudentPayment.setExpectPrice(unitPrice.multiply(duration).setScale(2, BigDecimal.ROUND_DOWN));
+
+					if (totalPriceMap.containsKey(courseType)) {
+						totalPriceMap.put(courseType, totalPriceMap.get(courseType).add(courseScheduleStudentPayment.getExpectPrice()));
+					} else {
+						totalPriceMap.put(courseType, courseScheduleStudentPayment.getExpectPrice());
+					}
+				}
+				courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+				courseScheduleStudentPayment.setCreateTime(date);
+				courseScheduleStudentPayment.setUpdateTime(date);
+				courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+			}
+
+			// 5、加入班级群组
+			ImGroupMember[] imGroupMembers = new ImGroupMember[] { new ImGroupMember(studentId.toString()) };
+			imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+
+		}
+
+		if (courseScheduleStudentPayments.size() > 0) {
+			// 排序
+			Collections.sort(courseScheduleStudentPayments);
+			List<CourseScheduleType> list = new ArrayList<CourseSchedule.CourseScheduleType>();
+			for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+				courseType = courseScheduleStudentPayment.getCourseSchedule().getType();
+				if (!list.contains(courseType)) {
+					list.add(courseType);
+
+					// 修改第一节课的金额
+					courseScheduleStudentPayment.setExpectPrice(courseScheduleStudentPayment.getExpectPrice().add(
+							OriginTotalPriceMap.get(courseType).subtract(totalPriceMap.get(courseType))));
+				}
+			}
+			courseScheduleStudentPaymentService.batchInsert(courseScheduleStudentPayments);
+		}
+
+		return true;
 	}
 
 	@Override
@@ -1717,11 +1722,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //5、插入班级排课信息
         LocalDateTime now = LocalDate.parse(classGroup4MixDtos.get(0).getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
 
+        Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIdList);
+
         //计算每节课的课酬
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
 
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            if(!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())){
+                throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+            }
+            Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
+            long courseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getStartClassTime() + ":00", formatter),
+                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getEndClassTime() + ":00", formatter))
+                    .toMinutes();
+            classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
+
             int times = 0;
 
             Set<String> holidayDays = new HashSet<>();
@@ -1732,7 +1750,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
                 }
             }
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
             WhileNode:
             while (true) {
@@ -2008,18 +2025,32 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroupTeacherMapperService.classGroupTeachersInsert(newClassGroupTeacherMapperList);
         }
 
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         //2、获取班级学生
         List<StudentRegistration> studentList = classGroupStudentMapperDao.findClassStudentList(classGroup.getId(), ClassGroupStudentStatusEnum.NORMAL);
 
+        List<Integer> studentIds = studentList.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
+
         //3、插入班级排课信息
         LocalDateTime now = LocalDate.parse(classGroup4MixDtos.get(0).getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
 
+        Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIds);
+
         //计算每节课的课酬
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
 
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            if(!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())){
+                throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+            }
+            Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
+            long courseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getStartClassTime() + ":00", formatter),
+                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getEndClassTime() + ":00", formatter))
+                    .toMinutes();
+            classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
+
             int times = 0;
             Set<String> holidayDays = new HashSet<>();
             if (classGroup4MixDto.getHoliday()) {
@@ -2028,7 +2059,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
                 }
             }
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
             WhileNode:
             while (true) {
@@ -2191,7 +2221,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         if (!CollectionUtils.isEmpty(studentList)) {
-            List<Integer> studentIds = studentList.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
             studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
 
             //学生结算表
@@ -2291,11 +2320,23 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //5、插入班级排课信息
         LocalDateTime now = LocalDate.parse(classGroup4MixDtos.get(0).getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
 
+        Map<String, Integer> courseTypeMinutesMap = musicGroupPaymentCalenderCourseSettingsService.getMusicCourseSettingsWithStudents(musicGroupId, studentIdList);
+
         //计算每节课的课酬
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            if(!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())){
+                throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+            }
+            Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
+            long courseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getStartClassTime() + ":00", formatter),
+                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getEndClassTime() + ":00", formatter))
+                    .toMinutes();
+            classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
+
             int times = 0;
             Set<String> holidayDays = new HashSet<>();
             if (classGroup4MixDto.getHoliday()) {
@@ -2304,7 +2345,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
                 }
             }
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
             WhileNode:
             while (true) {

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
@@ -356,6 +357,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public void updateClassGroupStudents(Long classGroupId, Set<Integer> studentIds) {
         ClassGroup classGroup = classGroupService.get(classGroupId.intValue());
         if(Objects.isNull(classGroup)){

+ 11 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -287,7 +287,6 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	@Override
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public void createForMusicGroup(String musicGroupId, List<CourseSchedule> courseSchedules, List<Integer> studentIds) {
-		List<CourseScheduleStudentPayment> baseCourseScheduleStudentPayments = new ArrayList<>();
 		Map<CourseSchedule.CourseScheduleType, Integer> courseTypeCourseDurationMap = new HashMap<>();
 		Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCourseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
 		for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCoursesEntry : typeCourseMap.entrySet()) {
@@ -302,12 +301,14 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
 
+		List<String> allBatchNos = new ArrayList<>();
+
 		for (Integer studentId : studentIds) {
 			for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
 				//当前课程类型总课程时长
 				Integer typeCourseDuration = courseTypeCourseDurationMap.get(courseScheduleTypeListEntry.getKey());
 				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(studentId, courseScheduleTypeListEntry.getKey(), typeCourseDuration);
-				if(Objects.isNull(musicGroupPaymentStudentCourseDetail)){
+				if(Objects.isNull(musicGroupPaymentStudentCourseDetail)||musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes().compareTo(typeCourseDuration)<0){
 					SysUser user = teacherDao.getUser(studentId);
 					throw new BizException("{}在{}课程类型上的课程时长不足", user.getUsername(), courseScheduleTypeListEntry.getKey().getMsg());
 				}
@@ -318,10 +319,12 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 				}
 
 				MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalenderAndCourseType(musicGroupPaymentStudentCourseDetail.getMusicGroupPaymentCalenderId(), courseScheduleTypeListEntry.getKey());
-				if(Objects.isNull(musicGroupPaymentCalenderCourseSettings)){
+				if(Objects.isNull(musicGroupPaymentCalenderCourseSettings)||musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties().compareTo(musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes())!=0){
 					throw new BizException("缴费设置异常");
 				}
 
+				allBatchNos.add(musicGroupPaymentCalender.getBatchNo());
+
 				//课程每分钟原价
 				BigDecimal unitMinuteOriginalPrice = musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 				//课程每分钟现价
@@ -348,22 +351,23 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					cssp.setCourseScheduleId(courseSchedule.getId());
 					cssp.setClassGroupId(courseSchedule.getClassGroupId());
 					cssp.setBatchNo(musicGroupPaymentCalender.getBatchNo());
+					cssp.setUserId(studentId);
 					cssp.setOriginalPrice(courseOriginalPrice);
 					cssp.setExpectPrice(courseCurrentPrice);
 					cssp.setActualPrice(BigDecimal.ZERO);
 					typeCourseStudentPayments.add(cssp);
 				}
-				if(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().compareTo(typeCourseTotalCurrentPrice)<0){
-					throw new BizException("{}课程类型时长不足", courseScheduleTypeListEntry.getKey().getMsg());
-				}
 				typeCourseStudentPayments.get(0).setOriginalPrice(typeCourseStudentPayments.get(0).getOriginalPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().subtract(typeCourseTotalOriginalPrice)));
 				typeCourseStudentPayments.get(0).setExpectPrice(typeCourseStudentPayments.get(0).getExpectPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().subtract(typeCourseTotalCurrentPrice)));
-				baseCourseScheduleStudentPayments.addAll(typeCourseStudentPayments);
+				courseScheduleStudentPayments.addAll(typeCourseStudentPayments);
 				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(typeCourseDuration);
 				musicGroupPaymentStudentCourseDetailDao.update(musicGroupPaymentStudentCourseDetail);
 			}
 		}
 		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+		for (String batchNo : allBatchNos) {
+			updateForMusicGroupWithPaymentCalender(batchNo);
+		}
 	}
 
 	@Override

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderCourseSettingsServiceImpl.java

@@ -29,7 +29,7 @@ public class MusicGroupPaymentCalenderCourseSettingsServiceImpl extends BaseServ
 
 	@Override
 	public Map<String, Integer> getMusicCourseSettingsWithStudents(String musicGroupId, List<Integer> studentIds) {
-		List<MusicGroupPaymentStudentCourseDetail> mgpscds = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudents(studentIds);
+		List<MusicGroupPaymentStudentCourseDetail> mgpscds = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudents(musicGroupId, studentIds);
 		if(CollectionUtils.isEmpty(mgpscds)){
 			return Collections.emptyMap();
 		}

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -269,7 +269,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						// 学生加到班级
 						String classGroupIdStr = musicGroupPaymentCalender.getAttribute1();
 						if (StringUtils.isNotBlank(classGroupIdStr)) {
-							classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(studentId), classGroupIdStr);
+							classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(studentId), classGroupIdStr, musicGroupPaymentCalenderCourseSettingsList);
 						}
 					}
 				}
@@ -479,7 +479,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						// 学生加到班级
 						String classGroupIdStr = musicGroupPaymentCalender.getAttribute1();
 						if(StringUtils.isNotBlank(classGroupIdStr)){
-							classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(studentId), classGroupIdStr);
+							classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(studentId), classGroupIdStr, musicGroupPaymentCalenderCourseSettingsList);
 						}
 					}
 				}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -1065,7 +1065,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
 
         for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettings) {
-            if (!orderDetailTypes.contains(courseSetting.getCourseType().getCode())) continue;
+            if (musicGroupRegCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT) && !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) continue;
             MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
             musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupRegCalender.getId());
             musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());

+ 2 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -292,9 +292,10 @@
 
     <!-- 查询班级某状态的所有学生 -->
     <select id="findClassStudentList" resultMap="com.ym.mec.biz.dal.dao.StudentRegistrationDao.StudentRegistration">
-        SELECT sr.*,su.username_ FROM class_group_student_mapper cgsm
+        SELECT sr.*,s.name_ subject_name_,su.username_  FROM class_group_student_mapper cgsm
         LEFT JOIN student_registration sr ON (sr.user_id_ = cgsm.user_id_ AND sr.music_group_id_ = cgsm.music_group_id_)
         LEFT JOIN sys_user su on sr.user_id_ = su.id_
+        LEFT JOIN subject s ON sr.subject_id_ = s.id_
         WHERE cgsm.class_group_id_ = #{classGroupId} AND sr.music_group_status_ != 'QUIT'
         AND cgsm.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </select>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml

@@ -144,6 +144,9 @@
 	        <if test="endDate != null">
 	            AND ei.update_time_ &lt;= #{endDate}
 	        </if>
+	        <if test="operator != null">
+	            AND (ei.operator_id_ like concat('%',#{operator},'%') or u.real_name_ like concat('%',#{operator},'%'))
+	        </if>
 		</where>
     </sql>
 
@@ -162,6 +165,7 @@
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(ei.id_) FROM employee_info ei
+		left join sys_user u on u.id_ = ei.operator_id_
         <include refid="queryPageMap"/>
 	</select>
 </mapper>

+ 5 - 3
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -109,13 +109,15 @@
 		SELECT * FROM music_group_payment_student_course_detail
 		WHERE user_id_=#{studentId}
 		AND course_type_=#{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-		AND total_course_minutes &gt; #{courseMinutes}
+		AND total_course_minutes_ &gt; #{courseMinutes}
 		AND used_course_minutes_ &lt;= 0
 		ORDER BY id_ DESC LIMIT 1;
 	</select>
     <select id="getUnUseWithStudents" resultMap="MusicGroupPaymentStudentCourseDetail">
-		SELECT * FROM music_group_payment_student_course_detail WHERE
-		used_course_minutes_ &lt;= 0
+		SELECT * FROM music_group_payment_student_course_detail mgpscd
+		LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+		WHERE used_course_minutes_ &lt;= 0
+		AND mgpc.music_group_id_ = #{musicGroupId}
 		AND user_id_ IN
 		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
 			#{studentId}

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -154,10 +154,10 @@ public class MusicGroupController extends BaseController {
             if (musicGroup.getStatus() == MusicGroupStatusEnum.PAY) {
                 Date now = new Date();
                 MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
-                if (regCalender != null) {
+                if (regCalender != null && regCalender.getDeadlinePaymentDate() != null) {
                     musicGroup.setPaymentExpireDate(regCalender.getDeadlinePaymentDate());
                 }
-                if (regCalender !=null && DateUtil.daysBetween(musicGroup.getPaymentExpireDate(), now) > 1) {
+                if (musicGroup.getPaymentExpireDate() != null && DateUtil.daysBetween(musicGroup.getPaymentExpireDate(), now) > 1) {
                     return failed("乐团缴费时间已截止");
                 }
             }