Selaa lähdekoodia

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

yonge 4 vuotta sitten
vanhempi
commit
02d37719f5

+ 17 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -1472,7 +1472,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @author zouxuan
      */
     int batchUpdateLockByCourseIds(@Param("courseId") List<Long> courseId,
-                                   @Param("isLock") Integer isLock);
+                                   @Param("isLock") Integer isLock,
+                                   @Param("preCourseFlag") Integer preCourseFlag);
 
 
     /**
@@ -1858,8 +1859,22 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取预排课程列表
+     * @param musicGroupId
+     * @return
+     */
+    List<CourseSchedule> queryPreCourseListByMusicGroupId(String musicGroupId);
+
+    /**
+     * 获取预排课程列表
      * @param classGroupId
      * @return
      */
-    List<CourseSchedule> queryPreCourseList(Integer classGroupId);
+    List<CourseSchedule> queryPreCourseListByClassGroupId(Integer classGroupId);
+
+    /**
+     * 根据课程编号获取总时长
+     * @param courseScheduleIds
+     * @return
+     */
+    int sumCourseMinutes(List<Long> courseScheduleIds);
 }

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupSchoolTermStudentCourseDetailDao.java

@@ -16,9 +16,19 @@ public interface MusicGroupSchoolTermStudentCourseDetailDao extends BaseDAO<Long
      */
     void init(@Param("studentCourseDetail") MusicGroupSchoolTermStudentCourseDetail studentCourseDetail, @Param("studentIds") List<Integer> studentIds);
 
+    /**
+     * 删除预排课计划
+     * @param courseDetailId
+     */
     void deleteByDetailId(Integer courseDetailId);
 
     /**
+     * 获取预排课计划
+     * @param courseDetailId
+     */
+    List<MusicGroupSchoolTermStudentCourseDetail> findByDetailId(Integer courseDetailId);
+
+    /**
      * 获取所选学员最小可排课时长
      * @param musicGroupSchoolTermCourseDetailId
      * @param studentIds
@@ -41,4 +51,44 @@ public interface MusicGroupSchoolTermStudentCourseDetailDao extends BaseDAO<Long
      * @return
      */
     int getMaxMixCourseMinutes(@Param("courseDetailId") Integer musicGroupSchoolTermCourseDetailId, @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 是否有学员课时没有消耗
+     * @param musicGroupSchoolTermCourseDetailId
+     * @return
+     */
+    boolean checkNoCourse(Integer musicGroupSchoolTermCourseDetailId);
+
+    /**
+     * 更新学员排课时长
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param preMemberCourseMinutes
+     * @param mixCourseMinutes
+     * @param singleCourseMinutes
+     * @param studentIds
+     */
+    void updateMinutes(@Param("musicGroupSchoolTermCourseDetailId") Integer musicGroupSchoolTermCourseDetailId,
+                       @Param("preMemberCourseMinutes") Integer preMemberCourseMinutes,
+                       @Param("mixCourseMinutes") Integer mixCourseMinutes,
+                       @Param("singleCourseMinutes") Integer singleCourseMinutes,
+                       @Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 更新学员排课时长
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param preMemberCourseMinutes
+     * @param mixCourseMinutes
+     * @param singleCourseMinutes
+     */
+    void cutMinutes(@Param("musicGroupSchoolTermCourseDetailId") Integer musicGroupSchoolTermCourseDetailId,
+                       @Param("preMemberCourseMinutes") Integer preMemberCourseMinutes,
+                       @Param("mixCourseMinutes") Integer mixCourseMinutes,
+                       @Param("singleCourseMinutes") Integer singleCourseMinutes,
+                       @Param("studentId") Integer studentId);
+
+    /**
+     * 清空预排课
+     * @param musicGroupSchoolTermCourseDetailId
+     */
+    void cleanMinutes(Integer musicGroupSchoolTermCourseDetailId);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -593,4 +593,11 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     int getFirstPayNum(@Param("musicGroupId") String musicGroupId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    /**
+     * 是否所有的学员都在班
+     * @param musicGroupId
+     * @return
+     */
+    boolean checkHasNotClass(@Param("musicGroupId") String musicGroupId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java

@@ -177,6 +177,17 @@ public class MusicGroupPaymentCalender {
 	//会员等级编号
 	private Integer memberRankSettingId;
 
+	//会员等级名称
+	private String memberRankSettingName;
+
+	public String getMemberRankSettingName() {
+		return memberRankSettingName;
+	}
+
+	public void setMemberRankSettingName(String memberRankSettingName) {
+		this.memberRankSettingName = memberRankSettingName;
+	}
+
 	public BigDecimal getOriginalMemberPaymentAmount() {
 		return originalMemberPaymentAmount;
 	}

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

@@ -577,5 +577,12 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param musicGroupSchoolTermCourseDetailId
      * @return
      */
-    HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId);
+    void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId);
+
+    /**
+     * 取消预排课
+     * @param musicGroupSchoolTermCourseDetailId
+     * @param classGroupId
+     */
+    void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId);
 }

+ 134 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -2631,6 +2631,126 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
+        //校验所有学员的课时都有消耗
+        if(musicGroupSchoolTermStudentCourseDetailDao.checkNoCourse(musicGroupSchoolTermCourseDetailId)){
+            throw new BizException("操作失败:请确保所有学员都已排课");
+        }
+        //获取所有预排课课程列表
+        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
+        if(courseSchedules.size() == 0){
+            throw new BizException("操作失败:请先预排课");
+        }
+        Map<Integer, List<CourseSchedule>> courseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
+        courseMap.keySet().forEach(e->{
+            //更新班级课程数
+            classGroupService.updateTotalClassTimes(e, courseMap.get(e).size());
+        });
+        List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
+        //取消预排课标记
+        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds,0,0);
+        //标记已排课
+        termCourseDetail.setCourseFlag(true);
+        musicGroupSchoolTermCourseDetailDao.update(termCourseDetail);
+        //更新学员服务指标
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
+        List<Integer> studentIds = studentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+        studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
+        //初始化老师考勤表
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+//        List<ClassGroup> byCourseSchedules = classGroupDao.findByCourseSchedules(courseScheduleIds);
+
+//        Map<Integer, ClassGroup> classGroupMap = new HashMap<Integer, ClassGroup>();
+//        for (ClassGroup classGroup : byCourseSchedules) {
+//            if (!classGroupMap.containsKey(classGroup.getId())) {
+//                classGroupMap.put(classGroup.getId(), classGroup);
+//            }
+//        }
+        List<TeacherAttendance> teacherIdByCourseSchedule = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
+        Map<Long, List<TeacherAttendance>> courseScheduleTeacherAttendanceMap = teacherIdByCourseSchedule.stream()
+                .collect(Collectors.groupingBy(TeacherAttendance::getCourseScheduleId));
+        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+        courseScheduleTeacherSalaries.forEach(courseScheduleTeacherSalary -> {
+            List<TeacherAttendance> teacherAttendancesTemp = courseScheduleTeacherAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            List<Integer> collect = new ArrayList<>();
+            if (!CollectionUtils.isEmpty(teacherAttendancesTemp)) {
+                collect = teacherAttendancesTemp.stream().map(TeacherAttendance::getTeacherId).collect(Collectors.toList());
+            }
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setGroupType(courseScheduleTeacherSalary.getGroupType());
+            teacherAttendance.setClassGroupId(courseScheduleTeacherSalary.getClassGroupId());
+            teacherAttendance.setMusicGroupId(courseScheduleTeacherSalary.getMusicGroupId());
+            if (CollectionUtils.isEmpty(collect) || !collect.contains(courseScheduleTeacherSalary.getUserId())) {
+                teacherAttendance.setTeacherId(courseScheduleTeacherSalary.getUserId());
+                teacherAttendance.setCourseScheduleId(courseScheduleTeacherSalary.getCourseScheduleId());
+                teacherAttendances.add(teacherAttendance);
+            }
+        });
+        if (!CollectionUtils.isEmpty(teacherAttendances)) {
+            teacherAttendanceDao.batchInsert(teacherAttendances);
+        }
+        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId) {
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
+        if(classGroupId == null){
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
+            if(courseSchedules.size() == 0){
+                return;
+            }
+            List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
+            //取消所有预排课
+            musicGroupSchoolTermStudentCourseDetailDao.cleanMinutes(musicGroupSchoolTermCourseDetailId);
+            //删除课程以及关联的学员老师
+            courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
+        }else {
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
+            if(courseSchedules.size() == 0){
+                return;
+            }
+            List<Long> courseScheduleIds = courseSchedules.stream().map(c -> c.getId()).collect(Collectors.toList());
+            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
+            Map<Integer, List<CourseScheduleStudentPayment>> studentCourseMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId));
+
+            for (Integer studentId : studentCourseMap.keySet()) {
+                int preMemberCourseMinutes = 0;
+                int mixCourseMinutes = 0;
+                int singleCourseMinutes = 0;
+
+                List<CourseScheduleStudentPayment> courseScheduleStudentPaymentList = studentCourseMap.get(studentId);
+                List<Long> courseIds = courseScheduleStudentPaymentList.stream().map(c -> c.getId()).collect(Collectors.toList());
+                List<CourseSchedule> schedules = courseScheduleDao.findByCourseScheduleIds(courseIds);
+                Map<CourseScheduleType, List<CourseSchedule>> courseTypeMap = schedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+                for (CourseScheduleType scheduleType : courseTypeMap.keySet()) {
+                    List<CourseSchedule> courseScheduleList = courseTypeMap.get(scheduleType);
+                    List<Long> courseScheduleIdList = courseScheduleList.stream().map(c -> c.getId()).collect(Collectors.toList());
+                    //根据课程编号获取总时长
+                    int courseMinutes = courseScheduleDao.sumCourseMinutes(courseScheduleIdList);
+                    preMemberCourseMinutes += courseMinutes;
+                    if(scheduleType == SINGLE || scheduleType == TRAINING_SINGLE){
+                        singleCourseMinutes += courseMinutes;
+                    }
+                    if(scheduleType == MIX || scheduleType == TRAINING_MIX){
+                        mixCourseMinutes += courseMinutes;
+                    }
+                }
+                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId,preMemberCourseMinutes,mixCourseMinutes,singleCourseMinutes,studentId);
+            }
+            //删除课程以及关联的学员老师
+            courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult preCourseSchedule(List<ClassGroup4MixDto> classGroup4MixDtos) {
         Date date = new Date();
         Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
@@ -2682,6 +2802,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
 
             int totalCourseMinutes = classGroup4MixDto.getExpectStudentNum() * classGroup4MixDto.getCourseMinutes();
+            Integer totalMixCourseMinutes = 0;
+            Integer singleCourseMinutes = 0;
             if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
                     classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
                 //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
@@ -2689,12 +2811,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     throw new BizException("操作失败:单技课和合奏课最大的排课时长不能超过{}分钟",44*45);
                 }
                 if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
+                    singleCourseMinutes = totalCourseMinutes;
                     //获取所选学员最大的已消耗的单技课时长
                     int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
                     if(44 * 45 - maxSingleCourseMinutes > totalCourseMinutes){
                         throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
                     }
                 } else {
+                    totalMixCourseMinutes = totalCourseMinutes;
                     int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
                     if(44 * 45 - maxMixCourseMinutes > totalCourseMinutes){
                         throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
@@ -2870,10 +2994,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                 now = now.plusDays(1);
             }
-
-//            if (totalCourseDuration > totalMinutes) {
-//                throw new BizException("课程时长不足");
-//            }
+            //更新学员的排课时长
+            musicGroupSchoolTermStudentCourseDetailDao.updateMinutes(musicGroupSchoolTermCourseDetailId,
+                    totalCourseMinutes,
+                    totalMixCourseMinutes,
+                    singleCourseMinutes,
+                    studentIds);
         }
 
         courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
@@ -2892,7 +3018,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         if (!CollectionUtils.isEmpty(studentList)) {
 //            studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
-
             //学生结算表
             courseScheduleStudentPaymentService.createForMemberMusicGroup(musicGroupId, courseScheduleList, studentIds);
         }
@@ -4021,7 +4146,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             //冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
             //冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
             httpResponseResult.setMsg("学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4452,7 +4577,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 //                冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 //                冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
             httpResponseResult.setMsg("操作成功:学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4488,7 +4613,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
         }
         //解冻课程
-        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0);
+        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0,null);
         //解冻班级
         classGroupIds.add(masterClassGroupId);
         classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 0);
@@ -4510,7 +4635,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     public List<CourseSchedule> queryPreCourseList(Integer classGroupId) {
-        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseList(classGroupId);
+        List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
         if(courseSchedules.size() > 0){
             List<Long> courseIdList = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
             Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherIdMap(courseIdList,"BISHOP"));
@@ -4522,9 +4647,4 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         return courseSchedules;
     }
-
-    @Override
-    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
-        return null;
-    }
 }

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

@@ -122,6 +122,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	private GroupEventSource groupEventSource;
 	@Autowired
 	private MemberFeeSettingDao memberFeeSettingDao;
+	@Autowired
+	private MemberRankSettingDao memberRankSettingDao;
 
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -322,7 +324,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
 			musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentCalenderDto.getMusicGroupOrganizationCourseSettingId());
 
-			BigDecimal totalPaymentAmount = musicGroupPaymentCalenderDto.getMasterTotalPrice();
+			BigDecimal totalPaymentAmount = musicGroupPaymentCalenderDto.getMemberPaymentAmount();
 			if(musicGroupPaymentCalenderCourseSettingsList != null){
 				List<MusicGroupPaymentCalenderCourseSettings> newCSList = new ArrayList<MusicGroupPaymentCalenderCourseSettings>(
 						musicGroupPaymentCalenderCourseSettingsList.size());
@@ -1111,6 +1113,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		List<MusicGroupPaymentCalender> groupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
 		calenderAuditDetailDto.setMusicGroupPaymentCalenders(groupPaymentCalenders);
 		MusicGroupPaymentCalender paymentCalender = groupPaymentCalenders.get(0);
+		if(paymentCalender.getMemberRankSettingId() != null){
+			MemberRankSetting memberRankSetting = memberRankSettingDao.get(paymentCalender.getMemberRankSettingId());
+			if(memberRankSetting != null){
+				paymentCalender.setMemberRankSettingName(memberRankSetting.getName());
+			}
+		}
 		if(paymentCalender.getPaymentType() == ADD_STUDENT){
 			try {
 				String studentIds = groupPaymentCalenders.get(0).getStudentIds();
@@ -1163,7 +1171,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds,studentIds);
 		//解冻课程
 		List<Long> allCourseIds = JSON.parseArray(musicGroupStudentClassAdjust.getAllLockCourseIds(), Long.class);
-		courseScheduleDao.batchUpdateLockByCourseIds(allCourseIds,0);
+		courseScheduleDao.batchUpdateLockByCourseIds(allCourseIds,0,null);
 		//解冻班级
 		List<Integer> classGroupIds = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupIds(), Integer.class);
 		classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,0);

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java

@@ -47,6 +47,10 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 	public MusicGroupSchoolTermCourseDetail upset(MusicGroupSchoolTermCourseDetail musicGroupSchoolTermCourseDetail) {
 		Date startCourseDate = musicGroupSchoolTermCourseDetail.getStartCourseDate();
 		String musicGroupId = musicGroupSchoolTermCourseDetail.getMusicGroupId();
+		//校验当前乐团是否所有学员都在班
+		if(!studentRegistrationDao.checkHasNotClass(musicGroupId)){
+			throw new BizException("操作失败:请确保所有在读学员都在班级");
+		}
 		MusicGroupSchoolTermCourseDetail courseDetail = musicGroupSchoolTermCourseDetailDao.
 				findByCourseDateAndMusicGroupId(musicGroupId,startCourseDate);
 		Date date = DateUtil.stringToDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT);

+ 17 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -1364,6 +1364,9 @@
     <update id="batchUpdateLockByCourseIds">
         UPDATE course_schedule
         SET is_lock_ = #{isLock}, update_time_ = NOW()
+        <if test="preCourseFlag != null">
+            ,pre_course_flag_ = #{preCourseFlag}
+        </if>
         WHERE id_ IN
         <foreach collection="courseId" open="(" close=")" item="item" separator=",">
             #{item}
@@ -3870,7 +3873,19 @@
                 #{courseId}
             </foreach>
     </select>
-    <select id="queryPreCourseList" resultMap="CourseSchedule">
-        SELECT * FROM course_schedule WHERE class_group_id_ = 1 AND is_lock_ = 1 AND pre_course_flag_ = 1
+    <select id="queryPreCourseListByClassGroupId" resultMap="CourseSchedule">
+        SELECT * FROM course_schedule WHERE class_group_id_ = #{classGroupId} AND is_lock_ = 1 AND pre_course_flag_ = 1
+    </select>
+
+    <select id="queryPreCourseListByMusicGroupId" resultMap="CourseSchedule">
+        SELECT * FROM course_schedule WHERE music_group_id_ = #{musicGroupId} AND group_type_ = 'MUSIC' AND is_lock_ = 1 AND pre_course_flag_ = 1
+    </select>
+    <select id="sumCourseMinutes" resultType="java.lang.Integer">
+        SELECT SUM(c.course_mintues_) FROM (SELECT FLOOR((UNIX_TIMESTAMP(CONCAT(class_date_, ' ', end_class_time_)) -
+        UNIX_TIMESTAMP(CONCAT(class_date_, ' ', start_class_time_))) / 60) course_mintues_ FROM course_schedule
+        WHERE id_ IN
+        <foreach collection="courseScheduleIds" item="courseId" open="(" close=")" separator=",">
+            #{courseId}
+        </foreach>) c
     </select>
 </mapper>

+ 28 - 1
mec-biz/src/main/resources/config/mybatis/MusicGroupSchoolTermStudentCourseDetailMapper.xml

@@ -86,7 +86,28 @@
 			update_time_ = NOW()
 		</set> WHERE id_ = #{id}
 	</update>
-	
+    <update id="updateMinutes">
+		UPDATE music_group_school_term_student_course_detail SET pre_member_course_minutes_ = #{preMemberCourseMinutes} + pre_member_course_minutes_,
+																 mix_course_minutes_ = #{mixCourseMinutes} + mix_course_minutes_,
+																 single_course_minutes_ = #{singleCourseMinutes} + single_course_minutes_
+		WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND user_id_ IN
+		<foreach collection="studentIds" separator="," open="(" close=")" item="userId">
+			#{userId}
+		</foreach>
+	</update>
+    <update id="cutMinutes">
+		UPDATE music_group_school_term_student_course_detail SET pre_member_course_minutes_ = pre_member_course_minutes_ - #{preMemberCourseMinutes},
+																 mix_course_minutes_ = mix_course_minutes_ - #{mixCourseMinutes},
+																 single_course_minutes_ = single_course_minutes_ - #{singleCourseMinutes}
+		WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND user_id_ = #{studentId}
+	</update>
+	<update id="cleanMinutes">
+		UPDATE music_group_school_term_student_course_detail SET pre_member_course_minutes_ = 0,
+																 mix_course_minutes_ = 0,
+																 single_course_minutes_ = 0
+		WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId}
+	</update>
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM music_group_school_term_student_course_detail WHERE id_ = #{id} 
@@ -133,4 +154,10 @@
 		</foreach>
 		GROUP BY music_group_school_term_course_detail_id_
 	</select>
+	<select id="checkNoCourse" resultType="java.lang.Boolean">
+		SELECT COUNT(id_) > 0 FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{musicGroupSchoolTermCourseDetailId} AND pre_member_course_minutes_ = 0
+	</select>
+	<select id="findByDetailId" resultMap="MusicGroupSchoolTermStudentCourseDetail">
+		SELECT * FROM music_group_school_term_student_course_detail WHERE music_group_school_term_course_detail_id_ = #{courseDetailId}
+	</select>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -1492,4 +1492,10 @@
         </if>
         AND sr.music_group_status_ != 'QUIT'
     </select>
+    <select id="checkHasNotClass" resultType="java.lang.Boolean">
+        SELECT COUNT(DISTINCT sr.user_id_) = COUNT(DISTINCT cssm.user_id_) FROM student_registration sr
+        LEFT JOIN class_group_student_mapper cssm ON sr.music_group_id_ = cssm.music_group_id_
+        WHERE sr.music_group_id_ = #{musicGroupId} AND sr.music_group_status_ = 'NORMAL'
+        GROUP BY sr.music_group_id_
+    </select>
 </mapper>

+ 10 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -281,7 +281,16 @@ public class ClassGroupController extends BaseController {
     @PostMapping("/confirmPreCourseSchedule")
     @PreAuthorize("@pcs.hasPermissions('classGroup/confirmPreCourseSchedule')")
     public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) throws Exception {
-        return classGroupService.confirmPreCourseSchedule(musicGroupSchoolTermCourseDetailId);
+        classGroupService.confirmPreCourseSchedule(musicGroupSchoolTermCourseDetailId);
+        return succeed();
+    }
+
+    @ApiOperation(value = "取消预排课")
+    @PostMapping("/cancelPreCourseSchedule")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/cancelPreCourseSchedule')")
+    public HttpResponseResult cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId,Integer classGroupId) throws Exception {
+        classGroupService.cancelPreCourseSchedule(musicGroupSchoolTermCourseDetailId,classGroupId);
+        return succeed();
     }
 
     @ApiOperation(value = "获取班级的预排课课程列表")

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/MemberFeeSettingController.java

@@ -20,7 +20,7 @@ public class MemberFeeSettingController extends BaseController {
 
     @ApiOperation(value = "根据会员等级编号和分部编号获取收费标准")
     @GetMapping("/findByRankId")
-    @PreAuthorize("@pcs.hasPermissions('memberPrivilegesItem/findByRankId')")
+    @PreAuthorize("@pcs.hasPermissions('memberFeeSetting/findByRankId')")
     public Object add(Integer organId,Integer rankId) {
         return succeed(memberFeeSettingService.findByRankIdAndOrganId(organId,rankId));
     }