zouxuan 4 سال پیش
والد
کامیت
5fc9daad13

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

@@ -1870,4 +1870,11 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     List<CourseSchedule> queryPreCourseListByClassGroupId(Integer classGroupId);
+
+    /**
+     * 根据课程编号获取总时长
+     * @param courseScheduleIds
+     * @return
+     */
+    int sumCourseMinutes(List<Long> courseScheduleIds);
 }

+ 43 - 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
@@ -48,4 +58,37 @@ public interface MusicGroupSchoolTermStudentCourseDetailDao extends BaseDAO<Long
      * @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);
 }

+ 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);
 }

+ 75 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -2630,7 +2630,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public HttpResponseResult confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId) {
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         //校验所有学员的课时都有消耗
         if(musicGroupSchoolTermStudentCourseDetailDao.checkNoCourse(musicGroupSchoolTermCourseDetailId)){
@@ -2658,14 +2659,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         studentDao.updateStudentServiceTag(null, studentIds, YesOrNoEnum.YES.getCode());
         //初始化老师考勤表
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
-        List<ClassGroup> byCourseSchedules = classGroupDao.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);
-            }
-        }
+//        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));
@@ -2690,7 +2691,62 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             teacherAttendanceDao.batchInsert(teacherAttendances);
         }
         imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
-        return null;
+    }
+
+    @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
@@ -2742,11 +2798,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
         MusicGroupSchoolTermCourseDetail schoolTermCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
-            //更新学员的排课时长
             //3、插入班级排课信息
             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 分钟
@@ -2754,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);
@@ -2935,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);
@@ -2957,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);
         }

+ 9 - 1
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();

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -3880,4 +3880,12 @@
     <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>

+ 25 - 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} 
@@ -136,4 +157,7 @@
 	<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>

+ 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 = "获取班级的预排课课程列表")