浏览代码

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

yonge 4 年之前
父节点
当前提交
87cf611404
共有 42 个文件被更改,包括 606 次插入202 次删除
  1. 1 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  2. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 70 38
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  5. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  6. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  7. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  8. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentNoStartCoursesDto.java
  9. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  10. 17 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  11. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  13. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  14. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java
  15. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  16. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  17. 7 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  18. 8 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  19. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesMessageServiceImpl.java
  20. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  21. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  22. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java
  23. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  24. 34 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  25. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  26. 123 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  27. 18 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  28. 19 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  29. 35 30
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  30. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  31. 6 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  32. 11 1
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  33. 20 6
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  34. 11 7
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  35. 5 17
      mec-im/src/main/java/com/ym/controller/RoomController.java
  36. 9 0
      mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java
  37. 31 31
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  38. 2 2
      mec-im/src/main/java/com/ym/service/RoomService.java
  39. 3 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  40. 24 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java
  41. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  42. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

+ 1 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java

@@ -13,7 +13,7 @@ public class SysUserRole {
 	public static Integer EDUCATIONAL_TEACHER = 4;
 	//运营主管
 	public static Integer OPERATION_EXECUTIVE = 5;
-	//招生主管
+	//招生主管(意见反馈)
 	public static Integer ADMISSIONS_DIRECTOR = 6;
 	//教学主任、乐队指导
 	public static Integer DEAN_OF_STUDIES = 7;

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

@@ -277,7 +277,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @describe 获取老师陪练课班级
      */
-    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId);
+    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
 
     /**
      * 根据老师编号列表获取小课数量
@@ -294,7 +294,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @describe 获取老师vip课班级
      */
-    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId);
+    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
 
     /**
      * 根据合奏班编号列表,获取单技班名称列表

+ 70 - 38
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -92,26 +92,26 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     List<CourseSchedule> findMusicGroupAllCourseSchedules(@Param("musicGroupId") String musicGroupId,
-                                                       @Param("groupType") String groupType);
+                                                          @Param("groupType") String groupType);
 
     /**
-     * @describe 获取教师在指定时间的前一节课程
-     * @author Joburgess
-     * @date 2020.10.21
      * @param startClassTime:
      * @param teacherId:
      * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     * @describe 获取教师在指定时间的前一节课程
+     * @author Joburgess
+     * @date 2020.10.21
      */
     CourseSchedule getTeacherPrevCourseWithStartTime(@Param("startClassTime") Date startClassTime,
                                                      @Param("teacherId") Integer teacherId);
 
     /**
-     * @describe 获取教师在指定时间前有签到的课程
-     * @author Joburgess
-     * @date 2020.10.21
      * @param startClassTime:
      * @param teacherId:
      * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     * @describe 获取教师在指定时间前有签到的课程
+     * @author Joburgess
+     * @date 2020.10.21
      */
     CourseSchedule getTeacherAttendanceCourseBeforeStartTime(@Param("startClassTime") Date startClassTime,
                                                              @Param("teacherId") Integer teacherId);
@@ -146,29 +146,29 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                     @Param("userIds") List<Integer> userIds);
 
     /**
+     * @param classGroupId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 获取班级上未开始的课程
      * @author Joburgess
      * @date 2020.11.05
-     * @param classGroupId:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
     List<CourseSchedule> getClassGroupNotStartCourse(@Param("classGroupId") Long classGroupId);
 
     /**
+     * @param classGroupId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 获取班级上的课程
      * @author qnc99
      * @date 2020/12/8 0008
-     * @param classGroupId:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
     List<CourseSchedule> getClassGroupCourses(@Param("classGroupId") Long classGroupId);
 
     /**
+     * @param courseIds:
+     * @return java.util.List<java.lang.Long>
      * @describe 统计课程上被合课程的数量
      * @author qnc99
      * @date 2020/12/8 0008
-     * @param courseIds:
-     * @return java.util.List<java.lang.Long>
      */
     List<Map<Long, Long>> countCourseMergeCourseNum(@Param("courseIds") List<Long> courseIds);
 
@@ -699,7 +699,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param status
      * @return
      */
-    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId,@Param("status") CourseStatusEnum status);
+    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("status") CourseStatusEnum status);
 
     /**
      * @param courseScheduleId: 课程编号
@@ -1071,7 +1071,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<String, Long>> countTotalCourseScheduleNum(@Param("vipGroupIds") List<String> vipGroupIds, @Param("groupType") String groupType);
 
     int countTotalCourseScheduleNumWithGroup(@Param("groupId") String groupId,
-                                                        @Param("groupType") String groupType);
+                                             @Param("groupType") String groupType);
 
     /**
      * 获取当前课时(已上)
@@ -1297,7 +1297,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     CourseSchedule queryStudentContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
-                                       @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
+                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
      * 获取当前课程,下一次连堂课
@@ -1307,7 +1307,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     CourseSchedule queryTeacherContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
-                                       @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
+                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
      * 获取单节课时长
@@ -1372,13 +1372,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<Long, String>> queryTeacherName(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     /**
-     * @describe 统计学生在指定周期内的vip课数量
-     * @author Joburgess
-     * @date 2020.04.28
      * @param studentIds:
      * @param startTime:
      * @param endTime:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
+     * @describe 统计学生在指定周期内的vip课数量
+     * @author Joburgess
+     * @date 2020.04.28
      */
     List<Map<Integer, Long>> countStudentVipCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                             @Param("startTime") Date startTime,
@@ -1387,24 +1387,24 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     /**
-     * @describe 统计学生在指定周期内的付费网管课数量
-     * @author Joburgess
-     * @date 2020.05.06
      * @param studentIds:
      * @param startTime:
      * @param endTime:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Long>>
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Long>>
+     * @describe 统计学生在指定周期内的付费网管课数量
+     * @author Joburgess
+     * @date 2020.05.06
      */
     List<Map<Integer, Long>> countStudentPayPracticeCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                                     @Param("startTime") Date startTime,
                                                                     @Param("endTime") Date endTime);
 
     /**
+     * @param studentIds:
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
      * @describe 统计学生在未来的vip课数量
      * @author Joburgess
      * @date 2020.04.28
-     * @param studentIds:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
      */
     List<Map<Integer, Long>> countStudentVipCoursesInFuture(@Param("studentIds") List<Integer> studentIds);
 
@@ -1423,13 +1423,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * @param courseId:
-     * @param isLock:    冻结状态:1、冻结,0、正常
+     * @param isLock:   冻结状态:1、冻结,0、正常
      * @return int
      * @describe 通过班级编号更改课程的冻结状态
      * @author zouxuan
      */
     int batchUpdateLockByCourseIds(@Param("courseId") List<Long> courseId,
-                              @Param("isLock") Integer isLock);
+                                   @Param("isLock") Integer isLock);
 
 
     /**
@@ -1547,6 +1547,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取用户课程信息
+     *
      * @param studentIds
      * @param groupType
      * @return
@@ -1557,6 +1558,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取上一次连堂课
+     *
      * @param classGroupId
      * @param startTime
      * @param teacherId
@@ -1569,6 +1571,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程组已结束最后一节课时间
+     *
      * @param vipGroupIds
      * @return
      */
@@ -1576,6 +1579,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程状态列表
+     *
      * @param courseScheduleIds
      * @return
      */
@@ -1583,6 +1587,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取第一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1591,6 +1596,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取最后一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1599,12 +1605,14 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 重置上课学生人数
+     *
      * @param courseScheduleId
      */
     void resetStudentNum(@Param("courseScheduleId") List<Long> courseScheduleId);
 
     /**
      * 获取当前班级列表的所有未开始的课程
+     *
      * @param classGroupIds
      * @param teacherId
      * @param teacherRole
@@ -1614,6 +1622,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 当前班级是否有未开始的课程
+     *
      * @param classGroupIds
      * @param teacherId
      * @return
@@ -1623,6 +1632,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 查询班级未上的课程类型对应的时长
+     *
      * @param classGroupIdList
      * @return
      */
@@ -1630,34 +1640,36 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     /**
+     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseRepeatCheckDto>
      * @describe 获取检测课程冲突需要的数据
      * @author qnc99
      * @date 2020/11/25 0025
-     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseRepeatCheckDto>
      */
     List<CourseRepeatCheckDto> getCourseRepeatCheckInfos();
 
-    CourseSchedule getLock (long courseId);
+    CourseSchedule getLock(long courseId);
 
     /**
+     * @param courseId:
+     * @return int
      * @describe 统计指定课程合并的课程数量
      * @author qnc99
      * @date 2020/11/27 0027
-     * @param courseId:
-     * @return int
      */
     int countCourseMergeTime(@Param("courseId") Long courseId);
 
     /**
      * 获取班级剩余的课程类型和课程数量
-     * @author zouxuan
+     *
      * @param classGroupId
      * @return
+     * @author zouxuan
      */
     List<Map<String, Integer>> querySubCourseNumMap(@Param("classGroupId") Integer classGroupId);
 
     /**
      * 获取所选班级最大剩余课时
+     *
      * @param classGroupIds
      * @return
      */
@@ -1665,28 +1677,48 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 根据学员和班级列表获取未开始的课程列表
-     * @author zouxuan
+     *
      * @param classGroupIds
      * @param studentIds
      * @return
+     * @author zouxuan
      */
     List<Long> queryStudentNotStartByClassIdsAndStudentIds(@Param("classGroupIds") List<Integer> classGroupIds,
                                                            @Param("studentIds") List<Integer> studentIds);
 
     /**
      * 获取没有学员的课程
-     * @author zouxuan
+     *
      * @param courseIds
      * @return
+     * @author zouxuan
      */
     List<Long> findNoStudentCourseIds(@Param("courseIds") List<Long> courseIds);
 
     /**
-     *
      * 根据班级编号获取未开始的主课
-     * @author zouxuan
+     *
      * @param classGroupIds
      * @return
+     * @author zouxuan
      */
     int findNoStartMasterCourseNum(@Param("classGroupIds") List<Integer> classGroupIds);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     *
+     * @param params
+     * @return
+     * @author zouxuan
+     */
+    List<StudentNoStartCoursesDto> queryStudentNoStartCourse(Map<String, Object> params);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     *
+     * @param params
+     * @return
+     * @author zouxuan
+     */
+    int countStudentNoStartCourse(Map<String, Object> params);
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -98,7 +99,7 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      * @param studentIds
      * @return
      */
-    List<Map<Integer, Integer>> queryStudentSubTotalCourseTime(@Param("studentIds") Set<Integer> studentIds, @Param("musicGroupId") String musicGroupId);
+    List<Map<Integer, BigDecimal>> queryStudentSubTotalCourseTime(@Param("studentIds") Set<Integer> studentIds, @Param("musicGroupId") String musicGroupId);
 
     /**
      * 获取学员关联的每种课程类型的剩余可排课时长

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
 import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
 import com.ym.mec.biz.dal.dto.StudentServeCourseHomeworkDto;
+import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;

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

@@ -38,7 +38,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      * @param studentId: 学员编号
      * @return int
      */
-    int deleteByStudent(@Param("studentId") Integer studentId);
+    int deleteByStudent(@Param("studentId") Integer studentId,
+                        @Param("monday") String monday);
 
     List<StudentExercisesSituationDto> findExercisesSituations(Map<String, Object> params);
     int countExercisesSituations(Map<String, Object> params);
@@ -105,5 +106,7 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      * @return java.util.List<com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation>
      */
     List<StudentExtracurricularExercisesSituation> findWeekServiceWithStudents(@Param("monday") String monday,
+                                                                               @Param("teacherId") Integer teacherId,
                                                                                @Param("studentIds") List<Integer> studentIds);
+
 }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java

@@ -63,14 +63,15 @@ public class MusicGroupStudentsDto{
     private String isNewStudentStr;
 
     private String nextPaymentDateStr;
+
     @ApiModelProperty(value = "剩余可排课时长",required = false)
-    private Integer subTotalCourseTime;
+    private BigDecimal subTotalCourseTime;
 
-    public Integer getSubTotalCourseTime() {
+    public BigDecimal getSubTotalCourseTime() {
         return subTotalCourseTime;
     }
 
-    public void setSubTotalCourseTime(Integer subTotalCourseTime) {
+    public void setSubTotalCourseTime(BigDecimal subTotalCourseTime) {
         this.subTotalCourseTime = subTotalCourseTime;
     }
 

+ 61 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentNoStartCoursesDto.java

@@ -0,0 +1,61 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentNoStartCoursesDto{
+
+    @ApiModelProperty(value = "教师名称",required = false)
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程名称",required = false)
+    private String name;
+
+    @ApiModelProperty(value = "课程日期",required = false)
+    private String classDate;
+
+    @ApiModelProperty(value = "课程开始时间",required = false)
+    private String startClassTime;
+
+    @ApiModelProperty(value = "课程结束时间",required = false)
+    private String endClassTime;
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
@@ -37,6 +39,8 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "班级类型",required = false)
     private ClassGroupTypeEnum classType;
 
+    private CourseSchedule.CourseScheduleType courseType;
+
     @ApiModelProperty(value = "乐团ID",required = false)
     private String musicGroupId;
 
@@ -95,6 +99,14 @@ public class TeacherAttendanceDto {
 
     private Integer enableStudentAttendanceTimeRangeVip;
 
+    public CourseSchedule.CourseScheduleType getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
+        this.courseType = courseType;
+    }
+
     public int getEnableAssignHomework() {
         return enableAssignHomework;
     }

+ 17 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -102,15 +102,26 @@ public class TeacherAttendance {
 	@ApiModelProperty(value = "考勤申述凭证")
 	private String url;
 
-	@ApiModelProperty(value = "设备号")
-	private String deviceNum;
+	@ApiModelProperty(value = "签到设备号")
+	private String signInDeviceNo;
 
-	public String getDeviceNum() {
-		return deviceNum;
+	@ApiModelProperty(value = "签退设备号")
+	private String signOutDeviceNo;
+
+	public String getSignInDeviceNo() {
+		return signInDeviceNo;
+	}
+
+	public void setSignInDeviceNo(String signInDeviceNo) {
+		this.signInDeviceNo = signInDeviceNo;
+	}
+
+	public String getSignOutDeviceNo() {
+		return signOutDeviceNo;
 	}
 
-	public void setDeviceNum(String deviceNum) {
-		this.deviceNum = deviceNum;
+	public void setSignOutDeviceNo(String signOutDeviceNo) {
+		this.signOutDeviceNo = signOutDeviceNo;
 	}
 
 	public String getUrl() {

+ 15 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java

@@ -12,7 +12,9 @@ public class StudentQueryInfo extends QueryInfo {
 
     private String groupType;
 
-    private Integer userId;
+    private Integer teacherId;
+
+    private Integer studentId;
 
     private List<String> organIdList;
 
@@ -24,12 +26,20 @@ public class StudentQueryInfo extends QueryInfo {
         this.groupType = groupType;
     }
 
-    public Integer getUserId() {
-        return userId;
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
     }
 
-    public void setUserId(Integer userId) {
-        this.userId = userId;
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
     }
 
     public List<String> getOrganIdList() {

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

@@ -235,7 +235,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
      * @describe 获取老师所在班级列表
      */
-    List<TeacherClassGroupDto> findTeacherClassGroups(String type);
+    List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status);
 
     /**
      * @Author: Joburgess

+ 9 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -191,10 +191,17 @@ public interface StudentManageService {
 
     /**
      * 获取教务老师关联的学员列表
-     * @param groupType
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo queryInfo);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     * @param queryInfo
      * @return
      */
-    PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo groupType);
+    PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo);
 
     /**
      * 乐团管理--乐团详情--学员列表--获取学员可排课时长

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -40,4 +41,6 @@ public interface StudentServeService {
      */
     Set<Long> getTeacherServeCourseIds(Integer teacherId);
 
+    void updateExercisesSituation(Date date, List<Integer> studentIds, Integer teacherId);
+
 }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java

@@ -37,7 +37,8 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @return void
 	 */
 	void addTeacherAttendanceSignOut(Long courseScheduleId,
-									Integer userId);
+									Integer userId,
+									 String deviceNum);
 
 
 
@@ -51,7 +52,7 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param courseScheduleId:
 	 * @return void
 	 */
-	void addTeacherAttendanceSignIn(Long firstCourseId,Integer userId, Long courseScheduleId);
+	void addTeacherAttendanceSignIn(Long firstCourseId,Integer userId, Long courseScheduleId,String deviceNum);
 
 	/**
 	 * 获取教师个人的签到记录

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

@@ -1354,7 +1354,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<TeacherClassGroupDto> findTeacherClassGroups(String type) {
+    public List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (Objects.isNull(user)) {
             throw new BizException("请登录");
@@ -1367,13 +1367,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         switch (type) {
             case "VIP":
-                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue());
+                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue(),status);
                 break;
             case "MUSIC_GROUP":
                 teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(user.getId().longValue());
                 break;
             case "PRACTICE":
-                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue());
+                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue(),status);
                 break;
             default:
                 throw new BizException("课程类型错误");
@@ -1632,7 +1632,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 Map<Integer, Integer> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-//                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
+                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
                 });
             }
         }

+ 7 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -14,6 +14,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.ImPrivateMessage;
 import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.mec.im.ImFeignService;
@@ -29,11 +30,6 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseReview4EduQueryInfo;
 import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.CourseReviewService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -98,6 +94,9 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
     @Autowired
     private VipGroupDao vipGroupDao;
 
+    @Autowired
+    private StudentServeService studentServeService;
+
     @Override
     public BaseDAO<Integer, CourseScheduleReview> getDAO() {
         return courseScheduleReviewDao;
@@ -607,6 +606,9 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
                         userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
             }
+
+            List<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+            studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, courseSchedule.getActualTeacherId());
         }
 
         return courseHomework;

+ 8 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -308,7 +308,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
-        currentCourseDetail.setAttendanceRange(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
+		currentCourseDetail.setAttendanceRange(CourseScheduleType.VIP.equals(currentCourseDetail.getCourseType())?Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE_VIP)):Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
         currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
         return currentCourseDetail;
     }
@@ -5247,9 +5247,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		allCourseIds.addAll(courseMergeInfo.getMergeCourseIds());
 		List<CourseSchedule> allCourses = courseScheduleDao.findByCourseScheduleIds(allCourseIds);
 		int courseTypeNum = allCourses.stream().map(CourseSchedule::getType).collect(Collectors.toSet()).size();
-		if(courseTypeNum>1){
-			throw new BizException("课程合并仅支持同课程类型");
-		}
+//		if(courseTypeNum>1){
+//			throw new BizException("课程合并仅支持同课程类型");
+//		}
 		for (CourseSchedule courseSchedule : allCourses) {
 			if(Objects.nonNull(courseSchedule.getNewCourseId())){
 				throw new BizException("存在已合并课程");
@@ -5269,13 +5269,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			courseSchedule.setNote("课程合并");
 		}
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(allCourseIds);
-//		Map<Long, Set<Integer>> courseStudentIdsMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getUserId, Collectors.toSet())));
+		Map<Long, Set<Integer>> courseStudentIdsMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getUserId, Collectors.toSet())));
 		Set<Integer> allStudentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
 		if(courseScheduleStudentPayments.size()!=allStudentIds.size()){
 			throw new BizException("所选课程中学员重复");
 		}
 
-
 		List<CourseSchedule> courseSchedules=new ArrayList<>();
 		courseMergeInfo.setNewCourseId(courseMergeInfo.getId());
 		courseSchedules.add(courseMergeInfo);
@@ -5290,9 +5289,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 			//课程信息变更
 			courseSchedule.setNewCourseId(courseMergeInfo.getId());
-			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
-			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
-			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
+//			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
+//			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
+//			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
 //			courseSchedule.setActualTeacherId(courseMergeInfo.getActualTeacherId());
 //			courseSchedule.setClassGroupId(courseMergeInfo.getClassGroupId());
 //			courseSchedule.setSchoolId(courseMergeInfo.getSchoolId());

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

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -45,6 +46,8 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesMessage> getDAO() {
@@ -135,6 +138,7 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_STUDENT_REPLY_PUSH,
 					userMap, null, 0, 9+notifyUrl, "TEACHER", extracurricularExercises.getTitle(), user.getUsername());
 		}
+		studentServeService.updateExercisesSituation(extracurricularExercises.getCreateTime(), new ArrayList<>(Arrays.asList(extracurricularExercisesReply.getUserId())), extracurricularExercises.getTeacherId());
 	}
 
 	@Override

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -51,6 +52,8 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	private StudentDao studentDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesReply> getDAO() {
@@ -165,6 +168,8 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		extracurricularExercises.setCompletedNum(submitStudentNum);
 		extracurricularExercisesDao.update(extracurricularExercises);
 
+		studentServeService.updateExercisesSituation(extracurricularExercises.getCreateTime(), Arrays.asList(extracurricularExercisesReply.getUserId()), extracurricularExercises.getTeacherId());
+
 		if(push){
 			Map<Integer, String> userMap = new HashMap<>();
 			userMap.put(extracurricularExercises.getTeacherId(), extracurricularExercises.getTeacherId().toString());

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

@@ -278,7 +278,8 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         teacherAttendance.setSignOutStatus(isInScore?YesOrNoEnum.YES:YesOrNoEnum.NO);
         teacherAttendance.setCurrentClassTimes(classTimes + 1);
         teacherAttendance.setRemark(studentAttendanceInfos.getRemark());
-        teacherAttendance.setDeviceNum(studentAttendanceInfos.getDeviceNum());
+        teacherAttendance.setSignInDeviceNo(studentAttendanceInfos.getDeviceNum());
+        teacherAttendance.setSignOutDeviceNo(studentAttendanceInfos.getDeviceNum());
         teacherAttendance.setSignOutAttachments(studentAttendanceInfos.getSignOutAttachments());
         if (Objects.nonNull(teacherAttendance.getId())) {
             teacherAttendanceDao.update(teacherAttendance);

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java

@@ -12,10 +12,7 @@ import com.ym.mec.biz.dal.entity.StudentCourseHomeworkReply;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
-import com.ym.mec.biz.service.StudentCourseHomeworkReplyService;
-import com.ym.mec.biz.service.StudentCourseHomeworkService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -44,6 +41,8 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 	private SysConfigDao sysConfigDao;
 	@Autowired
 	private SysMessageService sysMessageService;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, StudentCourseHomeworkReply> getDAO() {
@@ -111,6 +110,8 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 
 		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_TEACHER_REPLY_PUSH,
 				userMap, null, 0, 3+notifyUrl, "STUDENT", user.getRealName(), courseSchedule.getName());
+
+		studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), Arrays.asList(studentCourseHomework.getUserId()), courseSchedule.getActualTeacherId());
 		super.insert(bean);
 	}
 

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -62,6 +63,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     private StudentDao studentDao;
     @Autowired
     private SubjectDao subjectDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
@@ -146,6 +149,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             }
         }
 
+        studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(bean.getUserId())), courseSchedule.getTeacherId());
+
 //        CourseHomework temp = courseHomeworkService.get(courseHomework.getId());
 //        if (temp.getExpectNum().equals(courseHomework.getCompletedNum())) {
         Integer userId = bean.getUserId();

+ 34 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -12,6 +16,7 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.SysConfigService;
 
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -423,11 +428,13 @@ public class StudentManageServiceImpl implements StudentManageService {
             //退团的学生
             List<Integer> quitUserIds = dataList.stream().filter(e -> e.getStudentStatus().equals("QUIT")).map(MusicGroupStudentsDto::getUserId).collect(Collectors.toList());
             Set<Integer> studentIds = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-            Map<Integer,Integer> subTotalCourseTimeMap = MapUtil.convertIntegerMap(musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTime(studentIds,musicGroupId));
+            Map<Integer, BigDecimal> subTotalCourseTimeMap = MapUtil.convertIntegerMap(musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTime(studentIds,musicGroupId));
+            for (MusicGroupStudentsDto musicGroupStudentsDto : dataList) {
+                musicGroupStudentsDto.setSubTotalCourseTime(subTotalCourseTimeMap.get(musicGroupStudentsDto.getUserId()));
+            }
             if (quitUserIds.size() > 0) {
                 List<MusicGroupQuit> quits = musicGroupQuitDao.getQuits(queryInfo.getMusicGroupId(), quitUserIds);
                 for (MusicGroupStudentsDto musicGroupStudentsDto : dataList) {
-                    musicGroupStudentsDto.setSubTotalCourseTime(subTotalCourseTimeMap.get(musicGroupStudentsDto.getUserId()));
                     for (MusicGroupQuit quit : quits) {
                         if (!quit.getUserId().equals(musicGroupStudentsDto.getUserId())) continue;
                         musicGroupStudentsDto.setQuitReason(quit.getReason());
@@ -574,7 +581,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         student.setTeacherId(student.getTeacherId());
         studentService.upSet(student);
         if (new Integer(2).equals(student.getServiceTag())) {
-            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId());
+            LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+            LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId(), monDayDate.toString());
         }
         return userId;
     }
@@ -673,7 +682,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         }
         PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
-        queryInfo.setUserId(sysUser.getId());
+        queryInfo.setTeacherId(sysUser.getId());
         MapUtil.populateMap(params, queryInfo);
         params.put("offset", pageInfo.getOffset());
         Integer count = 0;
@@ -696,6 +705,27 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
+    public PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            throw new BizException("用户信息获取失败");
+        }
+        PageInfo<StudentNoStartCoursesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        queryInfo.setTeacherId(sysUser.getId());
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        Integer count = courseScheduleDao.countStudentNoStartCourse(params);
+        List<StudentNoStartCoursesDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = courseScheduleDao.queryStudentNoStartCourse(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
     public Map<Integer, Integer> queryStudentSubTotalCourseTimes(Integer userId,String musicGroupId) {
         return MapUtil.convertIntegerMap(musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(userId,musicGroupId));
     }

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

@@ -274,7 +274,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         Student student = studentDao.getLocked(userId);
         if (student == null) {
-            throw new BizException("查询学生信息失败");
+            throw new BizException("您已登录超时,请重新登录后再次报名");
         }
 
         StudentRegistration hasReg = getByPhoneAndMusicGroupId(studentRegistration.getMusicGroupId(), studentRegistration.getParentsPhone());

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

@@ -426,7 +426,7 @@ public class StudentServeServiceImpl implements StudentServeService {
             return;
         }
 
-        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), studentIds);
+        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), null, studentIds);
         Map<String, StudentExtracurricularExercisesSituation> codeServeMap = weekServiceWithStudents.stream().collect(Collectors.toMap(StudentExtracurricularExercisesSituation::getStuAndTeaCode, s -> s, (s1, s2) -> s1));
 
         Set<String> newCodes = results.stream().map(StudentExtracurricularExercisesSituation::getStuAndTeaCode).collect(Collectors.toSet());
@@ -449,6 +449,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                 if(StringUtils.isNotBlank(result.getCourseIds())){
                     courseIds.addAll(Arrays.stream(result.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toList()));
                 }
+                s.setServeType(result.getServeType());
                 s.setCourseIds(StringUtils.join(courseIds, ","));
                 s.setExpectExercisesNum(courseIds.size());
                 updateService.add(s);
@@ -463,12 +464,132 @@ public class StudentServeServiceImpl implements StudentServeService {
     }
 
     @Override
+    public void updateExercisesSituation(Date date,List<Integer> studentIds, Integer teacherId) {
+        LocalDate nowDate = LocalDateTime.ofInstant(date.toInstant(), DateUtil.zoneId).toLocalDate();
+        if(Objects.isNull(date)){
+            nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        }
+
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+
+        Map<Integer, List<StudentServeCourseHomeworkDto>> studentHomeworkMap=new HashMap<>();
+        Map<Integer, List<ExtracurricularExercisesReply>> studentExercisesMap=new HashMap<>();
+
+        List<StudentServeCourseHomeworkDto> allStudentHomeworks = studentCourseHomeworkDao.findStudentHomeworkWithCourseDateRange(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(studentIds));
+        List<StudentServeCourseHomeworkDto> studentHomeworksTmp =new ArrayList<>();
+        for (StudentServeCourseHomeworkDto studentHomework : allStudentHomeworks) {
+            LocalDate courseStartLocalDate = LocalDateTime.ofInstant(studentHomework.getCourseStartTime().toInstant(), DateUtil.zoneId).toLocalDate();
+            switch (courseStartLocalDate.getDayOfWeek()){
+                case SATURDAY:
+                    if(DateUtil.daysBetween(studentHomework.getCourseStartTime(), studentHomework.getHomeworkCreateTime())<4){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+                case SUNDAY:
+                    if(DateUtil.daysBetween(studentHomework.getCourseStartTime(), studentHomework.getHomeworkCreateTime())<3){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+                default:
+                    LocalDate homeworkCreateTime = LocalDateTime.ofInstant(studentHomework.getHomeworkCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
+                    if(courseStartLocalDate.get(DateUtil.weekFields.weekOfYear())==homeworkCreateTime.get(DateUtil.weekFields.weekOfYear())){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+            }
+        }
+        if(!CollectionUtils.isEmpty(studentHomeworksTmp)){
+            studentHomeworkMap = studentHomeworksTmp.stream()
+                    .collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
+        }
+
+
+        List<ExtracurricularExercisesReply> allStudentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(studentIds));
+        if(!CollectionUtils.isEmpty(allStudentExercises)){
+            studentExercisesMap = allStudentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
+        }
+
+        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), teacherId, studentIds);
+        if(!CollectionUtils.isEmpty(weekServiceWithStudents)){
+            return;
+        }
+
+        for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
+            List<StudentServeCourseHomeworkDto> studentHomeworks = studentHomeworkMap.get(weekServiceWithStudent.getStudentId());
+            if(!CollectionUtils.isEmpty(studentHomeworks)){
+                weekServiceWithStudent.setActualExercisesNum(1);
+                long replyNum = studentHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())).count();
+                weekServiceWithStudent.setExercisesReplyNum(replyNum>0?1:0);
+                long haveSubmitTimes = studentHomeworks.stream().filter(e -> Objects.nonNull(e.getSubmitTime())).count();
+                if(replyNum>0&&haveSubmitTimes>0){
+                    Date lastSubmitTime = studentHomeworks.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(StudentServeCourseHomeworkDto::getSubmitTime)).get().getSubmitTime();
+                    weekServiceWithStudent.setLastSubmitTime(lastSubmitTime);
+                }
+                int exercisesMessageNum=0;
+                int exercisesMessageTimelyNum=0;
+                for (StudentServeCourseHomeworkDto studentHomework : studentHomeworks) {
+                    if(!YesOrNoEnum.YES.equals(studentHomework.getStatus())){
+                        continue;
+                    }
+                    if(!YesOrNoEnum.YES.equals(studentHomework.getIsReplied())){
+                        continue;
+                    }
+                    exercisesMessageNum+=1;
+                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                        exercisesMessageTimelyNum+=1;
+                    }
+                }
+                weekServiceWithStudent.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                weekServiceWithStudent.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
+            }
+
+            List<ExtracurricularExercisesReply> studentExercises = studentExercisesMap.get(weekServiceWithStudent.getStudentId());
+            if(!CollectionUtils.isEmpty(studentExercises)){
+                weekServiceWithStudent.setActualExercisesNum(1);
+                long replyNum = studentExercises.stream().filter(e -> e.getStatus()==1).count();
+                if(weekServiceWithStudent.getExercisesReplyNum()<=0){
+                    weekServiceWithStudent.setExercisesReplyNum(replyNum>0?1:0);
+                }
+                long haveSubmitTimes = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).count();
+                if(replyNum>0&&haveSubmitTimes>0){
+                    Date lastSubmitTime = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(ExtracurricularExercisesReply::getSubmitTime)).get().getSubmitTime();
+                    if(Objects.isNull(weekServiceWithStudent.getLastSubmitTime())||lastSubmitTime.after(weekServiceWithStudent.getLastSubmitTime())){
+                        weekServiceWithStudent.setLastSubmitTime(lastSubmitTime);
+                    }
+                }
+                int exercisesMessageNum=0;
+                int exercisesMessageTimelyNum=0;
+                for (ExtracurricularExercisesReply studentHomework : studentExercises) {
+                    if(!new Integer(1).equals(studentHomework.getStatus())){
+                        continue;
+                    }
+                    if(!new Integer(1).equals(studentHomework.getIsReplied())){
+                        continue;
+                    }
+                    exercisesMessageNum+=1;
+                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                        exercisesMessageTimelyNum+=1;
+                    }
+                }
+                if(weekServiceWithStudent.getExercisesMessageNum()<=0){
+                    weekServiceWithStudent.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                }
+                if(weekServiceWithStudent.getExercisesMessageTimelyNum()<=0){
+                    weekServiceWithStudent.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
+                }
+            }
+        }
+        studentExtracurricularExercisesSituationDao.batchUpdate(weekServiceWithStudents);
+    }
+
+    @Override
     public Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIdsStr, Integer teacherId) {
         Map<String, Object> result=new HashMap<>();
 
         Set<Long> teacherServeCourseIds = studentServeService.getTeacherServeCourseIds(teacherId);
         if(teacherServeCourseIds.contains(courseScheduleId)){
-            result.put("enableAssignHomework", 0);
+            result.put("enableAssignHomework", 1);
         }else{
             result.put("enableAssignHomework", 0);
         }

+ 18 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -71,6 +71,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	@Autowired
 	private CourseHomeworkDao courseHomeworkDao;
 
+	@Autowired
+	private StudentServeService studentServeService;
+
 	@Override
 	public BaseDAO<Long, TeacherAttendance> getDAO() {
 		return teacherAttendanceDao;
@@ -277,6 +280,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 						throw new BizException("此课程没有学生");
 					}
 					studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
+					List<Integer> studentIds = studentCourseHomeworks.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
+					studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, teacherAttendance.getTeacherId());
 				}else{
 					courseHomework.setContent(teacherSignOutDto.getCourseHomeworkInfo().getContent());
 					courseHomework.setAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
@@ -295,7 +300,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addTeacherAttendanceSignOut(Long firstCourseId, Integer userId) {
+	public void addTeacherAttendanceSignOut(Long firstCourseId, Integer userId,String deviceNum) {
 		Date date = new Date();
 		//签退
 		CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId);
@@ -335,19 +340,19 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			//不是最后一节课
 			if(i == courseSchedules.size() - 1){
 				if(date.after(endDateTime)){
-					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.YES,schedule,firstCourseId);
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.YES,schedule,firstCourseId,deviceNum);
 				}else {
-					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.NO,schedule,firstCourseId);
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.NO,schedule,firstCourseId,deviceNum);
 				}
 			}else {
-				isBreak = upsetAttendance(userId,startDateTime,endDateTime,YesOrNoEnum.YES,schedule,firstCourseId);
+				isBreak = upsetAttendance(userId,startDateTime,endDateTime,YesOrNoEnum.YES,schedule,firstCourseId,deviceNum);
 			}
 		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addTeacherAttendanceSignIn(Long firstCourseId, Integer userId, Long courseScheduleId) {
+	public void addTeacherAttendanceSignIn(Long firstCourseId, Integer userId, Long courseScheduleId,String deviceNum) {
 		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId.intValue(),0);
 		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseScheduleId);
 		if(Objects.isNull(teacherAttendance)){
@@ -358,9 +363,13 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 			teacherAttendance.setClassGroupId(classGroup.getId());
 			teacherAttendance.setTeacherId(userId);
+			teacherAttendance.setSignInDeviceNo(deviceNum);
 			teacherAttendance.setCurrentScheduleId(firstCourseId);
 			teacherAttendanceDao.insert(teacherAttendance);
 		}else {
+			if(StringUtils.isEmpty(teacherAttendance.getSignInDeviceNo())){
+				teacherAttendance.setSignInDeviceNo(deviceNum);
+			}
 			teacherAttendance.setCurrentScheduleId(firstCourseId);
 			teacherAttendance.setGroupType(classGroup.getGroupType());
 			teacherAttendance.setTeacherId(userId);
@@ -400,7 +409,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		}
 	}
 
-	public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,YesOrNoEnum status,CourseSchedule courseSchedule,Long courseScheduleId){
+	public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,YesOrNoEnum status,CourseSchedule courseSchedule,Long courseScheduleId,String deviceNum){
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseSchedule.getId());
 		Boolean flag = false;
 		Long courseId = teacherAttendanceDao.findFirstSign(courseScheduleId,userId);
@@ -420,8 +429,11 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			teacherAttendance.setSignOutTime(signOutTime);
 			teacherAttendance.setSignInTime(signInTime);
 			teacherAttendance.setCurrentScheduleId(courseScheduleId);
+			teacherAttendance.setSignInDeviceNo(deviceNum);
+			teacherAttendance.setSignOutDeviceNo(deviceNum);
 			teacherAttendanceDao.insert(teacherAttendance);
 		}else {
+			teacherAttendance.setSignOutDeviceNo(deviceNum);
 			teacherAttendance.setSignOutStatus(status);
 			teacherAttendance.setSignOutTime(signOutTime);
 			teacherAttendance.setCurrentScheduleId(courseScheduleId);

+ 19 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -598,6 +598,15 @@
             LEFT JOIN class_group cg ON pg.id_=cg.music_group_id_ AND cg.group_type_='PRACTICE'
         WHERE
             pg.user_id_ = #{teacherId} AND cg.del_flag_ = 0 AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
+            <if test="status == null or status == ''">
+                AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
+            </if>
+            <if test="status == 'NORMAL'">
+                AND pg.group_status_ IN ('APPLYING','NORMAL','LOCK')
+            </if>
+            <if test="status == 'FINISH'">
+                AND pg.group_status_ = 'FINISH'
+            </if>
     </select>
     <select id="findTeacherVipClassGroup" resultMap="TeacherClassGroupDto">
         SELECT
@@ -623,7 +632,16 @@
             LEFT JOIN course_schedule cs ON cg.id_=cs.class_group_id_
             LEFT JOIN school s ON vg.teacher_school_id_ = s.id_
         WHERE
-            vg.user_id_ = #{teacherId} AND vg.group_status_!=7 AND (vg.group_status_ = 2 OR vg.group_status_ = 5)
+            vg.user_id_ = #{teacherId}
+            <if test="status == null or status == ''">
+                AND vg.group_status_ != 7 AND (vg.group_status_ = 2 OR vg.group_status_ = 5)
+            </if>
+            <if test="status == 'NORMAL'">
+                AND vg.group_status_ IN (1,2,5,6)
+            </if>
+            <if test="status == 'FINISH'">
+                AND vg.group_status_ = 4
+            </if>
         GROUP BY
         vg.id_,cg.id_
     </select>

+ 35 - 30
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -383,6 +383,7 @@
         <result property="classId" column="class_id"/>
         <result property="className" column="class_name"/>
         <result property="classType" column="class_type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="courseType" column="course_type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="musicGroupId" column="music_group_id"/>
         <result property="musicGroupName" column="music_group_name"/>
         <result property="schoolId" column="school_id_"/>
@@ -409,6 +410,7 @@
                cg.current_class_times_,
                cg.student_num_,
                cs.type_                                          class_type,
+               cs.type_                                          course_type,
                mg.id_                                            music_group_id,
                mg.name_                                          music_group_name,
                s.id_                                             school_id_,
@@ -458,36 +460,6 @@
         ORDER BY cs.id_
     </select>
 
-
-
-    <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">
-        <result property="classGroupId" column="class_group_id_"/>
-        <result property="studentId" column="student_id_"/>
-        <result property="userName" column="username_"/>
-        <result property="musicGroupId" column="music_group_id_"/>
-        <result property="subjectId" column="subject_id_"/>
-        <result property="subjectName" column="subject_name_"/>
-        <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-    </resultMap>
-
-    <select id="getCurrentCourseStudents" resultMap="studentAttendanceViewUtilEntity">
-        SELECT cgsm.class_group_id_,
-               su.id_  student_id_,
-               su.username_,
-               mg.id_  music_group_id_,
-               s.id_   subject_id_,
-               s.name_ subject_name_,
-               cgsm.status_
-        FROM class_group cg
-                 LEFT JOIN class_group_student_mapper cgsm ON cg.id_ = cgsm.class_group_id_
-                 LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
-                 LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
-                 LEFT JOIN `subject` s ON cg.subject_id_ = s.id_
-        WHERE cgsm.class_group_id_ = #{classID}
-          AND cgsm.status_ != 'QUIT'
-          AND cg.group_type_ = 'MUSIC'
-    </select>
-
     <select id="countStudentInClass" resultType="java.lang.Integer">
         SELECT
         COUNT(class_group_id_)
@@ -3477,4 +3449,37 @@
             new_course_id_
     </select>
 
+    <resultMap id="StudentNoStartCoursesDto" type="com.ym.mec.biz.dal.dto.StudentNoStartCoursesDto">
+        <result property="classDate" column="class_date_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="name" column="name_"/>
+        <result property="teacherName" column="real_name_"/>
+    </resultMap>
+    <select id="queryStudentNoStartCourse" resultMap="StudentNoStartCoursesDto">
+        SELECT cs.name_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,su.real_name_ FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        WHERE cssp.user_id_ = #{studentId} AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW()
+        AND vg.educational_teacher_id_ = #{teacherId}
+        <include refid="global.limit"/>
+    </select>
+    <select id="countStudentNoStartCourse" resultType="int">
+        SELECT COUNT(cssp.course_schedule_id_) FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        WHERE cssp.user_id_ = #{studentId} AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW()
+        AND vg.educational_teacher_id_ = #{teacherId}
+    </select>
 </mapper>

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

@@ -677,7 +677,7 @@
 
     <select id="getStudentHistoryLastCourse" resultMap="com.ym.mec.biz.dal.dao.CourseScheduleDao.CourseSchedule">
 		SELECT cs.* FROM course_schedule_student_payment cssp
-		LEFT JOIN course_schedule cs ON cs.id_=cssp.user_id_
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
 		WHERE cssp.user_id_=#{studentId}
 		  AND cs.class_date_&lt;#{monday}
 		  AND cs.type_=#{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}

+ 6 - 4
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -227,9 +227,10 @@
     </delete>
 
     <select id="queryStudentSubTotalCourseTime" resultType="java.util.Map">
-        SELECT mgpscd.user_id_ 'key',SUM(mgpscd.total_course_minutes_) 'value' FROM music_group_payment_student_course_detail mgpscd
+        SELECT mgpscd.user_id_ 'key',SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+        FROM music_group_payment_student_course_detail mgpscd
         LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
-        WHERE mgpscd.used_course_minutes_ = 0 AND mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ IN
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ IN
         <foreach collection="studentIds" open="(" close=")" item="item" separator=",">
             #{item}
         </foreach>
@@ -237,9 +238,10 @@
     </select>
 
     <select id="queryStudentSubTotalCourseTimes" resultType="java.util.Map">
-        SELECT mgpscd.course_type_ 'key',SUM(mgpscd.total_course_minutes_) 'value' FROM music_group_payment_student_course_detail mgpscd
+        SELECT mgpscd.course_type_ 'key',SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+        FROM music_group_payment_student_course_detail mgpscd
         LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
-        WHERE mgpscd.used_course_minutes_ = 0 AND mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ = #{userId}
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ = #{userId}
         GROUP BY mgpscd.course_type_
     </select>
 </mapper>

+ 11 - 1
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -180,6 +180,9 @@
 	</delete>
 	<delete id="deleteByStudent">
 		DELETE FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
+		<if test="monday!=null and monday!=''">
+			AND monday_=#{monday}
+		</if>
 	</delete>
 
 	<!-- 分页查询 -->
@@ -199,6 +202,8 @@
 		stu.username_ student_name_,
 		tea.real_name_ teacher_name_,
 		o.name_ organ_name_,
+		sees.monday_,
+		sees.sunday_,
 		expect_exercises_num_ expect_exercises_num_,
 		actual_exercises_num_ actual_exercises_num_,
 		<if test="submitStartDate==null or submitEndDate==null">
@@ -436,7 +441,12 @@
 	</select>
 
 	<select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
-		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND student_id_ IN
+		SELECT * FROM student_extracurricular_exercises_situation_
+		WHERE monday_=#{monday}
+		  <if test="teacherId!=null">
+			  AND teacher_id_=#{teacherId}
+		  </if>
+		  AND student_id_ IN
 		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
 			#{studentId}
 		</foreach>

+ 20 - 6
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -814,25 +814,31 @@
     </select>
 
     <select id="queryVipGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
+        SELECT su.id_ user_id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
         vip_group vg
         LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
         LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'VIP' AND cgsm.status_ != 'QUIT'
-        AND vg.educational_teacher_id_ = #{userId}
+        AND vg.educational_teacher_id_ = #{teacherId}
         AND vg.group_status_ IN (0,1,2,5)
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
         GROUP BY cgsm.user_id_
         <include refid="global.limit"/>
     </select>
 
     <select id="queryPracticeGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
+        SELECT su.id_ user_id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
         practice_group pg
         LEFT JOIN class_group_student_mapper cgsm ON pg.id_ = cgsm.music_group_id_
         LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'PRACTICE' AND cgsm.status_ != 'QUIT'
-        AND pg.educational_teacher_id_ = #{userId}
+        AND pg.educational_teacher_id_ = #{teacherId}
         AND pg.group_status_ NOT IN ('FINISH','CANCEL')
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
         GROUP BY cgsm.user_id_
         <include refid="global.limit"/>
     </select>
@@ -841,17 +847,25 @@
         SELECT COUNT(DISTINCT cgsm.user_id_) FROM
         vip_group vg
         LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
+        LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'VIP' AND cgsm.status_ != 'QUIT'
-        AND vg.educational_teacher_id_ = #{userId}
+        AND vg.educational_teacher_id_ = #{teacherId}
         AND vg.group_status_ IN (0,1,2,5)
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
     </select>
 
     <select id="countPracticeGroupStudents" resultType="int">
         SELECT COUNT(DISTINCT cgsm.user_id_) FROM
         practice_group pg
         LEFT JOIN class_group_student_mapper cgsm ON pg.id_ = cgsm.music_group_id_
+        LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'PRACTICE' AND cgsm.status_ != 'QUIT'
-        AND pg.educational_teacher_id_ = #{userId}
+        AND pg.educational_teacher_id_ = #{teacherId}
         AND pg.group_status_ NOT IN ('FINISH','CANCEL')
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
     </select>
 </mapper>

+ 11 - 7
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -34,7 +34,8 @@
         <result column="sign_out_attachments_" property="signOutAttachments"/>
         <result column="sign_out_remark_" property="signOutRemark"/>
         <result column="url_" property="url"/>
-        <result column="device_num_" property="deviceNum"/>
+        <result column="sign_in_device_no_" property="signInDeviceNo"/>
+        <result column="sign_out_device_no_" property="signOutDeviceNo"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -59,12 +60,12 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
         sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_,device_num_)
+        sign_out_remark_,update_attendance_type_,url_,sign_in_device_no_,sign_out_device_no_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
         #{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},
         now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments},#{signOutRemark},
-        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url},#{deviceNum})
+        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url},#{signInDeviceNo},#{signOutDeviceNo})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
@@ -72,7 +73,7 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
         remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_,device_num_)
+        sign_out_remark_,update_attendance_type_,url_,sign_in_device_no_,sign_out_device_no_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -84,7 +85,7 @@
             #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},
             #{teacherAttendance.signOutAttachments},#{teacherAttendance.signOutRemark},
             #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url},
-            #{teacherAttendance.deviceNum})
+            #{teacherAttendance.signInDeviceNo},#{teacherAttendance.signOutDeviceNo})
         </foreach>
     </insert>
 
@@ -164,8 +165,11 @@
             <if test="signOutRemark != null">
                 sign_out_remark_ = #{signOutRemark},
             </if>
-            <if test="deviceNum != null and deviceNum!=''">
-                device_num_ = #{deviceNum},
+            <if test="signInDeviceNo != null and signInDeviceNo != ''">
+                sign_in_device_no_ = #{signInDeviceNo},
+            </if>
+            <if test="signOutDeviceNo != null and signOutDeviceNo != ''">
+                sign_out_device_no_ = #{signOutDeviceNo},
             </if>
         </set>
         WHERE id_ = #{id}

+ 5 - 17
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -35,26 +35,13 @@ public class RoomController{
 
     @RequestMapping(value = "/statusImMsg", method = RequestMethod.POST)
     public Object statusImMsg(ImMsg imMsg){
-//        log.info("statusImMsg body{}:",body);
-        String str = "timestamp=1608175805527" +
-                "&signTimestamp=1608175805527" +
-                "&nonce=1816421725" +
-                "&signature=fa06f0d300687919c8af009d4ad5f1923d753648&appKey=c9kqb3rdc451j" +
-                "&channelType=PERSON&fromUserId=325&toUserId=2109272" +
-                "&msgTimestamp=1608175805490" +
-                "&objectName=RC%3ATxtMsg" +
-                "&content=%7B%22content%22%3A%22%E5%A5%BD%22%7D" +
-                "&sensitiveType=0" +
-                "&source=iOS" +
-                "&msgUID=BMDQ-VM8C-J785-8785:";
-
         return new BaseResponse<>();
     }
 
     @RequestMapping(value = "/leave", method = RequestMethod.POST)
     public Object leaveRoom(@RequestBody RoomStatusNotify roomStatusNotify) throws Exception {
         //成员退出
-        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId());
+        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId(),roomStatusNotify.getDeviceNum());
         return new BaseResponse<>();
     }
 
@@ -80,8 +67,9 @@ public class RoomController{
         log.info("joinRoomStatusNotify: {}",JSONObject.toJSON(roomStatusNotify));
         String roomId = roomStatusNotify.getRoomId();
         String userId = roomStatusNotify.getUserId();
+        String deviceNum = roomStatusNotify.getDeviceNum();
         if(roomStatusNotify.isRequestStatus()){
-            roomService.joinRoomSuccess(roomId, userId);
+            roomService.joinRoomSuccess(roomId, userId,deviceNum);
         }else {
             roomService.joinRoomFailure(roomId, userId);
         }
@@ -97,11 +85,11 @@ public class RoomController{
         switch (notify.getEvent()){
             case 11:
                 //成员加入
-                roomService.joinRoomSuccess(roomId, userId);
+                roomService.joinRoomSuccess(roomId, userId,null);
                 break;
             case 12:
                 //成员退出
-                roomService.leaveRoomSuccess(roomId, userId);
+                roomService.leaveRoomSuccess(roomId, userId,null);
                 break;
         }
     }

+ 9 - 0
mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java

@@ -4,8 +4,17 @@ package com.ym.pojo;
 public class RoomStatusNotify {
 	private String roomId;
 	private String userId;
+	private String deviceNum;
 	private boolean requestStatus;
 
+	public String getDeviceNum() {
+		return deviceNum;
+	}
+
+	public void setDeviceNum(String deviceNum) {
+		this.deviceNum = deviceNum;
+	}
+
 	public String getRoomId() {
 		return roomId;
 	}

+ 31 - 31
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -271,24 +271,23 @@ public class RoomServiceImpl implements RoomService {
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     @Override
-    public void joinRoomSuccess(String roomId,String userId) throws Exception {
+    public void joinRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if(roomMember == null){
             return ;
         }
-        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(joinSuccessKey)){
-            //兼容旧版本,防止重复调用
-            redisTemplate.delete(joinSuccessKey);
-            return;
-        }
-
-        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(leaveSuccessKey)){
-            redisTemplate.delete(leaveSuccessKey);
-        }
-        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
-        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
+//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(joinSuccessKey)){
+//            //兼容旧版本,防止重复调用
+//            redisTemplate.delete(joinSuccessKey);
+//            return;
+//        }
+//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(leaveSuccessKey)){
+//            redisTemplate.delete(leaveSuccessKey);
+//        }
+//        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
+//        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
 
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
@@ -351,10 +350,10 @@ public class RoomServiceImpl implements RoomService {
         msg.setExamSongSwitch(examSong);
         imHelper.publishMessage(userId, roomId, msg);
         log.info("join room success: roomId = {}, userId = {}, role = {}", roomId, userId, roleEnum);
-        signInSuccess(roomMember);
+        signInSuccess(roomMember,deviceNum);
     }
 
-    public void signInSuccess(RoomMember roomMember) {
+    public void signInSuccess(RoomMember roomMember,String deviceNum) {
         String roomId = roomMember.getRid();
         String userId = roomMember.getUid();
         String currentRoomIdKey = roomId + userId;
@@ -373,7 +372,7 @@ public class RoomServiceImpl implements RoomService {
 
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         if(roleEnum == RoleTeacher){
-            teacherAttendanceService.addTeacherAttendanceSignIn(firstCourseId,userIdInt,currentRoomId);
+            teacherAttendanceService.addTeacherAttendanceSignIn(firstCourseId,userIdInt,currentRoomId,deviceNum);
         }else {
             studentAttendanceService.addStudentAttendanceSignIn(firstCourseId,userIdInt,currentRoomId);
         }
@@ -406,30 +405,31 @@ public class RoomServiceImpl implements RoomService {
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     @Override
-    public void leaveRoomSuccess(String roomId,String userId) throws Exception {
+    public void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if(roomMember == null){
             return ;
         }
-        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(leaveSuccessKey)){
-            redisTemplate.delete(leaveSuccessKey);
-            return;
-        }
-        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(joinSuccessKey)){
-            redisTemplate.delete(joinSuccessKey);
-        }
-        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
-        //记录
-        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
+//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(leaveSuccessKey)){
+//            redisTemplate.delete(leaveSuccessKey);
+//            //如果设备号不为空,更新设备号
+//            return;
+//        }
+//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(joinSuccessKey)){
+//            redisTemplate.delete(joinSuccessKey);
+//        }
+//        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
+//        //记录
+//        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
 
         if(roleEnum == RoleTeacher){
             courseScheduleStudentPaymentDao.adjustPlayMidi(firstCourseId,null,null);
             courseScheduleStudentPaymentDao.adjustExamSong(firstCourseId.longValue(),null,null);
-            teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId));
+            teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId),deviceNum);
         }else {
             studentAttendanceService.addStudentAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId));
         }

+ 2 - 2
mec-im/src/main/java/com/ym/service/RoomService.java

@@ -20,9 +20,9 @@ public interface RoomService {
 
     Boolean kickMember(String roomId) throws Exception;
 
-    void joinRoomSuccess(String roomId,String userId) throws Exception;
+    void joinRoomSuccess(String roomId,String userId,String deviceNum) throws Exception;
 
-    void leaveRoomSuccess(String roomId,String userId) throws Exception;
+    void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception;
 
     //only teacher
     Boolean display(String roomId, int type, String uri, String userId) throws Exception;

+ 3 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -35,6 +36,8 @@ public class StudentCourseHomeworkController extends BaseController {
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @ApiOperation(value = "提交作业")
     @PostMapping(value = "/add",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

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

@@ -1,12 +1,17 @@
 package com.ym.mec.student.controller;
 
+import com.netflix.discovery.converters.Auto;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercisesMessage;
-import com.ym.mec.biz.dal.entity.StudentCourseHomeworkReply;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao;
+import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
+import com.ym.mec.biz.dal.dao.StudentCourseHomeworkDao;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
 import com.ym.mec.biz.service.StudentCourseHomeworkReplyService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,6 +21,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * @Author Joburgess
@@ -30,9 +37,19 @@ public class StudentCourseHomeworkReplyController extends BaseController {
     @Autowired
     private StudentCourseHomeworkReplyService studentCourseHomeworkReplyService;
     @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
+    @Autowired
     private ExtracurricularExercisesMessageService extracurricularExercisesMessageService;
     @Resource
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentServeService studentServeService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
 
     @ApiOperation(value = "新增回复")
     @PostMapping("/add")
@@ -53,9 +70,14 @@ public class StudentCourseHomeworkReplyController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        Integer teacherId = null;
         if(!studentCourseHomeworkReply.isExtra()){
             studentCourseHomeworkReply.setUserId(sysUser.getId());
             studentCourseHomeworkReplyService.insert(studentCourseHomeworkReply);
+            StudentCourseHomework studentCourseHomework = studentCourseHomeworkDao.get(studentCourseHomeworkReply.getStudentCourseHomeworkId());
+            CourseSchedule courseSchedule = courseScheduleDao.get(studentCourseHomework.getCourseScheduleId());
+            teacherId=courseSchedule.getActualTeacherId();
+            studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(sysUser.getId())), teacherId);
         }else{
             ExtracurricularExercisesMessage extracurricularExercisesMessage=new ExtracurricularExercisesMessage();
             extracurricularExercisesMessage.setExtracurricularExercisesReplyId(studentCourseHomeworkReply.getStudentCourseHomeworkId());

+ 2 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java

@@ -45,8 +45,8 @@ public class ClassGroupController extends BaseController {
 
     @ApiOperation(value = "教师关联班级获取")
     @GetMapping("/findTeacherClassGroups")
-    public Object findTeacherClassGroups(@ApiParam(value = "课程类型:MUSIC_GROUP,VIP,PRACTICE", required = true)String type){
-        return succeed(classGroupService.findTeacherClassGroups(type));
+    public Object findTeacherClassGroups(String type,String status){
+        return succeed(classGroupService.findTeacherClassGroups(type,status));
     }
 
     @ApiOperation(value = "获取教师班级详情界面头部信息")

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

@@ -47,4 +47,10 @@ public class EduStudentStudentController extends BaseController {
         return succeed(studentManageService.queryGroupStudents(queryInfo));
     }
 
+    @ApiOperation(value = "获取当前教务老师关联的课程组上该学员的所有剩余课程")
+    @GetMapping("studentManage/queryStudentNoStartCourse")
+    public Object queryStudentNoStartCourse(StudentQueryInfo queryInfo){
+        return succeed(studentManageService.queryStudentNoStartCourse(queryInfo));
+    }
+
 }