瀏覽代碼

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

yonge 4 年之前
父節點
當前提交
dc64aa80f0
共有 37 個文件被更改,包括 613 次插入283 次删除
  1. 9 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderCourseSettingsDao.java
  3. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  4. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  5. 23 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  6. 12 21
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderAuditDetailDto.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderAuditDto.java
  8. 12 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  10. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  11. 2 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  12. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  13. 34 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  14. 57 44
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  15. 5 5
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  16. 21 11
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  17. 4 9
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  18. 17 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderCourseSettingsMapper.xml
  19. 3 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  20. 15 15
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  21. 60 11
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  22. 4 1
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  23. 24 6
      mec-im/src/main/java/com/ym/controller/RoomController.java
  24. 0 4
      mec-im/src/main/java/com/ym/dao/RoomMemberDao.java
  25. 8 5
      mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadMessageMessage.java
  26. 24 0
      mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadStatusMessage.java
  27. 1 2
      mec-im/src/main/java/com/ym/pojo/DeviceTypeEnum.java
  28. 9 0
      mec-im/src/main/java/com/ym/pojo/ExamSongData.java
  29. 17 18
      mec-im/src/main/java/com/ym/pojo/ExamSongDownloadData.java
  30. 11 27
      mec-im/src/main/java/com/ym/pojo/ExamSongMessage.java
  31. 27 0
      mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java
  32. 11 2
      mec-im/src/main/java/com/ym/pojo/RoomResult.java
  33. 41 0
      mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java
  34. 94 37
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  35. 8 0
      mec-im/src/main/java/com/ym/service/RoomService.java
  36. 3 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  37. 6 6
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupPaymentCalenderController.java

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

@@ -320,6 +320,14 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     String getMidiByCourseIdAndUserId(@Param("courseScheduleId") String courseScheduleId, @Param("userId") String userId);
 
     /**
+     * 获取单个用户的examDownloadJson
+     * @param courseScheduleId
+     * @param userId
+     * @return
+     */
+    String getExamJsonByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);
+
+    /**
      * @describe 统计课程组下的课程单价
      * @author Joburgess
      * @date 2020.06.11
@@ -372,18 +380,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @author zouxuan
      * @param roomId
      */
-    void adjustExamSong(@Param("roomId") Long roomId, @Param("userId") Integer userId, @Param("examSongJson") String examSongJson);
-
-    /**
-     * 获取学员的曲目下载状态
-     * @author zouxuan
-     * @param roomId
-     * @param userId
-     * @return
-     */
-    String getExamSongDownloadStatus(@Param("roomId") Long roomId,
-                                      @Param("userId") String userId);
-
+    int adjustExamSong(@Param("roomId") Long roomId, @Param("userId") Integer userId, @Param("examSongJson") String examSongJson);
 
     /**
      * @describe 统计学员通过双十一活动排课的数量

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderCourseSettingsDao.java

@@ -6,6 +6,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 public interface MusicGroupPaymentCalenderCourseSettingsDao extends BaseDAO<Integer, MusicGroupPaymentCalenderCourseSettings> {
 
@@ -29,6 +30,9 @@ public interface MusicGroupPaymentCalenderCourseSettingsDao extends BaseDAO<Inte
 	MusicGroupPaymentCalenderCourseSettings getWithPaymentCalenderAndCourseType(@Param("calenderId") Long calenderId,
 																				@Param("courseType") CourseSchedule.CourseScheduleType courseType);
 
+	List<MusicGroupPaymentCalenderCourseSettings> getWithPaymentCalendersAndCourseType(@Param("calenderIds") Set<Long> calenderIds,
+																				@Param("courseType") CourseSchedule.CourseScheduleType courseType);
+
 	int deleteByMusicGroupPaymentCalenderId(Long musicGroupPaymentCalenderId);
 
 	/**
@@ -65,4 +69,15 @@ public interface MusicGroupPaymentCalenderCourseSettingsDao extends BaseDAO<Inte
 	 * @time 16:04
 	 */
 	List<MusicGroupPaymentCalenderCourseSettings> queryCalenderCourseSettings(Long calenderId);
+
+	/**
+	 * @param calenderId:
+	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings>
+	 * @describe 获取收费标准
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/10/30
+	 * @time 16:04
+	 */
+	List<MusicGroupPaymentCalenderCourseSettings> queryCalenderCourseSettingsByBatchNo(String batchNo);
 }

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

@@ -185,7 +185,7 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
     List<Map<Long, Long>> countActualNum(@Param("id") Long id);
 
     /**
-     * @param calenderId:
+     * @param batchNo:
      * @return com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto
      * @describe 获取审核详情
      * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
@@ -193,7 +193,7 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
      * @date 2020/11/2
      * @time 17:46
      */
-    MusicGroupPaymentCalenderAuditDto getAuditDetail(@Param("calenderId") Long calenderId);
+    MusicGroupPaymentCalenderAuditDto getAuditDetail(@Param("batchNo") String batchNo);
 
     /**
      * 获取乐团的报名缴费日历

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

@@ -170,11 +170,11 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
      * @author zouxuan
      * @date 2020/10/30
      * @time 16:39
-     * @param calenderId:
+     * @param batchNo:
      * @param musicGroupId:
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
-	List<SimpleUserDto> querySimpleUserDto(@Param("calenderId") Long calenderId, @Param("musicGroupId") String musicGroupId);
+	List<SimpleUserDto> querySimpleUserDto(@Param("batchNo") String batchNo, @Param("musicGroupId") String musicGroupId);
 
 	/**
 	 * 统计实际收款金额

+ 23 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -11,6 +11,15 @@ import org.apache.ibatis.annotations.Param;
 public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> {
 
     /**
+     * @describe 批量更新
+     * @author qnc99
+     * @date 2020/12/1 0001
+     * @param musicGroupPaymentStudentCourseDetails:
+     * @return int
+     */
+    int batchUpdate(@Param("paymentCourseDetails") List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails);
+
+    /**
      * @param studentId:
      * @param courseType:
      * @param courseMinutes:
@@ -19,10 +28,21 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      * @author Joburgess
      * @date 2020.11.04
      */
-    MusicGroupPaymentStudentCourseDetail getUnUseWithStudentAndCourseTypeAndCourseMinutes(@Param("musicGroupId") String musicGroupId,
+    List<MusicGroupPaymentStudentCourseDetail> getUnUseWithStudentAndCourseTypeAndCourseMinutes(@Param("batchNo") String batchNo,
                                                                                           @Param("studentId") Integer studentId,
-                                                                                          @Param("courseType") CourseSchedule.CourseScheduleType courseType,
-                                                                                          @Param("courseMinutes") Integer courseMinutes);
+                                                                                          @Param("courseType") CourseSchedule.CourseScheduleType courseType);
+
+    /**
+     * @param studentId:
+     * @param courseType:
+     * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail
+     * @describe 获取指定学员,指定课程类型下的可用缴费批次号
+     * @author Joburgess
+     * @date 2020.11.04
+     */
+    String getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(@Param("musicGroupId") String musicGroupId,
+                                                                   @Param("studentId") Integer studentId,
+                                                                   @Param("courseType") CourseSchedule.CourseScheduleType courseType);
 
     /**
      * @param studentIds:

+ 12 - 21
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderAuditDetailDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -9,37 +11,26 @@ public class MusicGroupPaymentCalenderAuditDetailDto {
     @ApiModelProperty(value = "缴费项基本信息",required = false)
     private MusicGroupPaymentCalenderAuditDto auditDto;
 
-    @ApiModelProperty(value = "学员数量",required = false)
-    private Integer studentNum;
-
-    @ApiModelProperty(value = "学员名单",required = false)
-    private List<SimpleUserDto> simpleUserDtos;
-
     @ApiModelProperty(value = "收费标准列表",required = false)
     private List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings;
 
-    public MusicGroupPaymentCalenderAuditDto getAuditDto() {
-        return auditDto;
-    }
+    @ApiModelProperty(value = "缴费周期列表",required = false)
+    private List<MusicGroupPaymentCalender> musicGroupPaymentCalenders;
 
-    public void setAuditDto(MusicGroupPaymentCalenderAuditDto auditDto) {
-        this.auditDto = auditDto;
+    public List<MusicGroupPaymentCalender> getMusicGroupPaymentCalenders() {
+        return musicGroupPaymentCalenders;
     }
 
-    public Integer getStudentNum() {
-        return studentNum;
+    public void setMusicGroupPaymentCalenders(List<MusicGroupPaymentCalender> musicGroupPaymentCalenders) {
+        this.musicGroupPaymentCalenders = musicGroupPaymentCalenders;
     }
 
-    public void setStudentNum(Integer studentNum) {
-        this.studentNum = studentNum;
-    }
-
-    public List<SimpleUserDto> getSimpleUserDto() {
-        return simpleUserDtos;
+    public MusicGroupPaymentCalenderAuditDto getAuditDto() {
+        return auditDto;
     }
 
-    public void setBasicUserDtos(List<SimpleUserDto> simpleUserDtos) {
-        this.simpleUserDtos = simpleUserDtos;
+    public void setAuditDto(MusicGroupPaymentCalenderAuditDto auditDto) {
+        this.auditDto = auditDto;
     }
 
     public List<MusicGroupPaymentCalenderCourseSettings> getMusicGroupPaymentCalenderCourseSettings() {

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

@@ -22,6 +22,9 @@ public class MusicGroupPaymentCalenderAuditDto {
     @ApiModelProperty(value = "乐团编号",required = false)
     private String musicGroupId;
 
+    @ApiModelProperty(value = "批次号",required = false)
+    private String batchNo;
+
     @ApiModelProperty(value = "创建时间",required = false)
     private Date createTime;
 
@@ -78,6 +81,14 @@ public class MusicGroupPaymentCalenderAuditDto {
     @ApiModelProperty(value = "是否赠送网管课",required = false)
     private Boolean isGiveMusicNetwork;
 
+    public String getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(String batchNo) {
+        this.batchNo = batchNo;
+    }
+
     public Boolean getIsGiveMusicNetwork() {
         return isGiveMusicNetwork;
     }

+ 12 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.TeachModeEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -70,6 +67,9 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "上课模式")
     private TeachModeEnum teachMode;
 
+    @ApiModelProperty(value = "职务类型(助教、主教)")
+    private TeachTypeEnum teachType;
+
     private boolean isExport = false;
 
     public TeachModeEnum getTeachMode() {
@@ -223,4 +223,12 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
 	public void setCreateEndDate(Date createEndDate) {
 		this.createEndDate = createEndDate;
 	}
+
+    public TeachTypeEnum getTeachType() {
+        return teachType;
+    }
+
+    public void setTeachType(TeachTypeEnum teachType) {
+        this.teachType = teachType;
+    }
 }

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

@@ -461,5 +461,5 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param musicGroupId
      * @return
      */
-    Map<String,Object> studentClassAuditDetail(String musicGroupId);
+    List<Map<String,Object>> studentClassAuditDetail(String musicGroupId);
 }

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

@@ -104,7 +104,7 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @param calenderId:
 	 * @return com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDetailDto
 	 */
-	MusicGroupPaymentCalenderAuditDetailDto auditListDetail(Long calenderId);
+	MusicGroupPaymentCalenderAuditDetailDto auditListDetail(String batchNo);
 
 	/**
 	 * @describe 审核通过
@@ -112,10 +112,10 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @author zouxuan
 	 * @date 2020/10/30
 	 * @time 17:39
-	 * @param calenderId:
+	 * @param batchNo:
 	 * @return void
 	 */
-	void auditPass(Long calenderId,String auditMemo);
+	void auditPass(String batchNo,String auditMemo);
 
 	/**
 	 * @describe 审核拒绝
@@ -123,10 +123,10 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @author zouxuan
 	 * @date 2020/10/30
 	 * @time 17:39
-	 * @param calenderId:
+	 * @param batchNo:
 	 * @return void
 	 */
-	void auditRefuse(Long calenderId,String auditMemo);
+	void auditRefuse(String batchNo,String auditMemo);
 
 	/**
 	 * 获取乐团报名的缴费日历

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

@@ -3266,9 +3266,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 	}
 
     @Override
-    public Map<String, Object> studentClassAuditDetail(String musicGroupId) {
+    public List<Map<String,Object>> studentClassAuditDetail(String musicGroupId) {
         List<Map<String,Object>> result = new ArrayList<>();
-
         //获取班级列表
         List<ClassGroup> classGroups = classGroupDao.queryClassGroups(musicGroupId, null);
         for (ClassGroup classGroup : classGroups) {
@@ -3281,6 +3280,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             resultMap.put("students",classGroupStudentMapperDao.findCourseStudentNameAndPhoneByClassGroupId(classGroup.getId()));
             result.add(resultMap);
         }
-        return null;
+        return result;
     }
 }

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

@@ -6,9 +6,11 @@ import static com.ym.mec.biz.dal.enums.GroupType.VIP;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.CHARGE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
+import static java.math.BigDecimal.ONE;
 
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -292,6 +294,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				if (DateUtil.stringToDate(endDateStr, sdf).before(date)) {
 					throw new BizException("删除失败,未开始的课程才能删除");
 				}
+				if(Objects.nonNull(cs.getNewCourseId())){
+					throw new BizException("删除失败,被合并课程不能删除");
+				}
 			}
 		}
 		courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
@@ -2800,6 +2805,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         //保存修改记录
         for (int i=0;i<classGroupCourseSchedulesWithDate.size();i++) {
             CourseSchedule courseSchedule=classGroupCourseSchedulesWithDate.get(i);
+            if(Objects.nonNull(courseSchedule.getNewCourseId())){
+            	throw new BizException("选择的班级中存在已合并课程,无法进行顺延操作");
+			}
+            if(Integer.valueOf(1).equals(courseSchedule.getIsLock())){
+				throw new BizException("选择的班级中部分课程已被锁定,无法进行顺延操作");
+			}
             calendar.setTime(courseSchedule.getClassDate());
             calendar.add(Calendar.DATE, betweenDays);
 
@@ -5279,7 +5290,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		List<CourseScheduleModifyLog> insertCourseScheduleModifyLogList = new ArrayList<>();
 
-		List<CourseSchedule> mergeCourses = allCourses.stream().filter(c->courseMergeInfo.getMergeCourseIds().contains(c.getId())).collect(Collectors.toList());
+		List<CourseSchedule> mergeCourses = allCourses.stream().filter(c->courseMergeInfo.getMergeCourseIds().contains(c.getId())&&!c.getId().equals(courseMergeInfo.getId())).collect(Collectors.toList());
 		for (CourseSchedule courseSchedule : mergeCourses) {
 			CourseScheduleModifyLog courseScheduleModifyLog = new CourseScheduleModifyLog();
 			courseScheduleModifyLog.setCourseScheduleId(courseSchedule.getId());
@@ -5291,9 +5302,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
 			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
 			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
-			courseSchedule.setActualTeacherId(courseMergeInfo.getActualTeacherId());
-			courseSchedule.setClassGroupId(courseMergeInfo.getClassGroupId());
-			courseSchedule.setSchoolId(courseMergeInfo.getSchoolId());
+//			courseSchedule.setActualTeacherId(courseMergeInfo.getActualTeacherId());
+//			courseSchedule.setClassGroupId(courseMergeInfo.getClassGroupId());
+//			courseSchedule.setSchoolId(courseMergeInfo.getSchoolId());
 
 			courseScheduleModifyLog.setCurrentCourseSchedule(JsonUtil.toJSONString(courseSchedule));
 			courseScheduleModifyLog.setOperatorId(courseMergeInfo.getOperatorId());

+ 34 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -7,7 +7,6 @@ import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
@@ -16,13 +15,9 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.thirdparty.yqpay.DateUtils;
 import com.ym.mec.util.date.DateUtil;
-import org.springframework.beans.BeanUtils;
 import com.ym.mec.util.collection.MapUtil;
-import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
@@ -327,30 +322,40 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 			for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
 				//当前课程类型总课程时长
 				Integer typeCourseDuration = courseTypeCourseDurationMap.get(courseScheduleTypeListEntry.getKey());
-				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, studentId, courseScheduleTypeListEntry.getKey(), typeCourseDuration);
-				if(Objects.isNull(musicGroupPaymentStudentCourseDetail)||musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes().compareTo(typeCourseDuration)<0){
+
+				String batchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, studentId, courseScheduleTypeListEntry.getKey());
+
+				List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(batchNo, studentId, courseScheduleTypeListEntry.getKey());
+				int totalCourseMinutes = musicGroupPaymentStudentCourseDetails.stream().mapToInt(MusicGroupPaymentStudentCourseDetail::getTotalCourseMinutes).reduce(0, Integer::sum);
+				if(CollectionUtils.isEmpty(musicGroupPaymentStudentCourseDetails)||totalCourseMinutes<typeCourseDuration){
 					SysUser user = teacherDao.getUser(studentId);
 					throw new BizException("{}在{}课程类型上的课程时长不足", user.getUsername(), courseScheduleTypeListEntry.getKey().getMsg());
 				}
 
-				MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentStudentCourseDetail.getMusicGroupPaymentCalenderId());
-				if(Objects.isNull(musicGroupPaymentCalender)||!musicGroupId.equals(musicGroupPaymentCalender.getMusicGroupId())){
+				Set<Long> calenderIds = musicGroupPaymentStudentCourseDetails.stream().map(MusicGroupPaymentStudentCourseDetail::getMusicGroupPaymentCalenderId).collect(Collectors.toSet());
+
+				List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.queryByIds(calenderIds);
+				if(CollectionUtils.isEmpty(musicGroupPaymentCalenders)||musicGroupPaymentCalenders.size()!=calenderIds.size()){
 					throw new BizException("缴费设置异常");
 				}
 
-				MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalenderAndCourseType(musicGroupPaymentStudentCourseDetail.getMusicGroupPaymentCalenderId(), courseScheduleTypeListEntry.getKey());
-				if(Objects.isNull(musicGroupPaymentCalenderCourseSettings)||musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties().compareTo(musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes())!=0){
+				List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalendersAndCourseType(calenderIds, courseScheduleTypeListEntry.getKey());
+				int originalCourseTotalMinutes = musicGroupPaymentCalenderCourseSettings.stream().mapToInt(MusicGroupPaymentCalenderCourseSettings::getCourseTotalMinuties).reduce(0, Integer::sum);
+				if(Objects.isNull(musicGroupPaymentCalenderCourseSettings)||originalCourseTotalMinutes!=totalCourseMinutes){
 					throw new BizException("缴费设置异常");
 				}
 
-				allBatchNos.add(musicGroupPaymentCalender.getBatchNo());
+				allBatchNos.add(batchNo);
+
+				BigDecimal totalCourseOriginalPrice = musicGroupPaymentCalenderCourseSettings.stream().map(MusicGroupPaymentCalenderCourseSettings::getCourseOriginalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+				BigDecimal totalCourseCurrentPrice = musicGroupPaymentCalenderCourseSettings.stream().map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 
 				//课程每分钟原价
-				BigDecimal unitMinuteOriginalPrice = musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal unitMinuteOriginalPrice = totalCourseOriginalPrice.divide(new BigDecimal(originalCourseTotalMinutes), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 				//课程每分钟现价
-				BigDecimal unitMinuteCurrentPrice = musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().divide(new BigDecimal(musicGroupPaymentCalenderCourseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				BigDecimal unitMinuteCurrentPrice = totalCourseCurrentPrice.divide(new BigDecimal(originalCourseTotalMinutes), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
-				if(MusicGroupPaymentCalender.PayUserType.SCHOOL.equals(musicGroupPaymentCalender.getPayUserType())){
+				if(MusicGroupPaymentCalender.PayUserType.SCHOOL.equals(musicGroupPaymentCalenders.get(0).getPayUserType())){
 					unitMinuteCurrentPrice = new BigDecimal("0");
 				}
 
@@ -374,7 +379,7 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
 					cssp.setCourseScheduleId(courseSchedule.getId());
 					cssp.setClassGroupId(courseSchedule.getClassGroupId());
-					cssp.setBatchNo(musicGroupPaymentCalender.getBatchNo());
+					cssp.setBatchNo(batchNo);
 					cssp.setUserId(studentId);
 					cssp.setOriginalPrice(courseOriginalPrice);
 					cssp.setExpectPrice(courseCurrentPrice);
@@ -382,13 +387,21 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 					typeCourseStudentPayments.add(cssp);
 				}
 
-				typeCourseStudentPayments.get(0).setOriginalPrice(typeCourseStudentPayments.get(0).getOriginalPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseOriginalPrice().subtract(typeCourseTotalOriginalPrice)));
-				if(MusicGroupPaymentCalender.PayUserType.STUDENT.equals(musicGroupPaymentCalender.getPayUserType())) {
-					typeCourseStudentPayments.get(0).setExpectPrice(typeCourseStudentPayments.get(0).getExpectPrice().add(musicGroupPaymentCalenderCourseSettings.getCourseCurrentPrice().subtract(typeCourseTotalCurrentPrice)));
+				typeCourseStudentPayments.get(0).setOriginalPrice(typeCourseStudentPayments.get(0).getOriginalPrice().add(totalCourseOriginalPrice.subtract(typeCourseTotalOriginalPrice)));
+				if(MusicGroupPaymentCalender.PayUserType.STUDENT.equals(musicGroupPaymentCalenders.get(0).getPayUserType())) {
+					typeCourseStudentPayments.get(0).setExpectPrice(typeCourseStudentPayments.get(0).getExpectPrice().add(totalCourseCurrentPrice.subtract(typeCourseTotalCurrentPrice)));
 				}
 				courseScheduleStudentPayments.addAll(typeCourseStudentPayments);
-				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(typeCourseDuration);
-				musicGroupPaymentStudentCourseDetailDao.update(musicGroupPaymentStudentCourseDetail);
+				for (MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail : musicGroupPaymentStudentCourseDetails) {
+					if(typeCourseDuration>musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes()){
+						musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes());
+						typeCourseDuration = typeCourseDuration-musicGroupPaymentStudentCourseDetail.getTotalCourseMinutes();
+					}else{
+						musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(typeCourseDuration);
+						typeCourseDuration = 0;
+					}
+				}
+				musicGroupPaymentStudentCourseDetailDao.batchUpdate(musicGroupPaymentStudentCourseDetails);
 			}
 		}
 		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);

+ 57 - 44
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -719,46 +719,56 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	}
 
 	@Override
-	public MusicGroupPaymentCalenderAuditDetailDto auditListDetail(Long calenderId) {
+	public MusicGroupPaymentCalenderAuditDetailDto auditListDetail(String batchNo) {
 		MusicGroupPaymentCalenderAuditDetailDto calenderAuditDetailDto = new MusicGroupPaymentCalenderAuditDetailDto();
-		MusicGroupPaymentCalenderAuditDto auditDto = musicGroupPaymentCalenderDao.getAuditDetail(calenderId);
-		if(auditDto.getOrganId() != null){
-			Organization organization = organizationDao.get(auditDto.getOrganId());
-			auditDto.setOrganName(organization.getName());
-		}
+		MusicGroupPaymentCalenderAuditDto auditDto = musicGroupPaymentCalenderDao.getAuditDetail(batchNo);
 		calenderAuditDetailDto.setAuditDto(auditDto);
-
 		//获取收费标准
-		calenderAuditDetailDto.setMusicGroupPaymentCalenderCourseSettings(musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(calenderId));
+		calenderAuditDetailDto.setMusicGroupPaymentCalenderCourseSettings(musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettingsByBatchNo(batchNo));
 		//获取学员列表
-		calenderAuditDetailDto.setBasicUserDtos(musicGroupPaymentCalenderDetailDao.querySimpleUserDto(calenderId,auditDto.getMusicGroupId()));
-		calenderAuditDetailDto.setStudentNum(calenderAuditDetailDto.getSimpleUserDto().size());
+//		calenderAuditDetailDto.setBasicUserDtos(musicGroupPaymentCalenderDetailDao.querySimpleUserDto(batchNo,auditDto.getMusicGroupId()));
+//		calenderAuditDetailDto.setStudentNum(calenderAuditDetailDto.getSimpleUserDto().size());
+		//获取缴费周期
+		List<MusicGroupPaymentCalender> groupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+		calenderAuditDetailDto.setMusicGroupPaymentCalenders(groupPaymentCalenders);
 		return calenderAuditDetailDto;
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void auditPass(Long calenderId,String auditMemo) {
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
-		Date date = new Date();
-		//如果是报名项目,将乐团改为审核中,缴费项目修改状态,审核状态改为审核通过
-		if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
-			musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-		}else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
-			musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-		}else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
-			musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
-		}else {
-			musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+	public void auditPass(String batchNo,String auditMemo) {
+		List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+		if(musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0){
+			throw new BizException("缴费项目不存在");
 		}
-		musicGroupPaymentCalender.setAuditMemo(auditMemo);
-		musicGroupPaymentCalender.setUpdateTime(date);
+		Date date = new Date();
+		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+			//如果是报名项目,将乐团改为审核中,缴费项目修改状态,审核状态改为审核通过
+			if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
+				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+			}else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+			}else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
+			}else {
+				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+			}
+			musicGroupPaymentCalender.setAuditMemo(auditMemo);
+			musicGroupPaymentCalender.setUpdateTime(date);
 
+			if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
+				musicGroupPaymentCalender.setExpectNum(1);
+				List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(musicGroupPaymentCalender.getId());
+				addStudent(musicGroupPaymentCalender,musicGroupPaymentCalenderCourseSettings);
+			}
+		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
 		//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
-		if (musicGroupPaymentCalender.getPaymentType() == MUSIC_APPLY) {
-			int count = musicGroupPaymentCalenderDao.countAuditReject(musicGroupPaymentCalender.getMusicGroupId(),calenderId);
+		if (calender.getPaymentType() == MUSIC_APPLY) {
+			//统计乐团还在审核中或者审核被拒的缴费
+			int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(),calender.getId());
 			if(count == 0){
-				MusicGroup musicGroup = musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId());
+				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 				musicGroup.setStatus(MusicGroupStatusEnum.AUDIT);
 				musicGroup.setUpdateTime(date);
 				musicGroupDao.update(musicGroup);
@@ -772,35 +782,38 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				roleIds.add(SysUserRole.SECTION_MANAGER);
 				sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY, "", sysUser.getUsername());
 			}
-		}else if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
-			musicGroupPaymentCalender.setExpectNum(1);
-			List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(calenderId);
-			addStudent(musicGroupPaymentCalender,musicGroupPaymentCalenderCourseSettings);
 		}
-		musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+		musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void auditRefuse(Long calenderId,String auditMemo) {
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
+	public void auditRefuse(String batchNo,String auditMemo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null || sysUser.getId() == null){
+			throw new BizException("请重新登录");
+		}
+		List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+		if(musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0){
+			throw new BizException("缴费项目不存在");
+		}
 		Date date = new Date();
-		musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.REJECT);
-		musicGroupPaymentCalender.setUpdateTime(date);
-		musicGroupPaymentCalender.setAuditMemo(auditMemo);
-		musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-		if (musicGroupPaymentCalender.getPaymentType() == MUSIC_APPLY) {
-			MusicGroup musicGroup = musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId());
+		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+			musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.REJECT);
+			musicGroupPaymentCalender.setUpdateTime(date);
+			musicGroupPaymentCalender.setAuditMemo(auditMemo);
+		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
+		//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
+		if (calender.getPaymentType() == MUSIC_APPLY) {
+			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 			musicGroup.setStatus(MusicGroupStatusEnum.DRAFT);
 			musicGroup.setUpdateTime(date);
 			musicGroupDao.update(musicGroup);
-			SysUser sysUser = sysUserFeignService.queryUserInfo();
-			if(sysUser == null || sysUser.getId() == null){
-				throw new BizException("请重新登录");
-			}
 			//记录操作日志
 			musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目失败(费用审核中 -> 草稿)", sysUser.getId(), ""));
 		}
+		musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
 	}
 
 	//推送待续费通知

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

@@ -776,7 +776,7 @@
     </select>
 
     <select id="queryMusicGroupCourseScheduleDetail" resultMap="MusicGroupCourseScheduleDto">
-        SELECT (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END) course_schedule_id_,
+        SELECT cs.id_ course_schedule_id_,
         cs.class_date_,
         cs.start_class_time_,
         cs.end_class_time_,
@@ -793,8 +793,8 @@
         cs.schoole_id_ school_id_
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
-        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END)
-        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END) AND csts.teacher_role_ = 'BISHOP'
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_ AND csts.teacher_role_ = 'BISHOP'
         <include refid="queryMusicGroupCourseScheduleDetailSql"/>
         ORDER BY cs.class_date_ ,cs.start_class_time_ ,cg.name_
         <include refid="global.limit"/>
@@ -804,8 +804,8 @@
         SELECT COUNT(cs.id_)
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
-        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END)
-        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END) AND csts.teacher_role_ = 'BISHOP'
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_ AND csts.teacher_role_ = 'BISHOP'
         <include refid="queryMusicGroupCourseScheduleDetailSql"/>
     </select>
 

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

@@ -1007,6 +1007,8 @@
             cssp.user_id_=#{userId}
             AND cs.status_ != 'NOT_START'
             AND cs.del_flag_ = 0
+            AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
+            AND cs.new_course_id_ IS NULL
             <if test="teachMode!=null and teachMode!=''">
                 AND cs.teach_mode_=#{teachMode}
             </if>
@@ -1068,10 +1070,12 @@
                  LEFT JOIN course_schedule cs ON cs.class_group_id_ = cgsm.class_group_id_
                  LEFT JOIN sys_user su ON cs.teacher_id_ = su.id_
         WHERE (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-          AND cs.status_ = 'NOT_START'
-          AND cgsm.user_id_ = #{userId}
-          AND cs.class_date_ = DATE_FORMAT(#{date}, '%Y%m%d')
-          AND cgsm.status_ != 'QUIT'
+            AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
+            AND cs.new_course_id_ IS NULL
+            AND cs.status_ = 'NOT_START'
+            AND cgsm.user_id_ = #{userId}
+            AND cs.class_date_ = DATE_FORMAT(#{date}, '%Y%m%d')
+            AND cgsm.status_ != 'QUIT'
         ORDER BY cs.class_date_, cs.start_class_time_
     </select>
     <select id="findCourseScheduleByMusicGroup" resultMap="CourseSchedule">
@@ -1762,7 +1766,7 @@
         from course_schedule cs
                  right join course_schedule_teacher_salary cssp on cs.id_ = cssp.course_schedule_id_
                  left join sys_user u on u.id_ = cssp.user_id_
-        where class_date_ = date(DATE_ADD(now(), INTERVAL 1 DAY))
+        where cs.new_course_id_ IS NULL AND class_date_ = date(DATE_ADD(now(), INTERVAL 1 DAY))
         group by cssp.user_id_
     </select>
 
@@ -1829,7 +1833,8 @@
                cs.leave_student_num_,
                cs.schoole_id_
         FROM course_schedule cs
-        WHERE cs.class_date_ BETWEEN #{startDate} AND #{endDate}
+        WHERE cs.new_course_id_ IS NULL
+          AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
           AND cs.group_type_ = 'MUSIC'
           AND (cs.del_flag_ IS NULL OR cs.del_flag_ = 0)
     </select>
@@ -2311,7 +2316,7 @@
 
     <select id="endFindCourseSchedules" resultMap="CourseScheduleEndDto">
         SELECT
-            (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END) id_,
+            cs.id_ id_,
             cs.new_course_id_,
             cs.group_type_,
             cs.music_group_id_,
@@ -2334,6 +2339,7 @@
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
             LEFT JOIN organization o ON cs.organ_id_=o.id_
+            LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
             left join teacher_attendance ta on ta.course_schedule_id_ = cs.id_ and ta.is_complaints_ = 1
             LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.remark_ IS NULL
             <include refid="endFindCourseSchedulesCondition"/>
@@ -2347,7 +2353,8 @@
         COUNT(DISTINCT cs.id_)
         FROM
         course_schedule cs
-        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = (CASE WHEN cs.new_course_id_ IS NULL THEN cs.id_ ELSE cs.new_course_id_ END) AND sa.remark_ IS NULL
+        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.remark_ IS NULL
+        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
     </select>
     <select id="findCourseIdsByStudent" resultType="int">
@@ -2442,7 +2449,10 @@
             AND cs.teach_mode_ = #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         <if test="teacherIdList != null">
-            AND cs.actual_teacher_id_=#{teacherIdList}
+            AND csts.user_id_=#{teacherIdList}
+        </if>
+        <if test="teachType != null">
+            AND csts.teacher_role_ = #{teachType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         <if test="organIdList!=null">
             AND FIND_IN_SET(cs.organ_id_,#{organIdList})
@@ -3342,9 +3352,9 @@
         SELECT COUNT(id_) FROM course_schedule WHERE new_course_id_=#{courseId}
     </select>
     <select id="querySubCourseNumMap" resultType="java.util.Map">
-        SELECT cs.group_type_ 'key',COUNT(cs.id_) 'value' FROM course_schedule cs
+        SELECT cs.type_ 'key',COUNT(cs.id_) 'value' FROM course_schedule cs
         WHERE cs.class_group_id_ = #{classGroupId} AND CONCAT(cs.class_date_," ",cs.start_class_time_) > NOW()
-        GROUP BY cs.group_type_
+        GROUP BY cs.type_
     </select>
     <select id="getLock" resultMap="CourseSchedule">
         SELECT * FROM course_schedule WHERE id_ = #{courseId} FOR UPDATE

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

@@ -173,15 +173,6 @@
 			AND user_id_ = #{userId}
 		</if>
 	</update>
-	<select id="getExamSongDownloadStatus" resultType="String">
-		SELECT exam_song_download_json_
-		FROM course_schedule_student_payment
-		WHERE course_schedule_id_ = #{roomId}
-		<if test="userId != null">
-			AND user_id_ = #{userId}
-		</if>
-	</select>
-
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM course_schedule_student_payment WHERE id_ = #{id}
@@ -511,6 +502,10 @@
 		SELECT cssp.open_play_midi_ FROM course_schedule_student_payment cssp
 		WHERE cssp.user_id_ = #{userId} AND cssp.course_schedule_id_ = #{courseScheduleId}
 	</select>
+	<select id="getExamJsonByCourseIdAndUserId" resultType="java.lang.String">
+		SELECT cssp.exam_song_download_json_ FROM course_schedule_student_payment cssp
+		WHERE cssp.user_id_ = #{userId} AND cssp.course_schedule_id_ = #{courseScheduleId}
+	</select>
 
     <select id="findGroupCoursesUnitPrice" resultType="java.util.Map">
 		SELECT

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderCourseSettingsMapper.xml

@@ -113,6 +113,15 @@
 		SELECT * FROM music_group_payment_calender_course_settings WHERE music_group_payment_calender_id_=#{calenderId} AND course_type_=#{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>
 
+	<select id="getWithPaymentCalendersAndCourseType" resultMap="MusicGroupPaymentCalenderCourseSettings">
+		SELECT * FROM music_group_payment_calender_course_settings
+		WHERE music_group_payment_calender_id_ IN
+			<foreach collection="calenderIds" item="calenderId" open="(" close=")" separator=",">
+				#{calenderId}
+			</foreach>
+			AND course_type_=#{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+	</select>
+
 	<delete id="deleteByMusicGroupPaymentCalenderId">
 		DELETE FROM music_group_payment_calender_course_settings WHERE music_group_payment_calender_id_ = #{musicGroupPaymentCalenderId}
 	</delete>
@@ -137,4 +146,12 @@
 		SELECT * FROM music_group_payment_calender_course_settings mgpccs
 		WHERE mgpccs.music_group_payment_calender_id_ = #{calenderId}
 	</select>
+	<select id="queryCalenderCourseSettingsByBatchNo" resultMap="MusicGroupPaymentCalenderCourseSettings">
+		SELECT MAX(mgpccs.music_group_payment_calender_id_) music_group_payment_calender_id_,
+		mgpccs.course_type_,SUM(mgpccs.course_total_minuties_) course_total_minuties_,SUM(mgpccs.unit_price_) unit_price_,SUM(mgpccs.course_original_price_)course_original_price_,
+				SUM(mgpccs.course_current_price_)course_current_price_,MAX(mgpccs.is_student_optional_)is_student_optional_,MAX(mgpccs.name_)name_ FROM music_group_payment_calender_course_settings mgpccs
+		LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpccs.music_group_payment_calender_id_
+		WHERE mgpc.batch_no_ = #{batchNo}
+		GROUP BY mgpccs.course_type_
+	</select>
 </mapper>

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

@@ -351,10 +351,11 @@
     <select id="querySimpleUserDto" resultMap="SimpleUserDtoMap">
 		SELECT su.id_,su.username_,s.name_ subject_name_,mgpcd.actual_amount_
 		FROM music_group_payment_calender_detail mgpcd
+		LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpcd.music_group_payment_calender_id_
 		LEFT JOIN sys_user su ON su.id_ = mgpcd.user_id_
-		LEFT JOIN student_registration sr ON sr.user_id_ = mgpcd.user_id_ AND sr.music_group_status_ != 'QUIT' AND sr.music_group_id_ = #{musicGroupId}
+		LEFT JOIN student_registration sr ON sr.user_id_ = mgpcd.user_id_ AND sr.music_group_status_ != 'QUIT' AND sr.music_group_id_ = mgpc.music_group_id_
 		LEFT JOIN `subject` s ON s.id_ = sr.subject_id_
-		WHERE mgpcd.music_group_payment_calender_id_ = #{calenderId}
+		WHERE mgpc.batch_no_ = #{batchNo}
 	</select>
 	<select id="sumActualAmount" resultType="java.math.BigDecimal">
 		SELECT SUM(mgpcd.actual_amount_) FROM music_group_payment_calender_detail mgpcd

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

@@ -402,8 +402,10 @@
 
     <resultMap id="MusicGroupPaymentCalenderAuditDtoMap" type="com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto">
         <result property="musicGroupId" column="music_group_id_"/>
+        <result property="batchNo" column="batch_no_"/>
         <result property="musicGroupName" column="music_group_name_"/>
         <result property="organId" column="organ_id_"/>
+        <result property="organName" column="organ_name_"/>
         <result property="createTime" column="create_time_"/>
         <result property="paymentType" column="payment_type_"/>
         <result property="memo" column="memo_"/>
@@ -441,21 +443,20 @@
         </where>
     </sql>
     <select id="countAuditList" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT mgpc.id_)
+        SELECT COUNT(DISTINCT mgpc.batch_no_)
         FROM music_group_payment_calender mgpc
         LEFT JOIN music_group mg ON mg.id_ = mgpc.music_group_id_
         <include refid="MusicGroupPaymentCalenderAuditDtoSql"/>
     </select>
     <select id="queryAuditList" resultMap="MusicGroupPaymentCalenderAuditDtoMap">
-        SELECT mgpc.id_,mgpc.music_group_id_,mgpc.create_time_,mgpc.payment_type_,mgpc.operator_,
-        mgpc.pay_user_type_,mgpc.memo_,mgpc.status_,SUM(mgpccs.course_total_minuties_) course_total_minuties_,
+        SELECT mgpc.batch_no_,MAX(mgpc.music_group_id_) music_group_id_
+        ,MAX(mgpc.create_time_) create_time_,MAX(mgpc.payment_type_) payment_type_,MAX(mgpc.operator_) operator_,
+        MAX(mgpc.pay_user_type_) pay_user_type_,MAX(mgpc.memo_) memo_,MAX(mgpc.status_) status_,
+        SUM(mgpccs.course_total_minuties_) course_total_minuties_,
         SUM(mgpccs.course_original_price_) course_original_price_,SUM(mgpccs.course_current_price_) course_current_price_,
-        MAX(mg.name_) music_group_name_,MAX(mg.organ_id_) organ_id_,mgpc.payment_pattern_
-        FROM music_group_payment_calender mgpc
-        LEFT JOIN music_group mg ON mg.id_ = mgpc.music_group_id_
-        LEFT JOIN music_group_payment_calender_course_settings mgpccs ON mgpc.id_ = mgpccs.music_group_payment_calender_id_
+        MAX(mg.name_) music_group_name_,MAX(mg.organ_id_) organ_id_,MAX(mgpc.payment_pattern_)payment_pattern_
         <include refid="MusicGroupPaymentCalenderAuditDtoSql"/>
-        GROUP BY mgpc.id_
+        GROUP BY mgpc.batch_no_
         ORDER BY create_time_ DESC
         <include refid="global.limit"/>
     </select>
@@ -471,15 +472,14 @@
         GROUP BY mgpcd.music_group_payment_calender_id_
     </select>
     <select id="getAuditDetail" resultMap="MusicGroupPaymentCalenderAuditDtoMap">
-        SELECT mgpc.id_,mgpc.music_group_id_,mgpc.create_time_,mgpc.payment_type_,mgpc.operator_,
-        mgpc.pay_user_type_,mgpc.memo_,mgpc.status_,SUM(mgpccs.course_total_minuties_) course_total_minuties_,
-        SUM(mgpccs.course_original_price_) course_original_price_,SUM(mgpccs.course_current_price_) course_current_price_,
-        MAX(mg.name_) music_group_name_,MAX(mg.organ_id_) organ_id_,MAX(mgpccs.name_) calender_settings_name_,mgpc.payment_pattern_,mgpc.payment_valid_start_date_,
-        mgpc.payment_valid_end_date_,mgpc.start_payment_date_,mgpc.deadline_payment_date_,mgpc.audit_memo_,mgpc.payment_amount_,mgpc.is_give_music_network_
+        SELECT mgpc.batch_no_,MAX(mgpc.music_group_id_) music_group_id_
+        ,MAX(mgpc.create_time_) create_time_,MAX(mgpc.payment_type_) payment_type_,
+        MAX(mgpc.pay_user_type_) pay_user_type_,MAX(mg.name_) music_group_name_,MAX(mgpc.payment_pattern_)payment_pattern_,MAX(o.name_) organ_name_
         FROM music_group_payment_calender mgpc
         LEFT JOIN music_group mg ON mg.id_ = mgpc.music_group_id_
-        LEFT JOIN music_group_payment_calender_course_settings mgpccs ON mgpc.id_ = mgpccs.music_group_payment_calender_id_
-        WHERE mgpc.id_ = #{calenderId} LIMIT 1
+        LEFT JOIN organization o ON o.id_ = mg.organ_id_
+        WHERE mgpc.batch_no_ = #{batchNo}
+        GROUP BY mgpc.batch_no_
     </select>
     <select id="findByMusicGroupRegCalender" resultMap="MusicGroupPaymentCalender">
         SELECT * FROM music_group_payment_calender WHERE music_group_id_=#{musicGroupId} AND payment_type_='MUSIC_APPLY'

+ 60 - 11
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -85,6 +85,35 @@
         WHERE id_ = #{id}
     </update>
 
+    <update id="batchUpdate"
+            parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail">
+        <foreach collection="paymentCourseDetails" item="paymentCourseDetail" separator=";">
+            UPDATE music_group_payment_student_course_detail
+            <set>
+                <if test="paymentCourseDetail.usedCourseMinutes != null">
+                    used_course_minutes_ = #{paymentCourseDetail.usedCourseMinutes},
+                </if>
+                <if test="paymentCourseDetail.totalCourseMinutes != null">
+                    total_course_minutes_ = #{paymentCourseDetail.totalCourseMinutes},
+                </if>
+                <if test="paymentCourseDetail.userId != null">
+                    user_id_ = #{paymentCourseDetail.userId},
+                </if>
+                <if test="paymentCourseDetail.musicGroupPaymentCalenderDetailId != null">
+                    music_group_payment_calender_detail_id_ = #{paymentCourseDetail.musicGroupPaymentCalenderDetailId},
+                </if>
+                <if test="paymentCourseDetail.musicGroupPaymentCalenderId != null">
+                    music_group_payment_calender_id_ = #{paymentCourseDetail.musicGroupPaymentCalenderId},
+                </if>
+                <if test="paymentCourseDetail.courseType != null">
+                    course_type_ = #{paymentCourseDetail.courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                update_time_ = #{paymentCourseDetail.updateTime}
+            </set>
+            WHERE id_ = #{paymentCourseDetail.id}
+        </foreach>
+    </update>
+
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
         DELETE
@@ -104,28 +133,48 @@
         SELECT COUNT(*)
         FROM music_group_payment_student_course_detail
     </select>
+
     <select id="getUnUseWithStudentAndCourseTypeAndCourseMinutes" resultMap="MusicGroupPaymentStudentCourseDetail">
         SELECT mgpscd.*
-        FROM music_group_payment_student_course_detail mgpscd
-        LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+            FROM music_group_payment_student_course_detail mgpscd
+            LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
         WHERE
-          mgpc.music_group_id_ = #{musicGroupId}
+          mgpc.batch_no_ = #{batchNo}
           AND mgpscd.user_id_ = #{studentId}
           AND mgpscd.course_type_ = #{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-          AND mgpscd.total_course_minutes_ &gt;= #{courseMinutes}
           AND mgpscd.used_course_minutes_ &lt;= 0
-        ORDER BY mgpscd.id_
-        LIMIT 1;
+        ORDER BY mgpscd.id_;
     </select>
+
+    <select id="getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes" resultType="string">
+        SELECT
+            mgpc.batch_no_
+        FROM music_group_payment_calender mgpc
+            LEFT JOIN music_group_payment_student_course_detail mgpscd ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+        WHERE
+            mgpc.music_group_id_ = #{musicGroupId}
+            AND mgpscd.user_id_ = #{studentId}
+            AND mgpscd.course_type_ = #{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        GROUP BY mgpc.batch_no_ HAVING SUM(mgpscd.used_course_minutes_) &lt;=0 ORDER BY MIN(mgpc.id_) LIMIT 1;
+    </select>
+
     <select id="getUnUseWithStudents" resultMap="MusicGroupPaymentStudentCourseDetail">
-        SELECT * FROM music_group_payment_student_course_detail mgpscd
-        LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
-        WHERE used_course_minutes_ &lt;= 0
-        AND mgpc.music_group_id_ = #{musicGroupId}
-        AND user_id_ IN
+        SELECT
+            MIN(mgpscd.id_) id_,
+            MIN(mgpscd.music_group_payment_calender_id_) music_group_payment_calender_id_,
+            mgpscd.user_id_,
+            mgpscd.course_type_,
+            SUM(mgpscd.total_course_minutes_) total_course_minutes_,
+            SUM(mgpscd.used_course_minutes_) used_course_minutes_
+        FROM music_group_payment_student_course_detail mgpscd
+            LEFT JOIN music_group_payment_calender mgpc ON mgpscd.music_group_payment_calender_id_ = mgpc.id_
+        WHERE mgpc.music_group_id_ = #{musicGroupId}
+            AND user_id_ IN
         <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
             #{studentId}
         </foreach>
+        GROUP BY mgpscd.user_id_,mgpscd.course_type_,mgpc.batch_no_
+        HAVING used_course_minutes_ &lt;= 0
     </select>
 
     <delete id="deleteByUserIdAndMusicGroupId">

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

@@ -420,6 +420,7 @@
         FROM course_schedule cs RIGHT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
         LEFT JOIN sys_user u on ta.teacher_id_ = u.id_
         WHERE ta.sign_out_status_ IS NULL
+        AND cs.new_course_id_ IS NULL
         AND CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) &lt;= DATE_SUB(now(),INTERVAL #{minutes} MINUTE) AND cs.del_flag_ = 0
         AND cs.group_type_ = 'MUSIC'
     </select>
@@ -477,7 +478,9 @@
     <select id="queryTeacherExceptionAttendance" resultType="java.lang.Integer">
         SELECT DISTINCT ta.teacher_id_ FROM teacher_attendance ta
         LEFT JOIN course_schedule cs ON cs.id_ = ta.course_schedule_id_
-        WHERE cs.class_date_ = #{format} AND ta.teacher_id_ = cs.actual_teacher_id_ AND CONCAT(cs.class_date_,' ',cs.end_class_time_) &lt; NOW()
+        WHERE cs.class_date_ = #{format}
+        AND cs.new_course_id_ IS NULL
+        AND ta.teacher_id_ = cs.actual_teacher_id_ AND CONCAT(cs.class_date_,' ',cs.end_class_time_) &lt; NOW()
         AND (ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 OR ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0)
     </select>
     <resultMap id="TeacherAttendanceComplaintsDtoMap" type="com.ym.mec.biz.dal.dto.TeacherAttendanceComplaintsDto">

+ 24 - 6
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -9,6 +9,7 @@ import com.ym.service.MessageService;
 import com.ym.service.RoomService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -21,6 +22,8 @@ public class RoomController{
     RoomService roomService;
     @Autowired
     MessageService messageService;
+    @Autowired
+    private RedisTemplate<String,String> redisTemplate;
 
     @RequestMapping(value = "/join", method = RequestMethod.POST)
     public Object joinRoom(@RequestBody ReqUserData data) throws Exception {
@@ -48,6 +51,25 @@ public class RoomController{
         return new BaseResponse<>();
     }
 
+    @RequestMapping(value = "pushDownloadExamSongMsg", method = RequestMethod.POST)
+    public Object pushDownloadExamSongMsg(@RequestBody ExamSongData examSongData) throws Exception {
+        roomService.pushDownloadExamSongMsg(examSongData.getRoomId(),examSongData.getExamSongId());
+        return new BaseResponse<>();
+    }
+
+    @RequestMapping(value = "joinRoomStatusNotify", method = RequestMethod.POST)
+    public Object joinRoomStatusNotify(@RequestBody RoomStatusNotify roomStatusNotify) throws Exception {
+        log.info("joinRoomStatusNotify: {}",JSONObject.toJSON(roomStatusNotify));
+        String roomId = roomStatusNotify.getRoomId();
+        String userId = roomStatusNotify.getUserId();
+        if(roomStatusNotify.isRequestStatus()){
+            roomService.joinRoomSuccess(roomId, userId);
+        }else {
+            roomService.joinRoomFailure(roomId, userId);
+        }
+        return new BaseResponse<>();
+    }
+
     @RequestMapping(value = "/statusSync")
     public void statusSync(@RequestBody String body) throws Exception {
         ChannelStateNotify notify = JSONObject.parseObject(body, ChannelStateNotify.class);
@@ -138,18 +160,14 @@ public class RoomController{
             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.getPlaySongOn() != null) {
+            result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.PlaySong, data.getPlaySongOn());
         } else {
             throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);
         }
         return new BaseResponse<>(result);
     }
 
-    @RequestMapping(value = "pushDownloadExamSongMsg", method = RequestMethod.POST)
-    public Object pushDownloadExamSongMsg(@RequestBody ExamSongData examSongData) throws Exception {
-        roomService.pushDownloadExamSongMsg(examSongData.getRoomId(),examSongData.getExamSongId());
-        return new BaseResponse<>();
-    }
-
     @RequestMapping(value = "adjustExamSong", method = RequestMethod.POST)
     public Object adjustExamSong(@RequestBody ExamSongData examSongData) throws Exception {
         roomService.adjustExamSong(examSongData.getRoomId(),examSongData.getStatus(),examSongData.getExamSongId());

+ 0 - 4
mec-im/src/main/java/com/ym/dao/RoomMemberDao.java

@@ -58,8 +58,4 @@ public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
     int updateMusicByRidAndUid(String rid, String uid, boolean musicMode);
 
     boolean existsByRidAndUid(String rid, String uid);
-
-    @Modifying
-    @Query(value = "DELETE FROM rongyun_room_member WHERE rid = ?1 AND uid != ?2", nativeQuery = true)
-    void deleteRoomMember(String roomId, String userId);
 }

+ 8 - 5
mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadMessageMessage.java

@@ -2,12 +2,15 @@ package com.ym.mec.im.message;
 
 import com.ym.mec.im.BaseMessage;
 import com.ym.pojo.ExamSongMessage;
-import org.apache.commons.lang3.StringUtils;
 
 public class ExamSongDownloadMessageMessage extends BaseMessage {
     private ExamSongMessage content;
     private static final transient String TYPE = "DY:examSongDownloadMessage";
 
+    public ExamSongDownloadMessageMessage(ExamSongMessage content) {
+        this.content = content;
+    }
+
     public ExamSongMessage getContent() {
         return content;
     }
@@ -18,10 +21,10 @@ public class ExamSongDownloadMessageMessage extends BaseMessage {
 
     @Override
     public String toString() {
-        return "{\"url\":" + content.getUrl() +
-                ", \"songName\":" + content.getSongName() +
-                ", \"songId\":" + content.getSongId() +
-                '}';
+        return "{\"examSongName\":\"" + content.getExamSongName() +
+                "\", \"examSongId\":\"" + content.getExamSongId() +
+                "\", \"url\":\"" + content.getUrl() +
+                "\"}";
     }
 
     @Override

+ 24 - 0
mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadStatusMessage.java

@@ -0,0 +1,24 @@
+package com.ym.mec.im.message;
+
+import com.ym.mec.im.BaseMessage;
+import lombok.Getter;
+import lombok.Setter;
+
+public class ExamSongDownloadStatusMessage extends BaseMessage {
+    private @Setter @Getter Integer status;
+
+    private @Setter @Getter Integer studentId;
+
+    private @Setter @Getter Integer examSongId;
+
+    public ExamSongDownloadStatusMessage(Integer status,Integer studentId,Integer examSongId) {
+        this.status = status;
+        this.studentId = studentId;
+        this.examSongId = examSongId;
+    }
+
+    @Override
+    public String getObjectName() {
+        return "DY:DSMsg";
+    }
+}

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

@@ -8,6 +8,5 @@ public enum DeviceTypeEnum {
     Camera,
     MusicMode,
     HandUp,
-    ExamSong,
-    PlayMidi,
+    PlaySong,
 }

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

@@ -28,4 +28,13 @@ public class ExamSongData {
 	public void setExamSongId(Integer examSongId) {
 		this.examSongId = examSongId;
 	}
+
+	@Override
+	public String toString() {
+		return "ExamSongData{" +
+				"roomId='" + roomId + '\'' +
+				", examSongId=" + examSongId +
+				", status=" + status +
+				'}';
+	}
 }

+ 17 - 18
mec-im/src/main/java/com/ym/pojo/ExamSongDownloadData.java

@@ -3,15 +3,16 @@ package com.ym.pojo;
 public class ExamSongDownloadData {
 	private Integer status;
 	private String url;
-	private String songName;
-	private Integer songId;
+	private String examSongName;
+	private Integer examSongId;
+	private Boolean enable = false;
 
-	public Integer getSongId() {
-		return songId;
+	public Boolean getEnable() {
+		return enable;
 	}
 
-	public void setSongId(Integer songId) {
-		this.songId = songId;
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
 	}
 
 	public Integer getStatus() {
@@ -30,21 +31,19 @@ public class ExamSongDownloadData {
 		this.url = url;
 	}
 
-	public String getSongName() {
-		return songName;
+	public String getExamSongName() {
+		return examSongName;
 	}
 
-	public void setSongName(String songName) {
-		this.songName = songName;
+	public void setExamSongName(String examSongName) {
+		this.examSongName = examSongName;
 	}
 
-	@Override
-	public String toString() {
-		return "{" +
-				"status=" + status +
-				", url='" + url + '\'' +
-				", songName='" + songName + '\'' +
-				", songId='" + songId + '\'' +
-				'}';
+	public Integer getExamSongId() {
+		return examSongId;
+	}
+
+	public void setExamSongId(Integer examSongId) {
+		this.examSongId = examSongId;
 	}
 }

+ 11 - 27
mec-im/src/main/java/com/ym/pojo/ExamSongMessage.java

@@ -1,20 +1,9 @@
 package com.ym.pojo;
 
-import io.rong.messages.BaseMessage;
-import org.apache.commons.lang3.StringUtils;
-
-public class ExamSongMessage extends BaseMessage {
+public class ExamSongMessage{
     private String url;
-    private String songName;
-    private Integer songId;
-
-    public Integer getSongId() {
-        return songId;
-    }
-
-    public void setSongId(Integer songId) {
-        this.songId = songId;
-    }
+    private String examSongName;
+    private Integer examSongId;
 
     public String getUrl() {
         return url;
@@ -24,24 +13,19 @@ public class ExamSongMessage extends BaseMessage {
         this.url = url;
     }
 
-    public String getSongName() {
-        return songName;
+    public String getExamSongName() {
+        return examSongName;
     }
 
-    public void setSongName(String songName) {
-        this.songName = songName;
+    public void setExamSongName(String examSongName) {
+        this.examSongName = examSongName;
     }
 
-    @Override
-    public String getType() {
-        return "DY:examSongDownloadMessage";
+    public Integer getExamSongId() {
+        return examSongId;
     }
 
-    @Override
-    public String toString() {
-        return "{\"url\":" + url +
-                ", \"songName\":" + songName +
-                ", \"songId\":" + songId +
-                '}';
+    public void setExamSongId(Integer examSongId) {
+        this.examSongId = examSongId;
     }
 }

+ 27 - 0
mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java

@@ -11,9 +11,36 @@ public class ReqDeviceControlData {
 	private Boolean microphoneOn;
 	private Boolean musicModeOn;
 	private Boolean handUpOn;
+	private Boolean playSongOn;
 	private String roomId;
 	private String userId;
 	private String ticket;
+	private Integer status;
+	private Integer examSongId;
+
+	public Boolean getPlaySongOn() {
+		return playSongOn;
+	}
+
+	public void setPlaySongOn(Boolean playSongOn) {
+		this.playSongOn = playSongOn;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Integer getExamSongId() {
+		return examSongId;
+	}
+
+	public void setExamSongId(Integer examSongId) {
+		this.examSongId = examSongId;
+	}
 
 	public Boolean getMusicModeOn() {
 		return musicModeOn;

+ 11 - 2
mec-im/src/main/java/com/ym/pojo/RoomResult.java

@@ -1,9 +1,11 @@
 package com.ym.pojo;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -34,7 +36,7 @@ public class RoomResult {
         boolean camera;
         boolean microphone;
         boolean handUpOn;
-        String examSongDownloadJson;
+        ExamSongDownloadData examSongDownloadJson;
         CustomMessage playMidiJson;
     }
 
@@ -57,7 +59,14 @@ public class RoomResult {
             result.setHandUpOn(member.isHand());
             result.setHeadUrl(member.getHeadUrl());
             result.setPlayMidiJson(JSONObject.parseObject(midiMap.get(Integer.parseInt(member.getUid())),CustomMessage.class));
-            result.setExamSongDownloadJson(examSongMap.get(Integer.parseInt(member.getUid())));
+            ExamSongDownloadData examSongDownloadData;
+            String json = examSongMap.get(Integer.parseInt(member.getUid()));
+            if(StringUtils.isEmpty(json)){
+                examSongDownloadData = new ExamSongDownloadData();
+            }else {
+                examSongDownloadData = JSON.parseObject(json,ExamSongDownloadData.class);
+            }
+            result.setExamSongDownloadJson(examSongDownloadData);
             members.add(result);
         }
     }

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

@@ -0,0 +1,41 @@
+package com.ym.pojo;
+
+
+public class RoomStatusNotify {
+	private String roomId;
+	private String userId;
+	private boolean requestStatus;
+
+	public String getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(String roomId) {
+		this.roomId = roomId;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public boolean isRequestStatus() {
+		return requestStatus;
+	}
+
+	public void setRequestStatus(boolean requestStatus) {
+		this.requestStatus = requestStatus;
+	}
+
+	@Override
+	public String toString() {
+		return "RoomStatusNotify{" +
+				"roomId='" + roomId + '\'' +
+				", userId='" + userId + '\'' +
+				", requestStatus=" + requestStatus +
+				'}';
+	}
+}

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

@@ -3,6 +3,7 @@ package com.ym.service.Impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 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;
@@ -201,8 +202,15 @@ public class RoomServiceImpl implements RoomService {
         } else if (roleEnum == RoleEnum.RoleAssistant && display.isEmpty()) {
             display = "display://type=0?userId=" + userId + "?uri=";
         }else {
+            ExamSongDownloadData examSongDownloadData;
+            String json = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(courseId, sysUser.getId());
+            if(StringUtils.isEmpty(json)){
+                examSongDownloadData = new ExamSongDownloadData();
+            }else {
+                examSongDownloadData = JSON.parseObject(json,ExamSongDownloadData.class);
+            }
             //获取学员曲目下载状态
-            userResult.setExamSongDownloadJson(courseScheduleStudentPaymentDao.getExamSongDownloadStatus(courseId,userId));
+            userResult.setExamSongDownloadJson(examSongDownloadData);
             Room room = roomDao.findByRid(roomId);
             if (room != null) {
                 display = room.getDisplay();
@@ -237,15 +245,36 @@ public class RoomServiceImpl implements RoomService {
         return roomResult;
     }
 
+
+
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     @Override
-    public void joinRoomSuccess(String roomId,String userId) throws Exception {
+    public void joinRoomFailure(String roomId, String userId) {
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if(roomMember == null){
             return ;
         }
+        log.info("joinRoomFailure : roomId={}, userId={}", roomId, userId);
+        //如果加入失败,删除该用户数据
+        roomMemberDao.deleteUserByRidAndUid(roomId,userId);
+    }
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    @Override
+    public void joinRoomSuccess(String roomId,String userId) throws Exception {
+        RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
+        if(roomMember == null){
+            return ;
+        }
+        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+        if(redisTemplate.hasKey(joinSuccessKey)){
+            //兼容旧版本,防止重复调用
+            redisTemplate.delete(joinSuccessKey);
+            return;
+        }
+        redisTemplate.opsForValue().set("joinRoomSuccess"+ roomId + userId,roomId);
         log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
+
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
 
@@ -260,17 +289,16 @@ public class RoomServiceImpl implements RoomService {
         Date curTime = DateTimeUtils.currentUTC();
         Room room = roomDao.findByRid(roomId);
         if (room == null) {
-            //如果房间不存在,删除除了自己之外的其他用户
-//            roomMemberDao.deleteRoomMember(roomId,userId);
             saveRoom(roomId, roomId, curTime, display);
             IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId}, roomId, roomId);
             if (!resultInfo.isSuccess()) {
                 log.error("joinRoomSuccess createGroup error: roomId={}, {}", roomId, resultInfo.getErrorMessage());
                 throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
             }
-        }
-        if(roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant){
-            updateDisplay(roomId, userId, display, 0);
+        }else{
+            if(roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant){
+                updateDisplay(roomId, userId, display, 0);
+            }
         }
 
         UserInfo userInfo = userDao.findByUid(userId);
@@ -353,6 +381,10 @@ public class RoomServiceImpl implements RoomService {
         if(roomMember == null){
             return ;
         }
+        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+        if(redisTemplate.hasKey(joinSuccessKey)){
+            redisTemplate.delete(joinSuccessKey);
+        }
         log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
@@ -727,6 +759,17 @@ public class RoomServiceImpl implements RoomService {
                 roomMemberDao.updateMicByRidAndUid(roomId, userId, false);
             } else if (typeEnum.equals(DeviceTypeEnum.HandUp)){
                 roomMemberDao.updateHandByRidAndUid(roomId, userId, false);
+            } else if (typeEnum.equals(DeviceTypeEnum.PlaySong)){
+                long scheduleId = Long.parseLong(roomId.substring(1));
+                ExamSongDownloadData msg;
+                String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(scheduleId, authUser.getId());
+                if(StringUtils.isEmpty(examJson)){
+                    throw new BizException("学员伴奏信息异常");
+                }else {
+                    msg = JSON.parseObject(examJson, ExamSongDownloadData.class);
+                    msg.setEnable(enable);
+                }
+                courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
             }else {
                 roomMemberDao.updateMusicByRidAndUid(roomId, userId, false);
             }
@@ -827,19 +870,26 @@ public class RoomServiceImpl implements RoomService {
         String userId = authUser.getId().toString();
 
         int result;
-        DeviceStateChangedMessage deviceResourceMessage;
+        DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
         if (type.equals(DeviceTypeEnum.Camera)) {
             result = roomMemberDao.updateCameraByRidAndUid(roomId, userId, enable);
-            deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
         } else if (type.equals(DeviceTypeEnum.Microphone)){
             result = roomMemberDao.updateMicByRidAndUid(roomId, userId, enable);
-            deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
         } else if (type.equals(DeviceTypeEnum.HandUp)){
             result = roomMemberDao.updateHandByRidAndUid(roomId, userId, enable);
-            deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
+        } else if (type.equals(DeviceTypeEnum.PlaySong)){
+            long scheduleId = Long.parseLong(roomId.substring(1));
+            ExamSongDownloadData msg;
+            String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(scheduleId, authUser.getId());
+            if(StringUtils.isEmpty(examJson)){
+                throw new BizException("学员伴奏信息异常");
+            }else {
+                msg = JSON.parseObject(examJson, ExamSongDownloadData.class);
+                msg.setEnable(enable);
+            }
+            result = courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
         }else {
             result = roomMemberDao.updateMusicByRidAndUid(roomId, userId, enable);
-            deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
         }
         deviceResourceMessage.setUserId(userId);
         imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
@@ -1276,32 +1326,33 @@ public class RoomServiceImpl implements RoomService {
     }
 
     @Override
-    public List<RongyunBasicUserDto> queryNoJoinStu(String roomId) {
-        return courseScheduleStudentPaymentDao.queryNoJoinStu(roomId,roomId.substring(1));
-    }
-
-    @Override
     @Transactional(rollbackFor = Exception.class)
     public void pushDownloadExamSongMsg(String roomId, Integer examSongId) throws Exception {
         SysUser authUser = sysUserFeignService.queryUserInfo();
-        ExamSongDownloadMessageMessage msg = new ExamSongDownloadMessageMessage();
+
         SysExamSong sysExamSong = sysExamSongDao.get(examSongId);
         if(sysExamSong == null){
             throw new BizException("曲目信息不存在");
         }
-        ExamSongMessage examSongMessage = new ExamSongMessage();
-        examSongMessage.setSongName(sysExamSong.getName());
-        examSongMessage.setUrl(sysExamSong.getUrl());
-        examSongMessage.setSongId(examSongId);
-        msg.setContent(examSongMessage);
-        imHelper.publishMessage(authUser.getId().toString(), roomId, msg, 0);
         //学员曲目下载状态改为未下载
         ExamSongDownloadData json = new ExamSongDownloadData();
-        json.setSongName(sysExamSong.getName());
+        json.setExamSongName(sysExamSong.getName());
         json.setUrl(sysExamSong.getUrl());
         json.setStatus(0);
-        json.setSongId(examSongId);
+        json.setExamSongId(examSongId);
         courseScheduleStudentPaymentDao.adjustExamSong(Long.parseLong(roomId.substring(1)),null, JSON.toJSONString(json));
+
+        ExamSongMessage examSongMessage = new ExamSongMessage();
+        examSongMessage.setExamSongName(sysExamSong.getName());
+        examSongMessage.setUrl(sysExamSong.getUrl());
+        examSongMessage.setExamSongId(examSongId);
+        ExamSongDownloadMessageMessage msg = new ExamSongDownloadMessageMessage(examSongMessage);
+        imHelper.publishMessage(authUser.getId().toString(), roomId, msg, 0);
+    }
+
+    @Override
+    public List<RongyunBasicUserDto> queryNoJoinStu(String roomId) {
+        return courseScheduleStudentPaymentDao.queryNoJoinStu(roomId,roomId.substring(1));
     }
 
     @Override
@@ -1312,23 +1363,29 @@ public class RoomServiceImpl implements RoomService {
         }
         SysUser authUser = sysUserFeignService.queryUserInfo();
         long scheduleId = Long.parseLong(roomId.substring(1));
-        CourseSchedule courseSchedule = courseScheduleDao.get(scheduleId);
-
-        //给老师发送学员曲目下载状态
-        DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(DeviceTypeEnum.ExamSong.ordinal(), status==0?false:true);
-        deviceResourceMessage.setUserId(courseSchedule.getActualTeacherId().toString());
-        imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
 
         SysExamSong sysExamSong = sysExamSongDao.get(examSongId);
         if(sysExamSong == null){
             throw new BizException("曲目信息不存在");
         }
-        ExamSongDownloadData msg = new ExamSongDownloadData();
-        msg.setSongName(sysExamSong.getName());
-        msg.setUrl(sysExamSong.getUrl());
-        msg.setStatus(status);
-        msg.setSongId(examSongId);
+        ExamSongDownloadData msg;
+        String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(scheduleId, authUser.getId());
+        if(StringUtils.isEmpty(examJson)){
+            msg = new ExamSongDownloadData();
+            msg.setExamSongName(sysExamSong.getName());
+            msg.setUrl(sysExamSong.getUrl());
+            msg.setStatus(status);
+            msg.setExamSongId(examSongId);
+        }else {
+            msg = JSON.parseObject(examJson, ExamSongDownloadData.class);
+            msg.setStatus(status);
+        }
         courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
+
+        //给老师发送学员曲目下载状态
+        CourseSchedule courseSchedule = courseScheduleDao.get(scheduleId);
+        ExamSongDownloadStatusMessage deviceResourceMessage = new ExamSongDownloadStatusMessage(status,authUser.getId(),examSongId);
+        imHelper.publishMessage(authUser.getId().toString(),courseSchedule.getActualTeacherId().toString(), roomId, deviceResourceMessage);
     }
 
     public void updateDisplay(String roomId, String senderId, String display, Integer isIncludeSender) throws Exception {

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

@@ -93,4 +93,12 @@ public interface RoomService {
      * @param status
      */
     void adjustExamSong(String roomId,Integer status,Integer examSongId) throws Exception;
+
+    /**
+     * 移动端用户加入房间失败
+     * @author zouxuan
+     * @param roomId
+     * @param userId
+     */
+    void joinRoomFailure(String roomId, String userId);
 }

+ 3 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -195,6 +195,9 @@ public class CourseScheduleController extends BaseController {
         if(Objects.isNull(oldCourseSchedule)){
             return failed("未找到指定课程");
         }
+        if(Objects.nonNull(oldCourseSchedule.getNewCourseId())){
+            return failed("被合并课程禁止调整");
+        }
         if(GroupType.VIP.equals(oldCourseSchedule.getGroupType())){
             VipGroup vipGroup = vipGroupDao.findByCourseSchedule(courseSchedule.getId());
             if(Objects.nonNull(vipGroup)

+ 6 - 6
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupPaymentCalenderController.java

@@ -131,23 +131,23 @@ public class MusicGroupPaymentCalenderController extends BaseController {
     @ApiOperation(value = "乐团缴费日历审核列表详情")
     @GetMapping("/auditListDetail")
     @PreAuthorize("@pcs.hasPermissions('musicGroupPaymentCalender/auditListDetail')")
-    public Object auditListDetail(Long calenderId) {
-        return succeed(musicGroupPaymentCalenderService.auditListDetail(calenderId));
+    public Object auditListDetail(String batchNo) {
+        return succeed(musicGroupPaymentCalenderService.auditListDetail(batchNo));
     }
 
     @ApiOperation(value = "乐团缴费日历审核通过")
     @PostMapping("/auditPass")
     @PreAuthorize("@pcs.hasPermissions('musicGroupPaymentCalender/auditPass')")
-    public Object auditPass(Long calenderId,String auditMemo) {
-        musicGroupPaymentCalenderService.auditPass(calenderId,auditMemo);
+    public Object auditPass(String batchNo,String auditMemo) {
+        musicGroupPaymentCalenderService.auditPass(batchNo,auditMemo);
         return succeed();
     }
 
     @ApiOperation(value = "乐团缴费日历审核拒绝")
     @PostMapping("/auditRefuse")
     @PreAuthorize("@pcs.hasPermissions('musicGroupPaymentCalender/auditRefuse')")
-    public Object auditRefuse(Long calenderId,String auditMemo) {
-        musicGroupPaymentCalenderService.auditRefuse(calenderId,auditMemo);
+    public Object auditRefuse(String batchNo,String auditMemo) {
+        musicGroupPaymentCalenderService.auditRefuse(batchNo,auditMemo);
         return succeed();
     }