liujc 2 лет назад
Родитель
Сommit
0b82965194
19 измененных файлов с 567 добавлено и 39 удалено
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java
  3. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/LiveGroupPlusMapper.java
  4. 77 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveGroupWrapper.java
  5. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CooperationOrganService.java
  6. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SubjectService.java
  8. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  9. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CooperationOrganServiceImpl.java
  10. 16 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  11. 15 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  12. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  13. 334 32
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  14. 3 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  15. 20 0
      mec-biz/src/main/resources/config/mybatis/LiveGroupPlusMapper.xml
  16. 10 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  17. 2 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  18. 7 1
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  19. 32 0
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

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

@@ -378,4 +378,6 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return 在读学生数
      */
     int countMusicGroupStudents(Map<String, Object> paramMap);
+
+    List<Student> listByIds(@Param("studentIds") List<Long> studentIds);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java

@@ -131,6 +131,10 @@ public class ImLiveBroadcastRoom implements Serializable {
     @ApiModelProperty("声部编号")
     private String subjectId;
 
+    @TableField("video_record_")
+    @ApiModelProperty("视频录制编号")
+    private String videoRecord;
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createdBy;
@@ -407,5 +411,13 @@ public class ImLiveBroadcastRoom implements Serializable {
     public void setSubjectId(String subjectId) {
         this.subjectId = subjectId;
     }
+
+    public String getVideoRecord() {
+        return videoRecord;
+    }
+
+    public void setVideoRecord(String videoRecord) {
+        this.videoRecord = videoRecord;
+    }
 }
 

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/LiveGroupPlusMapper.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface LiveGroupPlusMapper extends BaseMapper<Object> {
+
+
+    IPage<LiveGroupWrapper.LiveGroupStudentList> liveStudentList(@Param("page") IPage<LiveGroupWrapper.LiveGroupStudentList> page,
+                                                                 @Param("param") LiveGroupWrapper.LiveGroupStudentQuery query);
+
+}

+ 77 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveGroupWrapper.java

@@ -0,0 +1,77 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class LiveGroupWrapper {
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" LiveGroupStudentQuery-直播课学生列表查询")
+    public static class LiveGroupStudentQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @NotNull(message = "直播课ID不能为空")
+        @ApiModelProperty("直播课ID")
+        private Long liveGroupId;
+
+        private Long classGroupdId;
+
+    }
+
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" LiveGroupStudentList-直播课学生列表")
+    public static class LiveGroupStudentList {
+
+        @ApiModelProperty("订单号")
+        private String orderNo;
+
+        @ApiModelProperty("学生编号")
+        private Long studentId;
+
+        @ApiModelProperty("分部名称")
+        private String organName;
+
+        @ApiModelProperty("学生姓名")
+        private String studentName;
+
+
+        @ApiModelProperty("学校名称")
+        private String schoolName;
+
+        @ApiModelProperty("声部")
+        private String subjectName;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+        @ApiModelProperty("报名时间")
+        private Date createTime;
+
+
+    }
+
+}

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

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 

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

@@ -7,7 +7,6 @@ import java.util.Map;
 import java.util.Set;
 
 import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.enums.EGroupGradeType;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
@@ -103,4 +102,6 @@ public interface OrganizationService extends BaseService<Integer, Organization>
      * @param gradeType 年级类型
      */
     Map<Integer, String> getGradeList(Integer organId, String gradeType);
+
+    Map<Integer,Organization> getMapById(List<Integer> ids);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java

@@ -1,13 +1,17 @@
 package com.ym.mec.biz.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
 import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -15,6 +19,9 @@ import java.util.Map;
 
 public interface VipGroupService extends BaseService<Long, VipGroup> {
 
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    HttpResponseResult updateLiveGroup(VipGroupApplyDto vipGroup);
+
     /**
      * @describe 申请VIP课
      * @author Joburgess
@@ -449,4 +456,12 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     * @date 2023/6/2 18:03
     */
     void createLiveCourse();
+
+    /**
+     * 学生列表
+     *
+     */
+    IPage<LiveGroupWrapper.LiveGroupStudentList> liveStudentList(IPage<LiveGroupWrapper.LiveGroupStudentList> page, LiveGroupWrapper.LiveGroupStudentQuery query);
+
+    List<CourseSchedule> liveCourseList( LiveGroupWrapper.LiveGroupStudentQuery query);
 }

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

@@ -243,4 +243,5 @@ public class CooperationOrganServiceImpl extends BaseServiceImpl<Integer, Cooper
         }
         return musicGroupList.stream().filter(o -> o.getStatus().equals(MusicGroupStatusEnum.PROGRESS)).collect(Collectors.toList());
     }
+
 }

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

@@ -2243,9 +2243,22 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                                                    .endTime(now.plusDays(1).toDateTime().getMillis())
                                                    .build();
 
-                    // 生成录制任务
-                    log.info("createLiveRoom>>>>>> recordStart:{}", recordStart.jsonString());
-                    pluginService.rtcRoomRecordStart(recordStart);
+                    if ("NORMAL".equals(room.getGroupType()) || ("LIVE".equals(room.getGroupType()) && StringUtils.isBlank(room.getVideoRecord()))) {
+
+                        // 生成录制任务
+                        log.info("createLiveRoom>>>>>> recordStart:{}", recordStart.jsonString());
+                        RTCRoom.RecordResp resp = pluginService.rtcRoomRecordStart(recordStart);
+
+                        // 设置录制任务Id
+                        ImLiveBroadcastRoom update = new ImLiveBroadcastRoom();
+                        update.setId(room.getId());
+                        if (StringUtils.isBlank(room.getVideoRecord())) {
+                            update.setVideoRecord(resp.getRecordId());
+                        } else {
+                            update.setVideoRecord(room.getVideoRecord() + "," + resp.getRecordId());
+                        }
+                        updateById(update);
+                    }
                 }
 
                 // 直播间类型: NORMAL, LIVE

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

@@ -9,7 +9,6 @@ import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.entity.TenantInfo;
-import com.ym.mec.biz.dal.enums.EGroupGradeType;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
@@ -264,6 +263,21 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
     }
 
     @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Map<Integer, Organization> getMapById(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return new HashMap<>();
+        }
+        List<Organization> organs = organizationDao.findOrgans(ids);
+        if (CollectionUtils.isEmpty(organs)) {
+            return new HashMap<>();
+        }
+        return organs.stream().collect(Collectors.toMap(Organization::getId, Function.identity()));
+
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
     public void updateOrganId(Integer userId,Integer organId){
 		Employee employee = employeeDao.get(userId);
 		String organIdList = employee.getOrganIdList();

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

@@ -1654,6 +1654,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         studentMemberUpdateLogDao.insert(studentMemberUpdateLog);
     }
 
+
     @Transactional(rollbackFor = Exception.class)
     public  <T extends BaseStudentDto> void insertStudent(T baseStudent){
         Student student = new Student();

+ 334 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -11,10 +11,17 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.dto.VipGroupClassGroupMapper;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.mapper.LiveGroupPlusMapper;
+import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
 import com.ym.mec.biz.service.*;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +38,6 @@ import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
@@ -60,38 +66,7 @@ import com.ym.mec.biz.dal.dao.VipGroupDao;
 import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesCycleDao;
 import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
 import com.ym.mec.biz.dal.dao.VipGroupStudentCoursePriceDao;
-import com.ym.mec.biz.dal.entity.ActivityUserMapper;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentApplyRefunds;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
-import com.ym.mec.biz.dal.entity.StudentPauseInfo;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentRecoverDto;
-import com.ym.mec.biz.dal.entity.SysConfig;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
-import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.TeacherAttendance;
-import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
-import com.ym.mec.biz.dal.entity.VipGroup;
-import com.ym.mec.biz.dal.entity.VipGroupActivity;
-import com.ym.mec.biz.dal.entity.VipGroupCategory;
-import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesCycle;
-import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
-import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import com.ym.mec.biz.dal.enums.ActivityCourseType;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
@@ -230,6 +205,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Autowired
     private OrganizationDao organizationDao;
     @Autowired
+    private OrganizationService organizationService;
+    @Autowired
     private GroupClassService groupClassService;
     @Autowired
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
@@ -251,6 +228,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private LiveGroupPlusMapper liveGroupPlusMapper;
+
+    @Autowired
+    private CooperationOrganService cooperationOrganService;
+
+    @Autowired
+    private SubjectService subjectService;
+
     private static final Logger LOGGER = LoggerFactory.getLogger(VipGroup.class);
 
     @Override
@@ -258,6 +247,237 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         return vipGroupDao;
     }
 
+
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    @Override
+    public HttpResponseResult updateLiveGroup(VipGroupApplyDto vipGroup) {
+
+
+        if (vipGroup.getVipGroupApplyBaseInfo().getId() == null) {
+            throw new BizException("课程id不能为空");
+        }
+        VipGroup vipGroup1 = vipGroupDao.get(vipGroup.getVipGroupApplyBaseInfo().getId());
+        if (vipGroup1 == null) {
+            throw new BizException("课程不存在");
+        }
+
+        // 声部
+        VipGroupApplyDto vipGroupApplyDto = liveGroupDetail(vipGroup1.getId());
+        // 检测是否有学生已经购买直播课
+        IPage<LiveGroupWrapper.LiveGroupStudentList> livedStudentList = this.liveStudentList(new Page<>(1, 1),
+                LiveGroupWrapper.LiveGroupStudentQuery.builder().liveGroupId(vipGroup1.getId()).build());
+        if (livedStudentList.getRecords().size() >0) {
+            // 有人购买过直播课 不可修改判断
+
+            // 声部
+            if (!vipGroupApplyDto.getVipGroupApplyBaseInfo().getSubjectIdList().equals(vipGroup.getVipGroupApplyBaseInfo().getSubjectIdList())) {
+                throw new BizException("已有学生购买直播课,不可修改声部");
+            }
+
+            // 课时数
+            if (!vipGroupApplyDto.getVipGroupApplyBaseInfo().getOnlineClassesNum().equals(vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum())) {
+                throw new BizException("已有学生购买直播课,不可修改课时数");
+            }
+
+            // 课程时长
+            if (!vipGroupApplyDto.getVipGroupApplyBaseInfo().getSingleClassMinutes().equals(vipGroup.getVipGroupApplyBaseInfo().getSingleClassMinutes())) {
+                throw new BizException("已有学生购买直播课,不可修改课程时长");
+            }
+
+
+            /// 现价
+            if (vipGroupApplyDto.getVipGroupApplyBaseInfo().getOnlineClassesUnitPrice().compareTo(vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesUnitPrice()) != 0) {
+                throw new BizException("已有学生购买直播课,不可修改现价");
+            }
+
+            // 原价
+            if (vipGroupApplyDto.getVipGroupApplyBaseInfo().getOfflineClassesUnitPrice().compareTo(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesUnitPrice()) != 0) {
+                throw new BizException("已有学生购买直播课,不可修改原价");
+            }
+        }
+
+
+
+        // VIP, LIVE课程公共参数校验
+        if (Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getUserId())) {
+            throw new BizException("请选择指导老师");
+        }
+
+        if (vipGroup.getCourseSchedules().size() != (vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum() + vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum())) {
+            throw new BizException("建课失败,当前课程存在未排课课程,请调整相关设置");
+        }
+
+        // 学生购买价格,老师课薪设置校验
+        VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto = vipGroup.getVipGroupApplyBaseInfo();
+
+        if (Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
+                && Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())) {
+            throw new BizException("请设置课程单价");
+        }
+
+        if (Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary())) {
+            throw new BizException("请设置教师课酬");
+        }
+
+        // 课程时间校验
+        Integer totalClassTimes = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
+        //获取第一节课
+        CourseSchedule firstCourseSchedule = vipGroup.getCourseSchedules().stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+        //获取最后一节课
+        CourseSchedule latestCourseSchedule = vipGroup.getCourseSchedules().stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+
+        if (firstCourseSchedule.getStartClassTime().before(new Date())) {
+            throw new BizException("开课时间不能小于当前时间");
+        }
+
+        if (vipGroupApplyBaseInfoDto.getRegistrationStartTime().after(vipGroupApplyBaseInfoDto.getPaymentExpireDate())) {
+            throw new BizException("报名开始时间必须在报名截至时间之前");
+        }
+
+        if (vipGroupApplyBaseInfoDto.getPaymentExpireDate().after(firstCourseSchedule.getStartClassTime())
+                || DateUtil.isSameDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate(), firstCourseSchedule.getEndClassTime())) {
+            throw new BizException("创建失败,报名截止时间必须在开课时间前一天");
+        }
+
+        VipGroupCategory vipGroupCategory = vipGroupCategoryService.get(vipGroupApplyBaseInfoDto.getVipGroupCategoryId());
+        if (Objects.isNull(vipGroupCategory)) {
+            throw new BizException("课程形式不存在");
+        }
+        Date now = new Date();
+        // VIP课,LIVE课参数校验
+        String groupType = vipGroup.getVipGroupApplyBaseInfo().getGroupType();
+
+        // 购买学生列表
+        List<Integer> canBuyStudentIds = Lists.newArrayList();
+        if (StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())) {
+            canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(Integer::valueOf).collect(Collectors.toList());
+        }
+        List<VipGroupStudentCoursePrice> vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+
+        // VIP课参数校验
+        if (CourseSchedule.CourseScheduleType.VIP.getCode().equals(groupType)) {
+
+            // 校验VIP课参数
+            vipGroupRequestParamValid(vipGroup, vipGroupApplyBaseInfoDto, totalClassTimes, firstCourseSchedule, latestCourseSchedule);
+
+        }
+
+        // LIVE课参数校验
+        if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
+
+            ImLiveBroadcastRoomDto liveRoom = vipGroup.getLiveBroadcastRoom();
+            if (Objects.isNull(liveRoom) || Objects.isNull(liveRoom.getRoomConfig())) {
+                throw new BizException("直播间参数错误");
+            }
+
+            if (StringUtils.isAnyBlank(liveRoom.getRoomTitle(), liveRoom.getLiveRemark(), liveRoom.getOs())
+                    || Objects.isNull(liveRoom.getUseScene())) {
+                throw new BizException("直播间参数错误");
+            }
+
+            // 设置默认参数
+            liveRoom.groupType(vipGroup.getVipGroupApplyBaseInfo().getGroupType())
+                    .subjectId(vipGroup.getVipGroupApplyBaseInfo().getSubjectIdList())
+                    .setTenantId(TenantContextHolder.getTenantId());
+
+            vipGroup.getVipGroupApplyBaseInfo().setLiveConfigJson(JSON.toJSONString(liveRoom));
+        }
+        vipGroupDao.update(vipGroupApplyBaseInfoDto);
+
+
+        ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroup1.getId(), vipGroup1.getGroupType());
+        //更新班级信息
+        if (classGroup == null) {
+            classGroup =new ClassGroup();
+        }
+        classGroup.setSubjectIdList(vipGroupApplyBaseInfoDto.getSubjectIdList());
+        //如果是乐理课实际人数为所选学员数量
+        if (Boolean.TRUE.equals(vipGroupCategory.getMusicTheory())) {
+            classGroup.setExpectStudentNum(canBuyStudentIds.size());
+        } else {
+            classGroup.setExpectStudentNum(vipGroupCategory.getStudentNum());
+        }
+        classGroup.setStudentNum(0);
+        classGroup.setName(vipGroupApplyBaseInfoDto.getName());
+        classGroup.setTotalClassTimes(totalClassTimes);
+        classGroup.setType(ClassGroupTypeEnum.valueOf(groupType));
+        classGroup.setDelFlag(1);
+        classGroup.setGroupType(GroupType.valueOf(groupType));
+        classGroup.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+
+        classGroup.setUpdateTime(now);
+        if (classGroup.getId() == null) {
+            classGroup.setCreateTime(now);
+            classGroupDao.insert(classGroup);
+        } else {
+            classGroupDao.update(classGroup);
+        }
+
+
+        ClassGroupTeacherMapper classGroupTeacherMapper = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroup.getId(), TeachTypeEnum.BISHOP);
+        if (classGroupTeacherMapper == null) {
+            classGroupTeacherMapper = new ClassGroupTeacherMapper();
+        }
+        //更新班级老师关联记录
+        classGroupTeacherMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+        classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+        classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherMapper.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+        classGroupTeacherMapper.setGroupType(GroupType.valueOf(groupType));
+
+        classGroupTeacherMapper.setUpdateTime(now);
+        if (classGroupTeacherMapper.getId() == null) {
+            classGroupTeacherMapper.setCreateTime(now);
+            classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+        } else {
+            classGroupTeacherMapperDao.update(classGroupTeacherMapper);
+        }
+
+        ClassGroupTeacherSalary classGroupTeacherSalary = classGroupTeacherSalaryDao
+                .findByVipGoupAndTeacher(vipGroup1.getId().intValue(), vipGroupApplyDto.getLiveBroadcastRoom().getSpeakerId());
+        if (classGroupTeacherSalary == null) {
+            classGroupTeacherSalary = new ClassGroupTeacherSalary();
+        }
+        //更新班级与老师课酬记录
+        classGroupTeacherSalary.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+        classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+        classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherSalary.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+        classGroupTeacherSalary.setSalary(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary());
+        classGroupTeacherSalary.setOnlineClassesSalary(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary());
+        classGroupTeacherSalary.setGroupType(GroupType.valueOf(groupType));
+        classGroupTeacherSalary.setUpdateTime(now);
+        if (classGroupTeacherSalary.getId() == null) {
+            classGroupTeacherSalary.setCreateTime(now);
+            classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+        } else {
+            classGroupTeacherSalaryDao.update(classGroupTeacherSalary);
+        }
+
+        //课程信息调整
+        List<CourseSchedule> courseSchedules = vipGroup.getCourseSchedules();
+        ClassGroup finalClassGroup = classGroup;
+        courseSchedules.forEach(courseSchedule -> {
+            courseSchedule.setGroupType(GroupType.valueOf(groupType));
+            courseSchedule.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+            if (courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
+                courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
+            }
+            courseSchedule.setTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+            courseSchedule.setActualTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.valueOf(groupType));
+            courseSchedule.setClassGroupId(finalClassGroup.getId());
+            courseSchedule.setName(vipGroupApplyBaseInfoDto.getName());
+            courseSchedule.setOrganId(vipGroupApplyBaseInfoDto.getOrganId());
+        });
+
+        courseScheduleService.checkNewCourseSchedules(courseSchedules, false, false);
+        vipGroupApplyBaseInfoDto.setCourseSchedulesJson(JSON.toJSONString(courseSchedules));
+        vipGroupDao.update(vipGroupApplyBaseInfoDto);
+        return BaseController.succeed(vipGroupApplyBaseInfoDto.getAuditStatus().getCode());
+    }
+
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     @Override
     public HttpResponseResult createVipGroup(VipGroupApplyDto vipGroup) {
@@ -345,6 +565,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 throw new BizException("直播间参数错误");
             }
 
+            // 直播间默认方案
+            String liveClient = sysConfigDao.findConfigValue("live_client");
+            liveRoom.setServiceProvider(liveClient);
+
             // 设置默认参数
             liveRoom.groupType(vipGroup.getVipGroupApplyBaseInfo().getGroupType())
                     .subjectId(vipGroup.getVipGroupApplyBaseInfo().getSubjectIdList())
@@ -4503,6 +4727,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 
         String subjectId = imLiveBroadcastRoomDto.getSubjectId();
+        baseInfoDto.setSubjectIdList(subjectId);
         if ("-1".equals(subjectId)) {
             baseInfoDto.setSubjectName("乐理");
         } else {
@@ -4529,4 +4754,81 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             }
         }
     }
+
+
+    /**
+     * 学生列表
+     *
+     */
+    @Override
+    public IPage<LiveGroupWrapper.LiveGroupStudentList> liveStudentList(IPage<LiveGroupWrapper.LiveGroupStudentList> page, LiveGroupWrapper.LiveGroupStudentQuery query) {
+        IPage<LiveGroupWrapper.LiveGroupStudentList> livedStudentList = liveGroupPlusMapper.liveStudentList(page, query);
+        List<LiveGroupWrapper.LiveGroupStudentList> records = livedStudentList.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return livedStudentList;
+        }
+        // 学生ID集合
+        List<Integer> studentIds = records.stream().map(LiveGroupWrapper.LiveGroupStudentList::getStudentId).map(o -> o.intValue()).collect(Collectors.toList());
+
+        // 学生信息
+        Map<Integer, Student> studentMap = studentService.getMapByIds(studentIds);
+        if (MapUtils.isEmpty(studentMap)) {
+            return livedStudentList;
+        }
+        // 手机号
+        List<SimpleUserDto> usersSimpleInfo = teacherDao.getUsersSimpleInfo(studentIds);
+
+        Set<Integer> subjectIds = new HashSet<>();
+        Set<Integer> coopIds = new HashSet<>();
+        Set<Integer> organIds = new HashSet<>();
+        studentMap.values().forEach(student -> {
+            subjectIds.add(Integer.parseInt(student.getSubjectIdList()));
+            coopIds.add(student.getCooperationOrganId());
+            organIds.add(student.getOrganId());
+        });
+        // 分部
+        Map<Integer, Organization> organizationMap = organizationService.getMapById(new ArrayList<>(organIds));
+
+        // 学校
+        Map<Integer, CooperationOrgan> cooperationOrganMap = cooperationOrganService.getMapByIds(new ArrayList<>(coopIds));
+
+        // 声部
+        Map<Integer, StudentSubjectDto> studentSubjectDtoMap = subjectService.getSubjectByStudentId(studentIds.stream().map(Integer::longValue).collect(Collectors.toSet()));
+
+        Map<Integer,SimpleUserDto> userMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(usersSimpleInfo)) {
+            userMap = usersSimpleInfo.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, Function.identity()));
+        }
+
+        for (LiveGroupWrapper.LiveGroupStudentList record : records) {
+            Student student = studentMap.get(record.getStudentId());
+            if (Objects.nonNull(student)) {
+                record.setStudentName(student.getUsername());
+                record.setOrganName(organizationMap.getOrDefault(student.getOrganId(), new Organization()).getName());
+                record.setSchoolName(cooperationOrganMap.getOrDefault(student.getCooperationOrganId(), new CooperationOrgan()).getName());
+                record.setSubjectName(studentSubjectDtoMap.getOrDefault(student.getUserId(), new StudentSubjectDto()).getSubjectName());
+                record.setPhone(userMap.getOrDefault(student.getUserId(),new SimpleUserDto()).getPhone());
+
+            }
+        }
+        return livedStudentList.setRecords(records);
+    }
+
+    @Override
+    public List<CourseSchedule> liveCourseList(LiveGroupWrapper.LiveGroupStudentQuery query) {
+
+        VipGroup vipGroup = this.get(query.getLiveGroupId());
+        if (Objects.isNull(vipGroup)) {
+            throw new BizException("课程组不存在");
+        }
+        if (!"LIVE".equals(vipGroup.getGroupType())) {
+            throw new BizException("此课程不是直播课程");
+        }
+        // 报名中的课程直接返回json数据
+        if (vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)) {
+            return JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class);
+        } else {
+            return courseScheduleDao.findGroupCourseSchedules(vipGroup.getId().toString(), GroupType.LIVE.getCode());
+        }
+    }
 }

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

@@ -332,6 +332,9 @@
             <if test="teachingPoint != null">
                 teaching_point_ = #{teachingPoint},
             </if>
+            <if test="liveRoomId != null">
+                live_room_id_ = #{liveRoomId},
+            </if>
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>

+ 20 - 0
mec-biz/src/main/resources/config/mybatis/LiveGroupPlusMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ym.mec.biz.dal.mapper.LiveGroupPlusMapper">
+
+<select id="liveStudentList" resultType="com.ym.mec.biz.dal.wrapper.LiveGroupWrapper$LiveGroupStudentList">
+    select
+    t.user_id_ as studentId,
+    t.create_time_ as createTime,
+    t.order_no_ as orderNo
+    from student_payment_order t
+    <where>
+        <if test="param.liveGroupId != null">
+            and t.music_group_id_ = #{param.liveGroupId}
+            and t.type_ = 'LIVE_GROUP_BUY'
+            and t.status_ = 'SUCCESS'
+        </if>
+    </where>
+
+    </select>
+</mapper>

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -1405,4 +1405,14 @@
             </if>
         </where>
     </select>
+
+    <select id="listByIds" resultMap="Student">
+        select student.*,su.organ_id_ ,su.username_ from student
+        left join sys_user su on su.id_ = student.user_id_
+        where student.user_id_ in
+        <foreach collection="studentIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+
+    </select>
 </mapper>

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

@@ -558,7 +558,8 @@
             su.real_name_ userName,
             su.gender_ gender,
             su.phone_ phone,
-            su.avatar_ avatar
+            su.avatar_ avatar,
+        su.organ_id_ as organIds
         FROM sys_user su
         <where>
                 su.id_ IN

+ 7 - 1
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -34,7 +34,6 @@ import com.ym.mec.biz.dal.dto.RongyunBasicUserDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
-import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
@@ -385,6 +384,13 @@ public class RoomServiceImpl implements RoomService {
         // 开启直播间
         imLiveBroadcastRoomService.createLiveRoom(liveRoom);
 
+        // 更新课程关联直播间
+        CourseSchedule schedule = new CourseSchedule();
+        schedule.setId(courseSchedule.getId());
+        schedule.setTenantId(courseSchedule.getTenantId());
+        schedule.setLiveRoomId(roomUid);
+        courseScheduleDao.update(schedule);
+
         // 返回直播间信息
         return liveRoom;
     }

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

@@ -1,5 +1,7 @@
 package com.ym.mec.web.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -14,10 +16,13 @@ import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
+import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
@@ -27,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
@@ -427,4 +433,30 @@ public class VipGroupManageController extends BaseController {
     public Object getStudentSurplusCourseFee(Long vipGroupId, Integer studentId){
         return succeed(vipGroupService.getStudentSurplusCourseFee(vipGroupId,studentId));
     }
+
+    @ApiOperation(value = "更新直播课元素")
+    @PostMapping(value = "/updateLiveGroup")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupManage/updateLiveGroup')")
+    public Object updateLiveGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        return succeed(vipGroupService.updateLiveGroup(vipGroupApplyDto));
+    }
+
+
+
+    @ApiOperation(value = "直播课学生列表")
+    @PostMapping(value = "/liveStudentList")
+    public HttpResponseResult<PageInfo<LiveGroupWrapper.LiveGroupStudentList>> liveStudentList(@Validated @RequestBody LiveGroupWrapper.LiveGroupStudentQuery query){
+
+        IPage<LiveGroupWrapper.LiveGroupStudentList> iPage = vipGroupService.liveStudentList(QueryInfo.getPage(query), query);
+        return succeed(PageUtil.pageInfo(iPage));
+    }
+
+
+
+    @ApiOperation(value = "课程列表")
+    @PostMapping(value = "/liveCourseList")
+    public HttpResponseResult<List<CourseSchedule>> liveCourseList(@Validated @RequestBody LiveGroupWrapper.LiveGroupStudentQuery query){
+
+        return succeed(vipGroupService.liveCourseList(query));
+    }
 }