Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseVideoLinkParam.java
吴树波 2 months ago
parent
commit
8d1e72b046

+ 6 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -226,5 +226,11 @@ public class FsUserCoursePeriodController extends BaseController {
         return fsUserCoursePeriodDaysService.periodCourseMove(id, targetId);
     }
 
+    @ApiOperation("结束营期")
+    @PostMapping("/closePeriod")
+    public R closePeriod(Long id) {
+        fsUserCoursePeriodService.closePeriod(id);
+        return R.ok();
+    }
 
 }

+ 29 - 0
fs-admin/src/main/java/com/fs/task/period/PeriodTask.java

@@ -0,0 +1,29 @@
+package com.fs.task.period;
+
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCoursePeriodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("periodTask")
+public class PeriodTask {
+
+    @Autowired
+    private IFsUserCoursePeriodService userCoursePeriodService;
+    @Autowired
+    private IFsUserCoursePeriodDaysService userCoursePeriodDaysService;
+
+    /**
+     * 更新营期状态
+     */
+    public void refreshPeriod() {
+        userCoursePeriodService.changePeriodStatus();
+    }
+
+    /**
+     * 更新营期课程状态
+     */
+    public void refreshPeriodDays() {
+        userCoursePeriodDaysService.changePeriodCourseStatus();
+    }
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java

@@ -5,6 +5,8 @@ import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.his.vo.OptionsVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -83,4 +85,17 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
      */
     void batchUpdateCoursePeriodDays(List<FsUserCoursePeriodDays> fsUserCoursePeriodDaysList);
 
+    /**
+     * 开启课程
+     * @param date  日期
+     * @param time  时间
+     */
+    void startPeriodCourse(@Param("date") LocalDate date, @Param("time") LocalTime time);
+
+    /**
+     * 关闭课程
+     * @param date  日期
+     * @param time  时间
+     */
+    void endPeriodCourse(@Param("date") LocalDate date, @Param("time") LocalTime time);
 }

+ 16 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodMapper.java

@@ -6,7 +6,9 @@ import com.fs.course.vo.FsUserCoursePeriodVO;
 import com.fs.course.vo.PeriodRedPacketVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -111,4 +113,18 @@ public interface FsUserCoursePeriodMapper
      * @return  count
      */
     int countPeriodByCampIds(@Param("params") Map<String, Object> params);
+
+    /**
+     * 开营
+     * @param now   当前日期
+     */
+    @Update("update fs_user_course_period set period_status = 2, update_time = now() where period_status = 1 and period_starting_time >= #{now}")
+    void startPeriod(@Param("now") LocalDate now);
+
+    /**
+     * 关营
+     * @param now   当前日期
+     */
+    @Update("update fs_user_course_period set period_status = 3, update_time = now() where period_status = 2 and period_end_time < #{now}")
+    void endPeriod(@Param("now") LocalDate now);
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseVideoLinkParam.java

@@ -27,4 +27,8 @@ public class FsUserCourseVideoLinkParam implements Serializable {
 
     @ApiModelProperty(value = "营期课程ID")
     private Long id;
+
+    @ApiModelProperty(value = "营期id")
+    private Long periodId;
+
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java

@@ -113,4 +113,8 @@ public interface IFsUserCoursePeriodDaysService extends IService<FsUserCoursePer
     R updateCourseTime(UpdateCourseTimeVo vo);
 
     R updateCourseDate(UpdateCourseTimeVo vo);
+    /**
+     * 更新营期课程状态
+     */
+    void changePeriodCourseStatus();
 }

+ 13 - 1
fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java

@@ -1,9 +1,10 @@
 package com.fs.course.service;
 
-import java.util.List;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.vo.FsUserCoursePeriodVO;
 
+import java.util.List;
+
 /**
  * 会员营期Service接口
  *
@@ -66,4 +67,15 @@ public interface IFsUserCoursePeriodService
      * @return vo
      */
     List<FsUserCoursePeriodVO> selectFsUserCoursePeriodPage(FsUserCoursePeriod fsUserCoursePeriod);
+
+    /**
+     * 结束营期
+     * @param id    营期ID
+     */
+    void closePeriod(Long id);
+
+    /**
+     * 更新营期状态
+     */
+    void changePeriodStatus();
 }

+ 18 - 10
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -1,15 +1,5 @@
 package com.fs.course.service.impl;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.sql.Wrapper;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
@@ -34,9 +24,14 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -301,6 +296,19 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         return R.ok();
     }
 
+    /**
+     * 更新营期课程状态
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    @Override
+    public void changePeriodCourseStatus() {
+        // 开启
+        fsUserCoursePeriodDaysMapper.startPeriodCourse(LocalDate.now(), LocalTime.now());
+
+        // 关闭
+        fsUserCoursePeriodDaysMapper.endPeriodCourse(LocalDate.now(), LocalTime.now());
+    }
+
     private static FsCourseAnalysisCountVO getCourseAnalysisCountVO(FsUserCoursePeriodDays v, Map<Long, FsCourseAnalysisCountVO> courseMap, Map<Long, FsCourseAnalysisCountVO> redPacketMap, Map<Long, FsCourseAnalysisCountVO> answerMap) {
         FsCourseAnalysisCountVO countVO = new FsCourseAnalysisCountVO();
         FsCourseAnalysisCountVO courseVO = courseMap.getOrDefault(v.getVideoId(), countVO);

+ 63 - 7
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java

@@ -1,15 +1,23 @@
 package com.fs.course.service.impl;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.List;
-import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.exception.ServiceException;
+import com.fs.course.domain.FsUserCoursePeriod;
+import com.fs.course.domain.FsUserCoursePeriodDays;
+import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
+import com.fs.course.mapper.FsUserCoursePeriodMapper;
+import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.vo.FsUserCoursePeriodVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.course.mapper.FsUserCoursePeriodMapper;
-import com.fs.course.domain.FsUserCoursePeriod;
-import com.fs.course.service.IFsUserCoursePeriodService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * 会员营期Service业务层处理
@@ -22,6 +30,8 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
 {
     @Autowired
     private FsUserCoursePeriodMapper fsUserCoursePeriodMapper;
+    @Resource
+    private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
 
     /**
      * 查询会员营期
@@ -109,4 +119,50 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     public List<FsUserCoursePeriodVO> selectFsUserCoursePeriodPage(FsUserCoursePeriod fsUserCoursePeriod) {
         return fsUserCoursePeriodMapper.selectFsUserCoursePeriodPage(fsUserCoursePeriod);
     }
+
+    /**
+     * 结束营期
+     * @param id    营期ID
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void closePeriod(Long id) {
+        // 修改营期结束时间
+        FsUserCoursePeriod fsUserCoursePeriod = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(id);
+        if (Objects.isNull(fsUserCoursePeriod)) {
+            throw new ServiceException("结束营期失败:营期不存在");
+        }
+
+        if (fsUserCoursePeriod.getPeriodStatus() == 1) {
+            throw new ServiceException("结束营期失败:营期未开始不能进行结束操作!");
+        }
+
+        if (fsUserCoursePeriod.getPeriodStatus() == 3) {
+            throw new ServiceException("结束营期失败:营期已结束不能进行结束操作!");
+        }
+
+        fsUserCoursePeriod.setPeriodEndTime(LocalDate.now());
+        fsUserCoursePeriodMapper.updateFsUserCoursePeriod(fsUserCoursePeriod);
+
+        // 修改大于当前时间的课程状态
+        Wrapper<FsUserCoursePeriodDays> updateWrapper = Wrappers.<FsUserCoursePeriodDays>lambdaUpdate()
+        .set(FsUserCoursePeriodDays::getStatus, 2)
+        .eq(FsUserCoursePeriodDays::getPeriodId, fsUserCoursePeriod.getPeriodId())
+        .eq(FsUserCoursePeriodDays::getStatus, 0)
+        .gt(FsUserCoursePeriodDays::getDayDate, LocalDate.now());
+        fsUserCoursePeriodDaysMapper.update(null, updateWrapper);
+    }
+
+    /**
+     * 更新营期状态
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changePeriodStatus() {
+        // 开营
+        fsUserCoursePeriodMapper.startPeriod(LocalDate.now());
+
+        // 关营
+        fsUserCoursePeriodMapper.endPeriod(LocalDate.now());
+    }
 }

+ 34 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -57,6 +57,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -137,6 +138,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsUserCourseMapper fsUserCourseMapper;
 
+    @Autowired
+    private FsUserCoursePeriodMapper fsUserCoursePeriodMapper;
+
+    @Autowired
+    private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
+
     /**
      * 查询课堂视频
      *
@@ -730,6 +737,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
      * @return 处理结果
      */
     private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
+        // 判断是否属于领取红包时间(会员看课发放红包)
+        FsUserCoursePeriod fsUserCoursePeriod = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(param.getPeriodId());
+        if(fsUserCoursePeriod != null && fsUserCoursePeriod.getLastJoinTime() !=null && LocalTime.now().isAfter(fsUserCoursePeriod.getLastJoinTime())) {
+            R.error(403,"已超过领取红包时间");
+        }
+
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
         FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), param.getCompanyId(), param.getPeriodId());
@@ -776,6 +789,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setCreateTime(new Date());
             redPacketLog.setAmount(amount);
             redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+            redPacketLog.setPeriodId(param.getPeriodId());
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
             // 更新观看记录的奖励类型
@@ -956,6 +970,26 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     @Override
     public ResponseResult<FsUserCourseVideoLinkDetailsVO> getLinkCourseVideoDetails(FsUserCourseVideoLinkParam param) {
+        //判断营期的课程状态是否是进行中
+        FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
+        periodDays.setVideoId(param.getVideoId());
+        periodDays.setPeriodId(param.getPeriodId());
+        //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
+        if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
+            periodDays = fsUserCoursePeriodDays.get(0);
+        }
+        if(periodDays.getStatus() != 1){
+            ResponseResult.fail(403, "当前课程未开始或已结束,暂不能看课");
+        }
+
+        // 判断当前是否在看课时间范围内
+        FsUserCoursePeriod fsUserCoursePeriod = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(param.getPeriodId());
+        if(fsUserCoursePeriod != null && fsUserCoursePeriod.getViewStartTime() != null && fsUserCoursePeriod.getViewEndTime() != null) {
+            if (LocalTime.now().isBefore(fsUserCoursePeriod.getViewStartTime()) || LocalTime.now().isAfter(fsUserCoursePeriod.getViewEndTime())) {
+                ResponseResult.fail(403, "当前非看课时间,暂不能看课");
+            }
+        }
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 

+ 16 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml

@@ -157,4 +157,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{item.id}
         </foreach>
     </update>
+
+    <update id="startPeriodCourse">
+        update fs_user_course_period_days ucpd
+        left join fs_user_course_period ucp on ucp.period_id = ucpd.period_id
+        set ucpd.status = 1, ucpd.update_time = now()
+        where ucpd.status = 0 and ucpd.day_date = #{date} and ucp.view_start_time >= #{time}
+    </update>
+
+    <update id="endPeriodCourse">
+        update fs_user_course_period_days ucpd
+        left join fs_user_course_period ucp on ucp.period_id = ucpd.period_id
+        set ucpd.status = 2, ucpd.update_time = now()
+        <![CDATA[
+        where ucpd.status = 1 and (ucpd.day_date > #{date} or ucp.view_end_time < #{time})
+        ]]>
+    </update>
 </mapper>

+ 1 - 1
fs-service-system/src/main/resources/mapper/course/FsUserCourseTrainingCampMapper.xml

@@ -10,7 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ctc.training_camp_id,
             ctc.training_camp_name,
             ctc.order_number,
-            min(if(ctp.period_starting_time > now(), ctp.period_starting_time, null)) as recent_date,
+            min(if(ctp.period_starting_time >= CURDATE(), ctp.period_starting_time, null)) as recent_date,
             count(distinct ctp.period_id) as period_count,
             count(distinct cu.user_id)  as vip_count
         from fs_user_course_training_camp ctc