Browse Source

Merge branch 'cloud_study_video' into music_score

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
Joburgess 4 years ago
parent
commit
d6ec69b1b9
100 changed files with 2923 additions and 706 deletions
  1. 13 3
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseHomeworkDao.java
  5. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  6. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  7. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  9. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  10. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  11. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  13. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  14. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  15. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreDao.java
  16. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java
  17. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudTeacherActiveTargetDto.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkListDto.java
  19. 14 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java
  20. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java
  21. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  22. 334 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListExportDto.java
  23. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java
  24. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtracurricularExercisesHomeworkListDto.java
  25. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java
  26. 21 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicalListDetailDto.java
  27. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  28. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceViewDto.java
  29. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServiceDetailDto.java
  30. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubTotalCourseTimesDto.java
  31. 23 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherHomeworkListDto.java
  32. 137 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeHomeworkPojo.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherSignOutDto.java
  34. 26 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseHomework.java
  35. 17 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercises.java
  36. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercisesReply.java
  37. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  38. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImUserFriend.java
  39. 84 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupQuit.java
  40. 106 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupReturnFeeDto.java
  41. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java
  42. 28 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  43. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java
  44. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQuitQueryInfo.java
  45. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java
  46. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysExamSongQueryInfo.java
  47. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherServeHomeworkQueryInfo.java
  48. 5 11
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  49. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  50. 2 4
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseReviewService.java
  51. 16 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesService.java
  52. 8 14
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  53. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  54. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java
  55. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  56. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  57. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  58. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java
  59. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  60. 17 125
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  61. 18 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  62. 72 77
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  63. 1 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  64. 34 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  65. 17 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  66. 72 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  67. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  68. 235 72
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  69. 1 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  70. 18 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  71. 49 43
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  72. 85 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  73. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  74. 111 58
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  75. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  76. 102 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  77. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  78. 222 37
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  79. 33 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  80. 10 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java
  81. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java
  82. 13 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  83. 17 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  84. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  85. 5 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  86. 11 0
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  87. 32 11
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  88. 46 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  89. 22 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  90. 76 8
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  91. 13 15
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  92. 12 4
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  93. 12 3
      mec-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml
  94. 3 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  95. 1 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  96. 38 8
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  97. 6 3
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  98. 42 10
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  99. 3 2
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  100. 78 25
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

+ 13 - 3
cms/src/main/java/com/ym/mec/cms/controller/NewsController.java

@@ -3,10 +3,12 @@ package com.ym.mec.cms.controller;
 import com.ym.mec.cms.dal.dao.StudentRegistrationDao;
 import com.ym.mec.cms.dal.entity.SysConfig;
 import com.ym.mec.cms.service.SysConfigService;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -59,7 +61,9 @@ public class NewsController extends BaseController {
 
 	@Autowired
 	private SysConfigService sysConfigService;
-	
+
+	private final LocalDate xiaMenBannerStartShowTime = LocalDate.parse("2021-10-01", DateUtil.dateFormatter);
+
 	@ApiOperation("资讯列表分页查询")
 	@GetMapping(value = "/list")
 	public Object getList(NewsInformationQueryInfo queryInfo) {
@@ -82,13 +86,17 @@ public class NewsController extends BaseController {
 		if(Objects.nonNull(cloudTeacherActiveIds)&&StringUtils.isNotBlank(cloudTeacherActiveIds.getParanValue())){
 			excludeIds = Arrays.stream(cloudTeacherActiveIds.getParanValue().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
 		}
+
 		if (user == null || user.getId() == null) {
 			queryInfo.setOrganId(43);
 			queryInfo.setExcludeIds(excludeIds);
 		} else {
 			queryInfo.setOrganId(user.getOrganId());
 			int memberGroupNum = studentRegistrationDao.countStudentMemberGroupNum(user.getId());
-			if(memberGroupNum>0){
+
+			//厦门学员
+			boolean xiaMenNotShow = user.getOrganId()==40&&LocalDate.now().compareTo(xiaMenBannerStartShowTime)<0;
+			if(memberGroupNum>0||xiaMenNotShow){
 				queryInfo.setExcludeIds(excludeIds);
 			}
 		}
@@ -137,7 +145,9 @@ public class NewsController extends BaseController {
 		} else {
 			queryInfo.setOrganId(user.getOrganId());
 			int memberGroupNum = studentRegistrationDao.countStudentMemberGroupNum(user.getId());
-			if(memberGroupNum>0){
+			//厦门学员
+			boolean xiaMenNotShow = user.getOrganId()==40&&LocalDate.now().compareTo(xiaMenBannerStartShowTime)<0;
+			if(memberGroupNum>0||xiaMenNotShow){
 				queryInfo.setExcludeIds(excludeIds);
 			}
 		}

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

@@ -849,4 +849,11 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     int countCourseNum(@Param("classGroupId") Integer classGroupId, @Param("teachMode") String teachMode);
     
     List<Mapper> countTeacherByMusicGroupId(String musicGroupId);
+
+    /**
+     * 获取学员班级列表map
+     * @param musicGroupId
+     * @return
+     */
+    List<Map<Integer, String>> queryStudentClassGroupMap(String musicGroupId);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -80,4 +81,11 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
                                                  @Param("remark") String remark);
 
     List<Integer> getStudentIds();
+
+    /**
+     * 获取学员云教练活动金额
+     * @param studentIds
+     * @return
+     */
+    List<Map<Long, BigDecimal>> queryActiveAmountMap(@Param("studentIds") List<Integer> studentIds);
 }

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

@@ -67,4 +67,11 @@ public interface CourseHomeworkDao extends BaseDAO<Long, CourseHomework> {
 	 * @return
 	 */
 	int findHomeCount(Map<String, Object> params);
+
+	/**
+	 * 获取作业列表
+	 * @param homeworkIdList
+	 * @return
+	 */
+	List<TeacherHomeworkListDto> findByIdList(@Param("homeworkIdList") List<Integer> homeworkIdList);
 }

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

@@ -247,7 +247,9 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @author Joburgess
      * @date 2019/10/18
      */
-    List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(@Param("classDate") Date classDate, @Param("teacherId") Long teacherId, @Param("type") String type);
+    List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(@Param("classDate") Date classDate,
+                                                              @Param("teacherId") Long teacherId,
+                                                              @Param("type") String type);
 
     /**
      * @param teacherId: 教师编号
@@ -1853,6 +1855,10 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     List<CourseSchedule> queryByCourseScheduleIds(Map<String, Object> params);
 
+    int countHomeworkPojoByCourseScheduleIds(Map<String, Object> params);
+
+    List<TeacherServeHomeworkPojo> queryHomeworkPojoByCourseScheduleIds(Map<String, Object> params);
+
     int countByCourseScheduleIds(Map<String, Object> params);
 
     /**

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

@@ -193,7 +193,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @author Joburgess
      * @date 2020/1/8
      */
-    List<Map<Integer, Integer>> countCourseStudentNum(@Param("courseIds") List<Long> courseIds);
+    List<Map<Long, Long>> countCourseStudentNum(@Param("courseIds") List<Long> courseIds);
 
     /**
      * @param courseScheduleId:
@@ -316,6 +316,8 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      */
     int countStudentNotStartCourseNumWithCourseType(@Param("studentId") Integer studentId,
                                                     @Param("courseScheduleType") CourseSchedule.CourseScheduleType courseScheduleType);
+    List<Map<Integer, Integer>> countStudentsNotStartCourseNumWithCourseType(@Param("studentIds") List<Integer> studentIds,
+                                                    @Param("courseScheduleType") CourseSchedule.CourseScheduleType courseScheduleType);
 
     /**
      * 批量操作节拍器状态
@@ -552,4 +554,10 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     int getHasVPCourseStudentNum(@Param("organId") Integer organId);
     List<Map<Integer, Integer>> getOrganHasVPCourseStudentNum(@Param("organIds") List<Integer> organIds);
 
+    /**
+     * 获取课程学员列表
+     * @param courseScheduleId
+     * @return
+     */
+    List<BasicUserDto> getCourseStudents(@Param("courseScheduleId") Long courseScheduleId);
 }

+ 24 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java

@@ -1,7 +1,9 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.ExtracurricularExercisesHomeworkListDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -40,6 +42,27 @@ public interface ExtracurricularExercisesDao extends BaseDAO<Long, Extracurricul
                                                                     @Param("classGroupId") Long classGroupId,
                                                                     @Param("subjectId") Integer subjectId,
                                                                     @Param("search") String search,
-                                                                    @Param("hasMember") Integer hasMember);
+                                                                    @Param("hasMember") Integer hasMember,
+                                                                    @Param("studentIds") String studentIds);
 
+    /**
+     * 获取老师已布置训练列表
+     * @param params
+     * @return
+     */
+    int countExtraExercilsesHomeworks(Map<String, Object> params);
+
+    /**
+     * 获取老师已布置训练列表
+     * @param params
+     * @return
+     */
+    List<ExtracurricularExercisesHomeworkListDto> findExtraExercilsesHomeworks(Map<String, Object> params);
+
+    /**
+     * 获取课外训练列表
+     * @param exercisesIdList
+     * @return
+     */
+    List<TeacherHomeworkListDto> findByIdList(@Param("exercisesIdList") List<Integer> exercisesIdList);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java

@@ -5,6 +5,8 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
 
@@ -40,4 +42,12 @@ public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
      * @return
      */
     MusicGroupQuit queryByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 学员是否有待审核的退团记录
+     * @param studentIds
+     * @param musicGroupId
+     * @return
+     */
+    List<Map<Integer, Long>> queryQuitMapByStudentId(@Param("studentIds") Set<Long> studentIds, @Param("musicGroupId") String musicGroupId);
 }

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

@@ -55,7 +55,8 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
      */
     List<StudentCourseHomework> constructInitialStudentHomeworkRecordsWithPayment(@Param("courseScheduleID") Long courseScheduleID,
                                                                                   @Param("courseHomeworkID") Long courseHomeworkID,
-                                                                                  @Param("musicScoreId") Integer musicScoreId);
+                                                                                  @Param("musicScoreId") String musicScoreId,
+                                                                                  @Param("userIdList") List<Integer> userIdList);
 
     /**
      * @param courseScheduleId: 作业编号

+ 17 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -311,6 +311,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<EduOrganStudentListDto> queryCloudStudyStudentData(Map<String, Object> params);
     int countCloudStudyStudentData(Map<String, Object> params);
 
+    List<Map<Integer, String>> getStudentCooperationNameMap(@Param("studentIds") List<Integer> studentIds);
+
     /**
      * @describe 更新学员云教练连续使用天数
      * @author Joburgess
@@ -374,6 +376,20 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     Set<Integer> getValidVipStudentIds();
 
     /**
+     * 获取课程中学员会员数量
+     * @param courseIds
+     * @return
+     */
+    List<Map<Long, Long>> countCourseStudentMemberNum(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * 获取课程生学员声部名称
+     * @param courseIds
+     * @return
+     */
+    List<Map<Long, String>> countCourseStudentSubjectName(@Param("courseIds") List<Long> courseIds);
+
+    /**
      * 获取老师关联的有课的学员列表
      * @param teacherId
      * @return
@@ -388,5 +404,5 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     /**
      * 标记进行中乐团在读学员+VIP、网管有课的学员
      */
-    void remarkCountFlag(@Param("studentIds") List<Integer> studentIds);
+    void remarkCountFlag();
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -142,4 +143,21 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                                              @Param("type") String type,
                                              @Param("studentIds") List<Integer> studentIds);
 
+    List<Long> queryCourseIdByClassDate(@Param("firstDayOfMonth") Date firstDayOfMonth,
+                                       @Param("lastDayOfMonth") Date lastDayOfMonth,
+                                       @Param("teacherId") Integer teacherId);
+
+    /**
+     * 统计服务周期内可布置的作业和训练数量
+     * @param teacherId
+     * @return
+     */
+    int countWaitCreateHomeworkNum(@Param("teacherId") Integer teacherId, @Param("serverType") String serverType);
+
+    /**
+     *
+     * @param teacherId
+     * @return
+     */
+    int countWaitCreateHomeworkNum1(Integer teacherId);
 }

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

@@ -87,7 +87,7 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      * @param status
      * @return
      */
-    StudentPaymentOrder findMusicGroupApplyOrderByStatus(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId,
+    List<StudentPaymentOrder> findMusicGroupApplyOrderByStatus(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId,
                                                          @Param("status") DealStatusEnum status);
 
     /**

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

@@ -676,6 +676,10 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      */
     List<Map<Integer, String>> queryStudentMusicGroupNamesMap(@Param("studentIds") List<Integer> studentIds);
 
+    List<Map<Integer, String>> queryStudentMusicGroupEduMap(@Param("studentIds") List<Integer> studentIds);
+
+    List<Map<Integer, String>> queryStudentSchoolNamesMap(@Param("studentIds") List<Integer> studentIds);
+
     /**
      * 获取进行中在读的学员列表
      * @return

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

@@ -1,15 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicCompareWeekData;
 import com.ym.mec.biz.dal.enums.HeardLevelEnum;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
 

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

@@ -3,7 +3,11 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysMusicScoreDao extends BaseDAO<Integer, SysMusicScore> {
 
+    List<SysMusicScore> findByIds(@Param("musicScoreIds") String musicScoreIds);
 }

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

@@ -34,6 +34,26 @@ public class BasicUserDto {
     @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
     private Integer comeOnPackage;
 
+    private Integer memberRankSettingId;
+
+    private String subjectIdList;
+
+    public Integer getMemberRankSettingId() {
+        return memberRankSettingId;
+    }
+
+    public void setMemberRankSettingId(Integer memberRankSettingId) {
+        this.memberRankSettingId = memberRankSettingId;
+    }
+
+    public String getSubjectIdList() {
+        return subjectIdList;
+    }
+
+    public void setSubjectIdList(String subjectIdList) {
+        this.subjectIdList = subjectIdList;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

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

@@ -23,6 +23,16 @@ public class CloudTeacherActiveTargetDto{
 
 	private BigDecimal targetFinishScale = BigDecimal.ZERO;
 
+	private BigDecimal targetAmountFinishScale = BigDecimal.ZERO;
+
+	public BigDecimal getTargetAmountFinishScale() {
+		return targetAmountFinishScale;
+	}
+
+	public void setTargetAmountFinishScale(BigDecimal targetAmountFinishScale) {
+		this.targetAmountFinishScale = targetAmountFinishScale;
+	}
+
 	public String getOrganName() {
 		return organName;
 	}

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

@@ -21,6 +21,9 @@ public class CourseHomeworkListDto {
     /** 作业内容 */
     private String content;
 
+    /** 作业内容 */
+    private String title;
+
     /**  */
     private java.util.Date createTime;
 
@@ -67,6 +70,14 @@ public class CourseHomeworkListDto {
     @ApiModelProperty(value = "实际上课老师头像",required = false)
     private String headUrl;
 
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
     public String getTeacherName() {
         return teacherName;
     }

+ 14 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @Author Joburgess
@@ -59,7 +60,7 @@ public class CourseHomeworkStudentDetailDto {
     private String teacherName;
 
     @ApiModelProperty(value = "伴奏编号",required = false)
-    private Integer musicScoreId;
+    private String musicScoreId;
 
     private String musicScoreName;
 
@@ -69,6 +70,8 @@ public class CourseHomeworkStudentDetailDto {
 
     private SysMusicScore sysMusicScore;
 
+    private List<SysMusicScore> sysMusicScoreList;
+
     public SysMusicScore getSysMusicScore() {
         return sysMusicScore;
     }
@@ -77,6 +80,14 @@ public class CourseHomeworkStudentDetailDto {
         this.sysMusicScore = sysMusicScore;
     }
 
+    public List<SysMusicScore> getSysMusicScoreList() {
+        return sysMusicScoreList;
+    }
+
+    public void setSysMusicScoreList(List<SysMusicScore> sysMusicScoreList) {
+        this.sysMusicScoreList = sysMusicScoreList;
+    }
+
     public Integer getHasMember() {
         return hasMember;
     }
@@ -96,11 +107,11 @@ public class CourseHomeworkStudentDetailDto {
         this.homeworkOpenFlag = homeworkOpenFlag;
     }
 
-    public Integer getMusicScoreId() {
+    public String getMusicScoreId() {
         return musicScoreId;
     }
 
-    public void setMusicScoreId(Integer musicScoreId) {
+    public void setMusicScoreId(String musicScoreId) {
         this.musicScoreId = musicScoreId;
     }
 

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

@@ -51,6 +51,17 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("新用户占比")
     private float newStudentDuty;
 
+    @ApiModelProperty("目标人数")
+    private Integer targetNum;
+
+    public Integer getTargetNum() {
+        return targetNum;
+    }
+
+    public void setTargetNum(Integer targetNum) {
+        this.targetNum = targetNum;
+    }
+
     public int getNewStudentNum() {
         return newStudentNum;
     }

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java

@@ -52,6 +52,36 @@ public class EduOrganStudentListDto {
     @ApiModelProperty("会员有效期")
     private String membershipEndTime;
 
+    private String currentGradeNum;
+
+    private String currentClass;
+
+    private Integer countFlag;
+
+    public String getCurrentGradeNum() {
+        return currentGradeNum;
+    }
+
+    public void setCurrentGradeNum(String currentGradeNum) {
+        this.currentGradeNum = currentGradeNum;
+    }
+
+    public String getCurrentClass() {
+        return currentClass;
+    }
+
+    public void setCurrentClass(String currentClass) {
+        this.currentClass = currentClass;
+    }
+
+    public Integer getCountFlag() {
+        return countFlag;
+    }
+
+    public void setCountFlag(Integer countFlag) {
+        this.countFlag = countFlag;
+    }
+
     public Integer getStudentId() {
         return studentId;
     }

+ 334 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListExportDto.java

@@ -0,0 +1,334 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+public class EduOrganStudentListExportDto {
+
+    @ApiModelProperty("学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty("姓名")
+    private String studentName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("指导老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty("指导老师名称")
+    private String teacherName;
+
+    @ApiModelProperty("声部编号")
+    private Integer subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    private String currentGradeNum;
+
+    private String currentClass;
+
+    @ApiModelProperty("乐团名称")
+    private String musicGroupNames;
+
+    @ApiModelProperty("乐团主管")
+    private String educationName;
+
+    @ApiModelProperty("活动金额")
+    private BigDecimal activeAmount;
+
+    @ApiModelProperty("是否目标学员")
+    private Integer countFlag;
+
+    @ApiModelProperty("所属学校")
+    private String schoolNames;
+
+    private boolean newUser;
+
+    @ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
+    private int carePackage;
+
+    @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
+    private int comeOnPackage;
+
+    @ApiModelProperty("是否激活")
+    private boolean enable;
+
+    private int serviceTag;
+
+    private int operatingTag;
+
+    private int notStartCourseNum;
+
+    private int notStartVipCourseNum;
+
+    private int notStartPracticeCourseNum;
+
+    @ApiModelProperty("是否有小课")
+    private int hasVipGroup;
+
+    @ApiModelProperty("训练次数")
+    private int cloudStudyUseNum;
+
+    @ApiModelProperty("平均时长")
+    private double cloudStudyUseAvgTime;
+
+    @ApiModelProperty("总时长")
+    private  double cloudStudyUseTime;
+
+    @ApiModelProperty("连续天数")
+    private int cloudStudyRunningDays;
+
+    @ApiModelProperty("使用天数")
+    private int cloudStudyUseDays;
+
+    @ApiModelProperty("会员有效期")
+    private String membershipEndTime;
+
+    public String getCurrentClass() {
+        return currentClass;
+    }
+
+    public void setCurrentClass(String currentClass) {
+        this.currentClass = currentClass;
+    }
+
+    public String getCurrentGradeNum() {
+        return currentGradeNum;
+    }
+
+    public void setCurrentGradeNum(String currentGradeNum) {
+        this.currentGradeNum = currentGradeNum;
+    }
+
+    public String getEducationName() {
+        return educationName;
+    }
+
+    public void setEducationName(String educationName) {
+        this.educationName = educationName;
+    }
+
+    public BigDecimal getActiveAmount() {
+        return activeAmount;
+    }
+
+    public void setActiveAmount(BigDecimal activeAmount) {
+        this.activeAmount = activeAmount;
+    }
+
+    public Integer getCountFlag() {
+        return countFlag;
+    }
+
+    public void setCountFlag(Integer countFlag) {
+        this.countFlag = countFlag;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    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 String getMusicGroupNames() {
+        return musicGroupNames;
+    }
+
+    public void setMusicGroupNames(String musicGroupNames) {
+        this.musicGroupNames = musicGroupNames;
+    }
+
+    public int getHasVipGroup() {
+        return hasVipGroup;
+    }
+
+    public void setHasVipGroup(int hasVipGroup) {
+        this.hasVipGroup = hasVipGroup;
+    }
+
+    public int getCloudStudyUseNum() {
+        return cloudStudyUseNum;
+    }
+
+    public void setCloudStudyUseNum(int cloudStudyUseNum) {
+        this.cloudStudyUseNum = cloudStudyUseNum;
+    }
+
+    public double getCloudStudyUseAvgTime() {
+        return cloudStudyUseAvgTime;
+    }
+
+    public void setCloudStudyUseAvgTime(double cloudStudyUseAvgTime) {
+        this.cloudStudyUseAvgTime = cloudStudyUseAvgTime;
+    }
+
+    public double getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(double cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public int getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(int cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
+
+    public String getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(String membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+    }
+
+    public int getCloudStudyUseDays() {
+        return cloudStudyUseDays;
+    }
+
+    public void setCloudStudyUseDays(int cloudStudyUseDays) {
+        this.cloudStudyUseDays = cloudStudyUseDays;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSchoolNames() {
+        return schoolNames;
+    }
+
+    public void setSchoolNames(String schoolNames) {
+        this.schoolNames = schoolNames;
+    }
+
+    public boolean isNewUser() {
+        return newUser;
+    }
+
+    public void setNewUser(boolean newUser) {
+        this.newUser = newUser;
+    }
+
+    public int getCarePackage() {
+        return carePackage;
+    }
+
+    public void setCarePackage(int carePackage) {
+        this.carePackage = carePackage;
+    }
+
+    public int getComeOnPackage() {
+        return comeOnPackage;
+    }
+
+    public void setComeOnPackage(int comeOnPackage) {
+        this.comeOnPackage = comeOnPackage;
+    }
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public int getServiceTag() {
+        return serviceTag;
+    }
+
+    public void setServiceTag(int serviceTag) {
+        this.serviceTag = serviceTag;
+    }
+
+    public int getOperatingTag() {
+        return operatingTag;
+    }
+
+    public void setOperatingTag(int operatingTag) {
+        this.operatingTag = operatingTag;
+    }
+
+    public int getNotStartCourseNum() {
+        return notStartCourseNum;
+    }
+
+    public void setNotStartCourseNum(int notStartCourseNum) {
+        this.notStartCourseNum = notStartCourseNum;
+    }
+
+    public int getNotStartVipCourseNum() {
+        return notStartVipCourseNum;
+    }
+
+    public void setNotStartVipCourseNum(int notStartVipCourseNum) {
+        this.notStartVipCourseNum = notStartVipCourseNum;
+    }
+
+    public int getNotStartPracticeCourseNum() {
+        return notStartPracticeCourseNum;
+    }
+
+    public void setNotStartPracticeCourseNum(int notStartPracticeCourseNum) {
+        this.notStartPracticeCourseNum = notStartPracticeCourseNum;
+    }
+}

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

@@ -17,7 +17,7 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
 
     private String teacherName;
 
-    private Integer musicScoreId;
+    private String musicScoreId;
 
     private String musicScoreName;
 
@@ -41,11 +41,11 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
 
     private String existVipCourseStr;
 
-    public Integer getMusicScoreId() {
+    public String getMusicScoreId() {
         return musicScoreId;
     }
 
-    public void setMusicScoreId(Integer musicScoreId) {
+    public void setMusicScoreId(String musicScoreId) {
         this.musicScoreId = musicScoreId;
     }
 

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtracurricularExercisesHomeworkListDto.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import java.util.Date;
+
+public class ExtracurricularExercisesHomeworkListDto {
+
+    @ApiModelProperty(value = "作业编号")
+    private Integer homeworkId;
+
+    @ApiModelProperty(value = "作业类型")
+    private String type;
+
+    public Integer getHomeworkId() {
+        return homeworkId;
+    }
+
+    public void setHomeworkId(Integer homeworkId) {
+        this.homeworkId = homeworkId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

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

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.List;
+
+public class MusicScoreSubjectDto {
+
+    private Integer subjectId;
+
+    private List<Integer> userIdList;
+
+    private List<Integer> musicScoreIdList;
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public List<Integer> getUserIdList() {
+        return userIdList;
+    }
+
+    public void setUserIdList(List<Integer> userIdList) {
+        this.userIdList = userIdList;
+    }
+
+    public List<Integer> getMusicScoreIdList() {
+        return musicScoreIdList;
+    }
+
+    public void setMusicScoreIdList(List<Integer> musicScoreIdList) {
+        this.musicScoreIdList = musicScoreIdList;
+    }
+}

+ 21 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicalListDetailDto.java

@@ -24,6 +24,10 @@ public class MusicalListDetailDto {
     private BigDecimal accessoriesAmount;
 
     private BigDecimal courseAmount;
+    
+    private BigDecimal cloudTeacherAmount;
+    
+    private BigDecimal maintenanceAmount;
 
     private BigDecimal orderAmount;
 
@@ -113,7 +117,23 @@ public class MusicalListDetailDto {
         this.courseAmount = courseAmount;
     }
 
-    public BigDecimal getOrderAmount() {
+    public BigDecimal getCloudTeacherAmount() {
+		return cloudTeacherAmount;
+	}
+
+	public void setCloudTeacherAmount(BigDecimal cloudTeacherAmount) {
+		this.cloudTeacherAmount = cloudTeacherAmount;
+	}
+
+	public BigDecimal getMaintenanceAmount() {
+		return maintenanceAmount;
+	}
+
+	public void setMaintenanceAmount(BigDecimal maintenanceAmount) {
+		this.maintenanceAmount = maintenanceAmount;
+	}
+
+	public BigDecimal getOrderAmount() {
         return orderAmount;
     }
 

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

@@ -55,6 +55,9 @@ public class SoundCompareHelper implements PitchDetectionHandler {
     @ApiModelProperty(value = "录音文件地址")
     private String recordFilePath;
 
+    @ApiModelProperty(value = "播放速度")
+    private int speed = 90;
+
     @ApiModelProperty(value = "小节xml信息字典")
     private Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap = new HashMap<>();
 
@@ -126,6 +129,14 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         this.recordId = recordId;
     }
 
+    public int getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(int speed) {
+        this.speed = speed;
+    }
+
     public String getBehaviorId() {
         return behaviorId;
     }

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

@@ -50,6 +50,17 @@ public class StudentAttendanceViewDto {
 
     private Boolean beMerged;
 
+    @ApiModelProperty(value = "是否有待审核的退团申请",required = false)
+    private Integer quitFlag;
+
+    public Integer getQuitFlag() {
+        return quitFlag;
+    }
+
+    public void setQuitFlag(Integer quitFlag) {
+        this.quitFlag = quitFlag;
+    }
+
     public Integer getCurrentGradeNum() {
         return currentGradeNum;
     }

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

@@ -46,6 +46,16 @@ public class StudentServiceDetailDto {
 
     private String attachments;
 
+    private String musicScoreId;
+
+    public String getMusicScoreId() {
+        return musicScoreId;
+    }
+
+    public void setMusicScoreId(String musicScoreId) {
+        this.musicScoreId = musicScoreId;
+    }
+
     public Date getCourseEndTime() {
         return courseEndTime;
     }

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

@@ -9,8 +9,18 @@ public class StudentSubTotalCourseTimesDto{
 
     private String phone;
 
+    private String classGroupId;
+
     private List<MapDto> MapDtos;
 
+    public String getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(String classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+
     public String getUsername() {
         return username;
     }

+ 23 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherHomeworkListDto.java

@@ -11,12 +11,18 @@ import java.util.Date;
  */
 public class TeacherHomeworkListDto {
 
-    @ApiModelProperty(value = "作业编号")
+    @ApiModelProperty(value = "课程编号")
     private Integer courseScheduleId;
 
+    @ApiModelProperty(value = "作业编号")
+    private Integer homeworkId;
+
     @ApiModelProperty(value = "作业内容")
     private String content;
 
+    @ApiModelProperty(value = "作业标题")
+    private String title;
+
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
@@ -56,6 +62,22 @@ public class TeacherHomeworkListDto {
 
     private int status;
 
+    public Integer getHomeworkId() {
+        return homeworkId;
+    }
+
+    public void setHomeworkId(Integer homeworkId) {
+        this.homeworkId = homeworkId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
     public Date getEndClassTime() {
         return endClassTime;
     }

+ 137 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeHomeworkPojo.java

@@ -0,0 +1,137 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class TeacherServeHomeworkPojo {
+
+    private String subjectName;
+
+    private Integer memberNum;
+
+    private String classGroupName;
+
+    private String courseScheduleType;
+
+    private Long courseScheduleId;
+
+    private Integer studentNum;
+
+    private String classDate;
+
+    private String startClassTime;
+
+    private String endClassTime;
+
+    private String teachMode;
+
+    private Integer signInStatus;
+
+    private Integer signOutStatus;
+
+    @ApiModelProperty(value = "是否是第一次进行学生点名")
+    private int studentAttendanceIsFirstTime;
+
+    public int getStudentAttendanceIsFirstTime() {
+        return studentAttendanceIsFirstTime;
+    }
+
+    public void setStudentAttendanceIsFirstTime(int studentAttendanceIsFirstTime) {
+        this.studentAttendanceIsFirstTime = studentAttendanceIsFirstTime;
+    }
+
+    public Integer getSignInStatus() {
+        return signInStatus;
+    }
+
+    public void setSignInStatus(Integer signInStatus) {
+        this.signInStatus = signInStatus;
+    }
+
+    public Integer getSignOutStatus() {
+        return signOutStatus;
+    }
+
+    public void setSignOutStatus(Integer signOutStatus) {
+        this.signOutStatus = signOutStatus;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getMemberNum() {
+        return memberNum;
+    }
+
+    public void setMemberNum(Integer memberNum) {
+        this.memberNum = memberNum;
+    }
+
+    public String getClassGroupName() {
+        return classGroupName;
+    }
+
+    public void setClassGroupName(String classGroupName) {
+        this.classGroupName = classGroupName;
+    }
+
+    public String getCourseScheduleType() {
+        return courseScheduleType;
+    }
+
+    public void setCourseScheduleType(String courseScheduleType) {
+        this.courseScheduleType = courseScheduleType;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public String getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(String teachMode) {
+        this.teachMode = teachMode;
+    }
+}

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

@@ -11,7 +11,7 @@ import com.ym.mec.biz.dal.entity.TeacherAttendance;
  */
 public class TeacherSignOutDto {
 
-    @ApiModelProperty(value = "教师签退信息",required = true)
+    @ApiModelProperty(value = "教师签退信息")
     private TeacherAttendance teacherAttendanceInfo;
 
     @ApiModelProperty(value = "课后作业信息")

+ 26 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseHomework.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
 import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -7,6 +8,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 import com.ym.mec.biz.dal.enums.GroupType;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 对应数据库表(course_homework):
@@ -26,6 +28,9 @@ public class CourseHomework {
 	
 	/** 作业内容 */
 	private String content;
+
+	/** 作业内容 */
+	private String title;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -53,13 +58,31 @@ public class CourseHomework {
 	private Integer expectNum;
 
 	@ApiModelProperty(value = "伴奏编号",required = false)
-	private Integer musicScoreId;
+	private String musicScoreId;
+
+	private List<MusicScoreSubjectDto> musicScoreSubjectDto;
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public List<MusicScoreSubjectDto> getMusicScoreSubjectDto() {
+		return musicScoreSubjectDto;
+	}
+
+	public void setMusicScoreSubjectDto(List<MusicScoreSubjectDto> musicScoreSubjectDto) {
+		this.musicScoreSubjectDto = musicScoreSubjectDto;
+	}
 
-	public Integer getMusicScoreId() {
+	public String getMusicScoreId() {
 		return musicScoreId;
 	}
 
-	public void setMusicScoreId(Integer musicScoreId) {
+	public void setMusicScoreId(String musicScoreId) {
 		this.musicScoreId = musicScoreId;
 	}
 

+ 17 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercises.java

@@ -1,10 +1,13 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.auth.api.entity.SysUser;
 
+import java.util.List;
+
 /**
  * 对应数据库表(extracurricular_exercises):
  */
@@ -58,10 +61,21 @@ public class ExtracurricularExercises {
 
 	private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
 
-	private Integer musicScoreId;
+	/** 伴奏列表(多个用逗号分隔) */
+	private String musicScoreId;
 
 	private String musicScoreName;
 
+	private List<MusicScoreSubjectDto> musicScoreSubjectDtos;
+
+	public List<MusicScoreSubjectDto> getMusicScoreSubjectDtos() {
+		return musicScoreSubjectDtos;
+	}
+
+	public void setMusicScoreSubjectDtos(List<MusicScoreSubjectDto> musicScoreSubjectDtos) {
+		this.musicScoreSubjectDtos = musicScoreSubjectDtos;
+	}
+
 	public String getMusicScoreName() {
 		return musicScoreName;
 	}
@@ -70,11 +84,11 @@ public class ExtracurricularExercises {
 		this.musicScoreName = musicScoreName;
 	}
 
-	public Integer getMusicScoreId() {
+	public String getMusicScoreId() {
 		return musicScoreId;
 	}
 
-	public void setMusicScoreId(Integer musicScoreId) {
+	public void setMusicScoreId(String musicScoreId) {
 		this.musicScoreId = musicScoreId;
 	}
 

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercisesReply.java

@@ -51,6 +51,16 @@ public class ExtracurricularExercisesReply {
 
 	private Date submitTime;
 
+	private String musicScoreId;
+
+	public String getMusicScoreId() {
+		return musicScoreId;
+	}
+
+	public void setMusicScoreId(String musicScoreId) {
+		this.musicScoreId = musicScoreId;
+	}
+
 	public Integer getIsRepliedTimely() {
 		return isRepliedTimely;
 	}

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -23,6 +23,12 @@ public class ImGroupMember {
 	
 	/** 群角色 */
 	private String roleType;
+
+	private Integer memberRankSettingId;
+
+	private String subjectName;
+
+	private String subjectId;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -30,6 +36,30 @@ public class ImGroupMember {
 	/**  */
 	private java.util.Date updateTime;
 
+	public String getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(String subjectId) {
+		this.subjectId = subjectId;
+	}
+
+	public Integer getMemberRankSettingId() {
+		return memberRankSettingId;
+	}
+
+	public void setMemberRankSettingId(Integer memberRankSettingId) {
+		this.memberRankSettingId = memberRankSettingId;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImUserFriend.java

@@ -23,12 +23,42 @@ public class ImUserFriend {
 	
 	private String tags;
 
+	private Integer memberRankSettingId;
+
+	private String subjectName;
+
+	private String subjectId;
+
 	/**  */
 	private java.util.Date createTime;
 
 	/**  */
 	private java.util.Date updateTime;
 
+	public String getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(String subjectId) {
+		this.subjectId = subjectId;
+	}
+
+	public Integer getMemberRankSettingId() {
+		return memberRankSettingId;
+	}
+
+	public void setMemberRankSettingId(Integer memberRankSettingId) {
+		this.memberRankSettingId = memberRankSettingId;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
 	public void setId(Long id) {
 		this.id = id;
 	}

+ 84 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupQuit.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.auth.api.entity.SysUser;
 
-import java.math.BigDecimal;
-
 /**
  * 对应数据库表(music_group_quit):
  */
@@ -37,9 +39,25 @@ public class MusicGroupQuit {
 
 	private ApprovalStatus status;
 	
+	private Integer applyUserId;
+
+	private String applyUserName;
+	
+	private Boolean isVisit;
+	
+	private Date visitTime;
+	
+	private String feeJson;
+	
+	private BigDecimal returnTotalFee;
+	
+	private String currentApproveRole;
+	
 	private SysUser user = new SysUser();
 	
 	private MusicGroup musicGroup = new MusicGroup();
+	
+	private MusicGroupReturnFeeDto returnFeeDto;
 
 	@ApiModelProperty(value = "是否有乐保",required = false)
 	private Boolean hasMaintenance = false;
@@ -47,6 +65,14 @@ public class MusicGroupQuit {
 	@ApiModelProperty(value = "云教练金额",required = false)
 	private BigDecimal cloudTeacherAmount = BigDecimal.ZERO;
 
+	public String getApplyUserName() {
+		return applyUserName;
+	}
+
+	public void setApplyUserName(String applyUserName) {
+		this.applyUserName = applyUserName;
+	}
+
 	public void setId(Long id) {
 		this.id = id;
 	}
@@ -135,6 +161,46 @@ public class MusicGroupQuit {
 		this.musicGroup = musicGroup;
 	}
 
+	public Integer getApplyUserId() {
+		return applyUserId;
+	}
+
+	public void setApplyUserId(Integer applyUserId) {
+		this.applyUserId = applyUserId;
+	}
+
+	public Boolean getIsVisit() {
+		return isVisit;
+	}
+
+	public void setIsVisit(Boolean isVisit) {
+		this.isVisit = isVisit;
+	}
+
+	public Date getVisitTime() {
+		return visitTime;
+	}
+
+	public void setVisitTime(Date visitTime) {
+		this.visitTime = visitTime;
+	}
+
+	public String getFeeJson() {
+		return feeJson;
+	}
+
+	public void setFeeJson(String feeJson) {
+		this.feeJson = feeJson;
+	}
+
+	public String getCurrentApproveRole() {
+		return currentApproveRole;
+	}
+
+	public void setCurrentApproveRole(String currentApproveRole) {
+		this.currentApproveRole = currentApproveRole;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
@@ -155,4 +221,20 @@ public class MusicGroupQuit {
 	public void setCloudTeacherAmount(BigDecimal cloudTeacherAmount) {
 		this.cloudTeacherAmount = cloudTeacherAmount;
 	}
+
+	public MusicGroupReturnFeeDto getReturnFeeDto() {
+		return returnFeeDto;
+	}
+
+	public void setReturnFeeDto(MusicGroupReturnFeeDto returnFeeDto) {
+		this.returnFeeDto = returnFeeDto;
+	}
+
+	public BigDecimal getReturnTotalFee() {
+		return returnTotalFee;
+	}
+
+	public void setReturnTotalFee(BigDecimal returnTotalFee) {
+		this.returnTotalFee = returnTotalFee;
+	}
 }

+ 106 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupReturnFeeDto.java

@@ -0,0 +1,106 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.math.BigDecimal;
+
+public class MusicGroupReturnFeeDto {
+
+	private Boolean isReturnCourseFee;
+	
+	private BigDecimal courseFee;
+	
+	private Boolean isReturnMemberFee;
+	
+	private BigDecimal memberFee;
+	
+	private Boolean isReturnMusicalFee;
+	
+	private BigDecimal musicalFee;
+	
+	private Boolean isReturnAccessoriesFee;
+	
+	private BigDecimal accessoriesFee;
+	
+	private Boolean isReturnMaintenanceFee;
+	
+	private BigDecimal maintenanceFee;
+
+	public Boolean getIsReturnCourseFee() {
+		return isReturnCourseFee;
+	}
+
+	public void setIsReturnCourseFee(Boolean isReturnCourseFee) {
+		this.isReturnCourseFee = isReturnCourseFee;
+	}
+
+	public BigDecimal getCourseFee() {
+		return courseFee;
+	}
+
+	public void setCourseFee(BigDecimal courseFee) {
+		this.courseFee = courseFee;
+	}
+
+	public Boolean getIsReturnMemberFee() {
+		return isReturnMemberFee;
+	}
+
+	public void setIsReturnMemberFee(Boolean isReturnMemberFee) {
+		this.isReturnMemberFee = isReturnMemberFee;
+	}
+
+	public BigDecimal getMemberFee() {
+		return memberFee;
+	}
+
+	public void setMemberFee(BigDecimal memberFee) {
+		this.memberFee = memberFee;
+	}
+
+	public Boolean getIsReturnMusicalFee() {
+		return isReturnMusicalFee;
+	}
+
+	public void setIsReturnMusicalFee(Boolean isReturnMusicalFee) {
+		this.isReturnMusicalFee = isReturnMusicalFee;
+	}
+
+	public BigDecimal getMusicalFee() {
+		return musicalFee;
+	}
+
+	public void setMusicalFee(BigDecimal musicalFee) {
+		this.musicalFee = musicalFee;
+	}
+
+	public Boolean getIsReturnAccessoriesFee() {
+		return isReturnAccessoriesFee;
+	}
+
+	public void setIsReturnAccessoriesFee(Boolean isReturnAccessoriesFee) {
+		this.isReturnAccessoriesFee = isReturnAccessoriesFee;
+	}
+
+	public BigDecimal getAccessoriesFee() {
+		return accessoriesFee;
+	}
+
+	public void setAccessoriesFee(BigDecimal accessoriesFee) {
+		this.accessoriesFee = accessoriesFee;
+	}
+
+	public Boolean getIsReturnMaintenanceFee() {
+		return isReturnMaintenanceFee;
+	}
+
+	public void setIsReturnMaintenanceFee(Boolean isReturnMaintenanceFee) {
+		this.isReturnMaintenanceFee = isReturnMaintenanceFee;
+	}
+
+	public BigDecimal getMaintenanceFee() {
+		return maintenanceFee;
+	}
+
+	public void setMaintenanceFee(BigDecimal maintenanceFee) {
+		this.maintenanceFee = maintenanceFee;
+	}
+}

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

@@ -55,7 +55,7 @@ public class StudentCourseHomework {
 	private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
 
 	//伴奏编号
-	private Integer musicScoreId;
+	private String musicScoreId;
 	//伴奏编号
 	private String musicScoreName;
 
@@ -67,11 +67,11 @@ public class StudentCourseHomework {
 		this.musicScoreName = musicScoreName;
 	}
 
-	public Integer getMusicScoreId() {
+	public String getMusicScoreId() {
 		return musicScoreId;
 	}
 
-	public void setMusicScoreId(Integer musicScoreId) {
+	public void setMusicScoreId(String musicScoreId) {
 		this.musicScoreId = musicScoreId;
 	}
 

+ 28 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -63,10 +63,21 @@ public class SysMusicCompareRecord {
 
 	private DeviceTypeEnum deviceType;
 
+	private float sourceTime = 0;
+
 	private float playTime = 0;
 
+	private int speed = 90;
+
 	private String clientId;
-	
+
+	public SysMusicCompareRecord() {
+	}
+
+	public SysMusicCompareRecord(FeatureType feature) {
+		this.feature = feature;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -195,6 +206,14 @@ public class SysMusicCompareRecord {
 		this.deviceType = deviceType;
 	}
 
+	public float getSourceTime() {
+		return sourceTime;
+	}
+
+	public void setSourceTime(float sourceTime) {
+		this.sourceTime = sourceTime;
+	}
+
 	public float getPlayTime() {
 		return playTime;
 	}
@@ -203,6 +222,14 @@ public class SysMusicCompareRecord {
 		this.playTime = playTime;
 	}
 
+	public int getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(int speed) {
+		this.speed = speed;
+	}
+
 	public String getMonday() {
 		return monday;
 	}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java

@@ -60,6 +60,17 @@ public class SysMusicScore {
 	/**  */
 	private java.util.Date createTime;
 
+	//是否显示
+	private Integer showFlag = 0;
+
+	public Integer getShowFlag() {
+		return showFlag;
+	}
+
+	public void setShowFlag(Integer showFlag) {
+		this.showFlag = showFlag;
+	}
+
 	public String getRankIds() {
 		return rankIds;
 	}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQuitQueryInfo.java

@@ -13,6 +13,8 @@ public class MusicGroupQuitQueryInfo extends QueryInfo {
     private ApprovalStatus status;
 
     private Integer educationUserId;
+    
+    private String currentApproveRole;
 
     public Integer getEducationUserId() {
         return educationUserId;
@@ -53,4 +55,12 @@ public class MusicGroupQuitQueryInfo extends QueryInfo {
     public void setIds(String ids) {
         this.ids = ids;
     }
+
+	public String getCurrentApproveRole() {
+		return currentApproveRole;
+	}
+
+	public void setCurrentApproveRole(String currentApproveRole) {
+		this.currentApproveRole = currentApproveRole;
+	}
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java

@@ -9,6 +9,9 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
 
     private String organIds;
 
+    @ApiModelProperty("目标学员总数")
+    private String targetNum;
+
     @ApiModelProperty("学员总数")
     private String totalStudentNum;
 
@@ -45,6 +48,14 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
     @ApiModelProperty("新用户人数占比")
     private String newStudentDuty;
 
+    public String getTargetNum() {
+        return targetNum;
+    }
+
+    public void setTargetNum(String targetNum) {
+        this.targetNum = targetNum;
+    }
+
     public String getNewStudentNum() {
         return newStudentNum;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysExamSongQueryInfo.java

@@ -33,6 +33,16 @@ public class SysExamSongQueryInfo extends QueryInfo {
 
     private List<Integer> categoriesIdList;
 
+    private Integer showFlag;
+
+    public Integer getShowFlag() {
+        return showFlag;
+    }
+
+    public void setShowFlag(Integer showFlag) {
+        this.showFlag = showFlag;
+    }
+
     public Integer getRankType() {
         return rankType;
     }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherServeHomeworkQueryInfo.java

@@ -14,8 +14,28 @@ public class TeacherServeHomeworkQueryInfo extends QueryInfo {
 
     private Date sunday;
 
+    private Date month;
+
     private Integer teacherId;
 
+    private String courseType;
+
+    public Date getMonth() {
+        return month;
+    }
+
+    public void setMonth(Date month) {
+        this.month = month;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+
     public Date getMonday() {
         return monday;
     }

+ 5 - 11
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dto.WebSocketClientDetail;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
-import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.WebSocketEventHandler;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -16,7 +13,6 @@ import org.springframework.web.socket.*;
 import org.springframework.web.socket.handler.AbstractWebSocketHandler;
 
 import java.io.IOException;
-import java.util.Date;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -56,6 +52,9 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
         String phone = session.getPrincipal().getName().split(":")[1];
+        if(WS_CLIENTS.containsKey(phone)){
+            WS_CLIENTS.get(phone).getSession().close();
+        }
         LOGGER.info("{}上线", phone);
         WS_CLIENTS.put(phone, new WebSocketClientDetail(session, System.currentTimeMillis()));
         appMap.values().forEach(e->e.afterConnectionEstablished(session, phone));
@@ -96,13 +95,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
         String phone = session.getPrincipal().getName().split(":")[1];
         session.close();
-        LOGGER.info("发生了错误,移除客户端: {}", phone, exception);
-        appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
-        exception.printStackTrace();
-        if(!WS_CLIENTS.containsKey(phone)){
-            return;
-        }
-        WS_CLIENTS.remove(phone);
+        LOGGER.info("{}异常: {}", phone, exception);
     }
 
     @Override
@@ -111,6 +104,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}离线: {}s", phone, (System.currentTimeMillis() - WS_CLIENTS.get(phone).getLoginTime())/1000);
         appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
+        session.close();
         WS_CLIENTS.remove(phone);
     }
 

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

@@ -117,7 +117,7 @@ public interface ContractService {
 	 * @param userId
 	 * @return
 	 */
-	boolean transferProduceContract(Integer userId, String musicGroupId, CourseViewTypeEnum courseViewType);
+	void transferProduceContract(Integer userId, String musicGroupId, CourseViewTypeEnum courseViewType);
 
 	/**
 	 * 传递产品协议-仅生成课程协议

+ 2 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/CourseReviewService.java

@@ -100,12 +100,10 @@ public interface CourseReviewService extends BaseService<Integer, CourseSchedule
 
 	/**
 	 * 布置线上课作业
-	 * @param courseScheduleId
-	 * @param content
-	 * @param expiryDate
+	 * @param courseHomeworkInfo
 	 * @return
 	 */
-	CourseHomework addHomeWork(Integer courseScheduleId,String content, Date expiryDate,Integer musicScoreId);
+	CourseHomework addHomeWork(CourseHomework courseHomeworkInfo);
 
 	/**
 	 * 获取网管课列表

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

@@ -2,8 +2,11 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
+import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
@@ -36,7 +39,13 @@ public interface ExtracurricularExercisesService extends BaseService<Long, Extra
      * @param search:
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
-    List<BasicUserDto> getDontServeStudents(Integer teacherId, String search, String musicGroupId,Long classGroupId,Integer subjectId,Integer hasMember);
+    List<BasicUserDto> getDontServeStudents(Integer teacherId,
+                                            String search,
+                                            String musicGroupId,
+                                            Long classGroupId,
+                                            Integer subjectId,
+                                            Integer hasMember,
+                                            String studentIds);
 
     /**
      * @describe 应布置课外训练提醒
@@ -46,4 +55,10 @@ public interface ExtracurricularExercisesService extends BaseService<Long, Extra
      */
     void studentServeRemind();
 
+    /**
+     * 获取已布置训练列表
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo);
 }

+ 8 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -138,13 +138,14 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 */
 	boolean extensionPreApplyExpireDate(String musicGroupId, Date expireDate);
 
-	/**
+		/**
 	 * 申请退团
-	 * @param musicGroupId 乐团编号
-	 * @param reason
+	 * @param reqMusicGroupQuit 
+	 * @param operatorId
 	 * @return
 	 */
-	boolean applyQuitMusicGroup(String musicGroupId, String reason);
+	boolean applyQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit, Integer operatorId);
+
 
 	/**
 	 * 取消退团
@@ -157,18 +158,11 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 
 	/**
 	 * 审批退团
-	 * @param id
-	 * @param status
-	 * @param reason
-	 * @param isRefundCourseFee 是否退还课程费用
-	 * @param isRefundInstrumentFee 是否退还乐器费用
-	 * @param isRefundTeachingAssistantsFee 是否退还教辅费用
-	 * @param maintenanceFee
-	 * @param cloudTeacherAmount
+	 * @param currentOperatorRoleIds
+	 * @param reqMusicGroupQuit
 	 * @return
 	 */
-	boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
-								  boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee, BigDecimal cloudTeacherAmount);
+	boolean approveQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit);
 
 	/**
 	 * 一键退团

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

@@ -9,7 +9,7 @@ import java.util.*;
 
 public interface OrganizationService extends BaseService<Integer, Organization> {
 
-    Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56));
+    Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56,2,27,22,24));
 
     /**
      * 获取节点树状结构

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
-import com.ym.mec.biz.dal.dto.TeacherServeDto;
-import com.ym.mec.biz.dal.dto.TeacherServeExtraDto;
-import com.ym.mec.biz.dal.dto.TeacherServeHomeworkDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
 import com.ym.mec.biz.dal.page.StudentExercisesSituationQueryInfo;
 import com.ym.mec.biz.dal.page.StudentServiceDetailQueryInfo;
@@ -58,6 +55,13 @@ public interface StudentExtracurricularExercisesSituationService extends BaseSer
 
     PageInfo<TeacherServeHomeworkDto> queryTeacherServeHomeworkDetail(TeacherServeHomeworkQueryInfo queryInfo);
 
+    PageInfo<TeacherServeHomeworkPojo> queryTeacherServeHomeworkDetail1(TeacherServeHomeworkQueryInfo queryInfo);
+
     PageInfo<TeacherServeExtraDto> queryTeacherServeExtraDetail(TeacherServeHomeworkQueryInfo queryInfo);
 
+    /**
+     * 获取能布置作业的课程数量
+     * @return
+     */
+    int countWaitCreateHomeworkNum();
 }

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

@@ -55,7 +55,7 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
      * @param status
      * @return
      */
-    StudentPaymentOrder findMusicGroupApplyOrderByStatus(Integer userId, String musicGroupId, DealStatusEnum status);
+    List<StudentPaymentOrder> findMusicGroupApplyOrderByStatus(Integer userId, String musicGroupId, DealStatusEnum status);
 
     /**
      * 根据orderNo查询订单

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -60,6 +60,15 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
     List<StudentPaymentOrderDetail> queryFeeDetail(Integer studentId, String musicGroupId);
 
     /**
+     * 学生预计退团退费金额详情
+     *
+     * @param studentId
+     * @param musicGroupId
+     * @return
+     */
+    Map<String, BigDecimal> queryRefundsDetail(Integer studentId, String musicGroupId);
+
+    /**
      * 获取未分配的班级的学生
      *
      * @param musicGroupId    乐团id

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

@@ -111,6 +111,7 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return com.ym.mec.biz.dal.dto.StatDto
      */
     StatDto organStudentData(StudentQueryInfo queryInfo);
+    StatDto exportOrganStudentData(StudentQueryInfo queryInfo);
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java

@@ -8,6 +8,9 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
 
     /**
@@ -38,4 +41,12 @@ public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
      * @return
      */
     PageInfo<HorseRaceLampDto> queryHorseRaceLampDtoList(QueryInfo queryInfo);
+
+    /**
+     * 获取用户优惠券列表
+     * @param amount
+     * @param userId
+     * @return
+     */
+    List<SysCouponCode> queryCouponPage(BigDecimal amount, Integer userId);
 }

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

@@ -152,6 +152,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private EmployeeDao employeeDao;
     @Autowired
+    private MusicGroupQuitDao musicGroupQuitDao;
+    @Autowired
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
@@ -1773,8 +1775,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (schedule.getGroupType() == MUSIC) {
                 Set<Long> collect = truantStudent.stream().map(e -> e.getStudentId()).collect(Collectors.toSet());
                 Map<Integer, String> paymentStatusMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryUserCoursePaymentStatus(collect, schedule.getMusicGroupId()));
+
+                Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect,schedule.getMusicGroupId()));
+                //学员是否有待审核的退团申请
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setPaymentStatus(paymentStatusMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                    Long aLong = quitMap.get(studentAttendanceViewDto.getStudentId().intValue());
+                    studentAttendanceViewDto.setQuitFlag(aLong==null?0:aLong.intValue());
                 });
             }
             List<StudentAttendanceViewDto> tempIds = truantStudent.stream()

+ 17 - 125
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
@@ -330,7 +331,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Override
 	public boolean transferMusicGroupCoursesContract(Integer userId, String musicGroupId) {
 		if(true){
-			return transferProduceContract(userId, musicGroupId, null);
+			transferProduceContract(userId, musicGroupId, null);
+			return true;
 		}
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 
@@ -525,7 +527,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Override
 	public boolean transferVipGroupCoursesContract(Integer userId, Long vipGroupId) {
 		if(true){
-			return transferProduceContract(userId, null, null);
+			transferProduceContract(userId, null, null);
+			return true;
 		}
 
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
@@ -667,120 +670,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Override
 	public boolean transferGoodsContract(Integer userId, String musicGroupId, String goodsIds, KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum) {
-		if(true){
-			return transferProduceContract(userId, musicGroupId, null);
-		}
-
-		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
-
-		if (sysUserTsign == null) {
-			SysUser user = sysUserFeignService.queryUserById(userId);
-			if (user == null) {
-				throw new BizException("用户信息查询失败");
-			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
-		}
-		Date date = new Date();
-
-		// 合成freemarker
-		String srcPdfPath = contractBaseDir + "/goods/" + dateFormat1.format(date) + "/" + userId + ".pdf";
-
-		File srcFile = new File(srcPdfPath);
-
-		File debtFile = new File(srcFile.getParent());
-		if (!debtFile.exists()) {
-			debtFile.mkdirs();
-		}
-
-		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
-		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
-
-		Map<String, Object> params = new HashMap<String, Object>();
-
-		// 查询参数信息
-		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
-
-		int subjectId = studentInfo.getSubject().getId();
-
-		Subject subject = subjectService.get(subjectId);
-		studentInfo.setSubject(subject);
-
-		params.put("studentInfo", studentInfo);
-
-		List<Goods> goodsList = goodsService.findGoodsByIds(goodsIds);
-		params.put("goodsList", goodsList);
-
-		double depositFee = 0d;
-		if (kitGroupPurchaseTypeEnum == KitGroupPurchaseTypeEnum.LEASE) {
-			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.SUCCESS);
-
-			if (studentPaymentOrder == null) {
-				MusicGroupSubjectGoodsGroup musicGroupSubjectPlan = musicGroupSubjectGoodsGroupService.query(musicGroupId, subjectId, goodsIds);
-				if (musicGroupSubjectPlan != null) {
-					depositFee = musicGroupSubjectPlan.getDepositFee().doubleValue();
-				}
-			} else {
-
-				List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.findApplyOrderGoods(studentPaymentOrder.getId());
-				for (StudentPaymentOrderDetail detail : orderDetailList) {
-					if (detail.getType() == OrderDetailTypeEnum.MUSICAL) {
-						depositFee = detail.getPrice().doubleValue();
-					}
-				}
-			}
-		}
-		params.put("depositFee", depositFee);
-		params.put("depositFeeFmt", MoneyUtil.toChinese(depositFee + ""));
-
-		params.put("isShowVisualSeal", false);
-
-		MusicGroup musicGroup = musicGroupService.get(musicGroupId);
-		if (musicGroup == null) {
-			throw new BizException("乐团信息没找到");
-		}
-
-		params.put("ownershipType", musicGroup.getOwnershipType().name());
-
-		templateEngine.render(params, "goods.ftl", srcFile);
-
-		// 生成借款协议PDF
-		try {
-			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
-		} catch (IOException e) {
-			throw new BizException("生成pdf协议失败", e);
-		}
-		String organCode = "";
-		if (musicGroup.getOwnershipType() == OwnershipType.OWN) {
-			organCode = "91440300326364429H";
-		} else {
-			organCode = "91420106333619290A";
-		}
-		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-		if (organTsign == null) {
-			throw new BizException("甲方未创建签章");
-		}
-
-		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
-
-		if (sysUserTsign != null) {
-			eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
-		}
-
-		// 上传到oss
-		String dateStrOss = dateFormatOss.format(date);
-		dateStrOss = "goods/" + dateStrOss + "/" + DateUtil.getHour(date);
-		String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
-
-		SysUserContracts sysUserContracts = new SysUserContracts();
-		sysUserContracts.setCreateTime(date);
-		sysUserContracts.setType(ContractType.INSTRUMENT);
-		sysUserContracts.setUrl(pdfFilePath);
-		sysUserContracts.setUserId(userId);
-
-		sysUserContractsService.insert(sysUserContracts);
-
-		FileUtils.deleteQuietly(srcFile);
 
+		transferProduceContract(userId, musicGroupId,null);
 		return true;
 	}
 
@@ -890,7 +781,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Override
 	public boolean transferPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
 		if(true){
-			return transferProduceContract(userId, null, null);
+			 transferProduceContract(userId, null, null);
+			 return true;
 		}
 
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
@@ -967,18 +859,19 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	}
 
 	@Override
+	@Async
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
-	public boolean transferProduceContract(Integer userId,String musicGroupId, CourseViewTypeEnum courseViewType) {
+	public void transferProduceContract(Integer userId,String musicGroupId, CourseViewTypeEnum courseViewType) {
 		SysUser user = studentDao.lockUserReturnInfo(userId);
 
 		if (user == null) {
 			logger.error("用户不存在({})", userId);
-			return false;
+			return;
 		}
 
 		if(StringUtils.isBlank(user.getRealName())||StringUtils.isBlank(user.getIdCardNo())){
 			logger.error("身份信息缺失({})", userId);
-			return false;
+			return;
 		}
 
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
@@ -987,7 +880,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 			} catch (Exception e) {
 				logger.error("用户电子签章注册失败", e);
-				return false;
+				return;
 			}
 		}
 		Date date = new Date();
@@ -1025,7 +918,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
 			if (musicGroup == null) {
 				logger.error("乐团信息没找到({})", musicGroupId);
-				return false;
+				return;
 			}
 			params.put("ownershipType", musicGroup.getOwnershipType().name());
 			ownershipType = musicGroup.getCourseViewType();
@@ -1037,7 +930,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, ownershipType.getContractVersion());
 		if(!CollectionUtils.isEmpty(userContracts)){
-			return true;
+			return;
 		}
 
 		templateEngine.render(params, "product"+ownershipType.getContractVersion()+".ftl", srcFile);
@@ -1047,7 +940,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
 			logger.error("生成产品协议失败", e);
-			return false;
+			return;
 		}
 
 
@@ -1060,7 +953,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
 		if (organTsign == null) {
 			logger.error("甲方未创建签章");
-			return false;
+			return;
 		}
 
 		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -1083,7 +976,6 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		sysUserContractsService.insert(sysUserContracts);
 
 		FileUtils.deleteQuietly(srcFile);
-		return true;
 	}
 
 	@Override

+ 18 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java

@@ -5,6 +5,7 @@ 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.Mapper;
+import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
 import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
@@ -79,9 +80,23 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 			oldCourseHomework.setExpiryDate(DateUtil.addDays(date,7));
 			oldCourseHomework.setExpectNum(courseScheduleDao.countCourseStudentNum(courseSchedule.getId()));
 			courseHomeworkDao.insert(oldCourseHomework);
-			List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao
-					.constructInitialStudentHomeworkRecordsWithPayment(courseSchedule.getId(),
-							oldCourseHomework.getId(),oldCourseHomework.getMusicScoreId());
+			List<StudentCourseHomework> studentCourseHomeworks = new ArrayList<>();
+
+			//获取按学员声部发放的作业
+			List<MusicScoreSubjectDto> musicScoreSubjectDto = courseHomework.getMusicScoreSubjectDto();
+			if(musicScoreSubjectDto != null && musicScoreSubjectDto.size() > 0){
+				for (MusicScoreSubjectDto scoreSubjectDto : musicScoreSubjectDto) {
+					studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(courseSchedule.getId(),
+							oldCourseHomework.getId(),
+							StringUtils.join(scoreSubjectDto.getMusicScoreIdList(),","),
+							scoreSubjectDto.getUserIdList()));
+				}
+			}else {
+				studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(courseSchedule.getId(),
+						oldCourseHomework.getId(),
+						oldCourseHomework.getMusicScoreId(),
+						null));
+			}
 			if(CollectionUtils.isEmpty(studentCourseHomeworks)){
 				throw new BizException("此课程没有学生");
 			}

+ 72 - 77
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -1,37 +1,32 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.*;
-import java.util.stream.Collectors;
-
+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.GroupType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
-import com.ym.mec.biz.service.*;
-import com.ym.mec.common.entity.ImPrivateMessage;
-import com.ym.mec.common.entity.ImTxtMessage;
-import com.ym.mec.im.ImFeignService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseReview4EduQueryInfo;
 import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
+import com.ym.mec.biz.service.*;
 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.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 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.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseScheduleReview> implements CourseReviewService {
@@ -71,9 +66,6 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
     private SysMessageService sysMessageService;
 
     @Autowired
-    private ImFeignService imFeignService;
-
-    @Autowired
     private TeacherDao teacherDao;
 
     @Autowired
@@ -302,6 +294,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
         teacherClassGroupInfo.setEndClassTime(DateUtil.dateToString(courseSchedule.getEndClassTime(), "HH:mm"));
         teacherClassGroupInfo.setClassGroupName(classGroup.getName());
         teacherClassGroupInfo.setCourseScheduleType(courseSchedule.getType());
+        teacherClassGroupInfo.setTeachMode(courseSchedule.getTeachMode().getCode());
         return teacherClassGroupInfo;
     }
 
@@ -532,22 +525,27 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
 
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public CourseHomework addHomeWork(Integer courseScheduleId, String content, Date expiryDate,Integer musicScoreId) {
+    public CourseHomework addHomeWork(CourseHomework courseHomeworkInfo) {
+        String content = courseHomeworkInfo.getContent();
+        String title = courseHomeworkInfo.getTitle();
+        Date expiryDate = courseHomeworkInfo.getExpiryDate();
+        if (StringUtils.isBlank(title)) {
+            throw new BizException("作业标题不能为空");
+        }
         if (StringUtils.isBlank(content)) {
             throw new BizException("作业内容不能为空");
         }
-        if (courseScheduleId == null || courseScheduleId <= 0) {
-            throw new BizException("课程id必须大于0");
-        }
         Date date = new Date();
-        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseHomeworkInfo.getCourseScheduleId());
         if (courseSchedule == null) {
             throw new BizException("课程不存在");
         }
         studentDao.lockUser(courseSchedule.getActualTeacherId());
 
-        CourseHomework existHomework = courseHomeworkDao.findByCourseSchedule(courseScheduleId.longValue());
-
+        CourseHomework existHomework = courseHomeworkDao.findByCourseSchedule(courseHomeworkInfo.getCourseScheduleId());
+        if(existHomework != null){
+            throw new BizException("作业已布置");
+        }
         //新增课堂作业
         CourseHomework courseHomework = new CourseHomework();
         List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseSchedule(courseSchedule.getId());
@@ -562,62 +560,59 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
 //            }
 //        }
 
-        if (Objects.nonNull(existHomework)) {
-            courseHomework.setId(existHomework.getId());
-            courseHomework.setContent(content);
-            courseHomework.setExpiryDate(expiryDate);
-            courseHomework.setMusicScoreId(musicScoreId);
-            courseHomeworkService.update(courseHomework);
-        } else {
-            courseHomework.setMusicScoreId(musicScoreId);
-            courseHomework.setContent(content);
-            courseHomework.setCourseScheduleId(courseSchedule.getId());
-            courseHomework.setMusicGroupId(courseSchedule.getMusicGroupId());
-            courseHomework.setGroupType(courseSchedule.getGroupType());
-            courseHomework.setClassGroupId(courseSchedule.getClassGroupId());
-            courseHomework.setExpiryDate(expiryDate);
-            courseHomework.setExpectNum(CollectionUtils.isEmpty(courseScheduleStudentPayments) ? 0 : courseScheduleStudentPayments.size());
-            courseHomeworkService.insert(courseHomework);
-        }
-
-        if (!CollectionUtils.isEmpty(courseScheduleStudentPayments)) {
-            Teacher teacher = teacherDao.get(courseSchedule.getActualTeacherId());
-            String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 3), "MM月dd日");
-            for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
-                StudentCourseHomework studentCourseHomework = new StudentCourseHomework();
-                if (Objects.isNull(existHomework)) {
-                    studentCourseHomework.setCourseHomeworkId(courseHomework.getId());
-                    studentCourseHomework.setUserId(courseScheduleStudentPayment.getUserId());
-                    studentCourseHomework.setMusicScoreId(musicScoreId);
-                    studentCourseHomework.setCourseScheduleId(courseSchedule.getId());
-                    studentCourseHomework.setCreateTime(date);
-                    studentCourseHomework.setUpdateTime(date);
-                    studentCourseHomework.setStatus(YesOrNoEnum.NO);
-                    studentCourseHomework.setIsView(YesOrNoEnum.NO);
-                    studentCourseHomework.setIsReplied(YesOrNoEnum.NO);
-                    studentCourseHomework.setIsRepliedTimely(0);
-                    studentCourseHomeworkDao.insert(studentCourseHomework);
-                } else {
-                    studentCourseHomework = studentCourseHomeworkDao.findByStudentAndCourseHomewok(existHomework.getId(), courseScheduleStudentPayment.getUserId());
-                }
+        courseHomework.setTitle(title);
+        courseHomework.setContent(content);
+        courseHomework.setCourseScheduleId(courseSchedule.getId());
+        courseHomework.setMusicGroupId(courseSchedule.getMusicGroupId());
+        courseHomework.setGroupType(courseSchedule.getGroupType());
+        courseHomework.setClassGroupId(courseSchedule.getClassGroupId());
+        courseHomework.setExpiryDate(expiryDate);
+        courseHomework.setExpectNum(CollectionUtils.isEmpty(courseScheduleStudentPayments) ? 0 : courseScheduleStudentPayments.size());
+        courseHomeworkService.insert(courseHomework);
+
+        List<StudentCourseHomework> studentCourseHomeworks = new ArrayList<>();
+
+        //获取按学员声部发放的作业
+        List<MusicScoreSubjectDto> musicScoreSubjectDto = courseHomeworkInfo.getMusicScoreSubjectDto();
+        if(musicScoreSubjectDto != null && musicScoreSubjectDto.size() > 0){
+            for (MusicScoreSubjectDto scoreSubjectDto : musicScoreSubjectDto) {
+                studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(courseHomework.getCourseScheduleId(),
+                        courseHomework.getId(),
+                        StringUtils.join(scoreSubjectDto.getMusicScoreIdList(),","),
+                        scoreSubjectDto.getUserIdList()));
+            }
+        }else {
+            studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(courseHomework.getCourseScheduleId(),
+                    courseHomework.getId(),
+                    courseHomework.getMusicScoreId(),
+                    null));
+        }
+        if(CollectionUtils.isEmpty(studentCourseHomeworks)){
+            throw new BizException("此课程没有学生");
+        }
+        courseHomeworkService.update(courseHomework);
 
-                Map<Integer, String> userMap = new HashMap<>();
-                userMap.put(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getUserId().toString());
-                String notifyUrl = "?courseScheduleID=" + courseSchedule.getId() + "&studentCourseHomeworkId=" + studentCourseHomework.getId() + "&extra=0";
-                String extra = "dayaedu" + notifyUrl + "&userId=" + courseScheduleStudentPayment.getUserId();
+        studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
+        List<Integer> studentIds = studentCourseHomeworks.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
 
-                sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_REMIND, courseSchedule.getActualTeacherId().toString(), extra,
-                        new String[]{courseScheduleStudentPayment.getUserId().toString()},
-                        null, courseSchedule.getName(), dateStr, courseHomework.getContent());
+        Teacher teacher = teacherDao.get(courseSchedule.getActualTeacherId());
+        studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, teacher.getId());
 
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_HOMEWORK_REMIND,
-                        userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
-            }
 
-            List<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
-            studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, courseSchedule.getActualTeacherId());
-        }
+        String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 3), "MM月dd日");
+        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);
+        }
         return courseHomework;
     }
 

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

@@ -234,22 +234,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(planList.size() >= courseNumNo){
 			currentCourseDetail.setCoursePlan(planList.get(courseNumNo - 1).getPlan());
 		}
-		//获取有会员的学员数
-//		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
-//		if(StringUtils.isEmpty(configValue)){
-//			configValue = "0";
-//		}
-//		if(configValue.equals("0")){
-//			currentCourseDetail.setMemberNum(0);
-//		}else {
-//			CourseSchedule courseSchedule = courseScheduleDao.get(courseID);
-//			MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
-//			if(musicGroup != null){
-//				currentCourseDetail.setCourseViewType(musicGroup.getCourseViewType());
-//			}
-//			List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseID);
-//			currentCourseDetail.setMemberNum(studentDao.getMemberNum(StringUtils.join(students, ",")));
-//		}
 		return currentCourseDetail;
     }
 
@@ -1136,7 +1120,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             params.put("offset", pageInfo.getOffset());
             dataList = courseScheduleDao.getCourseSchedulesWithDate(params);
             List<Long> allCourseScheduleIds = dataList.stream().map(CourseScheduleDto::getId).collect(Collectors.toList());
-            List<Map<Integer, Integer>> courseStudentNumMaps = courseScheduleStudentPaymentDao.countCourseStudentNum(allCourseScheduleIds);
+            List<Map<Long, Long>> courseStudentNumMaps = courseScheduleStudentPaymentDao.countCourseStudentNum(allCourseScheduleIds);
             Map<Long, Long> courseStudentNumMap = MapUtil.convertIntegerMap(courseStudentNumMaps);
 
 			List<StudentAttendance> studentAttendances = studentAttendanceDao.getWithCoursesAndExcludeQuitStudent(allCourseScheduleIds);

+ 34 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -20,6 +20,7 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.upload.UploadUtil;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -361,6 +362,10 @@ public class ExportServiceImpl implements ExportService {
             cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
         }
         long i = 1;
+        
+        Map<String,BigDecimal> serviceChargeMap = new HashMap<String, BigDecimal>();
+        Map<String,Integer> orderCountMap = new HashMap<String, Integer>();
+        
         for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
             if (row.getActualAmount() == null) {
                 row.setActualAmount(BigDecimal.ZERO);
@@ -375,17 +380,43 @@ public class ExportServiceImpl implements ExportService {
                 row.setMemo("");
             }
             BigDecimal transferFee = BigDecimal.ZERO;
+            BigDecimal currentFee = BigDecimal.ZERO;
+            BigDecimal totalFee = BigDecimal.ZERO;
             if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
                 FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
-                if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum() && row.getFeeFlag().equals("Y")) {
+                
+                Integer times = orderCountMap.get(row.getOrderNo());
+				if (times == null) {
+					times = 1;
+				} else {
+					++times;
+				}
+            	orderCountMap.put(row.getOrderNo(), times);
+                
+                transferFee = serviceChargeMap.get(row.getOrderNo());
+                if(transferFee == null){
+                	transferFee = BigDecimal.ZERO;
+                }
+                
+                currentFee = row.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                totalFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                if(totalFee.subtract(transferFee.add(currentFee)).doubleValue() < 0 || times == countFeeFlagNum.getTotalNum()){
+                	currentFee = totalFee.subtract(transferFee);
+                	serviceChargeMap.put(row.getOrderNo(), totalFee);
+                }else{
+                	serviceChargeMap.put(row.getOrderNo(), transferFee.add(currentFee));
+                }
+                
+                /*if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum() && row.getFeeFlag().equals("Y")) {
                     transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
                 }
                 if (countFeeFlagNum.getTotalNum().equals(countFeeFlagNum.getYesNum())) {
                     BigDecimal totalTransferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
                     transferFee = totalTransferFee.multiply(row.getRouteAmount()).divide(row.getActualAmount(), 2, BigDecimal.ROUND_HALF_UP);
-                }
+                }*/
+                
             }
-            row.setTransferFee(transferFee);
+            row.setTransferFee(currentFee);
 
             String goodsName = "";
             if (row.getOrderDetailList() != null) {

+ 17 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -105,23 +105,26 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		detail.setStudentName(extraExerciseReply.getStudentName());
 		detail.setExpiryDate(extraExerciseReply.getExpireDate());
 		detail.setType("EXTRA");
-		if(extraExerciseReply.getMusicScoreId() != null){
-			detail.setSysMusicScore(sysMusicScoreDao.get(extraExerciseReply.getMusicScoreId()));
-		}
 
 		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
 		if(StringUtils.isEmpty(configValue)){
 			configValue = "0";
 		}
 		detail.setHomeworkOpenFlag(Integer.parseInt(configValue));
-		if(configValue.equals("0")){
-			detail.setHasMember(0);
-		}else {
-			detail.setMusicScoreId(extraExerciseReply.getMusicScoreId());
-			detail.setMusicScoreName(extraExerciseReply.getMusicScoreName());
-			Student student = studentDao.get(extraExerciseReply.getUserId());
-			detail.setHasMember(student.getMemberRankSettingId()==null?0:1);
+//		if(configValue.equals("0")){
+//			detail.setHasMember(0);
+//		}else {
+		if(StringUtils.isNotEmpty(extraExerciseReply.getMusicScoreId())){
+			List<SysMusicScore> sysMusicScores = sysMusicScoreDao.findByIds(extraExerciseReply.getMusicScoreId());
+			detail.setSysMusicScoreList(sysMusicScores);
+			SysMusicScore sysMusicScore = sysMusicScores.get(0);
+			detail.setSysMusicScore(sysMusicScore);
+			detail.setMusicScoreId(sysMusicScore.getId().toString());
+			detail.setMusicScoreName(sysMusicScore.getName());
 		}
+		Student student = studentDao.get(extraExerciseReply.getUserId());
+		detail.setHasMember(student.getMemberRankSettingId()==null?0:1);
+//		}
 		return detail;
 	}
 
@@ -173,10 +176,10 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		existExtra.setSubmitTime(new Date());
 		extracurricularExercisesReplyDao.update(existExtra);
 
-		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		LocalDate createDateTime = LocalDateTime.ofInstant(existExtra.getCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
-		LocalDate createMonday = createDateTime.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+//		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+//		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+//		LocalDate createDateTime = LocalDateTime.ofInstant(existExtra.getCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
+//		LocalDate createMonday = createDateTime.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
 
 		int submitStudentNum=extracurricularExercisesReplyDao.countIsSubmitStudents(existExtra.getExtracurricularExercisesId());
 		extracurricularExercises.setCompletedNum(submitStudentNum);

+ 72 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -1,11 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao;
-import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
-import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
+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.Teacher;
@@ -17,6 +13,7 @@ import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
@@ -49,6 +46,8 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	@Autowired
 	private TeacherDao teacherDao;
 	@Autowired
+	private CourseHomeworkDao courseHomeworkDao;
+	@Autowired
 	private StudentServeService studentServeService;
 
 	@Override
@@ -65,8 +64,16 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		if(StringUtils.isBlank(exercises.getContent())){
 			throw new BizException("请填写内容");
 		}
+		List<MusicScoreSubjectDto> scoreSubjectDtoList = exercises.getMusicScoreSubjectDtos();
 		if(StringUtils.isBlank(exercises.getStudentIdList())){
-			throw new BizException("请指定学生");
+			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());
@@ -87,6 +94,13 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 		exercises.setExpectNum(studentIds.size());
 		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());
@@ -95,6 +109,16 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 			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(),","));
+						break;
+					}
+				}
+			}
 			extracurricularExercisesReplyDao.insert(studentExtraExercise);
 
 			String notifyUrl = "?courseScheduleID=" + studentExtraExercise.getId() + "&studentCourseHomeworkId=" + studentExtraExercise.getId() + "&extra=1";
@@ -168,10 +192,16 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	}
 
 	@Override
-	public List<BasicUserDto> getDontServeStudents(Integer teacherId, String search, String musicGroupId,Long classGroupId,Integer subjectId,Integer hasMember) {
+	public List<BasicUserDto> getDontServeStudents(Integer teacherId,
+												   String search,
+												   String musicGroupId,
+												   Long classGroupId,
+												   Integer subjectId,
+												   Integer hasMember,
+												   String studentIds) {
 		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
 		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember);
+		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember,studentIds);
 	}
 
 	@Override
@@ -187,4 +217,37 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 					userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
 		}
 	}
+
+	@Override
+	public PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo) {
+		PageInfo<TeacherHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+		int count = extracurricularExercisesDao.countExtraExercilsesHomeworks(params);
+		List<TeacherHomeworkListDto> dataList = new ArrayList<>();
+		if(count > 0){
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			List<ExtracurricularExercisesHomeworkListDto> homeworksExercises = extracurricularExercisesDao.findExtraExercilsesHomeworks(params);
+			if(homeworksExercises == null || homeworksExercises.size() == 0){
+				return pageInfo;
+			}
+			//课外训练
+			List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
+			if(exercises.size() > 0){
+				List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+				dataList.addAll(extracurricularExercisesDao.findByIdList(exercisesIdList));
+			}
+			//课后作业
+			List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
+			if(homeworkList.size() > 0){
+				List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+				dataList.addAll(courseHomeworkDao.findByIdList(homeworkIdList));
+			}
+			dataList.removeAll(Collections.singleton(null));
+			dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).collect(Collectors.toList());
+			pageInfo.setRows(dataList);
+		}
+		return pageInfo;
+	}
 }

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -290,7 +290,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 		Integer userId = studentPaymentOrder.getUserId();
 
-		Student student = studentService.get(userId);
+		Student student = studentService.getLocked(userId);
 		if (student == null) {
 			throw new BizException("学员信息不存在");
 		}
@@ -371,7 +371,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 			studentService.updateMemberRank(cloudTeacherOrder, periodEnum);
 			//云教练活动赠送优惠券
 			cloudTeacherActiveGiveCoupon(cloudTeacherOrder);
-			// 插入交易明细
+//			// 插入交易明细
 			BigDecimal amount = studentPaymentOrder.getActualAmount();
 			if (amount.compareTo(BigDecimal.ZERO) > 0) {
 				SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
@@ -405,7 +405,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 				rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
 				sysUserCashAccountDetailService.insert(paymentDetail);
 			}
-
+//
 			try {
 				contractService.transferProduceContract(userId, null, CourseViewTypeEnum.MEMBER_FEE);
 			} catch (Exception e) {

+ 235 - 72
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -109,6 +109,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupQuit;
 import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.MusicGroupReturnFeeDto;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
 import com.ym.mec.biz.dal.entity.MusicMemberDto;
@@ -186,6 +187,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.util.json.JsonUtil;
 
 @Service
 public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> implements MusicGroupService {
@@ -799,10 +801,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         BigDecimal courseFee = musicOneSubjectClassPlan.getFee() == null ? BigDecimal.ZERO : musicOneSubjectClassPlan.getFee();
         orderAmount = orderAmount.add(courseFee);
 
-        BigDecimal remitFee = BigDecimal.ZERO;
+        BigDecimal remitFee = BigDecimal.ZERO; //乐器减免金额
         BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
         boolean remitCourseRFeeFlag = false; //减免课程费用标识
 
+        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+        if(musicGroup == null){
+        	throw new BizException("查询乐团信息失败");
+        }
+
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
         if (registerPayDto.getGoodsGroups() != null && registerPayDto.getGoodsGroups().size() > 0) {
@@ -826,8 +833,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                 remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
             }
-            orderAmount = orderAmount.add(goodsGroup.getPrice());
             goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
+            
+            if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)){
+            	if((registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) && musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            		goodsGroup.setPrice(BigDecimal.ZERO);
+            		continue;
+            	}
+            }
+            orderAmount = orderAmount.add(goodsGroup.getPrice());
         }
         orderAmount = orderAmount.subtract(remitFee);
 
@@ -848,8 +862,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             BigDecimal maintenancePrice = new BigDecimal(sysConfigDao.findConfigValue("maintenance_price"));
             orderAmount = orderAmount.add(maintenancePrice);
         }
-
-        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
         
         studentRegistration.setMusicGroupPaymentCalenderId(musicGroupRegCalender.getId());
         studentRegistration.setOrganId(musicGroup.getOrganId());
@@ -1010,7 +1022,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Integer userId = studentRegistration.getUserId();
 
-        StudentPaymentOrder applyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        
+        StudentPaymentOrder applyOrder = null;
+        
+        if(applyOrderList != null && applyOrderList.size() > 0){
+        	applyOrder = applyOrderList.get(0);
+        }
+        
         if (applyOrder == null) {
             throw new BizException("没有支付中订单,请在我的订单中查看订单状态");
         }
@@ -1047,6 +1066,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
         boolean remitCourseRFeeFlag = false; //减免课程费用标识
 
+        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+        if(musicGroup == null){
+        	throw new BizException("查询乐团信息失败");
+        }
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -1071,8 +1094,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                 remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
             }
-            orderAmount = orderAmount.add(goodsGroup.getPrice());
             goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
+            
+            if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)){
+            	if((registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) && musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            		goodsGroup.setPrice(BigDecimal.ZERO);
+            		continue;
+            	}
+            }
+            orderAmount = orderAmount.add(goodsGroup.getPrice());
         }
 
         //新课程形态
@@ -1093,8 +1123,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             orderAmount = orderAmount.add(maintenancePrice);
         }
 
-        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
-        
         studentRegistration.setMusicGroupPaymentCalenderId(musicGroupRegCalender.getId());
         studentRegistration.setOrganId(musicGroup.getOrganId());
         studentRegistration.setPayingStatus(1);
@@ -1900,11 +1928,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean applyQuitMusicGroup(String musicGroupId, String reason) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+    public boolean applyQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit, Integer operatorId) {
+    	
+    	Integer userId = reqMusicGroupQuit.getUserId();
+    	String musicGroupId = reqMusicGroupQuit.getMusicGroupId();
+    	String reason = reqMusicGroupQuit.getReason();
+    	
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -1913,7 +1942,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
             throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
         }
-        Integer userId = sysUser.getId();
 
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {
@@ -1931,27 +1959,84 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setCreateTime(new Date());
         musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
         musicGroupQuit.setMusicGroupId(musicGroupId);
-        musicGroupQuit.setUserId(sysUser.getId());
-        musicGroupQuit.setUserComment(reason);
+        musicGroupQuit.setUserId(userId);
+        musicGroupQuit.setUserComment(reqMusicGroupQuit.getUserComment());
+        musicGroupQuit.setApplyUserId(userId);
+        musicGroupQuit.setReason(reason);
+        
+        MusicGroupReturnFeeDto returnFeeDto = reqMusicGroupQuit.getReturnFeeDto();
+        if(returnFeeDto != null) {
+        	musicGroupQuit.setFeeJson(JsonUtil.toJSONString(returnFeeDto));
+        	musicGroupQuit.setReturnFeeDto(returnFeeDto);
+        }
+        musicGroupQuit.setIsVisit(reqMusicGroupQuit.getIsVisit());
+        musicGroupQuit.setVisitTime(reqMusicGroupQuit.getVisitTime());
         musicGroupQuit.setStatus(PROCESSING);
-
+    	musicGroupQuit.setCurrentApproveRole(SysUserRole.EDUCATIONAL_TEACHER + "");
+        
+        if(currentOperatorRoleIds != null){
+        	if (!currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+        		
+    			if(musicGroupQuit.getStatus() == ApprovalStatus.APPROVED){
+    				throw new BizException("只能分部经理操作退团");
+    			}
+            	musicGroupQuit.setCurrentApproveRole(SysUserRole.SECTION_MANAGER + "");
+    		}
+        	if (currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && !currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+        		
+        		throw new BizException("只能乐团主管操作退团申请");
+    		}
+        	
+        	BigDecimal returnTotalFee = BigDecimal.ZERO;
+        	
+        	if(returnFeeDto.getIsReturnAccessoriesFee()){
+        		returnTotalFee = returnTotalFee.add(returnFeeDto.getAccessoriesFee());
+        	}
+        	if(returnFeeDto.getIsReturnCourseFee()){
+        		returnTotalFee = returnTotalFee.add(returnFeeDto.getCourseFee());
+        	}
+        	if(returnFeeDto.getIsReturnMaintenanceFee()){
+        		returnTotalFee = returnTotalFee.add(returnFeeDto.getMaintenanceFee());
+        	}
+        	if(returnFeeDto.getIsReturnMemberFee()){
+        		returnTotalFee = returnTotalFee.add(returnFeeDto.getMemberFee());
+        	}
+        	if(returnFeeDto.getIsReturnMusicalFee()){
+        		returnTotalFee = returnTotalFee.add(returnFeeDto.getMusicalFee());
+        	}
+        	
+        	musicGroupQuit.setReturnTotalFee(returnTotalFee);
+        }
+        
         musicGroupQuitDao.insert(musicGroupQuit);
-        Set<Integer> roleIds = new HashSet<>(1);
-        roleIds.add(SysUserRole.SECTION_MANAGER);
-        Set<Integer> integers = musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId());
-        integers.add(musicGroup.getEducationalTeacherId());
-        Map<String, Object> memo = new HashMap<>(2);
-        memo.put("Id", musicGroupQuit.getId());
-        memo.put("type", "MUSICGROUP");
+        
+		if (reqMusicGroupQuit.getStatus() == PROCESSING) {
+			Set<Integer> roleIds = new HashSet<>(1);
+			roleIds.add(SysUserRole.SECTION_MANAGER);
+			Set<Integer> integers = musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId());
+			
+			if(currentOperatorRoleIds == null || currentOperatorRoleIds.size() == 0){
+				integers.add(musicGroup.getEducationalTeacherId());
+			}
+			
+			Map<String, Object> memo = new HashMap<>(2);
+			memo.put("Id", musicGroupQuit.getId());
+			memo.put("type", "MUSICGROUP");
 
-        sysMessageService.batchSeoMessage(integers,
-                MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
-        Map<Integer, String> receivers = new HashMap<>(integers.size());
-        for (Integer integer : integers) {
-            receivers.put(integer, integer.toString());
-        }
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
-                receivers, null, 0, null, "SYSTEM", musicGroup.getName(), sysUser.getUsername());
+			SysUser sysUser = sysUserFeignService.queryUserById(userId);
+
+			sysMessageService.batchSeoMessage(integers, MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo),
+					sysUser.getUsername());
+			Map<Integer, String> receivers = new HashMap<>(integers.size());
+			for (Integer integer : integers) {
+				receivers.put(integer, integer.toString());
+			}
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY, receivers, null, 0, null,
+					"SYSTEM", musicGroup.getName(), sysUser.getUsername());
+		} else {
+			musicGroupQuit.setStatus(reqMusicGroupQuit.getStatus());
+			approveQuitMusicGroup(currentOperatorRoleIds, musicGroupQuit);
+		}
         return true;
     }
 
@@ -1986,14 +2071,37 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
-                                         boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee, BigDecimal cloudTeacherAmount) {
-
+    public boolean approveQuitMusicGroup(List<Integer> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit) {
+    	
+    	Long id = reqMusicGroupQuit.getId();
+    	ApprovalStatus status = reqMusicGroupQuit.getStatus();
+    	String reason = reqMusicGroupQuit.getReason();
+    	Date visitDate = reqMusicGroupQuit.getVisitTime();
+    	MusicGroupReturnFeeDto returnFeeDto = reqMusicGroupQuit.getReturnFeeDto();
+    	
         MusicGroupQuit musicGroupQuit = musicGroupQuitDao.get(id);
         if (musicGroupQuit == null) {
             throw new BizException("数据不存在");
         }
+    	
         Date date = new Date();
+    	
+    	if (!currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+    		
+    		if(!StringUtils.equals(musicGroupQuit.getCurrentApproveRole(), SysUserRole.EDUCATIONAL_TEACHER + "")){
+    			throw new BizException("只有分部经理才能审核");
+    		}
+    		
+			if(status == ApprovalStatus.APPROVED){
+				throw new BizException("只能分部经理操作退团");
+			}
+		}
+    	
+    	if(currentOperatorRoleIds.contains(SysUserRole.SECTION_MANAGER) && !currentOperatorRoleIds.contains(SysUserRole.EDUCATIONAL_TEACHER)){
+    		if(!StringUtils.equals(musicGroupQuit.getCurrentApproveRole(), SysUserRole.SECTION_MANAGER + "")){
+    			throw new BizException("先需乐团主管审核");
+    		}
+    	}
 
         String musicGroupId = musicGroupQuit.getMusicGroupId();
         Integer userId = musicGroupQuit.getUserId();
@@ -2029,10 +2137,45 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setStatus(status);
         musicGroupQuit.setReason(reason);
         musicGroupQuit.setQuitDate(date);
+        musicGroupQuit.setFeeJson(JsonUtil.toJSONString(returnFeeDto));
+		if (visitDate != null) {
+			musicGroupQuit.setVisitTime(visitDate);
+			musicGroupQuit.setIsVisit(true);
+		} else {
+			musicGroupQuit.setIsVisit(false);
+		}
+		
+		if(StringUtils.isBlank(musicGroupQuit.getUserComment())){
+			musicGroupQuit.setUserComment(reqMusicGroupQuit.getUserComment());
+		}
+    	
+    	BigDecimal returnTotalFee = BigDecimal.ZERO;
+    	
+    	if(returnFeeDto.getIsReturnAccessoriesFee()){
+    		returnTotalFee = returnTotalFee.add(returnFeeDto.getAccessoriesFee());
+    	}
+    	if(returnFeeDto.getIsReturnCourseFee()){
+    		returnTotalFee = returnTotalFee.add(returnFeeDto.getCourseFee());
+    	}
+    	if(returnFeeDto.getIsReturnMaintenanceFee()){
+    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMaintenanceFee());
+    	}
+    	if(returnFeeDto.getIsReturnMemberFee()){
+    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMemberFee());
+    	}
+    	if(returnFeeDto.getIsReturnMusicalFee()){
+    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMusicalFee());
+    	}
+    	
+    	musicGroupQuit.setReturnTotalFee(returnTotalFee);
+
+        if(status != ApprovalStatus.PROCESSING){
+        	courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), Arrays.asList(userId), GroupType.MUSIC);
+        }else {
+        	musicGroupQuit.setCurrentApproveRole(SysUserRole.SECTION_MANAGER + "");
+        }
         musicGroupQuitDao.update(musicGroupQuit);
 
-        courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), Arrays.asList(userId), GroupType.MUSIC);
-
         if (status == ApprovalStatus.APPROVED) {
 
             List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
@@ -2102,10 +2245,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             
             if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
     			if(currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.NORMAL || (currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.APPLY && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES)){
-    				StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
-    				if (studentPaymentOrder != null) {
-    					studentPaymentOrderList.add(studentPaymentOrder);
-    				}
+    				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
     			}
     			
     		} else {
@@ -2142,14 +2282,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
 
             }
-            if (isRefundMemberFee){
+            if (returnFeeDto.getIsReturnMemberFee()){
                 if(musicGroup.getCourseViewType() != CourseViewTypeEnum.MEMBER_FEE){
                     throw new BizException("非会员乐团不允许退云教练");
                 }
                 //删除乐团会员时长
                 studentRegistrationDao.cleanMusicMember(userId,null);
                 //退云教练费用
-                if (cloudTeacherAmount != null) {
+                if (returnFeeDto.getMemberFee() != null) {
                     Date nowDate = new Date();
                     List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrder(userId);
                     BigDecimal orderAmount = BigDecimal.ZERO;
@@ -2162,12 +2302,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                                 orderAmount = orderAmount.add(cloudTeacherOrder.getAmount());
                             }
                         }
-                        cloudTeacherOrderService.quitCloudTeacherOrders(quitCloudTeacherOrders, cloudTeacherAmount);
+                        cloudTeacherOrderService.quitCloudTeacherOrders(quitCloudTeacherOrders, returnFeeDto.getMemberFee());
                     }
-                    if (cloudTeacherAmount.compareTo(orderAmount) > 0) {
+                    if (returnFeeDto.getMemberFee().compareTo(orderAmount) > 0) {
                         throw new BizException("云教练退费金额不能大于原始订单金额");
                     }
-                    amount = amount.add(cloudTeacherAmount);
+                    amount = amount.add(returnFeeDto.getMemberFee());
                     //清除学员云教练
                     studentService.cleanMember(userId);
                     //如果有试用会员,不清除
@@ -2184,7 +2324,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentRegistrationDao.cleanMusicMember(userId,musicGroupId);
             }
 
-            if (isRefundCourseFee) {
+            if (returnFeeDto.getIsReturnCourseFee()) {
                 // 退课程费用
                 amount = amount.add(surplusCourseFee);
             }
@@ -2198,12 +2338,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
 
                 SubjectChange studentLastChange = null;
-                if (isRefundInstrumentFee || isRefundTeachingAssistantsFee) {
+                if (returnFeeDto.getIsReturnMusicalFee() || returnFeeDto.getIsReturnAccessoriesFee()) {
                     studentLastChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
                 }
                 
     			if (studentLastChange != null && minPaymentOrderId <= studentLastChange.getOriginalOrderId()) {
-    				if (isRefundInstrumentFee) {
+    				if (returnFeeDto.getIsReturnMusicalFee()) {
     					amount = amount.add(studentLastChange.getChangeMusicalPrice());
     					
     					StudentInstrument studentMaintenance = studentInstrumentDao.getByOrderId(studentLastChange.getOrderId().longValue());
@@ -2213,14 +2353,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		            }
     				}
 
-    				if (isRefundTeachingAssistantsFee) {
+    				if (returnFeeDto.getIsReturnAccessoriesFee()) {
     					amount = amount.add(studentLastChange.getChangeAccessoriesPrice());
     				}
     			} else {
     				for (StudentPaymentOrderDetail detail : orderDetailList) {
 
     					// 退乐器费用
-    					if (isRefundInstrumentFee && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
+    					if (returnFeeDto.getIsReturnMusicalFee() && detail.getType() == OrderDetailTypeEnum.MUSICAL) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     						
     						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
@@ -2231,29 +2371,52 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     					}
 
     					// 退教辅费用
-    					if (isRefundTeachingAssistantsFee
+    					if (returnFeeDto.getIsReturnAccessoriesFee()
     							&& (detail.getType() == OrderDetailTypeEnum.ACCESSORIES || detail.getType() == OrderDetailTypeEnum.TEACHING)) {
     						amount = amount.add(detail.getPrice()).subtract(detail.getRemitFee());
     					}
     				}
     			}
-            }
 
-            //退乐保费用
-            if (maintenanceFee != null) {
-                StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
-                if (maintenanceFee.compareTo(BigDecimal.ZERO) > 0) {
-                    if (studentMaintenance == null) {
-                        throw new BizException("学生没有有效期内的乐保,不能退乐保费用");
-                    }
-                }
-                amount = amount.add(maintenanceFee);
-                if (maintenanceFee.compareTo(BigDecimal.ZERO) > 0 && studentMaintenance != null) {
-                    studentMaintenance.setStatus(0);
-                    studentMaintenance.setStartTime(null);
-                    studentMaintenance.setEndTime(null);
-                    studentInstrumentDao.update(studentMaintenance);
-                }
+                //退乐保费用
+				if (returnFeeDto.getIsReturnMaintenanceFee()) {
+
+					Map<Long, StudentPaymentOrderDetail> maintenanceMap = orderDetailList.stream()
+							.filter(t -> (t.getType() == OrderDetailTypeEnum.MAINTENANCE))
+							.collect(Collectors.toMap(t -> t.getStudentInstrumentId(), StudentPaymentOrderDetail -> StudentPaymentOrderDetail));
+
+					List<Long> instrumentIdList = new ArrayList<Long>(maintenanceMap.keySet());
+					List<StudentInstrument> updateStudentInstrumentList = new ArrayList<StudentInstrument>();
+
+					if (instrumentIdList != null && instrumentIdList.size() > 0) {
+						List<StudentInstrument> studentInstrumentList = studentInstrumentDao.queryById(instrumentIdList);
+
+						for (StudentInstrument si : studentInstrumentList) {
+							if (si.getDelFlag() == 1) {
+								continue;
+							}
+
+							if ((si.getStatus() == 0 && si.getStartTime() == null) || si.getEndTime().after(date)) {
+								updateStudentInstrumentList.add(si);
+							}
+						}
+					}
+
+					/*if (updateStudentInstrumentList.size() == 0) {
+						throw new BizException("学生没有有效期内的乐保,不能退乐保费用");
+					}*/
+					
+					amount = amount.add(returnFeeDto.getMaintenanceFee());
+					
+					if (updateStudentInstrumentList.size() > 0) {
+						for (StudentInstrument studentMaintenance : updateStudentInstrumentList) {
+							studentMaintenance.setStatus(0);
+							studentMaintenance.setStartTime(null);
+							studentMaintenance.setEndTime(null);
+							studentInstrumentDao.update(studentMaintenance);
+						}
+					}
+				}
             }
 
             if (amount.doubleValue() > 0) {
@@ -2405,10 +2568,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         
 		if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
 			if(currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.NORMAL || (currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.APPLY && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES)){
-				StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
-				if (studentPaymentOrder != null) {
-					studentPaymentOrderList.add(studentPaymentOrder);
-				}
+				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
 			}
 			
 		} else {
@@ -3376,6 +3536,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     public MusicGroup getMusicGroupDetail(String musicGroupId) {
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if(musicGroup == null){
+            throw new BizException("乐团信息不存在");
+        }
         musicGroup.setEducationalTeacherName(teacherDao.queryNameById(musicGroup.getEducationalTeacherId()));
         musicGroup.setTeamTeacherName(teacherDao.queryNameById(musicGroup.getTeamTeacherId()));
         musicGroup.setDirectorUserName(teacherDao.queryNameById(musicGroup.getDirectorUserId()));

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

@@ -2059,16 +2059,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             student.setOperatingTag(1);
             studentDao.insert(student);
         } else {
-            if (Objects.isNull(student.getSubjectIdList())) {
-                student.setSubjectIdList(practiceGroup.getSubjectId().toString());
-            } else {
-                String[] studentIdStrings = student.getSubjectIdList().split(",");
-                List<String> studentIds = new ArrayList<>(Arrays.asList(studentIdStrings));
-                if (!studentIds.contains(practiceGroup.getSubjectId().toString())) {
-                    studentIds.add(practiceGroup.getSubjectId().toString());
-                }
-                student.setSubjectIdList(StringUtils.join(studentIds.toArray(), ","));
-            }
+            student.setSubjectIdList(practiceGroup.getSubjectId().toString());
             studentDao.update(student);
         }
 

+ 18 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -11,10 +11,7 @@ import com.ym.mec.biz.dal.config.SoundCompareConfig;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
-import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
-import com.ym.mec.biz.dal.enums.HeardLevelEnum;
-import com.ym.mec.biz.dal.enums.MusicalErrorTypeEnum;
-import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.handler.WebSocketHandler;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
@@ -35,6 +32,7 @@ import org.springframework.web.socket.WebSocketSession;
 
 import javax.sound.sampled.UnsupportedAudioFileException;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.math.BigDecimal;
@@ -120,6 +118,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 if(bodyObject.containsKey("heardLevel")){
                     userSoundInfoMap.get(phone).setHeardLevel(HeardLevelEnum.valueOf(bodyObject.getString("heardLevel")));
                 }
+                if(bodyObject.containsKey("speed")){
+                    userSoundInfoMap.get(phone).setSpeed(bodyObject.getIntValue("speed"));
+                }
                 List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(userSoundInfoMap.get(phone).getMusicScoreId(), null);
                 if(!CollectionUtils.isEmpty(subjectIds)){
                     userSoundInfoMap.get(phone).setSubjectId(subjectIds.get(0));
@@ -135,7 +136,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                     musicPitchDetailDto.setDontEvaluating(dc == userMeasureXmlInfoEntry.getValue().size());
                     userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto);
                 }
-                SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord();
+                SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord(FeatureType.CLOUD_STUDY_EVALUATION);
                 sysMusicCompareRecordService.insert(sysMusicCompareRecord);
                 LOGGER.info("评测记录编号:{}", sysMusicCompareRecord.getId());
                 userSoundInfoMap.get(phone).setRecordId(sysMusicCompareRecord.getId());
@@ -185,12 +186,18 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 //                }
                 break;
             case VIDEO_UPDATE:
-                if(bodyObject.containsKey("filePath")){
-                    SysMusicCompareRecord update = new SysMusicCompareRecord();
-                    update.setId(userSoundInfoMap.get(phone).getRecordId());
+                SysMusicCompareRecord update = null;
+                if(bodyObject.containsKey("recordId")){
+                    update = sysMusicCompareRecordService.get(bodyObject.getLong("recordId"));
+                }
+                if(Objects.nonNull(update)&&bodyObject.containsKey("filePath")){
                     update.setVideoFilePath(bodyObject.getString("filePath"));
                     sysMusicCompareRecordService.update(update);
+                }else{
+                    update.setVideoFilePath(update.getRecordFilePath());
+                    sysMusicCompareRecordService.update(update);
                 }
+                WebSocketHandler.sendTextMessage(phone, message);
                 break;
             default:
                 break;
@@ -340,13 +347,6 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
             int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
-//            MusicPitchDetailDto min = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).stream().min(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
-//            MusicPitchDetailDto max = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
-//
-//            int recordNoteSize = (int) userSoundInfoMap.get(phone).getRecordMeasurePitchInfos().stream().filter(e -> e.getTimeStamp() >= min.getTimeStamp() && e.getTimeStamp() < (max.getTimeStamp() + max.getDuration())).count();
-//
-//            boolean cd = recordNoteSize<=totalCompareNum;
-
             for (int i = 0; i < userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size(); i++) {
                 MusicPitchDetailDto musicXmlInfo = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).get(i);
 
@@ -506,7 +506,9 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         WebSocketInfo webSocketInfo = new WebSocketInfo();
         webSocketInfo.setHeader(new WebSocketInfo.Head(command));
         Map<String, Object> result = new HashMap<>(5);
+        //打击乐只看节奏分
         BigDecimal score = cadence;
+        //非打击乐总分为平均分
         if(Objects.isNull(userSoundInfoMap.get(phone).getSubjectId())||userSoundInfoMap.get(phone).getSubjectId()!=23){
             score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
         }
@@ -520,7 +522,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
         userSoundInfoMap.get(phone).getUserMeasureScoreMap().put(measureIndex, result);
 
-        LOGGER.info("小节评分:{}", JSON.toJSONString(webSocketInfo));
+        LOGGER.info("{}小节评分:{}", phone, JSON.toJSONString(webSocketInfo));
 
         //推送结果
         WebSocketHandler.sendTextMessage(phone, webSocketInfo);

+ 49 - 43
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -128,29 +128,29 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
         courseHomeworkService.update(courseHomework);
 
-        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-        LocalDate createDateTime = LocalDateTime.ofInstant(courseSchedule.getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
-        LocalDate createMonday = createDateTime.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-        LocalDate homeworkCreateDateTime = LocalDateTime.ofInstant(existHomework.getCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
-        boolean isOk = false;
-        switch (createDateTime.getDayOfWeek()) {
-            case SATURDAY:
-                if (createDateTime.until(homeworkCreateDateTime, ChronoUnit.DAYS) < 4) {
-                    isOk = true;
-                }
-                break;
-            case SUNDAY:
-                if (createDateTime.until(homeworkCreateDateTime, ChronoUnit.DAYS) < 3) {
-                    isOk = true;
-                }
-                break;
-            default:
-                if (createDateTime.get(DateUtil.weekFields.weekOfYear()) == homeworkCreateDateTime.get(DateUtil.weekFields.weekOfYear())) {
-                    isOk = true;
-                }
-                break;
-        }
+//        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+//        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+//        LocalDate createDateTime = LocalDateTime.ofInstant(courseSchedule.getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
+//        LocalDate createMonday = createDateTime.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+//        LocalDate homeworkCreateDateTime = LocalDateTime.ofInstant(existHomework.getCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
+//        boolean isOk = false;
+//        switch (createDateTime.getDayOfWeek()) {
+//            case SATURDAY:
+//                if (createDateTime.until(homeworkCreateDateTime, ChronoUnit.DAYS) < 4) {
+//                    isOk = true;
+//                }
+//                break;
+//            case SUNDAY:
+//                if (createDateTime.until(homeworkCreateDateTime, ChronoUnit.DAYS) < 3) {
+//                    isOk = true;
+//                }
+//                break;
+//            default:
+//                if (createDateTime.get(DateUtil.weekFields.weekOfYear()) == homeworkCreateDateTime.get(DateUtil.weekFields.weekOfYear())) {
+//                    isOk = true;
+//                }
+//                break;
+//        }
 
         studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(bean.getUserId())), courseSchedule.getTeacherId());
 
@@ -200,19 +200,17 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             throw new BizException("作业不存在");
         }
         CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkDao.findCourseHomeworkStudentDetail(courseScheduleID, userId);
-        if (Objects.nonNull(courseHomeworkStudentDetail)) {
-            SysUser student = teacherDao.getUser(userId.intValue());
-            courseHomeworkStudentDetail.setStudentId(userId.intValue());
-            courseHomeworkStudentDetail.setStudentName(student.getUsername());
-            CourseSchedule courseSchedule = courseScheduleDao.get(courseHomeworkStudentDetail.getCourseScheduleId());
-            if (Objects.nonNull(courseSchedule)) {
-                SysUser teacher = teacherDao.getUser(courseSchedule.getActualTeacherId());
-                courseHomeworkStudentDetail.setTeacherId(courseSchedule.getActualTeacherId());
-                courseHomeworkStudentDetail.setTeacherName(teacher.getRealName());
-            }
-            if(courseHomeworkStudentDetail.getMusicScoreId() != null){
-                courseHomeworkStudentDetail.setSysMusicScore(sysMusicScoreDao.get(courseHomeworkStudentDetail.getMusicScoreId()));
-            }
+        if(courseHomeworkStudentDetail == null){
+            throw new BizException("作业不存在");
+        }
+        SysUser sysUser = teacherDao.getUser(userId.intValue());
+        courseHomeworkStudentDetail.setStudentId(userId.intValue());
+        courseHomeworkStudentDetail.setStudentName(sysUser.getUsername());
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseHomeworkStudentDetail.getCourseScheduleId());
+        if (Objects.nonNull(courseSchedule)) {
+            SysUser teacher = teacherDao.getUser(courseSchedule.getActualTeacherId());
+            courseHomeworkStudentDetail.setTeacherId(courseSchedule.getActualTeacherId());
+            courseHomeworkStudentDetail.setTeacherName(teacher.getRealName());
         }
         courseHomeworkStudentDetail.setType("HOMEWORK");
         String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
@@ -220,14 +218,22 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             configValue = "0";
         }
         courseHomeworkStudentDetail.setHomeworkOpenFlag(Integer.parseInt(configValue));
-        if(configValue.equals("0")){
-            courseHomeworkStudentDetail.setMusicScoreId(null);
-            courseHomeworkStudentDetail.setMusicScoreName(null);
-            courseHomeworkStudentDetail.setHasMember(0);
-        }else {
-            Student student = studentDao.get(userId.intValue());
-            courseHomeworkStudentDetail.setHasMember(student.getMemberRankSettingId()==null?0:1);
+//        if(configValue.equals("0")){
+//            courseHomeworkStudentDetail.setMusicScoreId(null);
+//            courseHomeworkStudentDetail.setMusicScoreName(null);
+//            courseHomeworkStudentDetail.setHasMember(0);
+//        }else {
+        if(StringUtils.isNotEmpty(courseHomeworkStudentDetail.getMusicScoreId())){
+            List<SysMusicScore> sysMusicScoreList = sysMusicScoreDao.findByIds(courseHomeworkStudentDetail.getMusicScoreId());
+            courseHomeworkStudentDetail.setSysMusicScoreList(sysMusicScoreList);
+            SysMusicScore sysMusicScore = sysMusicScoreList.get(0);
+            courseHomeworkStudentDetail.setSysMusicScore(sysMusicScore);
+            courseHomeworkStudentDetail.setMusicScoreId(sysMusicScore.getId().toString());
+            courseHomeworkStudentDetail.setMusicScoreName(sysMusicScore.getName());
         }
+        Student student = studentDao.get(userId.intValue());
+        courseHomeworkStudentDetail.setHasMember(student.getMemberRankSettingId()==null?0:1);
+//        }
         return courseHomeworkStudentDetail;
     }
 

+ 85 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
+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.*;
@@ -61,6 +63,12 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 	private CourseHomeworkDao courseHomeworkDao;
 	@Autowired
 	private ClassGroupDao classGroupDao;
+	@Autowired
+	private StudentAttendanceDao studentAttendanceDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@Override
 	public BaseDAO<Long, StudentExtracurricularExercisesSituation> getDAO() {
@@ -311,7 +319,10 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 
 	@Override
 	public PageInfo<TeacherServeHomeworkDto> queryTeacherServeHomeworkDetail(TeacherServeHomeworkQueryInfo queryInfo) {
-		if(Objects.isNull(queryInfo.getMonday())||Objects.isNull(queryInfo.getSunday())||Objects.isNull(queryInfo.getTeacherId())){
+		if(Objects.isNull(queryInfo.getMonday())||Objects.isNull(queryInfo.getSunday())){
+			throw new BizException("请指定课程时间");
+		}
+		if(Objects.isNull(queryInfo.getTeacherId())){
 			throw new BizException("请指定教师");
 		}
 		PageInfo<TeacherServeHomeworkDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -343,6 +354,11 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 		MapUtil.populateMap(params, queryInfo);
 		params.put("courseIds", courseIds);
 
+		List<CourseHomework> courseHomeworks = courseHomeworkDao.findByCourseSchedules(new ArrayList<>(courseIds));
+		Map<Long, Long> courseHomeworkMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(courseHomeworks)){
+			courseHomeworkMap = courseHomeworks.stream().collect(Collectors.groupingBy(CourseHomework::getCourseScheduleId, Collectors.counting()));
+		}
 		List<TeacherServeHomeworkDto> dataList = new ArrayList<>();
 		int count = courseScheduleDao.countByCourseScheduleIds(params);
 		if (count > 0) {
@@ -355,12 +371,6 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 				List<ClassGroup> classGroups = classGroupDao.findByClassGroupIds(classGroupIds, null);
 				idClassGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, c -> c, (c1, c2) -> c1));
 			}
-
-			List<CourseHomework> courseHomeworks = courseHomeworkDao.findByCourseSchedules(new ArrayList<>(courseIds));
-			Map<Long, Long> courseHomeworkMap = new HashMap<>();
-			if(!CollectionUtils.isEmpty(courseHomeworks)){
-				courseHomeworkMap = courseHomeworks.stream().collect(Collectors.groupingBy(CourseHomework::getCourseScheduleId, Collectors.counting()));
-			}
 			List<Integer> subjectIds = new ArrayList<>();
 			for (CourseSchedule courseSchedule : courseSchedules) {
 				if(idClassGroupMap.containsKey(courseSchedule.getClassGroupId())&&StringUtils.isNotBlank(idClassGroupMap.get(courseSchedule.getClassGroupId()).getSubjectIdList())){
@@ -398,6 +408,60 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 	}
 
 	@Override
+	public PageInfo<TeacherServeHomeworkPojo> queryTeacherServeHomeworkDetail1(TeacherServeHomeworkQueryInfo queryInfo) {
+		if(Objects.isNull(queryInfo.getMonth())){
+			throw new BizException("请指定课程时间");
+		}
+		PageInfo<TeacherServeHomeworkPojo> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		//获取时间段内有服务指标的课程(课后作业)
+		Date firstDayOfMonth = DateUtil.getFirstDayOfMonth(queryInfo.getMonth());
+		Date lastDayOfMonth = DateUtil.getLastDayOfMonth(queryInfo.getMonth());
+		List<Long> 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("courseIds", courseIds);
+
+		List<CourseHomework> courseHomeworks = courseHomeworkDao.findByCourseSchedules(new ArrayList<>(courseIds));
+		if(!CollectionUtils.isEmpty(courseHomeworks)){
+			Set<Long> collect = courseHomeworks.stream().map(e -> e.getCourseScheduleId()).collect(Collectors.toSet());
+			courseIds.removeAll(collect);
+		}
+		if(courseIds.size() == 0){
+			return pageInfo;
+		}
+		Map<Long,Long> memberNumMap = MapUtil.convertIntegerMap(studentDao.countCourseStudentMemberNum(courseIds));
+		Map<Long,String> studentSubjectMap = MapUtil.convertMybatisMap(studentDao.countCourseStudentSubjectName(courseIds));
+		Map<Long, Long> studentNumMap = MapUtil.convertIntegerMap(courseScheduleStudentPaymentDao.countCourseStudentNum(courseIds));
+		Map<Integer, Long> studentNumCourseMap = MapUtil.convertIntegerMap(studentAttendanceDao.countStudentAttendancesByCourses(courseIds));
+
+		List<TeacherServeHomeworkPojo> homeworkPojos;
+		int count = courseScheduleDao.countHomeworkPojoByCourseScheduleIds(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			homeworkPojos = courseScheduleDao.queryHomeworkPojoByCourseScheduleIds(params);
+			pageInfo.setRows(homeworkPojos);
+			for (TeacherServeHomeworkPojo homeworkPojo : homeworkPojos) {
+				Long studentNum = studentNumCourseMap.get(homeworkPojo.getCourseScheduleId().intValue());
+				if (Objects.nonNull(studentNum)) {
+					homeworkPojo.setStudentAttendanceIsFirstTime(studentNum > 0 ? 0 : 1);
+				} else {
+					homeworkPojo.setStudentAttendanceIsFirstTime(1);
+				}
+				Long aLong = memberNumMap.get(homeworkPojo.getCourseScheduleId());
+				homeworkPojo.setMemberNum(aLong==null?0:aLong.intValue());
+				Long aLong1 = studentNumMap.get(homeworkPojo.getCourseScheduleId());
+				homeworkPojo.setStudentNum(aLong1==null?0:aLong1.intValue());
+				homeworkPojo.setSubjectName(studentSubjectMap.get(homeworkPojo.getCourseScheduleId()));
+			}
+		}
+		return pageInfo;
+	}
+
+	@Override
 	public PageInfo<TeacherServeExtraDto> queryTeacherServeExtraDetail(TeacherServeHomeworkQueryInfo queryInfo) {
 		if(Objects.isNull(queryInfo.getMonday())||Objects.isNull(queryInfo.getSunday())||Objects.isNull(queryInfo.getTeacherId())){
 			throw new BizException("请指定教师");
@@ -469,4 +533,17 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
-}
+
+	@Override
+	public int countWaitCreateHomeworkNum() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			throw new BizException("用户信息获取失败");
+		}
+		int exerciseNum = studentExtracurricularExercisesSituationDao.countWaitCreateHomeworkNum(sysUser.getId(), "EXERCISE");
+		if(exerciseNum > 0){
+			return exerciseNum;
+		}
+		return studentExtracurricularExercisesSituationDao.countWaitCreateHomeworkNum1(sysUser.getId());
+	}
+}

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

@@ -864,7 +864,12 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Override
     public List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId) {
-        return musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
+        List<StudentSubTotalCourseTimesDto> timesDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
+        Map<Integer,String> classMap = MapUtil.convertMybatisMap(classGroupDao.queryStudentClassGroupMap(musicGroupId));
+        for (StudentSubTotalCourseTimesDto timesDto : timesDtos) {
+            timesDto.setClassGroupId(classMap.get(timesDto.getUserId()));
+        }
+        return timesDtos;
     }
 
     @Override

+ 111 - 58
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -309,11 +309,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         	List<StudentPaymentOrder> studentPaymentOrderList = new ArrayList<StudentPaymentOrder>();
 
 			if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
-				StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
-				if (studentPaymentOrder != null) {
-					studentPaymentOrderList.add(studentPaymentOrder);
-				}
-
+				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
 			} else {
 				studentPaymentOrderList = studentPaymentOrderService.queryByBatchNo(userId, studentRegistration.getMusicGroupPaymentCalenderId() + "",
 						DealStatusEnum.SUCCESS);
@@ -321,19 +317,31 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
 
 			List<Long> paymentOrderIdList = studentPaymentOrderList.stream().map(t -> t.getId()).collect(Collectors.toList());
 			
-			Long minPaymentOrderId = Collections.min(paymentOrderIdList);
-
-			List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
+			subjectChange = subjectChangeMap.get(studentRegistration.getUserId());
+			
+			if((paymentOrderIdList == null || paymentOrderIdList.size() == 0) && subjectChange == null){
+				continue;
+			}
+			
+			List<StudentPaymentOrderDetail> orderDetailList = new ArrayList<StudentPaymentOrderDetail>();
+			
+			if(paymentOrderIdList != null && paymentOrderIdList.size() > 0) {
+				orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
+			}
 			
 			Map<OrderDetailTypeEnum,BigDecimal> userOrderTypeMap = new HashMap<OrderDetailTypeEnum, BigDecimal>();;
 			
 			BigDecimal amount = BigDecimal.ZERO;
 			KitGroupPurchaseTypeEnum kitGroupPurchaseType = null;
-			String goodsId = null ,accessoriesId = null ;
+			String musicalId = null;
+			StringBuffer accessoriesId = new StringBuffer();
 			BigDecimal orderTotalAmount = BigDecimal.ZERO;
-			BigDecimal withoutMusicalTotalAmount = BigDecimal.ZERO;
 			
-			for(StudentPaymentOrderDetail spod : orderDetailList){
+			boolean isCalculatedOfAccessories = false;
+			boolean isChangeMusical = false;
+			boolean isChangeAccessories = false;
+			
+			for(StudentPaymentOrderDetail spod : orderDetailList) {
 				
 				if (spod.getType() == OrderDetailTypeEnum.COURSE || spod.getType() == OrderDetailTypeEnum.HIGH_ONLINE_COURSE
 						|| spod.getType() == OrderDetailTypeEnum.SINGLE || spod.getType() == OrderDetailTypeEnum.VIP
@@ -343,14 +351,37 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
 						|| spod.getType() == OrderDetailTypeEnum.TRAINING_MIX || spod.getType() == OrderDetailTypeEnum.HIGH_ONLINE
 						|| spod.getType() == OrderDetailTypeEnum.MUSIC_NETWORK || spod.getType() == OrderDetailTypeEnum.CLASSROOM || spod.getType() == OrderDetailTypeEnum.THEORY_COURSE) {
 					spod.setType(OrderDetailTypeEnum.COURSE);
-					withoutMusicalTotalAmount = withoutMusicalTotalAmount.add(spod.getPrice().subtract(spod.getRemitFee()));
+					//courseAmount = courseAmount.add(spod.getPrice().subtract(spod.getRemitFee()));
 				}else if(spod.getType() == OrderDetailTypeEnum.MUSICAL){
-					kitGroupPurchaseType = spod.getKitGroupPurchaseType();
-					goodsId = spod.getGoodsIdList();
+					if(subjectChange != null && spod.getPaymentOrderId() <= subjectChange.getOriginalOrderId()) {
+						if(subjectChange.getChangeMusical() == null){
+							continue;
+						}
+						kitGroupPurchaseType = subjectChange.getKitGroupPurchaseType();
+						musicalId = subjectChange.getChangeMusical() + "";
+						spod.setPrice(subjectChange.getChangeMusicalPrice());
+						spod.setRemitFee(BigDecimal.ZERO);
+						isChangeMusical = true;
+		        	} else {
+						kitGroupPurchaseType = spod.getKitGroupPurchaseType();
+						musicalId = spod.getGoodsIdList();
+						//musicalAmount = musicalAmount.add(spod.getPrice());
+		        	}
 				}else if(spod.getType() == OrderDetailTypeEnum.ACCESSORIES){
-					accessoriesId = spod.getGoodsIdList();
-				}else{
-					withoutMusicalTotalAmount = withoutMusicalTotalAmount.add(spod.getPrice().subtract(spod.getRemitFee()));
+					if(subjectChange != null && (subjectChange.getOriginalOrderId() != null && spod.getPaymentOrderId() <= subjectChange.getOriginalOrderId())) {
+						if(StringUtils.isBlank(subjectChange.getChangeAccessories()) || isCalculatedOfAccessories == true){
+							continue;
+						}
+						isCalculatedOfAccessories = true;
+						accessoriesId = accessoriesId.append(subjectChange.getChangeAccessories()).append(",");
+						//accessoriesAmount = accessoriesAmount.add(subjectChange.getChangeAccessoriesPrice());
+						spod.setPrice(subjectChange.getChangeAccessoriesPrice());
+						spod.setRemitFee(BigDecimal.ZERO);
+						isChangeAccessories = true;
+		        	}else{
+						accessoriesId = accessoriesId.append(spod.getGoodsIdList()).append(",");
+						//accessoriesAmount = accessoriesAmount.add(spod.getPrice());
+		        	}
 				}
 				
 				amount = userOrderTypeMap.get(spod.getType());
@@ -363,49 +394,71 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
 				
 				orderTotalAmount = orderTotalAmount.add(spod.getPrice().subtract(spod.getRemitFee()));
 			}
+			
+			if(orderDetailList.size() == 0) {
+				if(subjectChange != null){
+					if(subjectChange.getChangeMusical() != null){
+						kitGroupPurchaseType = subjectChange.getKitGroupPurchaseType();
+						musicalId = subjectChange.getChangeMusical() + "";
+						userOrderTypeMap.put(OrderDetailTypeEnum.MUSICAL, subjectChange.getChangeMusicalPrice());
+						orderTotalAmount = orderTotalAmount.add(subjectChange.getChangeMusicalPrice());
+					}
+					if(StringUtils.isNotBlank(subjectChange.getChangeAccessories())) {
+						accessoriesId = accessoriesId.append(subjectChange.getChangeAccessories()).append(",");
+						userOrderTypeMap.put(OrderDetailTypeEnum.ACCESSORIES, subjectChange.getChangeAccessoriesPrice());
+						orderTotalAmount = orderTotalAmount.add(subjectChange.getChangeAccessoriesPrice());
+		        	}
+				}
+			}else if(isChangeAccessories == false || isChangeMusical == false){
+				if(subjectChange != null){
+					if(subjectChange.getChangeMusical() != null && isChangeMusical == false){
+						kitGroupPurchaseType = subjectChange.getKitGroupPurchaseType();
+						musicalId = subjectChange.getChangeMusical() + "";
+						userOrderTypeMap.put(OrderDetailTypeEnum.MUSICAL, subjectChange.getChangeMusicalPrice());
+						orderTotalAmount = orderTotalAmount.add(subjectChange.getChangeMusicalPrice());
+					}
+					if(StringUtils.isNotBlank(subjectChange.getChangeAccessories()) && isChangeAccessories == false) {
+						accessoriesId = accessoriesId.append(subjectChange.getChangeAccessories()).append(",");
+						userOrderTypeMap.put(OrderDetailTypeEnum.ACCESSORIES, subjectChange.getChangeAccessoriesPrice());
+						orderTotalAmount = orderTotalAmount.add(subjectChange.getChangeAccessoriesPrice());
+		        	}
+				}
+			}
         	
-        	subjectChange = subjectChangeMap.get(studentRegistration.getUserId());
-        	if(subjectChange != null && minPaymentOrderId <= subjectChange.getOriginalOrderId()){
-        		dto.setAccessoriesAmount(subjectChange.getChangeAccessoriesPrice());
-        		if(subjectChange.getChangeAccessoriesGoods() != null){
-        			dto.setAccessoriesName(subjectChange.getChangeAccessoriesGoods().stream().map(Goods::getName).collect(Collectors.joining(",")));
-        		}
-        		
-        		dto.setCourseAmount(userOrderTypeMap.get(OrderDetailTypeEnum.COURSE));
-        		//dto.setGoodsNames(goodsNames);
-        		dto.setKitGroupPurchaseTypeEnum(subjectChange.getKitGroupPurchaseType());
-        		dto.setMusicalAmount(subjectChange.getChangeMusicalPrice());
-        		if(subjectChange.getChangeMusicalGoods() != null){
-        			dto.setMusicalName(subjectChange.getChangeMusicalGoods().getName());
-        		}
-        		dto.setMusicGroupName(musicGroup.getName());
-        		dto.setOrganName(organization.getName());
-        		dto.setOrderAmount(withoutMusicalTotalAmount.add(subjectChange.getChangeMusicalPrice().add(subjectChange.getChangeAccessoriesPrice())));
-        		dto.setUserId(userId);
-        		dto.setSubjectName(userSubjectMap.get(userId));
-        		dto.setUsername(usernameMap.get(userId));
-        	}else{
-        		
-        		if(StringUtils.isNoneBlank(accessoriesId)){
-        			dto.setAccessoriesName(goodsService.findGoodsByIds(accessoriesId).stream().map(Goods::getName).collect(Collectors.joining(",")));
-        		}
-
-        		dto.setAccessoriesAmount(userOrderTypeMap.get(OrderDetailTypeEnum.ACCESSORIES));
-    			dto.setCourseAmount(userOrderTypeMap.get(OrderDetailTypeEnum.COURSE));
-        		dto.setMusicalAmount(userOrderTypeMap.get(OrderDetailTypeEnum.MUSICAL));
+        	dto.setAccessoriesAmount(userOrderTypeMap.get(OrderDetailTypeEnum.ACCESSORIES));
+			dto.setCourseAmount(userOrderTypeMap.get(OrderDetailTypeEnum.COURSE));
+    		dto.setMusicalAmount(userOrderTypeMap.get(OrderDetailTypeEnum.MUSICAL));
+    		dto.setMaintenanceAmount(userOrderTypeMap.get(OrderDetailTypeEnum.MAINTENANCE));
+			dto.setCloudTeacherAmount(userOrderTypeMap.get(OrderDetailTypeEnum.CLOUD_TEACHER) == null ? userOrderTypeMap
+					.get(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS) : userOrderTypeMap.get(OrderDetailTypeEnum.CLOUD_TEACHER));
+			
+			if (StringUtils.isNoneBlank(accessoriesId.toString())) {
+				String accessoriesIdList = StringUtils.removeEnd(accessoriesId.toString(), ",");
+				Map<Integer, Goods> goodsMap = goodsService.findGoodsByIds(accessoriesIdList).stream().collect(Collectors.toMap(Goods::getId, Goods -> Goods));
+
+				String[] accessoriesIds = StringUtils.split(accessoriesIdList, ',');
+
+				StringBuffer sb = new StringBuffer();
+				for (String s : accessoriesIds) {
+					if(StringUtils.isBlank(s)){
+						continue;
+					}
+					sb.append(goodsMap.get(Integer.parseInt(s)).getName()).append(",");
+				}
+				dto.setAccessoriesName(StringUtils.removeEnd(sb.toString(), ","));
+			}
+			
+    		if(StringUtils.isNoneBlank(musicalId)){
+    			dto.setMusicalName(goodsService.findGoodsByIds(musicalId).stream().map(Goods::getName).collect(Collectors.joining(",")));
+    		}
+    		dto.setKitGroupPurchaseTypeEnum(kitGroupPurchaseType);
+    		dto.setMusicGroupName(musicGroup.getName());
+    		dto.setOrganName(organization.getName());
+    		dto.setOrderAmount(orderTotalAmount);
+    		dto.setUserId(userId);
+    		dto.setSubjectName(userSubjectMap.get(userId));
+    		dto.setUsername(usernameMap.get(userId));
     		
-        		//dto.setGoodsNames(goodsNames);
-        		dto.setKitGroupPurchaseTypeEnum(kitGroupPurchaseType);
-        		if(StringUtils.isNoneBlank(goodsId)){
-        			dto.setMusicalName(goodsService.findGoodsByIds(goodsId).stream().map(Goods::getName).collect(Collectors.joining(",")));
-        		}
-        		dto.setMusicGroupName(musicGroup.getName());
-        		dto.setOrganName(organization.getName());
-        		dto.setOrderAmount(orderTotalAmount);
-        		dto.setUserId(userId);
-        		dto.setSubjectName(userSubjectMap.get(userId));
-        		dto.setUsername(usernameMap.get(userId));
-        	}
         	musicalListDetailDtos.add(dto);
         }
     	

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

@@ -190,7 +190,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public StudentPaymentOrder findMusicGroupApplyOrderByStatus(Integer userId, String musicGroupId, DealStatusEnum status) {
+    public List<StudentPaymentOrder> findMusicGroupApplyOrderByStatus(Integer userId, String musicGroupId, DealStatusEnum status) {
         return studentPaymentOrderDao.findMusicGroupApplyOrderByStatus(userId, musicGroupId, status);
     }
 
@@ -276,6 +276,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         if (payingOrders == null) {
             payingOrders = findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
         }
+        
+        Date date = new Date();
+        
         if (payingOrders.size() == 0) {
             return;
         }
@@ -290,6 +293,10 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 orderNoList.add(payingOrder.getOrderNo());
                 continue;
             }
+            //查询支付超过10分钟的
+            if(DateUtil.minutesBetween(payingOrder.getCreateTime(), date) < 10){
+            	continue;
+            }
             Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
             Map<String, String> rpMap = new HashMap<>();
             rpMap.put("merOrderNo", payingOrder.getOrderNo());

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

@@ -64,6 +64,7 @@ import com.ym.mec.biz.dal.dto.PageInfoReg;
 import com.ym.mec.biz.dal.dto.RegisterDto;
 import com.ym.mec.biz.dal.dto.StudentAddDto;
 import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
+import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
 import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
@@ -351,7 +352,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 			StudentPaymentOrderDetail spod = null;
 			while (iterator.hasNext()) {
 				spod = iterator.next();
-				if (spod.getType() == OrderDetailTypeEnum.ACCESSORIES || spod.getType() == OrderDetailTypeEnum.MUSICAL) {
+				if ((spod.getType() == OrderDetailTypeEnum.ACCESSORIES || spod.getType() == OrderDetailTypeEnum.MUSICAL) && (studentLastChange.getOriginalOrderId() != null && spod.getPaymentOrderId() <= studentLastChange.getOriginalOrderId())) {
 					iterator.remove();
 				}
 			}
@@ -363,7 +364,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 				if (goods != null && goods.size() > 0) {
 					detail.setName(goods.stream().map(t -> t.getName()).collect(Collectors.joining(",")));
 				}
-				detail.setPaymentOrderId((long) studentLastChange.getOriginalOrderId());
+				if(studentLastChange.getOriginalOrderId() != null){
+					detail.setPaymentOrderId((long) studentLastChange.getOriginalOrderId());
+				}
 				detail.setPrice(studentLastChange.getChangeAccessoriesPrice());
 				detail.setType(OrderDetailTypeEnum.ACCESSORIES);
 				detail.setCreateTime(studentLastChange.getCreateTime());
@@ -392,6 +395,102 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 	}
 
     @Override
+	public Map<String, BigDecimal> queryRefundsDetail(Integer studentId, String musicGroupId) {
+
+		List<StudentPaymentOrderDetail> detailList = queryFeeDetail(studentId, musicGroupId);
+
+		Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> detailMap = detailList.stream().collect(
+				Collectors.groupingBy(StudentPaymentOrderDetail::getType));
+
+		Map<String, BigDecimal> map = new HashMap<String, BigDecimal>();
+
+		if (detailMap.containsKey(OrderDetailTypeEnum.MUSICAL)) {
+			detailList = detailMap.get(OrderDetailTypeEnum.MUSICAL);
+			if (detailList == null) {
+				detailList = new ArrayList<StudentPaymentOrderDetail>();
+			}
+			map.put(OrderDetailTypeEnum.MUSICAL.getCode(), detailList.stream().map(StudentPaymentOrderDetail::getPrice)
+					.reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			map.put(OrderDetailTypeEnum.MUSICAL.getCode(), BigDecimal.ZERO);
+		}
+		
+		if (detailMap.containsKey(OrderDetailTypeEnum.MAINTENANCE)) {
+
+			BigDecimal totalAmount = BigDecimal.ZERO;
+
+			Date date = new Date();
+
+			// 查询当前乐团报名订单中购买了乐保的订单
+			List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailDao.findUserApplyOrder(studentId, musicGroupId,
+					DealStatusEnum.SUCCESS);
+
+			if (studentPaymentOrderDetailList != null && studentPaymentOrderDetailList.size() > 0) {
+				
+				Map<Long, StudentPaymentOrderDetail> maintenanceMap = studentPaymentOrderDetailList.stream()
+						.filter(t -> (t.getType() == OrderDetailTypeEnum.MAINTENANCE))
+						.collect(Collectors.toMap(t -> t.getStudentInstrumentId(), StudentPaymentOrderDetail -> StudentPaymentOrderDetail));
+				
+				List<Long> instrumentIdList = new ArrayList<Long>(maintenanceMap.keySet());
+				if (instrumentIdList != null && instrumentIdList.size() > 0) {
+					List<StudentInstrument> studentInstrumentList = studentInstrumentDao.queryById(instrumentIdList);
+
+					for (StudentInstrument si : studentInstrumentList) {
+						if (si.getDelFlag() == 1) {
+							continue;
+						}
+
+						if ((si.getStatus() == 0 && si.getStartTime() == null) || si.getEndTime().after(date)) {
+							totalAmount = totalAmount.add(maintenanceMap.get(si.getId()).getPrice());
+						}
+					}
+				}
+			}
+			map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), totalAmount);
+		} else {
+			map.put(OrderDetailTypeEnum.MAINTENANCE.getCode(), BigDecimal.ZERO);
+		}
+
+		if (detailMap.containsKey(OrderDetailTypeEnum.ACCESSORIES)) {
+			detailList = detailMap.get(OrderDetailTypeEnum.ACCESSORIES);
+			if (detailList == null) {
+				detailList = new ArrayList<StudentPaymentOrderDetail>();
+			}
+			map.put(OrderDetailTypeEnum.ACCESSORIES.getCode(),
+					detailList.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			map.put(OrderDetailTypeEnum.ACCESSORIES.getCode(), BigDecimal.ZERO);
+		}
+
+		StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(musicGroupId, studentId);
+		if (studentRegistration == null) {
+			throw new BizException("学生报名信息查询失败");
+		}
+		map.put(OrderDetailTypeEnum.COURSE.getCode(), studentRegistration.getSurplusCourseFee());
+
+		// 查询云教练订单
+		BigDecimal cloudAmount = BigDecimal.ZERO;
+		List<Integer> studentIds = new ArrayList<Integer>();
+		studentIds.add(studentId);
+		List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(studentIds, musicGroupId);
+		if (studentCloudTeacherOrders != null && studentCloudTeacherOrders.size() > 0) {
+			Date nowDate = new Date();
+			for (CloudTeacherOrder cloudTeacherOrder : studentCloudTeacherOrders) {
+				if (cloudTeacherOrder.getEndTime() == null
+						|| DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT),
+								DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+								DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
+					cloudAmount = cloudAmount.add(cloudTeacherOrder.getAmount());
+				}
+			}
+		}
+
+		map.put(OrderDetailTypeEnum.CLOUD_TEACHER.getCode(), cloudAmount);
+
+		return map;
+	}
+
+	@Override
     public List<Map<String, Object>> getNoClassStuBySubjectId(String musicGroupId, String actualSubjectId) {
         List<StudentRegistration> students = studentRegistrationDao.getNoClassStuBySubjectId(musicGroupId, actualSubjectId);
         List<Map<String, Object>> mapArrayList = new ArrayList<>();
@@ -776,19 +875,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             Student student = studentDao.get(userId);
             if (student == null) {
                 studentDao.insert(new Student(userId, studentRegistration.getSubjectId().toString()));
-            } else if (StringUtils.isEmpty(student.getSubjectIdList())) {
+            } else {
                 student.setSubjectIdList(studentRegistration.getSubjectId().toString());
                 student.setUpdateTime(date);
                 studentDao.update(student);
-            } else if (StringUtils.isNotEmpty(student.getSubjectIdList())) {
-                String[] split = student.getSubjectIdList().split(",");
-                List<String> list = new ArrayList<>(Arrays.asList(split));
-                if (!list.contains(studentRegistration.getSubjectId().toString())) {
-                    list.add(studentRegistration.getSubjectId().toString());
-                    student.setSubjectIdList(StringUtils.join(list, ","));
-                    student.setUpdateTime(date);
-                    studentDao.update(student);
-                }
             }
             imGroupDao.updateNickname(userId, sysUser.getUsername());
             imGroupDao.updateUserFriendNickname(userId, sysUser.getUsername());

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

@@ -909,7 +909,7 @@ public class StudentServeServiceImpl implements StudentServeService {
             result.put("enableAssignHomework", 0);
         }
 
-        if(Objects.isNull(courseScheduleId)&&Objects.isNull(studentIdsStr)){
+        if(Objects.isNull(courseScheduleId) && Objects.isNull(studentIdsStr)){
             result.put("isAssignHomework", 0);
             return result;
         }

+ 222 - 37
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+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.*;
@@ -9,6 +10,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -21,6 +23,8 @@ 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.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -65,6 +69,10 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private OrganizationDao organizationDao;
     @Autowired
     private IndexBaseMonthDataDao indexBaseMonthDataDao;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private OrganizationService organizationService;
 
     @Override
     public BaseDAO<Integer, Student> getDAO() {
@@ -503,6 +511,134 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    public StatDto exportOrganStudentData(StudentQueryInfo queryInfo) {
+        PageInfo<EduOrganStudentListExportDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<EduOrganStudentListDto> dataList1 = new ArrayList<>();
+        List<EduOrganStudentListExportDto> dataList = new ArrayList<>();
+        int count = studentDao.countCloudStudyStudentData(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList1 = studentDao.queryCloudStudyStudentData(params);
+            List<Integer> studentIds = dataList1.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+
+            List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
+            Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
+
+            List<Map<Integer, String>> studentGroupEduMapList = studentRegistrationDao.queryStudentMusicGroupEduMap(studentIds);
+            Map<Integer, String> studentGroupEduMap = MapUtil.convertIntegerMap(studentGroupEduMapList);
+
+            List<Map<Long, BigDecimal>> activeAmountMapList = cloudTeacherOrderDao.queryActiveAmountMap(studentIds);
+            Map<Long, BigDecimal> activeAmountMap = MapUtil.convertIntegerMap(activeAmountMapList);
+
+            Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
+
+            List<Map<Integer, String>> studentSchoolNamesMapList = studentDao.getStudentCooperationNameMap(studentIds);
+            Map<Integer, String> studentSchoolNamesMap = MapUtil.convertIntegerMap(studentSchoolNamesMapList);
+
+            List<SysUser> users = employeeDao.getUsers(studentIds);
+            Map<Integer, SysUser> idUserMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(users)){
+                idUserMap = users.stream().collect(Collectors.toMap(SysUser::getId, u -> u, (u1, u2) -> u1));
+            }
+
+            List<Student> students = studentDao.findByStudentIds(studentIds);
+            Map<Integer, Student> idStudentMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(students)){
+                idStudentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s->s, (s1, s2)->s1));
+            }
+
+            List<Map<Integer, Integer>> studentNotStartCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, null);
+            Map<Integer, Long> studentNotStartCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartCourseNumMapList)){
+                studentNotStartCourseNumMap = MapUtil.convertIntegerMap(studentNotStartCourseNumMapList);
+            }
+            List<Map<Integer, Integer>> studentNotStartVipCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.VIP);
+            Map<Integer, Long> studentNotStartVipCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartVipCourseNumMapList)){
+                studentNotStartVipCourseNumMap = MapUtil.convertIntegerMap(studentNotStartVipCourseNumMapList);
+            }
+            List<Map<Integer, Integer>> studentNotStartPracticeCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.PRACTICE);
+            Map<Integer, Long> studentNotStartPracticeCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartPracticeCourseNumMapList)){
+                studentNotStartPracticeCourseNumMap = MapUtil.convertIntegerMap(studentNotStartPracticeCourseNumMapList);
+            }
+            //获取分部年级列表
+            Map<Integer, String> gradeList = organizationService.getGradeList(1);
+            for (EduOrganStudentListDto eduOrganStudentListDto : dataList1) {
+                EduOrganStudentListExportDto data = new EduOrganStudentListExportDto();
+                BeanUtils.copyProperties(eduOrganStudentListDto, data);
+                if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentGradeNum())) {
+                    data.setCurrentGradeNum(eduOrganStudentListDto.getCurrentGradeNum());
+                    String grade = gradeList.get(Integer.parseInt(eduOrganStudentListDto.getCurrentGradeNum()));
+                    if (StringUtils.isNotEmpty(grade)) {
+                        data.setCurrentGradeNum(grade);
+                    }
+                }
+                if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentClass())) {
+                    data.setCurrentClass(eduOrganStudentListDto.getCurrentClass());
+                }
+                if(activeAmountMap.containsKey(data.getStudentId().longValue())){
+                    data.setActiveAmount(activeAmountMap.get(data.getStudentId().longValue()));
+                }
+                if(studentGroupEduMap.containsKey(data.getStudentId())){
+                    data.setEducationName(studentGroupEduMap.get(data.getStudentId()));
+                }
+                if(studentGroupNamesMap.containsKey(data.getStudentId())){
+                    data.setMusicGroupNames(studentGroupNamesMap.get(data.getStudentId()));
+                }
+                if(studentSchoolNamesMap.containsKey(data.getStudentId())){
+                    data.setSchoolNames(studentSchoolNamesMap.get(data.getStudentId()));
+                }
+                if(hasVipCourseStudentIds.contains(data.getStudentId())){
+                    data.setHasVipGroup(1);
+                }
+                if(data.getCloudStudyUseNum()>0 && data.getCloudStudyUseTime()>0){
+                    data.setCloudStudyUseAvgTime(data.getCloudStudyUseTime()/data.getCloudStudyUseNum());
+                }
+                data.setCloudStudyUseTime(data.getCloudStudyUseTime()/60);
+                data.setCloudStudyUseAvgTime(data.getCloudStudyUseAvgTime()/60);
+
+                if(idUserMap.containsKey(eduOrganStudentListDto.getStudentId())){
+                    SysUser sysUser = idUserMap.get(data.getStudentId());
+                    data.setPhone(sysUser.getPhone());
+                    data.setEnable(StringUtils.isNotBlank(sysUser.getPassword()));
+                }
+
+                if(idStudentMap.containsKey(data.getStudentId())){
+                    Student student = idStudentMap.get(data.getStudentId());
+                    data.setNewUser(student.getIsNewUser());
+                    data.setServiceTag(Objects.isNull(student.getServiceTag())?0:student.getServiceTag());
+                    data.setOperatingTag(Objects.isNull(student.getOperatingTag())?0:student.getOperatingTag());
+                    data.setCarePackage(Objects.nonNull(student.getCarePackage())?student.getCarePackage():0);
+                    data.setComeOnPackage(Objects.isNull(student.getComeOnPackage())?0:student.getComeOnPackage());
+                }
+
+                if(studentNotStartCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartCourseNum(studentNotStartCourseNumMap.get(data.getStudentId()).intValue());
+                }
+                if(studentNotStartVipCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartVipCourseNum(studentNotStartVipCourseNumMap.get(data.getStudentId()).intValue());
+                }
+                if(studentNotStartPracticeCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartPracticeCourseNum(studentNotStartPracticeCourseNumMap.get(data.getStudentId()).intValue());
+                }
+
+                dataList.add(data);
+            }
+        }
+        pageInfo.setRows(dataList);
+
+        StatDto result = new StatDto();
+        result.setDetail(pageInfo);
+
+        return result;
+    }
+
+    @Override
     public List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds) {
         List<Organization> organs = organizationDao.getOrgans(organIds);
 
@@ -559,12 +695,25 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         List<IndexBaseMonthData> withDayAndDataType = indexBaseMonthDataDao.getWithDayAndDataType(LocalDate.now().toString(), CLOUD_NEW_STUDENT_NUM);
         Map<Integer, Integer> organsNewCloudNewStudentNumMap = withDayAndDataType.stream().collect(Collectors.toMap(IndexBaseMonthData::getOrganId, e -> e.getActivateNum().intValue(), (e1, e2) -> e1));
 
+        //获取分部目标
+        String cloudTeacherActiveTarget = sysConfigDao.findConfigValue(SysConfigService.CLOUD_TEACHER_ACTIVE_TARGET);
+        if(StringUtils.isEmpty(cloudTeacherActiveTarget)){
+            return null;
+        }
+        List<CloudTeacherActiveTargetDto> targetDtoList = JSONArray.parseArray(cloudTeacherActiveTarget, CloudTeacherActiveTargetDto.class);
+        Map<Integer, List<CloudTeacherActiveTargetDto>> targetMap = targetDtoList.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
+
         List<EduOrganStudentDataDto> result = new ArrayList<>();
 
         for (Organization organ : organs) {
             EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
             organStudentVipData.setOrganId(organ.getId());
             organStudentVipData.setOrganName(organ.getName());
+            List<CloudTeacherActiveTargetDto> targetDtos = targetMap.get(organ.getId());
+            if(targetDtos != null && targetDtos.size() > 0){
+                CloudTeacherActiveTargetDto target = targetDtos.get(0);
+                organStudentVipData.setTargetNum(target.getTargetNum());
+            }
             if(organsStudentNumMap.containsKey(organ.getId().toString())){
                 organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId().toString()).intValue());
             }
@@ -607,6 +756,13 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         if(StringUtils.isNotBlank(queryInfo.getOrganIds())&&CollectionUtils.isEmpty(organIds)){
             return pageInfo;
         }
+        //获取分部目标
+        String cloudTeacherActiveTarget = sysConfigDao.findConfigValue(SysConfigService.CLOUD_TEACHER_ACTIVE_TARGET);
+        if(StringUtils.isEmpty(cloudTeacherActiveTarget)){
+            return null;
+        }
+        List<CloudTeacherActiveTargetDto> targetDtoList = JSONArray.parseArray(cloudTeacherActiveTarget, CloudTeacherActiveTargetDto.class);
+        Map<Integer, List<CloudTeacherActiveTargetDto>> targetMap = targetDtoList.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
 
         List<Organization> organs = organizationDao.getOrgans(organIds);
         pageInfo.setTotal(organs.size());
@@ -652,7 +808,12 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         List<EduOrganStudentDataDto> result = new ArrayList<>();
 
         for (Organization organ : organs) {
+            List<CloudTeacherActiveTargetDto> targetDtos = targetMap.get(organ.getId());
             EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            if(targetDtos != null && targetDtos.size() > 0){
+                CloudTeacherActiveTargetDto target = targetDtos.get(0);
+                organStudentVipData.setTargetNum(target.getTargetNum());
+            }
             organStudentVipData.setOrganId(organ.getId());
             organStudentVipData.setOrganName(organ.getName());
             if(organsStudentNumMap.containsKey(organ.getId().toString())){
@@ -685,6 +846,13 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             result.add(organStudentVipData);
         }
         Comparator<EduOrganStudentDataDto> comparing = null;
+        if(StringUtils.isNotBlank(queryInfo.getTargetNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getTargetNum, "ASC".equals(queryInfo.getTargetNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getTargetNum, "ASC".equals(queryInfo.getTargetNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
         if(StringUtils.isNotBlank(queryInfo.getTotalStudentNum())){
             if(Objects.isNull(comparing)){
                 comparing = Comparator.comparing(EduOrganStudentDataDto::getTotalStudentNum, "ASC".equals(queryInfo.getTotalStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
@@ -793,12 +961,13 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         //清除标记
         studentDao.cleanCountFlag();
         //打标记
-        List<Integer> studentIds = new ArrayList<>();
+//        List<Integer> studentIds = new ArrayList<>();
         //获取在会员团的学员
-        studentIds.addAll(studentRegistrationDao.queryHasMemberGroupStudent());
+//        studentIds.addAll(studentRegistrationDao.queryHasMemberGroupStudent());
         //获取购买过云教练(非活动)的学员
-        studentIds.addAll(cloudTeacherOrderDao.getStudentIds());
-        studentDao.remarkCountFlag(studentIds);
+//        studentIds.addAll(cloudTeacherOrderDao.getStudentIds());
+        //标记目标学员
+        studentDao.remarkCountFlag();
         //更新目标学员、目标金额
         SysConfig config = sysConfigDao.findByParamName("cloud_teacher_active_target");
         config.setParanValue(JSON.toJSONString(studentRegistrationDao.queryOrganTarget()));
@@ -817,16 +986,16 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         List<CloudTeacherActiveTargetDto> targetDtoList = JSONArray.parseArray(cloudTeacherActiveTarget, CloudTeacherActiveTargetDto.class);
         Map<Integer, List<CloudTeacherActiveTargetDto>> targetMap = targetDtoList.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
         //获取各分部总人数
-        List<Map<String, Long>> maps = indexBaseMonthDataDao.countTotalStudentNum();
-        Map<String, Long> organStudentNumMap = new HashMap<>(20);
-        if(maps != null && maps.size() > 0){
-            organStudentNumMap = MapUtil.convertIntegerMap(maps);
-        }
+//        List<Map<String, Long>> maps = indexBaseMonthDataDao.countTotalStudentNum();
+//        Map<String, Long> organStudentNumMap = new HashMap<>(20);
+//        if(maps != null && maps.size() > 0){
+//            organStudentNumMap = MapUtil.convertIntegerMap(maps);
+//        }
         params.put("organIdList",organIdList);
         List<CloudTeacherActiveTargetDto> resultList = indexBaseMonthDataDao.countCloudTeacherActive(params);
         for (CloudTeacherActiveTargetDto dto : resultList) {
-            Long aLong = organStudentNumMap.get(dto.getOrganId().toString());
-            dto.setTotalNum(aLong==null?0:aLong.intValue());
+//            Long aLong = organStudentNumMap.get(dto.getOrganId().toString());
+//            dto.setTotalNum(aLong==null?0:aLong.intValue());
             List<CloudTeacherActiveTargetDto> targetDtos = targetMap.get(dto.getOrganId());
             if(targetDtos != null && targetDtos.size() > 0){
                 CloudTeacherActiveTargetDto target = targetDtos.get(0);
@@ -834,17 +1003,21 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
                 dto.setTargetAmount(target.getTargetAmount());
             }
             if(dto.getBuyAmount().doubleValue() > 0d && dto.getBuyNum() > 0){
-                BigDecimal avgBuyAmount = dto.getBuyAmount().divide(new BigDecimal(dto.getBuyNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal avgBuyAmount = dto.getBuyAmount().divide(new BigDecimal(dto.getBuyNum()), 4, BigDecimal.ROUND_HALF_UP);
                 dto.setAvgBuyAmount(avgBuyAmount);
             }
             if(dto.getTotalNum() > 0 && dto.getBuyNum() > 0){
-                BigDecimal buyScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTotalNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+                BigDecimal buyScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTotalNum()), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
                 dto.setBuyScale(buyScale);
             }
             if(dto.getTargetNum() > 0 && dto.getBuyNum() > 0){
-                BigDecimal targetFinishScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTargetNum()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+                BigDecimal targetFinishScale = new BigDecimal(dto.getBuyNum()).divide(new BigDecimal(dto.getTargetNum()), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
                 dto.setTargetFinishScale(targetFinishScale);
             }
+            if(dto.getBuyAmount().doubleValue() > 0d && dto.getTargetAmount().doubleValue() > 0d){
+                BigDecimal targetAmountFinishScale = dto.getBuyAmount().divide(dto.getTargetAmount(), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+                dto.setTargetAmountFinishScale(targetAmountFinishScale);
+            }
         }
         Map<String,Object> resultMap = new HashMap<>(7);
         BigDecimal targetAmount = resultList.stream().map(CloudTeacherActiveTargetDto::getTargetAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -853,30 +1026,35 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         resultMap.put("buyAmount",buyAmount);
         Integer buyNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getBuyNum).sum();
         resultMap.put("buyNum",buyNum);
-        Integer totalNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getTotalNum).sum();
-        resultMap.put("totalNum",totalNum);
+//        Integer totalNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getTotalNum).sum();
+//        resultMap.put("totalNum",totalNum);
         Integer targetNum = resultList.stream().mapToInt(CloudTeacherActiveTargetDto::getTargetNum).sum();
         resultMap.put("targetNum",targetNum);
         resultMap.put("avgBuyAmount",0);
-        resultMap.put("buyScale",0);
+//        resultMap.put("buyScale",0);
         resultMap.put("targetFinishScale",0);
+        resultMap.put("targetAmountFinishScale",0);
         if(buyAmount.doubleValue() > 0d && buyNum > 0){
             BigDecimal avgBuyAmount = buyAmount.divide(new BigDecimal(buyNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
             resultMap.put("avgBuyAmount",avgBuyAmount);
         }
-        if(totalNum > 0 && buyNum > 0){
-            BigDecimal buyScale = new BigDecimal(buyNum).divide(new BigDecimal(totalNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
-            resultMap.put("buyScale",buyScale);
-        }
+//        if(totalNum > 0 && buyNum > 0){
+//            BigDecimal buyScale = new BigDecimal(buyNum).divide(new BigDecimal(totalNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+//            resultMap.put("buyScale",buyScale);
+//        }
         if(targetNum > 0 && buyNum > 0){
-            BigDecimal targetFinishScale = new BigDecimal(buyNum).divide(new BigDecimal(targetNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+            BigDecimal targetFinishScale = new BigDecimal(buyNum).divide(new BigDecimal(targetNum), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
             resultMap.put("targetFinishScale",targetFinishScale);
         }
+        if(buyAmount.doubleValue() > 0d && targetAmount.doubleValue() > 0d){
+            BigDecimal targetAmountFinishScale = buyAmount.divide(targetAmount, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+            resultMap.put("targetAmountFinishScale",targetAmountFinishScale);
+        }
         Map<String,Object> result = new HashMap<>(2);
         result.put("head",resultMap);
         String sort = queryInfo.getSort();
         if(StringUtils.isEmpty(sort)){
-            sort = "targetFinishScale";
+            sort = "targetAmountFinishScale";
         }
         String order = queryInfo.getOrder();
         switch (sort){
@@ -901,20 +1079,20 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
                     resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getAvgBuyAmount)).collect(Collectors.toList());
                 }
                 break;
-            case "totalNum":
-                if("DESC".equalsIgnoreCase(order)){
-                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTotalNum,Comparator.reverseOrder())).collect(Collectors.toList());
-                }else {
-                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTotalNum)).collect(Collectors.toList());
-                }
-                break;
-            case "buyScale":
-                if("DESC".equalsIgnoreCase(order)){
-                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale,Comparator.reverseOrder())).collect(Collectors.toList());
-                }else {
-                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale)).collect(Collectors.toList());
-                }
-                break;
+//            case "totalNum":
+//                if("DESC".equalsIgnoreCase(order)){
+//                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTotalNum,Comparator.reverseOrder())).collect(Collectors.toList());
+//                }else {
+//                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTotalNum)).collect(Collectors.toList());
+//                }
+//                break;
+//            case "buyScale":
+//                if("DESC".equalsIgnoreCase(order)){
+//                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale,Comparator.reverseOrder())).collect(Collectors.toList());
+//                }else {
+//                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getBuyScale)).collect(Collectors.toList());
+//                }
+//                break;
             case "targetNum":
                 if("DESC".equalsIgnoreCase(order)){
                     resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetNum,Comparator.reverseOrder())).collect(Collectors.toList());
@@ -929,6 +1107,13 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
                     resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetFinishScale)).collect(Collectors.toList());
                 }
                 break;
+            case "targetAmountFinishScale":
+                if("DESC".equalsIgnoreCase(order)){
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetAmountFinishScale,Comparator.reverseOrder())).collect(Collectors.toList());
+                }else {
+                    resultList = resultList.stream().sorted(Comparator.comparing(CloudTeacherActiveTargetDto::getTargetAmountFinishScale)).collect(Collectors.toList());
+                }
+                break;
         }
         result.put("resultList",resultList);
         return result;

+ 33 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -391,7 +391,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         SubjectChange subjectChange = new SubjectChange();
         SubjectChange studentLastChange = subjectChangeDao.getStudentLastChange(studentId, musicGroupId);
         if (studentLastChange != null) {
-        	List<Long> orderIdList = new ArrayList<Long>();
+        	throw new BizException("声部更换只能操作一次,请勿重复操作");
+        	/*List<Long> orderIdList = new ArrayList<Long>();
         	orderIdList.add(studentLastChange.getOrderId().longValue());
         	Set<Integer> refundSellOrderGoodsIds = getRefundGoodsId(orderIdList);
             subjectChange.setStudentId(studentLastChange.getStudentId());
@@ -426,7 +427,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 }
             }
             subjectChange.setOriginalCost(originalCost);
-            return subjectChange;
+            return subjectChange;*/
         }
         //2.1不存在历史的更换
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(studentId, musicGroupId);
@@ -438,10 +439,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         
 		if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
 			if(studentRegistration.getMusicGroupStatus() == StudentMusicGroupStatusEnum.NORMAL){
-				StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(studentId, musicGroupId, SUCCESS);
-				if (studentPaymentOrder != null) {
-					studentPaymentOrderList.add(studentPaymentOrder);
-				}
+				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(studentId, musicGroupId, SUCCESS);
 			}
 		} else {
 			studentPaymentOrderList = studentPaymentOrderService.queryByBatchNo(studentId, studentRegistration.getMusicGroupPaymentCalenderId() + "",
@@ -456,13 +454,13 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 		}
 
         //查询乐器订单
-        StudentPaymentOrderDetail musicalOrderDetail =null, accessoriesOrderDetail = null;
+        Long paymentOrderId = null;
         		
         for(StudentPaymentOrderDetail detail : details){
-        	if(detail.getType() == OrderDetailTypeEnum.ACCESSORIES){
-        		accessoriesOrderDetail = detail;
-        	}else if(detail.getType() == OrderDetailTypeEnum.MUSICAL){
-        		musicalOrderDetail = detail;
+        	if(detail.getType() == OrderDetailTypeEnum.ACCESSORIES || detail.getType() == OrderDetailTypeEnum.MUSICAL){
+	        	if(paymentOrderId == null || paymentOrderId < detail.getPaymentOrderId()){
+	    			paymentOrderId = detail.getPaymentOrderId();
+	    		}
         	}
         }
 
@@ -476,11 +474,11 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         subjectChange.setOrganId(musicGroup.getOrganId());
         subjectChange.setCooperationOrganId(musicGroup.getCooperationOrganId());
         subjectChange.setMusicGroupId(musicGroupId);
-		if (musicalOrderDetail != null) {
-			subjectChange.setOrderId(musicalOrderDetail.getPaymentOrderId().intValue());
-		} else if (accessoriesOrderDetail != null) {
-			subjectChange.setOrderId(accessoriesOrderDetail.getPaymentOrderId().intValue());
-		}
+
+        if(paymentOrderId != null){
+        	subjectChange.setOrderId(paymentOrderId.intValue());
+        }
+		
         String accessoriesIds = "";
         BigDecimal accessoriesPrice = BigDecimal.ZERO;
         for (StudentPaymentOrderDetail detail : details) {
@@ -494,7 +492,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                     subjectChange.setOriginalMusicalGoods(goodsDao.get(goodsId));
                     subjectChange.setOriginalMusicalPrice(detail.getPrice());
                 }
-            } else {
+            } else if (detail.getType().equals(OrderDetailTypeEnum.ACCESSORIES)){
                 if (StringUtils.isNotBlank(detail.getGoodsIdList())) {
                     accessoriesPrice = accessoriesPrice.add(detail.getPrice());
                     accessoriesIds = accessoriesIds.length() > 0 ? accessoriesIds + "," + detail.getGoodsIdList() : detail.getGoodsIdList();
@@ -512,10 +510,24 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             }
 
             subjectChange.setOriginalAccessories(accessoriesId);
-            List<Goods> accessoriesGoods = goodsDao.findGoodsByIds(accessoriesId);
-            subjectChange.setOriginalAccessoriesGoods(accessoriesGoods);
-            BigDecimal price = accessoriesGoods.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-            subjectChange.setOriginalAccessoriesPrice(price);
+            
+            Map<Integer, Goods> goodsMap = goodsService.findGoodsByIds(accessoriesId).stream().collect(Collectors.toMap(Goods::getId, Goods -> Goods));
+
+			String[] accessoriesIdList = StringUtils.split(accessoriesId, ',');
+
+			for (String s : accessoriesIdList) {
+				if(StringUtils.isBlank(s)){
+					continue;
+				}
+				
+				if(subjectChange.getOriginalAccessoriesGoods() == null){
+					subjectChange.setOriginalAccessoriesGoods(new ArrayList<Goods>());
+				}
+				subjectChange.getOriginalAccessoriesGoods().add(goodsMap.get(Integer.parseInt(s)));
+			}
+            
+            //BigDecimal price = accessoriesGoods.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            subjectChange.setOriginalAccessoriesPrice(accessoriesPrice);
         }
         //2.2 计算销售成本
         BigDecimal orderSellCost = BigDecimal.ZERO;

+ 10 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -55,7 +56,7 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 	}
 
 	@Override
-	@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 	public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId, Integer exchangeNum) {
 		if(Objects.isNull(userId)||Objects.isNull(couponId)||Objects.isNull(paymentOrderId)||Objects.isNull(exchangeNum)){
 			throw new BizException("领取失败");
@@ -94,8 +95,8 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 				sysCouponCode.setUseDeadlineDate(DateUtil.addDays(now, sysCoupon.getDeadline()));
 				break;
 			case TIME_BUCKET:
-				sysCouponCode.setUseStartDate(sysCoupon.getStartDate());
-				sysCouponCode.setUseDeadlineDate(sysCoupon.getEndDate());
+				sysCouponCode.setUseStartDate(sysCoupon.getEffectiveStartTime());
+				sysCouponCode.setUseDeadlineDate(sysCoupon.getEffectiveExpireTime());
 				break;
 			default:
 				throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
@@ -150,4 +151,10 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 		pageInfo.setRows(dataList);
 		return pageInfo;
     }
+
+    @Override
+    public List<SysCouponCode> queryCouponPage(BigDecimal amount, Integer userId) {
+
+		return null;
+    }
 }

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

@@ -63,12 +63,53 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon>  i
 				oldCoupon.setStockCount(sysCoupon.getStockCount());
 				oldCoupon.setWarningStockNum(sysCoupon.getWarningStockNum());
 			}
+			if(oldCoupon.getStockCount()==-1){
+				oldCoupon.setWarningStockNum(-1);
+			}
 			oldCoupon.setStatus(sysCoupon.getStatus());
 			if(oldCoupon.getStockCount()-oldCoupon.getConsumeNum()>oldCoupon.getWarningStockNum()){
 				oldCoupon.setWarningStatus(0);
 			}
 			sysCouponDao.update(oldCoupon);
 		}else{
+			switch (sysCoupon.getType()){
+				case DISCOUNT:
+					if(Objects.isNull(sysCoupon.getFaceValue())){
+						throw new BizException("请指定折扣比例");
+					}
+					sysCoupon.setFullAmount(null);
+					break;
+				case FULL_REDUCTION:
+					if(Objects.isNull(sysCoupon.getFaceValue())){
+						throw new BizException("请指定优惠金额");
+					}
+					if(Objects.isNull(sysCoupon.getFullAmount())){
+						throw new BizException("请指定达标金额");
+					}
+					break;
+				default:
+					throw new BizException("请指定优惠券类型");
+			}
+			switch (sysCoupon.getEffectiveType()){
+				case DAYS:
+					if(Objects.isNull(sysCoupon.getDeadline())){
+						throw new BizException("请指定有效天数");
+					}
+					sysCoupon.setEffectiveStartTime(null);
+					sysCoupon.setEffectiveExpireTime(null);
+					break;
+				case TIME_BUCKET:
+					if(Objects.isNull(sysCoupon.getEffectiveStartTime())||Objects.isNull(sysCoupon.getEffectiveExpireTime())){
+						throw new BizException("请指定有效时间段");
+					}
+					sysCoupon.setDeadline(null);
+					break;
+				default:
+					throw new BizException("请指定有效期类型");
+			}
+			if(sysCoupon.getStockCount()==-1){
+				sysCoupon.setWarningStockNum(-1);
+			}
 			sysCouponDao.update(sysCoupon);
 		}
 	}

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

@@ -8,7 +8,10 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.FeatureType;
+import com.ym.mec.biz.dal.enums.HeardLevelEnum;
+import com.ym.mec.biz.dal.enums.IndexDataType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -21,7 +24,6 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -67,8 +69,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Override
 	public long insert(SysMusicCompareRecord bean) {
 		long insert = super.insert(bean);
-		studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
-		sysMusicCompareWeekDataService.updateUserWeekTrainData(bean.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
+		if(Objects.nonNull(bean.getUserId())){
+			studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
+			sysMusicCompareWeekDataService.updateUserWeekTrainData(bean.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
+		}
 		return insert;
 	}
 
@@ -83,6 +87,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setSysMusicScoreId(soundCompareInfo.getMusicScoreId());
 		sysMusicCompareRecord.setHeardLevel(soundCompareInfo.getHeardLevel());
 		sysMusicCompareRecord.setBehaviorId(soundCompareInfo.getBehaviorId());
+		sysMusicCompareRecord.setSpeed(soundCompareInfo.getSpeed());
 		Map<String, Object> scoreData = new HashMap<>();
 		scoreData.put("userMeasureScore", soundCompareInfo.getUserMeasureScoreMap());
 		Map<String, Object> musicalNotesPlayStats = new HashMap<>();
@@ -102,6 +107,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setRecordFilePath(soundCompareInfo.getRecordFilePath());
 		sysMusicCompareRecord.setDeviceType(soundCompareInfo.getDeviceType());
 		sysMusicCompareRecord.setClientId(soundCompareInfo.getClientId());
+		if(!CollectionUtils.isEmpty(soundCompareInfo.getMusicXmlInfos())){
+			MusicPitchDetailDto lastMeasure = soundCompareInfo.getMusicXmlInfos().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+			sysMusicCompareRecord.setSourceTime((lastMeasure.getTimeStamp()+lastMeasure.getDuration())/1000);
+		}
 		if(Objects.nonNull(soundCompareInfo.getFile())){
 			sysMusicCompareRecord.setPlayTime(soundCompareInfo.getFile().length()/(SoundCompareHandler.soundCompareConfig.audioFormat.getFrameSize()*SoundCompareHandler.soundCompareConfig.audioFormat.getFrameRate()));
 		}

+ 17 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -282,9 +282,23 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 					courseHomework.setExpiryDate(DateUtil.addDays(date,7));
 
 					courseHomeworkService.insert(courseHomework);
-
-					List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao
-							.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),courseHomework.getId(),courseHomework.getMusicScoreId());
+					List<StudentCourseHomework> studentCourseHomeworks = 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(),","),
+									scoreSubjectDto.getUserIdList()));
+						}
+					}else {
+						studentCourseHomeworks.addAll(studentCourseHomeworkDao.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
+								courseHomework.getId(),
+								courseHomework.getMusicScoreId(),
+								null));
+					}
 					if(CollectionUtils.isEmpty(studentCourseHomeworks)){
 						throw new BizException("此课程没有学生");
 					}

+ 15 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -3491,7 +3491,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				throw new BizException("已有学员购买了该课程组,无法添加,请走学员购买流程!");
 			}
 		}
-
+		
 		VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroup(vipGroup.getId());
 		if(Objects.isNull(vipGroupDefaultClassesUnitPrice)){
 			throw new BizException("课程单价设置错误");
@@ -3503,14 +3503,24 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("当前课程组已经停止,无法进行添加学员操作。");
 		}
 
+        Integer exitStudentNum = classGroupStudentMapperDao.countClassGroupExitStudentNum(classGroup.getId(), studentIds);
+		if(exitStudentNum>0){
+			throw new BizException("选择的学生中存在此课程中已存在的学生");
+		}
+
         Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
         if(studentNum.compareTo(classGroup.getExpectStudentNum())>=0){
             throw new BizException("该班级人数已达上限");
         }
-
-        Integer exitStudentNum = classGroupStudentMapperDao.countClassGroupExitStudentNum(classGroup.getId(), studentIds);
-		if(exitStudentNum>0){
-			throw new BizException("选择的学生中存在此课程中已存在的学生");
+		
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId());
+		
+		if(vipGroupCategory == null){
+			throw new BizException("请修改VIP课课程形式");
+		}
+		
+		if(vipGroupCategory.getStudentNum() < (studentCoursePriceMap.size() + studentNum)){
+			throw new BizException("学生人数超过{}人,请调整", vipGroupCategory.getStudentNum());
 		}
 
 		VipGroupActivity vipGroupActivity = null;

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

@@ -1540,4 +1540,9 @@
 		LEFT JOIN sys_user u on u.id_ = cgtm.user_id_
 		where cg.del_flag_ = 0 and cg.group_type_ = 'MUSIC' and cg.music_group_id_ = #{musicGroupId}  group by cg.id_ order by cg.type_
     </select>
+    <select id="queryStudentClassGroupMap" resultType="java.util.Map">
+        SELECT user_id_ 'key',GROUP_CONCAT(class_group_id_) 'value' FROM class_group_student_mapper
+        WHERE music_group_id_ = #{musicGroupId} AND status_ = 'NORMAL'
+        GROUP BY user_id_
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -261,6 +261,17 @@
     <select id="getStudentIds" resultType="java.lang.Integer">
         SELECT DISTINCT student_id_ FROM cloud_teacher_order WHERE active_remark_ IS NULL AND status_ != 0
     </select>
+    <select id="queryActiveAmountMap" resultType="java.util.Map">
+        SELECT student_id_ 'key',SUM(amount_) 'value' FROM cloud_teacher_order
+        WHERE status_ != 0 AND active_remark_ = '202109'
+        <if test="studentIds != null and studentIds.size > 0">
+            AND student_id_ IN
+            <foreach collection="studentIds" separator="," item="userId" open="(" close=")">
+                #{userId}
+            </foreach>
+        </if>
+        GROUP BY student_id_
+    </select>
     <sql id="queryCloudTeacherActiveDetailSql">
         <where>
             cto.status_ != 0 AND cto.active_remark_ = '202109'

+ 32 - 11
mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -11,6 +11,7 @@
         <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="course_schedule_id_" property="courseScheduleId" />
 		<result column="attachments_" property="attachments" />
+		<result column="title_" property="title" />
 		<result column="content_" property="content" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
@@ -24,6 +25,7 @@
 	<resultMap type="com.ym.mec.biz.dal.dto.CourseHomeworkListDto" id="CourseHomeworkDto">
 		<result column="id_" property="id" />
 		<result column="course_schedule_id_" property="courseScheduleId" />
+		<result column="title_" property="title" />
 		<result column="content_" property="content" />
 		<result column="create_time_" property="createTime" />
 		<result column="start_class_time_" property="startClassTime" />
@@ -56,12 +58,11 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseHomework" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
-		INSERT INTO course_homework (id_,group_type_,course_schedule_id_,attachments_,content_,create_time_,update_time_,music_group_id_,class_group_id_,completed_num_,expect_num_,expiry_date_) VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{courseScheduleId},#{attachments},#{content},now(),now(),#{musicGroupId},#{classGroupId},#{completedNum},#{expectNum},#{expiryDate})
+		INSERT INTO course_homework (group_type_,course_schedule_id_,attachments_,
+		                             title_,content_,create_time_,update_time_,music_group_id_,class_group_id_,completed_num_,expect_num_,expiry_date_)
+		VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		       #{courseScheduleId},#{attachments},#{title},#{content},now(),now(),#{musicGroupId},
+		       #{classGroupId},#{completedNum},#{expectNum},#{expiryDate})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -71,9 +72,6 @@
 			<if test="attachments != null">
 				attachments_ = #{attachments},
 			</if>
-			<if test="id != null">
-				id_ = #{id},
-			</if>
 			<if test="classGroupId != null">
 				class_group_id_ = #{classGroupId},
 			</if>
@@ -90,6 +88,9 @@
 			<if test="expectNum != null">
 				expect_num_ = #{expectNum},
 			</if>
+			<if test="title != null">
+				title_ = #{title},
+			</if>
 			<if test="content != null">
 				content_ = #{content},
 			</if>
@@ -156,8 +157,10 @@
 	</select>
 
 	<resultMap id="teacherHomeworkListDto" type="com.ym.mec.biz.dal.dto.TeacherHomeworkListDto">
-		<result property="courseScheduleId" column="course_homework_id_"/>
+		<result property="courseScheduleId" column="course_schedule_id_"/>
+		<result property="homeworkId" column="homework_id_"/>
 		<result property="content" column="content_"/>
+		<result property="title" column="title_"/>
 		<result property="expectNum" column="expect_num_"/>
 		<result property="completedNum" column="completed_num_"/>
 		<result property="courseScheduleName" column="course_schedule_name_"/>
@@ -174,8 +177,9 @@
 
 	<select id="findByClassGroupAndTeacher" resultMap="teacherHomeworkListDto">
 		SELECT
-			cs.id_ course_homework_id_,
+			cs.id_ course_schedule_id_,
 			ch.content_,
+			ch.title_,
 			ch.create_time_,
 			DATE_FORMAT(cs.class_date_,'%Y-%m-%d') 'day_',
 			CONCAT( class_date_, ' ', start_class_time_ ) start_class_time_,
@@ -327,6 +331,23 @@
 		</if>
 		<include refid="queryHomePageSql"/>
 	</select>
+	<select id="findByIdList" resultMap="teacherHomeworkListDto">
+		SELECT
+		ch.id_ homework_id_,ch.title_,ch.content_,ch.completed_num_,ch.expect_num_,ch.expiry_date_,
+		ch.course_schedule_id_,ch.music_group_id_,
+		DATE_FORMAT(ch.create_time_,'%Y-%m-%d') 'day_',
+		CONCAT(cs.class_date_, ' ',cs.start_class_time_ ) start_class_time_,
+		CONCAT(cs.class_date_, ' ',cs.end_class_time_ ) end_class_time_,
+		cs.name_ course_schedule_name_,
+		mg.name_ music_group_name_
+		FROM course_homework ch
+		LEFT JOIN course_schedule cs ON ch.course_schedule_id_ = cs.id_
+		LEFT JOIN music_group mg ON ch.music_group_id_ = mg.id_
+		WHERE ch.id_ IN
+		<foreach collection="homeworkIdList" separator="," item="item" open="(" close=")">
+			#{item}
+		</foreach>
+	</select>
 
 	<delete id="delByCourseScheduleId" >
 		DELETE FROM course_homework WHERE course_schedule_id_ = #{courseScheduleId} 

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

@@ -4027,4 +4027,50 @@
         WHERE class_date_ BETWEEN #{schoolTerm.startSchoolTerm} AND #{schoolTerm.endSchoolTerm} AND class_group_id_ = #{schoolTerm.classGroupId} AND type_ = #{schoolTerm.courseScheduleType}
         AND CONCAT(class_date_,' ',start_class_time_) &lt;= #{schoolTerm.courseClassTime} AND is_lock_ = 0 AND del_flag_ = 0 AND pre_course_flag_ = 0
     </select>
+    <resultMap id="TeacherServeHomeworkPojo" type="com.ym.mec.biz.dal.dto.TeacherServeHomeworkPojo">
+        <result property="classGroupName" column="name_"/>
+        <result property="courseScheduleType" column="type_"/>
+        <result property="courseScheduleId" column="id_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="classDate" column="class_date_"/>
+        <result property="teachMode" column="teach_mode_"/>
+        <result property="signInStatus" column="sign_in_status_"/>
+        <result property="signOutStatus" column="sign_out_status_"/>
+    </resultMap>
+    <select id="queryHomeworkPojoByCourseScheduleIds" resultMap="TeacherServeHomeworkPojo">
+        SELECT
+        cs.id_,
+        cg.name_,
+        cs.type_,
+        cs.class_date_,
+        cs.start_class_time_,
+        cs.end_class_time_,
+        cs.teach_mode_,
+        IF(ta.sign_in_status_ IS NULL,0,1) sign_in_status_,
+        IF(ta.sign_out_status_ IS NULL,0,1) sign_out_status_
+        FROM course_schedule cs
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
+        WHERE ta.teacher_id_ = #{teacherId} AND cs.id_ IN
+        <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
+            #{courseId}
+        </foreach>
+        <if test="courseType != null and courseType != ''">
+            AND FIND_IN_SET(cs.type_,#{courseType})
+        </if>
+        ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC,cs.id_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <select id="countHomeworkPojoByCourseScheduleIds" resultType="java.lang.Integer">
+        SELECT COUNT(cs.id_)
+        FROM course_schedule cs
+        WHERE cs.id_ IN
+        <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
+            #{courseId}
+        </foreach>
+        <if test="courseType != null and courseType != ''">
+            AND FIND_IN_SET(cs.type_,#{courseType})
+        </if>
+    </select>
 </mapper>

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

@@ -305,12 +305,10 @@
 			COUNT( DISTINCT sa.user_id_ ) AS 'value'
 		FROM
 			course_schedule_student_payment sa
-			LEFT JOIN class_group_student_mapper cgsm ON sa.class_group_id_=cgsm.class_group_id_ AND sa.user_id_=cgsm.user_id_
 		WHERE course_schedule_id_ IN
 			<foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
 				#{courseId}
 			</foreach>
-			AND cgsm.status_ NOT IN ('QUIT', 'QUIT_SCHOOL')
 		GROUP BY
 			course_schedule_id_
 	</select>
@@ -492,6 +490,20 @@
 		</if>
 		AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW() AND cs.pre_course_flag_ = 0
 	</select>
+	<select id="countStudentsNotStartCourseNumWithCourseType" resultType="map">
+		SELECT cssp.user_id_ 'key',COUNT(DISTINCT cssp.course_schedule_id_) 'value'
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
+		WHERE cssp.user_id_ IN
+		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+			#{studentId}
+		</foreach>
+		<if test="courseScheduleType != null">
+			AND cs.type_= #{courseScheduleType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		</if>
+		AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW() AND cs.pre_course_flag_ = 0
+		GROUP BY cssp.user_id_
+	</select>
 	<select id="queryMidiByUserIdsAndCourseId" resultType="java.util.Map">
 		SELECT cssp.user_id_ 'key',CASE WHEN cssp.open_play_midi_ IS NULL THEN '' ELSE cssp.open_play_midi_ END 'value' FROM course_schedule_student_payment cssp
 		WHERE cssp.user_id_ IN
@@ -813,4 +825,12 @@
 		GROUP BY
 			su.organ_id_
 	</select>
+    <select id="getCourseStudents" resultType="com.ym.mec.biz.dal.dto.BasicUserDto">
+		SELECT cssp.user_id_ userId,st.member_rank_setting_id_ memberRankSettingId,s.name_ subjectName,su.avatar_ headUrl,su.username_ name,st.subject_id_list_ subjectIdList
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+		LEFT JOIN student st ON st.user_id_ = cssp.user_id_
+		LEFT JOIN `subject` s ON s.id_ = st.subject_id_list_
+		WHERE cssp.course_schedule_id_ = #{courseScheduleId}
+	</select>
 </mapper>

+ 76 - 8
mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml

@@ -21,8 +21,6 @@
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 		<result column="organ_name_" property="organName" />
-		<result column="music_score_id_" property="musicScoreId" />
-		<result column="music_score_name_" property="musicScoreName"/>
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -61,18 +59,15 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO extracurricular_exercises (teacher_id_,student_id_list_,batch_no_,
-		                                       title_,attachments_,content_,expire_date_,completed_num_,expect_num_,create_time_,update_time_,music_score_id_)
+		                                       title_,attachments_,content_,expire_date_,completed_num_,expect_num_,create_time_,update_time_)
 		VALUES(#{teacherId},#{studentIdList},#{batchNo},#{title},#{attachments},
-		       #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW(),#{musicScoreId})
+		       #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW())
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises">
 		UPDATE extracurricular_exercises
 		<set>
-			<if test="musicScoreId != null">
-				music_score_id_ = #{musicScoreId},
-			</if>
 			<if test="studentIdList != null">
 			student_id_list_ = #{studentIdList},
 			</if>
@@ -165,7 +160,9 @@
 			su.id_ userId,
 			su.username_ name,
 			su.avatar_ headUrl,
-			GROUP_CONCAT(sub.name_) subjectName
+			GROUP_CONCAT(sub.name_) subjectName,
+		    stu.member_rank_setting_id_ memberRankSettingId,
+			stu.subject_id_list_ subjectIdList
 		FROM
 			student_extracurricular_exercises_situation_ sees
 			<if test="musicGroupId!=null and musicGroupId!=''">
@@ -190,6 +187,9 @@
 					AND stu.member_rank_setting_id_ IS NULL
 				</if>
 			</if>
+			<if test="studentIds!=null and studentIds!=''">
+				AND FIND_IN_SET(sees.student_id_,#{studentIds})
+			</if>
 			<if test="musicGroupId!=null and musicGroupId!=''">
 				AND sr.music_group_id_=#{musicGroupId}
 			</if>
@@ -206,4 +206,72 @@
 		ORDER BY
 			su.id_;
 	</select>
+	<resultMap id="ExtracurricularExercisesHomeworkListDto" type="com.ym.mec.biz.dal.dto.ExtracurricularExercisesHomeworkListDto">
+		<result property="type" column="type_"/>
+		<result property="homeworkId" column="id_"/>
+	</resultMap>
+	<select id="countExtraExercilsesHomeworks" resultType="int">
+		SELECT COUNT(id_) FROM (
+		SELECT id_, create_time_,'EXERCISES' type_
+		FROM extracurricular_exercises
+		<where>
+			<if test="teacherId!=null">
+				AND teacher_id_ = #{teacherId}
+			</if>
+			<if test="createTime!=null">
+				AND DATE_FORMAT(create_time_, '%Y-%m') = DATE_FORMAT(#{createTime}, '%Y-%m')
+			</if>
+		</where>
+		UNION ALL
+		SELECT ch.id_,ch.create_time_,'HOMEWORK' type_ FROM course_homework ch
+		LEFT JOIN course_schedule_teacher_salary csts ON ch.course_schedule_id_ = csts.course_schedule_id_ AND csts.teacher_role_ = 'BISHOP'
+		<where>
+			<if test="teacherId!=null">
+				AND csts.user_id_ = #{teacherId}
+			</if>
+			<if test="classGroupId!=null">
+				AND ch.class_group_id_=#{classGroupId}
+			</if>
+			<if test="createTime!=null">
+				AND DATE_FORMAT(ch.create_time_,'%Y-%m')=DATE_FORMAT(#{createTime}, '%Y-%m')
+			</if>
+		</where>
+		    ) h
+	</select>
+	<select id="findExtraExercilsesHomeworks" resultMap="ExtracurricularExercisesHomeworkListDto">
+		SELECT * FROM (
+		SELECT id_, create_time_,'EXERCISES' type_
+		FROM extracurricular_exercises
+		<where>
+			<if test="teacherId!=null">
+				AND teacher_id_ = #{teacherId}
+			</if>
+			<if test="createTime!=null">
+				AND DATE_FORMAT(create_time_, '%Y-%m') = DATE_FORMAT(#{createTime}, '%Y-%m')
+			</if>
+		</where>
+		UNION ALL
+		SELECT ch.id_,ch.create_time_,'HOMEWORK' type_ FROM course_homework ch
+		LEFT JOIN course_schedule_teacher_salary csts ON ch.course_schedule_id_ = csts.course_schedule_id_ AND csts.teacher_role_ = 'BISHOP'
+		<where>
+			<if test="teacherId!=null">
+				AND csts.user_id_ = #{teacherId}
+			</if>
+			<if test="classGroupId!=null">
+				AND ch.class_group_id_=#{classGroupId}
+			</if>
+			<if test="createTime!=null">
+				AND DATE_FORMAT(ch.create_time_,'%Y-%m')=DATE_FORMAT(#{createTime}, '%Y-%m')
+			</if>
+		</where>) h
+		ORDER BY h.create_time_ DESC
+		<include refid="global.limit"/>
+	</select>
+	<select id="findByIdList" resultMap="com.ym.mec.biz.dal.dao.CourseHomeworkDao.teacherHomeworkListDto">
+		SELECT id_ homework_id_,title_,content_,completed_num_,expect_num_,music_score_id_,expire_date_ expiry_date_,DATE_FORMAT(create_time_,'%Y-%m-%d') 'day_'
+		FROM extracurricular_exercises WHERE id_ IN
+		<foreach collection="exercisesIdList" separator="," item="item" open="(" close=")">
+			#{item}
+		</foreach>
+	</select>
 </mapper>

+ 13 - 15
mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml

@@ -22,6 +22,7 @@
 		<result column="is_view_" property="isView" />
 		<result column="organ_name_" property="organName" />
 		<result column="submit_time_" property="submitTime" />
+		<result column="music_score_id_" property="musicScoreId" />
 		<association property="extracurricularExercises" columnPrefix="ee_" resultMap="com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao.ExtracurricularExercises"/>
 	</resultMap>
 
@@ -35,7 +36,6 @@
 		<result column="content_" property="content"/>
 		<result column="expire_date_" property="expireDate"/>
 		<result column="music_score_id_" property="musicScoreId" />
-		<result column="music_score_name_" property="musicScoreName"/>
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -88,20 +88,15 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
-		INSERT INTO extracurricular_exercises_reply (extracurricular_exercises_id_,user_id_,attachments_,create_time_,update_time_,remark_,status_,is_replied_,is_view_,is_replied_timely_)
-		VALUES(#{extracurricularExercisesId},#{userId},#{attachments},NOW(),NOW(),#{remark},#{status},#{isReplied},#{isView},#{isRepliedTimely})
+		INSERT INTO extracurricular_exercises_reply (extracurricular_exercises_id_,user_id_,attachments_,create_time_,update_time_,remark_,status_,is_replied_,is_view_,is_replied_timely_,music_score_id_)
+		VALUES(#{extracurricularExercisesId},#{userId},#{attachments},NOW(),NOW(),#{remark},#{status},#{isReplied},#{isView},#{isRepliedTimely},#{musicScoreId})
 	</insert>
 
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO extracurricular_exercises_reply (extracurricular_exercises_id_,user_id_,attachments_,create_time_,update_time_,remark_,status_,is_replied_,is_view_,is_replied_timely_)
+		INSERT INTO extracurricular_exercises_reply (extracurricular_exercises_id_,user_id_,attachments_,create_time_,update_time_,remark_,status_,is_replied_,is_view_,is_replied_timely_,music_score_id_)
 		VALUES
 		<foreach collection="replies" item="reply" separator=",">
-			(#{reply.extracurricularExercisesId},#{reply.userId},#{reply.attachments},NOW(),NOW(),#{reply.remark},#{reply.status},#{reply.isReplied},#{reply.isView},#{reply.isRepliedTimely})
+			(#{reply.extracurricularExercisesId},#{reply.userId},#{reply.attachments},NOW(),NOW(),#{reply.remark},#{reply.status},#{reply.isReplied},#{reply.isView},#{reply.isRepliedTimely},#{reply.musicScoreId})
 		</foreach>
 	</insert>
 
@@ -109,6 +104,9 @@
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply">
 		UPDATE extracurricular_exercises_reply
 		<set>
+			<if test="musicScoreId != null">
+				music_score_id_ = #{musicScoreId},
+			</if>
 			<if test="status != null">
 			status_ = #{status},
 			</if>
@@ -200,12 +198,10 @@
 			ee.expire_date_,
 			ee.teacher_id_,
 			ee.music_score_id_,
-			sms.name_ music_score_name_,
 			su.username_ student_name_
 		FROM
 			extracurricular_exercises_reply eer
 			LEFT JOIN extracurricular_exercises ee ON ee.id_=eer.extracurricular_exercises_id_
-			LEFT JOIN sys_music_score sms ON sms.id_ = ee.music_score_id_
 			LEFT JOIN sys_user su ON su.id_ = eer.user_id_
 		WHERE
 			eer.id_ = #{extraExerciseReplyId}
@@ -247,8 +243,6 @@
 		SELECT COUNT(id_) FROM extracurricular_exercises_reply WHERE extracurricular_exercises_id_=#{extraExerciseId} AND attachments_ IS NOT NULL
 	</select>
 
-
-
 	<sql id="queryExtraExercisesCondition">
 		<where>
 			<if test="extracurricularExercisesId != null">
@@ -412,12 +406,14 @@
 		<result property="isSubmit" column="is_submit_"/>
 		<result property="isReplied" column="is_replied_"/>
 		<result property="attachments" column="attachments_"/>
+		<result property="musicScoreId" column="music_score_id_"/>
 	</resultMap>
 
 	<select id="findStudentHomeworkDetailsInTimeZone" resultMap="StudentServiceDetailDto">
 		(SELECT
 			ee.id_ homework_id_,
 			eer.id_ student_homework_id_,
+			eer.music_score_id_,
 			ee.title_,
 		 	NULL course_schedule_id_,
 			ee.teacher_id_,
@@ -444,6 +440,7 @@
 		(SELECT
 			ch.id_ homework_id_,
 			sch.id_ student_homework_id_,
+			sch.music_score_id_,
 			NULL title_,
 		    cs.id_ course_schedule_id_,
 			cs.actual_teacher_id_,
@@ -497,7 +494,8 @@
 			eer.submit_time_,
 			eer.is_replied_,
 			eer.is_replied_timely_,
-			ee.teacher_id_ ee_teacher_id_
+			ee.teacher_id_ ee_teacher_id_,
+			eer.music_score_id_
 		FROM
 			extracurricular_exercises_reply eer
 			LEFT JOIN extracurricular_exercises ee ON eer.extracurricular_exercises_id_=ee.id_

+ 12 - 4
mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -28,6 +28,9 @@
 		<result column="role_type_" property="roleType" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
+		<result column="member_rank_setting_id_" property="memberRankSettingId" />
+		<result column="subject_name_" property="subjectName" />
+		<result column="subject_id_" property="subjectId" />
 		<result column="username_" property="user.username" />
 		<result column="avatar_" property="user.avatar" />
 	</resultMap>
@@ -121,7 +124,8 @@
 	</select>
 	
 	<select id="queryByUserId" resultMap="ImGroup" parameterType="map">
-		SELECT ig.* FROM im_group_member igm left join im_group ig on igm.im_group_id_ = ig.id_
+		SELECT ig.* FROM im_group_member igm
+		LEFT JOIN im_group ig ON igm.im_group_id_ = ig.id_
 		where igm.user_id_ = #{userId}
 		<if test="search != null">
 			and (ig.name_ like concat('%',#{search},'%') or ig.tags_ like concat('%',#{search},'%'))
@@ -129,9 +133,13 @@
 	</select>
 	
 	<select id="queryMemberById" resultMap="ImGroupMemberDto">
-		SELECT igm.*,u.avatar_,case when find_in_set('STUDENT',u.user_type_) then u.username_ else u.real_name_ end username_
-		FROM im_group_member igm left join sys_user u on igm.user_id_ = u.id_
-		where igm.im_group_id_ = #{imGroupId}
+		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}
 	</select>
 	
 	<select id="queryMember" resultMap="ImGroupMemberDto" parameterType="map">

+ 12 - 3
mec-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml

@@ -13,6 +13,9 @@
 		<result column="friend_nickname_" property="friendNickname" />
 		<result column="memo_" property="memo" />
 		<result column="tags_" property="tags" />
+		<result column="member_rank_setting_id_" property="memberRankSettingId" />
+		<result column="subject_name_" property="subjectName" />
+		<result column="subject_id_" property="subjectId" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -90,9 +93,11 @@
 	</select>
 	
 	<select id="queryFriendListByUserId" resultMap="ImUserFriendDto" parameterType="map">
-		SELECT iuf.*,u.real_name_,u.avatar_,u.phone_,u.user_type_
+		SELECT iuf.*,u.real_name_,u.avatar_,u.phone_,u.user_type_,st.member_rank_setting_id_,s.name_ subject_name_,st.subject_id_list_ subject_id_
 		FROM im_user_friend iuf
 		LEFT JOIN sys_user u ON iuf.friend_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 iuf.user_id_ = #{userId}
 		<if test="search != null">
 			and (u.real_name_ like concat('%',#{search},'%') or iuf.friend_nickname_ like concat('%',#{search},'%'))
@@ -100,7 +105,11 @@
 	</select>
 	
 	<select id="queryFriendDetail" resultMap="ImUserFriendDto" parameterType="map">
-		SELECT iuf.*,u.real_name_,u.avatar_,u.phone_,u.user_type_ FROM im_user_friend iuf left join sys_user u on iuf.friend_id_ = u.id_
-		where iuf.user_id_ = #{userId} and iuf.friend_id_ = #{friendUserId}
+		SELECT iuf.*,u.real_name_,u.avatar_,u.phone_,u.user_type_,s.subject_id_list_ subject_id_,s.member_rank_setting_id_,sb.name_ subject_name_
+		FROM im_user_friend iuf
+		LEFT JOIN sys_user u ON iuf.friend_id_ = u.id_
+		LEFT JOIN student s ON s.user_id_ = u.id_
+		LEFT JOIN subject sb ON s.subject_id_list_ = sb.id_
+		WHERE iuf.user_id_ = #{userId} AND iuf.friend_id_ = #{friendUserId}
 	</select>
 </mapper>

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

@@ -264,6 +264,9 @@
             <if test="transactionTeacherId!=null">
                 AND transaction_teacher_id_ = #{transactionTeacherId}
             </if>
+            <if test="educationalTeacherId!=null">
+                AND educational_teacher_id_ = #{educationalTeacherId}
+            </if>
             <if test="courseViewType != null">
                 AND course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>

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

@@ -249,6 +249,7 @@
         <result property="userId" column="user_id_"/>
         <result property="username" column="username_"/>
         <result property="phone" column="phone_"/>
+        <result property="classGroupId" column="class_group_id_"/>
         <collection property="mapDtos" ofType="com.ym.mec.biz.dal.dto.MapDto">
             <result property="key" column="key"/>
             <result property="value" column="value"/>

+ 38 - 8
mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml

@@ -13,6 +13,12 @@
         <result column="create_time_" property="createTime"/>
         <result column="reason_" property="reason"/>
         <result column="user_comment_" property="userComment"/>
+        <result column="is_visit_" property="isVisit"/>
+        <result column="visit_time_" property="visitTime"/>
+        <result column="return_total_fee_" property="returnTotalFee"/>
+        <result column="fee_json_" property="feeJson"/>
+        <result column="current_approve_role_" property="currentApproveRole"/>
+        <result column="apply_user_id_" property="applyUserId"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <association property="musicGroup" javaType="com.ym.mec.biz.dal.entity.MusicGroup">
             <result column="music_group_name_" property="name"/>
@@ -41,9 +47,9 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit"
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO music_group_quit
-        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,user_comment_,status_)
+        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,user_comment_,status_,apply_user_id_,is_visit_,visit_time_,fee_json_,current_approve_role_,return_total_fee_)
         VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},#{userComment},
-        #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{applyUserId},#{isVisit},#{visitTime},#{feeJson},#{currentApproveRole},#{returnTotalFee})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -53,9 +59,6 @@
             <if test="userId != null">
                 user_id_ = #{userId},
             </if>
-            <if test="id != null">
-                id_ = #{id},
-            </if>
             <if test="joinDate != null">
                 join_date_ = #{joinDate},
             </if>
@@ -71,8 +74,23 @@
             <if test="musicGroupId != null">
                 music_group_id_ = #{musicGroupId},
             </if>
-            <if test="createTime != null">
-                create_time_ = #{createTime},
+            <if test="applyUserId != null">
+                apply_user_id_ = #{applyUserId},
+            </if>
+            <if test="isVisit != null">
+                is_visit_ = #{isVisit},
+            </if>
+            <if test="visitTime != null">
+                visit_time_ = #{visitTime},
+            </if>
+            <if test="feeJson != null">
+                fee_json_ = #{feeJson},
+            </if>
+            <if test="returnTotalFee != null">
+                return_total_fee_ = #{returnTotalFee},
+            </if>
+            <if test="currentApproveRole != null">
+                current_approve_role_ = #{currentApproveRole},
             </if>
             <if test="status != null">
                 status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -96,7 +114,7 @@
         LEFT JOIN sys_user su ON su.id_ = mgq.user_id_
         LEFT JOIN music_group mg ON mg.id_ = mgq.music_group_id_
         <include refid="queryPageSql"/>
-        ORDER BY id_
+        ORDER BY id_ desc
         <include refid="global.limit"/>
     </select>
     <sql id="queryPageSql">
@@ -118,6 +136,9 @@
             <if test="educationUserId != null">
                 AND mg.educational_teacher_id_ = #{educationUserId}
             </if>
+            <if test="currentApproveRole != null">
+                AND mgq.current_approve_role_ = #{currentApproveRole}
+            </if>
             <if test="status != null">
                 AND mgq.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
@@ -163,4 +184,13 @@
     <select id="queryByUserIdAndMusicGroupId" resultMap="MusicGroupQuit">
         select * from music_group_quit where id_ in (select max(id_) from music_group_quit where music_group_id_ = #{musicGroupId} AND user_id_ = #{userId})
     </select>
+    <select id="queryQuitMapByStudentId" resultType="java.util.Map">
+        SELECT user_id_ 'key',COUNT(DISTINCT id_)'value' FROM music_group_quit
+        WHERE user_id_ IN
+        <foreach collection="studentIds" open="(" close=")" item="userId" separator=",">
+            #{userId}
+        </foreach>
+        AND music_group_id_ = #{musicGroupId} AND status_ = 'PROCESSING'
+        GROUP BY user_id_
+    </select>
 </mapper>

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

@@ -40,7 +40,6 @@
         <result column="expect_num_" property="expectNum"/>
         <result column="attachments_" property="attachments"/>
         <result column="score_" property="score"/>
-        <result column="music_score_name_" property="musicScoreName"/>
         <result column="music_score_id_" property="musicScoreId"/>
         <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"/>
@@ -225,7 +224,6 @@
                ch.expect_num_,
                ch.expiry_date_,
                sch.music_score_id_,
-               sms.name_ music_score_name_,
                sch.id_  studentCourseHomeworkId,
                sch.attachments_,
                sch.score_,
@@ -236,7 +234,6 @@
                  LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
                  LEFT JOIN music_group mg ON ch.music_group_id_ = mg.id_
                  LEFT JOIN class_group cg ON ch.class_group_id_ = cg.id_
-                 LEFT JOIN sys_music_score sms ON sch.music_score_id_ = sms.id_
         WHERE ch.course_schedule_id_ = #{courseScheduleID}
           AND sch.user_id_ = #{userID}
     </select>
@@ -259,6 +256,12 @@
                0                   is_replied_timely_
         FROM course_schedule_student_payment sa
         WHERE sa.course_schedule_id_ = #{courseScheduleID}
+        <if test="userIdList != null and userIdList.size > 0">
+            AND sa.user_id_ IN
+            <foreach collection="userIdList" open="(" close=")" separator="," item="userId">
+                #{userId}
+            </foreach>
+        </if>
     </select>
     <select id="findByCourseSchedule" resultMap="StudentCourseHomework">
         SELECT

+ 42 - 10
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -476,16 +476,20 @@
 
 	<select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_
-		WHERE monday_=#{monday}
-		  <if test="teacherId!=null">
-			  AND teacher_id_=#{teacherId}
-		  </if>
-		  <if test="studentIds!=null and studentIds.size()>0">
-			  AND student_id_ IN
-			  <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
-				  #{studentId}
-			  </foreach>
-		  </if>
+		<where>
+			<if test="monday != null and monday != ''">
+				AND monday_ = #{monday}
+			</if>
+			<if test="teacherId!=null">
+				AND teacher_id_=#{teacherId}
+			</if>
+			<if test="studentIds!=null and studentIds.size()>0">
+				AND student_id_ IN
+				<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+					#{studentId}
+				</foreach>
+			</if>
+		</where>
 	</select>
     <select id="findTeacherNoStartServices" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE teacher_id_=#{teacherId} AND actual_exercises_num_&lt;=0 AND serve_type_='HOMEWORK';
@@ -717,4 +721,32 @@
 		</foreach>
 		GROUP BY sees.monday_
 	</select>
+
+	<select id="queryCourseIdByClassDate" resultType="java.lang.Long">
+		SELECT DISTINCT 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_
+		WHERE csts.user_id_ = #{teacherId} AND cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth}
+		AND FIND_IN_SET(cs.id_,se.course_ids_) AND se.serve_type_ = 'HOMEWORK'
+	</select>
+
+	<select id="countWaitCreateHomeworkNum" resultType="java.lang.Integer">
+		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE teacher_id_ = #{teacherId}
+		AND expect_exercises_num_ > actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN monday_ AND sunday_
+		AND serve_type_ = 'EXERCISE'
+	</select>
+	<select id="countWaitCreateHomeworkNum1" resultType="java.lang.Integer">
+		SELECT SUM(t.num_) FROM (
+		SELECT COUNT(se.id_) num_ FROM student_extracurricular_exercises_situation_ se
+		LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_,se.course_ids_)
+		WHERE se.teacher_id_ = #{teacherId}
+		AND se.expect_exercises_num_ > se.actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+		AND se.serve_type_ = 'HOMEWORK' AND cs.group_type_ = 'MUSIC' AND cs.class_date_ = DATE_FORMAT(NOW(), '%Y-%m-%d')
+		UNION ALL
+		SELECT COUNT(se.id_) num_ FROM student_extracurricular_exercises_situation_ se
+		LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_,se.course_ids_)
+		WHERE se.teacher_id_ = #{teacherId}
+		AND se.expect_exercises_num_ > se.actual_exercises_num_ AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+		AND se.serve_type_ = 'HOMEWORK' AND cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d'))t
+	</select>
 </mapper>

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

@@ -592,8 +592,8 @@
         <result column="member_rank_setting_id_" property="memberRankSettingId"/>
     </resultMap>
     <select id="queryMusicGroupStudent" resultMap="MusicGroupStudentsDto">
-        SELECT sr.id_ student_registration_id_,sr.user_id_,su.username_ real_name_,su.gender_,su.phone_ parents_phone_,sr.current_grade_,sr.current_grade_date_,
-        sr.current_class_,sr.music_group_status_ student_status_,sr.payment_status_,sr.subject_id_ reg_subject_id_,rs.name_ regSubjectName,sr.remark_,
+        SELECT sr.id_ student_registration_id_,sr.user_id_,su.username_ real_name_,su.gender_,su.phone_ parents_phone_,stu.current_grade_num_ current_grade_,sr.current_grade_date_,
+        stu.current_class_,sr.music_group_status_ student_status_,sr.payment_status_,sr.subject_id_ reg_subject_id_,rs.name_ regSubjectName,sr.remark_,
         sr.actual_subject_id_ subject_id_,s.name_ subject_name_,sr.music_group_id_,CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END isActive_,
         IF(DATE_FORMAT(sr.create_time_,'%Y-%m-%d') > DATE_FORMAT(mg.payment_expire_date_,'%Y-%m-%d'),1,0) is_new_student_,
         stu.care_package_,stu.come_on_package_,sr.create_time_ registerTime,
@@ -625,6 +625,7 @@
         LEFT JOIN sys_user su ON sr.user_id_ = su.id_
         LEFT JOIN `subject` s ON s.id_ = sr.actual_subject_id_
         LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+        LEFT JOIN student stu ON sr.user_id_ = stu.user_id_
         <if test="classGroupId != null">
             LEFT JOIN class_group_student_mapper cgsm ON cgsm.music_group_id_ = sr.music_group_id_
         </if>

+ 78 - 25
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -1048,7 +1048,8 @@
             COUNT(DISTINCT smcr.behavior_id_) cloudStudyUseNum,
             SUM(CASE WHEN smcr.play_time_ IS NULL THEN 0 ELSE play_time_ END) cloudStudyUseTime,
             COUNT(DISTINCT DATE(smcr.create_time_)) cloudStudyUseDays,
-            stu.membership_end_time_ membershipEndTime
+            stu.membership_end_time_ membershipEndTime,
+            stu.current_grade_num_ currentGradeNum,stu.current_class_ currentClass,stu.count_flag_ countFlag
         FROM (SELECT DISTINCT t1.user_id_ FROM ((
                 SELECT
                 sr.user_id_
@@ -1220,6 +1221,27 @@
     <select id="getValidVipStudentIds" resultType="java.lang.Integer">
         SELECT user_id_ FROM student WHERE member_rank_setting_id_ IS NOT NULl OR experience_member_rank_setting_id_ IS NOT NULL
     </select>
+    <select id="countCourseStudentMemberNum" resultType="java.util.Map">
+        SELECT cssp.course_schedule_id_ 'key',COUNT(CASE WHEN s.member_rank_setting_id_ IS NULL THEN NULL ELSE 1 END) 'value'
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN student s ON s.user_id_ = cssp.user_id_
+        WHERE cssp.course_schedule_id_ IN
+        <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
+            #{courseId}
+        </foreach>
+        GROUP BY cssp.course_schedule_id_
+    </select>
+    <select id="countCourseStudentSubjectName" resultType="java.util.Map">
+        SELECT cssp.course_schedule_id_ 'key',GROUP_CONCAT(DISTINCT st.name_) 'value'
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN student s ON s.user_id_ = cssp.user_id_
+        LEFT JOIN `subject` st ON st.id_ = s.subject_id_list_
+        WHERE cssp.course_schedule_id_ IN
+        <foreach collection="courseIds" item="courseId" open="(" close=")" separator=",">
+            #{courseId}
+        </foreach>
+        GROUP BY cssp.course_schedule_id_
+    </select>
     <select id="getStudentByHasCourse" resultType="java.lang.Integer">
         SELECT s.user_id_ FROM student s WHERE s.teacher_id_ = #{teacherId} AND s.user_id_ IN (SELECT t.user_id_ FROM (
         (SELECT sr.user_id_
@@ -1236,6 +1258,19 @@
         AND cs.status_='NOT_START'))t)
     </select>
 
+    <select id="getStudentCooperationNameMap" resultType="java.util.Map">
+        SELECT stu.user_id_ 'key',co.name_ 'value'
+        FROM student stu
+        LEFT JOIN cooperation_organ co ON stu.cooperation_organ_id_=co.id_
+        WHERE 1=1
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND stu.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1
@@ -1284,29 +1319,47 @@
     </update>
     <update id="remarkCountFlag">
         UPDATE student SET count_flag_ = 1 WHERE user_id_ IN (
-        SELECT * FROM (
-        SELECT DISTINCT user_id_
-        FROM ((SELECT sr.user_id_
-        FROM student_registration sr
-        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
-        WHERE mg.status_='PROGRESS'
-        AND sr.music_group_status_='NORMAL')
-        UNION ALL
-        (SELECT
-        cssp.user_id_
-        FROM
-        course_schedule_student_payment cssp
-        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
-        WHERE
-        cssp.group_type_ IN ('VIP', 'PRACTICE')
-        AND cs.status_='NOT_START')) t
-        LEFT JOIN sys_user su ON t.user_id_=su.id_
-        WHERE su.del_flag_=0 AND t.user_id_ NOT IN (SELECT user_id_ FROM student WHERE subject_id_list_ REGEXP '21|25|26|27|28|29'))c)
-        <if test="studentIds != null and studentIds.size > 0">
-            AND user_id_ NOT IN
-            <foreach collection="studentIds" separator="," item="userId" open="(" close=")">
-                #{userId}
-            </foreach>
-        </if>
+
+        SELECT t.user_id_ FROM (SELECT DISTINCT sr.user_id_ FROM student_registration sr
+        LEFT JOIN sys_user su  ON sr.user_id_ = su.id_
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        -- 新用户
+        WHERE su.id_ NOT IN (SELECT DISTINCT(sr.`user_id_`) FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        LEFT JOIN course_schedule cs on cs.`music_group_id_` = mg.`id_` AND cs.`group_type_` = 'MUSIC' AND cs.`status_` = 'OVER' AND cs.del_flag_ = 0
+        LEFT JOIN `course_schedule_student_payment` cssp on cssp.`course_schedule_id_` = cs.`id_` AND sr.user_id_ = cssp.user_id_
+        WHERE mg.`status_` = 'PROGRESS' AND sr.music_group_status_ = 'NORMAL'
+        GROUP BY sr.`user_id_` HAVING COUNT(cssp.`id_`) &lt;= 4)
+        -- 			非管乐
+        AND su.id_ NOT IN (SELECT user_id_ FROM student WHERE subject_id_list_ REGEXP '21|25|26|27|28|29')
+        -- 			声部排除
+        AND su.organ_id_ NOT IN (36,38,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56,63,2,27,22,24)
+        -- 			购买了云教练
+        AND su.id_ NOT IN (SELECT DISTINCT student_id_ FROM cloud_teacher_order WHERE active_remark_ IS NULL AND status_ != 0)
+        -- 			未退团,不是会员团
+        AND su.id_ NOT IN (SELECT DISTINCT sr.user_id_ FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE sr.music_group_status_ != 'QUIT' AND mg.course_view_type_ = 2 AND mg.status_ NOT IN ('CANCELED','CLOSE'))
+        -- 去掉部分非目标学员
+        AND mg.id_ NOT IN ('21062318002900001','20792','21082414270900001','21060314253100001')
+        -- 去掉部分非目标学员
+        AND sr.user_id_ NOT IN (2127770,2127771,2127772,2127773,2127774,2127775,2127776,2127777,
+                              2127778,2127779,2127780,2127781,2127782,2127783,2127784,2127785,2127786,2127787,2127788,
+                              2127789,2127790,2127791,2127792,2127793,2127794,2127795,2127796,2127797,2127798,2127799,
+                              2127800,2127801,2127802,2127803,2127804,2127805,2127806,2127807,2127808,2127809,2127810,
+                              2127811,2127812,2127813,2127814,2127815,2127816,2127817,
+                              2122083,2122084,2122085,2122088,2122090,2122092,2122399,2122567,2122577,2122584,2122847,
+                              2122892,2122893,2122894,2122896,2122898,2122899,2122901,2122902,2122903,2122951,2122953,
+                              2122958,2122962,2122964,2122965,2123157,2123169,2123176,2123187,2123190,2123192,2123201,
+                              2123232,2123304,2125139,2125142,2125145,2125147,2125148,2125151,2125152,2125165,2125168,2125197,2125198,
+                              2132340,2132341,2132342,2132343,2132344,2132345,2132347,2132348,2132349,2132350,2132351,2132352,2132353,
+                              2132354,2132355,2132356,2132357,2132362,2132365,2132366,2132368,2132374,2132375,2132377,2132386,2132387,
+                              2132388,2132390,2132391,2132392,2132394,2132395,2132396,2132400,2132401,2132403,2132405,2132407,2132408,
+                              2132411,2132413,2132414,2132415,2132417,2132418,2132419,2132423,2132424,2132425,2132431,2132434,2132435,
+                              2132436,2132437,2132438,2132440,2132441,2132443,2132444,2132445,2132446,2132447,2132448,2132449,2132452,
+                              2132454,2132457,2132459,2132461,2135865)
+
+        AND sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ != 2 AND mg.`status_` = 'PROGRESS'
+        GROUP BY sr.user_id_)t)
     </update>
 </mapper>

Some files were not shown because too many files changed in this diff