瀏覽代碼

删除直播课

liujc 2 年之前
父節點
當前提交
26a6ab4fe3
共有 35 個文件被更改,包括 614 次插入323 次删除
  1. 88 0
      .idea/httpRequests/http-requests-log.http
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  3. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  7. 2 48
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReturnFeeDto.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipGroupDetailDto.java
  9. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupPayInfoDto.java
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroup.java
  11. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentTRTCCallbackCommand.java
  12. 2 49
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherIncomeQueryInfo.java
  13. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupQueryInfo.java
  14. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/CourseScheduleWrapper.java
  15. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  16. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  18. 1 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  19. 133 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  20. 6 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  21. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  22. 53 80
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  23. 2 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  24. 11 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  25. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  26. 1 1
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  27. 8 2
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  28. 27 1
      mec-im/src/main/java/com/ym/controller/RoomController.java
  29. 45 4
      mec-im/src/main/java/com/ym/controller/UserController.java
  30. 1 1
      mec-im/src/main/java/com/ym/dao/RoomMemberDao.java
  31. 0 1
      mec-im/src/main/java/com/ym/pojo/RoomResult.java
  32. 93 88
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  33. 0 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  34. 16 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  35. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

+ 88 - 0
.idea/httpRequests/http-requests-log.http

@@ -7,6 +7,76 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 
 ###
 
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T155507.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T155111.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T155043.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T154917.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T154631.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=2030
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T154529.200.json
+
+###
+
+GET http://127.0.0.1:9002/teacherCourseSchedule/liveCourseScheduleTime?courseScheduleId=1678
+Authorization: bearer 2cd308e9-0b8b-4b08-b3cd-f34dc50a8dfd
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-06-07T152014.200.json
+
+###
+
 GET http://127.0.0.1:8005/teacher/findTeacherByTenantId
 Authorization: bearer 7e4145d6-111d-429b-893a-4546df0f58ed
 tenantId: 1
@@ -800,3 +870,21 @@ Accept-Encoding: br,deflate,gzip,x-gzip
 
 ###
 
+POST http://127.0.0.1:8005/studentManage/userDetail
+Authorization: bearer 81d0c352-fcc8-4812-87f5-0f7a68d10451
+Content-Type: application/json
+coopId: 1
+Content-Length: 63
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+  "studentId": 2248340,
+  "musicGroupId": 23042419330600001
+}
+
+<> 2023-06-01T160136.200.json
+
+###
+

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

@@ -291,7 +291,7 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @author Joburgess
      * @date 2020.08.05
      */
-    int countGroupNormalStudentNum(@Param("groupType") GroupType groupType,
+    int countGroupNormalStudentNum(@Param("groupType") String groupType,
                                    @Param("groupId") String groupId);
 
     /**

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

@@ -300,7 +300,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @author Joburgess
      * @date 2019/10/18
      */
-    int deleteCourseSchedulesByMusicGroupID(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType);
+    int deleteCourseSchedulesByMusicGroupID(@Param("musicGroupId") String musicGroupId, @Param("groupType") String groupType);
 
     /**
      * @param groupId:
@@ -1102,6 +1102,15 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<Integer, Long>> countCurrentNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("teacherId") Integer teacherId);
 
     /**
+     * 根据班级编号count剩余课时(未上)
+     *
+     * @param classGroupId
+     * @param teacherId
+     * @return
+     */
+    int countCurrentNumByClassId(@Param("classGroupId") Integer classGroupId, @Param("teacherId") Integer teacherId);
+
+    /**
      * @param groupType:
      * @param groupId:
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>

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

@@ -268,7 +268,7 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param groupType
 	 * @return
 	 */
-	int deleteByMusicGroupId(@Param("musicGroupId")String musicGroupId, @Param("groupType")GroupType groupType);
+	int deleteByMusicGroupId(@Param("musicGroupId")String musicGroupId, @Param("groupType")String groupType);
 
 
 	/**
@@ -289,7 +289,7 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param groupType:
 	 * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
 	 */
-	List<CourseScheduleTeacherSalary> findByGroupWithNotStart(@Param("groupId")String groupId, @Param("groupType")String groupType);
+	List<CourseScheduleTeacherSalary> findByGroupWithNotStart(@Param("groupId")String groupId, @Param("groupType") String groupType);
 
 	List<CourseScheduleTeacherSalary> queryUserNoSettlementListByTypeAndStartClassDate(@Param("userId") Integer userId, @Param("typeList") String typeList,
 			@Param("startClassDate") Date startClassDate);

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

@@ -158,7 +158,7 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * @param groupType
 	 * @return
 	 */
-	int deleteByMusicGroupId(@Param("musicGroupId")String musicGroupId, @Param("groupType")GroupType groupType);
+	int deleteByMusicGroupId(@Param("musicGroupId")String musicGroupId, @Param("groupType")String groupType);
 	
 	int deletebyCourseScheduleId(@Param("courseScheduleId") Long courseScheduleId);
 

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

@@ -395,4 +395,6 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
     * @date 2023/6/2 18:30
     */
     void updateStudentIdList(@Param("groupId") Long groupId, @Param("userId") Integer userId);
+
+    void del(@Param("id") Integer id);
 }

+ 2 - 48
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ReturnFeeDto.java

@@ -2,9 +2,11 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.enums.GroupType;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 
+@Data
 public class ReturnFeeDto {
 
     @ApiModelProperty(value = "课程组编号",required = false)
@@ -23,52 +25,4 @@ public class ReturnFeeDto {
     private Boolean confirmReturnActivityGive = false;
 
     private GroupType groupType;
-
-    public Long getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(Long groupId) {
-        this.groupId = groupId;
-    }
-
-    public GroupType getGroupType() {
-        return groupType;
-    }
-
-    public void setGroupType(GroupType groupType) {
-        this.groupType = groupType;
-    }
-
-    public Long getVipGroupId() {
-        return vipGroupId;
-    }
-
-    public void setVipGroupId(Long vipGroupId) {
-        this.vipGroupId = vipGroupId;
-    }
-
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
-    public Boolean getConfirmReturnActivityGive() {
-        return confirmReturnActivityGive;
-    }
-
-    public void setConfirmReturnActivityGive(Boolean confirmReturnActivityGive) {
-        this.confirmReturnActivityGive = confirmReturnActivityGive;
-    }
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipGroupDetailDto.java

@@ -27,4 +27,6 @@ public class StudentVipGroupDetailDto extends StudentVipGroupShowListDto {
 
     @ApiModelProperty("直播间配置信息")
     private String liveConfigJson;
+
+    private Boolean alertSubjectFlag = false;
 }

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

@@ -21,5 +21,4 @@ public class VipGroupPayInfoDto {
 
     private Integer tenantId;
 
-    private Boolean alertSubjectFlag = false;
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroup.java

@@ -158,6 +158,8 @@ public class VipGroup extends BaseEntity {
 
     private Integer subjectId;
 
+    private Boolean delFlag;
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentTRTCCallbackCommand.java

@@ -11,10 +11,20 @@ import lombok.Getter;
 @Getter
 public enum ETencentTRTCCallbackCommand {
 
+    // 房间事件
     EVENT_TYPE_CREATE_ROOM("101", "创建房间"),
     EVENT_TYPE_DISMISS_ROOM("102", "解散房间"),
     EVENT_TYPE_ENTER_ROOM("103", "进入房间"),
     EVENT_TYPE_EXIT_ROOM("104", "退出房间"),
+
+    // 媒体事件
+    EVENT_TYPE_START_VIDEO("201", "开始推送视频数据"),
+    EVENT_TYPE_STOP_VIDEO("202", "停止推送视频数据"),
+    EVENT_TYPE_START_AUDIO("203", "开始推送音频数据"),
+    EVENT_TYPE_STOP_AUDIO("204", "停止推送音频数据"),
+    EVENT_TYPE_START_ASSIT("205", "开始推送辅路数据"),
+    EVENT_TYPE_STOP_ASSIT("206", "停止推送辅路数据"),
+
     EVENT_DEFAULT("-1", "默认无效事件"),
     ;
 

+ 2 - 49
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherIncomeQueryInfo.java

@@ -1,13 +1,14 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.TeachIncomeTypeEnum;
 import com.ym.mec.common.page.QueryInfo;
+import lombok.Data;
 
 /**
  * @Author Joburgess
  * @Date 2021/4/16 0016
  */
+@Data
 public class TeacherIncomeQueryInfo extends QueryInfo {
 
     private Integer teacherId;
@@ -21,52 +22,4 @@ public class TeacherIncomeQueryInfo extends QueryInfo {
     private Boolean updated = false;
 
     private String teachIncomeType;
-
-    public Integer getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Integer teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public String getStartDay() {
-        return startDay;
-    }
-
-    public void setStartDay(String startDay) {
-        this.startDay = startDay;
-    }
-
-    public String getEndDay() {
-        return endDay;
-    }
-
-    public void setEndDay(String endDay) {
-        this.endDay = endDay;
-    }
-
-    public CourseStatusEnum getCourseStatus() {
-        return courseStatus;
-    }
-
-    public void setCourseStatus(CourseStatusEnum courseStatus) {
-        this.courseStatus = courseStatus;
-    }
-
-    public Boolean getUpdated() {
-        return updated;
-    }
-
-    public void setUpdated(Boolean updated) {
-        this.updated = updated;
-    }
-
-    public String getTeachIncomeType() {
-        return teachIncomeType;
-    }
-
-    public void setTeachIncomeType(String teachIncomeType) {
-        this.teachIncomeType = teachIncomeType;
-    }
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupQueryInfo.java

@@ -31,6 +31,8 @@ public class VipGroupQueryInfo extends QueryInfo {
 
     private Boolean hasEducationalTeacherId;
 
+    private Boolean delFlag;
+
     @ApiModelProperty(value = "上课时间,年月日",required = false)
     private String classDate;
 

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/CourseScheduleWrapper.java

@@ -0,0 +1,63 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 课程表数据类
+ * Created by Eric.Shang on 2023/6/7.
+ */
+public class CourseScheduleWrapper {
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("课程表")
+    public static class LiveCourseSchedule implements Serializable {
+
+        @ApiModelProperty("直播间编号")
+        private String liveRoomId;
+
+        @ApiModelProperty("声部编号")
+        private String subjectId;
+
+        @ApiModelProperty("课程结束后是否自动关闭课程")
+        private Boolean autoCloseFlag;
+
+        @ApiModelProperty("课程结束后多少分钟关闭网络教室")
+        private String autoCloseNetworkRoomTime;
+
+        @ApiModelProperty("获取当前课程剩余时长")
+        private Integer surplusTime;
+
+        @ApiModelProperty("当前时间戳")
+        private Long timestamp;
+
+        @ApiModelProperty("课程表时间")
+        private List<CourseScheduleTime> courseScheduleTimes;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("课程表时间")
+    public static class CourseScheduleTime implements Serializable {
+
+        @ApiModelProperty("开始时间")
+        private Long startTime;
+
+        @ApiModelProperty("结束时间")
+        private Long endTime;
+    }
+
+}

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

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.school.dto.ClassesForDayDto;
 import com.ym.mec.biz.dal.school.dto.CourseStudentDto;
+import com.ym.mec.biz.dal.vo.CourseScheduleWrapper;
 import com.ym.mec.biz.dal.wrapper.DailySummaryOfClassesForTheCurrentSemesterWrapper;
 import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
 import com.ym.mec.biz.dal.wrapper.TeachingPointWrapper;
@@ -19,7 +20,6 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.Date;
@@ -771,6 +771,13 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
      */
     Boolean teachingPointCourse(TeachingPointWrapper.TeachingPoint teachingPoint);
 
+	/**
+	 * 获取老师课程时间
+	 * @param courseScheduleId 课程编号
+	 * @return CourseScheduleWrapper.CourseSchedule
+	 */
+	CourseScheduleWrapper.LiveCourseSchedule getLiveCourseScheduleTime(Long courseScheduleId);
+
     List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo);
 
     /**

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java

@@ -181,8 +181,7 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
      * @return java.util.Map
      */
     <K extends VipGroup> Map<String, BigDecimal> countVipGroupPredictFee1(K vipGroup,
-                                                                         Integer teacherId,
-                                                                         Long courseId);
+                                                                         Integer teacherId);
     /**
      * @describe 计算vip课程购买总价,及老师课酬
      * @author Joburgess
@@ -470,4 +469,11 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
      * 直播课程提醒
      */
     void liveCourseRemind();
+
+    /**
+     * 删除直播课
+     *
+     * @param id 直播课id
+     */
+    Boolean del(Integer id);
 }

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

@@ -566,7 +566,7 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 		classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
 
 		//计算课程相关费用信息
-		Map<String, BigDecimal> costInfo = vipGroupService.countVipGroupPredictFee1(applyBaseInfo, applyBaseInfo.getUserId(), null);
+		Map<String, BigDecimal> costInfo = vipGroupService.countVipGroupPredictFee1(applyBaseInfo, applyBaseInfo.getUserId());
 		applyBaseInfo.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
 		applyBaseInfo.setTotalPrice(costInfo.get("totalPrice"));
 

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

@@ -1605,7 +1605,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (StringUtils.isBlank(type)) {
             throw new BizException("请指定课程类型");
         }
-
         Integer userId = sysUserService.getUserId();
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         switch (type) {
@@ -1657,7 +1656,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             currentClassTimes = MapUtil.convertIntegerMap(courseScheduleDao.countCurrentNumByClassGroupId(classGroupIds, userId));
         }
 
-
         teacherMusicClassGroup.forEach(teacherClassGroupDto -> {
             if (teacherClassGroupDto.getType() == ClassGroupTypeEnum.PRACTICE) {
                 String[] studentNums = classGroupStudentMapperDao.findStudentNumByClassGroupId(teacherClassGroupDto.getClassGroupId());
@@ -1802,7 +1800,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         teacherClassHeadInfo.setStudentNum(classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId()));
         teacherClassHeadInfo.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(classGroup.getId(), new Date()));
         teacherClassHeadInfo.setTotalClassTimes(courseScheduleDao.countClassGroupCourses(classGroup.getId()));
-        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes() - teacherClassHeadInfo.getCurrentClassTimes());
+        teacherClassHeadInfo.setSurplusClassTimes(courseScheduleDao.countCurrentNumByClassId(classGroup.getId(),null));
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
@@ -1815,24 +1813,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
-//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
-//        if (Objects.nonNull(teachingTeacher)) {
-//            teacherClassHeadInfo.setTeachingTeacherId(teachingTeacher.getId());
-//            teacherClassHeadInfo.setTeachingTeacher(teachingTeacher.getUserName());
-//        }
-
         if (classGroup.getType() == ClassGroupTypeEnum.VIP || classGroup.getType() == ClassGroupTypeEnum.LIVE) {
             String[] studentNums = classGroupStudentMapperDao.findStudentNumByClassGroupId(classGroupId);
             teacherClassHeadInfo.setStudentNames(StringUtils.join(studentNums, ","));
 
             // 查询课程信息
             if (StringUtils.isNotBlank(classGroup.getMusicGroupId())) {
-
                 VipGroup vipGroup = vipGroupDao.get(Long.parseLong(classGroup.getMusicGroupId()));
-
-                // 返回课程相关信息
-                // teacherClassHeadInfo.setCourseSchedules(JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class));
-                // 单节课时
                 teacherClassHeadInfo.setSingleClassMinutes(vipGroup.getSingleClassMinutes());
                 // 直播间配置
                 if (StringUtils.isNotEmpty(vipGroup.getLiveConfigJson())) {

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -15,6 +16,7 @@ import com.ym.mec.biz.dal.mapper.LiveGroupPlusMapper;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.school.dto.ClassesForDayDto;
 import com.ym.mec.biz.dal.school.dto.CourseStudentDto;
+import com.ym.mec.biz.dal.vo.CourseScheduleWrapper;
 import com.ym.mec.biz.dal.vo.ImLiveRoomVideoVo;
 import com.ym.mec.biz.dal.wrapper.DailySummaryOfClassesForTheCurrentSemesterWrapper;
 import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
@@ -44,6 +46,8 @@ import org.apache.commons.collections.ListUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.Nullable;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -56,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
+import java.text.MessageFormat;
 import java.text.ParseException;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
@@ -187,6 +192,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     private TeacherAttendanceService teacherAttendanceService;
     @Autowired
     private LessonExaminationService lessonExaminationService;
+	@Autowired
+	private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
 
     @Autowired
     private ImLiveRoomVideoDao imLiveRoomVideoDao;
@@ -1011,7 +1019,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             throw new BizException("请指定乐团!");
         }
         checkNewCourseSchedules(courseSchedules, false,false);
-        courseScheduleDao.deleteCourseSchedulesByMusicGroupID(musicGroupID, GroupType.MUSIC);
+        courseScheduleDao.deleteCourseSchedulesByMusicGroupID(musicGroupID, GroupType.MUSIC.getCode());
 		courseScheduleModifyLogService.pushSchoolCourseChange(courseSchedules.get(0));
     }
 
@@ -3339,19 +3347,17 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						// 重新生成课酬
 						if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
 							courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, newCourseSchedule, ts);
-						} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
-							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, teacherId, ts.getCourseScheduleId());
+						} else if (newCourseSchedule.getGroupType() == GroupType.VIP || newCourseSchedule.getGroupType() == LIVE) {
+							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, teacherId);
 							BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 							//是否是赠送课程
-							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
+							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
 							if(activityUserMapper != null){
 								if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 									teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
 								}
 							}
-
 							ts.setExpectSalary(teacherSalary);
-
 						} else if (newCourseSchedule.getGroupType() == PRACTICE) {
 							SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
 							BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
@@ -5949,4 +5955,125 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 	}
 
+
+	/**
+	 * 获取老师直播课程时间
+	 *
+	 * @param courseScheduleId 课程编号
+	 * @return CourseScheduleWrapper.CourseSchedule
+	 */
+	@Override
+	public CourseScheduleWrapper.LiveCourseSchedule getLiveCourseScheduleTime(Long courseScheduleId) {
+
+		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+		if (Objects.isNull(courseSchedule)) {
+			throw new BizException("课程不存在");
+		}
+
+		if (courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE) {
+			throw new BizException("请前往线下教室");
+		}
+
+		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
+		courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
+				.startTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime()).getMillis())
+				.endTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getEndClassTime()).getMillis())
+				.build());
+
+		// 是否是连堂课
+		String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, courseSchedule.getTenantId());
+		if (StringUtils.isEmpty(continueCourseTime)) {
+			continueCourseTime = "5";
+		}
+
+		CourseSchedule schedule = courseSchedule;
+		// 如果当前课程是连堂课,那么获取第一节课的课程编号
+		while (true) {
+			String classDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+			String startClassTime = DateUtil.format(schedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			schedule = courseScheduleDao.getFirstCourse(schedule.getClassGroupId(), classDate + " " + startClassTime, schedule.getActualTeacherId(), continueCourseTime);
+			if (schedule != null) {
+				courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
+						.startTime(getDateTime(schedule.getClassDate(), schedule.getStartClassTime()).getMillis())
+						.endTime(getDateTime(schedule.getClassDate(), schedule.getEndClassTime()).getMillis())
+						.build());
+			} else {
+				break;
+			}
+		}
+
+		if (courseScheduleTimes.size() <= 1) {
+
+			// 定时任务更新课程状态为进行中,判断当前课程状态是否匹配
+			if (CourseStatusEnum.NOT_START == courseSchedule.getStatus()) {
+				throw new BizException("直播课暂未开启,请稍后重试");
+			}
+			if (CourseStatusEnum.OVER == courseSchedule.getStatus()) {
+				throw new BizException("直播课已结束");
+			}
+		}
+
+		// 直播间配置
+		ImLiveBroadcastRoom liveBroadcastRoom = imLiveBroadcastRoomService.lambdaQuery()
+				.eq(ImLiveBroadcastRoom::getRoomUid, courseSchedule.getLiveRoomId())
+				.last("LIMIT 1")
+				.one();
+		if (Objects.isNull(liveBroadcastRoom)) {
+			throw new BizException("请先进入直播课教室");
+		}
+
+		// 当前时间
+		DateTime now = DateTime.now();
+
+		return CourseScheduleWrapper.LiveCourseSchedule.builder()
+				.liveRoomId(courseSchedule.getLiveRoomId())
+				.subjectId(liveBroadcastRoom.getSubjectId())
+				.autoCloseFlag(true)
+				.autoCloseNetworkRoomTime(getCloseNetworkRoomTime(courseSchedule, continueCourseTime))
+				.surplusTime(DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime()))
+				.timestamp(now.getMillis())
+				.courseScheduleTimes(courseScheduleTimes)
+				.build();
+	}
+
+	/**
+	 * 课程开始时间
+	 * @param day 开始天
+	 * @param time 开始时间
+	 * @return DateTime
+	 */
+	private DateTime getDateTime(Date day, Date time) {
+		String liveStartTime = MessageFormat.format("{0} {1}", DateUtil.format(day, DateUtil.DEFAULT_PATTERN),
+				DateUtil.format(time, DateUtil.EXPANDED_TIME_FORMAT));
+
+		return DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
+	}
+
+	/**
+	 * 课程结束后多少分钟关闭网络教室
+	 * @param courseSchedule CourseSchedule
+	 * @param continueCourseTime 连堂课延迟时间
+	 * @return String
+	 */
+	public String getCloseNetworkRoomTime(CourseSchedule courseSchedule, String continueCourseTime) {
+
+		String autoCloseNetworkRoomTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_AFTER_BUFFER_TIME, courseSchedule.getTenantId());
+		if (StringUtils.isEmpty(autoCloseNetworkRoomTime)) {
+			autoCloseNetworkRoomTime = "15";
+		}
+		CourseSchedule schedule = courseSchedule;
+		//如果当前课程是连堂课,那么获取第一节课的课程编号
+		while (true) {
+			String classDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+			String endClassTime = DateUtil.format(schedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			schedule = courseScheduleDao.getLastCourse(schedule.getClassGroupId(), classDate + " " + endClassTime, schedule.getActualTeacherId(), continueCourseTime);
+			if (schedule != null) {
+				autoCloseNetworkRoomTime = String.valueOf(DateUtil.minutesBetween(new Date(), schedule.getEndClassTime()));
+			} else {
+				break;
+			}
+		}
+		return autoCloseNetworkRoomTime;
+	}
+
 }

+ 6 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -895,11 +895,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         VipGroup vipGroup = vipGroupService.get(vipGroupId.longValue());
         BigDecimal offlineTeacherSalary=BigDecimal.ZERO;
 
-        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByGroupWithNotStart(vipGroupId.toString(), GroupType.VIP.getCode());
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByGroupWithNotStart(vipGroupId.toString(), vipGroup.getGroupType());
         if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
-            Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
+            Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
             for(int i=0;i<courseScheduleTeacherSalaries.size();i++){
                 if(!courseScheduleTeacherSalaries.get(i).getEnableChangeSalary()){
                     continue;
@@ -1414,9 +1414,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private void createVipGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
         //是否是赠送课程
-        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
+        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),vipGroup.getGroupType(),null);
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, courseSchedule.getActualTeacherId(), courseSchedule.getId());
+            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, courseSchedule.getActualTeacherId());
             BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 
             if(activityUserMapper != null){
@@ -1674,8 +1674,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     @Override
     public void calMusicCourseTeacherActualSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary,
                                                   List<TeacherAttendance> teacherAttendances, School school, Teacher teacher, String attendanceRange, Boolean updated) {
-
-
         //教师课酬
         if(StringUtils.isNotBlank(courseScheduleTeacherSalary.getDeductionReason())&&"不结算课酬".equals(courseScheduleTeacherSalary.getDeductionReason())){
             //不结算课酬
@@ -2039,11 +2037,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             if(Objects.nonNull(teacherSalary.getActualSalary())){
                 continue;
             }
-
             switch (courseSchedule.getGroupType()){
                 case MUSIC:
                     calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, false);
                     break;
+                case LIVE:
                 case VIP:
                     calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, false);
                     break;

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

@@ -2023,13 +2023,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupStudentFeeDao.deleteByMusicGroupId(musicGroupId, null);
 
         // 删除课表
-        courseScheduleDao.deleteCourseSchedulesByMusicGroupID(musicGroupId, GroupType.MUSIC);
+        courseScheduleDao.deleteCourseSchedulesByMusicGroupID(musicGroupId, GroupType.MUSIC.getCode());
         // 删除每节课的课酬
         courseScheduleStudentPaymentService.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
-        courseScheduleTeacherSalaryDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
+        courseScheduleTeacherSalaryDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC.getCode());
 
         //删除考勤
-        teacherAttendanceDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
+        teacherAttendanceDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC.getCode());
 
         /*// 查询已缴费信息
         studentPaymentOrders = studentPaymentOrderDao.queryByDealStatus(musicGroupId, OrderTypeEnum.APPLY, SUCCESS);

+ 53 - 80
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -564,18 +564,21 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         //计算课程相关费用信息
         if (CourseSchedule.CourseScheduleType.VIP.getCode().equals(groupType)) {
             // 计算老师课薪
-            costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto, vipGroupApplyBaseInfoDto.getUserId(), null);
-        }
-        if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
+            costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto, vipGroupApplyBaseInfoDto.getUserId());
+        }else if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
             costInfo.put("totalPrice",vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
             costInfo.put("originalTotalPrice",vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
         }
 
         vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
-        vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
+        if (now.after(vipGroupApplyBaseInfoDto.getRegistrationStartTime())) {
+            vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
+        }else {
+            vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.NOT_START);
+        }
 
          vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.getOrDefault("totalPrice", ZERO));
-         vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.getOrDefault("originalTotalPrice", ZERO));
+         vipGroupApplyBaseInfoDto.setOriginalTotalPrice(costInfo.getOrDefault("originalTotalPrice", ZERO));
         if (CollectionUtils.isEmpty(vscps)) {
             vscps = new ArrayList<>();
             for (Integer canBuyStudentId : canBuyStudentIds) {
@@ -1288,11 +1291,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         if (!ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())) {
             //计算课程相关费用信息
-            Map<String, BigDecimal> costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto,
-                    vipGroupApplyBaseInfoDto.getUserId(), null);
+            Map<String, BigDecimal> costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto,vipGroupApplyBaseInfoDto.getUserId());
             BigDecimal teacherSalary = costInfo.get("offlineTeacherSalary");
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(), vipGroupApplyBaseInfoDto.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroupApplyBaseInfoDto.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     teacherSalary = costInfo.get("giveOfflineTeacherSalary");
@@ -1794,6 +1796,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         if (queryInfo.getGroupType().equals(GroupType.LIVE.getCode())) {
             queryInfo.setOrganId(null);
             queryInfo.setLiveOrganId(null);
+            queryInfo.setDelFlag(true);
         }
         PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
@@ -2187,6 +2190,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 throw new BizException("未找到指定课程");
             }
             StudentVipGroupDetailDto vipGroupDetail = vipGroupDao.getVipGroupDetail(groupId);
+            if("LIVE".equals(vipGroup.getGroupType())){
+                ImLiveBroadcastRoomDto roomDto = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoomDto.class);
+                String subjectId = roomDto.getSubjectId();
+                Subject subject = subjectDao.get(Integer.parseInt(subjectId));
+                //乐理不提醒
+                if(!subject.getParentSubjectId().equals(30)){
+                    Student student = studentDao.get(sysUserService.getUserId());
+                    if(!student.getSubjectIdList().equals(subjectId)){
+                        vipGroupDetail.setAlertSubjectFlag(true);
+                    }
+                }
+            }
             if (StringUtils.isNotEmpty(vipGroup.getCourseSchedulesJson())) {
                 vipGroupDetail.setCourseSchedules(JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class));
                 // 排课时间排序
@@ -2207,8 +2222,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
     @Override
     public <K extends VipGroup> Map<String, BigDecimal> countVipGroupPredictFee1(K vipGroup,
-                                                                                 Integer teacherId,
-                                                                                 Long courseId) {
+                                                                                 Integer teacherId) {
         if (Objects.isNull(teacherId)) {
             throw new BizException("请指定教师");
         }
@@ -2256,7 +2270,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 vipGroup.setOriginalTotalPrice(originalTotalPrice);
             }
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), vipGroup.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
@@ -2291,7 +2305,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         results.put("totalPrice", vipGroup.getTotalPrice());
         results.put("originalTotalPrice", vipGroup.getOriginalTotalPrice());
 
-        int normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(VIP, vipGroup.getId().toString());
+        int normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(vipGroup.getGroupType(), vipGroup.getId().toString());
 
         //教师线下单课酬计算
         BigDecimal teacherOfflineSalary = BigDecimal.ZERO;
@@ -2777,7 +2791,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     studentPaymentOrderService.activityGive(vipGroup.getVipGroupActivityId(), order,
                             vipGroup.getId().toString(), null);
                     //获取班级实际人数
-                    Integer studentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(groupType, classGroup.getMusicGroupId());
+                    Integer studentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(vipGroup.getGroupType(), classGroup.getMusicGroupId());
                     //课程组人数已满,变更状态
                     if (studentNum.equals(classGroup.getExpectStudentNum())) {
                         vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
@@ -2794,7 +2808,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                         List<TeacherAttendance> teacherAttendances = new ArrayList<>();
                         //创建课酬信息
                         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
-                        Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                        Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             //创建教师课程薪水记录
                             CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -3033,7 +3047,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         if (classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT)) {
             throw new BizException("当前学生已经是退学状态");
         }
-        BigDecimal amount = returnFeeDto.getAmount();
+        /*BigDecimal amount = returnFeeDto.getAmount();
         if (!classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)) {
             if (Objects.isNull(amount)) {
                 throw new BizException("请确定退费金额");
@@ -3043,12 +3057,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if (amount.compareTo(suplusCourseFee) > 0) {
                 throw new BizException("学员最大可退费金额为{}元", suplusCourseFee.toString());
             }
-        }
+        }*/
         GroupType groupType = GroupType.VIP;
-        ReturnFeeEnum returnFeeEnum = ReturnFeeEnum.VIP;
         if("LIVE".equals(vipGroup.getGroupType())){
             groupType = GroupType.LIVE;
-            returnFeeEnum = ReturnFeeEnum.LIVE;
         }
 
         if (classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)) {
@@ -3061,17 +3073,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             return BaseController.succeed();
         }
 
-        //记录日志
-        SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
-        sysUserCashAccountLog.setUserId(studentId);
-        sysUserCashAccountLog.setGroupType(groupType);
-        sysUserCashAccountLog.setOrganId(vipGroup.getOrganId());
-        sysUserCashAccountLog.setGroupId(vipGroupId.toString());
-        sysUserCashAccountLog.setAmount(amount);
-        sysUserCashAccountLog.setReturnFeeType(returnFeeEnum);
-        sysUserCashAccountLog.setComment(groupType.getDesc() + "退学");
-        sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
-
         classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
         classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
 
@@ -3451,10 +3452,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
             }
 
-            Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+            Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
             BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), vipGroup.getGroupType(), null);
             if (activityUserMapper != null) {
                 if (vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -3861,7 +3862,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
         if (studentNum > 0) {
-            throw new BizException("无法停止课程,需要全部学员退学后,才能停止,请先操作学员退学。");
+            throw new BizException("无法关闭课程,需要全部学员退学后,才能关闭,请先操作学员退学。");
         }
 
         List<Map<Integer, BigDecimal>> maps = vipGroupDao.countSurplusCourseFee(vipGroupId);
@@ -3892,7 +3893,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.findByStudentVipGroup(vipGroupId, userId,
                     DealStatusEnum.SUCCESS.getCode(),orderType);
             if (null == studentPaymentOrder) {
-                throw new BizException("无法停止课程,需要全部学员退学后,才能停止,请先操作学员退学。");
+                throw new BizException("无法关闭课程,需要全部学员退学后,才能关闭,请先操作学员退学。");
             }
 //			sysUserCashAccountService.updateBalance(userId.intValue(),studentSurplusClassFees.get(userId));
 //			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(userId.intValue());
@@ -4068,7 +4069,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         courseScheduleService.batchAddCourseSchedule(vipGroupApplyDto.getCourseSchedules());
 
-        Map<String, BigDecimal> map = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+        Map<String, BigDecimal> map = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
         BigDecimal offlineTeacherSalary = map.get("offlineTeacherSalary");
         //是否是赠送课程
         ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
@@ -4207,7 +4208,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if (courseNum == 0) {
                 courseScheduleService.batchAddCourseSchedule(courseSchedules);
 
-                Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                 BigDecimal offlineTeacherSalary = salaryMap.get("offlineTeacherSalary");
                 //是否是赠送课程
                 ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(), "VIP", null);
@@ -4534,7 +4535,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     List<TeacherAttendance> teacherAttendances = new ArrayList<>();
                     //创建课酬信息
                     List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
-                    Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
+                    Map<String, BigDecimal> stringBigDecimalMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId());
                     for (CourseSchedule courseSchedule : courseSchedules) {
                         //创建教师课程薪水记录
                         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -4615,7 +4616,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public void updateVipGroupStatusToFinished() {
-
         Date now = new Date();
         //更新至已结束
         List<VipGroup> vipGroupList = vipGroupDao.queryRequiredOverList();
@@ -4646,13 +4646,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 vipGroup.setStatus(VipGroupStatusEnum.CANCEL);
                 vipGroup.setUpdateTime(now);
                 vipGroup.setStopReason("没有学员");
-                
                 // 删除课表
-                courseScheduleDao.deleteCourseSchedulesByMusicGroupID(vipGroup.getId() + "", GroupType.VIP);
-                courseScheduleTeacherSalaryDao.deleteByMusicGroupId(vipGroup.getId() + "", GroupType.VIP);
-
+                courseScheduleDao.deleteCourseSchedulesByMusicGroupID(vipGroup.getId().toString(), vipGroup.getGroupType());
+                courseScheduleTeacherSalaryDao.deleteByMusicGroupId(vipGroup.getId().toString(), vipGroup.getGroupType());
                 //删除考勤
-                teacherAttendanceDao.deleteByMusicGroupId(vipGroup.getId() + "", GroupType.VIP);
+                teacherAttendanceDao.deleteByMusicGroupId(vipGroup.getId().toString(), vipGroup.getGroupType());
             }
             vipGroupDao.batchUpdate(vipGroupList);
             
@@ -4661,36 +4659,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             }
         }
         
-        //更新到进行中或报名中
+        //更新到报名中
         List<VipGroup> normalVipGroupList = vipGroupDao.queryNormalStatusList();
         if (!CollectionUtils.isEmpty(normalVipGroupList)) {
             List<VipGroup> needUpdateVipGroups = new ArrayList<>();
             for (VipGroup vipGroup : normalVipGroupList) {
-                try {
-                    if (Objects.isNull(vipGroup.getRegistrationStartTime())) {
-                        continue;
-                    }
-                    if (vipGroup.getStatus().equals(VipGroupStatusEnum.PAUSE) || vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)
-                            || vipGroup.getStatus().equals(VipGroupStatusEnum.FINISHED) || vipGroup.getStatus().equals(VipGroupStatusEnum.PROGRESS)) {
-                        continue;
-                    }
-                    if (now.before(vipGroup.getRegistrationStartTime())) {
-                        vipGroup.setStatus(VipGroupStatusEnum.NOT_START);
-                    } else if (vipGroup.getRegistrationStartTime().before(now)
-                            && vipGroup.getPaymentExpireDate().after(now)
-                            && VipGroupStatusEnum.NOT_START.equals(vipGroup.getStatus())) {
-                        vipGroup.setStatus(VipGroupStatusEnum.APPLYING);
-                    } else {
-                        continue;
-                    }
-                    VipGroup vipGroup1 = new VipGroup();
-                    vipGroup1.setId(vipGroup.getId());
-                    vipGroup1.setStatus(vipGroup.getStatus());
-                    vipGroup1.setUpdateTime(now);
-                    vipGroup1.setTotalPrice(vipGroup.getTotalPrice());
-                    needUpdateVipGroups.add(vipGroup1);
-                } catch (Exception e) {
-                    e.printStackTrace();
+                if (Objects.isNull(vipGroup.getRegistrationStartTime())) {
+                    continue;
+                }
+                if (now.after(vipGroup.getRegistrationStartTime())) {
+                    vipGroup.setStatus(VipGroupStatusEnum.APPLYING);
+                    needUpdateVipGroups.add(vipGroup);
                 }
             }
             if (!CollectionUtils.isEmpty(needUpdateVipGroups)) {
@@ -4709,18 +4688,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             throw new BizException("未找到此课程");
         }
         VipGroupPayInfoDto vipGroupPayInfo = new VipGroupPayInfoDto();
-        if("LIVE".equals(vipGroup.getGroupType())){
-            ImLiveBroadcastRoomDto roomDto = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoomDto.class);
-            String subjectId = roomDto.getSubjectId();
-            Subject subject = subjectDao.get(Integer.parseInt(subjectId));
-            //乐理不提醒
-            if(!subject.getParentSubjectId().equals(30)){
-                Student student = studentDao.get(userId);
-                if(!student.getSubjectIdList().equals(subjectId)){
-                    vipGroupPayInfo.setAlertSubjectFlag(true);
-                }
-            }
-        }
         vipGroupPayInfo.setTenantId(vipGroup.getTenantId());
         vipGroupPayInfo.setVipGroupId(vipGroup.getId().intValue());
         vipGroupPayInfo.setViipGroupName(vipGroup.getName());
@@ -5021,4 +4988,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         courseScheduleDao.updateRemindStatus(ids);
 
     }
+
+    @Override
+    public Boolean del(Integer id) {
+        vipGroupDao.del(id);
+        return true;
+    }
 }

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

@@ -384,7 +384,7 @@
         FROM
           class_group_student_mapper
         WHERE
-            group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            group_type_ = #{groupType}
 	        AND music_group_id_= #{groupId}
             AND status_='NORMAL'
     </select>
@@ -715,7 +715,7 @@
 		select vg.id_,cgsm.class_group_id_,count(cgsm.user_id_) total_student_num_,sum(case when cgsm.status_ = 'QUIT' then 1 else 0 end ) quit_student_num_ 
 		from class_group_student_mapper cgsm LEFT JOIN class_group cg on cgsm.class_group_id_ = cg.id_
 		LEFT JOIN vip_group vg on vg.id_ = cgsm.music_group_id_
-		WHERE cgsm.group_type_ = 'VIP' and vg.group_status_ in (2,6) and cg.del_flag_ != 1 GROUP BY cgsm.class_group_id_
+		WHERE cgsm.group_type_ IN ('VIP','LIVE') and vg.group_status_ in (2,6) and cg.del_flag_ != 1 GROUP BY cgsm.class_group_id_
 		) a WHERE a.total_student_num_ = a.quit_student_num_
     </select>
     <select id="findByVipGroups" resultMap="ClassGroupStudentMapper">

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

@@ -354,8 +354,8 @@
         DELETE
         FROM course_schedule
         WHERE music_group_id_ = #{musicGroupId}
-        <if test="groupType != null">
-          AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        <if test="groupType != null and groupType != ''">
+          AND group_type_ = #{groupType}
         </if>
           and status_ = 'NOT_START'
     </delete>
@@ -2311,6 +2311,14 @@
         AND cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cs.pre_course_flag_ = 0
         GROUP BY cs.class_group_id_
     </select>
+    <select id="countCurrentNumByClassId" resultType="java.lang.Integer">
+        SELECT COUNT(cs.id_) FROM course_schedule cs
+        WHERE cs.class_group_id_ = #{classGroupId}
+        <if test="teacherId != null">
+            AND cs.actual_teacher_id_ = #{teacherId}
+        </if>
+        AND cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cs.pre_course_flag_ = 0
+    </select>
 
     <select id="countExpendNumByClassGroupId" resultType="java.util.Map">
         SELECT cs.class_group_id_ 'key',COUNT(cs.id_) 'value' FROM course_schedule cs
@@ -3644,7 +3652,7 @@
         AND status_ = 'NOT_START'
     </select>
     <select id="getLock" resultMap="CourseSchedule">
-        SELECT * FROM course_schedule WHERE id_ = #{courseId} FOR UPDATE
+        SELECT * FROM course_schedule WHERE id_ = #{courseId}
     </select>
 
     <select id="countCourseMergeCourseNum" resultType="java.util.Map">

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

@@ -618,7 +618,7 @@
     <delete id="deleteByMusicGroupId" parameterType="map" >
 		DELETE cssp FROM course_schedule_teacher_salary cssp
 		LEFT JOIN course_schedule cs on cssp.course_schedule_id_ = cs.id_
-		WHERE cssp.music_group_id_=#{musicGroupId} AND cssp.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
+		WHERE cssp.music_group_id_=#{musicGroupId} AND cssp.group_type_=#{groupType} and cs.status_ = 'NOT_START'
 	</delete>
 	<delete id="deleteByGroup">
 		DELETE FROM course_schedule_teacher_salary WHERE music_group_id_=#{groupId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}

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

@@ -770,7 +770,7 @@
 
     <delete id="deleteByMusicGroupId" parameterType="map" >
 		DELETE ta FROM teacher_attendance ta LEFT JOIN course_schedule cs ON ta.course_schedule_id_ = cs.id_
-		WHERE ta.music_group_id_=#{musicGroupId} AND ta.group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} and cs.status_ = 'NOT_START'
+		WHERE ta.music_group_id_=#{musicGroupId} AND ta.group_type_=#{groupType} and cs.status_ = 'NOT_START'
 	</delete>
 	
     <delete id="deletebyCourseScheduleId">

+ 8 - 2
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -216,6 +216,9 @@
             <if test="subjectId != null">
                 AND vg.subject_id_ = #{subjectId}
             </if>
+            <if test="delFlag != null">
+                and vg.del_flag_ = #{delFlag}
+            </if>
         </where>
     </sql>
 
@@ -1071,8 +1074,7 @@
     <select id="queryNormalStatusList" resultMap="VipGroup">
         SELECT *
         FROM vip_group
-        WHERE group_status_ != 3
-          AND group_status_ != 4
+        WHERE group_status_ = 0
     </select>
 
     <select id="findVipGroupInfo" resultMap="VipGroup">
@@ -1170,5 +1172,9 @@
     <select id="getCourseStudentNumsByGroupId" resultType="java.lang.Integer">
         SELECT t2.student_num_ FROM vip_group t1 JOIN vip_group_category t2 ON (t1.vip_group_category_id_ = t2.id_) WHERE t1.id_ = #{groupId}
     </select>
+
+    <update id="del">
+        UPDATE vip_group SET del_flag_ = 1 WHERE id_ = #{id}
+    </update>
     <!--获取课程人数-->
 </mapper>

+ 27 - 1
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -154,7 +154,33 @@ public class RoomController{
                 }
             }
 
-            // 直播回调整消息, roomId.startsWith("LIVE")
+            // 直播课回调消息, roomId.startsWith("LIVE")
+            if (roomId.startsWith("LIVE")) {
+                String[] values = roomId.split("-");
+                if (values.length < 2 || !values[1].startsWith("S")) {
+                    return;
+                }
+
+                roomId = values[1];
+                // 直播课回调事件处理, 课程编号
+                switch (ETencentTRTCCallbackCommand.get(eventInfo.getEventType())){
+                    case EVENT_TYPE_START_VIDEO:
+                    case EVENT_TYPE_START_AUDIO:
+                    case EVENT_TYPE_START_ASSIT:
+                        //成员加入
+                        roomService.joinRoomSuccess(roomId, eventInfo.getEventInfo().getUserId(), null);
+                        break;
+                    case EVENT_TYPE_STOP_VIDEO:
+                    case EVENT_TYPE_STOP_AUDIO:
+                    case EVENT_TYPE_STOP_ASSIT:
+                        //成员退出
+                        roomService.leaveRoomSuccess(roomId, eventInfo.getEventInfo().getUserId(),null, eventInfo.getCallbackTs());
+                        break;
+                    default:
+                        // 默认事件,直接忽略
+                        break;
+                }
+            }
 
         }catch (Exception e){
             log.error("statusSyncTencent event={}", eventInfo.jsonString(), e);

+ 45 - 4
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -12,9 +12,11 @@ import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.service.LiveRoomService;
+import com.ym.service.RoomService;
 import com.ym.service.UserService;
 import io.rong.models.user.UserModel;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,7 +28,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -42,8 +43,10 @@ public class UserController {
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
     @Autowired
     private LiveRoomService liveRoomService;
-  @Autowired
-  private LivePluginContext livePluginContext;
+    @Autowired
+    private LivePluginContext livePluginContext;
+    @Autowired
+    private RoomService roomService;
 
     @RequestMapping(value = "/register", method = RequestMethod.POST)
     public Object register(@RequestBody UserModel userModel) throws Exception {
@@ -115,6 +118,7 @@ public class UserController {
 
 
         if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.getCommand())) {
+            // 直播群成员在线状态回调
             TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
                 body);
 
@@ -127,6 +131,7 @@ public class UserController {
 
 
         } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.getCommand())) {
+            // 群成员离开之后回调
             TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
                 body);
 
@@ -136,8 +141,27 @@ public class UserController {
 
             if (callbackAfterMemberExit.getGroupId().startsWith("LIVE")) {
                 imLiveBroadcastRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
+
+                // 直播课学生签退
+                String[] values = callbackAfterMemberExit.getGroupId().split("-");
+                String roomId = values.length > 2 ? values[1] : "";
+
+                if ((roomId.startsWith("S") || roomId.startsWith("I"))
+                        && CollectionUtils.isNotEmpty(callbackAfterMemberExit.getExitMemberList())) {
+
+                    // 学生编号
+                    String userId = callbackAfterMemberExit.getExitMemberList().get(0).getMemberAccount();
+                    try {
+                        roomService.leaveRoomSuccess(roomId, userId, null);
+                    } catch (Exception e) {
+                        log.error("tencentImCallback leaveRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                    }
+
+                }
+
             }
-        }  else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
+        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
+            // 新成员入群之后回调
             TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
                 body);
 
@@ -147,6 +171,23 @@ public class UserController {
 
             if (callbackAfterNewMemberJoin.getGroupId().startsWith("LIVE")) {
                 imLiveBroadcastRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
+
+                // 直播课学生签到
+                String[] values = callbackAfterNewMemberJoin.getGroupId().split("-");
+                String roomId = values.length > 2 ? values[1] : "";
+
+                if ((roomId.startsWith("S") || roomId.startsWith("I"))
+                        && CollectionUtils.isNotEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
+
+                    // 学生编号
+                    String userId = callbackAfterNewMemberJoin.getNewMemberList().get(0).getMemberAccount();
+                    try {
+                        roomService.joinRoomSuccess(roomId, userId, null);
+                    } catch (Exception e) {
+                        log.error("tencentImCallback joinRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                    }
+
+                }
             }
         }
 

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

@@ -17,7 +17,7 @@ import java.util.List;
 public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
     List<RoomMember> findByRid(String rid);
 
-    @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+    //@Lock(value = LockModeType.PESSIMISTIC_WRITE)
     RoomMember findByRidAndUid(String rid, String uid);
 
     List<RoomMember> findByRidAndRole(String rid, int role);

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

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
-import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Getter;

+ 93 - 88
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -722,7 +722,7 @@ public class RoomServiceImpl implements RoomService {
         roomMemberDao.deleteUserByRidAndUid(roomId, userId);
     }
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void joinRoomSuccess(String roomId, String userId, String deviceNum) throws Exception {
         log.info("joinRoomSuccess: roomId={}, userId={}, deviceNum={}", roomId, userId, deviceNum);
@@ -731,8 +731,8 @@ public class RoomServiceImpl implements RoomService {
             roomMember = saveRoomMember(roomId, userId);
         }
         String joinSuccessKey = "joinRoomSuccess" + roomId + userId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1l, TimeUnit.SECONDS);
-        if (!aBoolean) {
+        Boolean exist = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1L, TimeUnit.SECONDS);
+        if (Boolean.FALSE.equals(exist)) {
             RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
             if (roleEnum == RoleTeacher && StringUtils.isNotEmpty(deviceNum)) {
                 teacherAttendanceService.updateDeviceNum(Integer.parseInt(roomId.substring(1)), userId, deviceNum, null);
@@ -744,99 +744,104 @@ public class RoomServiceImpl implements RoomService {
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
 
-        String display = "";
-        if (roleEnum == RoleTeacher) {
-            //如果是老师加入房间,调整节拍器状态
-            courseScheduleStudentPaymentDao.adjustPlayMidi(schedule.getId(), null, null);
-            display = "display://type=1?userId=" + userId + "?uri=";
-        } else if (roleEnum == RoleEnum.RoleAssistant) {
-            display = "display://type=0?userId=" + userId + "?uri=";
-        }
-        Date curTime = DateTimeUtils.currentUTC();
-        Room room = roomDao.findByRid(roomId);
-        log.info("joinRoomSuccess: roomId={}, userId={}, roleEnum={}, room={}", roomId, userId, roleEnum.name(), Objects.isNull(room));
-        if (room == null) {
-            saveRoom(roomId, roomId, curTime, display);
-            this.joinImGroup(roomId, schedule.getActualTeacherId(), schedule);
-        } else {
-            if (roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant) {
-                updateDisplay(roomId, userId, display, 0);
-            }
-        }
+        // 非直播课执行流程;VIP课、网管课
+        if (GroupType.LIVE != schedule.getGroupType()) {
 
-        UserInfo userInfo = userDao.findByUid(userId);
-        if (userInfo == null) {
-            userInfo = new UserInfo();
-            userInfo.setUid(userId);
-            userInfo.setName(roomMember.getName());
-            userInfo.setCreateDt(curTime);
-            userInfo.setUpdateDt(curTime);
-            userDao.save(userInfo);
-        }
-        MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
-        msg.setTimestamp(curTime);
-        msg.setUserName(roomMember.getName());
-        msg.setCamera(true);
-        Boolean playMidi = false;
-        Boolean examSong = false;
-        if (roleEnum == RoleStudent) {
-            String midiByCourseIdAndUserId = courseScheduleStudentPaymentDao.getMidiByCourseIdAndUserId(schedule.getId().toString(), userId);
-            //获取节拍器信息
-            if (StringUtils.isNotEmpty(midiByCourseIdAndUserId)) {
-                JSONObject jsonObject = JSONObject.parseObject(midiByCourseIdAndUserId);
-                if (jsonObject.get("enable") != null) {
-                    playMidi = Boolean.parseBoolean(jsonObject.get("enable").toString());
+            String display = "";
+            if (roleEnum == RoleTeacher) {
+                //如果是老师加入房间,调整节拍器状态
+                courseScheduleStudentPaymentDao.adjustPlayMidi(schedule.getId(), null, null);
+                display = "display://type=1?userId=" + userId + "?uri=";
+            } else if (roleEnum == RoleEnum.RoleAssistant) {
+                display = "display://type=0?userId=" + userId + "?uri=";
+            }
+            Date curTime = DateTimeUtils.currentUTC();
+            Room room = roomDao.findByRid(roomId);
+            log.info("joinRoomSuccess: roomId={}, userId={}, roleEnum={}, room={}", roomId, userId, roleEnum.name(), Objects.isNull(room));
+            if (room == null) {
+                saveRoom(roomId, roomId, curTime, display);
+                this.joinImGroup(roomId, schedule.getActualTeacherId(), schedule);
+            } else {
+                if (roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant) {
+                    updateDisplay(roomId, userId, display, 0);
                 }
             }
-            String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(schedule.getId(), Integer.parseInt(userId));
-            if (StringUtils.isNotEmpty(examJson)) {
-                ExamSongDownloadData examSongDownloadData = JSON.parseObject(examJson, ExamSongDownloadData.class);
-                examSong = examSongDownloadData.getEnable();
+
+            UserInfo userInfo = userDao.findByUid(userId);
+            if (userInfo == null) {
+                userInfo = new UserInfo();
+                userInfo.setUid(userId);
+                userInfo.setName(roomMember.getName());
+                userInfo.setCreateDt(curTime);
+                userInfo.setUpdateDt(curTime);
+                userDao.save(userInfo);
+            }
+            MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
+            msg.setTimestamp(curTime);
+            msg.setUserName(roomMember.getName());
+            msg.setCamera(true);
+            Boolean playMidi = false;
+            Boolean examSong = false;
+            if (roleEnum == RoleStudent) {
+                String midiByCourseIdAndUserId = courseScheduleStudentPaymentDao.getMidiByCourseIdAndUserId(schedule.getId().toString(), userId);
+                //获取节拍器信息
+                if (StringUtils.isNotEmpty(midiByCourseIdAndUserId)) {
+                    JSONObject jsonObject = JSONObject.parseObject(midiByCourseIdAndUserId);
+                    if (jsonObject.get("enable") != null) {
+                        playMidi = Boolean.parseBoolean(jsonObject.get("enable").toString());
+                    }
+                }
+                String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(schedule.getId(), Integer.parseInt(userId));
+                if (StringUtils.isNotEmpty(examJson)) {
+                    ExamSongDownloadData examSongDownloadData = JSON.parseObject(examJson, ExamSongDownloadData.class);
+                    examSong = examSongDownloadData.getEnable();
+                }
             }
-        }
-        msg.setHandUpOn(roomMember.isHand());
-        msg.setMetronomeSwitch(playMidi);
-        msg.setExamSongSwitch(examSong);
+            msg.setHandUpOn(roomMember.isHand());
+            msg.setMetronomeSwitch(playMidi);
+            msg.setExamSongSwitch(examSong);
 
 
-        // 获取RTC服务提供方
-        String rtcServiceProvider = Optional.ofNullable(schedule.getServiceProvider()).orElse("rongCloud");
+            // 获取RTC服务提供方
+            String rtcServiceProvider = Optional.ofNullable(schedule.getServiceProvider()).orElse("rongCloud");
 
-        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
-        if (rtcServiceProvider.equals(TencentCloudRTCPlugin.PLUGIN_NAME)) {
-            // 腾讯云RTC服务
-            RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
-                    .action(EMemberAction.JOIN.getValue());
+            RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
+            if (rtcServiceProvider.equals(TencentCloudRTCPlugin.PLUGIN_NAME)) {
+                // 腾讯云RTC服务
+                RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
+                        .action(EMemberAction.JOIN.getValue());
 
-            if (roleEnum == RoleTeacher) {
-                action.role(roleEnum.getValue());
-            } else {
-                action.role(roleEnum.getValue());
-            }
-            action.handUpOn(roomMember.isHand())
-                    .microphone(roomMember.isMic())
-                    .timestamp(curTime.getTime())
-                    .camera(true)
-                    .sendUserInfo(getSendUser(userId,roleEnum));
-
-            // 开启全员静音,重置学员状态
-            if (schedule.getMuteAll()) {
-                action.microphone(false);
-            }
+                if (roleEnum == RoleTeacher) {
+                    action.role(roleEnum.getValue());
+                } else {
+                    action.role(roleEnum.getValue());
+                }
+                action.handUpOn(roomMember.isHand())
+                        .microphone(roomMember.isMic())
+                        .timestamp(curTime.getTime())
+                        .camera(true)
+                        .sendUserInfo(getSendUser(userId,roleEnum));
+
+                // 开启全员静音,重置学员状态
+                if (schedule.getMuteAll()) {
+                    action.microphone(false);
+                }
 
-            RTCRoomMessage roomMessage = RTCRoomMessage.builder()
-                    .objectName(RTCRoomMessage.MEMBER_CHANGE_MESSAGE)
-                    .fromUserId(userId)
-                    .content(action.build())
-                    .toChatRoomId(roomId)
-                    .isPersisted(1)
-                    .isIncludeSender(1)
-                    .build();
+                RTCRoomMessage roomMessage = RTCRoomMessage.builder()
+                        .objectName(RTCRoomMessage.MEMBER_CHANGE_MESSAGE)
+                        .fromUserId(userId)
+                        .content(action.build())
+                        .toChatRoomId(roomId)
+                        .isPersisted(1)
+                        .isIncludeSender(1)
+                        .build();
 
-            pluginService.sendChatRoomMessage(roomMessage);
-        } else {
-            imHelper.publishMessage(userId, roomId, msg);
+                pluginService.sendChatRoomMessage(roomMessage);
+            } else {
+                imHelper.publishMessage(userId, roomId, msg);
+            }
         }
+
         log.info("join room success: roomId = {}, userId = {}, role = {}", roomId, userId, roleEnum);
         signInSuccess(roomMember, deviceNum);
     }
@@ -922,9 +927,9 @@ public class RoomServiceImpl implements RoomService {
         }
 
         String leaveSuccessKey = "leaveRoomSuccess" + roomId + userId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 1L, TimeUnit.SECONDS);
-        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={},aBoolean={}", roomId, userId, deviceNum, aBoolean);
-        if (Boolean.FALSE.equals(aBoolean)) {
+        Boolean exist = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 1L, TimeUnit.SECONDS);
+        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={},aBoolean={}", roomId, userId, deviceNum, exist);
+        if (Boolean.FALSE.equals(exist)) {
             if (StringUtils.isNotEmpty(deviceNum)) {
                 //如果设备号不为空,更新设备号
                 if (roleEnum == RoleTeacher) {

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

@@ -47,7 +47,6 @@ public class ClassGroupController extends BaseController {
     private ImGroupNoticeService imGroupNoticeService;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-
     @Autowired
     private SubjectService subjectService;
 

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

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
+import com.ym.mec.biz.dal.vo.CourseScheduleWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -21,6 +22,8 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
@@ -376,6 +379,19 @@ public class TeacherCourseScheduleController extends BaseController {
         return succeed(scheduleService.queryStudyStandardWaitVisit(queryInfo));
     }
 
+    @ApiOperation(value = "获取老师直播课程时间")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "courseScheduleId", value = "课程id", required = true, dataType = "Long")
+    })
+    @GetMapping("/liveCourseScheduleTime")
+    public HttpResponseResult<CourseScheduleWrapper.LiveCourseSchedule> liveCourseScheduleTime(@RequestParam Long courseScheduleId){
+
+        if (Objects.isNull(courseScheduleId)) {
+            throw new BizException("课程编号不能为空");
+        }
+
+        return succeed(scheduleService.getLiveCourseScheduleTime(courseScheduleId));
+    }
 
     @ApiOperation(value = "老师乐直播直播课课程列表")
     @PostMapping("/liveCoursePage")

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

@@ -445,4 +445,13 @@ public class VipGroupManageController extends BaseController {
 
         return succeed(vipGroupService.liveCourseList(query));
     }
+
+
+
+    @ApiOperation(value = "删除直播课")
+    @PostMapping(value = "/delLiveGroup/{id}")
+    public HttpResponseResult<Object> delLiveGroup(@PathVariable Integer id){
+
+        return succeed(vipGroupService.del(id));
+    }
 }