Переглянути джерело

Merge remote-tracking branch 'origin/feature/0529-live' into feature/0529-live

# Conflicts:
#	.idea/httpRequests/http-requests-log.http
shangke 2 роки тому
батько
коміт
fc396681fc

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

@@ -869,4 +869,6 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     List<BaseMapDto> queryClassGroup(@Param("coopId") Integer coopId);
 
     List<ClassGroup> getClassGroupByMusicIds(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    void modifyStudentNum(@Param("classGroupId") Integer classGroupId, @Param("num") int num);
 }

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

@@ -395,4 +395,6 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
                                                                       @Param("queryDto") SchoolIndexStatWrapper.QueryDto queryDto);
 
     Integer getTruantStudentNum(Long courseScheduleId);
+
+    Integer getStudentNumByStatus(@Param("courseScheduleId") Long courseScheduleId, @Param("status") StudentAttendanceStatusEnum studentAttendanceStatusEnum);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseAttendanceDetailHeadInfoDto.java

@@ -50,6 +50,18 @@ public class CourseAttendanceDetailHeadInfoDto {
     @ApiModelProperty(value = "旷课人数")
     private Integer truantStudentNum;
 
+
+    @ApiModelProperty(value = "迟到人数")
+    private Integer lateStudentNum;
+
+    public Integer getLateStudentNum() {
+        return lateStudentNum;
+    }
+
+    public void setLateStudentNum(Integer lateStudentNum) {
+        this.lateStudentNum = lateStudentNum;
+    }
+
     public Integer getTruantStudentNum() {
         return truantStudentNum;
     }

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

@@ -3914,7 +3914,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
         CourseAttendanceDetailHeadInfoDto courseAttendanceDetailHeadInfoDto = courseScheduleDao.findByCourse(courseScheduleId);
         courseAttendanceDetailHeadInfoDto.setLatestAttendanceTime(studentAttendanceDao.findLatestAttendanceDate(courseScheduleId));
-        courseAttendanceDetailHeadInfoDto.setTruantStudentNum(studentAttendanceDao.getTruantStudentNum(courseScheduleId));
+        courseAttendanceDetailHeadInfoDto.setLeaveStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.LEAVE));
+        courseAttendanceDetailHeadInfoDto.setTruantStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.TRUANT));
+        courseAttendanceDetailHeadInfoDto.setLateStudentNum(studentAttendanceDao.getStudentNumByStatus(courseScheduleId, StudentAttendanceStatusEnum.LATE));
         return courseAttendanceDetailHeadInfoDto;
     }
 

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

@@ -2320,7 +2320,8 @@ public class ExportServiceImpl implements ExportService {
                 && e.getGroupType() != GroupType.SPORADIC
                 && e.getGroupType() != GroupType.MEMBER
                 && e.getGroupType() != GroupType.ACTIVITY
-                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+                && e.getGroupType() != GroupType.VIP
+                && e.getGroupType() != GroupType.LIVE).map(e -> e.getId()).collect(Collectors.toList());
         Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
         Map<Long, BigDecimal> childRepairMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(otherOrderIds)) {
@@ -2427,6 +2428,8 @@ public class ExportServiceImpl implements ExportService {
             //专业
             if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setVipCourseFee(row.getActualAmount());
+            } else if (row.getGroupType() == GroupType.LIVE) {
+                row.setLiveCourseFee(row.getActualAmount());
             } else if (row.getGroupType() == GroupType.ACTIVITY) {
                 row.setVipCourseFee(row.getActualAmount());
             } else if (row.getGroupType() == GroupType.MEMBER) {
@@ -2553,6 +2556,7 @@ public class ExportServiceImpl implements ExportService {
             exportDto.setMusicGroupCourseFee(orderExportDtos.stream().map(e -> e.getMusicGroupCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
             exportDto.setCourseSchoolBuyAmount(orderExportDtos.stream().map(e -> e.getCourseSchoolBuyAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
             exportDto.setVipCourseFee(orderExportDtos.stream().map(e -> e.getVipCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setLiveCourseFee(orderExportDtos.stream().map(e -> e.getLiveCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
             exportDto.setPracticeCourseFee(orderExportDtos.stream().map(e -> e.getPracticeCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
             exportDto.setTheoryCourseFee(orderExportDtos.stream().map(e -> e.getTheoryCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
             exportDto.setDegreeFee(orderExportDtos.stream().map(e -> e.getDegreeFee()).reduce(BigDecimal.ZERO, BigDecimal::add));

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

@@ -362,15 +362,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public PageInfo<ImLiveBroadcastRoomVo> queryPage(Map<String, Object> param) {
+        param.put("groupType", "NORMAL");
         String os = WrapperUtil.toStr(param, "os");
         if (StringUtils.isNotBlank(os) && os.toUpperCase(Locale.ROOT).equals("TEACHER")) {
             param.put("speakerId", getSysUser().getId());
             param.put("clientType", SysUserType.TEACHER.getCode());
-            param.put("groupType", "NORMAL");
         } else if (StringUtils.isNotBlank(os) && os.toUpperCase(Locale.ROOT).equals("EDUCATION")) {
             param.put("clientType", SysUserType.EDUCATION.getCode());
             param.put("speakerId", getSysUser().getId());
-            param.put("groupType", "NORMAL");
         }
         Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
         // pageInfo.setDesc("a.created_time_");

+ 98 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -36,6 +36,8 @@ import com.ym.mec.util.string.MessageFormatter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -50,9 +52,11 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -354,6 +358,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
             vipGroupApplyBaseInfoDto.setOriginalTotalPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
         }
+        vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
 
         vipGroupDao.update(vipGroupApplyBaseInfoDto);
 
@@ -2272,7 +2277,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         }
 
         if (Objects.isNull(teacherDefaultVipGroupSalary) || Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())) {
-            throw new BizException("请设置教师VIP课课酬");
+            throw new BizException("请设置教师默认课酬");
         }
 
         Map<String, BigDecimal> results = new HashMap<>(2);
@@ -2377,12 +2382,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         if (Objects.isNull(gofts)) {
             gofts = BigDecimal.ZERO;
         }
-        if (!vipGroupCategory.getMusicTheory()) {
+        if (!vipGroupCategory.getMusicTheory() && !"LIVE".equals(vipGroup.getGroupType())) {
             gofts = gofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
             ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-        } else if("LIVE".equals(vipGroup.getGroupType())){
-            gofts = gofts.multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-            ofts = ofts.multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
         }
         results.put("offlineTeacherSalary", ofts);
         results.put("giveOfflineTeacherSalary", gofts);
@@ -2647,7 +2649,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if (result.getCode() != 200) {
                 return result;
             }
-            classGroup.setStudentNum(classGroup.getStudentNum() - 1);
+            if(groupType == GroupType.VIP){
+                classGroupDao.modifyStudentNum(classGroup.getId(),-1);
+            }
         }
 
         Date date = new Date();
@@ -2678,9 +2682,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 throw new BizException("您无法购买此课程");
             }
         }
-        //增加学员数
-        classGroup.setStudentNum(classGroup.getStudentNum() + 1);
-        classGroupDao.update(classGroup);
+        if(groupType == GroupType.VIP){
+            //增加学员数
+            classGroupDao.modifyStudentNum(classGroup.getId(),1);
+        }
 
         List<CourseSchedule> courseSchedules = JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class);
         courseScheduleService.checkNewCourseSchedules(courseSchedules, false, false);
@@ -2795,6 +2800,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if("LIVE".equals(vipGroup.getGroupType())){
                 groupType = GroupType.LIVE;
                 messageTypeEnum = MessageTypeEnum.STUDENT_PUSH_LIVE_BUY;
+                classGroupDao.modifyStudentNum(classGroup.getId(),1);
             }
             if (vipGroup.getStatus() == VipGroupStatusEnum.DELETE ||
                     vipGroup.getStatus() == VipGroupStatusEnum.CANCEL ||
@@ -2963,7 +2969,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 }
             }
         } else {
-            classGroup.setStudentNum(classGroup.getStudentNum() - 1);
+            if("VIP".equals(classGroup.getGroupType().getCode())){
+                classGroupDao.modifyStudentNum(classGroup.getId(),-1);
+            }
             if (order.getBalancePaymentAmount() != null && order.getBalancePaymentAmount().doubleValue() > 0) {
                 sysUserCashAccountService.updateBalance(userId, order.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS,
                         "小课购买失败");
@@ -3158,6 +3166,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             groupType = GroupType.LIVE;
             returnFeeEnum = ReturnFeeEnum.LIVE;
         }
+        //记录日志
+        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("OA审批" + groupType.getDesc() + "退学");
+        sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
 
         if (classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)) {
             classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
@@ -3169,16 +3187,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             return;
         }
 
-        //记录日志
-        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("OA审批" + groupType.getDesc() + "退学");
-        sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
 
         classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
         classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
@@ -4979,6 +4987,76 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         // 更新通知状态
         courseScheduleDao.updateRemindStatus(ids);
+        CompletableFuture.runAsync(() -> {
+            for (CourseSchedule courseSchedule : courseSchedules) {
+                createVipGroupLiveRoom(courseSchedule.getId().toString(), courseSchedule);
+            }
+        });
+
+
+    }
+
+
+    /**
+     * 创建网络课直播间
+     * @param roomId 课程房间编号
+     * @param courseSchedule 课程信息
+     * @return ImLiveBroadcastRoom
+     */
+    private void createVipGroupLiveRoom(String roomId, CourseSchedule courseSchedule) {
+        //记录用户实际选择的房间
+        if (courseSchedule.getGroupType() == GroupType.COMM) {
+            roomId = "I" + roomId;
+        } else {
+            roomId = "S" + roomId;
+        }
+        // 主动创建直播间
+        VipGroup vipGroup = vipGroupDao.get(Long.parseLong(courseSchedule.getMusicGroupId()));
+        if (Objects.isNull(vipGroup)) {
+            throw new BizException("直播课程组不存在");
+        }
+
+        if (StringUtils.isBlank(vipGroup.getLiveConfigJson())) {
+            throw new BizException("直播课程组未配置直播间");
+        }
+
+        ImLiveBroadcastRoom liveRoom = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoom.class);
+
+        if (StringUtils.isBlank(liveRoom.getServiceProvider())) {
+            //查询房间过期时间
+            String liveClient = sysConfigDao.findConfigValue("live_client");
+            liveRoom.setServiceProvider(liveClient);
+        }
+
+        String liveStartTime = MessageFormat.format("{0} {1}", DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN),
+                DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT));
+
+        DateTime time = DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
+
+        String roomUid = "LIVE-" + roomId + "-" + time.toDate().getTime();
+        liveRoom.setTenantId(TenantContextHolder.getTenantId());
+        liveRoom.setRoomUid(roomUid);
+        //liveRoom.setRoomConfig(liveRoom.getRoomConfig());
+        liveRoom.setLiveState(1);
+        liveRoom.setRoomState(0);
+        liveRoom.setGroupType("LIVE");
+        liveRoom.setCreatedBy(liveRoom.getSpeakerId());
+        liveRoom.setCreatedTime(DateTime.now().toDate());
+        liveRoom.setLiveStartTime(DateTime.now().toDate());
+        liveRoom.setTenantId(courseSchedule.getTenantId());
+
+        // 创建直播间
+        imLiveBroadcastRoomService.save(liveRoom);
+
+        // 开启直播间
+        imLiveBroadcastRoomService.createLiveRoom(liveRoom);
+
+        // 更新课程关联直播间
+        CourseSchedule schedule = new CourseSchedule();
+        schedule.setId(courseSchedule.getId());
+        schedule.setTenantId(courseSchedule.getTenantId());
+        schedule.setLiveRoomId(roomUid);
+        courseScheduleDao.update(schedule);
 
     }
 

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

@@ -1681,6 +1681,9 @@
     <update id="updateTeachingPointById">
         update class_group set teaching_point_ = #{param.teachingPoint} where id_ = #{param.id}
     </update>
+    <update id="modifyStudentNum">
+        update class_group set student_num_  = student_num_ + #{num} where id_ = #{classGroupId}
+    </update>
 
     <select id="getClassGroupByMusicIds" resultMap="ClassGroup">
         SELECT cg.* FROM class_group cg

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

@@ -751,4 +751,14 @@
         left join student_attendance sa on sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
         where cssp.course_schedule_id_ = #{courseId} and (sa.status_ = 'TRUANT' or sa.id_ is null)
     </select>
+
+    <select id="getStudentNumByStatus" resultType="java.lang.Integer">
+
+        select COUNT(cssp.user_id_) from course_schedule_student_payment cssp
+        left join student_attendance sa on sa.course_schedule_id_ = cssp.course_schedule_id_ and sa.user_id_ = cssp.user_id_
+        where cssp.course_schedule_id_ = #{courseScheduleId}
+        and (sa.status_ = #{status.name}
+            <if test="status.name == 'TRUANT'"> or sa.id_ is null </if>
+        )
+    </select>
 </mapper>

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -307,4 +307,9 @@ public interface TaskRemoteService {
     // 直播课程提醒
     @GetMapping("task/liveCourseRemind")
     void liveCourseRemind() ;
+
+
+    // 直播课程提醒
+    @GetMapping("task/closeLiveCourseRoom")
+    void closeLiveCourseRoom() ;
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -359,4 +359,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
     public void liveCourseRemind() {
         logger.error("直播课提醒失败");
     }
+
+    @Override
+    public void closeLiveCourseRoom() {
+        logger.error("关闭直播间失败");
+    }
 }

+ 41 - 31
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -363,43 +363,53 @@ public class RoomServiceImpl implements RoomService {
             throw new BizException("直播课程组未配置直播间");
         }
 
-        ImLiveBroadcastRoom liveRoom = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoom.class);
-
-        if (StringUtils.isBlank(liveRoom.getServiceProvider())) {
-            //查询房间过期时间
-            String liveClient = sysConfigDao.findConfigValue("live_client");
-            liveRoom.setServiceProvider(liveClient);
-        }
-
         String liveStartTime = MessageFormat.format("{0} {1}", DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN),
                 DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT));
 
         DateTime time = DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
 
         String roomUid = "LIVE-" + roomId + "-" + time.toDate().getTime();
-        liveRoom.setTenantId(TenantContextHolder.getTenantId());
-        liveRoom.setRoomUid(roomUid);
-        //liveRoom.setRoomConfig(liveRoom.getRoomConfig());
-        liveRoom.setLiveState(1);
-        liveRoom.setRoomState(0);
-        liveRoom.setGroupType("LIVE");
-        liveRoom.setCreatedBy(liveRoom.getSpeakerId());
-        liveRoom.setCreatedTime(DateTime.now().toDate());
-        liveRoom.setLiveStartTime(DateTime.now().toDate());
-        liveRoom.setTenantId(courseSchedule.getTenantId());
-
-        // 创建直播间
-        imLiveBroadcastRoomService.save(liveRoom);
-
-        // 开启直播间
-        imLiveBroadcastRoomService.createLiveRoom(liveRoom);
-
-        // 更新课程关联直播间
-        CourseSchedule schedule = new CourseSchedule();
-        schedule.setId(courseSchedule.getId());
-        schedule.setTenantId(courseSchedule.getTenantId());
-        schedule.setLiveRoomId(roomUid);
-        courseScheduleDao.update(schedule);
+        ImLiveBroadcastRoom liveRoom = JSON.parseObject(vipGroup.getLiveConfigJson(), ImLiveBroadcastRoom.class);
+
+        try {
+
+
+            if (StringUtils.isBlank(liveRoom.getServiceProvider())) {
+                //查询房间过期时间
+                String liveClient = sysConfigDao.findConfigValue("live_client");
+                liveRoom.setServiceProvider(liveClient);
+            }
+
+            liveRoom.setTenantId(TenantContextHolder.getTenantId());
+            liveRoom.setRoomUid(roomUid);
+            //liveRoom.setRoomConfig(liveRoom.getRoomConfig());
+            liveRoom.setLiveState(1);
+            liveRoom.setRoomState(0);
+            liveRoom.setGroupType("LIVE");
+            liveRoom.setCreatedBy(liveRoom.getSpeakerId());
+            liveRoom.setCreatedTime(DateTime.now().toDate());
+            liveRoom.setLiveStartTime(DateTime.now().toDate());
+            liveRoom.setTenantId(courseSchedule.getTenantId());
+
+            // 创建直播间
+            imLiveBroadcastRoomService.save(liveRoom);
+
+            // 开启直播间
+            imLiveBroadcastRoomService.createLiveRoom(liveRoom);
+
+            // 更新课程关联直播间
+            CourseSchedule schedule = new CourseSchedule();
+            schedule.setId(courseSchedule.getId());
+            schedule.setTenantId(courseSchedule.getTenantId());
+            schedule.setLiveRoomId(roomUid);
+            courseScheduleDao.update(schedule);
+        }catch (Exception e) {
+            log.error("创建直播间失败", e);
+            liveRoom = imLiveBroadcastRoomService.lambdaQuery()
+                    .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
+                    .last("LIMIT 1")
+                    .one();
+        }
 
         // 返回直播间信息
         return liveRoom;

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/CloseLiveCourseRoomTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CloseLiveCourseRoomTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.closeLiveCourseRoom();
+	}
+}

+ 2 - 2
mec-web/src/main/resources/exportColumnMapper.ini

@@ -123,8 +123,8 @@ headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订
 fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee",  "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表汇总导出]
-headColumns = ["分部", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它"]
-fieldColumns = ["organName", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee"]
+headColumns = ["分部", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课",  "直播课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它"]
+fieldColumns = ["organName", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "liveCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee"]
 
 [学员小课记录导出]
 headColumns = ["分部", "学员编号", "学生姓名", "年级", "课程余额", "声部" ,"声部班老师编号" ,"声部班老师", "上次课时间", "VIP总课时数", "VIP已结束课时数", "VIP未开始课时数", "已结束VIP课程组老师编号", "已结束VIP课程组老师", "未开始VIP课程组老师编号", "未开始VIP课程组老师","网管课已结束课时数", "网管课未开始课时数", "已结束网管课课程组老师编号", "已结束网管课课程组老师", "未开始网管课课程组老师编号", "未开始网管课课程组老师", "指导老师编号", "指导老师"]