소스 검색

网络教室

zouxuan 3 년 전
부모
커밋
f7c2f5e0bc
17개의 변경된 파일483개의 추가작업 그리고 60개의 파일을 삭제
  1. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 72 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java
  3. 67 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMemberChangedMessage.java
  4. 55 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMusicSheetDownloadData.java
  5. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomResult.java
  6. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomStatusNotify.java
  7. 0 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java
  8. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java
  9. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/IMApiResultInfo.java
  10. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImNetworkRoomMemberChangedEnum.java
  11. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  12. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java
  13. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  14. 78 29
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  15. 2 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 10 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  17. 16 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImNetworkRoomController.java

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -30,5 +30,11 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
 
     //重置节拍器设置
     void cleanPlayMidi(@Param("courseScheduleId") Long courseScheduleId);
+
+    //获取节拍器数据
+    String getMidiByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Long userId);
+
+    //获取伴奏数据
+    String getMusicSheetByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Long userId);
 }
 

+ 72 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java

@@ -0,0 +1,72 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.rong.messages.BaseMessage;
+import org.apache.commons.lang3.StringUtils;
+
+public class ImNetworkCustomMessage extends BaseMessage {
+    //开关
+    private boolean enable;
+    //消息类型
+    private int customType;
+    //速度
+    private int rate;
+    //音量
+    private int playVolume;
+    //用户
+    private String userId;
+
+    public int getPlayVolume() {
+        return playVolume;
+    }
+
+    public void setPlayVolume(int playVolume) {
+        this.playVolume = playVolume;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public int getCustomType() {
+        return customType;
+    }
+
+    public void setCustomType(int customType) {
+        this.customType = customType;
+    }
+
+    public int getRate() {
+        return rate;
+    }
+
+    public void setRate(int rate) {
+        this.rate = rate;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String getType() {
+        return "DY:PlayMidiMessage";
+    }
+
+    @Override
+    public String toString() {
+        return "{\"enable\":" + enable +
+                ", \"customType\":" + customType +
+                ", \"rate\":" + rate +
+                ", \"playVolume\":" + playVolume +
+                ", \"userId\":" + (StringUtils.isEmpty(userId)?"\"\"":"\"" + userId + "\"") +
+                '}';
+    }
+}

+ 67 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMemberChangedMessage.java

@@ -0,0 +1,67 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.BaseMessage;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
+import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomMemberChangedEnum;
+
+/**
+* @description: 用户房间状态变动消息
+* @author zx
+* @date 2022/4/6 14:02
+*/
+public class ImNetworkRoomMemberChangedMessage extends BaseMessage {
+
+    //节拍器是否开启
+    private boolean metronomeSwitch;
+
+    //伴奏是否开启
+    private boolean examSongSwitch;
+
+    //用户基本信息
+    private ImNetworkRoomMember roomMember;
+
+    //动作
+    private ImNetworkRoomMemberChangedEnum changedEnum;
+
+    public ImNetworkRoomMemberChangedMessage(ImNetworkRoomMember roomMember, ImNetworkRoomMemberChangedEnum changedEnum) {
+        this.roomMember = roomMember;
+        this.changedEnum = changedEnum;
+    }
+
+    public ImNetworkRoomMember getRoomMember() {
+        return roomMember;
+    }
+
+    public void setRoomMember(ImNetworkRoomMember roomMember) {
+        this.roomMember = roomMember;
+    }
+
+    public ImNetworkRoomMemberChangedEnum getChangedEnum() {
+        return changedEnum;
+    }
+
+    public void setChangedEnum(ImNetworkRoomMemberChangedEnum changedEnum) {
+        this.changedEnum = changedEnum;
+    }
+
+    public boolean isMetronomeSwitch() {
+        return metronomeSwitch;
+    }
+
+    public void setMetronomeSwitch(boolean metronomeSwitch) {
+        this.metronomeSwitch = metronomeSwitch;
+    }
+
+    public boolean isExamSongSwitch() {
+        return examSongSwitch;
+    }
+
+    public void setExamSongSwitch(boolean examSongSwitch) {
+        this.examSongSwitch = examSongSwitch;
+    }
+
+    @Override
+    public String getObjectName() {
+        return "SC:RMCMsg";
+    }
+}

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

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+//网络教室伴奏下载信息
+public class ImNetworkRoomMusicSheetDownloadData {
+    //下载状态
+    private Integer status;
+    //伴奏原音
+    private String url;
+    //伴奏名
+    private String examSongName;
+    //伴奏编号
+    private Integer examSongId;
+    //是否开启伴奏
+    private Boolean enable = false;
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getExamSongName() {
+        return examSongName;
+    }
+
+    public void setExamSongName(String examSongName) {
+        this.examSongName = examSongName;
+    }
+
+    public Integer getExamSongId() {
+        return examSongId;
+    }
+
+    public void setExamSongId(Integer examSongId) {
+        this.examSongId = examSongId;
+    }
+}

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomResult.java

@@ -11,6 +11,9 @@ public class ImNetworkRoomResult extends ImNetworkRoom {
     @ApiModelProperty(value = "陪练课结束后,XX分钟关闭房间")
     private String autoCloseNetworkRoomTime = "15";
 
+    @ApiModelProperty(value = "当前课程剩余时长")
+    private Integer surplusTime;
+
     @ApiModelProperty(value = "房间成员列表,包含当前用户;")
     private List<ImNetworkRoomMember> roomMemberList;
 
@@ -20,6 +23,33 @@ public class ImNetworkRoomResult extends ImNetworkRoom {
     @ApiModelProperty(value = "当前用户伴奏信息")
     private List<CourseScheduleStudentMusicScoreResult> musicScoreResults;
 
+    @ApiModelProperty(value = "节拍器参数")
+    private ImNetworkCustomMessage midiJson = new ImNetworkCustomMessage();
+
+    public ImNetworkCustomMessage getMidiJson() {
+        return midiJson;
+    }
+
+    public void setMidiJson(ImNetworkCustomMessage midiJson) {
+        this.midiJson = midiJson;
+    }
+
+    public Integer getSurplusTime() {
+        return surplusTime;
+    }
+
+    public void setSurplusTime(Integer surplusTime) {
+        this.surplusTime = surplusTime;
+    }
+
+    public String getAutoCloseNetworkRoomTime() {
+        return autoCloseNetworkRoomTime;
+    }
+
+    public void setAutoCloseNetworkRoomTime(String autoCloseNetworkRoomTime) {
+        this.autoCloseNetworkRoomTime = autoCloseNetworkRoomTime;
+    }
+
     public List<ImNetworkRoomMember> getRoomMemberList() {
         return roomMemberList;
     }

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomStatusNotify.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+//网络教室状态回调
+public class ImNetworkRoomStatusNotify {
+    private String roomId;
+    private Long userId;
+    //成功、失败
+    private boolean requestStatus;
+
+    public String getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(String roomId) {
+        this.roomId = roomId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public boolean isRequestStatus() {
+        return requestStatus;
+    }
+
+    public void setRequestStatus(boolean requestStatus) {
+        this.requestStatus = requestStatus;
+    }
+
+    @Override
+    public String toString() {
+        return "ImNetworkRoomStatusNotify{" +
+                "roomId='" + roomId + '\'' +
+                ", userId=" + userId +
+                ", requestStatus=" + requestStatus +
+                '}';
+    }
+}

+ 0 - 22
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java

@@ -53,12 +53,6 @@ public class CourseSchedule implements Serializable {
     @ApiModelProperty(value = "下课时间")
     private Date endTime;
 
-    @ApiModelProperty(value = "上课时间(包含年月日)")
-    private Date startClassTime;
-
-    @ApiModelProperty(value = "下课时间(包含年月日)")
-    private Date endClassTime;
-
     @TableField("lock_")
     @ApiModelProperty(value = "购买陪练课及创建直播课时需要锁定课时 0未锁 1锁定")
     private Integer lock;
@@ -91,22 +85,6 @@ public class CourseSchedule implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
-    public Date getStartClassTime() {
-        return startClassTime;
-    }
-
-    public void setStartClassTime(Date startClassTime) {
-        this.startClassTime = startClassTime;
-    }
-
-    public Date getEndClassTime() {
-        return endClassTime;
-    }
-
-    public void setEndClassTime(Date endClassTime) {
-        this.endClassTime = endClassTime;
-    }
-
     public Long getId() {
         return id;
     }

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -64,9 +64,21 @@ public class CourseScheduleStudentPayment implements Serializable {
     private String courseType;
 
     @TableField("play_midi_")
-    @ApiModelProperty(value = "节拍器参数")
+    @ApiModelProperty(value = "网络教室节拍器参数")
     private String playMidi;
 
+    @TableField("music_sheet_download_json_")
+    @ApiModelProperty(value = "网络教室当前课程曲目下载信息")
+    private String musicSheetDownloadJson;
+
+    public String getMusicSheetDownloadJson() {
+        return musicSheetDownloadJson;
+    }
+
+    public void setMusicSheetDownloadJson(String musicSheetDownloadJson) {
+        this.musicSheetDownloadJson = musicSheetDownloadJson;
+    }
+
     public String getPlayMidi() {
         return playMidi;
     }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/IMApiResultInfo.java

@@ -40,4 +40,12 @@ public class IMApiResultInfo {
     public void setInChrm(Boolean inChrm) {
         isInChrm = inChrm;
     }
+
+    @Override
+    public String toString() {
+        return "IMApiResultInfo{" +
+                "code=" + code +
+                ", errorMessage='" + errorMessage + '\'' +
+                '}';
+    }
 }

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImNetworkRoomMemberChangedEnum.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
+/**
+* @description: 用户动作枚举
+* @author zx
+* @date 2022/4/6 13:59
+*/
+public enum ImNetworkRoomMemberChangedEnum implements BaseEnum<Integer, ImNetworkRoomMemberChangedEnum> {
+
+    JOIN(0,"加入"),
+    LEAVE(1,"离开"),
+    KICK(2,"踢出");
+
+    private Integer code;
+    private String msg;
+
+    ImNetworkRoomMemberChangedEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return this.code;
+    }
+}

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -2,6 +2,8 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetDownloadData;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,5 +16,18 @@ import org.apache.ibatis.annotations.Param;
 public interface CourseScheduleStudentPaymentService extends IService<CourseScheduleStudentPayment> {
 
     CourseScheduleStudentPaymentDao getDao();
+
+    /**
+    * @description: 获取网络教室成员midi
+     * @param courseScheduleId
+     * @param userId
+    * @return com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage
+    * @author zx
+    * @date 2022/4/6 14:15
+    */
+    ImNetworkCustomMessage getMemberMidi(long courseScheduleId, Long userId);
+
+    //获取伴奏信息
+    ImNetworkRoomMusicSheetDownloadData getMemberExamSong(long courseScheduleId, Long userId);
 }
 

+ 7 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java

@@ -19,6 +19,12 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     ImNetworkRoomDao getDao();
 
     //加入网络教室
-    HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole);
+    HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) throws Exception;
+
+    //加入网络教室成功
+    void joinRoomSuccess(String roomId, Long userId, UserRoleEnum userRole) throws Exception;
+
+    //加入网络教室失败
+    void joinRoomFailure(String roomId, Long userId);
 }
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -1,9 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetDownloadData;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleStudentPaymentService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -26,5 +30,23 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
         return this.baseMapper;
     }
 
+    @Override
+    public ImNetworkCustomMessage getMemberMidi(long courseScheduleId, Long userId) {
+        String midi = baseMapper.getMidiByCourseIdAndUserId(courseScheduleId, userId);
+        if(StringUtils.isNotEmpty(midi)){
+            return JSONObject.parseObject(midi, ImNetworkCustomMessage.class);
+        }
+        return new ImNetworkCustomMessage();
+    }
+
+    @Override
+    public ImNetworkRoomMusicSheetDownloadData getMemberExamSong(long courseScheduleId, Long userId) {
+        String musicSheet = baseMapper.getMusicSheetByCourseIdAndUserId(courseScheduleId, userId);
+        if(StringUtils.isNotEmpty(musicSheet)){
+            return JSONObject.parseObject(musicSheet, ImNetworkRoomMusicSheetDownloadData.class);
+        }
+        return new ImNetworkRoomMusicSheetDownloadData();
+    }
+
 }
 

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

@@ -1,30 +1,30 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
-import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomMemberDao;
 import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
-import com.yonge.cooleshow.biz.dal.dto.CourseScheduleStudentMusicScoreResult;
-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.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.entity.IMApiResultInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 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.service.*;
+import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
@@ -56,6 +56,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     private CourseScheduleService courseScheduleService;
     @Resource
     private SysConfigDao sysConfigDao;
+    @Resource
+    private IMHelper imHelper;
 
     @Override
     public ImNetworkRoomDao getDao() {
@@ -64,29 +66,25 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) {
+    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) throws Exception {
+        log.info("joinRoom params:courseScheduleId:{},userRole:{}",courseScheduleId,userRole);
         CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getDao().findOne(courseScheduleId)).
                 orElseThrow(()-> new BizException("课程信息不存在"));
         Date now = new Date();
+        courseSchedule.setUpdatedTime(now);
         //是否提前进入教室
-        String courseBeforeBufferTime = sysConfigDao.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE);
-        if (StringUtils.isEmpty(courseBeforeBufferTime)) {
-            courseBeforeBufferTime = "5";
-        }
-        Date addMinutes = DateUtil.addMinutes(now, Integer.parseInt(courseBeforeBufferTime));
-        if (courseSchedule.getStartClassTime().compareTo(addMinutes) > 0) {
+        if (roomNotStart(courseSchedule)) {
             return HttpResponseResult.failed(ImNetworkRoomErrorEnum.ROOM_NOT_START.getRemark());
         }
         SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
                 orElseThrow(()-> new BizException("请登录"));
         String roomId = courseScheduleId.toString();
         ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
-        //获取房间
-        ImNetworkRoom room = initRoom(roomId,courseScheduleId,userRole,sysUser.getId());
+        //初始化房间信息
+        ImNetworkRoom room = this.initRoom(roomId,courseScheduleId,userRole,sysUser.getId(),now);
         BeanUtils.copyProperties(room,joinRoomResult);
-        //创建群聊
         //定时销毁房间
-        //获取房间用户信息
+        //初始化房间用户信息
         ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
         joinRoomResult.setRoomMember(roomMember);
         //获取房间所有成员
@@ -95,39 +93,90 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         //如果是老师,重置节拍器数据
         if(userRole == UserRoleEnum.TEACHER){
             courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
+        }else {
+            //获取节拍器信息
+            joinRoomResult.setMidiJson(courseScheduleStudentPaymentService.getMemberMidi(courseScheduleId,sysUser.getId()));
         }
         //获取用户已下载的伴奏列表
         List<CourseScheduleStudentMusicScoreResult> musicScoreResults = courseScheduleStudentMusicScoreService.getDao().
                 queryByScoreIdAndCourseId(null,courseScheduleId,sysUser.getId(),null,null);
         joinRoomResult.setMusicScoreResults(musicScoreResults);
-        //网络教室配置项
+        //课程结束后关闭教室的时间
         String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
-        return null;
+        joinRoomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
+        //获取课程剩余时长
+        DateUtil.secondsBetween(now, courseSchedule.getEndTime());
+        //创建、加入群聊
+        IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{sysUser.getId().toString()}, roomId, roomId);
+        if(resultInfo.getCode() != 200){
+            log.error("加入群聊失败 resultInfo:{}",resultInfo);
+            throw new BizException("加入网络教室失败,请联系管理员");
+        }
+        return HttpResponseResult.succeed(joinRoomResult);
     }
 
-    public ImNetworkRoom initRoom(String roomId,Long courseId,UserRoleEnum userRole,Long userId){
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void joinRoomSuccess(String roomId, Long userId,UserRoleEnum userRole) throws Exception {
+        log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
+        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
+                orElseThrow(()-> new BizException("请登录"));
+        Date now = new Date();
+        //获取房间信息
+        this.initRoom(roomId, Long.parseLong(roomId), userRole, userId, now);
+        //获取房间用户信息
+        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
+        //发送加入房间的消息
+        ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN);
+        //获取节拍器信息
+        ImNetworkCustomMessage imNetworkCustomMessage = courseScheduleStudentPaymentService.getMemberMidi(Long.parseLong(roomId), userId);
+        msg.setMetronomeSwitch(imNetworkCustomMessage.getEnable());
+        //获取伴奏信息
+        ImNetworkRoomMusicSheetDownloadData musicSheetDownloadData = courseScheduleStudentPaymentService.getMemberExamSong(Long.parseLong(roomId), userId);
+        msg.setExamSongSwitch(musicSheetDownloadData.getEnable());
+        imHelper.publishMessage(userId.toString(), roomId, msg);
+        //记录考勤
+    }
+
+    @Override
+    public void joinRoomFailure(String roomId, Long userId) {
+        log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
+    }
+
+    //校验用户是否提前进入教室
+    private boolean roomNotStart(CourseSchedule courseSchedule){
+        //是否提前进入教室
+        String courseBeforeBufferTime = sysConfigDao.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE);
+        if (StringUtils.isEmpty(courseBeforeBufferTime)) {
+            courseBeforeBufferTime = "5";
+        }
+        Date addMinutes = DateUtil.addMinutes(courseSchedule.getUpdatedTime(), Integer.parseInt(courseBeforeBufferTime));
+        return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
+    }
+
+    public ImNetworkRoom initRoom(String roomId,Long courseId,UserRoleEnum userRole,Long userId,Date now) throws Exception {
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
         if(Objects.isNull(room)){
-            Date date = new Date();
             room = new ImNetworkRoom();
             //创建房间
             room.setCourseScheduleId(courseId);
             room.setRoomId(roomId);
-            room.setCreateTime(date);
-            room.setUpdateTime(date);
+            room.setCreateTime(now);
+            room.setUpdateTime(now);
             baseMapper.insert(room);
+            IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId.toString()}, roomId, roomId);
+            if(resultInfo.getCode() != 200){
+                log.error("创建群聊失败 resultInfo:{}",resultInfo);
+                throw new BizException("加入网络教室失败,请联系管理员");
+            }
         }else {
             if(userRole == UserRoleEnum.TEACHER){
                 room.setDisplay(new StringBuilder("display://type=1?userId=")
                         .append(userId)
                         .append("?uri=").toString());
+                baseMapper.updateById(room);
             }
         }
         return room;
     }
-
-    public void updateDisplay(){
-
-    }
-
 }

+ 2 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -10,8 +10,6 @@
         <result column="teacher_id_" jdbcType="INTEGER" property="teacherId"/>
         <result column="class_date_" jdbcType="TIMESTAMP" property="classDate"/>
         <result column="start_time_" jdbcType="TIMESTAMP" property="startTime"/>
-        <result column="start_class_time_" jdbcType="TIMESTAMP" property="startClassTime"/>
-        <result column="end_class_time_" jdbcType="TIMESTAMP" property="endClassTime"/>
         <result column="end_time_" jdbcType="TIMESTAMP" property="endTime"/>
         <result column="lock_" jdbcType="INTEGER" property="lock"/>
         <result column="lock_time_" jdbcType="TIMESTAMP" property="lockTime"/>
@@ -26,8 +24,6 @@
     <sql id="Base_Column_List">
         id_
         , course_group_id_, type_, status_,class_num_, teacher_id_, class_date_, start_time_, end_time_,
-        CONCAT(class_date_, ' ', start_class_time_) start_class_time_,
-        CONCAT(class_date_, ' ', end_class_time_)   end_class_time_,
         lock_, lock_time_, pre_student_num_, ex_student_num_, created_by_, created_time_, updated_by_, updated_time_
     </sql>
 
@@ -133,7 +129,8 @@
 
     </select>
     <select id="findOne" resultMap="BaseResultMap">
-        SELECT <include refid="Base_Column_List"/> FROM course_schedule WHERE id_ = #{courseScheduleId} LIMIT 1
+        SELECT <include refid="Base_Column_List"/> FROM course_schedule
+        WHERE id_ = #{courseScheduleId} LIMIT 1
     </select>
 
 

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

@@ -17,7 +17,8 @@
 
     <sql id="Base_Column_List">
         id_
-        , user_id_, course_group_id_, course_id_, order_no_, original_price_, expect_price_, actual_price_, created_time_, updated_time_, course_type_
+        , user_id_, course_group_id_, course_id_, order_no_, original_price_, expect_price_,
+        actual_price_, created_time_, updated_time_, course_type_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
@@ -45,5 +46,13 @@
             </if>
         </where>
     </select>
+    <select id="getMidiByCourseIdAndUserId" resultType="java.lang.String">
+        SELECT play_midi_ FROM course_schedule_student_payment
+        WHERE user_id_ = #{userId} AND course_schedule_id_ = #{courseScheduleId} LIMIT 1
+    </select>
+    <select id="getMusicSheetByCourseIdAndUserId" resultType="java.lang.String">
+        SELECT music_sheet_download_json_ FROM course_schedule_student_payment
+        WHERE user_id_ = #{userId} AND cssp.course_schedule_id_ = #{courseScheduleId} LIMIT 1
+    </select>
 
 </mapper>

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomResult;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomStatusNotify;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -9,8 +10,10 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
 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;
 
@@ -33,12 +36,24 @@ public class ImNetworkRoomController extends BaseController {
     @Resource
     private ImNetworkRoomService imNetworkRoomService;
 
+    @ApiOperation("加入网络教室")
     @PostMapping(value = "/join", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     @ApiImplicitParam(name = "courseScheduleId", dataType = "Long", value = "课程编号")
-    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId){
+    public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId) throws Exception {
         courseScheduleId = Optional.ofNullable(courseScheduleId)
                 .orElseThrow(()->new BizException("房间号不可为空"));
         return imNetworkRoomService.joinRoom(courseScheduleId, UserRoleEnum.TEACHER);
     }
+
+    @ApiOperation("加入网络教室状态回调")
+    @PostMapping(value = "joinRoomStatusNotify", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult joinRoomStatusNotify(@RequestBody ImNetworkRoomStatusNotify roomStatusNotify) throws Exception {
+        if(roomStatusNotify.isRequestStatus()){
+            imNetworkRoomService.joinRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId(),UserRoleEnum.TEACHER);
+        }else {
+            imNetworkRoomService.joinRoomFailure(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId());
+        }
+        return succeed();
+    }
 }