zouxuan před 3 roky
rodič
revize
b8b4555aec
15 změnil soubory, kde provedl 553 přidání a 101 odebrání
  1. 9 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentMusicSheetDao.java
  2. 0 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomDao.java
  3. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomMemberDao.java
  4. 104 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java
  5. 10 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMusicSheetDownloadData.java
  6. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetAccompaniment.java
  7. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/UserRoleEnum.java
  8. 18 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java
  9. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomMemberServiceImpl.java
  10. 292 52
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  11. 18 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentMusicSheetDao.xml
  12. 18 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  13. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImNetworkRoomMemberMapper.xml
  14. 3 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetAccompanimentMapper.xml
  15. 56 16
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImNetworkRoomController.java

+ 9 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentMusicSheetDao.java

@@ -15,14 +15,20 @@ import java.util.List;
  */
 public interface CourseScheduleStudentMusicSheetDao extends BaseMapper<CourseScheduleStudentMusicSheet> {
 
-    List<CourseScheduleStudentMusicSheetResult> queryBySheetIdAndCourseId(@Param("musicSheetAccompanimentId") Integer musicSheetAccompanimentId,
+    List<CourseScheduleStudentMusicSheetResult> queryBySheetIdAndCourseId(@Param("musicSheetAccompanimentId") Long musicSheetAccompanimentId,
                                                                           @Param("courseId") Long courseId,
                                                                           @Param("userId") Long userId,
                                                                           @Param("downStatus") Integer downStatus,
                                                                           @Param("userType") Integer userType);
-
+    //开启原音播放
+    void openPlayStatus(@Param("scheduleId") Long scheduleId,
+                       @Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId,
+                       @Param("userId") Long userId);
+    void openAccompanimentPlayStatus(@Param("scheduleId") Long scheduleId,
+                                    @Param("musicScoreAccompanimentId") Integer musicScoreAccompanimentId,
+                                    @Param("userId") Long userId);
     //关闭伴奏
-    void closePlayStatus(@Param("courseId") long courseId);
+    void closePlayStatus(@Param("courseId") Long courseId,@Param("userId") Long userId);
 
     void batchInsert(@Param("musicSheet") List<CourseScheduleStudentMusicSheetResult> musicSheet);
 }

+ 0 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomDao.java

@@ -14,8 +14,6 @@ import java.util.List;
  */
 public interface ImNetworkRoomDao extends BaseMapper<ImNetworkRoom> {
 
-    int insertBatch(@Param("entities") List<ImNetworkRoom> entities);
-
     /**
     * @description: 根据房间号获取
      * @param roomId

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomMemberDao.java

@@ -23,5 +23,9 @@ public interface ImNetworkRoomMemberDao extends BaseMapper<ImNetworkRoomMember>
     List<ImNetworkRoomMember> queryByRoomId(@Param("roomId") String roomId);
 
     void delByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId);
+
+    int countByRoomId(@Param("roomId") String roomId);
+
+    List<ImNetworkRoomMember> findByRoomAndRole(@Param("roomId") String roomId, @Param("role") int role);
 }
 

+ 104 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java

@@ -22,36 +22,132 @@ public class ImNetworkMusicSheetDownloadMessageContent{
     private String subjectName;
 
     //原音url
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "原音url")
     private String mp3Url = "";
 
     //速度
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "速度")
     private Integer speed;
 
     //xmlUrl
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "xmlUrl")
     private String xmlUrl = "";
 
     //曲目名
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "曲目名")
     private String examSongName;
 
     //标签名
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "标签名")
     private String categoriesName;
 
     //标签分类
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "标签分类")
     private Integer categoriesId;
 
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "类型")
     private String type;
 
     /**  */
-    @ApiModelProperty(value = "伴奏编号")
+    @ApiModelProperty(value = "url")
     private String url = "";
 
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getMusicSheetId() {
+        return musicSheetId;
+    }
+
+    public void setMusicSheetId(Integer musicSheetId) {
+        this.musicSheetId = musicSheetId;
+    }
+
+    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 ToStringBuilder.reflectionToString(this);

+ 10 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMusicSheetDownloadData.java

@@ -11,10 +11,10 @@ public class ImNetworkRoomMusicSheetDownloadData {
     private String url;
 
     @ApiModelProperty(value = "伴奏名")
-    private String examSongName;
+    private String musicSheetName;
 
     @ApiModelProperty(value = "伴奏编号")
-    private Integer examSongId;
+    private Long musicSheetId;
 
     @ApiModelProperty(value = "是否开启伴奏")
     private Boolean enable = false;
@@ -43,19 +43,19 @@ public class ImNetworkRoomMusicSheetDownloadData {
         this.url = url;
     }
 
-    public String getExamSongName() {
-        return examSongName;
+    public String getMusicSheetName() {
+        return musicSheetName;
     }
 
-    public void setExamSongName(String examSongName) {
-        this.examSongName = examSongName;
+    public void setMusicSheetName(String musicSheetName) {
+        this.musicSheetName = musicSheetName;
     }
 
-    public Integer getExamSongId() {
-        return examSongId;
+    public Long getMusicSheetId() {
+        return musicSheetId;
     }
 
-    public void setExamSongId(Integer examSongId) {
-        this.examSongId = examSongId;
+    public void setMusicSheetId(Long musicSheetId) {
+        this.musicSheetId = musicSheetId;
     }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetAccompaniment.java

@@ -46,6 +46,10 @@ public class MusicSheetAccompaniment extends BaseEntity {
     @ApiModelProperty(value = "排序号")
     private Integer sortNumber;  //排序号
 
+    @TableField("speed_")
+    @ApiModelProperty(value = "速度")
+    private Integer speed;  //速度
+
     @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")
     private java.util.Date createTime;  //创建时间
@@ -60,6 +64,14 @@ public class MusicSheetAccompaniment extends BaseEntity {
 	    return this;
 	}
 
+	public Integer getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(Integer speed) {
+		this.speed = speed;
+	}
+
 	public String getMetronomeUrl() {
 		return metronomeUrl;
 	}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/UserRoleEnum.java

@@ -1,6 +1,6 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
-import com.yonge.cooleshow.common.enums.BaseEnum;
+import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum UserRoleEnum implements BaseEnum<String, UserRoleEnum> {
     STUDENT("学生"),TEACHER("老师");

+ 18 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java

@@ -2,10 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetData;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomResult;
-import com.yonge.cooleshow.biz.dal.dto.NetworkRoomResult;
+import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -39,7 +36,23 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception;
 
     //老师通知学员下载伴奏
-    void pushDownloadMusicSheetMsg(ImNetworkRoomMusicSheetData musicSheetData);
+    void pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception;
 
+    //移动端用来渲染页面
+    void display(ImNetworkDisplayDataDto displayData) throws Exception;
+
+    //批量控制学员设备开关
+    void batchControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception;
+
+    //控制学员设备开关
+    void controlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception;
+
+    //学员同意打开,麦克风、摄像头等权限请求
+    void approveControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception;
+
+    //学员拒绝打开,麦克风、摄像头等权限请求
+    void rejectControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception;
+
+    void adjustExamSong(ImNetworkMusicSheetDownDto downDto) throws Exception;
 }
 

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomMemberServiceImpl.java

@@ -45,7 +45,8 @@ public class ImNetworkRoomMemberServiceImpl extends ServiceImpl<ImNetworkRoomMem
             roomMember.setMusicModeFlag(false);
             roomMember.setRole(userRole.ordinal());
             roomMember.setUserId(sysUser.getUserId());
-            roomMember.setUsername(userRole == UserRoleEnum.STUDENT?sysUser.getUsername():sysUser.getRealName());
+//            roomMember.setUsername(userRole == UserRoleEnum.STUDENT?sysUser.getUsername():sysUser.getRealName());
+            roomMember.setUsername(sysUser.getUsername());
             roomMember.setAvatar(sysUser.getAvatar());
             roomMember.setCourseScheduleId(Long.parseLong(roomId));
             baseMapper.insert(roomMember);

+ 292 - 52
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java

@@ -9,9 +9,7 @@ import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomErrorEnum;
-import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomMemberChangedEnum;
-import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -24,6 +22,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -58,6 +57,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     private IMHelper imHelper;
     @Resource
     private MusicSheetAccompanimentService musicSheetAccompanimentService;
+    @Resource
+    private MusicSheetService musicSheetService;
 
     @Override
     public ImNetworkRoomDao getDao() {
@@ -112,7 +113,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{sysUser.getUserId().toString()}, roomId, roomId);
         if(resultInfo.getCode() != 200){
             log.error("加入群聊失败 resultInfo:{}",resultInfo);
-            throw new BizException("加入网络教室失败,请联系管理员");
+//            throw new BizException("加入网络教室失败,请联系管理员");
         }
         return HttpResponseResult.succeed(joinRoomResult);
     }
@@ -166,7 +167,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         long courseScheduleId = Long.parseLong(roomId);
         if (userRole == UserRoleEnum.TEACHER){
             //如果老师退出房间,关闭伴奏
-            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId);
+            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
             courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
             courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
         }
@@ -193,19 +194,31 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         if(Objects.equals(courseSchedule.getTeacherId(),userId)){
             roleEnum = UserRoleEnum.TEACHER;
         }
-        BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
-                orElseThrow(()-> new BizException("用户信息不存在"));
-        Date now = new Date();
-        //删房间用户信息
-        imNetworkRoomMemberService.getDao().delByRidAndUid(roomId, userId);
+        //记录考勤信息
+
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
         if (roleEnum == UserRoleEnum.TEACHER){
             if (isUserDisplay(room.getDisplay(), userId)) {
+                room.setDisplay("");
                 this.updateDisplay(userId,room);
             }
-            courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,null);
+            //老师退出房间,初始化节拍器和伴奏播放配置
+            courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,"");
         }
-
+        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId);
+        int memberNum = imNetworkRoomMemberService.getDao().countByRoomId(roomId);
+        if (memberNum <= 1) {
+            imHelper.dismiss(userId.toString(), roomId);
+            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseSchedule.getId(),null);
+            log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, userId);
+        } else {
+            ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.LEAVE);
+            imHelper.publishMessage(userId.toString(), roomId, msg);
+            imHelper.quit(new String[]{userId.toString()}, roomId);
+            log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, userId);
+        }
+        //删房间用户信息
+        imNetworkRoomMemberService.getDao().deleteById(roomMember.getId());
     }
 
     @Override
@@ -224,41 +237,266 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void pushDownloadMusicSheetMsg(ImNetworkRoomMusicSheetData musicSheetData) {
-//        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
-//                orElseThrow(()-> new BizException("请登录"));
-//        Long userId = sysUser.getId();
-//        Long courseScheduleId = musicSheetData.getCourseScheduleId();
-//        log.info("pushDownloadMusicSheetMsg: roomId={}, userId={}", courseScheduleId, userId);
-//        //获取已通知下载的伴奏列表
-//        List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(musicSheetData.getMusicSheetAccompanimentId(),
-//                courseScheduleId, null, null, UserRoleEnum.STUDENT.ordinal());
-//        ImNetworkMusicSheetDownloadMessageContent downloadMessageContent = musicSheetAccompanimentService.getDao().findMsgContentByAccompanimentId(musicSheetData.getMusicSheetAccompanimentId());
-//        if (musicSheetResults.size() == 0) {
-//            //第一次下载,生成数据
-//            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(courseScheduleId);
-//            Set<Long> studentIds = courseScheduleStudentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-//            studentIds.forEach(e -> {
-//                CourseScheduleStudentMusicSheetResult musicSheetResult = new CourseScheduleStudentMusicSheetResult();
-//                musicSheetResult.setMusicSheetAccompanimentId(accompaniment.getId());
-//                musicSheetResult.setSpeed(100);
-//                musicSheetResult.setCourseScheduleId(courseScheduleId);
-//                musicSheetResult.setUserId(e);
-//                musicSheetResult.setUserType(UserRoleEnum.STUDENT.ordinal());
-//                musicSheetResults.add(musicSheetResult);
-//            });
-//            CourseScheduleStudentMusicSheetResult musicSheetResult = new CourseScheduleStudentMusicSheetResult();
-//            musicSheetResult.setMusicSheetAccompanimentId(accompaniment.getId());
-//            musicSheetResult.setSpeed(100);
-//            musicSheetResult.setCourseScheduleId(courseScheduleId);
-//            musicSheetResult.setUserId(userId);
-//            musicSheetResult.setUserType(UserRoleEnum.TEACHER.ordinal());
-//            musicSheetResults.add(musicSheetResult);
-//            courseScheduleStudentMusicSheetService.getDao().batchInsert(musicSheetResults);
-//        }
-//        ImNetworkRoomMusicSheetData musicScoreMessage = JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkRoomMusicSheetData.class);
-//        ImNetworkMusicSheetDownloadMessage msg = new ImNetworkMusicSheetDownloadMessage(musicScoreMessage);
-//        imHelper.publishMessage(sysUser.getId().toString(), courseScheduleId.toString(), msg, 0);
+    public void pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        Long courseScheduleId = Long.parseLong(roomId);
+        List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().
+                queryBySheetIdAndCourseId(accompanimentId, courseScheduleId, null, null, 0);
+
+        MusicSheetAccompaniment accompaniment = musicSheetAccompanimentService.getById(accompanimentId);
+        if (scheduleStudentMusicSheetResults.size() == 0) {
+            //第一次下载,生成数据
+            List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(courseScheduleId);
+            Set<Long> studentIds = courseScheduleStudentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+            studentIds.forEach(e -> {
+                CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
+                musicSheet.setMusicSheetAccompanimentId(accompanimentId);
+                musicSheet.setSpeed(accompaniment.getSpeed());
+                musicSheet.setCourseScheduleId(courseScheduleId);
+                musicSheet.setUserId(e);
+                scheduleStudentMusicSheetResults.add(musicSheet);
+            });
+            CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
+            musicSheet.setMusicSheetAccompanimentId(accompanimentId);
+            musicSheet.setSpeed(accompaniment.getSpeed());
+            musicSheet.setCourseScheduleId(courseScheduleId);
+            musicSheet.setUserId(sysUser.getId());
+            musicSheet.setUserType(1);
+            scheduleStudentMusicSheetResults.add(musicSheet);
+            courseScheduleStudentMusicSheetService.getDao().batchInsert(scheduleStudentMusicSheetResults);
+        }
+        ImNetworkMusicSheetDownloadMessage msg = new ImNetworkMusicSheetDownloadMessage(
+                JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkMusicSheetDownloadMessageContent.class));
+        imHelper.publishMessage(sysUser.getId().toString(), roomId, msg, 0);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void display(ImNetworkDisplayDataDto displayData) throws Exception {
+        log.info("display in data = {}", displayData);
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+
+        StringBuffer display = new StringBuffer("display://type=").append(displayData.getType().ordinal()).append("?userId=");
+        switch (displayData.getType()) {
+            case NONE:
+                //清空当前 room 的 display
+                display = new StringBuffer();
+                break;
+            case TEACHER:
+                CourseSchedule courseSchedule = courseScheduleService.getById(displayData.getRoomId());
+                display.append(courseSchedule.getTeacherId()).append("?uri=");
+                break;
+            case SCREEN:
+                display.append(sysUser.getId()).append("?uri=");
+                break;
+            case STUDENT:
+                display.append(displayData.getUserId()).append("?uri=").append(displayData.getUri());
+                break;
+            default:
+                display.append(sysUser.getId()).append("?uri=").append(displayData.getUri());
+                break;
+        }
+        ImNetworkRoom room = baseMapper.findByRoomId(displayData.getRoomId());
+        room.setDisplay(display.toString());
+        this.updateDisplay(sysUser.getId(),room);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
+        ImNetworkDeviceTypeEnum deviceType = deviceControl.getDeviceType();
+        if (deviceControl.getUserId() != null) {
+            controlDevice(deviceControl);
+        } else {
+            if (deviceType == ImNetworkDeviceTypeEnum.EXAM_SONG ||
+                    deviceType == ImNetworkDeviceTypeEnum.MUSIC_SHEET ||
+                    deviceType == ImNetworkDeviceTypeEnum.ACCOMPANIMENT) {
+                List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(Long.parseLong(deviceControl.getRoomId()));
+                for (CourseScheduleStudentPayment studentPayment : studentPayments) {
+                    deviceControl.setUserId(studentPayment.getUserId());
+                    controlDevice(deviceControl);
+                }
+                return;
+            }else {
+                List<ImNetworkRoomMember> roomMembers = imNetworkRoomMemberService.getDao().findByRoomAndRole(deviceControl.getRoomId(), 0);
+                if (!CollectionUtils.isEmpty(roomMembers)) {
+                    for (ImNetworkRoomMember roomMember : roomMembers) {
+                        deviceControl.setUserId(roomMember.getUserId());
+                        controlDevice(deviceControl);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void controlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
+        log.info("controlDevice in deviceControl = {}", deviceControl);
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        String roomId = deviceControl.getRoomId();
+        Long userId = deviceControl.getUserId();
+        if(deviceControl.getEnable()){
+            long scheduleId = Long.parseLong(roomId);
+            ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
+            deviceResourceMessage.setUserId(userId.toString());
+            switch (deviceControl.getDeviceType()) {
+                case EXAM_SONG:
+                    ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
+                    msg.setEnable(deviceControl.getEnable());
+                    courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
+                    imHelper.publishMessage(userId.toString(), deviceControl.getRoomId(), deviceResourceMessage, 1);
+                    break;
+                case MUSIC_SHEET:
+                    //关闭所有曲目播放
+                    courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
+                    //打开原音
+                    courseScheduleStudentMusicSheetService.getDao().openPlayStatus(scheduleId,deviceControl.getMusicScoreAccompanimentId(),userId);
+                    deviceResourceMessage.setMusicScoreAccompanimentId(deviceControl.getMusicScoreAccompanimentId());
+                    deviceResourceMessage.setUserId(userId.toString());
+                    deviceResourceMessage.setSoundVolume(deviceControl.getSoundVolume());
+                    imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
+                    break;
+                case ACCOMPANIMENT:
+                    //关闭所有曲目播放
+                    courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
+                    //打开伴奏
+                    courseScheduleStudentMusicSheetService.getDao().openAccompanimentPlayStatus(scheduleId, deviceControl.getMusicScoreAccompanimentId(),userId);
+                    deviceResourceMessage.setMusicScoreAccompanimentId(deviceControl.getMusicScoreAccompanimentId());
+                    deviceResourceMessage.setUserId(userId.toString());
+                    deviceResourceMessage.setSoundVolume(deviceControl.getSoundVolume());
+                    imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
+                    break;
+                default:
+                    //邀请打开指定设备权限
+                    ImNetworkControlDeviceNotifyMessage message = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.INVITE.ordinal());
+//                    msg.setTicket(ticket);
+                    message.setType(deviceControl.getDeviceType().ordinal());
+                    message.setOpUserId(sysUser.getId().toString());
+                    message.setOpUserName(sysUser.getUsername());
+                    imHelper.publishMessage(sysUser.getId().toString(), userId.toString(), roomId, message);
+                    break;
+            }
+        }else {
+            ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getById(roomId);
+            long scheduleId = Long.parseLong(roomId);
+            switch (deviceControl.getDeviceType()) {
+                case CAMERA:
+                    roomMember.setCameraFlag(deviceControl.getEnable());
+                    break;
+                case MICROPHONE:
+                    roomMember.setMicFlag(deviceControl.getEnable());
+                    break;
+                case HAND_UP:
+                    roomMember.setHandFlag(deviceControl.getEnable());
+                    break;
+                case MUSIC_MODE:
+                    roomMember.setMusicModeFlag(deviceControl.getEnable());
+                    break;
+                case EXAM_SONG:
+                    ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
+                    msg.setEnable(deviceControl.getEnable());
+                    courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
+                    break;
+                case MUSIC_SHEET:
+                case ACCOMPANIMENT:
+                    //关闭所有曲目播放
+                    courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
+                    break;
+            }
+            if(deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.MUSIC_SHEET &&
+                    deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.EXAM_SONG &&
+                    deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.ACCOMPANIMENT){
+                imNetworkRoomMemberService.getDao().updateById(roomMember);
+            }
+            ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
+            deviceResourceMessage.setUserId(userId.toString());
+            BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
+            if (Objects.nonNull(basicUserInfo)) {
+                deviceResourceMessage.setUserName(basicUserInfo.getUsername());
+            }
+            imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void approveControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
+        log.info("approveControlDevice: deviceControl={}", deviceControl);
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getById(deviceControl.getRoomId());
+        switch (deviceControl.getDeviceType()) {
+            case CAMERA:
+                roomMember.setCameraFlag(deviceControl.getEnable());
+                break;
+            case EXAM_SONG:
+                long scheduleId = Long.parseLong(deviceControl.getRoomId());
+                ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, sysUser.getId());
+                msg.setEnable(deviceControl.getEnable());
+                courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId, sysUser.getId(), JSON.toJSONString(msg));
+                break;
+            case MICROPHONE:
+                roomMember.setMicFlag(deviceControl.getEnable());
+                break;
+        }
+        if(deviceControl.getDeviceType() == ImNetworkDeviceTypeEnum.CAMERA ||
+                deviceControl.getDeviceType() == ImNetworkDeviceTypeEnum.MICROPHONE){
+            imNetworkRoomMemberService.getDao().updateById(roomMember);
+        }
+        ImNetworkControlDeviceNotifyMessage msg = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.APPROVE.ordinal());
+        msg.setType(deviceControl.getDeviceType().ordinal());
+        msg.setOpUserId(sysUser.getId().toString());
+        msg.setOpUserName(sysUser.getUsername());
+        imHelper.publishMessage(sysUser.getId().toString(),deviceControl.getUserId().toString(), deviceControl.getRoomId(), msg);
+
+        ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
+        deviceResourceMessage.setUserId(sysUser.getId().toString());
+        imHelper.publishMessage(sysUser.getId().toString(), deviceControl.getRoomId(), deviceResourceMessage, 1);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void rejectControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
+        log.info("rejectControlDevice: deviceControl={}", deviceControl);
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        ImNetworkControlDeviceNotifyMessage msg = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.REJECT.ordinal());
+        msg.setType(deviceControl.getDeviceType().ordinal());
+        msg.setOpUserId(sysUser.getId().toString());
+        msg.setOpUserName(sysUser.getUsername());
+        imHelper.publishMessage(sysUser.getId().toString(),deviceControl.getUserId().toString(), deviceControl.getRoomId(), msg);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void adjustExamSong(ImNetworkMusicSheetDownDto downDto) throws Exception {
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        log.info("adjustExamSong: downDto={}", downDto);
+        MusicSheet musicSheet = Optional.ofNullable(musicSheetService.getById(downDto.getMusicSheetId())).
+                orElseThrow(()-> new BizException("曲目信息不存在"));
+        long scheduleId = Long.parseLong(downDto.getRoomId());
+        String examJson = courseScheduleStudentPaymentService.getDao().getMusicSheetByCourseIdAndUserId(scheduleId, sysUser.getId());
+        ImNetworkRoomMusicSheetDownloadData msg;
+        if (StringUtils.isEmpty(examJson)) {
+            msg = new ImNetworkRoomMusicSheetDownloadData();
+            msg.setMusicSheetName(musicSheet.getMusicSheetName());
+            msg.setUrl(musicSheet.getUrl());
+            msg.setStatus(downDto.getStatus());
+            msg.setMusicSheetId(musicSheet.getId());
+        } else {
+            msg = JSON.parseObject(examJson, ImNetworkRoomMusicSheetDownloadData.class);
+            msg.setStatus(downDto.getStatus());
+        }
+        courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,sysUser.getId(),JSON.toJSONString(msg));
+        //给老师发送学员曲目下载状态
+        CourseSchedule courseSchedule = courseScheduleService.getById(scheduleId);
+        ImNetworkMusicSheetDownloadStatusMessage deviceResourceMessage = new ImNetworkMusicSheetDownloadStatusMessage(downDto.getStatus(), sysUser.getId(), downDto.getMusicSheetId());
+        imHelper.publishMessage(sysUser.getId().toString(), courseSchedule.getTeacherId().toString(), downDto.getRoomId(), deviceResourceMessage);
     }
 
     //校验用户是否提前进入教室
@@ -274,6 +512,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     public ImNetworkRoom initRoom(String roomId,Long courseId,UserRoleEnum userRole,Long userId,Date now) throws Exception {
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
+        String display = "";
+        if (userRole == UserRoleEnum.TEACHER) {
+            display = "display://type=1?userId=" + userId + "?uri=";
+        }
         if(Objects.isNull(room)){
             room = new ImNetworkRoom();
             //创建房间
@@ -281,6 +523,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             room.setRoomId(roomId);
             room.setCreateTime(now);
             room.setUpdateTime(now);
+            room.setDisplay(display);
             baseMapper.insert(room);
             IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId.toString()}, roomId, roomId);
             if(resultInfo.getCode() != 200){
@@ -290,6 +533,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         }else {
             if(userRole == UserRoleEnum.TEACHER){
                 //修改节拍器
+                room.setDisplay(display);
                 this.updateDisplay(userId,room);
             }
         }
@@ -298,13 +542,9 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     //修改节拍器
     public void updateDisplay(Long userId,ImNetworkRoom room) throws Exception {
-        String display = new StringBuilder("display://type=1?userId=")
-                .append(userId)
-                .append("?uri=").toString();
-        room.setDisplay(display);
         baseMapper.updateById(room);
         //发送display改动通知
-        ImNetworkDisplayMessage displayMessage = new ImNetworkDisplayMessage(display);
+        ImNetworkDisplayMessage displayMessage = new ImNetworkDisplayMessage(room.getDisplay());
         imHelper.publishMessage(userId.toString(), room.getRoomId(), displayMessage, 0);
     }
 

+ 18 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentMusicSheetDao.xml

@@ -33,6 +33,24 @@
     <update id="closePlayStatus">
         UPDATE course_schedule_student_music_sheet SET play_status_ = 0,accompaniment_play_status_ = 0,update_time_ = NOW()
         WHERE course_schedule_id_ = #{courseId}
+        <if test="userId != null">
+            AND user_id_ = #{userId}
+        </if>
+    </update>
+    <update id="openPlayStatus">
+        UPDATE course_schedule_student_music_sheet SET play_status_ = 1,update_time_ = NOW()
+        WHERE course_schedule_id_ = #{scheduleId}
+        AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+        <if test="userId != null">
+            AND user_id_ = #{userId}
+        </if>
+    </update>
+    <update id="openAccompanimentPlayStatus">
+        UPDATE course_schedule_student_music_sheet SET accompaniment_play_status_ = 1,update_time_ = NOW()
+        WHERE course_schedule_id_ = #{scheduleId} AND music_score_accompaniment_id_ = #{musicScoreAccompanimentId}
+        <if test="userId != null">
+            AND user_id_ = #{userId}
+        </if>
     </update>
 
     <resultMap id="CourseScheduleStudentMusicSheetResult" type="com.yonge.cooleshow.biz.dal.dto.CourseScheduleStudentMusicSheetResult" extends="BaseResultMap">

+ 18 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -61,7 +61,24 @@
         </if>
     </update>
     <update id="adjustPlayMidiAndMusicSheet">
-
+        UPDATE course_schedule_student_payment cssp
+        <set>
+            <if test="content == null or content == ''">
+                cssp.open_play_midi_ = NULL,cssp.update_time_ = NOW()
+            </if>
+            <if test="content != null and content != ''">
+                cssp.open_play_midi_ = #{content},cssp.update_time_ = NOW()
+            </if>
+            <if test="examSongJson != null">
+                cssp.exam_song_download_json_ = #{examSongJson}
+            </if>
+        </set>
+        <where>
+            cssp.course_schedule_id_ = #{courseScheduleId}
+            <if test="userId != null and userId != ''">
+                AND FIND_IN_SET(cssp.user_id_,#{userId})
+            </if>
+        </where>
     </update>
     <select id="queryStudentIds" resultType="java.lang.Long">
         SELECT DISTINCT user_id_ FROM course_schedule_student_payment

+ 6 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImNetworkRoomMemberMapper.xml

@@ -52,5 +52,11 @@
     <select id="queryByRoomId" resultMap="BaseResultMap">
         SELECT <include refid="Base_Column_List"/> FROM im_network_room_member WHERE room_id_ = #{roomId}
     </select>
+    <select id="countByRoomId" resultType="java.lang.Integer">
+        SELECT id_ FROM im_network_room_member WHERE room_id_ = #{roomId}
+    </select>
+    <select id="findByRoomAndRole" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"/> FROM im_network_room_member WHERE room_id_ = #{roomId} AND role_ = #{role}
+    </select>
 
 </mapper>

+ 3 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetAccompanimentMapper.xml

@@ -9,15 +9,16 @@
 		 <result column="music_subject_" jdbcType="VARCHAR" property="musicSubject" />
 		 <result column="audio_file_url_" jdbcType="VARCHAR" property="audioFileUrl" />
 		 <result column="sort_number_" jdbcType="TINYINT" property="sortNumber" />
+		 <result column="speed_" jdbcType="TINYINT" property="speed" />
 		 <result column="create_time_" jdbcType="TIMESTAMP" property="createTime" />
 		 <result column="create_by_" jdbcType="BIGINT" property="createBy" />
 	</resultMap>
 
 	<sql id="Base_Column_List">
-		id_, music_sheet_id_, music_subject_, audio_file_url_, sort_number_, create_time_, create_by_
+		id_, music_sheet_id_, music_subject_, audio_file_url_, sort_number_,speed_, create_time_, create_by_
 	</sql>
 
 	<delete id="delByMusicSheetId">
-		delete  from music_sheet_accompaniment where music_sheet_id_ = #{musicSheetId}
+		delete from music_sheet_accompaniment where music_sheet_id_ = #{musicSheetId}
     </delete>
 </mapper>

+ 56 - 16
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImNetworkRoomController.java

@@ -2,31 +2,23 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.alibaba.fastjson.JSONObject;
-import com.yonge.cooleshow.biz.dal.dto.ImChannelStateNotify;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetData;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomResult;
-import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
-import com.yonge.cooleshow.biz.dal.service.impl.ImNetworkRoomServiceImpl;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -103,10 +95,58 @@ public class ImNetworkRoomController extends BaseController {
         return succeed();
     }
 
-    @ApiOperation("老师通知学员下载伴奏")
-    @PostMapping(value = "/pushDownloadMusicSheetMsg", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
-    public Object pushDownloadMusicSheetMsg(@RequestBody ImNetworkRoomMusicSheetData musicSheetData) throws Exception {
-        imNetworkRoomService.pushDownloadMusicSheetMsg(musicSheetData);
+    @ApiOperation("移动端用来渲染页面")
+    @PostMapping(value = "/display", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult display(@RequestBody ImNetworkDisplayDataDto displayData) throws Exception {
+        imNetworkRoomService.display(displayData);
+        return succeed();
+    }
+
+    @ApiOperation(value = "批量控制学员设备开关")
+    @PostMapping(value = "/device/batchControl", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public Object batchControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)throws Exception {
+        imNetworkRoomService.batchControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "控制学员设备开关")
+    @PostMapping(value = "/device/control", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult controlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
+            throws Exception {
+        imNetworkRoomService.controlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员同意打开,麦克风、摄像头")
+    @PostMapping(value = "/device/approve", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult approveControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl) throws Exception {
+        imNetworkRoomService.approveControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员拒绝打开,麦克风、摄像头")
+    @PostMapping(value = "/device/reject", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult rejectControlDevice(@RequestBody ImNetworkDeviceControlDto deviceControl)
+            throws Exception {
+        imNetworkRoomService.rejectControlDevice(deviceControl);
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomId", dataType = "String", value = "房间号",required = true),
+            @ApiImplicitParam(name = "accompanimentId", dataType = "Long", value = "伴奏编号",required = true)
+    })
+    @ApiOperation(value = "老师在网络教室选择完伴奏后、通知学员下载伴奏")
+    @PostMapping(value = "pushDownloadMusicSheetMsg", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
+        imNetworkRoomService.pushDownloadMusicSheetMsg(roomId,accompanimentId);
+        return succeed();
+    }
+
+    @ApiOperation(value = "学员伴奏下载状态回调")
+    @PostMapping(value = "/adjustExamSong", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult adjustExamSong(@RequestBody ImNetworkMusicSheetDownDto downDto) throws Exception {
+        imNetworkRoomService.adjustExamSong(downDto);
         return succeed();
     }
 }