Просмотр исходного кода

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

zouxuan 5 лет назад
Родитель
Сommit
5d13701c5e
20 измененных файлов с 276 добавлено и 106 удалено
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  3. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupGiveCourseSortDto.java
  5. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java
  6. 59 53
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  7. 42 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  9. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  10. 6 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  11. 41 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  12. 31 3
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  13. 2 5
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  14. 2 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  15. 1 2
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  16. 3 16
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  17. 2 4
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java
  18. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/UploadFileController.java
  19. 12 4
      mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java
  20. 4 4
      mec-web/src/main/java/com/ym/mec/web/controller/education/ImController.java

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -25,6 +25,15 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     int batchInsert(List<CourseScheduleStudentPayment> courseScheduleStudentPayments);
 
     /**
+     * @describe 批量更新
+     * @author Joburgess
+     * @date 2020/1/10
+     * @param courseScheduleStudentPayments:
+     * @return int
+     */
+    int batchUpdate(@Param("courseScheduleStudentPayments") List<CourseScheduleStudentPayment> courseScheduleStudentPayments);
+
+    /**
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
      * @Author: Joburgess
      * @Date: 2019/10/15

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -36,6 +36,15 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
     int deleteStudentAttendancesByCourse(Long courseScheduleId);
 
     /**
+     * @describe 根据课程删除考情记录
+     * @author Joburgess
+     * @date 2020/1/11
+     * @param courseScheduleIds:
+     * @return int
+     */
+    int deleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
      * 统计学生各种状态人数
      * @param classId
      * @return
@@ -171,4 +180,15 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return int
      */
     int countStudentAttendenceNum(@Param("courseScheduleId") Integer courseScheduleId);
+
+    /**
+     * @describe 统计课程中4小时前的请假人数
+     * @author Joburgess
+     * @date 2020/1/11
+     * @param courseScheduleIds: 课程计划编号列表
+     * @param hours: 小时
+     * @return java.util.List<java.util.Map<java.lang.Long,java.lang.Integer>>
+     */
+    List<Map<Long,Integer>> countCourseLeaveStudentNumWithFourHoursAgo(@Param("courseScheduleIds") List<Long> courseScheduleIds,
+                                                                       @Param("hours") Integer hours);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java

@@ -21,6 +21,9 @@ public class CourseScheduleDto extends CourseSchedule {
     @ApiModelProperty(value = "学生总人数")
     private Integer totalStudentNum;
 
+    @ApiModelProperty(value = "预计学生人数")
+    private Integer expectStudentNum;
+
     @ApiModelProperty(value = "学生姓名")
     private String studentNames;
 
@@ -47,6 +50,25 @@ public class CourseScheduleDto extends CourseSchedule {
     @ApiModelProperty(value = "是否是第一次进行学生点名")
     private int studentAttendanceIsFirstTime;
 
+    @ApiModelProperty(value = "能否进行调整")
+    private int enableAdjustInToday;
+
+    public Integer getExpectStudentNum() {
+        return expectStudentNum;
+    }
+
+    public void setExpectStudentNum(Integer expectStudentNum) {
+        this.expectStudentNum = expectStudentNum;
+    }
+
+    public int getEnableAdjustInToday() {
+        return enableAdjustInToday;
+    }
+
+    public void setEnableAdjustInToday(int enableAdjustInToday) {
+        this.enableAdjustInToday = enableAdjustInToday;
+    }
+
     public int getStudentAttendanceIsFirstTime() {
         return studentAttendanceIsFirstTime;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupGiveCourseSortDto.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
 
 import java.util.Date;
 
@@ -14,6 +15,16 @@ public class VipGroupGiveCourseSortDto extends CourseScheduleStudentPayment {
 
     private Date courseEndTime;
 
+    private TeachModeEnum teachMode;
+
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
+
     public Date getCourseStartTime() {
         return courseStartTime;
     }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -55,6 +55,11 @@ public class CourseScheduleStudentPayment {
 		this.classGroupId = classGroupId;
 	}
 
+	public CourseScheduleStudentPayment(Long id, Long courseScheduleId) {
+		this.id = id;
+		this.courseScheduleId = courseScheduleId;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}

+ 59 - 53
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -317,9 +317,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             throw new BizException("请登录");
         }
         Date now = new Date();
+        SysConfig studentAttendanceAfterTimeConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
         Map<String, Object> result = new HashMap<>(3);
         result.put("vipAppealDaysRange", sysConfigDao.findConfigValue(SysConfigService.VIP_APPEAL_DAYS_RANGE));
         result.put("advanceLeaveHours", Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS)));
+        result.put("joinRoomBeforeTime",studentAttendanceAfterTimeConfig.getParanValue(Integer.class));
 //		List<Integer> quitClassGroupIds=classGroupStudentMapperDao.findClassGroupIdByUserAndCourseDateAndStatus(user.getId(),classDate, ClassGroupStudentStatusEnum.QUIT.getCode());
         List<CourseScheduleDto> studentCourseSchedulesWithDate = courseScheduleDao.getStudentCourseSchedulesWithDate(classDate, user.getId().longValue(), null);
         List<Long> courseScheduleIds = studentCourseSchedulesWithDate.stream()
@@ -410,6 +412,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (Objects.nonNull(studentNumCourseMaps)) {
             studentNumCourseMap = MapUtil.convertIntegerMap(studentNumCourseMaps);
         }
+
+        if(CollectionUtils.isEmpty(teacherCourseSchedulesWithDate)){
+            return teacherCourseSchedulesWithDate;
+        }
+
+        SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ADVANCE_LEAVE_HOURS);
+        Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+        List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
+        Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
+
         for (CourseScheduleDto courseScheduleDto : teacherCourseSchedulesWithDate) {
             Long studentNum = studentNumCourseMap.get(courseScheduleDto.getId());
             if (Objects.nonNull(studentNum)) {
@@ -426,10 +438,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 courseScheduleDto.setStatus(CourseStatusEnum.UNDERWAY);
             }
             if (Objects.nonNull(courseScheduleDto.getClassGroupId())) {
-                String[] studentNums = classGroupStudentMapperDao.findCourseStudentName(courseScheduleDto.getId().intValue());
-                courseScheduleDto.setStudentNames(org.apache.commons.lang3.StringUtils.join(studentNums, ","));
+                String[] studentNames = classGroupStudentMapperDao.findCourseStudentName(courseScheduleDto.getId().intValue());
+                courseScheduleDto.setStudentNames(org.apache.commons.lang3.StringUtils.join(studentNames, ","));
             }
             courseScheduleDto.setSubjectName(subjectNameCourseMap.get(courseScheduleDto.getId()));
+            Long leaveStudentNum = courseLeaveStudentNumMap.get(courseScheduleDto.getId());
+            if(Objects.nonNull(leaveStudentNum)&&leaveStudentNum.intValue()==courseScheduleDto.getExpectStudentNum()){
+                courseScheduleDto.setEnableAdjustInToday(1);
+            }
         }
         return teacherCourseSchedulesWithDate;
     }
@@ -1106,6 +1122,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         checkNewCourseSchedules(courseSchedules, false);
         courseScheduleDao.batchUpdate(courseSchedules);
         classGroupService.updateClassGroupInfo(classGroup.getId());
+        courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
     }
 
     @Override
@@ -1342,6 +1359,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if (Objects.isNull(newCourseSchedule.getTeachMode())) {
                 newCourseSchedule.setTeachMode(oldCourseSchedule.getTeachMode());
             }
+            if(Objects.isNull(newCourseSchedule.getClassDate())){
+                newCourseSchedule.setClassDate(oldCourseSchedule.getClassDate());
+            }
+            if(Objects.isNull(newCourseSchedule.getStartClassTime())){
+                newCourseSchedule.setStartClassTime(oldCourseSchedule.getStartClassTime());
+            }
+            if(Objects.isNull(newCourseSchedule.getEndClassTime())){
+                newCourseSchedule.setEndClassTime(oldCourseSchedule.getEndClassTime());
+            }
             if (newCourseSchedule.getStartClassTime().after(now)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
             }
@@ -1387,20 +1413,39 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
         Map<Long, CourseSchedule> oldCourseSchedules = new HashMap<>();
 
+        List<Integer> classGroupIds = oldCourseScheduleList.stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
+        List<ClassGroup> classGroups = classGroupDao.findByClassGroupIds(classGroupIds);
+        Map<Integer, ClassGroup> idClassGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
+
+        SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ADVANCE_LEAVE_HOURS);
+        Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+        List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(newCourseScheduleIds, advanceLeaveHours);
+        Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
+
         newCourseSchedules.forEach(newCourseSchedule -> {
-            if (!sysUser.getUserType().contains("SYSTEM") && newCourseSchedule.getStartClassTime().before(tomorrow) && sysUser.getUserType().contains("TEACHER")) {
-                throw new BizException("调整时间必须为明天及以后");
-            }
 
             CourseSchedule oldCourseSchedule = oldCourseScheduleMap.get(newCourseSchedule.getId()).get(0);
 
+            if (!sysUser.getUserType().contains("SYSTEM") && sysUser.getUserType().contains("TEACHER")) {
+                Long courseLeaveStudentNum = courseLeaveStudentNumMap.get(newCourseSchedule.getId());
+                ClassGroup classGroup=idClassGroupMap.get(oldCourseSchedule.getClassGroupId());
+                if(oldCourseSchedule.getGroupType().equals(GroupType.VIP)
+                        &&Objects.nonNull(courseLeaveStudentNum)
+                        &&courseLeaveStudentNum.intValue()==classGroup.getExpectStudentNum()){
+                    if(!DateUtil.isSameDay(now,oldCourseSchedule.getStartClassTime())&&now.after(oldCourseSchedule.getStartClassTime())){
+                        throw new BizException("当前时间不可对相关课程进行调整");
+                    }
+                }else{
+                    if(DateUtil.addHours(now,advanceLeaveHours).after(oldCourseSchedule.getStartClassTime())){
+                        throw new BizException("请在课程开始前{}小时进行调整",advanceLeaveHours);
+                    }
+                }
+            }
+
             oldCourseSchedules.put(newCourseSchedule.getId(), oldCourseSchedule);
 
             if (newCourseSchedule.getStartClassTime().after(now)){
                 teacherAttendanceDao.cleanCourseTeacherSignInfo(newCourseSchedule.getId());
-            }
-
-            if (oldCourseSchedule.getEndClassTime().before(now)&&newCourseSchedule.getStartClassTime().after(now)){
                 needCreateStudentPaymentCourses.add(oldCourseSchedule);
             }
 
@@ -1545,6 +1590,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
         if(!CollectionUtils.isEmpty(needCreateStudentPaymentCourses)){
             courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentByCourseSchedules(needCreateStudentPaymentCourses);
+            studentAttendanceDao.deleteByCourseSchedules(needCreateStudentPaymentCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList()));
+        }
+
+        if(oldCourseScheduleList.get(0).getGroupType().equals(GroupType.VIP)){
+            courseScheduleStudentPaymentService.updateVipGiveCourse(Long.valueOf(oldCourseScheduleList.get(0).getMusicGroupId()));
         }
 
         try {
@@ -1567,6 +1617,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         } catch (Exception e) {
             e.printStackTrace();
         }
+
 //		Set<Integer> roleIds = new HashSet<>(1);
 //		roleIds.add(SysUserRole.SECTION_MANAGER);
 //		classGroupDao.get();
@@ -1587,51 +1638,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             throw new BizException("未找到对应课程");
         }
 
-        //获取两个课程的主教、助教
-        List<Long> courseScheduleIds = new ArrayList<>();
-        courseScheduleIds.add(courseScheduleId1);
-        courseScheduleIds.add(courseScheduleId2);
-        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
-        Map<Long, List<CourseScheduleTeacherSalary>> courseScheduleTeacherSalaryByCourse = courseScheduleTeacherSalaries.stream()
-                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
-        //课程1的主教、助教
-        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries1 = courseScheduleTeacherSalaryByCourse.get(courseScheduleId1);
-        //课程2的主教、助教
-        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries2 = courseScheduleTeacherSalaryByCourse.get(courseScheduleId2);
-
-        Map<TeachTypeEnum, List<CourseScheduleTeacherSalary>> ct1 = courseScheduleTeacherSalaries1.stream()
-                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole));
-
-        Map<TeachTypeEnum, List<CourseScheduleTeacherSalary>> ct2 = courseScheduleTeacherSalaries2.stream()
-                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole));
-
-        //交换两节课的主教、助教
-        if (Objects.nonNull(ct1.get(TeachTypeEnum.BISHOP))) {
-            courseSchedule1.setActualTeacherId(ct1.get(TeachTypeEnum.BISHOP).get(0).getUserId());
-        } else {
-            courseSchedule1.setActualTeacherId(null);
-        }
-        if (Objects.nonNull(ct2.get(TeachTypeEnum.BISHOP))) {
-            courseSchedule2.setActualTeacherId(ct2.get(TeachTypeEnum.BISHOP).get(0).getUserId());
-        } else {
-            courseSchedule2.setActualTeacherId(null);
-        }
-        List<CourseScheduleTeacherSalary> ct1t = ct1.get(TeachTypeEnum.TEACHING);
-        if (CollectionUtils.isEmpty(ct1t)) {
-            courseSchedule1.setTeachingTeacherIdList(null);
-        } else {
-            List<Integer> collect = ct1t.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
-            collect.stream().distinct();
-            courseSchedule1.setTeachingTeacherIdList(collect);
-        }
-        List<CourseScheduleTeacherSalary> ct2t = ct2.get(TeachTypeEnum.TEACHING);
-        if (CollectionUtils.isEmpty(ct2t)) {
-            courseSchedule2.setTeachingTeacherIdList(null);
-        } else {
-            List<Integer> collect = ct2t.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
-            collect.stream().distinct();
-            courseSchedule2.setTeachingTeacherIdList(collect);
-        }
         courseSchedule1.setId(courseScheduleId2);
         courseSchedule2.setId(courseScheduleId1);
         List<CourseSchedule> courseSchedules = new ArrayList<>();

+ 42 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -221,15 +221,53 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void updateVipGiveCourse(Long vipGroupId) {
 		List<VipGroupGiveCourseSortDto> vipGroupSortCourseByGroup = courseScheduleStudentPaymentDao.findVipGroupSortCourseByGroup(vipGroupId.toString());
 		Map<BigDecimal, Long> expectPriceCountMap = vipGroupSortCourseByGroup.stream()
 				.collect(Collectors.groupingBy(VipGroupGiveCourseSortDto::getExpectPrice, Collectors.counting()));
-		BigDecimal zero = new BigDecimal(0);
-		int zeroPriceNum = expectPriceCountMap.get(zero).intValue();
-		if(zeroPriceNum<=0){
+		BigDecimal zero = new BigDecimal("0.00");
+		Long zeroPriceNum = expectPriceCountMap.get(zero);
+		if(Objects.isNull(zeroPriceNum)||zeroPriceNum<=0){
 			return;
 		}
-		
+
+		List<CourseScheduleStudentPayment> needUpdatePayments=new ArrayList<>();
+
+		List<VipGroupGiveCourseSortDto> zeroExpectPricePayments = vipGroupSortCourseByGroup.stream()
+				.filter(vipGroupGiveCourseSortDto -> vipGroupGiveCourseSortDto.getExpectPrice().compareTo(zero)==0)
+				.collect(Collectors.toList());
+		Map<Long, List<VipGroupGiveCourseSortDto>> courseIdPaymentMap = zeroExpectPricePayments.stream()
+				.collect(Collectors.groupingBy(VipGroupGiveCourseSortDto::getId));
+		vipGroupSortCourseByGroup.sort(Comparator.comparing(VipGroupGiveCourseSortDto::getCourseStartTime).reversed());
+		for (int i=0;i<vipGroupSortCourseByGroup.size();i++) {
+			if(i>zeroExpectPricePayments.size()-1){
+				return;
+			}
+
+			VipGroupGiveCourseSortDto vipGroupGiveCourseSortDto=vipGroupSortCourseByGroup.get(i);
+
+			int j=0;
+			for (Map.Entry<Long, List<VipGroupGiveCourseSortDto>> longListEntry : courseIdPaymentMap.entrySet()) {
+				if(j>i){
+					break;
+				}
+				j++;
+
+				for (VipGroupGiveCourseSortDto groupGiveCourseSortDto : longListEntry.getValue()) {
+					if(!vipGroupGiveCourseSortDto.getId().equals(groupGiveCourseSortDto.getId())
+							&&!vipGroupGiveCourseSortDto.getTeachMode().equals(groupGiveCourseSortDto.getTeachMode())){
+						throw new BizException("不支持将不同教学形式的课程调整的赠送课时后");
+					}
+					if(!vipGroupGiveCourseSortDto.getId().equals(groupGiveCourseSortDto.getId())){
+						needUpdatePayments.add(new CourseScheduleStudentPayment(vipGroupGiveCourseSortDto.getId(),groupGiveCourseSortDto.getCourseScheduleId()));
+						needUpdatePayments.add(new CourseScheduleStudentPayment(groupGiveCourseSortDto.getId(),vipGroupGiveCourseSortDto.getCourseScheduleId()));
+					}
+				}
+			}
+		}
+		if(!CollectionUtils.isEmpty(needUpdatePayments)){
+			courseScheduleStudentPaymentDao.batchUpdate(needUpdatePayments);
+		}
 	}
 }

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

@@ -253,7 +253,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	public boolean leave(Integer userId, Long courseScheduleId, String remark) {
 		
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);

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

@@ -929,7 +929,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(studentPaymentNum.equals(classGroup.getExpectStudentNum())&&updateVipStatus){
 			classGroup.setStudentNum(studentPaymentNum);
 			classGroup.setDelFlag(0);
-			vipGroup.setStatus(VipGroupStatusEnum.APPLYING_END);
+			vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
 			createVipGroupCourseScheInfo(vipGroupId,classGroup);
 			vipGroupDao.update(vipGroup);
 		}
@@ -2137,6 +2137,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		classGroupService.updateClassGroupInfo(classGroup.getId());
 
+		courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
 
 		ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
 		imFeignService.groupJoin(new ImGroupModel(classGroup.getId().toString(),

+ 6 - 3
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -52,6 +52,7 @@
         <result column="sign_out_status_" property="signOutStatus"/>
         <result column="seal_class_id_" property="sealClassId"/>
         <result column="total_student_num_" property="totalStudentNum"/>
+        <result column="expect_student_num_" property="expectStudentNum"/>
         <result column="teacher_role_" property="teacherRole" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="attendance_status_" property="attendanceStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="complaint_status_" property="complaintStatus"/>
@@ -442,18 +443,19 @@
             cs.class_date_,
             CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
             CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.actual_teacher_id_,
             cs.status_,
             cs.student_num_,
             cs.leave_student_num_,
             cg.student_num_ total_student_num_,
-            su.username_ teacher_name_,
+            su.real_name_ teacher_name_,
             ta.sign_in_status_ attendance_status_,
             s.name_ school_name_
         FROM
             course_schedule cs
             LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
-            LEFT JOIN sys_user su ON cs.teacher_id_=su.id_
-            LEFT JOIN teacher_attendance ta ON cs.id_=ta.class_group_id_ AND ta.teacher_id_=cs.teacher_id_
+            LEFT JOIN sys_user su ON cs.actual_teacher_id_=su.id_
+            LEFT JOIN teacher_attendance ta ON cs.id_=ta.class_group_id_ AND ta.teacher_id_=cs.actual_teacher_id_
             LEFT JOIN school s ON cs.schoole_id_=s.id_
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
@@ -539,6 +541,7 @@
             cs.status_,
             csts.user_id_ actual_teacher_id_,
             csts.teacher_role_,
+            cg.expect_student_num_,
             cs.schoole_id_,
             s.name_ school_name_,
             if(ta.sign_in_status_ IS NULL,0,1) sign_in_status_,

+ 41 - 3
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -86,6 +86,42 @@
 			</if>
 		</set> WHERE id_ = #{id} 
 	</update>
+
+	<update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment">
+		<foreach collection="courseScheduleStudentPayments" item="courseScheduleStudentPayment" separator=";">
+			UPDATE course_schedule_student_payment
+			<set>
+				<if test="courseScheduleStudentPayment.userId != null">
+					user_id_ = #{courseScheduleStudentPayment.userId},
+				</if>
+				<if test="courseScheduleStudentPayment.courseScheduleId != null">
+					course_schedule_id_ = #{courseScheduleStudentPayment.courseScheduleId},
+				</if>
+				<if test="courseScheduleStudentPayment.groupType != null">
+					group_type_ = #{courseScheduleStudentPayment.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+				</if>
+				<if test="courseScheduleStudentPayment.musicGroupId != null">
+					music_group_id_ = #{courseScheduleStudentPayment.musicGroupId},
+				</if>
+				update_time_ = NOW(),
+				<if test="courseScheduleStudentPayment.settlementTime != null">
+					settlement_time_ = #{courseScheduleStudentPayment.settlementTime},
+				</if>
+				<if test="courseScheduleStudentPayment.expectPrice != null">
+					expect_price_ = #{courseScheduleStudentPayment.expectPrice},
+				</if>
+				<if test="courseScheduleStudentPayment.actualPrice != null">
+					actual_price_ = #{courseScheduleStudentPayment.actualPrice},
+				</if>
+				<if test="courseScheduleStudentPayment.createTime != null">
+					create_time_ = #{courseScheduleStudentPayment.createTime},
+				</if>
+				<if test="courseScheduleStudentPayment.classGroupId != null">
+					class_group_id_ = #{courseScheduleStudentPayment.classGroupId},
+				</if>
+			</set> WHERE id_ = #{courseScheduleStudentPayment.id}
+		</foreach>
+	</update>
 	
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
@@ -236,16 +272,18 @@
 	<resultMap id="VipGroupGiveCourseSortDto" type="com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto" extends="CourseScheduleStudentPayment">
 		<result property="courseStartTime" column="course_start_time_"/>
 		<result property="courseEndTime" column="course_end_time_"/>
+		<result property="teachMode" column="teach_mode_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 	</resultMap>
 	<select id="findVipGroupSortCourseByGroup" resultMap="VipGroupGiveCourseSortDto">
 		SELECT
 			 cssp.*,
-			 CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_
+			 cs.teach_mode_,
+			 CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
 			 CONCAT(cs.class_date_,' ',cs.end_class_time_) course_end_time_
 		FROM course_schedule_student_payment cssp
 			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
-		WHERE cssp.music_group_id_=#{groupId} AND cssp.group_type_='VIP' AND course_start_time_ &gt; NOW()
-		ORDER BY course_start_time_
+		WHERE cssp.music_group_id_=#{groupId} AND cssp.group_type_='VIP'
+		AND CONCAT(cs.class_date_,' ',cs.start_class_time_) &gt; NOW()
 	</select>
 
 	<delete id="deleteStudentCourseSchedule">

+ 31 - 3
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -129,6 +129,12 @@
     <delete id="delete">
 		DELETE FROM student_attendance WHERE id_ = #{id} 
 	</delete>
+    <delete id="deleteByCourseSchedules">
+        DELETE FROM student_attendance WHERE course_schedule_id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </delete>
 
     <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">
         <result property="classGroupId" column="class_group_id_"/>
@@ -360,9 +366,15 @@
         AND cssp.course_schedule_id_ = #{courseScheduleId}
     </select>
     <select id="countStudentAttendenceNum" resultType="int">
-        SELECT COUNT(*) FROM student_attendance sa
-        WHERE course_schedule_id_ = #{courseScheduleId}
-        AND (update_time_!='1970-01-01 00:00:00' OR update_time_ IS NULL)
+        SELECT
+            COUNT( sa.user_id_ )
+        FROM
+            student_attendance sa
+            LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+        WHERE
+            sa.create_time_ &gt; DATE_ADD( CONCAT( cs.class_date_, ' ', cs.start_class_time_ ), INTERVAL - 4 HOUR )
+            AND sa.course_schedule_id_ = #{courseScheduleId}
+            AND (sa.update_time_!='1970-01-01 00:00:00' OR sa.update_time_ IS NULL)
     </select>
     <select id="countStudentAttendancesByCourses" resultType="java.util.Map">
         SELECT
@@ -378,4 +390,20 @@
         GROUP BY
             course_schedule_id_
     </select>
+    <select id="countCourseLeaveStudentNumWithFourHoursAgo" resultType="java.util.Map">
+        SELECT
+            sa.course_schedule_id_ AS 'key',
+            COUNT( DISTINCT sa.user_id_ ) AS 'value'
+        FROM
+            student_attendance sa
+            LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+        WHERE
+            sa.status_ = 'LEAVE'
+            AND sa.create_time_ &lt; DATE_ADD( CONCAT( cs.class_date_, ' ', cs.start_class_time_ ), INTERVAL -#{hours} HOUR )
+            AND sa.course_schedule_id_ IN
+            <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+                #{courseScheduleId}
+            </foreach>
+            GROUP BY sa.course_schedule_id_
+    </select>
 </mapper>

+ 2 - 5
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -336,12 +336,9 @@
     </select>
 
     <select id="findOrdersByStatus" resultMap="StudentPaymentOrder">
-        SELECT *
-        FROM student_payment_order
+        SELECT * FROM student_payment_order
         WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-          AND payment_channel_ =
-              #{paymentChannel}
-        LIMIT 100
+        AND payment_channel_ = #{paymentChannel} LIMIT 20
     </select>
 
     <!-- 查询支付中超时订单 -->

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

@@ -640,8 +640,8 @@
             AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
         </if>
     </sql>
-    <select id="queryPageName" resultMap="TeacherBasicDto">
-        SELECT su.id_,su.real_name_ FROM teacher t
+    <select id="queryPageName" resultMap="Teacher">
+        SELECT su.id_,su.real_name_,su.avatar_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         WHERE su.del_flag_ != 1
         <include refid="queryPageNameSql"/>

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

@@ -315,8 +315,7 @@
             AND vg.courses_expire_date_ &gt;= DATE_FORMAT(NOW(),'%Y%m%d')
             AND vg.courses_start_date &gt; NOW()
             AND (select count(1) as num from student_payment_order where vg.id_ = music_group_id_ AND user_id_=#{userId} AND status_='SUCCESS') = 0
-            AND vg.organ_id_ = #{organId}
-            AND (vg.student_id_list_ IS NULL or FIND_IN_SET(#{userId}, vg.student_id_list_))
+            AND (vg.organ_id_ = #{organId} OR FIND_IN_SET(#{userId}, vg.student_id_list_))
             <if test="subjectId!=null">
                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
             </if>

+ 3 - 16
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -15,11 +15,9 @@ import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -68,12 +66,14 @@ public class TeacherCourseScheduleController extends BaseController {
         }
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
         SysConfig sysConfigVip = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
+        SysConfig studentAttendanceAfterTimeConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
         List<CourseScheduleDto> teacherCourseSchedulesWithDate = scheduleService.getTeacherCourseSchedulesWithDate(user.getId(),date,type);
         Map<String,Object> result = new HashMap<>();
         result.put("rows",teacherCourseSchedulesWithDate);
-        result.put("appealDaysRange",1);
+        result.put("appealHoursRange",4);
         result.put("enableStudentAttendanceTimeRange",sysConfig.getParanValue(Integer.class));
         result.put("enableStudentAttendanceTimeRangeVip",sysConfigVip.getParanValue(Integer.class));
+        result.put("joinRoomBeforeTime",studentAttendanceAfterTimeConfig.getParanValue(Integer.class));
         return succeed(result);
     }
 
@@ -154,19 +154,6 @@ public class TeacherCourseScheduleController extends BaseController {
         if(Objects.isNull(classDateAdjustDto.getClassGroupId())){
             classDateAdjustDto.setClassGroupId(oldCourseSchedule.getClassGroupId());
         }
-        Date now=new Date();
-        if(DateUtils.isSameDay(now,oldCourseSchedule.getClassDate())){
-            return failed("不能调整今天的课程");
-        }
-        Date tomorrow = DateUtil.addDays1(now, 1);
-        if(DateUtils.isSameDay(tomorrow,oldCourseSchedule.getClassDate())){
-            Calendar calendar=Calendar.getInstance();
-            calendar.setTime(now);
-            System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
-            if(calendar.get(Calendar.HOUR_OF_DAY)>22){
-                return failed("当前时间不可对此课程进行课程调整");
-            }
-        }
         List<CourseSchedule> courseSchedules=new ArrayList<>();
         courseSchedules.add(classDateAdjustDto);
         scheduleService.courseAdjust(courseSchedules);

+ 2 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

@@ -4,14 +4,12 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -88,7 +86,7 @@ public class TeacherController extends BaseController {
 
     @ApiOperation(value = "获取分部所有老师")
     @GetMapping("/findTeachers")
-    @PreAuthorize("@pcs.hasPermissions('teacher/findTeachers')")
+    @PreAuthorize("@pcs.hasPermissions('teacher/findTeachers','system')")
     public HttpResponseResult findTeachers(String organId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
@@ -143,7 +141,7 @@ public class TeacherController extends BaseController {
 
     @ApiOperation(value = "分页获取教师名称编号列表")
     @GetMapping("/queryNameList")
-    @PreAuthorize("@pcs.hasPermissions('teacher/queryNameList')")
+    @PreAuthorize("@pcs.hasPermissions('teacher/queryNameList', 'system', 'education')")
     public HttpResponseResult queryPageName(TeacherNameQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {

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

@@ -32,7 +32,7 @@ public class UploadFileController extends BaseController {
 	private UploadFileService uploadFileService;
 
 	@PostMapping(value = "uploadFile")
-	@PreAuthorize("@pcs.hasPermissions('uploadFile')")
+	@PreAuthorize("@pcs.hasPermissions('uploadFile','system')")
 	public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
 		try {
 			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {

+ 12 - 4
mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java

@@ -12,10 +12,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
 import java.util.Objects;
@@ -65,4 +63,14 @@ public class EducationCourseScheduleController extends BaseController {
         queryInfo.setOrganIdList(employee.getOrganIdList());
         return succeed(scheduleService.getCourseSchedulesWithDateByEdu(queryInfo));
     }
+
+    @ApiOperation(value = "课时交换")
+    @PostMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
+        if(Objects.isNull(courseScheduleId1)||Objects.isNull(courseScheduleId2)){
+            return failed("请指定课程!");
+        }
+        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
+        return succeed();
+    }
 }

+ 4 - 4
mec-web/src/main/java/com/ym/mec/web/controller/education/ImController.java

@@ -27,7 +27,7 @@ public class ImController extends BaseController {
 
     @ApiOperation(value = "获取教务所有聊天群组")
     @GetMapping("/queryEmployeeGroups")
-    @PreAuthorize("@pcs.hasPermissions('im/queryEmployeeGroups')")
+    @PreAuthorize("@pcs.hasPermissions('im/queryEmployeeGroups','system')")
     public Object queryEmployeeGroups(String search){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null){
@@ -38,7 +38,7 @@ public class ImController extends BaseController {
 
     @ApiOperation(value = "获取当前教务通讯录列表")
     @GetMapping("/queryGroupStudents")
-    @PreAuthorize("@pcs.hasPermissions('im/queryGroupStudents')")
+    @PreAuthorize("@pcs.hasPermissions('im/queryGroupStudents','system')")
     public Object queryGroupStudents(String search){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null){
@@ -49,7 +49,7 @@ public class ImController extends BaseController {
 
     @ApiOperation(value = "根据群编号,获取群组基本信息")
     @GetMapping("/findGroupById")
-    @PreAuthorize("@pcs.hasPermissions('im/findGroupById')")
+    @PreAuthorize("@pcs.hasPermissions('im/findGroupById','system')")
     public Object findGroupById(Integer groupId){
         if(null == groupId){
             return failed("参数校验错误");
@@ -59,7 +59,7 @@ public class ImController extends BaseController {
 
     @ApiOperation(value = "根据群编号,获取群组所有成员基本信息")
     @GetMapping("/findGroupUsers")
-    @PreAuthorize("@pcs.hasPermissions('im/findGroupUsers')")
+    @PreAuthorize("@pcs.hasPermissions('im/findGroupUsers','system')")
     public Object findGroupUsers(Integer groupId) {
         if (groupId == null) {
             return failed("参数校验错误");