瀏覽代碼

1、课程调整时排除自动补签记录
2、删除请假时班级学生状态更新代码
3、小课过期课程调整生成后加入学生缴费信息
4、vip课点名添加开课前时间限制
5、学生端可购买小课获取条件调整
6、学员请假课程调整限制

Joburgess 5 年之前
父節點
當前提交
915327d39a

+ 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

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

@@ -171,4 +171,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;
     }

+ 52 - 50
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;
     }
@@ -1343,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);
             }
@@ -1388,13 +1413,35 @@ 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)){
@@ -1593,51 +1640,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<>();

+ 28 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -226,7 +226,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 		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);
+		BigDecimal zero = new BigDecimal("0.00");
 		int zeroPriceNum = expectPriceCountMap.get(zero).intValue();
 		if(zeroPriceNum<=0){
 			return;
@@ -237,18 +237,37 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 		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++) {
-			VipGroupGiveCourseSortDto vipGroupGiveCourseSortDto=vipGroupSortCourseByGroup.get(i);
-			VipGroupGiveCourseSortDto zeroVipGroupGiveCoursePayment = zeroExpectPricePayments.get(i);
-			if(!vipGroupGiveCourseSortDto.getId().equals(zeroVipGroupGiveCoursePayment)
-					&&!vipGroupGiveCourseSortDto.getTeachMode().equals(zeroVipGroupGiveCoursePayment.getTeachMode())){
-				throw new BizException("不支持将不同教学形式的课程调整的赠送课时后");
+			if(i>zeroExpectPricePayments.size()-1){
+				return;
 			}
-			if(!vipGroupGiveCourseSortDto.getId().equals(zeroVipGroupGiveCoursePayment)){
-				needUpdatePayments.add(new CourseScheduleStudentPayment(vipGroupGiveCourseSortDto.getId(),zeroVipGroupGiveCoursePayment.getCourseScheduleId()));
-				needUpdatePayments.add(new CourseScheduleStudentPayment(zeroVipGroupGiveCoursePayment.getId(),vipGroupGiveCourseSortDto.getCourseScheduleId()));
+
+			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);

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

@@ -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_,

+ 38 - 2
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" >
@@ -246,8 +282,8 @@
 			 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">

+ 16 - 0
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -378,4 +378,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 - 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"/>

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

@@ -68,12 +68,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);
     }
 

+ 1 - 3
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;
@@ -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) {

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