Selaa lähdekoodia

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx-2023-04-13

zouxuan 2 vuotta sitten
vanhempi
commit
c75dc35fa5
100 muutettua tiedostoa jossa 5112 lisäystä ja 162 poistoa
  1. 1 1
      audio-analysis/src/main/java/com/yonge/audio/AudioAnalysisServerApplication.java
  2. 3 1
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  3. 4 0
      cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java
  4. 22 0
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java
  5. 31 0
      cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  7. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseHomeworkDao.java
  8. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  9. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStatisticsDao.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java
  11. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java
  12. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  13. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImUserFriendDao.java
  14. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LessonExaminationDao.java
  15. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  16. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDao.java
  17. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDetailDao.java
  18. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonTrainingDetailMapper.java
  19. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  20. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkListDto.java
  21. 338 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java
  22. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java
  23. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/HomeworkStat.java
  24. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationDetailDto.java
  25. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto.java
  26. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto1.java
  27. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto2.java
  28. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSaveDto.java
  29. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSubmitDto.java
  30. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupExtracurricularSummaryDto.java
  31. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java
  32. 138 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentHomeworkRecordDto.java
  33. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto.java
  34. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto1.java
  35. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto.java
  36. 38 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto1.java
  37. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.java
  38. 152 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDetailDto.java
  40. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebCourseHomeworkListDto.java
  41. 45 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseHomework.java
  42. 103 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercises.java
  43. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LessonExamination.java
  44. 82 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java
  45. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExamination.java
  46. 82 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java
  47. 81 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java
  48. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  49. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EHomeWorkStatus.java
  50. 45 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ELessonTrainingType.java
  51. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupStatusEnum.java
  52. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/HardLevelEnum.java
  53. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  54. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/StandardEnum.java
  55. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeworkQueryInfo.java
  56. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExtraExercilseQueryInfo.java
  57. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExtraExercilseReplyQueryInfo.java
  58. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo.java
  59. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo1.java
  60. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo2.java
  61. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentLessonExaminationQueryDto.java
  62. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentLessonExaminationQueryInfo.java
  63. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  64. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseHomeworkService.java
  65. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesReplyService.java
  66. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesService.java
  67. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  68. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImUserFriendService.java
  69. 38 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LessonExaminationService.java
  70. 45 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  71. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java
  72. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonExaminationDetailService.java
  73. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonExaminationService.java
  74. 62 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java
  75. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java
  76. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java
  77. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  78. 10 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  79. 79 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  80. 139 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  81. 162 61
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  82. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  83. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  84. 238 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LessonExaminationServiceImpl.java
  85. 544 33
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  86. 254 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  87. 74 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java
  88. 154 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java
  89. 198 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  90. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  91. 94 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  92. 23 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  93. 8 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  94. 3 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  95. 33 2
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  96. 78 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  97. 22 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml
  98. 155 9
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  99. 44 2
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  100. 49 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

+ 1 - 1
audio-analysis/src/main/java/com/yonge/audio/AudioAnalysisServerApplication.java

@@ -22,7 +22,7 @@ import com.ym.mec.common.config.LocalFastJsonHttpMessageConverter;
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableFeignClients("com.ym.mec")
-@MapperScan("com.ym.mec.biz.dal.dao")
+@MapperScan({"com.ym.mec.biz.dal.dao","com.ym.mec.biz.dal.mapper"})
 @ComponentScan(basePackages = { "com.yonge.netty", "com.ym.mec", "com.yonge.log" })
 @Configuration
 @EnableSwagger2Doc

+ 3 - 1
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -341,7 +341,7 @@ public class UserChannelContext {
 			amplitude = (int) Signals.norm(samples);
 		}else if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.DECIBELS.getCode())){
 			amplitude = (int) Signals.decibels(samples);
-			amplitude = amplitude >= 50 ? amplitude : 0;
+			amplitude = amplitude >= 60 ? amplitude : 0;
 		}
 		//float rms = Signals.rms(samples);
 		
@@ -911,6 +911,7 @@ public class UserChannelContext {
 		boolean isContinue = true;
 		int firstPeakIndex = -1;
 		int peakSize = 0;
+		
 		for (int i = 1; i < chunkAmplitudeList.size(); i++) {
 			if (Math.abs(chunkAmplitudeList.get(i) - chunkAmplitudeList.get(i - 1)) < hardLevel.getAmplitudeThreshold()) {
 				continue;
@@ -939,6 +940,7 @@ public class UserChannelContext {
 			tempo = true;
 		}else{
 			tempo = false;
+			LOGGER.debug("有多个波峰");
 		}
 		
 		if (tempo) {

+ 4 - 0
cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java

@@ -34,4 +34,8 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 	List<SysNewsInformation> queryBySubType(@Param("subType") Integer subType,@Param("memo") String memo);
 
     Boolean countStudentAttendanceError(@Param("startTime") String startTime, @Param("userId") Integer userId);
+
+    Integer queryHomework(Integer teacherId);
+
+    int queryPractice(@Param("userId") Integer userId, @Param("date") String date);
 }

+ 22 - 0
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java

@@ -17,6 +17,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -80,6 +82,9 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType
                 }else if(sni.getTitle().equals("学员考勤异常")){
                     //当前老师是否有学员考勤异常
                     sni.setRedDot(informationDao.countStudentAttendanceError(startTime,userId));
+                } else if (sni.getTitle().equals("训练列表")) {
+                    //训练列表
+                    sni.setRedDot(queryHomework(userId));
                 }
     		}
             e.setInformationList(list);
@@ -92,6 +97,23 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType
         return treeMenus;
     }
 
+    private Boolean queryHomework(Integer userId) {
+        int courseIdCount = informationDao.queryHomework(userId);
+        if (courseIdCount > 0) {
+            return true;
+        }
+
+        LocalDate now = LocalDate.now();
+        // 获取周一
+        LocalDate monday = now.minusDays(now.getDayOfWeek().getValue() - 1);
+        int practiceIdCount = informationDao.queryPractice(userId,monday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+
+        if (practiceIdCount > 0) {
+            return true;
+        }
+        return false;
+    }
+
     private List<SysNewsType> getChildren(SysNewsType rootMenu, List<SysNewsType> allMenus) {
         List<SysNewsType> childrenList = allMenus.stream().filter(e -> e.getParentId().equals(rootMenu.getId()))
                 .map(menu -> menu.setChildren(getChildren(menu, allMenus)))

+ 31 - 0
cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -327,4 +327,35 @@
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
 		AND (ta.sign_out_status_ IS NOT NULL OR ta.sign_in_status_ IS NOT NULL)
 	</select>
+
+	<select id="queryHomework" resultType="java.lang.Integer">
+        SELECT count( csts.course_schedule_id_)
+        FROM course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+        LEFT JOIN student_extracurricular_exercises_situation_ se ON se.teacher_id_ = csts.user_id_
+        left join lesson_examination le on le.course_schedule_id_ = csts.course_schedule_id_
+        left join teacher_attendance ta on ta.course_schedule_id_ = csts.course_schedule_id_
+        WHERE csts.user_id_ = #{teacherId}
+            AND cs.class_date_ = date_format(now(),'%Y-%m-%d')
+        AND FIND_IN_SET(cs.id_, se.course_ids_) and le.id_ is null
+        AND se.serve_type_ = 'HOMEWORK'
+        and ta.sign_out_status_ is null and ta.sign_in_status_ is not null
+    </select>
+
+	<select id="queryPractice" resultType="int">
+        SELECT
+            count(distinct sees.music_group_id_)
+        from
+            student_extracurricular_exercises_situation_ sees
+                LEFT JOIN
+            music_group mg
+            on mg.id_ = sees.music_group_id_
+        WHERE
+            sees.teacher_id_ = #{userId}
+          and sees.serve_type_ = 'EXERCISE'
+          and sees.actual_exercises_num_ = 0
+          and sees.monday_ = #{date}
+
+
+    </select>
 </mapper>

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

@@ -868,4 +868,6 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     Boolean hasConvertCourse(@Param("classIdList") List<Integer> classIdList);
 
     void addClassTimes(@Param("classGroupId") Integer classGroupId, @Param("num") Integer num);
+
+    List<ClassGroup> queryByIds(@Param("classIds") List<Integer> classIds);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.CourseHomeworkListDto;
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
 import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
@@ -74,4 +75,12 @@ public interface CourseHomeworkDao extends BaseDAO<Long, CourseHomework> {
 	 * @return
 	 */
 	List<TeacherHomeworkListDto> findByIdList(@Param("homeworkIdList") List<Integer> homeworkIdList);
+
+    void updateFinishNum(@Param("courseHomeworkId") Long courseHomeworkId);
+
+    CourseHomework getByCourseScheduleId(@Param("courseScheduleId") Integer courseScheduleId);
+
+    List<CourseHomeworkListDto> findEndHomework();
+
+    void updatePushFlag(@Param("ids") List<Long> ids);
 }

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

@@ -1981,4 +1981,16 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return boolean
      */
     int checkCourseIsSettlementReport(@Param("courseScheduleId") Long courseScheduleId);
+
+    /**
+     * 老师端练习列表
+     *
+     * @param queryInfo
+     * @param courseIds
+     * @return
+     */
+    List<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherServeHomeworkDetailV2(@Param(
+        "param") Map<String, Object> param, @Param("courseIds") List<Long> courseIds);
+
+    int countTeacherServeHomeworkDetailV2(@Param("param") Map<String, Object> params, @Param("courseIds") List<Long> courseIds);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStatisticsDao.java

@@ -23,4 +23,12 @@ public interface CourseScheduleStatisticsDao extends BaseDAO<Long, CourseSchedul
 
     //更新服务指标
     void updateCourseService(@Param("courseIds") String courseIds, @Param("serviceFlag") int serviceFlag);
+
+    void updateNum(@Param("courseScheduleId") Long courseScheduleId,
+                   @Param("teacherId") Integer teacherId,
+                   @Param("studentIds") List<Integer> studentIds);
+
+    void updateLastSubmitTime(@Param("courseScheduleId") Long courseScheduleId,
+                              @Param("teacherId") Integer teacherId,
+                              @Param("userId") Integer userId);
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.ExtracurricularExercisesHomeworkListDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
@@ -65,4 +66,14 @@ public interface ExtracurricularExercisesDao extends BaseDAO<Long, Extracurricul
      * @return
      */
     List<TeacherHomeworkListDto> findByIdList(@Param("exercisesIdList") List<Integer> exercisesIdList);
+
+    int countTeacherExtraHomeworkDetailV2(Map<String, Object> params);
+
+    List<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherExtraHomeworkDetailV2(Map<String, Object> params);
+
+    void updateFinishNum(@Param("courseHomeworkId") Long courseHomeworkId);
+
+    List<ExtracurricularExercises> findEndHomework();
+
+    void updatePushFlag(@Param("ids") List<Long> ids);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.dto.StudentServiceDetailDto;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.dto.StudentServiceHomeworkDto;
 import com.ym.mec.common.dal.BaseDAO;
@@ -133,4 +134,11 @@ public interface ExtracurricularExercisesReplyDao extends BaseDAO<Long, Extracur
     List<EduHomeworkCardDto> countEduHomeworkSubjectStudentNumWithMusicGroup(@Param("groupId") String groupId,
                                                                              @Param("startTime") Date startTime,
                                                                              @Param("endTime") Date endTime);
+
+    ExtracurricularExercisesReply getByExtraIdAndUserId(@Param("extraId") Long extraId, @Param("userId") Long userId);
+
+    /**
+     * 未完成的课外作业
+     */
+    List<ExtracurricularExercisesReply> queryNotDoneHomeworkList();
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java

@@ -38,4 +38,8 @@ public interface ImGroupDao extends BaseDAO<String, ImGroup> {
     void updateMemberNum();
 
     List<NameDto> queryNameByIds(@Param("ids") String ids);
+
+    List<ImGroup> queryByUserIdV2(@Param("userId") Integer userId, @Param("search") String search, @Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId, @Param("classType") String classType);
+
+    List<ImGroupMemberDto> queryMemberByIdV2(@Param("imGroupId") String imGroupId, @Param("search") String search, @Param("subjectId") Integer subjectId, @Param("vipFlag") Boolean vipFlag);
 }

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

@@ -41,4 +41,6 @@ public interface ImUserFriendDao extends BaseDAO<Long, ImUserFriend> {
 	void updateNullNickName();
 
     List<NameDto> queryNameByIds(@Param("ids") String ids, @Param("userId") Integer userId);
+
+    List<ImUserFriendDto> queryFriendListByUserIdV2(@Param("userId") Integer userId, @Param("search") String search, @Param("musicGroupId") String musicGroupId, @Param("subjectId") Integer subjectId, @Param("vipFlag") Boolean vipFlag);
 }

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LessonExaminationDao.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto1;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto2;
+import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.LessonExamination;
+import com.ym.mec.biz.dal.entity.Subject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 进度评测表(LessonExamination)表数据库访问层
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:27
+ */
+public interface LessonExaminationDao extends BaseMapper<LessonExamination> {
+
+    int insertBatch(@Param("entities") List<LessonExaminationSaveDto> entities);
+
+    List<LessonExaminationResultDto> queryPage(Map<String, Object> params);
+
+    int findCount(Map<String, Object> params);
+
+    List<LessonExaminationResultDto1> queryPageByStudent(Map<String, Object> params);
+
+    int findCountByStudent(Map<String, Object> params);
+
+    LessonExaminationResultDto1 getOneByStudent(@Param("userId") Integer userId, @Param("lessonExaminationId") Long lessonExaminationId);
+
+    void updateTrainingNum(@Param("lessonExaminationId") Long lessonExaminationId);
+
+    void updateStandardNum(@Param("lessonExaminationId") Long lessonExaminationId);
+
+    List<LessonExamination> queryEndList();
+
+    List<Subject> querySubject(@Param("lessonExaminationId") Long lessonExaminationId);
+}
+

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -194,4 +195,27 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
     List<EduHomeworkCardDto> countHomeworkSubjectStudentInfoWithMusicGroup(@Param("groupId") String groupId,
                                                                            @Param("startTime") Date startTime,
                                                                            @Param("endTime") Date endTime);
+
+    List<StudentCourseHomework> findByCourseScheduleIds(@Param("courseScheduleIds") List<Integer> courseScheduleIds);
+
+    /**
+     * 根据学员id和课程作业id查询学员课程作业
+     *
+     * @param studentIds       学员id
+     * @param courseHomeworkId 课程作业id
+     * @param type             课程作业类型
+     */
+    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> findByStudentIdsAndCourseScheduleId(
+        @Param("studentIds") List<Integer> studentIds,
+        @Param("courseHomeworkId") Long courseHomeworkId,
+        @Param("type") ELessonTrainingType type);
+
+    List<StudentCourseHomework> findStudentCourseHomeworkByCourse(@Param("query") StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query);
+
+    int queryNotSuccessHomeworkList(Integer userId);
+
+    StudentCourseHomework getHomeworkByUserIdAndCourseHomeworkId(@Param("userId") Long userId, @Param(
+        "courseHomeworkId") Long courseHomeworkId);
+
+    int queryNotSuccessExtraHomeworkList2(@Param("userId") Integer userId);
 }

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDao.java

@@ -0,0 +1,42 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
+import com.ym.mec.biz.dal.entity.StudentLessonExamination;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 学生进度评测表(StudentLessonExamination)表数据库访问层
+ *
+ * @author zx
+ * @since 2023-04-03 18:21:30
+ */
+public interface StudentLessonExaminationDao extends BaseMapper<StudentLessonExamination> {
+
+    int insertBatch(@Param("entities") List<StudentLessonExamination> entities);
+
+    List<StudentLessonExaminationDto> queryPage(Map<String, Object> params);
+
+    int findCount(Map<String, Object> params);
+
+    List<StudentLessonExaminationDto1> queryStudentPage(@Param("lessonExaminationId") Long lessonExaminationId,
+                                                        @Param("subjectId") Integer subjectId);
+
+    /**
+     * 查询未完成的考试
+     *
+     * @param userId 用户id
+     */
+    int queryNotSuccessExaminationList(Integer userId);
+
+    void updateTrainingScore(@Param("lessonExaminationId") Long lessonExaminationId, @Param("userId") Integer userId);
+
+    List<Map<Long, String>> getStudentName(@Param("examinationIds") List<Long> examinationIds);
+
+    List<StudentLessonExamination> queryEndList(@Param("date") String date);
+}
+

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDetailDao.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 进度评测详情表(StudentLessonExaminationDetail)表数据库访问层
+ *
+ * @author zx
+ * @since 2023-04-03 18:22:00
+ */
+public interface StudentLessonExaminationDetailDao extends BaseMapper<StudentLessonExaminationDetail> {
+
+    int insertBatch(@Param("entities") List<StudentLessonExaminationDetail> entities);
+
+    List<StudentLessonExaminationDetailDto> queryAll(@Param("query") StudentLessonExaminationQueryDto query);
+}
+

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonTrainingDetailMapper.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 练习内容
+ * 2023-03-31 14:18:47
+ */
+@Repository
+public interface StudentLessonTrainingDetailMapper extends BaseMapper<StudentLessonTrainingDetail> {
+	
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -512,6 +512,9 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<String> queryTeacherMusicIds(Map<String, Object> params);
     int countTeacherMusics(Map<String, Object> params);
 
+    List<String> queryTeacherMusicIdsV2(Map<String, Object> params);
+    int countTeacherMusicsV2(Map<String, Object> params);
+
     int countTeacherBasicInfo(Map<String, Object> params);
 
     List<SysUserDto> queryTeacherBasicInfo(Map<String, Object> params);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkListDto.java

@@ -64,12 +64,22 @@ public class CourseHomeworkListDto {
     @ApiModelProperty(value = "是否已经回复",required = false)
     private YesOrNoEnum isReplied;
 
+    @ApiModelProperty("老师ID")
+    private Integer teacherId;
     @ApiModelProperty(value = "实际上课老师",required = false)
     private String teacherName;
 
     @ApiModelProperty(value = "实际上课老师头像",required = false)
     private String headUrl;
 
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public String getTitle() {
         return title;
     }

+ 338 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java

@@ -0,0 +1,338 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.EHomeWorkStatus;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-04-03
+ */
+@Data
+@ApiModel(value = "课程作业包装类")
+public class CourseHomeworkWrapper {
+
+    @Data
+    @ApiModel(value = "课程作业查询条件")
+    public static class CourseHomeworkQuery extends QueryInfo {
+
+
+        @ApiModelProperty(value = "课程id")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty("当月")
+        private Date month;
+
+        @ApiModelProperty(value = "开始时间",required = true)
+        private Date startTime;
+
+        @ApiModelProperty(value = "结束时间",required = true)
+        private Date endTime;
+
+        @ApiModelProperty(value = "老师id")
+        private Integer teacherId;
+
+        @ApiModelProperty(value = "课程类型 课后练习 :MUSIC  小课练习: 包含VIP,PRACTICE")
+        private String courseType;
+
+        @ApiModelProperty(value = "乐团id")
+        private String musicGroupId;
+
+        @ApiModelProperty(value = "班级类型  SINGLE:声部班,MIX:合奏班")
+        private String classType;
+
+        @ApiModelProperty(value = "作业练习状态 UNASSIGNED:未布置,ASSIGNED:已布置,DEADLINE:已截止")
+        private EHomeWorkStatus homeWorkStatus;
+
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        private ELessonTrainingType type;
+    }
+
+
+
+    @Data
+    @ApiModel(value = "课程作业列表")
+    public static class CourseHomeworkList {
+
+        @ApiModelProperty(value = "课程id")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty(value = "作业id")
+        private Long courseHomeworkId;
+
+        @ApiModelProperty(value = "课程日期")
+        private Date classDate;
+
+        @ApiModelProperty(value = "开始时间")
+        private Date startTime;
+
+        @ApiModelProperty(value = "结束时间")
+        private Date endTime;
+
+        @ApiModelProperty(value = "作业练习状态 UNASSIGNED:未布置,ASSIGNED:已布置,DEADLINE:已截止")
+        private EHomeWorkStatus homeWorkStatus;
+
+        @ApiModelProperty(value = "老师id")
+        private Integer teacherId;
+
+        @ApiModelProperty("老师名")
+        private String teacherName;
+
+        @ApiModelProperty("课程名称")
+        private String courseScheduleName;
+
+        @ApiModelProperty("老师头像")
+        private String teacherImg;
+
+        @ApiModelProperty(value = "乐团id")
+        private String musicGroupId;
+
+        @ApiModelProperty(value = "乐团名称")
+        private String musicGroupName;
+
+        @ApiModelProperty(value = "乐团图片")
+        private String musicGroupImg;
+
+        @ApiModelProperty(value = "班级类型  NORMAL:声部班,MIX:合奏班")
+        private String classType;
+
+        @ApiModelProperty(value = "声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("班级id")
+        private Integer classGroupId;
+
+        @ApiModelProperty("班级名称")
+        private String classGroupName;
+
+        @ApiModelProperty("教学形式(线上、线下)")
+        private String teachMode;
+
+        @ApiModelProperty("学生人数")
+        private Integer studentNum;
+
+        @ApiModelProperty("已完成人数")
+        private Integer finishNum;
+
+        @ApiModelProperty("布置时间")
+        private Date assignTime;
+
+        @ApiModelProperty("截止时间")
+        private Date expiryDate;
+
+        @ApiModelProperty("完成状态 false 未完成 true 已完成")
+        private Boolean finishStatus;
+
+        @ApiModelProperty("提交时间")
+        private Date submitTime;
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        private ELessonTrainingType type;
+
+        @ApiModelProperty("是否可布置")
+        private Boolean assignFlag;
+
+        private String studentIdList;
+
+        @ApiModelProperty("练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
+    }
+
+
+    @Data
+    @ApiModel(value = "StudentCourseHomeworkQuery-学生课程作业详情")
+    public static class StudentCourseHomeworkQuery {
+
+        @ApiModelProperty(value = "用户ID")
+        private Long userId;
+
+        @ApiModelProperty(value = "课程编号",required = true)
+        @NotNull(message = "课程编号不能为空")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        @NotNull(message = "作业类型不能为空")
+        private ELessonTrainingType type;
+
+    }
+
+
+    @Data
+    @ApiModel(value = "AddStudentHomeworkRecord-添加学生作业记录")
+    public static class AddStudentHomeworkRecord {
+
+        @ApiModelProperty(value = "用户ID")
+        private Long userId;
+
+        @ApiModelProperty(value = "作业详情id",required = true)
+        @NotNull(message = "作业详情id不能为空")
+        private Long id;
+
+    }
+
+
+    @Data
+    @ApiModel(value = "StudentCourseHomeworkDetail-学生课程作业详情")
+    public static class StudentCourseHomeworkDetail {
+
+        @ApiModelProperty(value = "学生作业ID")
+        private Integer studentCourseHomeworkId;
+
+        @ApiModelProperty(value = "课程ID")
+        private Long courseScheduleId;
+
+        @ApiModelProperty(value = "课程名称")
+        private String courseName;
+
+        @ApiModelProperty(value = "上课开始时间")
+        private Date startClassTime;
+
+        @ApiModelProperty(value = "作业过期时间")
+        private String expiryDate;
+
+        @ApiModelProperty(value = "结束时间")
+        private Date endClassTime;
+
+        @ApiModelProperty(value = "乐团id")
+        private String musicGroupId;
+
+        @ApiModelProperty(value = "乐团名称")
+        private String musicGroupName;
+
+        @ApiModelProperty(value = "乐团图片")
+        private String musicGroupImg;
+
+        @ApiModelProperty("班级id")
+        private Integer classGroupId;
+
+        @ApiModelProperty("班级名称")
+        private String classGroupName;
+
+        @ApiModelProperty("教学形式(线上、线下)")
+        private String teachMode;
+
+        @ApiModelProperty("完成状态 false 未完成 true 已完成")
+        private Boolean finishStatus;
+
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)")
+        private ELessonTrainingType type;
+
+        @ApiModelProperty(value = "练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetail;
+    }
+
+
+    @Data
+    @ApiModel(value = "WebExtraCourseHomework-课外作业列表")
+    public static class WebExtraCourseHomework {
+
+        /**  */
+        private Long id;
+
+        private String musicGroupId;
+
+        /** 老师编号 */
+        @ApiModelProperty(value="等级")
+        private Integer teacherId;
+
+        private SysUser teacher = new SysUser();
+
+        /** 学生列表 */
+        @ApiModelProperty(value="学生列表")
+        private String studentIdList;
+
+        @ApiModelProperty("班级id")
+        private Integer classGroupId;
+
+        @ApiModelProperty("作业来源分类")
+        private String groupType;
+
+
+        private String type;
+
+        /** 批次号 */
+        @ApiModelProperty(value="批次号")
+        private String batchNo;
+
+        /** 标题 */
+        @ApiModelProperty(value="标题")
+        private String title;
+
+        /** 附件地址(多个用逗号分隔) */
+        @ApiModelProperty(value="附件地址(多个用逗号分隔)")
+        private String attachments;
+
+        /** 作业内容 */
+        @ApiModelProperty(value="作业内容")
+        private String content;
+
+        /** 截止日期 */
+        @ApiModelProperty(value="截止日期")
+        private java.util.Date expireDate;
+
+        /** 完成人数 */
+        @ApiModelProperty(value="完成人数")
+        private Integer completedNum;
+
+        /** 预计人数 */
+        @ApiModelProperty(value="预计人数")
+        private Integer expectNum;
+
+        /**  */
+        private java.util.Date createTime;
+
+        /**  */
+        private java.util.Date updateTime;
+
+        @ApiModelProperty(value="是否及时回复")
+        private int isReplied;
+
+        @ApiModelProperty(value="是否提交")
+        private int isSubmit;
+
+        private int status;
+
+        private String organName;
+
+        private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
+
+        /** 伴奏列表(多个用逗号分隔) */
+        @ApiModelProperty(value="伴奏列表(多个用逗号分隔)")
+        private String musicScoreId;
+
+        private String musicScoreName;
+
+        private List<MusicScoreSubjectDto> musicScoreSubjectDtos;
+
+
+        @ApiModelProperty("乐团名")
+        private String musicGroupName;
+
+        @ApiModelProperty("班级名")
+        private String classGroupName;
+
+        private String versionTag;
+
+
+        @ApiModelProperty("布置时间")
+        private Date assignTime;
+
+        @ApiModelProperty("练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
+    }
+
+
+}

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java

@@ -44,6 +44,62 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
     @ApiModelProperty(value = "作业创建时间")
     private Date homeworkCreateTime;
 
+    @ApiModelProperty(value = "作业id")
+    private Long extracurricularExercisesId;
+
+    @ApiModelProperty(value = "乐团id")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "班级id")
+    private Integer classGroupId;
+
+    @ApiModelProperty(value = "作业类型")
+    private String type;
+
+    private String subjectId;
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public Long getExtracurricularExercisesId() {
+        return extracurricularExercisesId;
+    }
+
+    @Override
+    public void setExtracurricularExercisesId(Long extracurricularExercisesId) {
+        this.extracurricularExercisesId = extracurricularExercisesId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(Integer classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+
     public Date getHomeworkCreateTime() {
         return homeworkCreateTime;
     }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/HomeworkStat.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-04-06
+ */
+@Data
+public class HomeworkStat {
+
+    @ApiModelProperty("类型  HOMEWORK:作业,EXAMINATION:评测")
+    private String type;
+
+    @ApiModelProperty("是否展示  true:展示,false:不展示")
+    private boolean show;
+}

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationDetailDto.java

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import com.ym.mec.biz.dal.enums.HardLevelEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationDetailDto{
+
+    @ApiModelProperty(value = "曲目id")
+    private Long musicScoreId;
+
+    @ApiModelProperty(value = "评测难度")
+    private HardLevelEnum heardLevel;
+
+    @ApiModelProperty(value = "分谱")
+    private Integer partIndex;
+
+    @ApiModelProperty(value = "合格分数")
+    private Integer score;
+}
+

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

@@ -0,0 +1,61 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationResultDto{
+    @ApiModelProperty(value = "测验编号")
+    private Long id;
+
+    @ApiModelProperty(value = "分部")
+    private Integer organId;
+
+    @ApiModelProperty(value = "分部")
+    private String organName;
+
+    @ApiModelProperty(value = "班级名称")
+    private String classGroupName;
+
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团名称")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "老师姓名")
+    private String teacherName;
+
+    @ApiModelProperty(value = "老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "班级编号")
+    private Long classGroupId;
+
+    @ApiModelProperty(value = "布置时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "截止日期")
+    private String expireDate;
+
+    @ApiModelProperty(value = "达标人数")
+    private Integer standardNum;
+
+    @ApiModelProperty(value = "训练人数")
+    private Integer trainingNum;
+
+    @ApiModelProperty(value = "预计人数")
+    private Integer expectNum;
+
+    @ApiModelProperty(value = "学员姓名")
+    private String studentNames;
+}
+

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto1.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationResultDto1 {
+    @ApiModelProperty(value = "测验编号")
+    private Long LessonExaminationId;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "班级名称")
+    private String classGroupName;
+
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团名称")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "班级编号")
+    private Long classGroupId;
+
+    @ApiModelProperty(value = "老师姓名")
+    private String teacherName;
+
+    @ApiModelProperty(value = "老师头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "截止日期")
+    private Date expireDate;
+
+    @ApiModelProperty(value = "训练提交时间")
+    private Date trainingTime;
+
+    @ApiModelProperty(value = "是否达标")
+    private Boolean standardFlag;
+
+    @ApiModelProperty(value = "是否截止")
+    private Boolean expireFlag;
+
+    @ApiModelProperty(value = "测评分数")
+    private Integer trainingScore;
+
+    @ApiModelProperty(value = "是否测评")
+    private Boolean trainingFlag;
+}
+

+ 53 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto2.java

@@ -0,0 +1,53 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationResultDto2 {
+
+    @ApiModelProperty(value = "测验编号")
+    private Long id;
+
+    @ApiModelProperty(value = "分部")
+    private String organName;
+
+    @ApiModelProperty(value = "班级名称")
+    private String classGroupName;
+
+    @ApiModelProperty(value = "班级编号")
+    private Long classGroupId;
+
+    @ApiModelProperty(value = "乐团名称")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "老师姓名")
+    private String teacherName;
+
+    @ApiModelProperty(value = "老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "布置时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "截止日期")
+    private String expireDate;
+
+    @ApiModelProperty(value = "达标人数")
+    private Integer standardNum;
+
+    @ApiModelProperty(value = "训练人数")
+    private Integer trainingNum;
+
+    @ApiModelProperty(value = "预计人数")
+    private Integer expectNum;
+}
+

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSaveDto.java

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 进度评测表(LessonExamination)表实体类
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationSaveDto {
+
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "班级编号")
+    private Integer classGroupId;
+
+    @ApiModelProperty(value = "课程编号")
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "学员总数")
+    private Integer expectNum;
+
+    @ApiModelProperty(value = "声部学员列表")
+    private List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos;
+}
+

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSubmitDto.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class LessonExaminationSubmitDto {
+    @ApiModelProperty(value = "测验编号")
+    private Long studentLessonExaminationDetailId;
+
+    @ApiModelProperty(value = "测评分数")
+    private Integer score;
+}
+

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupExtracurricularSummaryDto.java

@@ -8,7 +8,17 @@ public class MusicGroupExtracurricularSummaryDto {
 	
 	private int studentNum;
 
-	public String getMusicGroupName() {
+    private String studentIds;
+
+    public String getStudentIds() {
+        return studentIds;
+    }
+
+    public void setStudentIds(String studentIds) {
+        this.studentIds = studentIds;
+    }
+
+    public String getMusicGroupName() {
 		return musicGroupName;
 	}
 

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

@@ -18,6 +18,18 @@ public class MusicScoreSubjectDto {
     @ApiModelProperty(value = "曲目编号、分谱(新版布置作业需要)",required = false)
     private List<MusicScoreHomeworkDto> musicScoreHomeworkDtoList;
 
+
+    @ApiModelProperty("新版作业 time:2023-03-31")
+    private List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails;
+
+    public List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> getStudentLessonTrainingDetails() {
+        return studentLessonTrainingDetails;
+    }
+
+    public void setStudentLessonTrainingDetails(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails) {
+        this.studentLessonTrainingDetails = studentLessonTrainingDetails;
+    }
+
     public List<MusicScoreHomeworkDto> getMusicScoreHomeworkDtoList() {
         return musicScoreHomeworkDtoList;
     }

+ 138 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentHomeworkRecordDto.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
+import io.swagger.annotations.ApiModelProperty;
+
 import java.util.Date;
 
 /**
@@ -8,23 +12,154 @@ import java.util.Date;
  */
 public class StudentHomeworkRecordDto {
 
+    @ApiModelProperty(value = "学生作业ID")
     private Integer studentCourseHomeworkId;
 
+    @ApiModelProperty(value = "课程ID")
     private Long courseScheduleId;
 
+    @ApiModelProperty(value = "课程名称")
     private String courseName;
 
+    @ApiModelProperty(value = "上课开始时间")
     private Date startClassTime;
 
+    @ApiModelProperty(value = "老师ID")
     private Integer teacherId;
 
+    @ApiModelProperty(value = "老师名称")
     private String teacherName;
 
+    @ApiModelProperty(value = "老师头像")
     private String headUrl;
 
+    @ApiModelProperty(value = "作业状态")
     private int status;
 
-    private String expiryDate;
+    @ApiModelProperty(value = "作业过期时间")
+    private Date expiryDate;
+
+
+    @ApiModelProperty(value = "结束时间")
+    private Date endClassTime;
+
+
+    @ApiModelProperty(value = "乐团id")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团名称")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "乐团图片")
+    private String musicGroupImg;
+
+    private StandardEnum standardFlag;
+
+    @ApiModelProperty("班级id")
+    private Integer classGroupId;
+
+    @ApiModelProperty("班级名称")
+    private String classGroupName;
+
+    @ApiModelProperty("教学形式(线上、线下)")
+    private String teachMode;
+
+    @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+    private ELessonTrainingType type;
+
+    @ApiModelProperty("完成状态 false 未完成 true 已完成")
+    private Boolean finishStatus;
+
+    @ApiModelProperty("提交时间")
+    private Date submitTime;
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public StandardEnum getStandardFlag() {
+        return standardFlag;
+    }
+
+    public void setStandardFlag(StandardEnum standardFlag) {
+        this.standardFlag = standardFlag;
+    }
+
+    public ELessonTrainingType getType() {
+        return type;
+    }
+
+    public void setType(ELessonTrainingType type) {
+        this.type = type;
+    }
+
+    public Boolean getFinishStatus() {
+        return finishStatus;
+    }
+
+    public void setFinishStatus(Boolean finishStatus) {
+        this.finishStatus = finishStatus;
+    }
+
+    public Date getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(Date endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getMusicGroupImg() {
+        return musicGroupImg;
+    }
+
+    public void setMusicGroupImg(String musicGroupImg) {
+        this.musicGroupImg = musicGroupImg;
+    }
+
+    public Integer getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(Integer classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+
+    public String getClassGroupName() {
+        return classGroupName;
+    }
+
+    public void setClassGroupName(String classGroupName) {
+        this.classGroupName = classGroupName;
+    }
+
+    public String getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(String teachMode) {
+        this.teachMode = teachMode;
+    }
 
     public String getHeadUrl() {
         return headUrl;
@@ -34,11 +169,11 @@ public class StudentHomeworkRecordDto {
         this.headUrl = headUrl;
     }
 
-    public String getExpiryDate() {
+    public Date getExpiryDate() {
         return expiryDate;
     }
 
-    public void setExpiryDate(String expiryDate) {
+    public void setExpiryDate(Date expiryDate) {
         this.expiryDate = expiryDate;
     }
 

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto.java

@@ -0,0 +1,52 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import com.ym.mec.biz.dal.enums.HardLevelEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class StudentLessonExaminationDetailDto {
+    @ApiModelProperty(value = "主键")
+    private Long studentLessonExaminationDetailId;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "评测编号")
+    private Long lessonExaminationId;
+
+    @ApiModelProperty(value = "曲谱名称")
+    private String musicScoreName;
+
+    @ApiModelProperty(value = "曲谱")
+    private Integer musicScoreId;
+
+    @ApiModelProperty(value = "评测难度")
+    private HardLevelEnum heardLevel;
+
+    @ApiModelProperty(value = "练习最高分数")
+    private Integer trainingScore;
+
+    @ApiModelProperty(value = "是否评测")
+    private Boolean trainingFlag;
+
+    @ApiModelProperty(value = "总平均分")
+    private Integer avgScore;
+
+    @ApiModelProperty(value = "实际得分")
+    private Integer actualAvgScore;
+
+    @ApiModelProperty(value = "达标总分")
+    private Integer standardScore;
+
+    @ApiModelProperty(value = "分谱")
+    private Integer partIndex;
+
+}
+

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto1.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import com.ym.mec.biz.dal.enums.HardLevelEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class StudentLessonExaminationDetailDto1 {
+
+    @ApiModelProperty(value = "曲谱名称")
+    private String musicScoreName;
+
+    @ApiModelProperty(value = "练习最高分数")
+    private Integer trainingScore;
+
+    @ApiModelProperty(value = "达标分数")
+    private Integer standardScore;
+
+    @ApiModelProperty(value = "实际均摊得分")
+    private Integer actualAvgScore;
+
+    @ApiModelProperty(value = "均摊总分")
+    private Integer avgScore;
+
+    @ApiModelProperty(value = "评测难度")
+    private HardLevelEnum heardLevel;
+}
+

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class StudentLessonExaminationDto {
+
+    @ApiModelProperty(value = "学员头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "学员姓名")
+    private String username;
+
+    @ApiModelProperty(value = "最后评测时间")
+    private Date trainingTime;
+
+    @ApiModelProperty(value = "是否评测")
+    private Boolean trainingFlag;
+
+    @ApiModelProperty(value = "测评分数")
+    private Integer trainingScore;
+
+    @ApiModelProperty(value = "是否会员")
+    private Boolean memberFlag;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "评测编号")
+    private Long lessonExaminationId;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectName;
+}
+

+ 38 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto1.java

@@ -0,0 +1,38 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class StudentLessonExaminationDto1 {
+
+    @ApiModelProperty(value = "学员姓名")
+    private String username;
+
+    @ApiModelProperty(value = "学员手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "测评分数")
+    private Integer trainingScore;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectName;
+
+    @ApiModelProperty(value = "训练时间")
+    private Date trainingTime;
+
+    private List<StudentLessonExaminationDetailDto1> detailDtos;
+}
+

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@Data
+public class StudentLessonExaminationSaveDto {
+
+    @ApiModelProperty(value = "学员编号,逗号分割")
+    private String studentIds;
+
+    @ApiModelProperty(value = "声部")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "作业内容")
+    private List<LessonExaminationDetailDto> examinationDetailDtos;
+}
+

+ 152 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java

@@ -0,0 +1,152 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 练习内容
+ * 2023-03-31 14:18:47
+ */
+@ApiModel(value = "StudentLessonTrainingDetailWrapper对象", description = "练习内容查询对象")
+public class StudentLessonTrainingDetailWrapper {
+
+
+    @Data
+    @ApiModel(" AddStudentLessonTrainingDetail-练习内容")
+    public static class AddStudentLessonTrainingDetail {
+
+        @ApiModelProperty("曲目id")
+        private Long musicScoreId;
+
+        @ApiModelProperty("练习速度")
+        private Integer trainingSpeed;
+
+        @ApiModelProperty("标准练习次数")
+        private Integer times;
+
+        @ApiModelProperty("分谱")
+        private Integer partIndex;
+
+        @ApiModelProperty("声部")
+        private Integer subjectId;
+    }
+
+    @Data
+	@ApiModel(" StudentLessonTrainingDetail-练习内容")
+    public static class StudentLessonTrainingDetail {
+
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("练习编号")
+        private Long courseHomeworkId;
+
+        @ApiModelProperty("曲目id")
+        private Long musicScoreId;
+
+        @ApiModelProperty("曲目名称")
+        private String  musicScoreName;
+
+        @ApiModelProperty("分谱")
+        private Integer partIndex;
+
+        @ApiModelProperty("练习速度")
+        private Integer trainingSpeed;
+
+        @ApiModelProperty("已练习次数")
+        private Integer trainingTimes;
+
+        @ApiModelProperty("练习状态")
+        private StandardEnum trainingStatus;
+
+        @ApiModelProperty("标准练习次数")
+        private Integer times;
+
+
+        @ApiModelProperty("声部id")
+        private Long subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+	}
+
+
+
+    @Data
+    @ApiModel(" StudentLessonTrainingQuery-学生列表")
+    public static class StudentLessonTrainingQuery {
+
+
+        @ApiModelProperty(value = "用户ID")
+        private Long userId;
+
+        @ApiModelProperty(value = "课程编号",required = true)
+        @NotNull(message = "课程编号不能为空")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        @NotNull(message = "作业类型不能为空")
+        private ELessonTrainingType type;
+
+        @ApiModelProperty(value = "声部id")
+        private Integer subjectId;
+
+        @ApiModelProperty(value = "true:完成 false未完成",hidden = true)
+        private Boolean standardFlag;
+
+	}
+
+
+
+    @Data
+    @ApiModel(" StudentLessonTraining-学生练习内容查询对象")
+    public static class StudentLessonTraining {
+
+
+        @ApiModelProperty(value = "用户ID")
+        private Long userId;
+
+        @ApiModelProperty(value = "用户名")
+        private String userName;
+
+        @ApiModelProperty(value = "头像")
+        private String avatar;
+
+        @ApiModelProperty("是否是vip")
+        private Boolean vipFlag;
+
+        @ApiModelProperty("声部id")
+        private Integer subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty(value = "0未达标、1达标、2优秀",required = true)
+        private StandardEnum standardFlag;
+
+        @ApiModelProperty(value = "是否完成")
+        private Boolean finishFlag;
+
+        @ApiModelProperty(value = "练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetail;
+    }
+
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDetailDto.java

@@ -37,6 +37,16 @@ public class TeacherAttendanceDetailDto {
     
     private School school;
 
+    private String versionTag;
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
     public Integer getErrorAttendanceNum() {
         return errorAttendanceNum;
     }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebCourseHomeworkListDto.java

@@ -65,6 +65,38 @@ public class WebCourseHomeworkListDto {
     @ApiModelProperty(value = "伴奏编号",required = false)
     private String musicScoreId;
 
+    @ApiModelProperty(value = "乐团名")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "截止时间")
+    private Date expiryDate;
+
+    private String versionTag;
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public Date getExpiryDate() {
+        return expiryDate;
+    }
+
+    public void setExpiryDate(Date expiryDate) {
+        this.expiryDate = expiryDate;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
     public String getMusicScoreId() {
         return musicScoreId;
     }

+ 45 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseHomework.java

@@ -1,7 +1,9 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
 import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
 
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
 import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -31,6 +33,8 @@ public class CourseHomework extends BaseEntity {
 	/** 作业内容 */
 	private String content;
 
+    private Boolean pushFlag;
+
 	/** 作业内容 */
 	private String title;
 	
@@ -45,6 +49,8 @@ public class CourseHomework extends BaseEntity {
 	
 	/**  */
 	private String musicGroupId;
+
+    private String versionTag;
 	
 	private MusicGroup musicGroup = new MusicGroup();
 	
@@ -64,7 +70,45 @@ public class CourseHomework extends BaseEntity {
 
 	private List<MusicScoreSubjectDto> musicScoreSubjectDto;
 
-	public String getTitle() {
+    @ApiModelProperty("新版作业 time:2023-03-31")
+    private List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails;
+
+	@ApiModelProperty(value = "课后评测信息")
+	private LessonExaminationSaveDto lessonExaminationSaveDto;
+
+	public LessonExaminationSaveDto getLessonExaminationSaveDto() {
+		return lessonExaminationSaveDto;
+	}
+
+    public Boolean getPushFlag() {
+        return pushFlag;
+    }
+
+    public void setPushFlag(Boolean pushFlag) {
+        this.pushFlag = pushFlag;
+    }
+
+    public void setLessonExaminationSaveDto(LessonExaminationSaveDto lessonExaminationSaveDto) {
+		this.lessonExaminationSaveDto = lessonExaminationSaveDto;
+	}
+
+	public List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> getStudentLessonTrainingDetails() {
+        return studentLessonTrainingDetails;
+    }
+
+    public void setStudentLessonTrainingDetails(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails) {
+        this.studentLessonTrainingDetails = studentLessonTrainingDetails;
+    }
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public String getTitle() {
 		return title;
 	}
 

+ 103 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercises.java

@@ -2,11 +2,16 @@ package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import javax.validation.constraints.NotNull;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -28,10 +33,18 @@ public class ExtracurricularExercises extends BaseEntity {
 	/** 学生列表 */
 	@ApiModelProperty(value="学生列表")
 	private String studentIdList;
+
+    @ApiModelProperty("班级id")
+    private Integer classGroupId;
+
+    @ApiModelProperty("作业来源分类")
+    private String groupType;
 	
 	/** 批次号 */
 	@ApiModelProperty(value="批次号")
 	private String batchNo;
+
+    private String versionTag;
 	
 	/** 标题 */
 	@ApiModelProperty(value="标题")
@@ -69,6 +82,8 @@ public class ExtracurricularExercises extends BaseEntity {
 	@ApiModelProperty(value="是否提交")
 	private int isSubmit;
 
+    private Boolean pushFlag;
+
 	private int status;
 	
 	private String organName;
@@ -83,6 +98,94 @@ public class ExtracurricularExercises extends BaseEntity {
 
 	private List<MusicScoreSubjectDto> musicScoreSubjectDtos;
 
+    @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+    private String type;
+
+    @ApiModelProperty("乐团名")
+    private String musicGroupName;
+
+    @ApiModelProperty("班级名")
+    private String classGroupName;
+
+
+    @ApiModelProperty("布置时间")
+    private java.util.Date assignTime;
+
+    @ApiModelProperty("新版作业 time:2023-03-31")
+    private List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails;
+
+    public Boolean getPushFlag() {
+        return pushFlag;
+    }
+
+    public void setPushFlag(Boolean pushFlag) {
+        this.pushFlag = pushFlag;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getClassGroupName() {
+        return classGroupName;
+    }
+
+    public void setClassGroupName(String classGroupName) {
+        this.classGroupName = classGroupName;
+    }
+
+    public Date getAssignTime() {
+        return assignTime;
+    }
+
+    public void setAssignTime(Date assignTime) {
+        this.assignTime = assignTime;
+    }
+
+    public Integer getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(Integer classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
+    public List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> getStudentLessonTrainingDetails() {
+        return studentLessonTrainingDetails;
+    }
+
+    public void setStudentLessonTrainingDetails(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails) {
+        this.studentLessonTrainingDetails = studentLessonTrainingDetails;
+    }
+
 	public List<MusicScoreSubjectDto> getMusicScoreSubjectDtos() {
 		return musicScoreSubjectDtos;
 	}

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LessonExamination.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 进度评测表(LessonExamination)表实体类
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:36
+ */
+@ApiModel(value = "lesson_examination-进度评测表")
+@Data
+public class LessonExamination{
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("organ_id_")
+    @ApiModelProperty(value = "分部编号")
+    private Integer organId;
+
+    @TableField("music_group_id_")
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
+    @TableField("class_group_id_")
+    @ApiModelProperty(value = "班级编号")
+    private Integer classGroupId;
+
+    @TableField("course_schedule_id_")
+    @ApiModelProperty(value = "课程编号")
+    private Long courseScheduleId;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师编号")
+    private Integer teacherId;
+
+    @TableField("expire_date_")
+    @ApiModelProperty(value = "截止日期")
+    private Date expireDate;
+
+    @TableField("training_num_")
+    @ApiModelProperty(value = "提交人数")
+    private Integer trainingNum;
+
+    @TableField("standard_num_")
+    @ApiModelProperty(value = "达标人数")
+    private Integer standardNum;
+
+    @TableField("expect_num_")
+    @ApiModelProperty(value = "预计人数")
+    private Integer expectNum;
+
+    @TableField("push_flag_")
+    @ApiModelProperty(value = "是否推送")
+    private Boolean pushFlag;
+
+    @TableField("create_time_")
+    private Date createTime;
+
+    @TableField("update_time_")
+    private Date updateTime;
+
+    @TableField("tenant_id_")
+    private Integer tenantId = TenantContextHolder.getTenantId();
+}
+

+ 82 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java

@@ -1,5 +1,8 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.StandardEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
@@ -10,6 +13,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 对应数据库表(student_course_homework):
@@ -59,6 +63,9 @@ public class StudentCourseHomework extends BaseEntity {
 	@ApiModelProperty(value="提交时间")
 	private Date submitTime;
 
+    @ApiModelProperty(value="类型")
+    private GroupType groupType;
+
 	private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
 
 	//伴奏编号
@@ -76,7 +83,81 @@ public class StudentCourseHomework extends BaseEntity {
 	@ApiModelProperty(value = "0未达标、1达标、2优秀",required = true)
 	private StandardEnum standardFlag;
 
-	public StandardEnum getStandardFlag() {
+    @ApiModelProperty("完成状态")
+    private Boolean  finishFlag;
+
+    @ApiModelProperty("是否是vip")
+    private Boolean vipFlag;
+
+    @ApiModelProperty("声部id")
+    private Integer subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+    private ELessonTrainingType type;
+
+    @ApiModelProperty(value = "练习内容")
+    private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetail;
+
+    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getStudentLessonTrainingDetail() {
+        return studentLessonTrainingDetail;
+    }
+
+    public void setStudentLessonTrainingDetail(List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetail) {
+        this.studentLessonTrainingDetail = studentLessonTrainingDetail;
+    }
+
+    public ELessonTrainingType getType() {
+        return type;
+    }
+
+    public void setType(ELessonTrainingType type) {
+        this.type = type;
+    }
+
+    public Boolean getFinishFlag() {
+        return finishFlag;
+    }
+
+    public void setFinishFlag(Boolean finishFlag) {
+        this.finishFlag = finishFlag;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Boolean getVipFlag() {
+        return vipFlag;
+    }
+
+    public void setVipFlag(Boolean vipFlag) {
+        this.vipFlag = vipFlag;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public StandardEnum getStandardFlag() {
 		return standardFlag;
 	}
 

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExamination.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 学生进度评测表(StudentLessonExamination)表实体类
+ *
+ * @author zx
+ * @since 2023-04-03 18:21:30
+ */
+@ApiModel(value = "student_lesson_examination-学生进度评测表")
+@Data
+public class StudentLessonExamination {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("lesson_examination_id_")
+    @ApiModelProperty(value = "测验编号")
+    private Long lessonExaminationId;
+
+    @TableField("training_score_")
+    @ApiModelProperty(value = "测评总分")
+    private Integer trainingScore;
+
+    @TableField("training_time_")
+    @ApiModelProperty(value = "最后测评时间")
+    private Date trainingTime;
+
+    @TableField("training_flag_")
+    @ApiModelProperty(value = "是否测评")
+    private Boolean trainingFlag;
+
+    @TableField("subject_id_")
+    @ApiModelProperty(value = "声部")
+    private Integer subjectId;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+}
+

+ 82 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java

@@ -0,0 +1,82 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ym.mec.biz.dal.enums.HardLevelEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 进度评测详情表(StudentLessonExaminationDetail)表实体类
+ *
+ * @author zx
+ * @since 2023-04-03 18:22:01
+ */
+@ApiModel(value = "student_lesson_examination_detail-进度评测详情表")
+@Data
+public class StudentLessonExaminationDetail implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("lesson_examination_id_")
+    @ApiModelProperty(value = "测验编号")
+    private Long lessonExaminationId;
+
+    @TableField("music_score_id_")
+    @ApiModelProperty(value = "曲目id")
+    private Long musicScoreId;
+
+    @TableField("heard_level_")
+    @ApiModelProperty(value = "评测难度")
+    private HardLevelEnum heardLevel;
+
+    @TableField("standard_flag_")
+    @ApiModelProperty(value = "是否达标")
+    private Boolean standardFlag;
+
+    @TableField("standard_score_")
+    @ApiModelProperty(value = "达标分数")
+    private Integer standardScore;
+
+    @TableField("training_score_")
+    @ApiModelProperty(value = "练习最高分数")
+    private Integer trainingScore;
+
+    @TableField("actual_avg_score_")
+    @ApiModelProperty(value = "实际均摊得分")
+    private Integer actualAvgScore;
+
+    @TableField("avg_score_")
+    @ApiModelProperty(value = "均摊总分")
+    private Integer avgScore;
+
+    @TableField("part_index_")
+    @ApiModelProperty(value = "分谱")
+    private Integer partIndex;
+
+    @TableField("training_time_")
+    @ApiModelProperty(value = "最后提交时间")
+    private Date trainingTime;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+}
+

+ 81 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java

@@ -0,0 +1,81 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 练习内容
+ * 2023-03-31 14:18:47
+ */
+@Data
+@ApiModel(" StudentLessonTrainingDetail-练习内容")
+@TableName("student_lesson_training_detail")
+public class StudentLessonTrainingDetail implements Serializable {
+
+    @ApiModelProperty("主键ID") 
+	    @TableId(value = "id_",type = IdType.AUTO)
+	    private Long id;
+
+    @ApiModelProperty("用户ID") 
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)")
+    @TableField(value = "type_")
+    private ELessonTrainingType type;
+
+    @ApiModelProperty("练习编号") 
+	@TableField(value = "course_homework_id_")
+    private Long courseHomeworkId;
+
+
+    @ApiModelProperty("声部id")
+    @TableField(value = "subject_id_")
+    private Long subjectId;
+
+
+    @ApiModelProperty("曲目id") 
+	@TableField(value = "music_score_id_")
+    private Long musicScoreId;
+
+    @ApiModelProperty("分谱")
+    @TableField(value = "part_index_")
+    private Integer partIndex;
+
+    @ApiModelProperty("练习速度") 
+	@TableField(value = "training_speed_")
+    private Integer trainingSpeed;
+
+    @ApiModelProperty("已练习次数") 
+	@TableField(value = "training_times_")
+    private Integer trainingTimes;
+
+    @ApiModelProperty("练习状态") 
+	@TableField(value = "training_status_")
+    private StandardEnum trainingStatus;
+
+    @ApiModelProperty("标准练习次数") 
+	@TableField(value = "times_")
+    private Integer times;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+}

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -96,6 +96,10 @@ public class TeacherAttendance extends BaseEntity {
 	//处理结果
 	private Integer operator;
 
+
+    @ApiModelProperty(value = "签到附件")
+    private String signInAttachments;
+
 	@ApiModelProperty(value = "签退附件")
 	private String signOutAttachments;
 
@@ -115,7 +119,15 @@ public class TeacherAttendance extends BaseEntity {
 
 	private TeachModeEnum teachModeEnum;
 
-	public TeachModeEnum getTeachModeEnum() {
+    public String getSignInAttachments() {
+        return signInAttachments;
+    }
+
+    public void setSignInAttachments(String signInAttachments) {
+        this.signInAttachments = signInAttachments;
+    }
+
+    public TeachModeEnum getTeachModeEnum() {
 		return teachModeEnum;
 	}
 

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EHomeWorkStatus.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-04-03
+ */
+@Getter
+public enum EHomeWorkStatus implements BaseEnum<String, EHomeWorkStatus> {
+
+    /**
+     * 未布置
+     */
+    UNASSIGNED("未布置"),
+
+    /**
+     * 已布置
+     */
+    ASSIGNED("已布置"),
+
+    /**
+     * 已截止
+     */
+    DEADLINE("已截止"),
+
+    ;
+
+
+    private String msg;
+
+    @EnumValue
+    private String code;
+
+    EHomeWorkStatus(String msg) {
+        this.msg = msg;
+        this.code = this.name();
+    }
+
+}

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ELessonTrainingType.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-04-04
+ */
+@Getter
+public enum ELessonTrainingType implements BaseEnum<String, ELessonTrainingType> {
+
+    /**
+     * 课后练习
+     */
+    HOMEWORK( "课后练习"),
+
+
+    /**
+     * 课外练习
+     */
+    EXTRACURRICULAR( "课外练习"),
+
+    /**
+     * 额外练习
+     */
+    EXTRA( "额外练习")
+    ;
+
+    private String desc;
+
+    @EnumValue
+    private String code;
+
+    ELessonTrainingType(String desc) {
+        this.desc = desc;
+        this.code = name();
+    }
+
+
+
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupStatusEnum.java

@@ -39,4 +39,5 @@ public enum GroupStatusEnum implements BaseEnum<String, GroupStatusEnum> {
 
     public void setDesc(String desc) {
         this.desc = desc;
-    }}
+    }
+}

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/HardLevelEnum.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
+	BEGINNER("BEGINNER","入门级"),
+	ADVANCED("ADVANCED","进阶级"),
+	PERFORMER("PERFORMER","大师级");
+
+	private String code;
+
+	private String desc;
+
+	HardLevelEnum(String code, String desc) {
+		this.code = code;
+		this.desc = desc;
+	}
+
+	@Override
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -40,6 +40,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     //    SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),
 //    STUDENT_SMS_TEACHING_SCHOOL_CHANGE("STUDENT_SMS_TEACHING_SCHOOL_CHANGE", "教学点变动"),
     STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "训练提醒"),
+    STUDENT_PUSH_JOB_MESSAGE_V2("STUDENT_PUSH_JOB_MESSAGE_V2", "训练提醒"),
+    TEACHER_PUSH_JOB_MESSAGE_V2("TEACHER_PUSH_JOB_MESSAGE_V2", "训练提醒"),
+    TEACHER_PUSH_JOB_MESSAGE_EXTRA_V2("TEACHER_PUSH_JOB_MESSAGE_EXTRA_V2", "训练提醒"),
+    STUDENT_PUSH_JOB_MESSAGE_EXTRA_V2("STUDENT_PUSH_JOB_MESSAGE_EXTRA_V2", "训练提醒"),
     //    STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),
     TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN("TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN", "乐团课新增安排"),
     TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT("TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),
@@ -73,12 +77,18 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH("STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH", "免费陪练课预约推送"),
     TEACHER_PUSH_NEED_POST_STUDY_REPORT("TEACHER_PUSH_NEED_POST_STUDY_REPORT", "新增待填写月报"),
     STUDENT_PUSH_HOMEWORK_REMIND("STUDENT_PUSH_HOMEWORK_REMIND", "训练提醒-网管课"),
+    STUDENT_PUSH_HOMEWORK_REMIND_V2("STUDENT_PUSH_HOMEWORK_REMIND_V2", "训练提醒-网管课"),
     TEACHER_PUSH_COMM_NO_STUDENTS_PUSH("TEACHER_PUSH_COMM_NO_STUDENTS_PUSH", "对外课程组无学生提醒"),
     TEACHER_PUSH_HOMEWORK_SUBMIT("TEACHER_PUSH_HOMEWORK_SUBMIT", "学生提交训练提醒"),
     TEACHER_PUSH_HOMEWORK_REPLY("TEACHER_PUSH_HOMEWORK_REPLY", "学生训练回复提醒"),
     STUDENT_PUSH_HOMEWORK_REPLY("STUDENT_PUSH_HOMEWORK_REPLY", "教师回复训练提醒"),
 
+    IM_PUBLISH_LESSON_EXAMINATION("IM_PUBLISH_LESSON_EXAMINATION", "测评提醒"),
+    STUDENT_PUSH_PUBLISH_LESSON_EXAMINATION("STUDENT_PUSH_PUBLISH_LESSON_EXAMINATION", "测评提醒"),
+    PUSH_NO_SUBMIT_LESSON_EXAMINATION("PUSH_NO_SUBMIT_LESSON_EXAMINATION", "测评提醒"),
+    TEACHER_PUSH_LESSON_EXAMINATION_END("TEACHER_PUSH_LESSON_EXAMINATION_END", "测评提醒"),
     IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "训练提醒"),
+    IM_HOMEWORK_REMIND_V2("IM_HOMEWORK_REMIND_V2", "训练提醒"),
     IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "训练提交提醒"),
     IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "训练提交提醒"),
     IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "训练回复提醒"),
@@ -89,8 +99,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
      * 课外训练消息
      */
     STUDENT_PUSH_EXTRA_REMIND("STUDENT_PUSH_EXTRA_REMIND", "训练提醒"),
+    STUDENT_PUSH_EXTRA_REMIND_V2("STUDENT_PUSH_EXTRA_REMIND_V2", "训练提醒"),
     EXTRA_REMIND_IM("EXTRA_REMIND_IM", "训练提醒"),
     EXTRA_REMIND_IM_DETAIL("EXTRA_REMIND_IM_DETAIL", "训练提醒"),
+    EXTRA_REMIND_IM_DETAIL_V2("EXTRA_REMIND_IM_DETAIL_V2", "训练提醒"),
     STUDENT_PUSH_EXTRA_REPLY("STUDENT_PUSH_EXTRA_REPLY", "训练点评提醒"),
     EXTRA_TEACHER_REPLY_IM("EXTRA_TEACHER_REPLY_IM", "训练点评提醒"),
     TEACHER_PUSH_EXTRA_SUBMIT("TEACHER_PUSH_EXTRA_SUBMIT", "训练提交提醒"),

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/StandardEnum.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.dal.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum StandardEnum implements BaseEnum<String, StandardEnum> {
-	NOT_STANDARD("NOT_STANDARD", "未达标"), STANDARD("STANDARD", "已达标"), EXCELLENT("EXCELLENT", "优秀");
+    NOT_START("NOT_START", "未提交"), NOT_STANDARD("NOT_STANDARD", "未达标"), STANDARD("STANDARD", "已达标"), EXCELLENT("EXCELLENT", "优秀");
 
+    @EnumValue
 	private String code;
 
 	private String msg;

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeworkQueryInfo.java

@@ -34,6 +34,28 @@ public class CourseHomeworkQueryInfo extends QueryInfo {
 
     private Date classDate;
 
+    @ApiModelProperty("完成状态 false 未完成 true 已完成")
+    private Boolean finishStatus;
+
+    @ApiModelProperty
+    private String versionTag;
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public Boolean getFinishStatus() {
+        return finishStatus;
+    }
+
+    public void setFinishStatus(Boolean finishStatus) {
+        this.finishStatus = finishStatus;
+    }
+
     public Date getClassDate() {
         return classDate;
     }

+ 68 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExtraExercilseQueryInfo.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -34,6 +35,73 @@ public class ExtraExercilseQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "是否云教练作业")
 	private Boolean cloudHomeworkFlag;
 
+
+
+    @ApiModelProperty(value = "作业练习类型(HOMEWORK,EXTRACURRICULAR,EXTRA)")
+    private ELessonTrainingType type;
+
+    @ApiModelProperty("完成状态 false 未完成 true 已完成")
+    private Boolean finishStatus;
+
+    @ApiModelProperty("模糊查询 乐团名称/老师")
+    private String search;
+
+    @ApiModelProperty("是否是学员布置")
+    private Boolean studentAssignFlag;
+
+    private Long studentExerciseId;
+
+    private String versionTag;
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public Boolean getStudentAssignFlag() {
+        return studentAssignFlag;
+    }
+
+    public void setStudentAssignFlag(Boolean studentAssignFlag) {
+        this.studentAssignFlag = studentAssignFlag;
+    }
+
+    public Long getStudentExerciseId() {
+        return studentExerciseId;
+    }
+
+    public void setStudentExerciseId(Long studentExerciseId) {
+        this.studentExerciseId = studentExerciseId;
+    }
+
+    @Override
+    public String getSearch() {
+        return search;
+    }
+
+    @Override
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public ELessonTrainingType getType() {
+        return type;
+    }
+
+    public void setType(ELessonTrainingType type) {
+        this.type = type;
+    }
+
+    public Boolean getFinishStatus() {
+        return finishStatus;
+    }
+
+    public void setFinishStatus(Boolean finishStatus) {
+        this.finishStatus = finishStatus;
+    }
 	public Boolean getCloudHomeworkFlag() {
 		return cloudHomeworkFlag;
 	}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExtraExercilseReplyQueryInfo.java

@@ -46,7 +46,17 @@ public class ExtraExercilseReplyQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "是否云教练作业")
 	private Boolean cloudHomeworkFlag;
 
-	public Boolean getCloudHomeworkFlag() {
+    private String versionTag;
+
+    public String getVersionTag() {
+        return versionTag;
+    }
+
+    public void setVersionTag(String versionTag) {
+        this.versionTag = versionTag;
+    }
+
+    public Boolean getCloudHomeworkFlag() {
 		return cloudHomeworkFlag;
 	}
 

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class LessonExaminationQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "分部编号")
+    private String organId;
+
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "布置时间(年月)")
+    private String startTime;
+
+    @ApiModelProperty(value = "班级类型")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "测验是否截止")
+    private Boolean expireFlag;
+
+    private Long lessonExaminationId;
+}

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo1.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class LessonExaminationQueryInfo1 extends QueryInfo {
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "布置时间(年月)")
+    private String startTime;
+
+    @ApiModelProperty(value = "测验是否截止")
+    private Boolean expireFlag;
+
+    @ApiModelProperty(value = "是否达标")
+    private Boolean standardFlag;
+}

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LessonExaminationQueryInfo2.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class LessonExaminationQueryInfo2 extends QueryInfo {
+
+    @ApiModelProperty(value = "分部")
+    private String organId;
+
+    @ApiModelProperty(value = "布置时间(年月日)")
+    private String startTime;
+
+    @ApiModelProperty(value = "布置时间(年月日)")
+    private String endTime;
+
+    @ApiModelProperty(value = "测验是否截止")
+    private Boolean expireFlag;
+
+    @ApiModelProperty(value = "是否达标")
+    private Boolean standardFlag;
+
+    @ApiModelProperty(value = "乐团编号")
+    private String musicGroupId;
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentLessonExaminationQueryDto.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.dal.page;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class StudentLessonExaminationQueryDto{
+
+    @ApiModelProperty(value = "测验编号")
+    private Long lessonExaminationId;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+}

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentLessonExaminationQueryInfo.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class StudentLessonExaminationQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "测验编号")
+    private Long lessonExaminationId;
+
+    @ApiModelProperty(value = "是否测验")
+    private Boolean trainingFlag;
+
+    @ApiModelProperty(value = "是否达标")
+    private Boolean standardFlag;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+}

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

@@ -596,4 +596,11 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 
     //修改班级基本信息
     int updateClassGroup(ClassGroup classGroup);
+
+    /**
+     * 查询班级列表
+     *
+     * @param classIds 班级id列表
+     */
+    List<ClassGroup> queryByIds(List<Integer> classIds);
 }

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseHomeworkService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
@@ -55,4 +56,18 @@ public interface CourseHomeworkService extends BaseService<Long, CourseHomework>
 	 * @return
 	 */
 	PageInfo<WebCourseHomeworkListDto> queryHomePage(CourseHomeWorkTemplateQueryInfo queryInfo);
+
+    /**
+     * 获取课后作业详情
+     *
+     * @param courseScheduleId 课程id
+     */
+    CourseHomeworkWrapper.CourseHomeworkList findCourseHomeworkDetail(Integer courseScheduleId);
+
+    /**
+     * 课外作业详情
+     *
+     * @param extraId 作业id
+     */
+    CourseHomeworkWrapper.CourseHomeworkList findCourseExtraHomeworkDetail(Integer extraId);
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesReplyService.java

@@ -1,8 +1,10 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
+import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
@@ -63,4 +65,15 @@ public interface ExtracurricularExercisesReplyService extends BaseService<Long,
     PageInfo<ExtraExerciseStudentsDto> findExtraExercises(ExtraExercilseReplyQueryInfo queryInfo);
 
     PageInfo<EduHomeworkCardDto> getEduHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo);
+
+    /**
+     * 查询学生课外训练情况
+     *
+     */
+    PageInfo<StudentHomeworkRecordDto> findStudentExtraExercisesV2(ExtraExercilseQueryInfo queryInfo);
+
+    /**
+     * 查询学生课外训练详情
+     */
+    CourseHomeworkWrapper.CourseHomeworkList findStudentExtraExerciseDetailV2(Long studentExerciseId);
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
 import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
@@ -61,4 +62,6 @@ public interface ExtracurricularExercisesService extends BaseService<Long, Extra
      * @return
      */
     PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo);
+
+    PageInfo<CourseHomeworkWrapper.WebExtraCourseHomework> findExtraExercilsesV2(ExtraExercilseQueryInfo queryInfo);
 }

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -4,10 +4,9 @@ import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
-import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.Arrays;
 import java.util.List;
 
 public interface ImGroupService extends BaseService<String, ImGroup> {
@@ -93,4 +92,8 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	* @date 2022/8/8 10:10
 	*/
 	List<NameDto> queryDetail(List<NameDto> nameDto);
+
+    List<ImGroup> queryByUserIdV2(Integer userId, String search, String groupType, String musicGroupId, String classType);
+
+    List<ImGroupMemberDto> queryMemberByIdV2(String imGroupId,String search,Integer subjectId,Boolean vipFlag);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -80,4 +81,6 @@ public interface ImUserFriendService extends BaseService<Long, ImUserFriend> {
 	 * @author zouxuan
 	 */
 	void refreshGroupImUserFriend(String musicGroupId,GroupType groupType);
+
+    List<ImUserFriendDto> queryFriendListByUserIdV2(Integer userId, String search, String musicGroupId, Integer subjectId, Boolean vipFlag);
 }

+ 38 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/LessonExaminationService.java

@@ -0,0 +1,38 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.LessonExaminationDao;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto1;
+import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.LessonExamination;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo;
+import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo1;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.List;
+
+/**
+ * 进度评测表(LessonExamination)表服务接口
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:40
+ */
+public interface LessonExaminationService extends IService<LessonExamination> {
+
+    LessonExaminationDao getDao();
+
+    void publish(LessonExaminationSaveDto lessonExaminationSaveDto);
+
+    PageInfo<LessonExaminationResultDto> queryPage(LessonExaminationQueryInfo queryInfo);
+
+    PageInfo<LessonExaminationResultDto1> queryPageByStudent(LessonExaminationQueryInfo1 queryInfo);
+
+    LessonExaminationResultDto1 getOne(Integer userId, Long lessonExaminationId);
+
+    void pushEndMsg();
+
+    List<Subject> querySubject(Long lessonExaminationId);
+}
+

+ 45 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java

@@ -1,8 +1,8 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -71,7 +71,7 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      * @param queryInfo:
      * @return com.ym.mec.common.page.PageInfo
      */
-    PageInfo findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo);
+    PageInfo<StudentHomeworkRecordDto> findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo);
 
     /**
      * 提交作业
@@ -107,4 +107,47 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
     PageInfo<EduHomeworkStatDto> queryEduHomeworkStatList(StudentCourseHomeWorkQueryInfo queryInfo);
 
     List<EduHomeworkStatDto> queryEduHomeworkStatDetail(StudentCourseHomeWorkQueryInfo queryInfo);
+
+    /**
+     *  根据课程计划id查询学生作业列表
+     *
+     * @param courseScheduleIds 课程计划id列表
+     */
+    List<StudentCourseHomework> queryByCourseScheduleIds(List<Integer> courseScheduleIds);
+
+    List<StudentCourseHomework> findStudentCourseHomeworkByCourseV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query);
+
+    List<StudentCourseHomework> findExtraExerciseStudentsV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query);
+
+    /**
+     * 学生端查看练习详情
+     *
+     * @return
+     */
+    CourseHomeworkWrapper.CourseHomeworkList findStudentHomeworkRecordDetail(CourseHomeworkWrapper.StudentCourseHomeworkQuery query);
+
+    /**
+     * 添加学生作业练习记录
+     */
+    Boolean addStudentHomeworkRecord(CourseHomeworkWrapper.AddStudentHomeworkRecord record);
+
+    /**
+     * 老师查看学生作业练习详情
+     *
+     * @param courseScheduleId 课程计划id
+     * @param userId 学生id
+     * @param type 作业类型
+     */
+    StudentLessonTrainingDetailWrapper.StudentLessonTraining findCourseHomeworkStudentDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type);
+
+    /**
+     * 老师查看学生作业练习详情
+     *
+     * @param courseScheduleId 课程计划id
+     * @param userId 学生id
+     * @param type 作业类型
+     */
+    StudentLessonTrainingDetailWrapper.StudentLessonTraining findExtracurricularExercisesDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type);
+
+    void pushEndMsg();
 }

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java

@@ -1,7 +1,9 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.LessonExamination;
 import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
+import com.ym.mec.biz.dal.entity.StudentLessonExamination;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
@@ -71,4 +73,36 @@ public interface StudentExtracurricularExercisesSituationService extends BaseSer
     void deleteByStudent(Integer studentId,String monday);
 
     TeacherExercisesServiceDto getStatistics(ExtraExercilseQueryInfo queryInfo);
+
+    /**
+     * 老师端课后作业列表
+     *
+     */
+    PageInfo<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherServeHomeworkDetailV2(CourseHomeworkWrapper.CourseHomeworkQuery queryInfo);
+
+    /**
+     * 老师课外作业列表
+     *
+     */
+    PageInfo<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherExtraHomeworkDetailV2(CourseHomeworkWrapper.CourseHomeworkQuery queryInfo);
+
+    /**
+    * @description: 老师布置测验后更新服务指标相关数据
+     * @param lessonExamination
+     * @param studentIds
+    * @return void
+    * @author zx
+    * @date 2023/4/10 16:18
+    */
+    void updateNum(LessonExamination lessonExamination, List<Integer> studentIds);
+
+    /**
+    * @description: 学员提交作业后更新服务指标
+     * @param lessonExamination
+     * @param studentLessonExamination
+    * @return void
+    * @author zx
+    * @date 2023/4/10 16:38
+    */
+    void updateLastSubmitTime(LessonExamination lessonExamination, StudentLessonExamination studentLessonExamination);
 }

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonExaminationDetailService.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
+import com.ym.mec.biz.dal.dto.LessonExaminationDetailDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
+
+import java.util.List;
+
+/**
+ * 进度评测详情表(StudentLessonExaminationDetail)表服务接口
+ *
+ * @author zx
+ * @since 2023-04-03 18:22:01
+ */
+public interface StudentLessonExaminationDetailService extends IService<StudentLessonExaminationDetail> {
+
+    StudentLessonExaminationDetailDao getDao();
+
+    void save(Long lessonExaminationId,List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos);
+
+    List<StudentLessonExaminationDetailDto> queryAll(StudentLessonExaminationQueryDto query);
+}
+

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonExaminationService.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.StudentLessonExaminationDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.StudentLessonExamination;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.List;
+
+/**
+ * 学生进度评测表(StudentLessonExamination)表服务接口
+ *
+ * @author zx
+ * @since 2023-04-03 18:21:30
+ */
+public interface StudentLessonExaminationService extends IService<StudentLessonExamination> {
+
+    StudentLessonExaminationDao getDao();
+
+    List<Integer> save(Long lessonExaminationId,List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos);
+
+    PageInfo<StudentLessonExaminationDto> queryPage(StudentLessonExaminationQueryInfo queryInfo);
+
+    /**
+    * @description: 提交作业
+     * @param submitDto
+    * @return void
+    * @author zx
+    * @date 2023/4/4 19:25
+    */
+    void submit(LessonExaminationSubmitDto submitDto);
+
+    List<StudentLessonExaminationDto1> queryStudentPage(Long lessonExaminationId,Integer subjectId);
+}
+

+ 62 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java

@@ -0,0 +1,62 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 练习内容
+ * 2023-03-31 14:18:47
+ */
+public interface StudentLessonTrainingDetailService extends IService<StudentLessonTrainingDetail>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return StudentLessonTrainingDetail
+     */
+	StudentLessonTrainingDetail detail(Long id);
+	
+    /**
+     * 添加
+     * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
+     * @return Boolean
+     */
+     Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail);   
+
+    /**
+     * 更新
+     * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
+     * @return Boolean
+     */
+     Boolean update(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail);
+
+    /**
+     * 将作业标准 转换为 需要的作业详情
+     *
+     * @param studentLessonTrainingDetails 作业标准
+     * @param userIdList 学生ID
+     */
+    List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type);
+
+    /**
+     * 查询布置的作业详情
+     *
+     * @param courseHomeworkId 作业ID
+     * @param type 作业类型
+     */
+    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type);
+
+    /**
+     * 学生端查询作业详情
+     *
+     * @param courseHomeworkId 作业ID
+     * @param type 作业类型
+     * @param userId 学生ID
+     */
+    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId);
+}

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.HomeworkStat;
 import com.ym.mec.biz.dal.dto.IndexBaseDto;
 
 import java.util.Date;
@@ -67,4 +68,11 @@ public interface StudentServeService {
 
 
     List<IndexBaseDto> musicGroupHomeworkStatWithStu(String musicGroupId, Integer studentId, String startDay, String endDay);
+
+    /**
+     * 展示按钮红点
+     *
+     * @param userId 用户id
+     */
+    List<HomeworkStat> homeworkStat(Integer userId);
 }

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

@@ -26,4 +26,5 @@ public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore
     void transcod(Integer sysMusicScoreId);
 
     int updateExtStyleConfigJson(Integer id, String extStyleConfigJson);
-}
+
+}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java

@@ -252,4 +252,6 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
     * @date 2022/7/15 15:31
     */
     List<BaseMapDto<Integer,String>> queryOrganList(Integer userId);
+
+    PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverViewV2(TeacherServeQueryInfo queryInfo);
 }

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

@@ -1802,16 +1802,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     .collect(Collectors.toList());
 
             if (!CollectionUtils.isEmpty(tempIds) && schedule.getGroupType() == MUSIC) {
-                List<Map<Integer, String>> studentSubjectNameMaps = subjectDao.findStudentSubjectNameMaps(tempIds);
-                Map<Integer, String> studentSubjectNameMap = MapUtil.convertIntegerMap(studentSubjectNameMaps);
-                List<Map<Integer, Long>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
-                Map<Integer, Long> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     if (Objects.nonNull(studentAttendanceViewDto.getBeMerged()) && studentAttendanceViewDto.getBeMerged()) {
                         studentAttendanceViewDto.setSubjectName("被合并学员");
-                    } else {
-                        studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                        studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
                     }
                 });
             } else if (schedule.getGroupType() != MUSIC) {
@@ -3429,6 +3422,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         return 1;
     }
 
+    /**
+     * 查询班级列表
+     *
+     * @param classIds 班级id列表
+     */
+    @Override
+    public List<ClassGroup> queryByIds(List<Integer> classIds) {
+        return classGroupDao.queryByIds(classIds);
+    }
+
     @Override
     public PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
         PageInfo<MusicGroupCourseScheduleDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());

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

@@ -5,18 +5,23 @@ import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.StudentCourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.StudentCourseHomeworkReplyDao;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
 import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -49,9 +54,15 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 
 	@Autowired
 	private SysMessageService sysMessageService;
-	@Autowired
+    @Autowired
 	private CourseScheduleDao courseScheduleDao;
 
+    @Autowired
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
 	@Override
 	public BaseDAO<Long, CourseHomework> getDAO() {
 		return courseHomeworkDao;
@@ -228,4 +239,71 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    /**
+     * 获取课后作业详情
+     *
+     * @param courseScheduleId 课程id
+     */
+    @Override
+    public CourseHomeworkWrapper.CourseHomeworkList findCourseHomeworkDetail(Integer courseScheduleId) {
+
+        CourseHomeworkWrapper.CourseHomeworkQuery query = new CourseHomeworkWrapper.CourseHomeworkQuery();
+        query.setCourseScheduleId(courseScheduleId);
+        query.setPage(1);
+        query.setRows(1);
+        PageInfo<CourseHomeworkWrapper.CourseHomeworkList> courseHomeworkListPageInfo = studentExtracurricularExercisesSituationService.queryTeacherServeHomeworkDetailV2(
+            query);
+
+        List<CourseHomeworkWrapper.CourseHomeworkList> rows = courseHomeworkListPageInfo.getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            return null;
+        }
+        CourseHomeworkWrapper.CourseHomeworkList courseHomeworkList = rows.get(0);
+
+        // 设置作业信息
+        if (courseHomeworkList.getCourseHomeworkId() == null) {
+            return courseHomeworkList;
+        }
+
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
+            courseHomeworkList.getCourseHomeworkId(), ELessonTrainingType.HOMEWORK);
+
+        courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
+        courseHomeworkList.setType(ELessonTrainingType.HOMEWORK);
+        return courseHomeworkList;
+
+    }
+
+    /**
+     * 课外作业详情
+     *
+     * @param extraId 作业id
+     */
+    @Override
+    public CourseHomeworkWrapper.CourseHomeworkList findCourseExtraHomeworkDetail(Integer extraId) {
+
+        CourseHomeworkWrapper.CourseHomeworkQuery query = new CourseHomeworkWrapper.CourseHomeworkQuery();
+        query.setCourseScheduleId(extraId);
+        query.setPage(1);
+        query.setRows(1);
+        PageInfo<CourseHomeworkWrapper.CourseHomeworkList> courseHomeworkListPageInfo = studentExtracurricularExercisesSituationService.queryTeacherExtraHomeworkDetailV2(
+            query);
+        List<CourseHomeworkWrapper.CourseHomeworkList> rows = courseHomeworkListPageInfo.getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            throw new BizException("作业不存在");
+        }
+        CourseHomeworkWrapper.CourseHomeworkList courseHomeworkList = rows.get(0);
+
+        // 设置作业信息
+        if (courseHomeworkList.getCourseHomeworkId() == null) {
+            return courseHomeworkList;
+        }
+
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
+            courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+
+        courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
+        return courseHomeworkList;
+    }
 }

+ 139 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -1,18 +1,23 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
+import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.ExtracurricularExercisesService;
+import com.ym.mec.biz.service.MusicGroupService;
 import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -27,8 +32,10 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -53,6 +60,19 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	@Autowired
 	private StudentServeService studentServeService;
 
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+
+    @Autowired
+    private ClassGroupDao classGroupDao;
+
+    @Autowired
+    private ExtracurricularExercisesService extracurricularExercisesService;
+
+    @Autowired
+    private CourseHomeworkService courseHomeworkService;
+
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesReply> getDAO() {
 		return extracurricularExercisesReplyDao;
@@ -64,16 +84,25 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			throw new BizException("请选择课外训练");
 		}
 		List<ExtraExerciseStudentsDto> extraExerciseStudents = extracurricularExercisesReplyDao.findExtraExerciseStudents(extraExerciseId, studentName);
-		List<StudentCourseHomework> studentCourseHomeworks=new ArrayList<>();
-		for (ExtraExerciseStudentsDto extraExerciseStudent : extraExerciseStudents) {
-			StudentCourseHomework studentCourseHomework=new StudentCourseHomework();
-			studentCourseHomework.setId(extraExerciseStudent.getId());
+
+        ExtracurricularExercises extracurricularExercises = extracurricularExercisesDao.get(extraExerciseId);
+        if(extracurricularExercises == null){
+            throw new BizException("课外训练不存在");
+        }
+
+        List<StudentCourseHomework> studentCourseHomeworks=new ArrayList<>();
+        for (ExtraExerciseStudentsDto extraExerciseStudent : extraExerciseStudents) {
+            StudentCourseHomework studentCourseHomework= JSON.parseObject(JSON.toJSONString(extraExerciseStudent),StudentCourseHomework.class);
+            studentCourseHomework.setId(extraExerciseStudent.getId());
+            studentCourseHomework.setCourseHomeworkId(extraExerciseId);
+            studentCourseHomework.setCourseScheduleId(extraExerciseId);
 			studentCourseHomework.setUserId(extraExerciseStudent.getUserId());
 			studentCourseHomework.setUserName(extraExerciseStudent.getStudentName());
 			studentCourseHomework.setStatus(extraExerciseStudent.getStatus()==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
 			studentCourseHomework.setIsReplied(extraExerciseStudent.getIsReplied()==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
 			studentCourseHomework.setIsView(extraExerciseStudent.getIsView()==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
 			studentCourseHomework.setAvatar(extraExerciseStudent.getHeadUrl());
+            studentCourseHomework.setType(ELessonTrainingType.valueOf(extracurricularExercises.getGroupType()));
 			studentCourseHomeworks.add(studentCourseHomework);
 		}
 		return studentCourseHomeworks;
@@ -128,7 +157,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	}
 
 	@Override
-	public PageInfo findStudentExtraExercises(ExtraExercilseQueryInfo queryInfo) {
+	public PageInfo<ExtraExerciseStudentsDto> findStudentExtraExercises(ExtraExercilseQueryInfo queryInfo) {
 		PageInfo<ExtraExerciseStudentsDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
@@ -257,4 +286,107 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    /**
+     * 查询学生课外训练情况
+     *
+     * @param queryInfo
+     */
+    @Override
+    public PageInfo<StudentHomeworkRecordDto> findStudentExtraExercisesV2(ExtraExercilseQueryInfo queryInfo) {
+        queryInfo.setVersionTag("v2");
+        PageInfo<ExtraExerciseStudentsDto> studentExtraExercises = findStudentExtraExercises(queryInfo);
+
+        // 构建返回数据
+        List<ExtraExerciseStudentsDto> rows = studentExtraExercises.getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            return new PageInfo<>();
+        }
+        List<StudentHomeworkRecordDto> recordDtoList = new ArrayList<>();
+        for (ExtraExerciseStudentsDto row : rows) {
+            StudentHomeworkRecordDto studentHomeworkRecordDto = new StudentHomeworkRecordDto();
+            studentHomeworkRecordDto.setStudentCourseHomeworkId(row.getExtracurricularExercisesId().intValue());
+            studentHomeworkRecordDto.setTeacherId(row.getTeacherId());
+            studentHomeworkRecordDto.setTeacherName(row.getTeacherName());
+            studentHomeworkRecordDto.setHeadUrl(row.getHeadUrl());
+            studentHomeworkRecordDto.setHeadUrl(row.getHeadUrl());
+            studentHomeworkRecordDto.setStatus(row.getStatus());
+            studentHomeworkRecordDto.setExpiryDate(row.getExpireDate());
+            studentHomeworkRecordDto.setMusicGroupId(row.getMusicGroupId());
+            studentHomeworkRecordDto.setClassGroupId(row.getClassGroupId());
+            studentHomeworkRecordDto.setType(ELessonTrainingType.valueOf(row.getType()));
+            studentHomeworkRecordDto.setSubmitTime(row.getSubmitTime());
+            studentHomeworkRecordDto.setStandardFlag(row.getStandardFlag());
+            recordDtoList.add(studentHomeworkRecordDto);
+        }
+
+
+        // 构建返回数据
+
+        // 乐团信息
+
+        // 乐团信息
+        List<String> musicGroupIds = recordDtoList.stream().map(e -> e.getMusicGroupId())
+            .filter(Objects::nonNull).collect(Collectors.toList());
+        Map<String, MusicGroup> musicGroupMap = new HashMap<>();
+
+        if (!CollectionUtils.isEmpty(musicGroupIds)) {
+            List<MusicGroup> musicGroups = musicGroupService.queryListByIds(new HashSet<>(musicGroupIds));
+            musicGroupMap = musicGroups.stream().collect(Collectors.toMap(MusicGroup::getId, Function.identity()));
+        }
+
+        // 班级名称
+
+        List<Integer> classIds = recordDtoList.stream().map(e -> e.getClassGroupId())
+                                              .filter(Objects::nonNull).collect(Collectors.toList());
+        Map<Integer, ClassGroup> classGroupMap = new HashMap<>();
+
+        if (!CollectionUtils.isEmpty(classIds)) {
+            List<ClassGroup> classGroups = classGroupDao.queryByIds(classIds);
+            classGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, Function.identity()));
+        }
+
+        for (StudentHomeworkRecordDto studentHomeworkRecordDto : recordDtoList) {
+            // 乐团信息
+            MusicGroup musicGroup = musicGroupMap.get(studentHomeworkRecordDto.getMusicGroupId());
+            if (Objects.nonNull(musicGroup)) {
+                studentHomeworkRecordDto.setMusicGroupName(musicGroup.getName());
+                studentHomeworkRecordDto.setMusicGroupImg(musicGroup.getImg());
+            }
+
+            // 班级信息
+            ClassGroup classGroup = classGroupMap.get(studentHomeworkRecordDto.getClassGroupId());
+            if (Objects.nonNull(classGroup)) {
+                studentHomeworkRecordDto.setClassGroupName(classGroup.getName());
+            }
+
+            // 设置完成状态
+            if (studentHomeworkRecordDto.getStandardFlag() == null) {
+                studentHomeworkRecordDto.setFinishStatus(false);
+            } else
+            if (studentHomeworkRecordDto.getStandardFlag().equals(StandardEnum.STANDARD)
+                    || studentHomeworkRecordDto.getStandardFlag().equals(StandardEnum.EXCELLENT)){
+                studentHomeworkRecordDto.setFinishStatus(true);
+            } else {
+                studentHomeworkRecordDto.setFinishStatus(false);
+            }
+
+            // 设置提交时间
+            studentHomeworkRecordDto.setCourseScheduleId(studentHomeworkRecordDto.getStudentCourseHomeworkId().longValue());
+
+        }
+
+        PageInfo<StudentHomeworkRecordDto> pageInfo = new PageInfo<>(studentExtraExercises.getPageNo(),studentExtraExercises.getLimit());
+        pageInfo.setRows(recordDtoList);
+        pageInfo.setTotal(studentExtraExercises.getTotal());
+        return pageInfo;
+    }
+
+    @Override
+    public CourseHomeworkWrapper.CourseHomeworkList findStudentExtraExerciseDetailV2(Long studentExerciseId) {
+
+        return courseHomeworkService.findCourseExtraHomeworkDetail( studentExerciseId.intValue());
+
+
+    }
 }

+ 162 - 61
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -1,18 +1,19 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
-import com.ym.mec.biz.dal.entity.StudentCourseHomework;
-import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesService;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
 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;
 import com.ym.mec.common.exception.BizException;
@@ -33,6 +34,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -55,6 +57,17 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	@Autowired
 	private StudentCourseHomeworkDao studentCourseHomeworkDao;
 
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+
+    @Autowired
+    private ClassGroupDao classGroupDao;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
 	@Override
 	public BaseDAO<Long, ExtracurricularExercises> getDAO() {
 		return extracurricularExercisesDao;
@@ -64,22 +77,27 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public void createExtraExercises(ExtracurricularExercises exercises) {
 		if(StringUtils.isBlank(exercises.getTitle())){
-			throw new BizException("请填写标题");
+			// throw new BizException("请填写标题");
 		}
 		if(StringUtils.isBlank(exercises.getContent())){
-			throw new BizException("请填写内容");
-		}
-		List<MusicScoreSubjectDto> scoreSubjectDtoList = exercises.getMusicScoreSubjectDtos();
-		if(StringUtils.isBlank(exercises.getStudentIdList())){
-			if(scoreSubjectDtoList == null || scoreSubjectDtoList.size() == 0){
-				throw new BizException("请指定学生");
-			}
-			List<Integer> studentIdList = new ArrayList<>();
-			for (MusicScoreSubjectDto musicScoreSubjectDto : scoreSubjectDtoList) {
-				studentIdList.addAll(musicScoreSubjectDto.getUserIdList());
-			}
-			exercises.setStudentIdList(StringUtils.join(studentIdList,","));
+			// throw new BizException("请填写内容");
 		}
+        if (exercises.getMusicGroupId() != null) {
+            exercises.setGroupType(ELessonTrainingType.EXTRACURRICULAR.getCode());
+        } else {
+            exercises.setGroupType(ELessonTrainingType.EXTRA.getCode());
+        }
+        List<MusicScoreSubjectDto> scoreSubjectDtoList = exercises.getMusicScoreSubjectDtos();
+        if(StringUtils.isBlank(exercises.getStudentIdList())){
+            if(scoreSubjectDtoList == null || scoreSubjectDtoList.size() == 0){
+                throw new BizException("请指定学生");
+            }
+            List<Integer> studentIdList = new ArrayList<>();
+            for (MusicScoreSubjectDto musicScoreSubjectDto : scoreSubjectDtoList) {
+                studentIdList.addAll(musicScoreSubjectDto.getUserIdList());
+            }
+            exercises.setStudentIdList(StringUtils.join(studentIdList,","));
+        }
 
 		teacherDao.getLocked(exercises.getTeacherId());
 		Teacher teacher = teacherDao.get(exercises.getTeacherId());
@@ -91,7 +109,8 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 
 		if(Objects.isNull(exercises.getExpireDate())){
 			LocalDateTime localDateTime=LocalDateTime.now();
-			localDateTime=localDateTime.plusDays(2).withHour(21).withMinute(0).withSecond(0);
+			localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
+                    .withHour(21).withMinute(0).withSecond(0).withNano(0);
 			exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
 		}
 		List<Integer> studentIds = Arrays.asList(exercises.getStudentIdList().split(",")).stream().mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
@@ -100,49 +119,94 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		extracurricularExercisesDao.insert(exercises);
 		String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
 
-		Map<List<Integer>, List<MusicScoreSubjectDto>> collect = null;
-		Set<List<Integer>> lists = null;
-		if(!CollectionUtils.isEmpty(scoreSubjectDtoList)){
-			collect = scoreSubjectDtoList.stream().collect(Collectors.groupingBy(e -> e.getUserIdList()));
-			lists = collect.keySet();
-		}
-		for (Integer studentId : studentIds) {
-			ExtracurricularExercisesReply studentExtraExercise=new ExtracurricularExercisesReply();
-			studentExtraExercise.setExtracurricularExercisesId(exercises.getId());
-			studentExtraExercise.setUserId(studentId);
-			studentExtraExercise.setStatus(0);
-			studentExtraExercise.setIsReplied(0);
-			studentExtraExercise.setIsView(0);
-			studentExtraExercise.setIsRepliedTimely(0);
-			studentExtraExercise.setMusicScoreId(exercises.getMusicScoreId());
-			if(!CollectionUtils.isEmpty(scoreSubjectDtoList)){
-				for (List<Integer> list : lists) {
-					if(list.contains(studentId)){
-						MusicScoreSubjectDto musicScoreSubjectDto = collect.get(list).get(0);
-						studentExtraExercise.setMusicScoreId(StringUtils.join(musicScoreSubjectDto.getMusicScoreIdList(),","));
-						studentExtraExercise.setMusicScoreContent(JSONObject.toJSONString(musicScoreSubjectDto.getMusicScoreHomeworkDtoList()));
-						break;
-					}
-				}
-			}
-			extracurricularExercisesReplyDao.insert(studentExtraExercise);
-
-			String notifyUrl = "?courseScheduleID=" + studentExtraExercise.getId() + "&studentCourseHomeworkId=" + studentExtraExercise.getId() + "&extra=1";
-			String extra = "dayaedu" + notifyUrl + "&userId=" + studentId;
-			if (exercises.getMsgType() != ImSendTypeEnum.TXT){
-				sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_REMIND_IM_DETAIL,exercises.getTeacherId().toString(),extra,
-						new String[]{studentId.toString()},
-						null, exercises.getTitle(), dateStr);
-			}else {
-				sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_REMIND_IM,exercises.getTeacherId().toString(),extra,
-						new String[]{studentId.toString()},
-						null, exercises.getTitle(), dateStr,exercises.getContent());
-			}
-			Map<Integer, String> userMap = new HashMap<>();
-			userMap.put(studentId, studentId.toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_EXTRA_REMIND,
-					userMap, null, 0, 3+notifyUrl, "STUDENT",
-					teacher.getRealName(),exercises.getTitle(), dateStr);
+        ExtracurricularExercisesReply studentExtraExercise=new ExtracurricularExercisesReply();
+        studentExtraExercise.setExtracurricularExercisesId(exercises.getId());
+        studentExtraExercise.setStatus(0);
+        studentExtraExercise.setIsReplied(0);
+        studentExtraExercise.setIsView(0);
+        studentExtraExercise.setIsRepliedTimely(0);
+        studentExtraExercise.setMusicScoreId(exercises.getMusicScoreId());
+
+        List<ExtracurricularExercisesReply> extracurricularExercisesReplies = new ArrayList<>();
+
+        List<StudentLessonTrainingDetail> studentLessonTrainingDetailList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(scoreSubjectDtoList)){
+            for (MusicScoreSubjectDto musicScoreSubjectDto : scoreSubjectDtoList) {
+                // 原本作业逻辑
+                for (Integer userId : musicScoreSubjectDto.getUserIdList()) {
+                    studentExtraExercise.setUserId(userId);
+                    studentExtraExercise.setMusicScoreId(StringUtils.join(musicScoreSubjectDto.getMusicScoreIdList(),","));
+                    studentExtraExercise.setMusicScoreContent(JSONObject.toJSONString(musicScoreSubjectDto.getMusicScoreHomeworkDtoList()));
+                    extracurricularExercisesReplies.add(JSON.parseObject(JSON.toJSONString(studentExtraExercise),ExtracurricularExercisesReply.class));
+                }
+                if (CollectionUtils.isEmpty(musicScoreSubjectDto.getStudentLessonTrainingDetails())) {
+                    continue;
+                }
+                for (StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail studentLessonTrainingDetail : musicScoreSubjectDto.getStudentLessonTrainingDetails()) {
+                    studentLessonTrainingDetail.setSubjectId(musicScoreSubjectDto.getSubjectId());
+                }
+                // 作业详情
+                studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
+                                   .homeWorkDetail(musicScoreSubjectDto.getStudentLessonTrainingDetails(), musicScoreSubjectDto.getUserIdList(), exercises.getId(),
+                                                   ELessonTrainingType.valueOf(exercises.getGroupType())));
+
+            }
+        } else {
+            for (Integer studentId : studentIds) {
+                studentExtraExercise.setUserId(studentId);
+                extracurricularExercisesReplies.add(JSON.parseObject(JSON.toJSONString(studentExtraExercise),ExtracurricularExercisesReply.class));
+
+            }
+            // 作业详情
+            studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
+                                                       .homeWorkDetail(exercises.getStudentLessonTrainingDetails(), studentIds,exercises.getId(),
+                                                       ELessonTrainingType.valueOf(exercises.getGroupType())));
+        }
+        for (ExtracurricularExercisesReply extracurricularExercisesReply : extracurricularExercisesReplies) {
+            extracurricularExercisesReplyDao.insert(extracurricularExercisesReply);
+        }
+        if (!CollectionUtils.isEmpty(studentLessonTrainingDetailList)) {
+            studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetailList);
+            exercises.setVersionTag("v2");
+        } else {
+            exercises.setVersionTag("v1");
+        }
+        extracurricularExercisesDao.update(exercises);
+
+        for (ExtracurricularExercisesReply extracurricularExercisesReply : extracurricularExercisesReplies) {
+            Integer studentId = extracurricularExercisesReply.getUserId();
+            if (exercises.getVersionTag().equals("v2")) {
+
+                String notifyUrl = "homeworkId=" + exercises.getId() + "&homeworkType=" +exercises.getGroupType();
+                String extra = "dayaedu?type=homework&" + notifyUrl ;
+                sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_REMIND_IM_DETAIL_V2, exercises.getTeacherId().toString(), extra,
+                        new String[]{studentId.toString()},
+                        null, dateStr);
+
+                Map<Integer, String> userMap = new HashMap<>();
+                userMap.put(studentId, studentId.toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_EXTRA_REMIND_V2,
+                        userMap, null, 0, "homework?" + notifyUrl, "STUDENT",
+                        teacher.getRealName());
+            } else {
+
+                String notifyUrl = "?courseScheduleID=" + extracurricularExercisesReply.getId() + "&studentCourseHomeworkId=" + extracurricularExercisesReply.getId() + "&extra=1";
+                String extra = "dayaedu" + notifyUrl + "&userId=" + studentId;
+                if (exercises.getMsgType() != ImSendTypeEnum.TXT) {
+                    sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_REMIND_IM_DETAIL, exercises.getTeacherId().toString(), extra,
+                            new String[]{studentId.toString()},
+                            null, exercises.getTitle(), dateStr);
+                } else {
+                    sysMessageService.batchSendImMessage(MessageTypeEnum.EXTRA_REMIND_IM, exercises.getTeacherId().toString(), extra,
+                            new String[]{studentId.toString()},
+                            null, exercises.getTitle(), dateStr, exercises.getContent());
+                }
+                Map<Integer, String> userMap = new HashMap<>();
+                userMap.put(studentId, studentId.toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_EXTRA_REMIND,
+                        userMap, null, 0, 3 + notifyUrl, "STUDENT",
+                        teacher.getRealName(), exercises.getTitle(), dateStr);
+            }
 		}
 		studentServeService.updateExercisesSituation(exercises.getMusicGroupId(), new Date(), studentIds, exercises.getTeacherId());
 	}
@@ -314,4 +378,41 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		}
 		return pageInfo;
 	}
+
+    @Override
+    public PageInfo<CourseHomeworkWrapper.WebExtraCourseHomework> findExtraExercilsesV2(ExtraExercilseQueryInfo queryInfo) {
+        PageInfo<ExtracurricularExercises> extracurricularExercisesPageInfo = this.queryPage(queryInfo);
+        List<ExtracurricularExercises> rows = extracurricularExercisesPageInfo.getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            return new PageInfo<>();
+        }
+
+        PageInfo<CourseHomeworkWrapper.WebExtraCourseHomework> convert = extracurricularExercisesPageInfo.convert(
+            o -> JSON.parseObject(JSON.toJSONString(o), CourseHomeworkWrapper.WebExtraCourseHomework.class));
+
+        List<CourseHomeworkWrapper.WebExtraCourseHomework> rows1 = convert.getRows();
+
+        // 设置班级名称
+        List<Integer> classIds = rows1.stream().map(CourseHomeworkWrapper.WebExtraCourseHomework::getClassGroupId).filter(Objects::nonNull).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(classIds)) {
+            return convert;
+        }
+
+        List<ClassGroup> classGroups = classGroupDao.queryByIds(classIds);
+
+        // 分组
+        Map<Integer, ClassGroup> classGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, Function.identity()));
+
+        rows1.forEach(o -> {
+            if (o.getClassGroupId() == null) {
+                return;
+            }
+            ClassGroup classGroup = classGroupMap.get(o.getClassGroupId());
+            if (classGroup != null) {
+                o.setClassGroupName(classGroup.getName());
+            }
+        });
+
+        return convert;
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -245,4 +245,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 		}
         return dtos;
     }
+
+    @Override
+    public List<ImGroup> queryByUserIdV2(Integer userId, String search, String groupType, String musicGroupId, String classType) {
+        return imGroupDao.queryByUserIdV2(userId, search, groupType, musicGroupId, classType);
+    }
+
+    @Override
+    public List<ImGroupMemberDto> queryMemberByIdV2(String imGroupId, String search, Integer subjectId, Boolean vipFlag) {
+        return imGroupDao.queryMemberByIdV2(imGroupId,search,subjectId,vipFlag);
+    }
 }

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

@@ -194,7 +194,16 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 //		executor.shutdown();
 	}
 
-	public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
+    @Override
+    public List<ImUserFriendDto> queryFriendListByUserIdV2(Integer userId, String search, String musicGroupId, Integer subjectId, Boolean vipFlag) {
+        // 逻辑过于复杂 拿出数据后筛选
+        return imUserFriendDao.queryFriendListByUserIdV2(userId, search,musicGroupId,subjectId,vipFlag);
+
+
+
+    }
+
+    public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
 		List<ImUserFriend> imUserFriends = new ArrayList<>();
 		Set<Integer> educationIds = new HashSet<>();
 		Integer repairUserId = null;

+ 238 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/LessonExaminationServiceImpl.java

@@ -0,0 +1,238 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto;
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto1;
+import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo;
+import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo1;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 进度评测表(LessonExamination)表服务实现类
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:44
+ */
+@Service("lessonExaminationService")
+public class LessonExaminationServiceImpl extends ServiceImpl<LessonExaminationDao, LessonExamination> implements LessonExaminationService {
+
+    private final static Logger log = LoggerFactory.getLogger(LessonExaminationServiceImpl.class);
+
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private StudentLessonExaminationService studentLessonExaminationService;
+    @Autowired
+    private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
+    @Autowired
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private OrganizationDao organizationDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Override
+    public LessonExaminationDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void publish(LessonExaminationSaveDto param) {
+        log.info("publish param: ",param);
+        if(CollectionUtils.isEmpty(param.getStudentLessonExaminationSaveDtos())){
+            throw new BizException("请选择学员");
+        }
+        String expireTime = sysConfigDao.findConfigValue("homework_expire_time");
+        if(org.apache.commons.lang3.StringUtils.isEmpty(expireTime)){
+            expireTime = "7";
+        }
+        Date expireDate = DateUtil.addDays(new Date(), Integer.parseInt(expireTime));
+        LessonExamination lessonExamination = new LessonExamination();
+        lessonExamination.setExpectNum(param.getExpectNum());
+        if(param.getCourseScheduleId() != null){
+            CourseSchedule schedule = courseScheduleDao.get(param.getCourseScheduleId());
+            if(Objects.nonNull(schedule)){
+                lessonExamination.setOrganId(schedule.getOrganId());
+                lessonExamination.setMusicGroupId(schedule.getMusicGroupId());
+                lessonExamination.setClassGroupId(schedule.getClassGroupId());
+                lessonExamination.setCourseScheduleId(schedule.getId());
+            }
+        }else if(param.getClassGroupId() != null){
+            ClassGroup classGroup = classGroupDao.get(param.getClassGroupId());
+            if(Objects.nonNull(classGroup)){
+                lessonExamination.setClassGroupId(classGroup.getId());
+                lessonExamination.setMusicGroupId(classGroup.getMusicGroupId());
+                MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+                if(Objects.nonNull(musicGroup)){
+                    lessonExamination.setOrganId(musicGroup.getOrganId());
+                }
+            }
+        }else if(StringUtils.isNotEmpty(param.getMusicGroupId())){
+            MusicGroup musicGroup = musicGroupDao.get(param.getMusicGroupId());
+            if(Objects.nonNull(musicGroup)){
+                lessonExamination.setMusicGroupId(musicGroup.getId());
+                lessonExamination.setOrganId(musicGroup.getOrganId());
+            }
+        }else {
+            Teacher teacher = teacherDao.get(param.getTeacherId());
+            if(Objects.nonNull(teacher)){
+                lessonExamination.setOrganId(teacher.getTeacherOrganId());
+            }
+        }
+        lessonExamination.setExpireDate(expireDate);
+        lessonExamination.setTeacherId(param.getTeacherId());
+        baseMapper.insert(lessonExamination);
+        List<Integer> studentIds = studentLessonExaminationService.save(lessonExamination.getId(), param.getStudentLessonExaminationSaveDtos());
+        studentLessonExaminationDetailService.save(lessonExamination.getId(),param.getStudentLessonExaminationSaveDtos());
+        //更新服务指标相关数量信息
+        studentExtracurricularExercisesSituationService.updateNum(lessonExamination,studentIds);
+        //消息推送
+        String teacherName = teacherDao.queryNameById(param.getTeacherId());
+        String notifyUrl = "evaluating?evaluateId=" + lessonExamination.getId();
+        String extra = "dayaedu" + notifyUrl + "&type=evaluating&evaluateId=" + lessonExamination.getId();
+        String[] strings = studentIds.stream().map(e->e.toString()).toArray(String[]::new);
+        Map<Integer, String> userMap = studentIds.stream().collect(Collectors.toMap(e -> e, v -> v.toString()));
+        sysMessageService.batchSendImMessage(MessageTypeEnum.IM_PUBLISH_LESSON_EXAMINATION,param.getTeacherId().toString(), extra,
+                strings,null, teacherName);
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_PUBLISH_LESSON_EXAMINATION,
+                userMap, null, 0, notifyUrl, "STUDENT", teacherName);
+    }
+
+    @Override
+    public PageInfo<LessonExaminationResultDto> queryPage(LessonExaminationQueryInfo queryInfo) {
+        PageInfo<LessonExaminationResultDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        List<LessonExaminationResultDto> dataList = null;
+        int count = baseMapper.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = baseMapper.queryPage(params);
+            Set<String> musicGroupIds = dataList.stream().filter(e -> StringUtils.isNotEmpty(e.getMusicGroupId())).
+                    map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+            Map<String, String> musicGroupNameMap = Collections.EMPTY_MAP;
+            if(CollectionUtils.isNotEmpty(musicGroupIds)){
+                musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
+            }
+            List<Long> examinationIds = dataList.stream().filter(e -> StringUtils.isEmpty(e.getMusicGroupId())).map(e -> e.getId()).collect(Collectors.toList());
+            Map<Long,String> nameMap = Collections.EMPTY_MAP;
+            if(CollectionUtils.isNotEmpty(examinationIds)){
+                nameMap = MapUtil.convertMybatisMap(studentLessonExaminationService.getDao().getStudentName(examinationIds));
+            }
+            List<Integer> teacherIds = dataList.stream().map(e -> e.getTeacherId()).distinct().collect(Collectors.toList());
+            Map<Integer, String> teacherNameMap = MapUtil.convertIntegerMap(teacherDao.queryNameByIdList(teacherIds));
+            Set<Integer> organIds = dataList.stream().map(e -> e.getOrganId()).collect(Collectors.toSet());
+            Map<Integer, String> organNameMap = MapUtil.convertIntegerMap(organizationDao.findOrganNameMapList(organIds));
+            for (LessonExaminationResultDto vo : dataList) {
+                vo.setOrganName(organNameMap.get(vo.getOrganId()));
+                vo.setMusicGroupName(musicGroupNameMap.get(vo.getMusicGroupId()));
+                vo.setTeacherName(teacherNameMap.get(vo.getTeacherId()));
+                String username = nameMap.get(vo.getId());
+                if(StringUtils.isNotEmpty(username)){
+                    if(vo.getExpectNum() > 1){
+                        StringBuffer sb = new StringBuffer(username);
+                        sb.append("等").append(vo.getExpectNum()).append("名学员");
+                        vo.setStudentNames(sb.toString());
+                    }else {
+                        vo.setStudentNames(username);
+                    }
+                }
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<LessonExaminationResultDto1> queryPageByStudent(LessonExaminationQueryInfo1 queryInfo) {
+        PageInfo<LessonExaminationResultDto1> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<LessonExaminationResultDto1> dataList = null;
+        int count = baseMapper.findCountByStudent(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = baseMapper.queryPageByStudent(params);
+            Set<String> musicGroupIds = dataList.stream().filter(e -> StringUtils.isNotEmpty(e.getMusicGroupId())).
+                    map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+            Map<String, String> musicGroupNameMap = Collections.EMPTY_MAP;
+            if(CollectionUtils.isNotEmpty(musicGroupIds)){
+                musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
+            }
+            for (LessonExaminationResultDto1 vo : dataList) {
+                vo.setMusicGroupName(musicGroupNameMap.get(vo.getMusicGroupId()));
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public LessonExaminationResultDto1 getOne(Integer userId, Long lessonExaminationId) {
+        return baseMapper.getOneByStudent(userId,lessonExaminationId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void pushEndMsg() {
+        //获取截止的测验列表
+        List<LessonExamination> lessonExaminations = baseMapper.queryEndList();
+        if(CollectionUtils.isNotEmpty(lessonExaminations)){
+            List<Long> examinations = new ArrayList<>();
+            for (LessonExamination vo : lessonExaminations) {
+                examinations.add(vo.getId());
+                Map<Integer, String> userMap = new HashMap<>(1);
+                userMap.put(vo.getTeacherId(), vo.getTeacherId().toString());
+                String notifyUrl = "evaluating?evaluateId=" + vo.getId();
+                String dateToString = DateUtil.dateToString(vo.getCreateTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_LESSON_EXAMINATION_END,
+                        userMap, null, 0, notifyUrl, "TEACHER", dateToString);
+            }
+            this.lambdaUpdate().in(LessonExamination::getId,examinations)
+                    .set(LessonExamination::getPushFlag,true).update();
+        }
+    }
+
+    @Override
+    public List<Subject> querySubject(Long lessonExaminationId) {
+        return baseMapper.querySubject(lessonExaminationId);
+    }
+
+}
+

+ 544 - 33
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -7,18 +7,26 @@ import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,14 +34,6 @@ import org.springframework.util.CollectionUtils;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.CourseHomeworkDto;
-import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
-import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
-import com.ym.mec.biz.dal.dto.EduHomeworkStatDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
-import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
-import com.ym.mec.biz.dal.dto.StudentVisitCourseHomeWorkDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -42,12 +42,6 @@ import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.MusicGroupTrainPlanService;
-import com.ym.mec.biz.service.StudentCourseHomeworkService;
-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.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -101,9 +95,24 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private SysMusicScoreDao sysMusicScoreDao;
     @Autowired
-	private MusicGroupTrainPlanService musicGroupTrainPlanService;
+    private MusicGroupTrainPlanService musicGroupTrainPlanService;
     @Autowired
-	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+
+    @Autowired
+    private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+    @Autowired
+    private StudentLessonExaminationDao studentLessonExaminationDao;
+
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
 
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
@@ -213,27 +222,27 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleID);
         
         if(courseSchedule == null){
-        	throw new BizException("课程不存在");
+            throw new BizException("课程不存在");
         }
 
         MusicGroupTrainPlan musicGroupTrainPlan = null;
-		//获取课程规划
-		MusicGroupTrainPlanSaveDto schoolTerm = musicGroupTrainPlanService.getSchoolTerm(courseSchedule);
-		int courseNumNo = courseScheduleDao.getCourseNumNo(schoolTerm);
-		List<MusicGroupTrainPlan> planList = musicGroupTrainPlanService.queryPlan(schoolTerm);
-		if(planList.size() >= courseNumNo){
-			musicGroupTrainPlan = planList.get(courseNumNo - 1);
-		}
-		
+        //获取课程规划
+        MusicGroupTrainPlanSaveDto schoolTerm = musicGroupTrainPlanService.getSchoolTerm(courseSchedule);
+        int courseNumNo = courseScheduleDao.getCourseNumNo(schoolTerm);
+        List<MusicGroupTrainPlan> planList = musicGroupTrainPlanService.queryPlan(schoolTerm);
+        if(planList.size() >= courseNumNo){
+            musicGroupTrainPlan = planList.get(courseNumNo - 1);
+        }
+
         CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkDao.findCourseHomeworkStudentDetail(courseScheduleID, userId);
         if(courseHomeworkStudentDetail == null){
-        	courseHomeworkStudentDetail = new CourseHomeworkStudentDetailDto();
-			courseHomeworkStudentDetail.setMusicGroupTrainPlan(musicGroupTrainPlan);
-        	return courseHomeworkStudentDetail;
+            courseHomeworkStudentDetail = new CourseHomeworkStudentDetailDto();
+            courseHomeworkStudentDetail.setMusicGroupTrainPlan(musicGroupTrainPlan);
+            return courseHomeworkStudentDetail;
         }
         courseHomeworkStudentDetail.setExpire(DateUtil.isOverdue(courseHomeworkStudentDetail.getSubmitTime(),
                 sysConfigDao.findConfigValue("file_expiration_time")));
-		courseHomeworkStudentDetail.setMusicGroupTrainPlan(musicGroupTrainPlan);
+        courseHomeworkStudentDetail.setMusicGroupTrainPlan(musicGroupTrainPlan);
         
         SysUser sysUser = teacherDao.getUser(userId.intValue());
         courseHomeworkStudentDetail.setStudentId(userId.intValue());
@@ -349,15 +358,40 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
     @Override
     public void homeworkRemind() {
+        // 课后作业通知
         List<StudentCourseHomework> list = studentCourseHomeworkDao.queryNotDoneHomeworkList();
         StringBuffer sb;
         for (StudentCourseHomework sch : list) {
-            sb = new StringBuffer("courseScheduleID=").append(sch.getCourseScheduleId()).append("&studentCourseHomeworkId=").append(sch.getId());
+            sb = new StringBuffer("homeworkId=").append(sch.getCourseScheduleId()).append("&homeworkType=HOMEWORK");
             Map<Integer, String> receivers = new HashMap<Integer, String>(1);
             receivers.put(sch.getUserId(), sch.getUserId() + "");
-            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_JOB_MESSAGE, receivers, null, 0, "3?" + sb, "STUDENT", sch.getCourseHomework()
-                    .getMusicGroup().getName(), sch.getCourseHomework().getClassGroup().getName());
+            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_JOB_MESSAGE_V2, receivers, null, 0, "homework?" + sb, "STUDENT");
+        }
+
+        // 课外作业通知
+        List<ExtracurricularExercisesReply> extraList =  extracurricularExercisesReplyDao.queryNotDoneHomeworkList();
+        for (ExtracurricularExercisesReply reply : extraList) {
+            sb = new StringBuffer("homeworkId=").append(reply.getExtracurricularExercisesId())
+                    .append("&homeworkType=")
+                    .append(reply.getExtracurricularExercises().getGroupType());
+            Map<Integer, String> receivers = new HashMap<Integer, String>(1);
+            receivers.put(reply.getUserId(), reply.getUserId() + "");
+            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_JOB_MESSAGE_EXTRA_V2, receivers, null, 0, "homework?" + sb, "STUDENT");
         }
+
+        //获取即将截止的测评
+        String date = DateUtil.dateToString(DateUtil.addDays(new Date(), 1),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        List<StudentLessonExamination> examinations = studentLessonExaminationDao.queryEndList(date);
+        if(!CollectionUtils.isEmpty(examinations)){
+            Map<Long, List<StudentLessonExamination>> listMap = examinations.stream().collect(Collectors.groupingBy(e -> e.getLessonExaminationId()));
+            for (Long lessonExaminationId : listMap.keySet()) {
+                List<StudentLessonExamination> studentLessonExaminations = listMap.get(lessonExaminationId);
+                Map<Integer, String> receivers = studentLessonExaminations.stream().collect(Collectors.toMap(e -> e.getUserId(), e -> e.getUserId().toString()));
+                sb = new StringBuffer("evaluating?evaluateId=").append(lessonExaminationId);
+                sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_NO_SUBMIT_LESSON_EXAMINATION, receivers, null, 0, sb.toString(), "STUDENT");
+            }
+        }
+
     }
 
     @Override
@@ -381,7 +415,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     }
 
     @Override
-    public PageInfo findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo) {
+    public PageInfo<StudentHomeworkRecordDto> findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo) {
         PageInfo<StudentHomeworkRecordDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
@@ -404,6 +438,59 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         if (count == 0) {
             dataList = new ArrayList<>();
         }
+
+        // 构建返回数据
+
+        // 乐团信息
+
+        // 乐团信息
+        Map<String, MusicGroup> musicGroupMap = new HashMap<>();
+        List<String> musicGroupIds = dataList.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toList());
+
+        if (!CollectionUtils.isEmpty(musicGroupIds)) {
+            List<MusicGroup> musicGroups = musicGroupService.queryListByIds(new HashSet<>(musicGroupIds));
+            musicGroupMap = musicGroups.stream().collect(Collectors.toMap(MusicGroup::getId, Function.identity()));
+        }
+
+
+        // 班级名称
+
+        List<Integer> classIds = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
+        Map<Integer, ClassGroup> classGroupMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(classIds)) {
+
+            List<ClassGroup> classGroups = classGroupDao.queryByIds(classIds);
+            classGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, Function.identity()));
+        }
+
+
+        for (StudentHomeworkRecordDto studentHomeworkRecordDto : dataList) {
+            // 乐团信息
+            MusicGroup musicGroup = musicGroupMap.get(studentHomeworkRecordDto.getMusicGroupId());
+            if (Objects.nonNull(musicGroup)) {
+                studentHomeworkRecordDto.setMusicGroupName(musicGroup.getName());
+                studentHomeworkRecordDto.setMusicGroupImg(musicGroup.getImg());
+            }
+
+            // 班级信息
+            ClassGroup classGroup = classGroupMap.get(studentHomeworkRecordDto.getClassGroupId());
+            if (Objects.nonNull(classGroup)) {
+                studentHomeworkRecordDto.setClassGroupName(classGroup.getName());
+            }
+
+            // 设置完成状态
+            if (studentHomeworkRecordDto.getStandardFlag() == null) {
+                studentHomeworkRecordDto.setFinishStatus(false);
+            } else
+            if (studentHomeworkRecordDto.getStandardFlag().equals(StandardEnum.STANDARD)
+                || studentHomeworkRecordDto.getStandardFlag().equals(StandardEnum.EXCELLENT)){
+                studentHomeworkRecordDto.setFinishStatus(true);
+            } else {
+                studentHomeworkRecordDto.setFinishStatus(false);
+            }
+            studentHomeworkRecordDto.setType(ELessonTrainingType.HOMEWORK);
+        }
+
         pageInfo.setRows(dataList);
         return pageInfo;
     }
@@ -672,4 +759,428 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         }
         return dataList;
     }
+
+    /**
+     * 根据课程计划id查询学生作业列表
+     *
+     * @param courseScheduleIds 课程计划id列表
+     */
+    @Override
+    public List<StudentCourseHomework> queryByCourseScheduleIds(List<Integer> courseScheduleIds) {
+        return studentCourseHomeworkDao.findByCourseScheduleIds(courseScheduleIds);
+    }
+
+    @Override
+    public List<StudentCourseHomework> findStudentCourseHomeworkByCourseV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query) {
+        List<StudentCourseHomework> studentCourseHomeworkByCourse = studentCourseHomeworkDao.findStudentCourseHomeworkByCourse(query);
+        for (StudentCourseHomework studentCourseHomework : studentCourseHomeworkByCourse) {
+            studentCourseHomework.setType(ELessonTrainingType.HOMEWORK);
+        }
+        return getStudentCourseHomeworks(studentCourseHomeworkByCourse);
+
+    }
+
+    @NotNull
+    private List<StudentCourseHomework> getStudentCourseHomeworks(List<StudentCourseHomework> studentCourseHomeworkByCourse) {
+        if (CollectionUtils.isEmpty(studentCourseHomeworkByCourse)) {
+            return Collections.emptyList();
+        }
+
+        // 设置是否会员
+
+        // 获取用户id集合
+        List<Integer> userIds = studentCourseHomeworkByCourse.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
+
+        // 获取学生列表
+        List<Student> students = studentDao.findByStudentIds(userIds);
+        if (CollectionUtils.isEmpty(students)) {
+            return studentCourseHomeworkByCourse;
+        }
+        // 转map
+        Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s -> s, (s1, s2) -> s1));
+        for (StudentCourseHomework studentCourseHomework : studentCourseHomeworkByCourse) {
+            if (studentMap.containsKey(studentCourseHomework.getUserId())) {
+                Student student = studentMap.get(studentCourseHomework.getUserId());
+                if ((student.getMembershipEndTime() == null || student.getMembershipEndTime().compareTo(new Date()) < 0) &&
+                    (student.getExperienceMembershipEndTime() == null || student.getExperienceMembershipEndTime().compareTo(new Date()) < 0)) {
+                    studentCourseHomework.setVipFlag(false);
+                } else {
+                    studentCourseHomework.setVipFlag(true);
+                }
+                studentCourseHomework.setSubjectId(Integer.parseInt(student.getSubjectIdList()));
+            }
+        }
+
+
+        // 设置声部
+
+        // 获取声部id集合
+        List<Integer> voicePartIds = students.stream().map(Student::getSubjectIdList).map(Integer::parseInt).collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(voicePartIds)) {
+            return studentCourseHomeworkByCourse;
+        }
+
+        List<Subject> subjectList = subjectDao.findBySubjectIds(voicePartIds);
+        // 转map
+        Map<Integer, Subject> subjectMap = subjectList.stream().collect(Collectors.toMap(Subject::getId, s -> s, (s1, s2) -> s1));
+        for (StudentCourseHomework studentCourseHomework : studentCourseHomeworkByCourse) {
+            if (subjectMap.containsKey(studentCourseHomework.getSubjectId())) {
+                studentCourseHomework.setSubjectName(subjectMap.get(studentCourseHomework.getSubjectId()).getName());
+            }
+        }
+
+        // 设置完成状态
+        for (StudentCourseHomework studentCourseHomework : studentCourseHomeworkByCourse) {
+            if (studentCourseHomework.getStandardFlag() == null) {
+                studentCourseHomework.setFinishFlag(false);
+            } else
+            if( studentCourseHomework.getStandardFlag().equals(StandardEnum.STANDARD) || studentCourseHomework.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
+                studentCourseHomework.setFinishFlag(true);
+            } else {
+                studentCourseHomework.setFinishFlag(false);
+            }
+        }
+
+        // 设置每个学生的作业完成情况
+        List<Integer> studentIds = studentCourseHomeworkByCourse.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
+
+        StudentCourseHomework studentCourseHomework = studentCourseHomeworkByCourse.get(0);
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
+            .findByStudentIdsAndCourseScheduleId(studentIds, studentCourseHomework.getCourseHomeworkId(),studentCourseHomework.getType());
+
+        if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+            // 按userid分组 ,
+            Map<Long, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> studentLessonTrainingDetailMap = studentLessonTrainingDetails.stream()
+                .collect(Collectors.groupingBy(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getUserId,
+                                               LinkedHashMap::new, Collectors.toList()));
+
+            for (StudentCourseHomework studentCourseHomework1 : studentCourseHomeworkByCourse) {
+                if (studentLessonTrainingDetailMap.containsKey(studentCourseHomework1.getUserId().longValue())) {
+                    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails1 = studentLessonTrainingDetailMap.get(studentCourseHomework1.getUserId().longValue());
+                    studentCourseHomework1.setStudentLessonTrainingDetail(studentLessonTrainingDetails1);
+                }
+            }
+        }
+
+        return studentCourseHomeworkByCourse;
+    }
+
+    @Override
+    public List<StudentCourseHomework> findExtraExerciseStudentsV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query) {
+        List<StudentCourseHomework> extraExerciseStudents = extracurricularExercisesReplyService.findExtraExerciseStudents(
+            query.getCourseScheduleId().longValue(), null);
+
+        List<StudentCourseHomework> studentCourseHomeworks = getStudentCourseHomeworks(extraExerciseStudents);
+        if (query.getSubjectId() != null) {
+            studentCourseHomeworks = studentCourseHomeworks.stream()
+                                                         .filter(o ->o.getSubjectId() != null)
+                                                         .filter(o -> o.getSubjectId().equals(query.getSubjectId()))
+                                                         .collect(Collectors.toList());
+        }
+        return studentCourseHomeworks;
+    }
+
+    /**
+     * 学生端查看练习详情
+     *
+     * @param query
+     * @return
+     */
+    @Override
+    public CourseHomeworkWrapper.CourseHomeworkList findStudentHomeworkRecordDetail(CourseHomeworkWrapper.StudentCourseHomeworkQuery query) {
+        CourseHomeworkWrapper.CourseHomeworkList courseHomeworkDetail = null;
+        if (ELessonTrainingType.HOMEWORK.equals(query.getType())) {
+            courseHomeworkDetail= courseHomeworkService.findCourseHomeworkDetail(
+                query.getCourseScheduleId());
+
+            StudentCourseHomework homework = studentCourseHomeworkDao
+                    .getHomeworkByUserIdAndCourseHomeworkId(query.getUserId(), courseHomeworkDetail.getCourseHomeworkId());
+            if (homework == null) {
+                throw new BizException("作业不存在");
+            }
+            courseHomeworkDetail.setSubmitTime(homework.getSubmitTime());
+        } else {
+            courseHomeworkDetail = courseHomeworkService.findCourseExtraHomeworkDetail(query.getCourseScheduleId());
+            ExtracurricularExercisesReply exercisesReply = extracurricularExercisesReplyDao.getByExtraIdAndUserId(courseHomeworkDetail.getCourseHomeworkId(), query.getUserId());
+            if (exercisesReply == null) {
+                throw new BizException("作业不存在");
+            }
+            courseHomeworkDetail.setSubmitTime(exercisesReply.getSubmitTime());
+        }
+
+        // 获取作业信息
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> detailList = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
+            courseHomeworkDetail.getCourseHomeworkId(), query.getType(), query.getUserId());
+
+        long count = detailList.stream().filter(o -> o.getTrainingTimes() < o.getTimes()).count();
+        if (count >0) {
+            courseHomeworkDetail.setFinishStatus(false);
+        } else {
+            courseHomeworkDetail.setFinishStatus(true);
+        }
+        courseHomeworkDetail.setTrainingDetailList(detailList);
+
+        return courseHomeworkDetail;
+
+    }
+
+    /**
+     * 添加学生作业练习记录
+     *
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addStudentHomeworkRecord(CourseHomeworkWrapper.AddStudentHomeworkRecord record) {
+
+        StudentLessonTrainingDetail studentLessonTrainingDetail = studentLessonTrainingDetailService.getById(record.getId());
+        if (studentLessonTrainingDetail == null) {
+            throw new BizException("练习记录不存在");
+        }
+        // 设置个人作业练习详情记录
+        studentLessonTrainingDetail.setTrainingTimes(studentLessonTrainingDetail.getTrainingTimes() +1);
+
+        if (studentLessonTrainingDetail.getTrainingTimes() >= studentLessonTrainingDetail.getTimes()) {
+            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.STANDARD);
+        } else {
+            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_STANDARD);
+
+        }
+        studentLessonTrainingDetail.setUpdateTime(new Date());
+        studentLessonTrainingDetailService.updateById(studentLessonTrainingDetail);
+
+        // 查询当前作业的其他作业,判断是否全部完成
+        List<StudentLessonTrainingDetail> list = studentLessonTrainingDetailService.lambdaQuery()
+                                   .eq(StudentLessonTrainingDetail::getCourseHomeworkId,
+                                       studentLessonTrainingDetail.getCourseHomeworkId())
+                                   .eq(StudentLessonTrainingDetail::getUserId,
+                                       record.getUserId())
+                                   .eq(StudentLessonTrainingDetail::getType,
+                                       studentLessonTrainingDetail.getType())
+                                   .in(StudentLessonTrainingDetail::getTrainingStatus,
+                                       StandardEnum.NOT_START,
+                                       StandardEnum.NOT_STANDARD)
+                                   .list();
+        Boolean finish = false;
+        if (CollectionUtils.isEmpty(list)) {
+            finish =  true;
+        }
+
+        // 设置个人作业练习记录
+
+        if (studentLessonTrainingDetail.getType().equals(ELessonTrainingType.HOMEWORK)) {
+
+            StudentCourseHomework studentCourseHomework = studentCourseHomeworkDao.getHomeworkByUserIdAndCourseHomeworkId(
+                record.getUserId(), studentLessonTrainingDetail.getCourseHomeworkId());
+
+            if (studentCourseHomework == null) {
+                throw new BizException("学生作业记录不存在");
+            }
+            Boolean success = false;
+            if (studentCourseHomework.getStandardFlag() == null) {
+
+            } else
+            if (studentCourseHomework.getStandardFlag().equals(StandardEnum.STANDARD)
+                || studentCourseHomework.getStandardFlag().equals(StandardEnum.EXCELLENT)){
+                success =  true;
+            }
+            // 设置作业完成
+            if (Boolean.TRUE.equals(finish)) {
+                studentCourseHomework.setStandardFlag(StandardEnum.STANDARD);
+            }
+            studentCourseHomework.setUpdateTime(new Date());
+            studentCourseHomework.setSubmitTime(new Date());
+            studentCourseHomeworkDao.update(studentCourseHomework);
+
+            if (Boolean.TRUE.equals(finish) && Boolean.TRUE.equals(!success)) {
+                // 添加完成人数
+                CourseHomework courseHomework = courseHomeworkDao.get(studentLessonTrainingDetail.getCourseHomeworkId());
+                if (courseHomework == null) {
+                    throw new BizException("课程作业不存在");
+                }
+                if (courseHomework.getExpiryDate().compareTo(new Date()) < 0) {
+                    throw new BizException("作业已截止");
+                }
+                courseHomeworkDao.updateFinishNum(studentLessonTrainingDetail.getCourseHomeworkId());
+            }
+
+        } else {
+            ExtracurricularExercisesReply exercisesReply = extracurricularExercisesReplyDao.getByExtraIdAndUserId(
+                studentLessonTrainingDetail.getCourseHomeworkId(), record.getUserId());
+
+            if (exercisesReply == null) {
+                throw new BizException("学生作业记录不存在");
+            }
+
+            Boolean success = false;
+            if (exercisesReply.getStandardFlag() == null) {
+
+            } else
+            if (exercisesReply.getStandardFlag().equals(StandardEnum.STANDARD)
+                || exercisesReply.getStandardFlag().equals(StandardEnum.EXCELLENT)){
+                success = true;
+            }
+            // 设置作业完成
+            if (Boolean.TRUE.equals(finish)) {
+                exercisesReply.setStandardFlag(StandardEnum.STANDARD);
+            }
+            exercisesReply.setUpdateTime(new Date());
+            exercisesReply.setSubmitTime(new Date());
+            extracurricularExercisesReplyDao.update(exercisesReply);
+            // 添加完成人数
+            if (Boolean.TRUE.equals(finish) && Boolean.TRUE.equals(!success)) {
+                ExtracurricularExercises extracurricularExercises = extracurricularExercisesDao.get(studentLessonTrainingDetail.getCourseHomeworkId());
+                if (extracurricularExercises == null) {
+                    throw new BizException("课外作业不存在");
+                }
+                if (extracurricularExercises.getExpireDate().compareTo(new Date()) < 0) {
+                    throw new BizException("作业已截止");
+                }
+                extracurricularExercisesDao.updateFinishNum(studentLessonTrainingDetail.getCourseHomeworkId());
+            }
+
+        }
+        return true;
+    }
+
+
+    /**
+     * 老师查看学生作业练习详情
+     *
+     * @param courseScheduleId 课程计划id
+     * @param userId           学生id
+     * @param type             作业类型
+     */
+    @Override
+    public StudentLessonTrainingDetailWrapper.StudentLessonTraining findCourseHomeworkStudentDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type) {
+
+        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = getUserInfo(userId);
+
+        // 作业信息
+        CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkDao.findCourseHomeworkStudentDetail(
+            courseScheduleId, userId);
+        if (courseHomeworkStudentDetail == null) {
+            throw new BizException("作业不存在");
+        }
+        studentLessonTraining.setStandardFlag(courseHomeworkStudentDetail.getStandardFlag());
+
+        // 作业完成情况
+        if (courseHomeworkStudentDetail.getStandardFlag() == null) {
+            studentLessonTraining.setFinishFlag(false);
+        } else
+        if( courseHomeworkStudentDetail.getStandardFlag().equals(StandardEnum.STANDARD) || courseHomeworkStudentDetail.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
+            studentLessonTraining.setFinishFlag(true);
+        } else {
+            studentLessonTraining.setFinishFlag(false);
+        }
+
+        // 练习内容
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
+            .findByStudentIdsAndCourseScheduleId(Collections.singletonList(userId.intValue()), courseHomeworkStudentDetail.getCourseHomeworkId(),type);
+
+        studentLessonTraining.setStudentLessonTrainingDetail(studentLessonTrainingDetails);
+        return studentLessonTraining;
+
+    }
+
+    @Override
+    public StudentLessonTrainingDetailWrapper.StudentLessonTraining findExtracurricularExercisesDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type) {
+        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = getUserInfo(userId);
+
+
+        // 作业信息
+        ExtracurricularExercisesReply exercisesReply = extracurricularExercisesReplyDao.getByExtraIdAndUserId(
+            courseScheduleId, userId);
+        if (exercisesReply == null) {
+            throw new BizException("作业不存在");
+        }
+        studentLessonTraining.setStandardFlag(exercisesReply.getStandardFlag());
+
+        // 作业完成情况
+        if (exercisesReply.getStandardFlag() == null) {
+            studentLessonTraining.setFinishFlag(false);
+        } else if( exercisesReply.getStandardFlag().equals(StandardEnum.STANDARD) || exercisesReply.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
+            studentLessonTraining.setFinishFlag(true);
+        } else {
+            studentLessonTraining.setFinishFlag(false);
+        }
+
+        // 练习内容
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
+            .findByStudentIdsAndCourseScheduleId(Collections.singletonList(userId.intValue()), exercisesReply.getExtracurricularExercisesId(),type);
+
+        studentLessonTraining.setStudentLessonTrainingDetail(studentLessonTrainingDetails);
+        return studentLessonTraining;
+
+    }
+
+    @Override
+    @Transactional
+    public void pushEndMsg() {
+        // 课后作业
+        List<CourseHomeworkListDto> courseHomeworks = courseHomeworkDao.findEndHomework();
+        StringBuffer sb;
+        for (CourseHomeworkListDto courseHomework : courseHomeworks) {
+            sb = new StringBuffer("homeworkId=").append(courseHomework.getCourseScheduleId())
+                    .append("&homeworkType=HOMEWORK");
+            Map<Integer, String> receivers = new HashMap<Integer, String>(1);
+            String dateToString = DateUtil.dateToString(courseHomework.getCreateTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+            receivers.put(courseHomework.getTeacherId(), courseHomework.getTeacherId() + "");
+            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_JOB_MESSAGE_V2, receivers, null, 0, "homework?" + sb, "TEACHER",dateToString);
+        }
+        if (courseHomeworks.size() > 0) {
+            // id 集合
+            List<Long> ids = courseHomeworks.stream().map(CourseHomeworkListDto::getId).collect(Collectors.toList());
+            courseHomeworkDao.updatePushFlag(ids);
+        }
+
+        // 课外作业
+        List<ExtracurricularExercises> extracurricularExercises = extracurricularExercisesDao.findEndHomework();
+        for (ExtracurricularExercises exercises : extracurricularExercises) {
+            sb = new StringBuffer("homeworkId=").append(exercises.getId())
+                    .append("&homeworkType=")
+                    .append(exercises.getGroupType());
+            Map<Integer, String> receivers = new HashMap<Integer, String>(1);
+            String dateToString = DateUtil.dateToString(exercises.getCreateTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+            receivers.put(exercises.getTeacherId(), exercises.getTeacherId() + "");
+            sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_JOB_MESSAGE_EXTRA_V2, receivers, null, 0, "homework?" + sb, "TEACHER",dateToString);
+        }
+        if (extracurricularExercises.size() > 0) {
+            // id 集合
+            List<Long> ids = extracurricularExercises.stream().map(ExtracurricularExercises::getId).collect(Collectors.toList());
+            extracurricularExercisesDao.updatePushFlag(ids);
+        }
+
+    }
+
+    @NotNull
+    private StudentLessonTrainingDetailWrapper.StudentLessonTraining getUserInfo(Long userId) {
+        SysUser sysUser = sysUserFeignService.queryUserById(userId.intValue());
+        if (sysUser == null) {
+            throw new BizException("用户不存在");
+        }
+        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = new StudentLessonTrainingDetailWrapper.StudentLessonTraining();
+
+        studentLessonTraining.setUserId(userId.longValue());
+        studentLessonTraining.setUserName(sysUser.getRealName());
+        studentLessonTraining.setAvatar(sysUser.getAvatar());
+        Student student = studentDao.get(studentLessonTraining.getUserId().intValue());
+        if (student == null) {
+            throw new BizException("学生不存在");
+        }
+        if ((student.getMembershipEndTime() == null || student.getMembershipEndTime().compareTo(new Date()) < 0) &&
+            (student.getExperienceMembershipEndTime() == null || student.getExperienceMembershipEndTime().compareTo(new Date()) < 0)) {
+            studentLessonTraining.setVipFlag(false);
+        } else {
+            studentLessonTraining.setVipFlag(true);
+        }
+        // 声部
+        Subject subject = subjectDao.get(Integer.parseInt(student.getSubjectIdList()));
+        if (subject == null) {
+            throw new BizException("声部不存在");
+        }
+        studentLessonTraining.setSubjectId(subject.getId());
+        studentLessonTraining.setSubjectName(subject.getName());
+        return studentLessonTraining;
+    }
 }

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

@@ -1,20 +1,29 @@
 package com.ym.mec.biz.service.impl;
 
+import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.EHomeWorkStatus;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.StandardEnum;
 import com.ym.mec.biz.dal.enums.TeacherRemindTypeEnum;
 import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
@@ -30,7 +39,9 @@ import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -65,6 +76,18 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 	@Autowired
 	private CourseScheduleStatisticsDao courseScheduleStatisticsDao;
 
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+    @Autowired
+    private ClassGroupService classGroupService;
+
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
+
 	@Override
 	public BaseDAO<Long, StudentExtracurricularExercisesSituation> getDAO() {
 		return studentExtracurricularExercisesSituationDao;
@@ -636,6 +659,236 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 		return serviceDto;
 	}
 
+    /**
+     * 老师端课后作业列表
+     *
+     * @param queryInfo
+     */
+    @Override
+    public PageInfo<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherServeHomeworkDetailV2(CourseHomeworkWrapper.CourseHomeworkQuery queryInfo) {
+        PageInfo<CourseHomeworkWrapper.CourseHomeworkList> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        //获取时间段内有服务指标的课程(课后作业)
+
+        Date firstDayOfMonth = queryInfo.getStartTime();
+        Date lastDayOfMonth = queryInfo.getEndTime();
+        List<Long> courseIds = new ArrayList<>();
+        if (queryInfo.getCourseScheduleId() != null) {
+            courseIds.add(queryInfo.getCourseScheduleId().longValue());
+        } else {
+            courseIds = studentExtracurricularExercisesSituationDao.queryCourseIdByClassDate(firstDayOfMonth,
+                                                    lastDayOfMonth, queryInfo.getTeacherId());
+        }
+        if(courseIds == null || courseIds.size() == 0){
+            return pageInfo;
+        }
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("versionTag","v2");
+
+         int count = courseScheduleDao.countTeacherServeHomeworkDetailV2(params, courseIds);
+         if (count == 0) {
+             return pageInfo;
+         }
+        // 查出课程列表
+        List<CourseHomeworkWrapper.CourseHomeworkList> courseHomeworkLists = courseScheduleDao.queryTeacherServeHomeworkDetailV2(
+            params, courseIds);
+        if (CollectionUtils.isEmpty(courseHomeworkLists)) {
+            return pageInfo;
+        }
+        pageInfo.setTotal(count);
+
+        // 乐团信息
+        List<String> musicGroupIds = courseHomeworkLists.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toList());
+
+        List<MusicGroup> musicGroups = musicGroupService.queryListByIds(new HashSet<>(musicGroupIds));
+        Map<String, MusicGroup> musicGroupMap = musicGroups.stream().collect(Collectors.toMap(MusicGroup::getId, Function.identity()));
+
+
+        // 班级名称
+
+        List<Integer> classIds = courseHomeworkLists.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
+
+        List<ClassGroup> classGroups = classGroupService.queryByIds(classIds);
+        Map<Integer, ClassGroup> classGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, Function.identity()));
+
+        for (CourseHomeworkWrapper.CourseHomeworkList courseHomeworkList : courseHomeworkLists) {
+
+            courseHomeworkList.setType(ELessonTrainingType.HOMEWORK);
+            // 乐团信息
+            MusicGroup musicGroup = musicGroupMap.get(courseHomeworkList.getMusicGroupId());
+            if (Objects.nonNull(musicGroup)) {
+                courseHomeworkList.setMusicGroupName(musicGroup.getName());
+                courseHomeworkList.setMusicGroupImg(musicGroup.getImg());
+            }
+
+            // 班级信息
+            ClassGroup classGroup = classGroupMap.get(courseHomeworkList.getClassGroupId());
+            if (Objects.nonNull(classGroup)) {
+                courseHomeworkList.setClassGroupName(classGroup.getName());
+            }
+
+            // 设置老师信息
+            Integer teacherId = courseHomeworkList.getTeacherId();
+            if (teacherId != null) {
+                SysUser sysUser = sysUserFeignService.queryUserById(teacherId);
+                courseHomeworkList.setTeacherImg(sysUser.getAvatar());
+                courseHomeworkList.setTeacherName(sysUser.getRealName());
+            }
+
+            // 格式时间
+            courseHomeworkList.setStartTime(DateUtil.startDateAndEndTime(courseHomeworkList.getClassDate(), courseHomeworkList.getStartTime()));
+            courseHomeworkList.setEndTime(DateUtil.startDateAndEndTime(courseHomeworkList.getClassDate(), courseHomeworkList.getEndTime()));
+
+        }
+
+
+        pageInfo.setRows(courseHomeworkLists);
+        return pageInfo;
+    }
+
+    /**
+     * 老师课外作业列表
+     *
+     * @param queryInfo
+     */
+    @Override
+    public PageInfo<CourseHomeworkWrapper.CourseHomeworkList> queryTeacherExtraHomeworkDetailV2(CourseHomeworkWrapper.CourseHomeworkQuery queryInfo) {
+
+        // 获取时间段内有服务指标的乐团(课外作业)
+        Map<String,String> groupIds = new HashMap<>();
+        if (queryInfo.getCourseScheduleId() == null) {
+            if (queryInfo.getType() == null || queryInfo.getType().equals(ELessonTrainingType.EXTRACURRICULAR)) {
+                if (queryInfo.getHomeWorkStatus() == null || queryInfo.getHomeWorkStatus().equals(EHomeWorkStatus.UNASSIGNED)) {
+                    StudentExerciseMusicGroupQueryInfo query = new StudentExerciseMusicGroupQueryInfo();
+                    query.setMondayDate(DateUtil.dateToString(queryInfo.getStartTime()));
+                    query.setSundayDate(DateUtil.dateToString(queryInfo.getEndTime()));
+                    query.setTeacherId(queryInfo.getTeacherId());
+                    query.setPage(1);
+                    query.setRows(10000);
+                    PageInfo<MusicGroupExtracurricularSummaryDto> groupList = queryStudentExerciseMusicGroupList(query);
+
+                    if (!CollectionUtils.isEmpty(groupList.getRows())) {
+                        groupIds = groupList.getRows().stream().collect(Collectors.toMap(o -> o.getMusicGroupId(),o -> o.getStudentIds(),(k1,k2)->k1));
+                    }
+                }
+            }
+        }
+        PageInfo<CourseHomeworkWrapper.CourseHomeworkList> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+
+        Set<String> subjectIds =groupIds.keySet();
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        if (StringUtils.isNotBlank(queryInfo.getMusicGroupId()) && subjectIds.contains(queryInfo.getMusicGroupId())) {
+            subjectIds = new HashSet<>();
+            subjectIds.add(queryInfo.getMusicGroupId());
+        }
+        params.put("subjectIds", subjectIds);
+        params.put("versionTag","v2");
+
+        int count = extracurricularExercisesDao.countTeacherExtraHomeworkDetailV2(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            List<CourseHomeworkWrapper.CourseHomeworkList> courseHomeworkLists  = extracurricularExercisesDao.queryTeacherExtraHomeworkDetailV2(params);
+
+
+            // 乐团信息
+            List<String> musicGroupIds = courseHomeworkLists.stream().map(e -> e.getMusicGroupId())
+                                                            .filter(Objects::nonNull)
+                                                            .collect(Collectors.toList());
+            Map<String, MusicGroup> musicGroupMap = new HashMap<>();
+            if (!CollectionUtils.isEmpty(musicGroupIds)) {
+                List<MusicGroup> musicGroups = musicGroupService.queryListByIds(new HashSet<>(musicGroupIds));
+                musicGroupMap = musicGroups.stream()
+                                                                   .collect(Collectors.toMap(MusicGroup::getId, Function.identity()));
+            }
+
+
+            // 班级名称
+
+            List<Integer> classIds = courseHomeworkLists.stream().map(e -> e.getClassGroupId())
+                                                        .filter(Objects::nonNull)
+                                                        .collect(Collectors.toList());
+            Map<Integer, ClassGroup> classGroupMap = new HashMap<>();
+            if (!CollectionUtils.isEmpty(classIds)) {
+                List<ClassGroup> classGroups = classGroupService.queryByIds(classIds);
+                if (!CollectionUtils.isEmpty(classGroups)) {
+                    classGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, Function.identity()));
+                }
+            }
+            for (CourseHomeworkWrapper.CourseHomeworkList courseHomeworkList : courseHomeworkLists) {
+                courseHomeworkList.setAssignFlag(true);
+                // 如果是未布置的 设置时间
+                if(courseHomeworkList.getHomeWorkStatus().equals(EHomeWorkStatus.UNASSIGNED)){
+                    courseHomeworkList.setAssignTime(queryInfo.getStartTime());
+                    courseHomeworkList.setStudentIdList(groupIds.get(courseHomeworkList.getMusicGroupId()));
+                    // 如果结束时间小于当前时间  设置为已过期
+                    LocalDate now = LocalDate.now();
+                    LocalDate endTime = LocalDate.parse(DateUtil.dateToString(queryInfo.getEndTime()), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                    if(now.isAfter(endTime)){
+                        courseHomeworkList.setAssignFlag(false);
+                    }
+                }
+
+                // 乐团信息
+                MusicGroup musicGroup = musicGroupMap.get(courseHomeworkList.getMusicGroupId());
+                if (Objects.nonNull(musicGroup)) {
+                    courseHomeworkList.setMusicGroupName(musicGroup.getName());
+                    courseHomeworkList.setMusicGroupImg(musicGroup.getImg());
+                }
+
+                // 班级信息
+                ClassGroup classGroup = classGroupMap.get(courseHomeworkList.getClassGroupId());
+                if (Objects.nonNull(classGroup)) {
+                    courseHomeworkList.setClassGroupName(classGroup.getName());
+                }
+
+                // 如果是给学生布置的作业  名 : xx等多少名学员
+                if (courseHomeworkList.getClassGroupId() == null) {
+                    String studentIdList = courseHomeworkList.getStudentIdList();
+                    if (StringUtils.isNotBlank(studentIdList)) {
+
+                        String[] split = studentIdList.split(",");
+                        String userId = split[0];
+                        SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(userId));
+                        if (split.length == 1) {
+                            courseHomeworkList.setClassGroupName(sysUser.getUsername());
+                        } else {
+                            courseHomeworkList.setClassGroupName(sysUser.getUsername() + "等" + split.length + "名学员");
+                        }
+                    }
+                }
+
+                if (courseHomeworkList.getTeacherId() != null) {
+                    // 设置老师信息
+                    SysUser sysUser = sysUserFeignService.queryUserById(courseHomeworkList.getTeacherId());
+                    if (Objects.nonNull(sysUser)) {
+                        courseHomeworkList.setTeacherName(sysUser.getRealName());
+                        courseHomeworkList.setTeacherImg(sysUser.getAvatar());
+                    }
+                }
+            }
+
+            pageInfo.setRows(courseHomeworkLists);
+        }
+
+
+        return pageInfo;
+    }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void updateNum(LessonExamination lessonExamination, List<Integer> studentIds) {
+		courseScheduleStatisticsDao.updateNum(lessonExamination.getCourseScheduleId(),lessonExamination.getTeacherId(),studentIds);
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateLastSubmitTime(LessonExamination lessonExamination, StudentLessonExamination studentLessonExamination) {
+		courseScheduleStatisticsDao.updateLastSubmitTime(lessonExamination.getCourseScheduleId(),lessonExamination.getTeacherId(),
+				studentLessonExamination.getUserId());
+	}
+
 	@Transactional(rollbackFor = Exception.class)
 	public void delSituations(List<StudentExtracurricularExercisesSituation> situations){
 		if (CollectionUtils.isEmpty(situations)){
@@ -649,4 +902,4 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			courseScheduleStatisticsDao.updateCourseService(collect,0);
 		}
 	}
-}
+}

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
+import com.ym.mec.biz.dal.dto.LessonExaminationDetailDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
+import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
+import org.springframework.stereotype.Service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 进度评测详情表(StudentLessonExaminationDetail)表服务实现类
+ *
+ * @author zx
+ * @since 2023-04-03 18:22:01
+ */
+@Service("studentLessonExaminationDetailService")
+public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<StudentLessonExaminationDetailDao, StudentLessonExaminationDetail> implements StudentLessonExaminationDetailService {
+
+    private final static Logger log = LoggerFactory.getLogger(StudentLessonExaminationDetailServiceImpl.class);
+
+    @Override
+    public StudentLessonExaminationDetailDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void save(Long lessonExaminationId,List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos) {
+        List<StudentLessonExaminationDetail> detailList = new ArrayList<>();
+        for (StudentLessonExaminationSaveDto dto : studentLessonExaminationSaveDtos) {
+            String[] studentIds = dto.getStudentIds().split(",");
+            List<LessonExaminationDetailDto> detailDtos = dto.getExaminationDetailDtos();
+            for (String id : studentIds) {
+                Integer studentId = Integer.parseInt(id);
+                Integer score = 100/detailDtos.size();
+                Integer subScore = 100 - score * detailDtos.size();
+                for (int i = 0; i < detailDtos.size(); i++) {
+                    LessonExaminationDetailDto vo = detailDtos.get(i);
+                    StudentLessonExaminationDetail studentLessonExaminationDetail = new StudentLessonExaminationDetail();
+                    studentLessonExaminationDetail.setUserId(studentId);
+                    studentLessonExaminationDetail.setLessonExaminationId(lessonExaminationId);
+                    studentLessonExaminationDetail.setMusicScoreId(vo.getMusicScoreId());
+                    studentLessonExaminationDetail.setHeardLevel(vo.getHeardLevel());
+                    studentLessonExaminationDetail.setStandardScore(vo.getScore());
+                    if(i == 0){
+                        studentLessonExaminationDetail.setAvgScore(score + subScore);
+                    }else {
+                        studentLessonExaminationDetail.setAvgScore(score);
+                    }
+                    studentLessonExaminationDetail.setPartIndex(vo.getPartIndex());
+                    detailList.add(studentLessonExaminationDetail);
+                }
+            }
+        }
+        baseMapper.insertBatch(detailList);
+    }
+
+    @Override
+    public List<StudentLessonExaminationDetailDto> queryAll(StudentLessonExaminationQueryDto query) {
+        return baseMapper.queryAll(query);
+    }
+
+}
+

+ 154 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java

@@ -0,0 +1,154 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.LessonExaminationDao;
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
+import com.ym.mec.biz.dal.dao.StudentLessonExaminationDao;
+import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
+import com.ym.mec.biz.dal.dto.LessonExaminationSubmitDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.entity.LessonExamination;
+import com.ym.mec.biz.dal.entity.StudentLessonExamination;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryInfo;
+import com.ym.mec.biz.service.LessonExaminationService;
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
+import com.ym.mec.biz.service.StudentLessonExaminationService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 学生进度评测表(StudentLessonExamination)表服务实现类
+ *
+ * @author zx
+ * @since 2023-04-03 18:21:30
+ */
+@Service("studentLessonExaminationService")
+public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLessonExaminationDao, StudentLessonExamination> implements StudentLessonExaminationService {
+
+    private final static Logger log = LoggerFactory.getLogger(StudentLessonExaminationServiceImpl.class);
+
+    @Autowired
+    private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
+    @Autowired
+    private LessonExaminationDao lessonExaminationDao;
+    @Autowired
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+
+    @Override
+    public StudentLessonExaminationDao getDao() {
+        return this.baseMapper;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Integer> save(Long lessonExaminationId, List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos) {
+        List<StudentLessonExamination> studentLessonExaminations = new ArrayList<>();
+        List<Integer> studentIdList = new ArrayList<>();
+        for (StudentLessonExaminationSaveDto dto : studentLessonExaminationSaveDtos) {
+            String[] studentIds = dto.getStudentIds().split(",");
+            for (String studentId : studentIds) {
+                StudentLessonExamination studentLessonExamination = new StudentLessonExamination();
+                studentLessonExamination.setLessonExaminationId(lessonExaminationId);
+                Integer parseInt = Integer.parseInt(studentId);
+                studentIdList.add(parseInt);
+                studentLessonExamination.setUserId(parseInt);
+                studentLessonExamination.setSubjectId(dto.getSubjectId());
+                studentLessonExaminations.add(studentLessonExamination);
+            }
+        }
+
+        baseMapper.insertBatch(studentLessonExaminations);
+        return studentIdList;
+    }
+
+    @Override
+    public PageInfo<StudentLessonExaminationDto> queryPage(StudentLessonExaminationQueryInfo queryInfo) {
+        PageInfo<StudentLessonExaminationDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        List<StudentLessonExaminationDto> dataList = null;
+        int count = baseMapper.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = baseMapper.queryPage(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submit(LessonExaminationSubmitDto submitDto) {
+        Long studentLessonExaminationDetailId = submitDto.getStudentLessonExaminationDetailId();
+        StudentLessonExaminationDetail detail = studentLessonExaminationDetailService.getById(studentLessonExaminationDetailId);
+        if(Objects.isNull(detail)){
+            throw new BizException("训练内容不存在");
+        }
+        Long lessonExaminationId = detail.getLessonExaminationId();
+        Integer userId = detail.getUserId();
+        LessonExamination lessonExamination = lessonExaminationDao.selectById(lessonExaminationId);
+        if(Objects.isNull(lessonExamination)){
+            throw new BizException("训练内容不存在");
+        }
+        Date now = new Date();
+        if(now.after(lessonExamination.getExpireDate())){
+            throw new BizException("训练已截止");
+        }
+        StudentLessonExamination studentLessonExamination = this.lambdaQuery().eq(StudentLessonExamination::getLessonExaminationId, lessonExaminationId)
+                .eq(StudentLessonExamination::getUserId, userId).one();
+        if(studentLessonExamination.getTrainingTime() == null){
+            //训练人数加一
+            lessonExaminationDao.updateTrainingNum(lessonExaminationId);
+        }
+        studentLessonExamination.setTrainingFlag(true);
+        studentLessonExamination.setTrainingTime(now);
+        this.updateById(studentLessonExamination);
+        //是否达标
+        if(submitDto.getScore() >= detail.getStandardScore()){
+            detail.setStandardFlag(true);
+        }
+        //训练分数是否比上一次高
+        Boolean flag = submitDto.getScore() > detail.getTrainingScore();
+        if(flag){
+            detail.setTrainingScore(submitDto.getScore());
+            //计算分数
+            Double actualScore = detail.getTrainingScore() * 1D / detail.getStandardScore() * detail.getAvgScore();
+            //更新分数
+            detail.setActualAvgScore(actualScore.intValue() > detail.getAvgScore() ? detail.getAvgScore():actualScore.intValue());
+        }
+        //更新详情
+        detail.setTrainingTime(now);
+        studentLessonExaminationDetailService.updateById(detail);
+        //更新达标人数
+        lessonExaminationDao.updateStandardNum(lessonExaminationId);
+        //更新总分
+        if(flag){
+            baseMapper.updateTrainingScore(lessonExaminationId,userId);
+        }
+        //更新服务指标
+        studentExtracurricularExercisesSituationService.updateLastSubmitTime(lessonExamination,studentLessonExamination);
+    }
+
+    @Override
+    public List<StudentLessonExaminationDto1> queryStudentPage(Long lessonExaminationId,Integer subjectId) {
+        return baseMapper.queryStudentPage(lessonExaminationId,subjectId);
+    }
+}
+

+ 198 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java

@@ -0,0 +1,198 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.StudentLessonTrainingDetailMapper;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 练习内容
+ * 2023-03-31 14:18:47
+ */
+@Slf4j
+@Service
+public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentLessonTrainingDetailMapper, StudentLessonTrainingDetail> implements StudentLessonTrainingDetailService {
+
+    @Autowired
+    private SysMusicScoreDao sysMusicScoreDao;
+
+    @Autowired
+    private SubjectDao subjectDao;
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return StudentLessonTrainingDetail
+     */
+	@Override
+    public StudentLessonTrainingDetail detail(Long id) {
+        
+        return baseMapper.selectById(id);
+    }
+	
+    /**
+     * 添加
+     * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail) {    	
+        
+        return this.save(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));
+    }
+
+    /**
+     * 更新
+     * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail){
+
+        return this.updateById(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));       
+    }
+
+    /**
+     * 将作业标准 转换为 需要的作业详情
+     *
+     * @param detailList 作业标准
+     * @param userIdList                   学生ID
+     */
+    @Override
+    public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type) {
+        // 保存作业标准
+        if (CollectionUtils.isEmpty(detailList) || CollectionUtils.isEmpty(userIdList)) {
+            return new ArrayList<>();
+        }
+
+        List<StudentLessonTrainingDetail> result = new ArrayList<>();
+
+        if (!CollectionUtils.isEmpty(detailList)) {
+            List<StudentLessonTrainingDetail> details = JSON.parseArray(
+                JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
+            result.addAll(details);
+            // 根据声部添加学生作业详情
+            userIdList.forEach(userId -> {
+                List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
+                    JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
+                for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
+                    studentLessonTrainingDetail.setUserId(userId.longValue());
+                }
+                result.addAll(detailsUser);
+            });
+        }
+        for (StudentLessonTrainingDetail studentLessonTrainingDetail : result) {
+
+            studentLessonTrainingDetail.setCourseHomeworkId(homeworkId);
+            studentLessonTrainingDetail.setTrainingTimes(0);
+            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_START);
+            studentLessonTrainingDetail.setCreateTime(new Date());
+            studentLessonTrainingDetail.setUpdateTime(new Date());
+            studentLessonTrainingDetail.setType(type);
+
+        }
+        return result;
+    }
+
+    /**
+     * 查询布置的作业详情
+     *
+     * @param courseHomeworkId 作业ID
+     * @param type             作业类型
+     */
+    @Override
+    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type) {
+        return getBaseLessonTrainingDetail(courseHomeworkId, type, null);
+    }
+
+    /**
+     * 学生端查询作业详情
+     *
+     * @param courseHomeworkId 作业ID
+     * @param type             作业类型
+     * @param userId           学生ID
+     */
+    @Override
+    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId) {
+        List<StudentLessonTrainingDetail> list = this.lambdaQuery()
+                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,
+                                                         courseHomeworkId)
+                                                     .isNull(userId == null,StudentLessonTrainingDetail::getUserId)
+                                                     .eq(StudentLessonTrainingDetail::getType, type)
+                                                     .eq(userId != null, StudentLessonTrainingDetail::getUserId, userId)
+                                                     .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = JSON.parseArray(
+            JSON.toJSONString(list), StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail.class);
+
+         // 曲目id集合
+        List<Long> collect = studentLessonTrainingDetails.stream()
+                                                         .map(
+                                                             StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getMusicScoreId)
+                                                         .distinct()
+                                                         .collect(Collectors.toList());
+
+        List<SysMusicScore> scoreList = sysMusicScoreDao.findByIds(
+            collect.stream().map(String::valueOf).collect(Collectors.joining(",")));
+
+        // id 分组
+        Map<Integer, SysMusicScore> musicScoreMap = scoreList.stream()
+                                                     .collect(Collectors.toMap(SysMusicScore::getId, Function.identity()));
+
+        for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
+            SysMusicScore sysMusicScore = musicScoreMap.get(studentLessonTrainingDetail.getMusicScoreId().intValue());
+            if (sysMusicScore != null) {
+                studentLessonTrainingDetail.setMusicScoreName(sysMusicScore.getName());
+            }
+        }
+
+        // 声部
+        List<Integer> subjectIdList = studentLessonTrainingDetails.stream()
+                                                          .map(o -> {
+                                                              if (o.getSubjectId() != null) {
+                                                                  return o.getSubjectId().intValue();
+                                                              }
+                                                              return 0;
+                                                          })
+                                                          .collect(Collectors.toList());
+
+        List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+
+        // id 分组
+        Map<Integer, Subject> subjectMap = subjectList.stream()
+                                                     .collect(Collectors.toMap(Subject::getId, Function.identity()));
+
+        for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
+            if (studentLessonTrainingDetail.getSubjectId() == null) {
+                continue;
+            }
+            Subject subject = subjectMap.get(studentLessonTrainingDetail.getSubjectId().intValue());
+            if (subject != null) {
+                studentLessonTrainingDetail.setSubjectName(subject.getName());
+            }
+        }
+
+        return studentLessonTrainingDetails;
+    }
+}

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.biz.service.StudentLessonExaminationService;
 import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysTenantConfigService;
@@ -58,6 +59,9 @@ public class StudentServeServiceImpl implements StudentServeService {
     private MusicGroupDao musicGroupDao;
     @Autowired
     private StudentRegistrationDao studentRegistrationDao;
+
+    @Autowired
+    private StudentLessonExaminationDao studentLessonExaminationDao;
     
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -821,4 +825,41 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         return result;
     }
+
+    /**
+     * 展示按钮红点
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public List<HomeworkStat> homeworkStat(Integer userId) {
+        List<HomeworkStat> homeworkStatList = new ArrayList<>();
+
+        // 作业按钮红点
+        int num = studentCourseHomeworkDao.queryNotSuccessHomeworkList(userId);
+        num+= studentCourseHomeworkDao.queryNotSuccessExtraHomeworkList2(userId);
+        HomeworkStat homeworkStat = new HomeworkStat();
+        homeworkStat.setType("HOMEWORK");
+        homeworkStatList.add(homeworkStat);
+        if (num > 0) {
+            homeworkStat.setShow(true);
+        } else {
+            homeworkStat.setShow(false);
+        }
+
+        // 评测按钮红点
+        num = studentLessonExaminationDao.queryNotSuccessExaminationList(userId);
+
+
+        HomeworkStat homeworkStat2 = new HomeworkStat();
+        homeworkStat2.setType("EXAMINATION");
+        homeworkStatList.add(homeworkStat2);
+        if (num > 0) {
+            homeworkStat2.setShow(true);
+        } else {
+            homeworkStat2.setShow(false);
+        }
+
+        return homeworkStatList;
+    }
 }

+ 94 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -19,7 +20,6 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
-import com.ym.mec.thirdparty.yqpay.DateUtils;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -29,6 +29,7 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -76,6 +77,14 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	private SysTenantConfigService sysTenantConfigService;
 	@Autowired
 	private StudentService studentService;
+	@Autowired
+	private LessonExaminationService lessonExaminationService;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
 	@Override
 	public BaseDAO<Long, TeacherAttendance> getDAO() {
@@ -266,6 +275,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				result.put("status",2);
 				return result;
 			}
+            teacherAttendance.setSignInAttachments(teacherSignOutDto.getTeacherAttendanceInfo().getSignInAttachments());
 			teacherAttendance.setSignInDeviceNo(teacherSignOutDto.getTeacherAttendanceInfo().getDeviceNum());
 			if(Objects.nonNull(teacherAttendance.getId())){
 				teacherAttendanceDao.update(teacherAttendance);
@@ -335,7 +345,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendanceDao.insert(teacherAttendance);
 			}
 
-			if(StringUtils.isNotBlank(courseHomeworkInfo.getContent())){
+            if(!CollectionUtils.isEmpty(courseHomeworkInfo.getMusicScoreSubjectDto())){
 				CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(teacherAttendance.getCourseScheduleId());
 				if(Objects.isNull(courseHomework)){
 					//新增课堂作业
@@ -344,20 +354,39 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 					courseHomework.setMusicGroupId(currentCourseDetail.getMusicGroupId());
 					courseHomework.setGroupType(teacherAttendance.getGroupType());
 					courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue());
-					courseHomework.setExpiryDate(DateUtil.addDays(date,7));
+
+                    LocalDateTime localDateTime=LocalDateTime.now();
+                    localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
+                            .withHour(21).withMinute(0).withSecond(0).withNano(0);
+					courseHomework.setExpiryDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
 
 					courseHomeworkService.insert(courseHomework);
 					List<StudentCourseHomework> studentCourseHomeworks = new ArrayList<>();
 
+                    String versionTag = "v1";
+                    // 作业详情
+                    List<StudentLessonTrainingDetail> studentLessonTrainingDetails = new ArrayList<>();
+
 					//获取按学员声部发放的作业
 					List<MusicScoreSubjectDto> musicScoreSubjectDto = courseHomework.getMusicScoreSubjectDto();
 					if(musicScoreSubjectDto != null && musicScoreSubjectDto.size() > 0){
 						for (MusicScoreSubjectDto scoreSubjectDto : musicScoreSubjectDto) {
-							studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
-									courseHomework.getId(),
-									StringUtils.join(scoreSubjectDto.getMusicScoreIdList(),","),
-									JSONObject.toJSONString(scoreSubjectDto.getMusicScoreHomeworkDtoList()),
-									scoreSubjectDto.getUserIdList()));
+                            List<Integer> userIdList = scoreSubjectDto.getUserIdList();
+                            studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
+                                             courseHomework.getId(),
+                                             StringUtils.join(scoreSubjectDto.getMusicScoreIdList(),","),
+                                             JSONObject.toJSONString(scoreSubjectDto.getMusicScoreHomeworkDtoList()),
+                                             userIdList));
+                            if (CollectionUtils.isEmpty(scoreSubjectDto.getStudentLessonTrainingDetails())) {
+                                continue;
+                            }
+
+                            for (StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail studentLessonTrainingDetail : scoreSubjectDto.getStudentLessonTrainingDetails()) {
+                                studentLessonTrainingDetail.setSubjectId(scoreSubjectDto.getSubjectId());
+                            }
+                            studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
+                                                                    .homeWorkDetail(scoreSubjectDto.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+
 						}
 					}else {
 						studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
@@ -365,10 +394,24 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 								courseHomework.getMusicScoreId(),
 								"",
 								null));
+
+                        List<Integer> userIdList = studentCourseHomeworks.stream()
+                                                                      .map(StudentCourseHomework::getUserId)
+                                                                      .collect(Collectors.toList());
+                        studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
+                                                                .homeWorkDetail(courseHomeworkInfo.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+
 					}
 					if(CollectionUtils.isEmpty(studentCourseHomeworks)){
 						throw new BizException("此课程没有学生");
 					}
+                    for (StudentCourseHomework studentCourseHomework : studentCourseHomeworks) {
+                        studentCourseHomework.setGroupType(teacherAttendance.getGroupType());
+                    }
+
+                    if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                        versionTag ="v2";
+                    }
 
 					//排除不被服务学员
 //					Set<Integer> serveStudentIds = studentServeService.getStudentWithCourse(teacherAttendance.getCourseScheduleId());
@@ -380,6 +423,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 //						}
 //					}
 					courseHomework.setExpectNum(studentCourseHomeworks.size());
+                    courseHomework.setVersionTag(versionTag);
 
 					Teacher teacher = teacherDao.get(courseSchedule.getActualTeacherId());
 					String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 3), "MM月dd日");
@@ -392,25 +436,49 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 						studentServeService.updateExercisesSituation(courseSchedule.getMusicGroupId(), courseSchedule.getClassDate(), studentIds, teacherAttendance.getTeacherId());
 
 						for (StudentCourseHomework studentCourseHomework : studentCourseHomeworks) {
-							Map<Integer, String> userMap = new HashMap<>();
-							userMap.put(studentCourseHomework.getUserId(), studentCourseHomework.getUserId().toString());
-							String notifyUrl = "?courseScheduleID=" + courseSchedule.getId() + "&studentCourseHomeworkId=" + studentCourseHomework.getId() + "&extra=0";
-							String extra = "dayaedu" + notifyUrl + "&userId=" + studentCourseHomework.getUserId();
-
-							sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_REMIND, courseSchedule.getActualTeacherId().toString(), extra,
-									new String[]{studentCourseHomework.getUserId().toString()},
-									null, courseSchedule.getName(), dateStr, courseHomework.getContent());
-
-							sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
-									userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
+                            if (versionTag.equals("v2")) {
+                                Map<Integer, String> userMap = new HashMap<>();
+                                userMap.put(studentCourseHomework.getUserId(), studentCourseHomework.getUserId().toString());
+                                String notifyUrl = "homeworkId=" + courseHomework.getCourseScheduleId() + "&homeworkType=" + ELessonTrainingType.HOMEWORK.getCode();
+                                String extra = "dayaedu?type=homework&" + notifyUrl ;
+
+                                sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_REMIND_V2, courseSchedule.getActualTeacherId().toString(), extra,
+                                        new String[]{studentCourseHomework.getUserId().toString()},
+                                        null, courseSchedule.getName(), dateStr);
+
+                                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND_V2,
+                                        userMap, null, 0, "homework?" + notifyUrl, "STUDENT", teacher.getRealName());
+
+                            } else {
+                                Map<Integer, String> userMap = new HashMap<>();
+                                userMap.put(studentCourseHomework.getUserId(), studentCourseHomework.getUserId().toString());
+                                String notifyUrl = "?courseScheduleID=" + courseSchedule.getId() + "&studentCourseHomeworkId=" + studentCourseHomework.getId() + "&extra=0";
+                                String extra = "dayaedu" + notifyUrl + "&userId=" + studentCourseHomework.getUserId();
+
+                                sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_REMIND, courseSchedule.getActualTeacherId().toString(), extra,
+                                        new String[]{studentCourseHomework.getUserId().toString()},
+                                        null, courseSchedule.getName(), dateStr, courseHomework.getContent());
+
+                                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
+                                        userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
+                            }
 						}
 					}
+                    if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                        studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetails);
+                    }
 				}else{
 					courseHomework.setContent(teacherSignOutDto.getCourseHomeworkInfo().getContent());
 					courseHomework.setAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
 					courseHomeworkService.update(courseHomework);
 				}
 			}
+
+			//布置课后评测
+			LessonExaminationSaveDto examinationSaveDto = teacherSignOutDto.getCourseHomeworkInfo().getLessonExaminationSaveDto();
+			if(Objects.nonNull(examinationSaveDto)){
+				lessonExaminationService.publish(examinationSaveDto);
+			}
 			return result;
 		}
 
@@ -775,7 +843,13 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		result.setTeacherName(teacherDao.queryNameById(courseSchedule.getActualTeacherId()));
 		result.setAttendClassTime(teacherAttendanceDao.getAttendClassTime(courseScheduleId));
 		result.setSchool(schoolDao.get(courseSchedule.getSchoolId()));
-		//获取异常考勤学员数量
+
+        // 设置课后作业版本
+        CourseHomework homework = courseHomeworkDao.getByCourseScheduleId(courseScheduleId);
+        if (homework != null) {
+            result.setVersionTag(homework.getVersionTag());
+        }
+        //获取异常考勤学员数量
 		result.setErrorAttendanceNum(studentAttendanceDao.countErrorAttendance(courseScheduleId));
 		if(teacherAttendance != null){
 			result.setIsSignIn(Objects.isNull(teacherAttendance.getSignInStatus())?3:teacherAttendance.getSignInStatus().getCode());

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

@@ -313,7 +313,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public List<ImUserFriendDto> queryGroupStudents1(Integer teacherId, String search) {
+    public List<ImUserFriendDto>  queryGroupStudents1(Integer teacherId, String search) {
         Set<BasicUserDto> basicUserDtos = new HashSet<>();
         //学员关联的通讯录
         //获取相关课程,班级老师列表
@@ -740,6 +740,28 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         return pageInfo;
     }
 
+
+    @Override
+    public PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverViewV2(TeacherServeQueryInfo queryInfo) {
+        PageInfo<TeacherMusicStudentOverViewDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<TeacherMusicStudentOverViewDto> dataList = null;
+        int count = teacherDao.countTeacherMusicsV2(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            List<String> musicGroupIds = teacherDao.queryTeacherMusicIdsV2(params);
+            dataList = musicGroupDao.queryTeacherMusicStudentOverView(musicGroupIds);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
     @Override
     public PageInfo<SysUserDto> queryTeacherBasicInfo(UserBasicQueryInfo queryInfo) {
         PageInfo<SysUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());

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

@@ -1643,4 +1643,12 @@
         </foreach>
         AND cs.convert_flag_ = 1 AND cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND cs.is_lock_ = 0
     </select>
+
+    <select id="queryByIds" resultType="com.ym.mec.biz.dal.entity.ClassGroup">
+        select * from class_group where id_ in
+        <foreach collection="classIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+
+    </select>
 </mapper>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml

@@ -205,12 +205,15 @@
             cssp.be_merged_,
             st.current_grade_num_,
             st.current_class_,
+        s.id_ as subject_id_,
+        s.name_ as subject_name_,
             IF(sa.status_ IS NULL,'TRUANT',sa.status_) status_
         FROM
             course_schedule_student_payment cssp
             LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
             LEFT JOIN student st ON st.user_id_ = su.id_
             LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
+        left join subject s on st.subject_id_list_ = s.id_
         WHERE
             cssp.course_schedule_id_ =#{courseScheduleId}
             AND su.id_ IS NOT NULL

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

@@ -21,6 +21,8 @@
 		<result column="expect_num_" property="expectNum" />
 		<result column="expiry_date_" property="expiryDate" />
 		<result column="tenant_id_" property="tenantId" />
+		<result column="version_tag_" property="versionTag" />
+		<result column="push_flag_" property="pushFlag" />
 	</resultMap>
 
 	<resultMap type="com.ym.mec.biz.dal.dto.CourseHomeworkListDto" id="CourseHomeworkDto">
@@ -37,6 +39,7 @@
 		<result column="completed_num_" property="completedNum" />
 		<result column="expect_num_" property="expectNum" />
 		<result column="expiry_date_" property="expiryDate" />
+		<result column="teacherId" property="teacherId" />
 		<result column="remark_" property="remark" />
 		<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="is_replied_" property="isReplied" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -101,6 +104,9 @@
 			<if test="expiryDate != null">
 				expiry_date_ = #{expiryDate},
 			</if>
+            <if test="versionTag != null">
+                version_tag_ = #{versionTag},
+            </if>
 			update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}
@@ -286,12 +292,13 @@
 		<result property="classStartDate" column="start_class_time_"/>
 		<result property="classEndDate" column="end_class_time_"/>
 		<result property="musicScoreId" column="music_score_id_"/>
+		<result property="versionTag" column="versionTag"/>
 	</resultMap>
     <select id="queryHomePage" resultMap="WebCourseHomeworkListDtoMap">
 		SELECT ch.id_,cs.id_ course_schedule_id_,cs.name_ course_schedule_name_,
 		cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.organ_id_,o.name_ organ_name_,
 		mg.id_ group_id_,mg.name_ group_name_,ch.create_time_,cs.actual_teacher_id_,
-		su.real_name_ actual_teacher_name_,ch.completed_num_,ch.expect_num_,cs.group_type_,sch.music_score_id_
+		su.real_name_ actual_teacher_name_,ch.completed_num_,ch.expect_num_,cs.group_type_,sch.music_score_id_,mg.name_ as musicGroupName,ch.expiry_date_ as expiryDate,ch.version_tag_ as versionTag
 		FROM course_homework ch
 		LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
 		LEFT JOIN course_schedule cs ON cs.id_ = ch.course_schedule_id_
@@ -332,7 +339,9 @@
 			<if test="search != null and search != ''">
 				AND (cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%')
 				OR mg.name_ LIKE CONCAT('%',#{search},'%')
-				OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ = #{search} OR cs.actual_teacher_id_ = #{search})
+				OR su.real_name_ LIKE CONCAT('%',#{search},'%')
+                OR mg.id_ = #{search}
+                OR cs.actual_teacher_id_ = #{search})
 			</if>
 		</where>
 	</sql>
@@ -382,4 +391,26 @@
 			#{courseScheduleId}
 		</foreach>
 	</delete>
+
+	<update id="updateFinishNum">
+        UPDATE course_homework SET completed_num_ = ifnull(completed_num_,0) + 1 WHERE id_ = #{courseHomeworkId}
+    </update>
+
+	<select id="getByCourseScheduleId" resultMap="CourseHomework">
+        select * from course_homework where course_schedule_id_ = #{courseScheduleId}
+    </select>
+
+	<select id="findEndHomework" resultMap="CourseHomeworkDto">
+        SELECT ch.* ,cs.actual_teacher_id_ as teacherId
+        FROM course_homework  ch
+            left join course_schedule cs on ch.course_schedule_id_ = cs.id_
+        WHERE ch.expiry_date_ &lt;= now() and ch.push_flag_ = 0 and ch.version_tag_ = 'v2'
+    </select>
+
+	<update id="updatePushFlag">
+        UPDATE course_homework SET push_flag_ = 1 WHERE id_ in
+        <foreach collection="ids" item="homeworkId" open="(" close=")" separator=",">
+            #{homeworkId}
+        </foreach>
+    </update>
 </mapper>

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

@@ -4129,4 +4129,82 @@
     <select id="checkCourseIsSettlementReport" resultType="int">
         SELECT COUNT(*) FROM course_schedule where settlement_report_flag_ = 1 and id_ = #{courseScheduleId}
     </select>
+
+    <sql id="selectPage">
+        <if test="param.teacherId != null">
+                and ( cs.actual_teacher_id_ = #{param.teacherId})
+            </if>
+            <if test="param.classType != null and param.classType != ''">
+                and cs.type_ = #{param.classType}
+            </if>
+
+            <if test="param.musicGroupId != null ">
+                and #{param.musicGroupId} = cs.music_group_id_
+            </if>
+            <if test="param.homeWorkStatus != null">
+                <if test="param.homeWorkStatus.code == 'UNASSIGNED'">
+                    and ch.id_ is null
+                </if>
+                <if test="param.homeWorkStatus.code == 'ASSIGNED'">
+                    and ch.id_ is not null
+                </if>
+                <if test="param.homeWorkStatus.code == 'DEADLINE'">
+                    and ch.id_ is not null and ch.expiry_date_ &lt; now()
+                </if>
+            </if>
+            <if test="courseIds != null and courseIds.size() != 0">
+                and cs.id_ in
+                <foreach collection="courseIds" item="courseId" open="(" separator="," close=")">
+                    #{courseId}
+                </foreach>
+            </if>
+            <if test="param.courseScheduleId != null">
+                and cs.id_ = #{param.courseScheduleId}
+            </if>
+            <if test="param.versionTag !=null and param.versionTag != ''">
+                and (ch.version_tag_ = #{param.versionTag} or ch.version_tag_ is null)
+            </if>
+    </sql>
+    <select id="queryTeacherServeHomeworkDetailV2"
+            resultType="com.ym.mec.biz.dal.dto.CourseHomeworkWrapper$CourseHomeworkList">
+        SELECT
+        cs.id_ as courseScheduleId,
+        ch.id_ as courseHomeworkId,
+        cs.class_date_ as classDate,
+        cs.start_class_time_ as startTime,
+        cs.end_class_time_ as endTime,
+        if(ch.id_ is null,'UNASSIGNED',if(ch.expiry_date_ &lt; now(),'DEADLINE','ASSIGNED')) as homeWorkStatus,
+        cs.teacher_id_ as teacherId,
+        cs.music_group_id_ as musicGroupId,
+        cs.type_ as classType,
+        cs.teach_mode_ as teachMode,
+        cs.class_group_id_ as classGroupId,
+        ch.create_time_ as assignTime,
+        ch.expiry_date_ as expiryDate,
+        ch.completed_num_ as finishNum,
+        cs.name_ as courseScheduleName,
+        ch.expect_num_ as studentNum
+        from course_schedule cs
+        left join course_homework ch on cs.id_ = ch.course_schedule_id_
+
+        <where>
+            <include refid="selectPage"/>
+
+        </where>
+        <if test="param.offset != null">
+            limit #{param.offset},#{param.rows}
+        </if>
+    </select>
+
+    <select id="countTeacherServeHomeworkDetailV2" resultType="int">
+        SELECT
+        count(1)
+        from course_schedule cs
+        left join course_homework ch on cs.id_ = ch.course_schedule_id_
+
+        <where>
+
+            <include refid="selectPage"/>
+        </where>
+    </select>
 </mapper>

+ 22 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml

@@ -121,6 +121,28 @@
 	<update id="updateCourseService">
 		UPDATE course_schedule_statistics SET service_flag_ = #{serviceFlag} WHERE FIND_IN_SET(course_schedule_id_,#{courseIds})
 	</update>
+    <update id="updateNum">
+		update student_extracurricular_exercises_situation_
+		set actual_exercises_num_ = 1,update_time_ = NOW()
+		where teacher_id_ = #{teacherId}
+		and student_id_ IN
+		<foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+			#{userId}
+		</foreach>
+		<if test="courseScheduleId != null">
+			AND FIND_IN_SET(#{courseScheduleId},course_ids_)
+		</if>
+		AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN monday_ AND sunday_ AND actual_exercises_num_ = 0
+	</update>
+	<update id="updateLastSubmitTime">
+		update student_extracurricular_exercises_situation_
+		set exercises_reply_num_ = 1,last_submit_time_ = NOW(),update_time_ = NOW()
+		where teacher_id_ = #{teacherId} and student_id_ = #{userId}
+		<if test="courseScheduleId != null">
+			AND FIND_IN_SET(#{courseScheduleId},course_ids_)
+		</if>
+		AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN monday_ AND sunday_
+	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >

+ 155 - 9
mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml

@@ -11,6 +11,7 @@
 		<result column="music_group_id_" property="musicGroupId" />
 		<result column="teacher_id_" property="teacherId" />
 		<result column="username_" property="teacher.username" />
+		<result column="classGroupId" property="classGroupId" />
 		<result column="student_id_list_" property="studentIdList" />
 		<result column="batch_no_" property="batchNo" />
 		<result column="title_" property="title" />
@@ -24,6 +25,12 @@
 		<result column="organ_name_" property="organName" />
 		<result column="tenant_id_" property="tenantId" />
 		<result column="music_score_id_" property="musicScoreId" />
+		<result column="assignTime" property="assignTime" />
+		<result column="musicGroupName" property="musicGroupName" />
+		<result column="versionTag" property="versionTag" />
+		<result column="type" property="type" />
+		<result column="push_flag_" property="pushFlag" />
+		<result column="group_type_" property="groupType" />
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -56,6 +63,26 @@
 			<if test="cloudHomeworkFlag != null and cloudHomeworkFlag == false">
 				AND (eer.music_score_id_ IS NULL OR eer.music_score_id_ = '')
 			</if>
+            <if test="type != null">
+                and ee.group_type_ = #{type}
+            </if>
+            <if test="search != null ">
+                and (su.real_name_ like '%' #{search} '%' or mg.name_ like '%' #{search} '%')
+            </if>
+            <if test="type != null">
+                and ee.group_type_ = #{type}
+            </if>
+            <if test="studentExerciseId != null">
+                and ee.id_ = #{studentExerciseId}
+            </if>
+            <if test="studentAssignFlag != null">
+                <if test="studentAssignFlag == true">
+                    and ee.music_group_id_ is null
+                </if>
+                <if test="studentAssignFlag == false">
+                    and ee.music_group_id_  is not null
+                </if>
+            </if>
 		</where>
 	</sql>
 	
@@ -70,12 +97,12 @@
 	</select>
 	
 	<!-- 向数据库增加一条记录 -->
-	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO extracurricular_exercises (music_group_id_,teacher_id_,student_id_list_,batch_no_,
-		                                       title_,attachments_,content_,expire_date_,completed_num_,expect_num_,create_time_,update_time_,tenant_id_)
-		VALUES(#{musicGroupId},#{teacherId},#{studentIdList},#{batchNo},#{title},#{attachments},
-		       #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW(),#{tenantId})
-	</insert>
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        INSERT INTO extracurricular_exercises (music_group_id_,teacher_id_,student_id_list_,batch_no_,
+        title_,attachments_,content_,expire_date_,completed_num_,expect_num_,create_time_,update_time_,tenant_id_,group_type_)
+        VALUES(#{musicGroupId},#{teacherId},#{studentIdList},#{batchNo},#{title},#{attachments},
+        #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW(),#{tenantId},#{groupType})
+    </insert>
 	
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises">
@@ -111,6 +138,9 @@
 			<if test="completedNum != null">
 			completed_num_ = #{completedNum},
 			</if>
+            <if test="versionTag != null and versionTag != ''">
+                version_tag_ = #{versionTag},
+            </if>
 			update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
@@ -122,23 +152,27 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="ExtracurricularExercises" parameterType="map">
-		SELECT ee.id_,ee.teacher_id_,ee.student_id_list_,ee.batch_no_,ee.title_,ee.attachments_,ee.music_group_id_,
+		SELECT ee.id_,ee.teacher_id_,ee.student_id_list_,ee.group_type_ as type,ee.batch_no_,ee.title_,ee.attachments_,ee.music_group_id_,
 		       ee.content_,ee.expire_date_,ee.completed_num_,ee.expect_num_,ee.create_time_,ee.update_time_,ee.tenant_id_
-		     ,u.real_name_ username_,o.name_ organ_name_,eer.music_score_id_
+		     ,u.real_name_ username_,o.name_ organ_name_,eer.music_score_id_,ee.create_time_ as assignTime,mg.name_ as musicGroupName,ee.class_group_id_ as classGroupId,ee.version_tag_ as versionTag
 		FROM extracurricular_exercises ee LEFT JOIN sys_user u ON ee.teacher_id_ = u.id_
 		LEFT JOIN teacher t ON t.id_ = ee.teacher_id_
+        left join sys_user su on t.id_ = su.id_
 		LEFT JOIN organization o ON o.id_ = t.organ_id_
+        left join music_group mg on mg.id_ = ee.music_group_id_
 		LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
 		<include refid="queryPageCondition"/>
 		GROUP BY ee.id_
-		ORDER BY id_ <include refid="global.limit"/>
+		ORDER BY id_ desc <include refid="global.limit"/>
 	</select>
 	
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(DISTINCT ee.id_) FROM extracurricular_exercises ee left join sys_user u on ee.teacher_id_ = u.id_
 		left join teacher t on t.id_ = ee.teacher_id_
+        left join sys_user su on t.id_ = su.id_
 		left join organization o on o.id_ = t.organ_id_
+        left join music_group mg on mg.id_ = ee.music_group_id_
 		LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
 		<include refid="queryPageCondition"/>
 	</select>
@@ -303,4 +337,116 @@
 			#{item}
 		</foreach>
 	</select>
+
+	<sql id="extraHomeworkDetailV2">
+		<if test="startTime != null and endTime != null">
+            create_time_ BETWEEN #{startTime} AND #{endTime}
+        </if>
+        <if test="homeWorkStatus != null">
+            <if test="homeWorkStatus.code == 'UNASSIGNED'">
+                AND id_ = -1
+            </if>
+            <if test="homeWorkStatus.code == 'ASSIGNED'">
+                AND expire_date_ &gt;= NOW()
+            </if>
+            <if test="homeWorkStatus.code == 'DEADLINE'">
+                AND expire_date_ &lt; NOW()
+            </if>
+        </if>
+        <if test="courseScheduleId != null">
+            AND id_ = #{courseScheduleId}
+        </if>
+        <if test="teacherId != null">
+            and teacher_id_ = #{teacherId}
+        </if>
+        <if test="type != null">
+            and group_type_ = #{type}
+        </if>
+        <if test="versionTag != null">
+            and version_tag_ = #{versionTag}
+        </if>
+        <if test="musicGroupId!=null and musicGroupId!=''">
+            and music_group_id_ = #{musicGroupId}
+        </if>
+	</sql>
+	<select id="countTeacherExtraHomeworkDetailV2" resultType="int">
+        select count(1) from (
+        select 1 from extracurricular_exercises
+        <where>
+        <include refid="extraHomeworkDetailV2"/>
+        </where>
+        <if test="subjectIds != null and subjectIds.size() != 0">
+            union all
+            select 1 from music_group
+            where id_ in
+            <foreach collection="subjectIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>) t
+    </select>
+
+	<select id="queryTeacherExtraHomeworkDetailV2"
+            resultType="com.ym.mec.biz.dal.dto.CourseHomeworkWrapper$CourseHomeworkList">
+
+        <if test="subjectIds != null and subjectIds.size() != 0">
+            (select
+            id_ as musicGroupId,
+            'UNASSIGNED' as homeWorkStatus,
+            'EXTRACURRICULAR' as `type`,
+            null as courseScheduleId,
+            null as courseHomeworkId,
+            null as classGroupId,
+            null as studentNum,
+            null as finishNum,
+            null as assignTime,
+            null as expiryDate,
+            null as studentIdList,
+            null as teacherId
+            from music_group
+            where id_ in
+            <foreach collection="subjectIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+            )
+            union all
+        </if>
+        (select
+        music_group_id_ as musicGroupId,
+        if(expire_date_ &gt; NOW(), 'ASSIGNED', 'DEADLINE') as homeWorkStatus,
+        group_type_ as `type`,
+        id_ as courseScheduleId,
+        id_ as courseHomeworkId,
+        class_group_id_ as classGroupId,
+        expect_num_ as studentNum,
+        completed_num_ as finishNum,
+        create_time_ as assignTime,
+        expire_date_ as expiryDate,
+        student_id_list_ as studentIdList,
+        teacher_id_ as teacherId
+        from extracurricular_exercises
+        <where>
+
+            <include refid="extraHomeworkDetailV2"/>
+        </where>
+        )
+        <include refid="global.limit"/>
+    </select>
+
+	<update id="updateFinishNum">
+        UPDATE extracurricular_exercises SET completed_num_ = ifnull(completed_num_,0) + 1 WHERE id_ = #{courseHomeworkId}
+    </update>
+
+	<select id="findEndHomework" resultMap="ExtracurricularExercises">
+
+        SELECT *
+        FROM extracurricular_exercises ee
+        WHERE ee.expire_date_ &lt;= now() and ee.push_flag_ = 0 and ee.version_tag_ = 'v2'
+    </select>
+
+	<update id="updatePushFlag">
+        UPDATE extracurricular_exercises SET push_flag_ = 1 WHERE id_ in
+        <foreach collection="ids" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </update>
 </mapper>

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

@@ -41,6 +41,11 @@
 		<result column="music_score_id_" property="musicScoreId" />
 		<result column="music_score_content_" property="musicScoreContent" />
 		<result column="homework_create_time_" property="homeworkCreateTime" />
+		<result column="extracurricularExercisesId" property="extracurricularExercisesId" />
+		<result column="musicGroupId" property="musicGroupId" />
+		<result column="type" property="type" />
+		<result column="classGroupId" property="classGroupId" />
+		<result column="subjectId" property="subjectId" />
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -192,10 +197,12 @@
 			eer.*,
 			su.username_ student_name_,
 		    su.avatar_,
-		    su.phone_
+		    su.phone_,
+        s.subject_id_list_ as subjectId
 		FROM
 			extracurricular_exercises_reply eer
 			LEFT JOIN sys_user su ON su.id_ = eer.user_id_
+        left join student s on s.user_id_ = su.id_
 		WHERE eer.extracurricular_exercises_id_= #{extraExerciseId}
 		<if test="studentName != null">
 			AND su.username_ LIKE CONCAT('%',#{studentName},'%')
@@ -238,10 +245,25 @@
 			<if test="createTime!=null">
 				AND DATE_FORMAT(eer.create_time_, '%Y-%m') = DATE_FORMAT(#{createTime}, '%Y-%m')
 			</if>
+            <if test="type != null">
+                and ee.group_type_ = #{type}
+            </if>
+            <if test="finishStatus != null">
+                <if test="finishStatus == true">
+                    and eer.standard_flag_ in ('STANDARD','EXCELLENT')
+                </if>
+                <if test="finishStatus == false">
+                    and (eer.standard_flag_  not in ('STANDARD','EXCELLENT') or eer.standard_flag_ is null)
+                </if>
+            </if>
+            <if test="versionTag != null">
+                and ee.version_tag_ = #{versionTag}
+            </if>
 		</where>
 	</sql>
 	<select id="countStudentExtraExercises" resultType="int">
-		SELECT COUNT(id_) FROM extracurricular_exercises_reply eer
+		SELECT COUNT(eer.id_) FROM extracurricular_exercises_reply eer
+        left join extracurricular_exercises ee on eer.extracurricular_exercises_id_ = ee.id_
 		<include refid="queryStudentExtraExercisesCondition"/>
 	</select>
 	<select id="findStudentExtraExercises" resultMap="ExtraExerciseStudentsDto">
@@ -250,6 +272,10 @@
 			ee.title_,
 			ee.expire_date_,
 			ee.teacher_id_,
+        ee.group_type_  as `type`,
+            ee.id_ as extracurricularExercisesId,
+            ee.music_group_id_ as musicGroupId,
+        ee.class_group_id_ as classGroupId,
 			tea.real_name_ teacher_name_,
 			tea.avatar_,
 			su.username_ student_name_
@@ -320,6 +346,9 @@
 			<if test="existVipCourse!=null and existVipCourse==0">
 				AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ WHERE cssp.user_id_=eer.user_id_ AND cssp.group_type_='VIP' AND CONCAT(cs.class_date_," ",cs.start_class_time_) &gt; NOW())
 			</if>
+            <if test="versionTag != null and versionTag != ''">
+                and ee.version_tag_ = #{versionTag}
+            </if>
 		</where>
 	</sql>
 
@@ -610,4 +639,17 @@
 		GROUP BY sr.actual_subject_id_
 	</select>
 
+	<select id="getByExtraIdAndUserId" resultType="com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply">
+        SELECT * from  extracurricular_exercises_reply where extracurricular_exercises_id_ = #{extraId} and user_id_ = #{userId}
+    </select>
+
+	<select id="queryNotDoneHomeworkList" resultMap="ExtracurricularExercisesReply">
+        SELECT eer.*, ee.group_type_ as ee_group_type_
+        from  extracurricular_exercises_reply  eer
+        left join extracurricular_exercises ee on ee.id_ = eer.extracurricular_exercises_id_
+
+        WHERE date_format(date_add(ee.expire_date_,interval -1 day),'%Y-%m-%d') = date_format(now(),'%Y-%m-%d')
+          AND (eer.standard_flag_ not in ('STANDARD', 'EXCELLENT') or eer.standard_flag_ is null)
+          AND ee.version_tag_ = 'v2'
+    </select>
 </mapper>

+ 49 - 0
mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -189,4 +189,53 @@
     <select id="queryNameByIds" resultMap="NameDto">
 		select id_,name_,3 type_ from im_group where FIND_IN_SET(id_,#{ids})
 	</select>
+
+	<select id="queryByUserIdV2" resultMap="ImGroup">
+        SELECT ig.* FROM im_group_member igm
+        LEFT JOIN im_group ig ON igm.im_group_id_ = ig.id_
+        left join class_group cg on cg.id_ = ig.id_
+        left join music_group mg on mg.id_ = cg.music_group_id_
+        where 1 =1 and ig.group_type_ in ('NORMAL','MIX')
+        <if test="userId != null">
+            AND igm.user_id_ = #{userId}
+        </if>
+        <if test="search != null and search != ''">
+            AND (ig.name_ like concat('%',#{search},'%') or ig.tags_ like concat('%',#{search},'%'))
+        </if>
+        <if test="groupType != null and groupType != ''">
+            AND ig.group_type_ = #{groupType}
+        </if>
+        <if test="musicGroupId != null and musicGroupId != ''">
+            and mg.id_ = #{musicGroupId}
+        </if>
+        <if test="classType != null and classType != ''">
+            AND cg.type_ = #{classType}
+        </if>
+
+    </select>
+
+	<select id="queryMemberByIdV2" resultMap="ImGroupMemberDto">
+        SELECT igm.*,u.avatar_,CASE WHEN find_in_set('STUDENT',u.user_type_) THEN u.username_ ELSE u.real_name_ END username_,
+        st.member_rank_setting_id_,s.name_ subject_name_,st.subject_id_list_ subject_id_
+        FROM im_group_member igm
+        LEFT JOIN sys_user u ON igm.user_id_ = u.id_
+        LEFT JOIN student st ON st.user_id_ = u.id_
+        LEFT JOIN `subject` s ON s.id_ = st.subject_id_list_
+        WHERE igm.im_group_id_ = #{imGroupId} and st.user_id_ is not null
+        <if test="search != null">
+            and (u.real_name_ like concat('%',#{search},'%'))
+        </if>
+        <if test="subjectId != null">
+            and st.subject_id_list_ = #{subjectId}
+        </if>
+        <if test="vipFlag != null">
+            <if test="vipFlag">
+                and st.member_rank_setting_id_ is not null
+            </if>
+            <if test="vipFlag == false">
+                and st.member_rank_setting_id_ is null
+            </if>
+        </if>
+
+    </select>
 </mapper>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä