소스 검색

Merge branch 'test'

Joburgess 4 년 전
부모
커밋
cdd14a137c
48개의 변경된 파일1260개의 추가작업 그리고 180개의 파일을 삭제
  1. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentMusicScoreDao.java
  2. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  7. 57 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java
  8. 132 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentMusicScore.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/IndexErrInfoDto.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexErrorType.java
  11. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  13. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentMusicScoreService.java
  14. 89 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  15. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  16. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  17. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentMusicScoreServiceImpl.java
  18. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  19. 25 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  20. 41 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  21. 12 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  22. 11 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  23. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  24. 25 3
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  25. 25 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  26. 8 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  27. 140 0
      mec-biz/src/main/resources/config/mybatis/courseScheduleStudentMusicScoreMapper.xml
  28. 7 7
      mec-common/audit-log/pom.xml
  29. 2 2
      mec-gateway/mec-gateway-web/src/main/resources/bootstrap-test.properties
  30. 26 34
      mec-im/src/main/java/com/ym/controller/RoomController.java
  31. 0 3
      mec-im/src/main/java/com/ym/mec/im/BaseMessage.java
  32. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/DeviceStateChangedMessage.java
  33. 43 0
      mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadMessageMessage.java
  34. 25 0
      mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadStatusMessage.java
  35. 2 3
      mec-im/src/main/java/com/ym/pojo/DeviceTypeEnum.java
  36. 49 0
      mec-im/src/main/java/com/ym/pojo/MusicScoreData.java
  37. 153 0
      mec-im/src/main/java/com/ym/pojo/MusicScoreMessage.java
  38. 14 3
      mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java
  39. 7 1
      mec-im/src/main/java/com/ym/pojo/RoomResult.java
  40. 185 46
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  41. 16 3
      mec-im/src/main/java/com/ym/service/RoomService.java
  42. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  43. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  44. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreAccompanimentController.java
  45. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  46. 2 5
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  47. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  48. 2 5
      mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentMusicScoreDao.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CourseScheduleStudentMusicScoreDao extends BaseDAO<Integer, CourseScheduleStudentMusicScore> {
+
+    int updateByMusicScore(CourseScheduleStudentMusicScore courseScheduleStudentMusicScore);
+
+    List<CourseScheduleStudentMusicScore> queryByScoreIdAndCourseId(@Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId,
+                                                                    @Param("courseId") Long courseId,
+                                                                    @Param("userId") Integer userId,
+                                                                    @Param("downStatus") Integer downStatus,
+                                                                    @Param("userType") Integer userType);
+
+    int batchInsert(@Param("scheduleStudentMusicScores") List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores);
+
+    /**
+     * 关闭所有伴奏的播放
+     * @param scheduleId
+     * @param userId
+     */
+    void closePlayStatus(@Param("scheduleId") long scheduleId, @Param("userId") Integer userId, @Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId);
+
+    /**
+     * 开启原音播放
+     * @param scheduleId
+     * @param musicScoreAccompanimentId
+     * @return
+     */
+    int openPlayStatus(@Param("scheduleId") long scheduleId,@Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId);
+
+    /**
+     * 开启伴奏播放
+     * @param scheduleId
+     * @param musicScoreAccompanimentId
+     * @return
+     */
+    int openAccompanimentPlayStatus(@Param("scheduleId") long scheduleId, @Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId);
+}

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -148,6 +149,8 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
 
     int queryErrInspection(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime);
 
+    IndexErrInfoDto getNoClassMusicGroupStudentInfo(@Param("organIds") Set<Integer> organIds);
+
     int countNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds);
     List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds);
 

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

@@ -375,4 +375,6 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      * @return
      */
     List<MusicGroup> getMusicGroupByIds(@Param("ids") List<String> ids);
+
+    List<String> getNoClassStudentMusicGroupIds(@Param("organIds") List<Integer> organIds);
 }

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

@@ -337,4 +337,11 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
      * @return
      */
     List<MusicGroupPaymentCalender> getMusicGroupCalenderBatchNoByIds(@Param("ids") List<String> ids);
+
+    /**
+     * 获取缴费状态在审核中或者已拒绝的缴费项目的学员
+     * @param musicGroupId
+     * @return
+     */
+    String queryCalenderStudentIds(@Param("musicGroupId") String musicGroupId, @Param("batchNo") String batchNo);
 }

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

@@ -7,6 +7,8 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
+import java.util.List;
+
 public interface SysMusicScoreCategoriesDao extends BaseDAO<Integer, SysMusicScoreCategories> {
 
     List<SysMusicScoreCategories> findByParentId(@Param("parentId") Integer parentId);

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

@@ -70,6 +70,17 @@ public class ClassGroup4MixDto implements Cloneable{
     @ApiModelProperty(value = "是否允许0课酬")
     private Boolean allowZeroSalary = false;
 
+    @ApiModelProperty(value = "确认生成课程")
+    private Boolean confirmGenerate;
+
+    public Boolean getConfirmGenerate() {
+        return confirmGenerate;
+    }
+
+    public void setConfirmGenerate(Boolean confirmGenerate) {
+        this.confirmGenerate = confirmGenerate;
+    }
+
     public Boolean getAllowZeroSalary() {
         return allowZeroSalary;
     }

+ 57 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.dal.dto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Date;
+
 public class CourseTimeDto {
 
 
@@ -12,12 +14,35 @@ public class CourseTimeDto {
     @ApiModelProperty(value = "排课星期几")
     private Integer dayOfWeek;
 
+    @ApiModelProperty(value = "开始排课日期,如果有值,则单独循环")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束排课日期")
+    private Date endDate;
+
     @ApiModelProperty(value = "上课开始时间")
     private String startClassTime;
 
     @ApiModelProperty(value = "上课结束时间")
     private String endClassTime;
 
+    @ApiModelProperty(value = "预计排课次数")
+    private int expectCourseNum;
+
+    @ApiModelProperty(value = "已生成课程数量")
+    private int courseNum;
+
+    @ApiModelProperty(value = "是否跳过节假日 true-跳过 false-不跳过", required = true)
+    private Boolean isHoliday = false;
+
+    public Boolean getHoliday() {
+        return isHoliday;
+    }
+
+    public void setHoliday(Boolean holiday) {
+        isHoliday = holiday;
+    }
+
     public CourseSchedule.CourseScheduleType getCourseType() {
         return courseType;
     }
@@ -26,6 +51,22 @@ public class CourseTimeDto {
         this.courseType = courseType;
     }
 
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(Date startDate) {
+        this.startDate = startDate;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
     public Integer getDayOfWeek() {
         return dayOfWeek;
     }
@@ -49,4 +90,20 @@ public class CourseTimeDto {
     public void setEndClassTime(String endClassTime) {
         this.endClassTime = endClassTime;
     }
+
+    public int getExpectCourseNum() {
+        return expectCourseNum;
+    }
+
+    public void setExpectCourseNum(int expectCourseNum) {
+        this.expectCourseNum = expectCourseNum;
+    }
+
+    public int getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(int courseNum) {
+        this.courseNum = courseNum;
+    }
 }

+ 132 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentMusicScore.java

@@ -0,0 +1,132 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.util.Date;
+
+public class CourseScheduleStudentMusicScore {
+    private Integer id;
+    private Long courseScheduleId;
+    private Integer downStatus = 0;
+    private Integer userId;
+    private Integer userType = 0;
+    private Integer musicScoreAccompanimentId;
+    private Integer playStatus = 0;
+    private Integer accompanimentPlayStatus = 0;
+    private Integer speed;
+    private String mp3Url;
+    private String url;
+    private String musicScoreName;
+    private Date createTime;
+    private Date updateTime;
+
+    public Integer getAccompanimentPlayStatus() {
+        return accompanimentPlayStatus;
+    }
+
+    public void setAccompanimentPlayStatus(Integer accompanimentPlayStatus) {
+        this.accompanimentPlayStatus = accompanimentPlayStatus;
+    }
+
+    public String getMp3Url() {
+        return mp3Url;
+    }
+
+    public void setMp3Url(String mp3Url) {
+        this.mp3Url = mp3Url;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMusicScoreName() {
+        return musicScoreName;
+    }
+
+    public void setMusicScoreName(String musicScoreName) {
+        this.musicScoreName = musicScoreName;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDownStatus() {
+        return downStatus;
+    }
+
+    public void setDownStatus(Integer downStatus) {
+        this.downStatus = downStatus;
+    }
+
+    public Integer getMusicScoreAccompanimentId() {
+        return musicScoreAccompanimentId;
+    }
+
+    public void setMusicScoreAccompanimentId(Integer musicScoreAccompanimentId) {
+        this.musicScoreAccompanimentId = musicScoreAccompanimentId;
+    }
+
+    public Integer getPlayStatus() {
+        return playStatus;
+    }
+
+    public void setPlayStatus(Integer playStatus) {
+        this.playStatus = playStatus;
+    }
+
+    public Integer getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(Integer speed) {
+        this.speed = speed;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

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

@@ -17,6 +17,8 @@ public class IndexErrInfoDto<T> {
 
     private int num = 0;
 
+    private int num2 = 0;
+
     private List<T> result;
 
     public IndexErrInfoDto() {
@@ -62,6 +64,14 @@ public class IndexErrInfoDto<T> {
         this.num = num;
     }
 
+    public int getNum2() {
+        return num2;
+    }
+
+    public void setNum2(int num2) {
+        this.num2 = num2;
+    }
+
     public List<T> getResult() {
         return result;
     }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexErrorType.java

@@ -10,6 +10,7 @@ public enum IndexErrorType implements BaseEnum<String, IndexErrorType> {
     MUSIC_PATROL("MUSIC_PATROL", "乐团巡查"),
     HIGH_CLASS_STUDENT_LESS_THAN_THREE("HIGH_CLASS_STUDENT_LESS_THAN_THREE", "基础技能班学员数量异常"),
     MUSIC_PATROL_ITEM("MUSIC_PATROL_ITEM", "乐团巡查事项异常"),
+    NO_CLASS_MUSIC_GROUP_STUDENT_INFO("NO_CLASS_MUSIC_GROUP_STUDENT_INFO", "当前有{}个乐团共{}名学员未加入任何班级"),
 
     STUDENT_INFO("STUDENT_INFO", "学员处理"),
     STUDENT_NOT_PAYMENT("STUDENT_NOT_PAYMENT", "未缴费学员数"),

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

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.List;
+
 public class MusicGroupQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "所属分部编号",required = false)
@@ -26,6 +28,26 @@ public class MusicGroupQueryInfo extends QueryInfo {
 
     private MusicGroupStatusEnum status;
 
+    private Boolean noClassStudentMusicGroup;
+
+    private List<String> musicGroupIds;
+
+    public List<String> getMusicGroupIds() {
+        return musicGroupIds;
+    }
+
+    public void setMusicGroupIds(List<String> musicGroupIds) {
+        this.musicGroupIds = musicGroupIds;
+    }
+
+    public Boolean getNoClassStudentMusicGroup() {
+        return noClassStudentMusicGroup;
+    }
+
+    public void setNoClassStudentMusicGroup(Boolean noClassStudentMusicGroup) {
+        this.noClassStudentMusicGroup = noClassStudentMusicGroup;
+    }
+
     public MusicGroupStatusEnum getStatus() {
         return status;
     }

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

@@ -260,7 +260,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @Date: 2019/9/24
 	 * 课程交换
 	 */
-	void courseSwap(Long courseScheduleId1, Long courseScheduleId2, Boolean allowZeroSalary);
+	void courseSwap(Long courseScheduleId1, Long courseScheduleId2);
 
 	/**
 	 * @Author: Joburgess

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
+import com.ym.mec.common.service.BaseService;
+
+public interface CourseScheduleStudentMusicScoreService extends BaseService<Integer, CourseScheduleStudentMusicScore> {
+
+}

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

@@ -168,6 +168,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
     private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -2292,6 +2294,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("班级不存在");
         }
 
+        Boolean confirmGenerate = false;
+        if(Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())){
+            confirmGenerate = classGroup4MixDtos.get(0).getConfirmGenerate();
+        }
+
         TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
         if (classGroup.getType().equals(HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.MUSIC_NETWORK)) {
             teachMode = TeachModeEnum.ONLINE;
@@ -2364,10 +2371,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
         }
 
-        List<Integer> allTeacherIds = newClassGroupTeacherMapperList.stream()
-                .map(ClassGroupTeacherMapper::getUserId)
-                .collect(Collectors.toList());
-
         Set<String> newTeacher = newClassGroupTeacherMapperList.stream().map(
                 classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId()
         ).collect(Collectors.toSet());
@@ -2397,7 +2400,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
             //3、插入班级排课信息
-            LocalDateTime now = LocalDate.parse(classGroup4MixDto.getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
+            LocalDateTime now = LocalDateTime.now();
 
             if (!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())) {
                 throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
@@ -2409,39 +2412,68 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
             }
 
+            int totalCourseTimes = 0;
+            int generateCourseTimes = 0;
+            if(!CollectionUtils.isEmpty(classGroup4MixDto.getCourseTimeDtoList())){
+                totalCourseTimes = classGroup4MixDto.getCourseTimeDtoList().stream().mapToInt(CourseTimeDto::getExpectCourseNum).reduce(0, Integer::sum);
+            }
+
             Set<String> holidayDays = new HashSet<>();
-            if (classGroup4MixDto.getHoliday()) {
-                SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
-                if (Objects.nonNull(holidaySetting) && StringUtils.isNotBlank(holidaySetting.getParanValue())) {
-                    holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
-                }
+            SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+            if (Objects.nonNull(holidaySetting) && StringUtils.isNotBlank(holidaySetting.getParanValue())) {
+                holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
             }
 
             WhileNode:
             while (true) {
-                if (classGroup4MixDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
-                    now = now.plusDays(1);
-                    continue;
-                }
                 int dayOfWeek = now.getDayOfWeek().getValue();
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
                     if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
                         throw new BizException("排课循环周期错误,请核查");
                     }
+                    if(Objects.isNull(courseTimeDto.getStartDate())||Objects.isNull(courseTimeDto.getEndDate())){
+                        throw new BizException("排课循环周期错误,请核查");
+                    }
+
+                    //跳过节假日
+                    if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+                        continue;
+                    }
+
                     if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
 
+                    Date classDate = DateConvertor.toDate(now);
+
+                    if(courseTimeDto.getStartDate().compareTo(classDate)>0
+                            ||courseTimeDto.getEndDate().compareTo(classDate)<0
+                            ||courseTimeDto.getExpectCourseNum()<=courseTimeDto.getCourseNum()){
+                        if(courseTimeDto.getEndDate().compareTo(classDate)<0&&courseTimeDto.getExpectCourseNum()>courseTimeDto.getCourseNum()){
+                            throw new BizException("在指定的排课时间段内({}-{})无法完成预计课时数的排课", DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy.MM.dd"), DateUtil.dateToString(courseTimeDto.getEndDate(), "yyyy.MM.dd"));
+                        }
+                        if(totalCourseTimes<=generateCourseTimes){
+                            break WhileNode;
+                        }
+                        continue;
+                    }
+
                     //课时长度
-                    long classCourseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                    long classCourseDuration = Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
+                            LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
 
-                    if (totalCourseDuration > totalMinutes) {
+//                    if (totalCourseDuration > totalMinutes) {
+//                        break WhileNode;
+//                    }
+
+                    courseTimeDto.setCourseNum(courseTimeDto.getCourseNum()+1);
+                    generateCourseTimes+=1;
+
+                    if(totalCourseTimes<generateCourseTimes){
                         break WhileNode;
                     }
 
-                    Date classDate = DateConvertor.toDate(now);
                     String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
                     String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
 
@@ -2451,6 +2483,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseSchedule.setStatus(CourseStatusEnum.NOT_START);
                     courseSchedule.setClassDate(classDate);
                     courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+                    if(date.compareTo(courseSchedule.getStartClassTime())>0){
+                        throw new BizException("课程开始时间不得早于当前时间");
+                    }
                     courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
                     courseSchedule.setCreateTime(date);
                     courseSchedule.setUpdateTime(date);
@@ -2482,19 +2517,28 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         courseScheduleTeacherSalary.setUpdateTime(date);
                         courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
                         courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-                        if(!classGroup4MixDto.getAllowZeroSalary()&&BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary())==0){
+                        if(!confirmGenerate&&!classGroup4MixDto.getAllowZeroSalary()&&BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary())==0){
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                            return BaseController.failed(HttpStatus.PARTIAL_CONTENT,"当前课程课酬预计为0,是否继续");
+                            return BaseController.failed(HttpStatus.MULTI_STATUS,"当前课程课酬预计为0,是否继续");
                         }
                     }
                 }
 
                 now = now.plusDays(1);
             }
+
+            if (totalCourseDuration > totalMinutes) {
+                throw new BizException("课程时长不足");
+            }
         }
 
         courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
 
+        if(!confirmGenerate){
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return BaseController.failed(HttpStatus.PARTIAL_CONTENT, courseScheduleList, "");
+        }
+
         //老师结算表
         if (courseScheduleTeacherSalaryList.size() > 0) {
             courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
@@ -3483,9 +3527,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (CollectionUtils.isEmpty(studentIds)) {
             throw new BizException("学员列表不可为空");
         }
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
 
         MusicGroup musicGroup = musicGroupDao.findByClassGroupId(classGroupIds.get(0));
+        //获取欠费学员列表
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), new ArrayList<>(studentIds));
+        if(noPaymentUserIds.size() > 0){
+            throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+        }
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        String studentId = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(),null);
+        if(StringUtils.isNotEmpty(studentId)){
+            for (Integer integer : studentIds) {
+                if(studentId.contains(integer.toString())){
+                    throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+                }
+            }
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+
         //生成缴费记录,同一个批次
         MusicGroupPaymentCalender.PaymentCalenderStatusEnum status = null;
         List<MusicGroupPaymentCalenderDto> paymentCalenderDtos = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos();
@@ -3870,6 +3929,15 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 studentIds);
         //创建缴费项目
         MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        String studentId = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(),null);
+        if(StringUtils.isNotEmpty(studentId)){
+            for (Integer integer : studentIds) {
+                if(studentId.contains(integer.toString())){
+                    throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+                }
+            }
+        }
         BigDecimal masterTotalPrice = getMasterTotalPrice(masterClassGroupId);
         //是否有需要审核的缴费项目
         List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = paymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();

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

@@ -477,6 +477,14 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         addStudentIds = allStudentIds.stream().filter(id -> !repeatStudentIds.contains(id)).collect(Collectors.toSet());
         removeStudentIds = oldNormalStudentIds.stream().filter(id -> !repeatStudentIds.contains(id)).collect(Collectors.toSet());
 
+        //未开始的课程
+        List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.findCoursesByClassGroupId(classGroupId.intValue(), CourseStatusEnum.NOT_START);
+
+        //有未开始的课程不能删除学生
+        if(!CollectionUtils.isEmpty(removeStudentIds) && !CollectionUtils.isEmpty(classGroupNotStartCourse)){
+            throw new BizException("班级有未上完的课程,不能删除学生");
+        }
+
         List<ClassGroupStudentMapper> needUpdateClassGroupStudents = new ArrayList<>();
 
         for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
@@ -516,7 +524,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
         classGroupService.updateClassStudentNum(classGroupId.intValue(), allStudentIds.size());
 
-        List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.findCoursesByClassGroupId(classGroupId.intValue(), CourseStatusEnum.NOT_START);
         if (CollectionUtils.isEmpty(classGroupNotStartCourse)) {
             if (!CollectionUtils.isEmpty(addStudentIds)) {
                 if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){

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

@@ -3721,7 +3721,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void courseSwap(Long courseScheduleId1, Long courseScheduleId2, Boolean allowZeroSalary) {
+    public void courseSwap(Long courseScheduleId1, Long courseScheduleId2) {
         if (courseScheduleId1.equals(courseScheduleId2)) {
             throw new BizException("请选择不同的课程");
         }
@@ -3754,7 +3754,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<CourseSchedule> courseSchedules = new ArrayList<>();
         courseSchedules.add(courseSchedule1);
         courseSchedules.add(courseSchedule2);
-        courseAdjust(courseSchedules, allowZeroSalary);
+        courseAdjust(courseSchedules, true);
     }
 
     @Override

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentMusicScoreServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentMusicScoreDao;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
+import com.ym.mec.biz.service.CourseScheduleStudentMusicScoreService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CourseScheduleStudentMusicScoreServiceImpl extends BaseServiceImpl<Integer, CourseScheduleStudentMusicScore>  implements CourseScheduleStudentMusicScoreService {
+	
+	@Autowired
+	private CourseScheduleStudentMusicScoreDao courseScheduleStudentMusicScoreDao;
+
+	@Override
+	public BaseDAO<Integer, CourseScheduleStudentMusicScore> getDAO() {
+		return courseScheduleStudentMusicScoreDao;
+	}
+
+}

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

@@ -299,6 +299,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			int errInspection = indexBaseMonthDataDao.queryErrInspection(organIds,startTime);
 			oneChild.add(new IndexErrInfoDto(IndexErrorType.MUSIC_PATROL_ITEM, IndexErrorType.MUSIC_PATROL_ITEM.getMsg(),errInspection, null));
 
+			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds);
+			noClassMusicGroupStudentInfo.setDesc(IndexErrorType.NO_CLASS_MUSIC_GROUP_STUDENT_INFO.getMsg());
+			oneChild.add(noClassMusicGroupStudentInfo);
+
 			one.setNum(oneChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			one.setResult(oneChild);
 			all.add(one);
@@ -441,6 +445,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				flag1 = true;
 			}
 		}
+		if(!flag1){
+			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds);
+			if(Objects.nonNull(noClassMusicGroupStudentInfo) && noClassMusicGroupStudentInfo.getNum() > 0){
+				flag1 = true;
+			}
+		}
 		resultMap.put("musicPatrol",flag1);
 		boolean flag2 = false;
 		if(!flag2){

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

@@ -425,7 +425,31 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 	public void batchAdd(String batchNo, Set<Integer> userIdList) {
 		
 		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		
+		if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0){
+			throw new BizException("操作失败:缴费项目不存在");
+		}
+		String musicGroupId = musicGroupPaymentCalenderList.get(0).getMusicGroupId();
+		// 所有缴费项目已完成排课才能创建下一个缴费项目
+		List<String> batchNoList = new ArrayList<>();
+		batchNoList.add(batchNo);
+		String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,batchNoList);
+		if (StringUtils.isNoneBlank(orignBatchNo)) {
+			throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+		}
+		//获取欠费学员列表
+		List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList));
+		if(noPaymentUserIds.size() > 0){
+			throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+		}
+		//获取缴费状态在审核中或者已拒绝的缴费项目的学员
+		String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,batchNo);
+		if(StringUtils.isNotEmpty(studentIds)){
+			for (Integer integer : userIdList) {
+				if(studentIds.contains(integer.toString())){
+					throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+				}
+			}
+		}
 		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
 		
 		Long musicGroupPaymentCalenderId = null;

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

@@ -598,9 +598,24 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			}else if(paymentType == SPAN_GROUP_CLASS_ADJUST){
 				MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
 				//获取默认的学员缴费详情
-				List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
+				List<Integer> studentIdList = JSON.parseArray(adjust.getStudentIds(), Integer.class);
+				//获取欠费学员列表
+				List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), studentIdList);
+				if(noPaymentUserIds.size() > 0){
+					throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+				}
+				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
+				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,batchNo);
+				if(StringUtils.isNotEmpty(studentIds)){
+					for (Integer integer : studentIdList) {
+						if(studentIds.contains(integer.toString())){
+							throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+						}
+					}
+				}
+
 				List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = classGroupService.queryStudentPaymentCalenders(adjust.getMasterClassGroupId(),
-						adjust.getClassGroupStudents(),studentIds);
+						adjust.getClassGroupStudents(),studentIdList);
 				List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
 
 				boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
@@ -735,7 +750,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			// 设置批次号
 			musicGroupPaymentCalender.setBatchNo(batchNo);
 			musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
-
 			List<MusicGroupPaymentCalenderCourseSettings> currentMusicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalender
 					.getMusicGroupPaymentCalenderCourseSettingsList();
 
@@ -1130,6 +1144,30 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				}
 			}
 			MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
+			if(calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
+				// 所有缴费项目已完成排课才能创建下一个缴费项目
+				List<String> batchNoList = new ArrayList<>();
+				batchNoList.add(batchNo);
+				String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null,batchNoList);
+				if (StringUtils.isNoneBlank(orignBatchNo)) {
+					throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+				}
+				List<Integer> userIds = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+				//获取欠费学员列表
+				List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(),userIds);
+				if(noPaymentUserIds.size() > 0){
+					throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+				}
+				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
+				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(),batchNo);
+				if(StringUtils.isNotEmpty(studentIds)){
+					for (Integer integer : userIds) {
+						if(studentIds.contains(integer.toString())){
+							throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+						}
+					}
+				}
+			}
 			//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
 			if (calender.getPaymentType() == MUSIC_APPLY) {
 				//统计乐团还在审核中或者审核被拒的缴费

+ 12 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -6,20 +6,12 @@ import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.event.source.GroupEventSource;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -2342,6 +2334,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //获取用户权限列表
         List<Integer> roles = employeeDao.queryUserRole(sysUser.getId());
         PageInfo<MusicGroup> musicGroupPageInfo;
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganId())){
+            organIds = Arrays.stream(queryInfo.getOrganId().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+
+        if(Objects.nonNull(queryInfo.getNoClassStudentMusicGroup())){
+            List<String> noClassStudentMusicGroupIds = musicGroupDao.getNoClassStudentMusicGroupIds(organIds);
+            queryInfo.setMusicGroupIds(noClassStudentMusicGroupIds);
+        }
         if (roles != null && roles.size() == 1 && roles.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
             //只有教务老师权限
             /*String musicGroupIds = musicGroupDao.queryEducationalMusicGroupId(sysUser.getId());

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

@@ -20,10 +20,12 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.biz.event.source.GroupEventSource;
+import org.apache.commons.lang3.ArrayUtils;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.event.source.GroupEventSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.im.WebFeignService;
@@ -50,19 +52,6 @@ import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
 import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
-import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.GoodsType;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
-import com.ym.mec.biz.dal.enums.OrderTypeEnum;
-import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
-import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
-import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImResult;
@@ -233,7 +222,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     public StudentFeeDetailDto queryFeeDetail(Integer studentId, String musicGroupId) {
         StudentFeeDetailDto studentFeeDetailDto = new StudentFeeDetailDto();
         List<MusicalListDetailDto> musicalList = studentPaymentOrderDetailService.getMusicalListDetail(musicGroupId, studentId);
-        if(musicalList.size() <=0){
+        if (musicalList.size() <= 0) {
             return studentFeeDetailDto;
         }
         MusicalListDetailDto detailDto = musicalList.get(0);
@@ -346,7 +335,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         String studentGrade = studentService.getStudentGrade(organization.getGradeType(), studentRegistration.getCurrentGradeNum());
         studentRegistration.setCurrentGrade(studentGrade);
 
-        if(hasReg != null){
+        if (hasReg != null) {
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
             studentRegistration.setId(hasReg.getId());
             studentRegistrationDao.update(studentRegistration);
@@ -781,6 +770,12 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public void insertStudent(String studentIds, String oldMusicGroupId, String newMusicGroupId, Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect) {
+        //获取欠费学员列表
+        List<Integer> studentIdList = Arrays.asList(studentIds.split(",")).stream().mapToInt(idStr -> Integer.valueOf(idStr)).boxed().collect(Collectors.toList());
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(newMusicGroupId,studentIdList);
+        if(noPaymentUserIds.size() > 0){
+            throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+        }
         SysUser sysUser1 = sysUserFeignService.queryUserInfo();
         //获取旧乐团学员注册信息
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryByUserIdsAndMusicGroupId(studentIds, oldMusicGroupId);

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

@@ -2555,7 +2555,7 @@
             AND ta.teacher_id_ = cs.actual_teacher_id_
             AND cs.status_ = 'OVER'
             AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
-            AND (ta.dispose_content_ IS NOT NULL OR (ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL))
+            AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         </if>
         <if test="searchType == 'NO_ATTENDANCE'">

+ 25 - 3
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -465,9 +465,9 @@
 			AND m.class_date_ = #{dayStr}
 		</if>
 		GROUP BY
-		m.organ_id_
+			m.organ_id_
 		ORDER BY
-		m.organ_id_;
+			m.organ_id_;
 	</select>
 
 	<select id="getOtherStudentData" resultMap="IndexBaseMonthData">
@@ -747,7 +747,7 @@
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
 		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
-		AND (ta.dispose_content_ IS NOT NULL OR (ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL))
+		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
 		<if test="organIds != null and organIds.size()>0">
 			AND cs.organ_id_ IN
@@ -838,6 +838,28 @@
 			</foreach>
 		</if>
 	</select>
+
+	<select id="getNoClassMusicGroupStudentInfo" resultType="com.ym.mec.biz.dal.entity.IndexErrInfoDto">
+		SELECT
+			'NO_CLASS_MUSIC_GROUP_STUDENT_INFO' errorType,
+			COUNT( DISTINCT sr.music_group_id_ ) num,
+			COUNT( DISTINCT sr.user_id_ ) num2
+		FROM
+			student_registration sr
+				LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+				LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_
+		WHERE
+			sr.music_group_status_ = 'NORMAL'
+			AND mg.status_ = 'PROGRESS'
+			AND cgsm.id_ IS NULL
+			<if test="organIds!=null and organIds.size()>0">
+				AND mg.organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+	</select>
+
 	<select id="getFinancePayData"  resultMap="IndexBaseMonthData">
 		SELECT SUM(fe.amount_) total_num_,SUM(fe.amount_) activate_num_,SUM(fe.amount_) percent_,fe.organ_id_,#{dayStr} month_ FROM financial_expenditure fe
 		WHERE DATE_FORMAT(fe.create_time_,'%Y-%m-%d') = #{dayStr}

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

@@ -218,6 +218,12 @@
             <if test="musicGroupId != null">
                 AND FIND_IN_SET(id_,#{musicGroupId})
             </if>
+            <if test="musicGroupIds!=null and musicGroupIds.size()>0">
+                AND id_ IN
+                <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+                    #{musicGroupId}
+                </foreach>
+            </if>
         </where>
     </sql>
 
@@ -685,4 +691,23 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="getNoClassStudentMusicGroupIds" resultType="java.lang.String">
+        SELECT
+            DISTINCT sr.music_group_id_
+        FROM
+            student_registration sr
+            LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+            LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_
+        WHERE
+            sr.music_group_status_ = 'NORMAL'
+            AND mg.status_ = 'PROGRESS'
+            AND cgsm.id_ IS NULL
+            <if test="organIds!=null and organIds.size()>0">
+                AND mg.organ_id_ IN
+                <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                    #{organId}
+                </foreach>
+            </if>
+    </select>
 </mapper>

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

@@ -602,4 +602,12 @@
         AND batch_no_ IS NOT NULL
         GROUP BY music_group_id_,batch_no_
     </select>
+    <select id="queryCalenderStudentIds" resultType="java.lang.String">
+        SELECT GROUP_CONCAT(DISTINCT student_ids_) FROM music_group_payment_calender
+        WHERE status_ IN ('AUDITING','REJECT') AND music_group_id_ = #{musicGroupId}
+        <if test="batchNo != null and batchNo != ''">
+            AND batch_no_ != #{batchNo}
+        </if>
+
+    </select>
 </mapper>

+ 140 - 0
mec-biz/src/main/resources/config/mybatis/courseScheduleStudentMusicScoreMapper.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.CourseScheduleStudentMusicScoreDao">
+
+    <resultMap type="com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore" id="CourseScheduleStudentMusicScore">
+        <result column="id_" property="id"/>
+        <result column="course_schedule_id_" property="courseScheduleId"/>
+        <result column="user_id_" property="userId"/>
+        <result column="user_type_" property="userType"/>
+        <result column="down_status_" property="downStatus"/>
+        <result column="music_score_accompaniment_id_" property="musicScoreAccompanimentId"/>
+        <result column="play_status_" property="playStatus"/>
+        <result column="accompaniment_play_status_" property="accompanimentPlayStatus"/>
+        <result column="speed_" property="speed"/>
+        <result column="mp3_url_" property="mp3Url"/>
+        <result column="url_" property="url"/>
+        <result column="music_score_name_" property="musicScoreName"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+    </resultMap>
+
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="CourseScheduleStudentMusicScore">
+		SELECT * FROM course_schedule_student_music_score WHERE id_ = #{id}
+	</select>
+
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="CourseScheduleStudentMusicScore">
+		SELECT * FROM course_schedule_student_music_score ORDER BY id_
+	</select>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore" useGeneratedKeys="true" keyColumn="id"
+            keyProperty="id">
+        INSERT INTO course_schedule_student_music_score (course_schedule_id_,user_id_,user_type_,down_status_,music_score_accompaniment_id_,play_status_,accompaniment_play_status_,speed_,create_time_,update_time_)
+        VALUES(#{courseScheduleId},#{userId},#{userType},#{downStatus},#{musicScoreAccompanimentId},#{playStatus},#{accompanimentPlayStatus},#{speed},now(),now())
+    </insert>
+    <insert id="batchInsert">
+        INSERT INTO course_schedule_student_music_score (course_schedule_id_,user_id_,user_type_,down_status_,music_score_accompaniment_id_,play_status_,accompaniment_play_status_,speed_,create_time_,update_time_)
+        VALUE
+        <foreach collection="scheduleStudentMusicScores" item="item" separator=",">
+            (#{item.courseScheduleId},#{item.userId},#{item.userType},#{item.downStatus},#{item.musicScoreAccompanimentId},#{item.playStatus},#{item.accompanimentPlayStatus},#{item.speed},now(),now())
+        </foreach>
+    </insert>
+
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore">
+        UPDATE course_schedule_student_music_score
+        <set>
+            <if test="accompanimentPlayStatus != null">
+                accompaniment_play_status_ = #{accompanimentPlayStatus},
+            </if>
+            <if test="downStatus != null">
+                down_status_ = #{downStatus},
+            </if>
+            <if test="playStatus != null">
+                play_status_ = #{playStatus},
+            </if>
+            <if test="speed != null">
+                speed_ = #{speed},
+            </if>
+            update_time_ = NOW()
+        </set>
+        WHERE id_ = #{id}
+    </update>
+
+    <update id="updateByMusicScore" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore">
+        UPDATE course_schedule_student_music_score
+        SET down_status_ = #{downStatus},play_status_ = #{playStatus},speed_ = #{speed},update_time_ = NOW()
+        WHERE course_schedule_id_ = #{courseScheduleId}
+        <if test="userId">
+            AND user_id_ = #{userId}
+        </if>
+        <if test="musicScoreAccompanimentId">
+            AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+        </if>
+    </update>
+    <update id="closePlayStatus">
+        UPDATE course_schedule_student_music_score SET play_status_ = 0,accompaniment_play_status_ = 0,update_time_ = NOW()
+        WHERE course_schedule_id_ = #{scheduleId}
+        <if test="musicScoreAccompanimentId">
+            AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+        </if>
+        <if test="musicScoreAccompanimentId">
+            AND user_id_ = #{userId}
+        </if>
+    </update>
+    <update id="openPlayStatus">
+        UPDATE course_schedule_student_music_score SET play_status_ = 1,update_time_ = NOW()
+        WHERE course_schedule_id_ = #{scheduleId}
+        AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+    </update>
+    <update id="openAccompanimentPlayStatus">
+        UPDATE course_schedule_student_music_score SET accompaniment_play_status_ = 1,update_time_ = NOW()
+        WHERE course_schedule_id_ = #{scheduleId} AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+    </update>
+
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE FROM course_schedule_student_music_score WHERE id_ = #{id}
+	</delete>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="CourseScheduleStudentMusicScore" parameterType="map">
+        SELECT * FROM course_schedule_student_music_score
+        <include refid="global.limit" />
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM course_schedule_student_music_score
+	</select>
+    <select id="queryByScoreIdAndCourseId"
+            resultMap="CourseScheduleStudentMusicScore">
+        SELECT cssm.*,smsa.mp3_url_,sms.url_,sms.name_ music_score_name_  FROM course_schedule_student_music_score cssm
+        LEFT JOIN sys_music_score_accompaniment smsa ON cssm.music_score_accompaniment_id_ = smsa.id_
+        LEFT JOIN sys_music_score sms ON sms.id_ = smsa.exam_song_id_
+        <where>
+            <if test="courseId != null">
+                AND cssm.course_schedule_id_ = #{courseId}
+            </if>
+            <if test="musicScoreAccompanimentId != null">
+                AND cssm.music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+            </if>
+            <if test="userType != null">
+                AND cssm.user_type_ = #{userType}
+            </if>
+            <if test="userId != null">
+                AND cssm.user_id_ = #{userId}
+            </if>
+            <if test="downStatus != null">
+                AND cssm.down_status_ = #{downStatus}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 7 - 7
mec-common/audit-log/pom.xml

@@ -21,11 +21,11 @@
 			<groupId>com.yonge.mongodb</groupId>
 			<artifactId>mongo-db</artifactId>
 		</dependency>
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-annotations</artifactId>
-            <version>1.5.20</version>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
+		<dependency>
+			<groupId>io.swagger</groupId>
+			<artifactId>swagger-annotations</artifactId>
+			<version>1.5.20</version>
+			<scope>compile</scope>
+		</dependency>
+	</dependencies>
 </project>

+ 2 - 2
mec-gateway/mec-gateway-web/src/main/resources/bootstrap-test.properties

@@ -1,9 +1,9 @@
 #\u6307\u5b9a\u5f00\u53d1\u73af\u5883
 #spring.profiles.active=dev
 #\u670d\u52a1\u5668\u5730\u5740
-spring.cloud.nacos.config.server-addr=47.96.85.100:8848
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f9d46b0a-9847-48ae-8e4b-216c7a3eb466
+spring.cloud.nacos.config.namespace=f753d9d9-4bb2-4df6-a483-da9e169617c4
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 26 - 34
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -1,12 +1,15 @@
 package com.ym.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.ym.common.ApiException;
 import com.ym.common.BaseResponse;
 import com.ym.common.ErrorEnum;
 import com.ym.pojo.*;
 import com.ym.service.MessageService;
 import com.ym.service.RoomService;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -63,6 +66,13 @@ public class RoomController{
         return new BaseResponse<>();
     }
 
+    @ApiOperation(value = "老师通知学员下载伴奏")
+    @RequestMapping(value = "pushDownloadMusicScoreMsg", method = RequestMethod.POST)
+    public Object pushDownloadMusicScoreMsg(@RequestBody MusicScoreData musicScoreData) throws Exception {
+        roomService.pushDownloadMusicScoreMsg(musicScoreData);
+        return new BaseResponse<>();
+    }
+
     @RequestMapping(value = "joinRoomStatusNotify", method = RequestMethod.POST)
     public Object joinRoomStatusNotify(@RequestBody RoomStatusNotify roomStatusNotify) throws Exception {
         log.info("joinRoomStatusNotify: {}",JSONObject.toJSON(roomStatusNotify));
@@ -139,11 +149,12 @@ public class RoomController{
         return new BaseResponse<>(whiteboards);
     }
 
+    @ApiOperation(value = "通知学员打开,麦克风、摄像头等权限请求")
     @RequestMapping(value = "/device/approve", method = RequestMethod.POST)
     public Object approveControlDevice(@RequestBody ReqDeviceControlData data)
             throws Exception {
         boolean result;
-        result = roomService.approveControlDevice(data.getRoomId(), data.getTicket());
+        result = roomService.approveControlDevice(data);
         return new BaseResponse<>(result);
     }
 
@@ -155,26 +166,14 @@ public class RoomController{
         return new BaseResponse<>(result);
     }
 
+    @ApiOperation(value = "学员麦克风、摄像头等开关控制")
     @RequestMapping(value = "/device/control", method = RequestMethod.POST)
     public Object controlDevice(@RequestBody ReqDeviceControlData data)
             throws Exception {
-        boolean result;
-        if (data.getCameraOn() != null) {
-            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.Camera, data.getCameraOn());
-        } else if (data.getMicrophoneOn() != null) {
-            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.Microphone, data.getMicrophoneOn());
-        } else if (data.getMusicModeOn() != null) {
-            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.MusicMode, data.getMusicModeOn());
-        } else if (data.getHandUpOn() != null) {
-            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.HandUp, data.getHandUpOn());
-        }else if (data.getExamSongOn() != null) {
-            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
-        } else {
-            throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
-        }
-        return new BaseResponse<>(result);
+        return new BaseResponse<>(roomService.controlDevice(data));
     }
 
+    @ApiOperation(value = "学员伴奏下载状态回调")
     @RequestMapping(value = "adjustExamSong", method = RequestMethod.POST)
     public Object adjustExamSong(@RequestBody ExamSongData examSongData) throws Exception {
         log.info("adjustExamSong: {}",JSONObject.toJSON(examSongData));
@@ -182,32 +181,25 @@ public class RoomController{
         return new BaseResponse<>();
     }
 
+    @ApiOperation(value = "学员伴奏下载状态回调")
+    @RequestMapping(value = "adjustMusicScore", method = RequestMethod.POST)
+    public Object adjustMusicScore(@RequestBody MusicScoreData musicScoreData) throws Exception {
+        roomService.adjustMusicScore(musicScoreData);
+        return new BaseResponse<>();
+    }
+
+    @ApiOperation(value = "学员麦克风、摄像头等开关批量控制")
     @RequestMapping(value = "/device/batchControl", method = RequestMethod.POST)
     public Object batchControlDevice(@RequestBody ReqDeviceControlData data)throws Exception {
-        log.info("batchControlDevice: {}",JSONObject.toJSON(data));
-        boolean result = roomService.batchControlDevice(data);
-        return new BaseResponse<>(result);
+        log.info("batchControl: {}",JSONObject.toJSON(data));
+        return new BaseResponse<>(roomService.batchControlDevice(data));
     }
 
     @RequestMapping(value = "/device/sync", method = RequestMethod.POST)
     public Object syncDeviceState(@RequestBody ReqDeviceControlData data)
             throws Exception {
         log.info("syncDeviceState: {}",JSONObject.toJSON(data));
-        boolean result;
-        if (data.getCameraOn() != null) {
-            result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.Camera, data.getCameraOn());
-        } else if (data.getMicrophoneOn() != null) {
-            result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.Microphone, data.getMicrophoneOn());
-        } else if (data.getMusicModeOn() != null) {
-            result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.MusicMode, data.getMusicModeOn());
-        }  else if (data.getHandUpOn() != null) {
-            result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.HandUp, data.getHandUpOn());
-        }  else if (data.getExamSongOn() != null) {
-            result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
-        } else {
-            throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
-        }
-        return new BaseResponse<>(result);
+        return new BaseResponse<>(roomService.syncDeviceState(data));
     }
 
     @RequestMapping(value = "/whiteboard/turn-page", method = RequestMethod.POST)

+ 0 - 3
mec-im/src/main/java/com/ym/mec/im/BaseMessage.java

@@ -2,9 +2,6 @@ package com.ym.mec.im;
 
 import com.alibaba.fastjson.JSONObject;
 
-/**
- * Created by weiqinxiao on 2019/3/1.
- */
 public abstract class BaseMessage {
 
     public abstract String getObjectName();

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/DeviceStateChangedMessage.java

@@ -9,8 +9,8 @@ import lombok.Setter;
  */
 public class DeviceStateChangedMessage extends BaseMessage {
     private @Setter @Getter boolean enable;
-
     private @Setter @Getter int type;
+    private @Setter @Getter Integer musicScoreAccompanimentId;
 
     private @Setter @Getter String userId;
     private @Setter @Getter String userName;

+ 43 - 0
mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadMessageMessage.java

@@ -0,0 +1,43 @@
+package com.ym.mec.im.message;
+
+import com.ym.mec.im.BaseMessage;
+import com.ym.pojo.MusicScoreMessage;
+
+public class MusicScoreDownloadMessageMessage extends BaseMessage {
+    private MusicScoreMessage content;
+    private static final transient String TYPE = "DY:musicScoreDownloadMessage";
+
+    public MusicScoreDownloadMessageMessage(MusicScoreMessage content) {
+        this.content = content;
+    }
+
+    public MusicScoreMessage getContent() {
+        return content;
+    }
+
+    public void setContent(MusicScoreMessage content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "{\"id\":\"" + content.getId() +
+                "\", \"examSongId\":\"" + content.getExamSongId() +
+                "\", \"subjectId\":\"" + content.getSubjectId() +
+                "\", \"subjectName\":\"" + content.getSubjectName() +
+                "\", \"mp3Url\":\"" + content.getMp3Url() +
+                "\", \"speed\":\"" + content.getSpeed() +
+                "\", \"xmlUrl\":\"" + content.getXmlUrl() +
+                "\", \"examSongName\":\"" + content.getExamSongName() +
+                "\", \"categoriesName\":\"" + content.getCategoriesName() +
+                "\", \"categoriesId\":\"" + content.getCategoriesId() +
+                "\", \"type\":\"" + content.getType() +
+                "\", \"url\":\"" + content.getUrl() +
+                "\"}";
+    }
+
+    @Override
+    public String getObjectName() {
+        return TYPE;
+    }
+}

+ 25 - 0
mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadStatusMessage.java

@@ -0,0 +1,25 @@
+package com.ym.mec.im.message;
+
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
+import com.ym.mec.im.BaseMessage;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+public class MusicScoreDownloadStatusMessage extends BaseMessage {
+
+    private @Setter @Getter Integer studentId;
+
+    private @Setter @Getter List<CourseScheduleStudentMusicScore> studentMusicScores;
+
+    public MusicScoreDownloadStatusMessage(Integer studentId, List<CourseScheduleStudentMusicScore> studentMusicScores) {
+        this.studentId = studentId;
+        this.studentMusicScores = studentMusicScores;
+    }
+
+    @Override
+    public String getObjectName() {
+        return "DY:MSDSMsg";
+    }
+}

+ 2 - 3
mec-im/src/main/java/com/ym/pojo/DeviceTypeEnum.java

@@ -1,12 +1,11 @@
 package com.ym.pojo;
 
-/**
- * Created by weiqinxiao on 2019/3/19.
- */
 public enum DeviceTypeEnum {
     Microphone,
     Camera,
     MusicMode,
     HandUp,
     ExamSong,
+    MusicScore,
+    MusicScoreAccompaniment,
 }

+ 49 - 0
mec-im/src/main/java/com/ym/pojo/MusicScoreData.java

@@ -0,0 +1,49 @@
+package com.ym.pojo;
+
+public class MusicScoreData {
+	private String roomId;
+	private Integer musicScoreAccompanimentId;
+	private Integer userId;
+	private Integer userType;
+	private Integer status;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserType() {
+		return userType;
+	}
+
+	public void setUserType(Integer userType) {
+		this.userType = userType;
+	}
+
+	public Integer getMusicScoreAccompanimentId() {
+		return musicScoreAccompanimentId;
+	}
+
+	public void setMusicScoreAccompanimentId(Integer musicScoreAccompanimentId) {
+		this.musicScoreAccompanimentId = musicScoreAccompanimentId;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public String getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(String roomId) {
+		this.roomId = roomId;
+	}
+}

+ 153 - 0
mec-im/src/main/java/com/ym/pojo/MusicScoreMessage.java

@@ -0,0 +1,153 @@
+package com.ym.pojo;
+
+public class MusicScoreMessage {
+    /**  */
+    private Integer id;
+
+    /**  */
+    private Integer examSongId;
+
+    /**  */
+    private Integer subjectId;
+
+    /**  */
+    private String subjectName;
+
+    /**  */
+    private String mp3Url;
+
+    /** 速度 */
+    private Integer speed;
+
+    /**  */
+    private String xmlUrl;
+
+    /**  */
+    private String examSongName;
+
+    /**  */
+    private String categoriesName;
+
+    /**  */
+    private Integer categoriesId;
+
+    /**  */
+    private String type;
+
+    /**  */
+    private String url;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamSongId() {
+        return examSongId;
+    }
+
+    public void setExamSongId(Integer examSongId) {
+        this.examSongId = examSongId;
+    }
+
+    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 getMp3Url() {
+        return mp3Url;
+    }
+
+    public void setMp3Url(String mp3Url) {
+        this.mp3Url = mp3Url;
+    }
+
+    public Integer getSpeed() {
+        return speed;
+    }
+
+    public void setSpeed(Integer speed) {
+        this.speed = speed;
+    }
+
+    public String getXmlUrl() {
+        return xmlUrl;
+    }
+
+    public void setXmlUrl(String xmlUrl) {
+        this.xmlUrl = xmlUrl;
+    }
+
+    public String getExamSongName() {
+        return examSongName;
+    }
+
+    public void setExamSongName(String examSongName) {
+        this.examSongName = examSongName;
+    }
+
+    public String getCategoriesName() {
+        return categoriesName;
+    }
+
+    public void setCategoriesName(String categoriesName) {
+        this.categoriesName = categoriesName;
+    }
+
+    public Integer getCategoriesId() {
+        return categoriesId;
+    }
+
+    public void setCategoriesId(Integer categoriesId) {
+        this.categoriesId = categoriesId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    @Override
+    public String toString() {
+        return "MusicScoreMessage{" +
+                "id='" + id + '\'' +
+                ", examSongId='" + examSongId + '\'' +
+                ", subjectId='" + subjectId + '\'' +
+                ", subjectName='" + subjectName + '\'' +
+                ", mp3Url='" + mp3Url + '\'' +
+                ", speed='" + speed + '\'' +
+                ", xmlUrl='" + xmlUrl + '\'' +
+                ", examSongName='" + examSongName + '\'' +
+                ", categoriesName='" + categoriesName + '\'' +
+                ", categoriesId='" + categoriesId + '\'' +
+                ", type='" + type + '\'' +
+                ", url='" + url + '\'' +
+                '}';
+    }
+}

+ 14 - 3
mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java

@@ -2,9 +2,6 @@ package com.ym.pojo;
 
 import lombok.Data;
 
-/**
- * Created by weiqinxiao on 2019/3/7.
- */
 @Data
 public class ReqDeviceControlData {
 	private Boolean cameraOn;
@@ -12,11 +9,25 @@ public class ReqDeviceControlData {
 	private Boolean musicModeOn;
 	private Boolean handUpOn;
 	private Boolean examSongOn;
+	//原音播放状态
+	private Boolean musicScoreOn;
+	//伴奏播放状态
+	private Boolean accompanimentOn;
+
 	private String roomId;
 	private String userId;
 	private String ticket;
 	private Integer status;
 	private Integer examSongId;
+	private Integer musicScoreAccompanimentId;
+
+	public Integer getMusicScoreAccompanimentId() {
+		return musicScoreAccompanimentId;
+	}
+
+	public void setMusicScoreAccompanimentId(Integer musicScoreAccompanimentId) {
+		this.musicScoreAccompanimentId = musicScoreAccompanimentId;
+	}
 
 	public Boolean getExamSongOn() {
 		return examSongOn;

+ 7 - 1
mec-im/src/main/java/com/ym/pojo/RoomResult.java

@@ -2,6 +2,7 @@ package com.ym.pojo;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
@@ -11,6 +12,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Created by weiqinxiao on 2019/2/28.
@@ -41,6 +43,7 @@ public class RoomResult {
         boolean microphone;
         boolean handUpOn;
         ExamSongDownloadData examSongDownloadJson;
+        List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores;
         CustomMessage playMidiJson;
     }
 
@@ -51,7 +54,7 @@ public class RoomResult {
         int curPg;
     }
 
-    public void setMembers(List<RoomMember> roomMemberList, Map<Integer,String> midiMap,Map<Integer,String> examSongMap) {
+    public void setMembers(List<RoomMember> roomMemberList, Map<Integer,String> midiMap,Map<Integer,String> examSongMap,List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores) {
         for (RoomMember member : roomMemberList) {
             MemberResult result = new MemberResult();
             result.setUserId(member.getUid());
@@ -63,6 +66,9 @@ public class RoomResult {
             result.setHandUpOn(member.isHand());
             result.setHeadUrl(member.getHeadUrl());
             result.setPlayMidiJson(JSONObject.parseObject(midiMap.get(Integer.parseInt(member.getUid())),CustomMessage.class));
+            if(scheduleStudentMusicScores != null && scheduleStudentMusicScores.size() > 0){
+                result.setScheduleStudentMusicScores(scheduleStudentMusicScores.stream().filter(e->e.getUserId().equals(Integer.parseInt(result.getUserId()))).collect(Collectors.toList()));
+            }
             ExamSongDownloadData examSongDownloadData;
             String json = examSongMap.get(Integer.parseInt(member.getUid()));
             if(StringUtils.isEmpty(json)){

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

@@ -2,25 +2,22 @@ package com.ym.service.Impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.ym.common.ApiException;
 import com.ym.common.BaseResponse;
 import com.ym.common.DisplayEnum;
 import com.ym.common.ErrorEnum;
 import com.ym.config.IMProperties;
 import com.ym.config.RoomProperties;
-import com.ym.dao.RoomDao;
-import com.ym.dao.RoomMemberDao;
-import com.ym.dao.UserDao;
-import com.ym.dao.WhiteboardDao;
+import com.ym.dao.*;
 import com.ym.job.ScheduleManager;
 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.dao.CourseScheduleStudentMusicScoreDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.RongyunBasicUserDto;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.SysExamSong;
-import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.biz.service.StudentAttendanceService;
@@ -95,6 +92,10 @@ public class RoomServiceImpl implements RoomService {
     @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
+    private CourseScheduleStudentMusicScoreDao courseScheduleStudentMusicScoreDao;
+    @Autowired
+    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
+    @Autowired
     private RedisTemplate<String,String> redisTemplate;
 
     @Override
@@ -206,6 +207,8 @@ public class RoomServiceImpl implements RoomService {
             userResult.setJoinTime(member.getJoinDt());
         }
 
+        List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores = courseScheduleStudentMusicScoreDao.queryByScoreIdAndCourseId(null, courseId,null, null, null);
+
         String display = "";
         if (roleEnum == RoleTeacher) {
             display = "display://type=1?userId=" + userId + "?uri=";
@@ -226,6 +229,13 @@ public class RoomServiceImpl implements RoomService {
                 display = room.getDisplay();
             }
         }
+        //已下载的伴奏列表
+        if(scheduleStudentMusicScores != null && scheduleStudentMusicScores.size() > 0){
+            List<CourseScheduleStudentMusicScore> musicScores = scheduleStudentMusicScores.stream().filter(e -> e.getUserId().equals(sysUser.getId())).collect(Collectors.toList());
+            String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
+            List<CourseScheduleStudentMusicScore> lists = JSON.parseArray(toJSONString, CourseScheduleStudentMusicScore.class);
+            userResult.setScheduleStudentMusicScores(lists);
+        }
 
         userResult.setUserName(userName);
         userResult.setUserId(userId);
@@ -248,7 +258,7 @@ public class RoomServiceImpl implements RoomService {
             Set<String> userIds = roomMemberList.stream().map(e -> e.getUid()).collect(Collectors.toSet());
             Map<Integer,String> midiMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.queryMidiByUserIdsAndCourseId(userIds,courseId.toString()));
             Map<Integer,String> examSongMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.queryExamSongByUserIdsAndCourseId(userIds,courseId.toString()));
-            roomResult.setMembers(roomMemberList,midiMap,examSongMap);
+            roomResult.setMembers(roomMemberList,midiMap,examSongMap,scheduleStudentMusicScores);
         }
         roomResult.setWhiteboards(whiteboardDao.findByRid(roomId));
         log.info("join room: roomId = {}, userId = {}, userName={}, role = {}", roomId, userId, userName, roleEnum);
@@ -436,6 +446,7 @@ public class RoomServiceImpl implements RoomService {
         CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId.longValue());
         if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
             roleEnum = RoleTeacher;
+            courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(),null,null);
         }else {
             roleEnum = RoleStudent;
         }
@@ -477,6 +488,7 @@ public class RoomServiceImpl implements RoomService {
             roomDao.deleteByRid(roomId);
             deleteWhiteboardByUser(roomId, userId);
             imHelper.dismiss(userId, roomId);
+            courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(),null,null);
             log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId,userId);
         } else {
             roomMemberDao.deleteUserByRidAndUid(roomId, userId);
@@ -676,10 +688,8 @@ public class RoomServiceImpl implements RoomService {
     @Transactional(rollbackFor = Exception.class)
     public String createWhiteBoard(String roomId) throws Exception {
         CheckUtils.checkArgument(roomId != null, "roomId must't be null");
-//        CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
         SysUser authUser = sysUserFeignService.queryUserInfo();
         String userId = authUser.getId().toString();
-//        CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
 
         log.info("createWhiteBoard: roomId = {}", roomId);
 
@@ -794,10 +804,35 @@ public class RoomServiceImpl implements RoomService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean controlDevice(String roomId, String userId, DeviceTypeEnum typeEnum, boolean enable) throws Exception {
-        CheckUtils.checkArgument(roomId != null, "roomId must't be null");
-        CheckUtils.checkArgument(userId != null, "userId must't be null");
-        CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
+    public Boolean controlDevice(ReqDeviceControlData data) throws Exception {
+        String roomId = data.getRoomId();
+        String userId = data.getUserId();
+        DeviceTypeEnum typeEnum;
+        boolean enable;
+        if (data.getCameraOn() != null) {
+            typeEnum = DeviceTypeEnum.Camera;
+            enable = data.getCameraOn();
+        } else if (data.getMicrophoneOn() != null) {
+            typeEnum = DeviceTypeEnum.Microphone;
+            enable = data.getMicrophoneOn();
+        } else if (data.getMusicModeOn() != null) {
+            typeEnum = DeviceTypeEnum.MusicMode;
+            enable = data.getMusicModeOn();
+        } else if (data.getHandUpOn() != null) {
+            typeEnum = DeviceTypeEnum.HandUp;
+            enable = data.getHandUpOn();
+        }else if (data.getExamSongOn() != null) {
+            typeEnum = DeviceTypeEnum.ExamSong;
+            enable = data.getExamSongOn();
+        }else if (data.getMusicScoreOn() != null) {
+            typeEnum = DeviceTypeEnum.MusicScore;
+            enable = data.getMusicScoreOn();
+        }else if (data.getAccompanimentOn() != null) {
+            typeEnum = DeviceTypeEnum.MusicScoreAccompaniment;
+            enable = data.getAccompanimentOn();
+        } else {
+            throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
+        }
         SysUser authUser = sysUserFeignService.queryUserInfo();
         log.info("controlDevice: userId={}, typeEnum={}, onOff={}", userId, typeEnum, enable);
 
@@ -816,6 +851,25 @@ public class RoomServiceImpl implements RoomService {
                 DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), enable);
                 deviceResourceMessage.setUserId(userId);
                 imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+            }else if(typeEnum.equals(DeviceTypeEnum.MusicScore)){
+                long scheduleId = Long.parseLong(roomId.substring(1));
+                //关闭所有曲目播放
+                courseScheduleStudentMusicScoreDao.closePlayStatus(scheduleId,Integer.parseInt(userId),null);
+                //原音
+                courseScheduleStudentMusicScoreDao.openPlayStatus(scheduleId,data.getMusicScoreAccompanimentId());
+                DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), enable);
+                deviceResourceMessage.setMusicScoreAccompanimentId(data.getMusicScoreAccompanimentId());
+                deviceResourceMessage.setUserId(userId);
+                imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+            }else if(typeEnum.equals(DeviceTypeEnum.MusicScoreAccompaniment)){
+                long scheduleId = Long.parseLong(roomId.substring(1));
+                //关闭所有曲目播放
+                courseScheduleStudentMusicScoreDao.closePlayStatus(scheduleId,Integer.parseInt(userId),null);
+                courseScheduleStudentMusicScoreDao.openAccompanimentPlayStatus(scheduleId,data.getMusicScoreAccompanimentId());
+                DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), enable);
+                deviceResourceMessage.setMusicScoreAccompanimentId(data.getMusicScoreAccompanimentId());
+                deviceResourceMessage.setUserId(userId);
+                imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
             }else {
                 String ticket = IdentifierUtils.uuid();
                 ControlDeviceTaskInfo taskInfo = new ControlDeviceTaskInfo();
@@ -851,6 +905,14 @@ public class RoomServiceImpl implements RoomService {
                     msg.setEnable(enable);
                 }
                 courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,Integer.parseInt(userId),JSON.toJSONString(msg));
+            }else if(typeEnum.equals(DeviceTypeEnum.MusicScore)){
+                long scheduleId = Long.parseLong(roomId.substring(1));
+                //关闭所有曲目播放
+                courseScheduleStudentMusicScoreDao.closePlayStatus(scheduleId,Integer.parseInt(userId),null);
+            }else if(typeEnum.equals(DeviceTypeEnum.MusicScoreAccompaniment)){
+                long scheduleId = Long.parseLong(roomId.substring(1));
+                //关闭所有曲目播放
+                courseScheduleStudentMusicScoreDao.closePlayStatus(scheduleId,Integer.parseInt(userId),null);
             }else {
                 roomMemberDao.updateMusicByRidAndUid(roomId, userId, false);
             }
@@ -881,39 +943,33 @@ public class RoomServiceImpl implements RoomService {
         if(roomMembers.size() == 0){
             return false;
         }
-        boolean result = true;
-        if (data.getCameraOn() != null) {
-            for (RoomMember e:roomMembers) {
-                controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.Camera, data.getCameraOn());
-            }
-        } else if (data.getMicrophoneOn() != null) {
-            for (RoomMember e:roomMembers) {
-                controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.Microphone, data.getMicrophoneOn());
-            }
-        } else if (data.getMusicModeOn() != null) {
-            for (RoomMember e:roomMembers) {
-                controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.MusicMode, data.getMusicModeOn());
-            }
-        } else if (data.getExamSongOn() != null) {
+        if (data.getExamSongOn() != null) {
             if(StringUtils.isNotEmpty(data.getUserId())){
                 for (RoomMember e:roomMembers) {
-                    controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
+                    data.setUserId(e.getUid());
+                    controlDevice(data);
                 }
             }else {
                 List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(Long.parseLong(data.getRoomId().substring(1)));
                 for (BasicUserDto e:students) {
-                    controlDevice(data.getRoomId(), e.getUserId().toString(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
+                    data.setUserId(e.getUserId().toString());
+                    controlDevice(data);
                 }
             }
         } else {
-            throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
+            for (RoomMember e:roomMembers) {
+                data.setUserId(e.getUid());
+                controlDevice(data);
+            }
         }
-        return result;
+        return true;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean approveControlDevice(String roomId, String ticket) throws Exception {
+    public Boolean approveControlDevice(ReqDeviceControlData data) throws Exception {
+        String ticket = data.getTicket();
+        String roomId = data.getRoomId();
         CheckUtils.checkArgument(ticket != null, "ticket must't be null");
         SysUser authUser = sysUserFeignService.queryUserInfo();
         String userId = authUser.getId().toString();
@@ -921,7 +977,7 @@ public class RoomServiceImpl implements RoomService {
         ControlDeviceTaskInfo taskInfo = (ControlDeviceTaskInfo) scheduleManager.executeTask(ticket);
         if (taskInfo.getTypeEnum().equals(DeviceTypeEnum.Camera)) {
             roomMemberDao.updateCameraByRidAndUid(roomId, userId, taskInfo.isOnOff());
-        }if (taskInfo.getTypeEnum().equals(DeviceTypeEnum.ExamSong)) {
+        }else if (taskInfo.getTypeEnum().equals(DeviceTypeEnum.ExamSong)) {
             long scheduleId = Long.parseLong(roomId.substring(1));
             ExamSongDownloadData msg;
             String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(scheduleId, authUser.getId());
@@ -932,7 +988,7 @@ public class RoomServiceImpl implements RoomService {
                 msg.setEnable(true);
             }
             courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
-        } else {
+        }else {
             roomMemberDao.updateMicByRidAndUid(roomId, userId, taskInfo.isOnOff());
         }
         ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Approve.ordinal());
@@ -966,20 +1022,38 @@ public class RoomServiceImpl implements RoomService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws Exception {
-        CheckUtils.checkArgument(roomId != null, "roomId must't be null");
-        CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
+    public Boolean syncDeviceState(ReqDeviceControlData data) throws Exception {
+        String roomId = data.getRoomId();
+        DeviceTypeEnum type;
+        boolean enable;
+        if (data.getCameraOn() != null) {
+            type = DeviceTypeEnum.Camera;
+            enable = data.getCameraOn();
+        } else if (data.getMicrophoneOn() != null) {
+            type = DeviceTypeEnum.Microphone;
+            enable = data.getMicrophoneOn();
+        } else if (data.getMusicModeOn() != null) {
+            type = DeviceTypeEnum.MusicMode;
+            enable = data.getMusicModeOn();
+        }  else if (data.getHandUpOn() != null) {
+            type = DeviceTypeEnum.HandUp;
+            enable = data.getHandUpOn();
+        }  else if (data.getExamSongOn() != null) {
+            type = DeviceTypeEnum.ExamSong;
+            enable = data.getExamSongOn();
+        }else {
+            throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
+        }
         SysUser authUser = sysUserFeignService.queryUserInfo();
         String userId = authUser.getId().toString();
 
-        int result;
         DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
         if (type.equals(DeviceTypeEnum.Camera)) {
-            result = roomMemberDao.updateCameraByRidAndUid(roomId, userId, enable);
+            roomMemberDao.updateCameraByRidAndUid(roomId, userId, enable);
         } else if (type.equals(DeviceTypeEnum.Microphone)){
-            result = roomMemberDao.updateMicByRidAndUid(roomId, userId, enable);
+            roomMemberDao.updateMicByRidAndUid(roomId, userId, enable);
         } else if (type.equals(DeviceTypeEnum.HandUp)){
-            result = roomMemberDao.updateHandByRidAndUid(roomId, userId, enable);
+            roomMemberDao.updateHandByRidAndUid(roomId, userId, enable);
         } else if (type.equals(DeviceTypeEnum.ExamSong)){
             long scheduleId = Long.parseLong(roomId.substring(1));
             ExamSongDownloadData msg;
@@ -990,13 +1064,13 @@ public class RoomServiceImpl implements RoomService {
                 msg = JSON.parseObject(examJson, ExamSongDownloadData.class);
                 msg.setEnable(enable);
             }
-            result = courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
+            courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
         }else {
-            result = roomMemberDao.updateMusicByRidAndUid(roomId, userId, enable);
+            roomMemberDao.updateMusicByRidAndUid(roomId, userId, enable);
         }
         deviceResourceMessage.setUserId(userId);
         imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
-        log.info("syncDeviceState : {}, {}, result = {}", roomId, enable, result);
+        log.info("syncDeviceState : {}, {}, result = {}", roomId, enable);
         return true;
     }
 
@@ -1006,11 +1080,12 @@ public class RoomServiceImpl implements RoomService {
         CheckUtils.checkArgument(roomId != null, "roomId must't be null");
         List<RoomMember> roomMemberList = roomMemberDao.findByRid(roomId);
         if(roomMemberList != null && roomMemberList.size() > 0){
+            List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores = courseScheduleStudentMusicScoreDao.queryByScoreIdAndCourseId(null, Long.parseLong(roomId.substring(1)), null, null, null);
             RoomResult roomResult = new RoomResult();
             Set<String> userIds = roomMemberList.stream().map(e -> e.getUid()).collect(Collectors.toSet());
             Map<Integer,String> midiMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.queryMidiByUserIdsAndCourseId(userIds,roomId.substring(1)));
             Map<Integer,String> examSongMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.queryExamSongByUserIdsAndCourseId(userIds,roomId.substring(1)));
-            roomResult.setMembers(roomMemberList,midiMap,examSongMap);
+            roomResult.setMembers(roomMemberList,midiMap,examSongMap,scheduleStudentMusicScores);
             return roomResult.getMembers();
         }
         return null;
@@ -1430,6 +1505,42 @@ public class RoomServiceImpl implements RoomService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void pushDownloadMusicScoreMsg(MusicScoreData musicScoreData) throws Exception {
+        SysUser authUser = sysUserFeignService.queryUserInfo();
+        String roomId = musicScoreData.getRoomId();
+        Long courseScheduleId = Long.parseLong(roomId.substring(1));
+        List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores =
+                courseScheduleStudentMusicScoreDao.queryByScoreIdAndCourseId(musicScoreData.getMusicScoreAccompanimentId(),
+                        courseScheduleId,null,null,0);
+        SysMusicScoreAccompaniment accompaniment = sysMusicScoreAccompanimentDao.get(musicScoreData.getMusicScoreAccompanimentId());
+        if(scheduleStudentMusicScores.size() == 0){
+            //第一次下载,生成数据
+            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseSchedule(courseScheduleId);
+            Set<Integer> studentIds = courseScheduleStudentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+            studentIds.forEach(e->{
+                CourseScheduleStudentMusicScore musicScore = new CourseScheduleStudentMusicScore();
+                musicScore.setMusicScoreAccompanimentId(accompaniment.getId());
+                musicScore.setSpeed(accompaniment.getSpeed());
+                musicScore.setCourseScheduleId(courseScheduleId);
+                musicScore.setUserId(e);
+                scheduleStudentMusicScores.add(musicScore);
+            });
+            CourseScheduleStudentMusicScore musicScore = new CourseScheduleStudentMusicScore();
+            musicScore.setMusicScoreAccompanimentId(accompaniment.getId());
+            musicScore.setSpeed(accompaniment.getSpeed());
+            musicScore.setCourseScheduleId(courseScheduleId);
+            musicScore.setUserId(authUser.getId());
+            musicScore.setUserType(1);
+            scheduleStudentMusicScores.add(musicScore);
+            courseScheduleStudentMusicScoreDao.batchInsert(scheduleStudentMusicScores);
+        }
+        MusicScoreMessage musicScoreMessage = JSON.parseObject(JSON.toJSONString(accompaniment), MusicScoreMessage.class);
+        MusicScoreDownloadMessageMessage msg = new MusicScoreDownloadMessageMessage(musicScoreMessage);
+        imHelper.publishMessage(authUser.getId().toString(), roomId, msg, 0);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void pushDownloadExamSongMsg(String roomId, Integer examSongId) throws Exception {
         SysUser authUser = sysUserFeignService.queryUserInfo();
 
@@ -1460,6 +1571,34 @@ public class RoomServiceImpl implements RoomService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void adjustMusicScore(MusicScoreData musicScoreData) throws Exception {
+        SysUser authUser = sysUserFeignService.queryUserInfo();
+        Integer studentId = authUser.getId();
+        String roomId = musicScoreData.getRoomId();
+        Long scheduleId = Long.parseLong(roomId.substring(1));
+        Integer accompanimentId = musicScoreData.getMusicScoreAccompanimentId();
+        List<CourseScheduleStudentMusicScore> studentMusicScores = courseScheduleStudentMusicScoreDao.queryByScoreIdAndCourseId(accompanimentId,scheduleId,studentId,null,null);
+        if(accompanimentId != null){
+            SysMusicScoreAccompaniment accompaniment = sysMusicScoreAccompanimentDao.get(accompanimentId);
+            if(accompaniment == null){
+                throw new BizException("曲目信息不存在");
+            }
+            //修改下载状态
+            if(studentMusicScores == null || studentMusicScores.size() == 0){
+                throw new BizException("学员不存在此下载曲目");
+            }
+            CourseScheduleStudentMusicScore studentMusicScore = studentMusicScores.get(0);
+            studentMusicScore.setDownStatus(musicScoreData.getStatus());
+            courseScheduleStudentMusicScoreDao.update(studentMusicScore);
+        }
+        //给老师发送学员曲目下载状态
+        CourseSchedule courseSchedule = courseScheduleDao.get(scheduleId);
+        MusicScoreDownloadStatusMessage statusMessage = new MusicScoreDownloadStatusMessage(studentId,studentMusicScores);
+        imHelper.publishMessage(studentId.toString(),courseSchedule.getActualTeacherId().toString(), roomId,statusMessage);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void adjustExamSong(String roomId, Integer status,Integer examSongId) throws Exception {
         if(roomId == null || status == null || examSongId == null){
             throw new BizException("参数校验失败");

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

@@ -35,11 +35,11 @@ public interface RoomService {
 
     Boolean turnWhiteBoardPage(String roomId, String whiteBoardId, int page) throws Exception;
 
-    Boolean controlDevice(String roomId, String userId, DeviceTypeEnum type, boolean enable) throws Exception;
+    Boolean controlDevice(ReqDeviceControlData data) throws Exception;
 
     Boolean batchControlDevice(ReqDeviceControlData data) throws Exception;
 
-    Boolean approveControlDevice(String roomId, String ticket) throws Exception;
+    Boolean approveControlDevice(ReqDeviceControlData data) throws Exception;
 
     Boolean rejectControlDevice(String roomId, String ticket) throws Exception;
 
@@ -58,7 +58,7 @@ public interface RoomService {
     Boolean approveUpgradeRole(String roomId, String ticket) throws Exception;
     Boolean rejectUpgradeRole(String roomId, String ticket) throws Exception;
 
-    Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws Exception;
+    Boolean syncDeviceState(ReqDeviceControlData data) throws Exception;
 
     Boolean changeRole(String roomId, String userId, int role) throws Exception;
 
@@ -95,10 +95,23 @@ public interface RoomService {
     void adjustExamSong(String roomId,Integer status,Integer examSongId) throws Exception;
 
     /**
+     * 修改学员伴奏下载状态
+     * @author zouxuan
+     * @param musicScoreData
+     */
+    void adjustMusicScore(MusicScoreData musicScoreData) throws Exception;
+
+    /**
      * 移动端用户加入房间失败
      * @author zouxuan
      * @param roomId
      * @param userId
      */
     void joinRoomFailure(String roomId, String userId);
+
+    /**
+     * 通知学员下载伴奏
+     * @param musicScoreData
+     */
+    void pushDownloadMusicScoreMsg(MusicScoreData musicScoreData) throws Exception;
 }

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

@@ -65,10 +65,10 @@ public class MusicGroupController extends BaseController {
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
     @Autowired
-    private CourseScheduleDao courseScheduleDao;
+    private OrganizationService organizationService;
 
     @Autowired
-    private OrganizationService organizationService;
+    private CourseScheduleDao courseScheduleDao;
 
     @ApiOperation("预报名")
     @PostMapping(value = "/preRegister")

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

@@ -53,9 +53,9 @@ public class StudentManageController extends BaseController {
     @Autowired
     private SubjectService subjectService;
     @Autowired
-    private StudentService studentService;
-    @Autowired
     private OrganizationService organizationService;
+    @Autowired
+    private StudentService studentService;
 
     private final static Logger LOGGER = LoggerFactory.getLogger(StudentManageController.class);
 

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

@@ -14,7 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RequestMapping("sysMusicScoreAccompaniment")
-@Api(tags = "曲库服务")
+@Api(tags = "曲库伴奏服务")
 @RestController
 public class SysMusicScoreAccompanimentController extends BaseController {
 

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

@@ -274,7 +274,7 @@ public class TeacherCourseScheduleController extends BaseController {
         if(Objects.isNull(courseScheduleId1)||Objects.isNull(courseScheduleId2)){
             return failed("请指定课程!");
         }
-        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2, true);
+        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
         return succeed();
     }
 

+ 2 - 5
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -262,14 +262,11 @@ public class CourseScheduleController extends BaseController {
     @ApiOperation(value = "课时交换")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/courseSwap')")
     @GetMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2, Boolean allowZeroSalary){
+    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
         if(Objects.isNull(courseScheduleId1)||Objects.isNull(courseScheduleId2)){
             return failed("请指定课程");
         }
-        if(Objects.isNull(allowZeroSalary)){
-            allowZeroSalary = false;
-        }
-        courseScheduleService.courseSwap(courseScheduleId1,courseScheduleId2,allowZeroSalary);
+        courseScheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
         return succeed();
     }
 

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

@@ -1685,8 +1685,8 @@ public class ExportController extends BaseController {
         OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(
-                    new String[]{"学员编号", "学员姓名", "所属分部", "乐团名称", "指导老师", "教务老师", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课", "作业提交时间"},
-                    new String[]{"studentId", "studentName", "organName", "groupNames", "teacherName", "educationalTeacherName", "expectExercisesNum", "actualExercisesNum", "exercisesReplyNum",
+                    new String[]{"学员编号", "学员姓名", "所属分部", "乐团名称", "指导老师", "教务老师", "服务课程", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课", "作业提交时间"},
+                    new String[]{"studentId", "studentName", "organName", "groupNames", "teacherName", "educationalTeacherName", "serveType == 'EXERCISE' ? '课外训练':courseIds", "expectExercisesNum", "actualExercisesNum", "exercisesReplyNum",
                             "exercisesMessageNum", "exercisesMessageTimelyNum", "existPracticeCourse", "existVipCourse", "lastSubmitTime"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");

+ 2 - 5
mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java

@@ -65,14 +65,11 @@ public class EducationCourseScheduleController extends BaseController {
 
     @ApiOperation(value = "课时交换")
     @PostMapping(value = "/courseSwap",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2, Boolean allowZeroSalary){
+    public Object courseSwap(Long courseScheduleId1,Long courseScheduleId2){
         if(Objects.isNull(courseScheduleId1)||Objects.isNull(courseScheduleId2)){
             return failed("请指定课程!");
         }
-        if(Objects.isNull(allowZeroSalary)){
-            allowZeroSalary = false;
-        }
-        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2,allowZeroSalary);
+        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
         return succeed();
     }
 }