瀏覽代碼

Merge remote-tracking branch 'origin/master'

liweifan 3 年之前
父節點
當前提交
cd08e54d05
共有 29 個文件被更改,包括 491 次插入90 次删除
  1. 6 1
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 8 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  3. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  4. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  5. 1 1
      cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml
  6. 12 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java
  7. 4 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml
  8. 4 3
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  9. 22 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseStatusTask.java
  10. 24 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TeacherEarningTask.java
  11. 11 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/client/AdminFeignClient.java
  12. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  13. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberAuditDao.java
  14. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java
  15. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  16. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  17. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java
  18. 25 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  19. 87 75
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  20. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java
  21. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  22. 60 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AuditUserInfo.java
  23. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFollow.java
  24. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherEarningVo.java
  25. 16 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  26. 14 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberAuditMapper.xml
  27. 3 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  28. 13 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml
  29. 6 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

+ 6 - 1
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 
 /**
  * Description
@@ -20,8 +21,12 @@ public interface AdminFeignService {
 
 
     /**
-     * 公告发布轮询
+     * 老师作业布置通知
      */
     @GetMapping("/admin/teacherSend")
     HttpResponseResult<Object> sendTodayNotRepliedAndNotDecorateHomework();
+
+    //老师课酬
+    @PostMapping(value = "/teacherEarning")
+    HttpResponseResult<Object> sendTeacherEarning();
 }

+ 8 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java

@@ -32,4 +32,12 @@ public interface TeacherFeignService {
      */
     @GetMapping("/task/courseRemind")
     HttpResponseResult<Object> courseRemind();
+
+    /**
+     * @Description: 更行课程状态
+     * @Author: cy
+     * @Date: 2022/5/17
+     */
+    @GetMapping("/task/courseStatus")
+    HttpResponseResult<Object> courseStatus();
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -14,4 +14,9 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<Object> sendTodayNotRepliedAndNotDecorateHomework() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Object> sendTeacherEarning() {
+        return null;
+    }
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java

@@ -21,4 +21,9 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
     public HttpResponseResult<Object> courseRemind() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Object> courseStatus() {
+        return null;
+    }
 }

+ 1 - 1
cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml

@@ -228,7 +228,7 @@
 		left join sys_user su on su.id_ = t.user_id_
 	</insert>
 
-	<select id="selectNeedReleaseNotice" resultMap="HelpCenterContent">
+	<select id="selectNeedReleaseNotice" resultType="com.yonge.cooleshow.cms.dal.entity.HelpCenterContent">
 		select
 		<include refid="Base_Column_List_union" />
 		from help_center_content content

+ 12 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java

@@ -2,7 +2,9 @@ package com.yonge.cooleshow.mbg.mapper;
 
 import com.yonge.cooleshow.mbg.model.PmsSkuStock;
 import com.yonge.cooleshow.mbg.model.PmsSkuStockExample;
+
 import java.util.List;
+
 import org.apache.ibatis.annotations.Param;
 
 public interface PmsSkuStockMapper {
@@ -27,4 +29,14 @@ public interface PmsSkuStockMapper {
     int updateByPrimaryKeySelective(PmsSkuStock record);
 
     int updateByPrimaryKey(PmsSkuStock record);
+
+    /**
+     * 锁定库存
+     *
+     * @param productSkuId
+     * @param quantity
+     * @return
+     */
+    int lockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
+
 }

+ 4 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml

@@ -303,4 +303,8 @@
       sp_data = #{spData,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+  <update id="lockStock">
+    update pms_sku_stock set lock_stock = lock_stock + #{quantity} where  id = #{productSkuId} and stock &gt;= ( lock_stock + #{quantity})
+    </update>
 </mapper>

+ 4 - 3
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -963,9 +963,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      */
     private void lockStock(List<CartPromotionItem> cartPromotionItemList) {
         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-            PmsSkuStock skuStock = skuStockMapper.selectByPrimaryKey(cartPromotionItem.getProductSkuId());
-            skuStock.setLockStock(skuStock.getLockStock() + cartPromotionItem.getQuantity());
-            skuStockMapper.updateByPrimaryKeySelective(skuStock);
+            int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(),cartPromotionItem.getQuantity());
+            if (i == 0) {
+                Asserts.fail("库存不足,无法下单");
+            }
         }
     }
 

+ 22 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseStatusTask.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/25 10:30
+ */
+@Service
+public class CourseStatusTask extends BaseTask {
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.courseStatus();
+    }
+}

+ 24 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/TeacherEarningTask.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-17
+ */
+public class TeacherEarningTask extends BaseTask {
+
+
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        adminFeignService.sendTeacherEarning();
+    }
+}

+ 11 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/client/AdminFeignClient.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.admin.client;
 
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -22,10 +23,20 @@ public class AdminFeignClient {
     @Autowired
     private CourseScheduleService courseScheduleService;
 
+    @Autowired
+    private UserAccountRecordService userAccountRecordService;
 
+    // 老师作业布置
     @PostMapping(value = "/teacherSend")
     public HttpResponseResult<Object> sendTodayNotRepliedAndNotDecorateHomework() {
         courseScheduleService.sendTodayNotRepliedAndNotDecorateHomework();
         return HttpResponseResult.succeed();
     }
+
+    //老师课酬
+    @PostMapping(value = "/teacherEarning")
+    public HttpResponseResult<Object> sendTeacherEarning() {
+        userAccountRecordService.sendTeacherEarning();
+        return HttpResponseResult.succeed();
+    }
 }

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

@@ -210,4 +210,8 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     BigDecimal selectPrice(@Param("teacherId") Long teacherId, @Param("subjectId") Long subjectId);
 
     List<CourseSchedule> selectSchedule(Integer courseId);
+
+    void updateStartTime();
+
+    void updateEndTime();
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberAuditDao.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
 import com.yonge.cooleshow.biz.dal.queryInfo.ImGroupMemberAuditQueryInfo;
+import com.yonge.cooleshow.biz.dal.vo.AuditUserInfo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -29,5 +30,7 @@ public interface ImGroupMemberAuditDao extends BaseMapper<ImGroupMemberAudit> {
     List<ImGroupMemberAudit> findByIds(@Param("auditIds") String auditIds);
 
     void delByGroupId(@Param("groupId") String groupId);
+
+    List<AuditUserInfo> selectAuditUserInfo(@Param("auditIds") String auditIds);
 }
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserAccountRecordDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
@@ -37,4 +38,11 @@ public interface UserAccountRecordDao extends BaseMapper<UserAccountRecord> {
 	 * @return
 	 */
     BigDecimal selectMonthDecimal(@Param("userId") Long userId);
+
+	/**
+	 * 老师当天收入
+	 *
+	 * @return
+	 */
+    List<TeacherEarningVo> selectTodayTeacherEarning();
 }

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

@@ -80,6 +80,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     //------短信模板------
     SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
     SMS_LIVE_COMPLETION_SUCCESS("SMS_LIVE_COMPLETION_SUCCESS","直播课成课"),
+    SMS_LIVE_COMPLETION_FAIL("LIVE_COMPLETION_FAIL","直播课成课失败"),
     SMS_TOMORROW_COURSE_REMINDER("SMS_TOMORROW_COURSE_REMINDER", "明日课程提醒(每晚9点)(短信)");
 
     MessageTypeEnum(String code, String msg) {

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -233,5 +233,6 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     Map<String, String> selectRoomConfig();
     void test();
+    void scheduleTask();
 }
 

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserAccountRecordService.java

@@ -36,4 +36,9 @@ public interface UserAccountRecordService extends IService<UserAccountRecord>  {
 	 * @return 老师本月收入
 	 */
     BigDecimal getMonthDecimal(Long userId);
+
+	/**
+	 * 老师课酬收入通知
+	 */
+    void sendTeacherEarning();
 }

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

@@ -698,7 +698,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
         //更新课程组的购买人数+1
         this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
-        //课程信息
+
+        // 课程组 人数 + 1
+        courseGroup.setPreStudentNum(courseGroup.getPreStudentNum() + 1);
+
         List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
         //计算课程组单节课价格 取CourseScheduleStudentPayment expectPrice
@@ -911,6 +914,27 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                             .eq(CourseSchedule::getCourseGroupId, courseGroup.getId())
                             .set(CourseSchedule::getStatus, CourseScheduleEnum.CANCEL.getCode())
                     );
+                    // 直播课成课失败通知
+                    SysUser user = sysUserFeignService.queryUserById(courseGroup.getTeacherId());
+                    Map<Long, String> receivers = new HashMap<>();
+                    receivers.put(user.getId(), user.getPhone());
+                    // 发短信
+                    try {
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_LIVE_COMPLETION_FAIL,
+                                                           receivers, null, 0, null, null,
+                                                           courseGroup.getName());
+                    } catch (Exception e) {
+                        log.warn("直播课成课失败短信发送失败,{}",e.getMessage());
+                    }
+
+                    // 发推送
+                    try {
+                        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.LIVE_COMPLETION_FAIL,
+                                                           receivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                                                           courseGroup.getName());
+                    } catch (Exception e) {
+                        log.warn("直播课成课失败推送发送失败,{}",e.getMessage());
+                    }
                 }
                 this.updateById(courseGroup);
             } catch (Exception ignored) {

+ 87 - 75
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -21,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -34,7 +35,6 @@ import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.obj.ObjectUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RLock;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -870,12 +870,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     }
 
     /**
-     * @Description: 学生购买陪练课
+     * @Description: 陪练课购买记录
      * @Author: cy
-     * @Date: 2022/4/21
+     * @Date: 2022/5/16
      */
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<OrderCreateRes> buyPracticeCourse(OrderReq.OrderReqInfo orderReqInfo) {
+    public HttpResponseResult<OrderCreateRes> buyPracticeCourseTran(OrderReq.OrderReqInfo orderReqInfo) {
         log.info("buyPracticeCourse  param:{}", JSON.toJSONString(orderReqInfo));
         Long studentId = orderReqInfo.getUserId();
 
@@ -897,83 +897,84 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (multiply.compareTo(scheduleDto.getCoursePrice()) != 0) {
             throw new BizException("价格异常。预计价格:{},实际价格:{}", multiply, scheduleDto.getCoursePrice());
         }
-
         //批量检查老师课时在数据库是否重复
         batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
         //批量检查学生课时在数据库是否重复
         batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
 
-        RLock lock = redissonClient.getLock("buyPractice:teacherId:" + scheduleDto.getTeacherId());
-        try {
-            if (lock.tryLock(20, 10, TimeUnit.SECONDS)) {
-                String orderNo = orderReqInfo.getOrderNo();
-                scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
-                scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
-                scheduleDto.setMixStudentNum(1);
-                scheduleDto.setStudentId(studentId);
-
-                //写入course_group
-                baseMapper.addCourseGroup(scheduleDto);
-                Long groupId = scheduleDto.getGroupId();
-
-                //根据老师id获取默认配置声部原价
-                TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
-                BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
-
-                //每课实际价格
-                Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
-
-                List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
-                for (int i = 0; i < classTime.size(); i++) {
-                    CourseScheduleDate date = classTime.get(i);
-                    CourseSchedule schedule = new CourseSchedule();
-                    schedule.setClassDate(date.getClassDate());
-                    schedule.setStartTime(date.getStartTime());
-                    schedule.setEndTime(date.getEndTime());
-                    schedule.setCourseGroupId(groupId);
-                    schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
-                    schedule.classNum(i + 1);
-                    schedule.setTeacherId(scheduleDto.getTeacherId());
-                    schedule.setLock(1);
-                    schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
-                    schedule.setCreatedBy(scheduleDto.getStudentId());
-                    //写入course_schedule
-                    baseMapper.insert(schedule);
-
-                    Long scheduleId = schedule.getId();
-                    CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
-                    payment.setUserId(scheduleDto.getStudentId());
-                    payment.setCourseId(scheduleId);
-                    payment.setCourseGroupId(groupId);
-                    payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
-                    payment.setOrderNo(orderNo);
-                    payment.setOriginalPrice(subjectPrice);//原价
-                    payment.setExpectPrice(subjectPrice);//预计价格
-                    payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
-                    //写入course_schedule_student_payment
-                    courseScheduleStudentPaymentService.save(payment);
-                }
-
-                OrderCreateRes orderCreateRes = new OrderCreateRes();
-                orderCreateRes.setRes(true);
-                orderCreateRes.setMerchId(scheduleDto.getTeacherId());
-                orderCreateRes.setBizId(groupId);
-                orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
-                orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
-                orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
-                orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
-                HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
-                httpResponseResult.setData(orderCreateRes);
-                log.info("buyPracticeCourse  return {}", httpResponseResult);
-                return httpResponseResult;
-            }
-        } catch (InterruptedException e) {
-            log.error("runIfLockCanGet error lockName : {}", "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
-            throw new RuntimeException("runIfLockCanGet error lockName :" + "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
-        } finally {
-            lock.unlock();
+        String orderNo = orderReqInfo.getOrderNo();
+        scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
+        scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
+        scheduleDto.setMixStudentNum(1);
+        scheduleDto.setStudentId(studentId);
+
+        //写入course_group
+        baseMapper.addCourseGroup(scheduleDto);
+        Long groupId = scheduleDto.getGroupId();
+
+        //根据老师id获取默认配置声部原价
+        TeacherSubjectPrice teacherSubjectPrice = teacherFreeTimeDao.selectSubjectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());
+        BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
+
+        //每课实际价格
+        Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
+
+        List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
+        for (int i = 0; i < classTime.size(); i++) {
+            CourseScheduleDate date = classTime.get(i);
+            CourseSchedule schedule = new CourseSchedule();
+            schedule.setClassDate(date.getClassDate());
+            schedule.setStartTime(date.getStartTime());
+            schedule.setEndTime(date.getEndTime());
+            schedule.setCourseGroupId(groupId);
+            schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
+            schedule.classNum(i + 1);
+            schedule.setTeacherId(scheduleDto.getTeacherId());
+            schedule.setLock(1);
+            schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
+            schedule.setCreatedBy(scheduleDto.getStudentId());
+            //写入course_schedule
+            baseMapper.insert(schedule);
+
+            Long scheduleId = schedule.getId();
+            CourseScheduleStudentPayment payment = new CourseScheduleStudentPayment();
+            payment.setUserId(scheduleDto.getStudentId());
+            payment.setCourseId(scheduleId);
+            payment.setCourseGroupId(groupId);
+            payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
+            payment.setOrderNo(orderNo);
+            payment.setOriginalPrice(subjectPrice);//原价
+            payment.setExpectPrice(subjectPrice);//预计价格
+            payment.setActualPrice(courseAveragePrice.get(i + 1));//实际价格
+            //写入course_schedule_student_payment
+            courseScheduleStudentPaymentService.save(payment);
         }
-        return null;
+
+        OrderCreateRes orderCreateRes = new OrderCreateRes();
+        orderCreateRes.setRes(true);
+        orderCreateRes.setMerchId(scheduleDto.getTeacherId());
+        orderCreateRes.setBizId(groupId);
+        orderCreateRes.setOriginalPrice(scheduleDto.getCoursePrice());
+        orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
+        orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
+        orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
+        HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
+        httpResponseResult.setData(orderCreateRes);
+        log.info("buyPracticeCourse  return {}", httpResponseResult);
+        return httpResponseResult;
+    }
+
+    /**
+     * @Description: 学生购买陪练课
+     * @Author: cy
+     * @Date: 2022/4/21
+     */
+    public HttpResponseResult<OrderCreateRes> buyPracticeCourse(OrderReq.OrderReqInfo orderReqInfo) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        PracticeScheduleDto scheduleDto = objectMapper.convertValue(orderReqInfo.getBizContent(), PracticeScheduleDto.class);
+        return DistributedLock.of(redissonClient)
+                .runIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey("teacherId:" + scheduleDto.getTeacherId())
+                        , () -> this.buyPracticeCourseTran(orderReqInfo), 60L, TimeUnit.SECONDS);
     }
 
     /**
@@ -1395,4 +1396,15 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         return rList;
     }
+
+    /**
+     * @Description: 定时修改课程状态
+     * @Author: cy
+     * @Date: 2022/5/17
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void scheduleTask(){
+        baseMapper.updateStartTime();
+        baseMapper.updateEndTime();
+    }
 }

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

@@ -8,16 +8,21 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.ImGroupMemberAuditQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.vo.AuditUserInfo;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import io.rong.models.group.GroupMember;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
@@ -41,6 +46,9 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
     @Resource
     private ImGroupMemberService imGroupMemberService;
 
+    @Resource
+    private SysMessageServiceImpl sysMessageService;
+
     @Override
     public ImGroupMemberAuditDao getDao() {
         return this.baseMapper;
@@ -84,6 +92,22 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
             imGroupService.syncGroupMemberNum(imGroup.getId());
             //加入融云群
             imGroupMemberService.join(groupMembers,groupId);
+        } else {
+            Map<Long,String> receivers = new HashMap<>();
+
+            // 群创建人
+            SysUser user = sysUserFeignService.queryUserById(imGroup.getCreateBy());
+            // 申请人
+            SysUser auditUser = sysUserFeignService.queryUserById(imGroupMemberAudit.getUserId());
+
+            receivers.put(user.getId(), user.getPhone());
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_JOIN_FANSGROUP,
+                           receivers, null, 0, null, ClientEnum.TEACHER.getCode(), auditUser.getUsername(),imGroup.getName());
+            } catch (Exception e) {
+                log.warn("学生入群消息发送失败,{}",e.getMessage());
+            }
+
         }
     }
 
@@ -111,6 +135,33 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
             imGroupService.syncGroupMemberNum(imGroup.getId());
             //加入融云群
             imGroupMemberService.join(groupMembers,imGroup.getId());
+
+            sendMessage(auditIds);
+        }
+    }
+
+    /**
+     * 发送通过消息
+     *
+     * @param auditIds
+     */
+    private void sendMessage(String auditIds) {
+        List<AuditUserInfo> auditUserInfoList = baseMapper.selectAuditUserInfo(auditIds);
+
+        if (CollectionUtils.isEmpty(auditUserInfoList)) {
+            return;
+        }
+        for (AuditUserInfo auditUserInfo : auditUserInfoList) {
+            Map<Long,String> receivers = new HashMap<>();
+
+            receivers.put(auditUserInfo.getAuditUserId(), auditUserInfo.getAuditUserPhone());
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.FANSGROUP_APPLY_SUCCESS,
+                        receivers, null, 0, null, ClientEnum.STUDENT.getCode(), auditUserInfo.getGroupUsername(),
+                        auditUserInfo.getGroupName());
+            } catch (Exception e) {
+                log.warn("学生入群申请通过消息发送失败,{}",e.getMessage());
+            }
         }
     }
 

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

@@ -2,19 +2,38 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserAccountRecordSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserAccountRecordDao;
 import com.yonge.cooleshow.biz.dal.service.UserAccountRecordService;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 
 @Service
 public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordDao, UserAccountRecord> implements UserAccountRecordService {
 
+    private static final Logger log = LoggerFactory.getLogger(UserAccountRecordService.class);
+
+    @Autowired
+    private SysMessageService sysMessageService;
+
 	@Override
     public UserAccountRecordVo detail(Long id) {
         UserAccountRecordVo detail = baseMapper.detail(id);
@@ -33,4 +52,25 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
 
     }
 
+    @Override
+    public void sendTeacherEarning() {
+        List<TeacherEarningVo> teacherEarningVoList = baseMapper.selectTodayTeacherEarning();
+        if (CollectionUtils.isEmpty(teacherEarningVoList)) {
+            return;
+        }
+        for (TeacherEarningVo teacherEarningVo : teacherEarningVoList) {
+            Map<Long, String> receivers = new HashMap<>();
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.COURSE_SETTLEMENT.getCode());
+            receivers.put(teacherEarningVo.getTeacherId(), teacherEarningVo.getTeacherPhone());
+            String dateString = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            try {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COURSE_SETTLEMENT,
+                                                   receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
+                log.info(" COURSE_SETTLEMENT ok");
+            } catch (Exception e) {
+                log.warn("老师课酬结算消息推送失败,{}",e.getMessage());
+            }
+        }
+    }
+
 }

+ 60 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AuditUserInfo.java

@@ -0,0 +1,60 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-16
+ */
+public class AuditUserInfo {
+
+    private Long auditUserId;
+
+    private String auditUserPhone;
+
+    private String groupName;
+
+    private Long groupUserId;
+
+    private String groupUsername;
+
+    public Long getAuditUserId() {
+        return auditUserId;
+    }
+
+    public void setAuditUserId(Long auditUserId) {
+        this.auditUserId = auditUserId;
+    }
+
+    public String getAuditUserPhone() {
+        return auditUserPhone;
+    }
+
+    public void setAuditUserPhone(String auditUserPhone) {
+        this.auditUserPhone = auditUserPhone;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public Long getGroupUserId() {
+        return groupUserId;
+    }
+
+    public void setGroupUserId(Long groupUserId) {
+        this.groupUserId = groupUserId;
+    }
+
+    public String getGroupUsername() {
+        return groupUsername;
+    }
+
+    public void setGroupUsername(String groupUsername) {
+        this.groupUsername = groupUsername;
+    }
+}

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFollow.java

@@ -28,6 +28,8 @@ public class MyFollow extends BaseEntity {
     private Integer expTime;
     @ApiModelProperty("是否在直播")
     private Integer liveFlag;
+    @ApiModelProperty("房间编号")
+    private String roomUid;
 
     @ApiModelProperty("音乐人(0:否 1:是)")
     private Integer musicianFlag;
@@ -36,6 +38,14 @@ public class MyFollow extends BaseEntity {
     @ApiModelProperty("专业技能")
     private String subjectName;
 
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
     public Integer getEntryFlag() {
         return entryFlag;
     }

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherEarningVo.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import java.math.BigDecimal;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-17
+ */
+public class TeacherEarningVo {
+
+    private Long teacherId;
+
+    private String teacherPhone;
+
+    private BigDecimal earning;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherPhone() {
+        return teacherPhone;
+    }
+
+    public void setTeacherPhone(String teacherPhone) {
+        this.teacherPhone = teacherPhone;
+    }
+
+    public BigDecimal getEarning() {
+        return earning;
+    }
+
+    public void setEarning(BigDecimal earning) {
+        this.earning = earning;
+    }
+}

+ 16 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -190,7 +190,7 @@
         LEFT JOIN course_group g ON p.course_group_id_ = g.id_
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
         WHERE p.course_id_ IN
-        (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
+        (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND lock_=0 AND s.teacher_id_=#{param.teacherId})
         <if test="param.status !=null and param.status !=''">
             AND cs.status_ = #{param.status}
         </if>
@@ -278,7 +278,8 @@
         LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
         LEFT JOIN course_group g ON s.course_group_id_ = g.id_
         LEFT JOIN `subject` b ON g.subject_id_ = b.id_
-        WHERE s.id_ IN
+        WHERE s.status_='ING'
+        AND s.id_ IN
         (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'PRACTICE')
         <if test="param.status !=null and param.status !=''">
             AND s.status_ = #{param.status}
@@ -359,7 +360,8 @@
     <select id="queryCourseScheduleStudent" resultType="java.lang.String"
             parameterType="com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch">
         SELECT class_date_ FROM course_schedule
-        WHERE id_ IN (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{studentId})
+        WHERE status_='ING'
+        AND id_ IN (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{studentId})
         <![CDATA[ AND class_date_  >= #{startDate} ]]>
         <![CDATA[ AND class_date_  <= #{endDate} ]]>
     </select>
@@ -430,7 +432,8 @@
         LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
         LEFT JOIN course_group g ON s.course_group_id_ = g.id_
         LEFT JOIN `subject` b ON g.subject_id_ = b.id_
-        WHERE s.id_ IN
+        WHERE s.status_ = 'ING'
+        AND s.id_ IN
         (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'PRACTICE')
         AND s.class_date_ = #{param.classDate}
         UNION
@@ -451,7 +454,8 @@
         FROM course_schedule s
         LEFT JOIN course_group g ON s.course_group_id_ = g.id_
         LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
-        WHERE s.id_ IN
+        WHERE s.status_ = 'ING'
+        AND s.id_ IN
         (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{param.studentId} AND course_type_ = 'LIVE')
         AND s.class_date_ = #{param.classDate}
         ORDER BY startTime
@@ -574,7 +578,7 @@
         LEFT JOIN sys_user u ON s.teacher_id_=u.id_
         LEFT JOIN course_group g ON p.course_group_id_=g.id_
         WHERE p.user_id_=#{studentId}
-        AND s.status_ IN ('NOT_START','ING')
+        AND s.status_ = 'ING'
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>
@@ -754,4 +758,10 @@
             WHERE user_id_=(SELECT user_id_ FROM course_schedule_student_payment WHERE course_id_=#{courseId} AND course_type_='PRACTICE')
         )
     </select>
+    <update id="updateStartTime">
+        UPDATE course_schedule SET status_='ING' WHERE <![CDATA[ start_time_ <= NOW() ]]> <![CDATA[ AND NOW() <= end_time_ ]]>
+    </update>
+    <update id="updateEndTime">
+        UPDATE course_schedule SET status_='COMPLETE' WHERE <![CDATA[ end_time_ <= NOW() ]]>
+    </update>
 </mapper>

+ 14 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberAuditMapper.xml

@@ -74,4 +74,18 @@
         SELECT <include refid="Base_Column_List"/> FROM im_group_member_audit WHERE FIND_IN_SET(id_,#{auditIds})
     </select>
 
+    <select id="selectAuditUserInfo" resultType="com.yonge.cooleshow.biz.dal.vo.AuditUserInfo">
+        select distinct
+            su.id_ as auditUserId,
+            su.phone_ as auditUserPhone,
+            ig.name_ as groupName,
+            su2.id_ as groupUserId,
+            su2.username_ as groupUsername
+        from im_group_member_audit igma
+        left join im_group ig on ig.id_ = igma.group_id_
+        left join sys_user su on igma.user_id_ = su.id_
+        left join sys_user su2 on ig.create_by_ = su.id_
+
+        where  igma.id_ in ( #{auditIds})
+    </select>
 </mapper>

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

@@ -122,19 +122,19 @@
             u.username_ AS userName,
             u.real_name_ AS realName,
             u.gender_ AS gender,
-
             t.star_grade_ AS starGrade,
             t.fans_num_ AS fansNum,
             t.live_flag_ AS liveFlag,
             t.exp_time_ AS expTime,
-
             tr.musician_flag_ AS musicianFlag,
             tr.entry_flag_ AS entryFlag,
-            (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,tr.subject_id_)) AS subjectName
+            (SELECT group_concat( name_ ) FROM `subject` WHERE find_in_set( id_, tr.subject_id_ )) AS subjectName,
+            r.room_uid_ AS roomUid
         FROM student_star s
         LEFT JOIN sys_user u ON s.teacher_id_ = u.id_
         LEFT JOIN teacher_total t ON s.teacher_id_ = t.user_id_
         LEFT JOIN teacher tr ON s.teacher_id_ = tr.user_id_
+        LEFT JOIN (SELECT room_uid_,speaker_id_ FROM live_room WHERE live_state_=1) r ON t.user_id_= r.speaker_id_
         WHERE s.student_id_ = #{studentId}
     </select>
 </mapper>

+ 13 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserAccountRecordMapper.xml

@@ -69,4 +69,17 @@
         where in_or_out_ = 'IN' and account_id_ = #{userId}
         and date_format(create_time_,'%Y-%m') = date_format(now(),'%Y-%m')
     </select>
+
+    <select id="selectTodayTeacherEarning" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherEarningVo">
+
+        select
+            su.id_ as teacherId,
+            su.phone_ as teacherPhone,
+            sum(ucar.trans_amount_)
+        from user_cash_account_record ucar
+        left join sys_user su on ucar.account_id_ = su.id_
+            where ucar.create_time_ > date_format(now(),'%Y-%m-%d')
+
+        group by su.id_, su.phone_
+    </select>
 </mapper>

+ 6 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -58,4 +58,10 @@ public class TaskController extends BaseController {
         scheduleService.courseRemind();
         return HttpResponseResult.succeed();
     }
+
+    @GetMapping("/courseStatus")
+    public HttpResponseResult<Object> courseStatus() {
+        scheduleService.scheduleTask();
+        return HttpResponseResult.succeed();
+    }
 }