Browse Source

北京存在:会员营期通过选择课程ID自动生成对营期课程

liupeng 2 days ago
parent
commit
dc378d839b

+ 10 - 3
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -105,9 +105,16 @@ public class FsUserCoursePeriodController extends BaseController {
     @PreAuthorize("@ss.hasPermi('course:period:add')")
     @Log(title = "会员营期", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
-    {
-        return toAjax(fsUserCoursePeriodService.insertFsUserCoursePeriod(fsUserCoursePeriod));
+    public R add(@RequestBody FsUserCoursePeriod fsUserCoursePeriod) {
+        if (fsUserCoursePeriod == null) {
+            return R.error("营期信息不能为空");
+        }
+        if (fsUserCoursePeriod.getCourseId() == null) {
+            boolean isSuccess = fsUserCoursePeriodService.insertFsUserCoursePeriod(fsUserCoursePeriod) > 0;
+            return isSuccess ? R.ok("营期新增成功") : R.error("营期新增失败");
+        } else {
+            return fsUserCoursePeriodService.insertFsUserCoursePeriodAndCourse(fsUserCoursePeriod);
+        }
     }
 
     /**

+ 66 - 10
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java

@@ -13,11 +13,16 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
+import com.fs.course.domain.FsUserCoursePeriod;
+import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.BatchRedUpdate;
 import com.fs.course.param.BatchVideoSvae;
 import com.fs.course.param.CourseVideoUpdates;
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.vo.FsUserCourseVideoChooseVO;
@@ -30,6 +35,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalTime;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -57,6 +64,18 @@ public class FsUserCourseVideoController extends BaseController
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private IFsUserCoursePeriodService fsUserCoursePeriodService;
+
+    @Autowired
+    private IFsUserCoursePeriodDaysService fsUserCoursePeriodDaysService;
+
+    @Autowired
+    private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
+
+    @Autowired
+    private IFsUserCoursePeriodDaysService sysUserCoursePeriodDaysService;
+
     /**
      * 查询课堂视频列表
      */
@@ -119,23 +138,42 @@ public class FsUserCourseVideoController extends BaseController
     @PreAuthorize("@ss.hasPermi('course:userCourseVideo:add')")
     @Log(title = "课堂视频", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody FsUserCourseVideo fsUserCourseVideo)
-    {
-        Long count = fsUserCourseVideoMapper.selectFsUserCourseVideoByCourseSort(fsUserCourseVideo.getCourseId(),fsUserCourseVideo.getCourseSort());
-        if (count>0){
+    public AjaxResult add(@RequestBody FsUserCourseVideo fsUserCourseVideo) {
+        Long count = fsUserCourseVideoMapper.selectFsUserCourseVideoByCourseSort(fsUserCourseVideo.getCourseId(), fsUserCourseVideo.getCourseSort());
+        if (count > 0) {
             return AjaxResult.error("课程排序重复");
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long userId = loginUser.getUser().getUserId();
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if (ObjectUtil.isNotEmpty(config.getIsBound())&&config.getIsBound()){
+        if (ObjectUtil.isNotEmpty(config.getIsBound()) && config.getIsBound()) {
             fsUserCourseVideo.setUserId(userId);
         }
         // 设置项目ID
         FsUserCourse fsUserCourse = fsUserCourseService.selectFsUserCourseByCourseId(fsUserCourseVideo.getCourseId());
         fsUserCourseVideo.setProjectId(fsUserCourse.getProject());
-        return toAjax(fsUserCourseVideoService.insertFsUserCourseVideo(fsUserCourseVideo));
+        AjaxResult ajax = toAjax(fsUserCourseVideoService.insertFsUserCourseVideo(fsUserCourseVideo));
+        //新增课程对应目录时,判断当前课程类目是否有营期,如果有对应营期并且还在营期没有结束新增到当前营期中
+        FsUserCoursePeriod coursePeriod = new FsUserCoursePeriod();
+        coursePeriod.setCourseId(fsUserCourse.getCourseId());
+        List<FsUserCoursePeriod> coursePeriodsList = fsUserCoursePeriodService.selectFsUserCoursePeriodList(coursePeriod);//获取当前课程创建的会员营期
+        //  处理对应课程安排
+        if (!coursePeriodsList.isEmpty()) {
+            LocalTime startTime = LocalTime.MIDNIGHT;
+            LocalTime endTime = LocalTime.of(23, 59, 59);
+            coursePeriodsList.stream().filter(e -> e.getPeriodStatus() != 3).forEach(video -> {
+                FsUserCoursePeriodDays periodDaysEntity = new FsUserCoursePeriodDays();
+                periodDaysEntity.setPeriodId(video.getPeriodId());//营期ID
+                periodDaysEntity.setCourseId(video.getCourseId());//课程ID
+                periodDaysEntity.setStartTime(startTime);
+                periodDaysEntity.setVideoIds(Collections.singletonList(fsUserCourseVideo.getVideoId()));
+                periodDaysEntity.setEndTime1(endTime);
+                periodDaysEntity.setJoinTime(endTime);
+                fsUserCoursePeriodDaysService.addCourse(periodDaysEntity);
+            });
+        }
+        return ajax;
     }
 
     /**
@@ -154,10 +192,28 @@ public class FsUserCourseVideoController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('course:userCourseVideo:remove')")
     @Log(title = "课堂视频", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{videoIds}")
-    public AjaxResult remove(@PathVariable String[] videoIds)
-    {
-        return toAjax(fsUserCourseVideoService.deleteFsUserCourseVideoByVideoIds(videoIds));
+    @DeleteMapping("/{videoIds}")
+    public AjaxResult remove(@PathVariable String[] videoIds) {
+        //删除对应视频的营期数据
+        FsUserCourseVideo fsUserCourseVideo = new FsUserCourseVideo();
+        if (videoIds.length > 0)
+            fsUserCourseVideo = fsUserCourseVideoService.selectFsUserCourseVideoByVideoId(Long.valueOf(videoIds[0]));
+        if (fsUserCourseVideo.getCourseId() != null) {
+            FsUserCoursePeriod coursePeriod = new FsUserCoursePeriod();
+            coursePeriod.setCourseId(fsUserCourseVideo.getCourseId());
+            List<FsUserCoursePeriod> coursePeriodsList = fsUserCoursePeriodService.selectFsUserCoursePeriodList(coursePeriod);//获取当前课程创建的会员营期
+            coursePeriodsList.forEach(video -> {
+                List<Long> longs = fsUserCoursePeriodDaysMapper.selectCourseTheSpecifiedVideo(video.getPeriodId(),video.getCourseId(), videoIds);
+                if (longs != null && !longs.isEmpty()){
+                    Long[] ids=new Long[longs.size()];
+                    for (int i = 0; i < longs.size(); i++) {
+                        ids[i]=longs.get(i);
+                    }
+                    fsUserCoursePeriodDaysService.deleteFsUserCoursePeriodDaysByIds(ids);
+                }
+            });
+        }
+        return  toAjax(fsUserCourseVideoService.deleteFsUserCourseVideoByVideoIds(videoIds));
     }
 
 

+ 2 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java

@@ -118,4 +118,6 @@ public class FsUserCoursePeriod
      */
     private Date periodLine;
 
+    private Long courseId;
+
 }

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

@@ -5,6 +5,7 @@ import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.domain.FsUserWatchCourseStatistics;
 import com.fs.his.vo.OptionsVO;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 import java.time.LocalDateTime;
@@ -118,4 +119,17 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
     int updateBatchDelFlag(@Param("ids") Long [] ids, @Param("delFlag") Integer delFlag);
 
     Long selectFsUserCoursePeriodDaysCount(FsUserCoursePeriodDays fsUserCoursePeriodDays);
+
+    @Select("SELECT distinct period_id from fs_user_course_period_days  where start_date_time >=#{periodSTime} and end_date_time <=#{periodETime} ")
+    List<Long> selectFsUserCoursePeriodDaysByTime(@Param("periodSTime") String periodSTime,@Param("periodETime") String periodETime);
+
+    @Select("<script>" +
+            "SELECT id FROM fs_user_course_period_days " +
+            "WHERE del_flag=0 and period_id=#{periodId} and course_id = #{courseId} " +
+            "AND video_id IN " +
+            "<foreach collection='videoIds' item='videoId' open='(' separator=',' close=')'>" +
+            "   #{videoId}" +
+            "</foreach>" +
+            "</script>")
+    List<Long> selectCourseTheSpecifiedVideo(@Param("periodId") Long periodId,@Param("courseId") Long courseId, @Param("videoIds") String[] videoIds);
 }

+ 8 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java

@@ -1,5 +1,6 @@
 package com.fs.course.service;
 
+import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.PeriodStatisticCountParam;
 import com.fs.course.vo.FsCourseStaticsCountVO;
@@ -97,4 +98,11 @@ public interface IFsUserCoursePeriodService
      * @return
      */
     List<FsUserCoursePeriod> selectFsPeriodlist(PeriodStatisticCountParam param);
+
+    List<Long> selectCoursePeriodDaysByTime(String periodSTime,String periodETime,Long companyId);
+
+    List<Long> selectFsUserCoursePeriodListByPeriodId(List<Long> periodIds,Long companyId);
+
+    R insertFsUserCoursePeriodAndCourse(FsUserCoursePeriod fsUserCoursePeriod);
+
 }

+ 61 - 6
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java

@@ -7,13 +7,17 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
-import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.date.DateUtil;
+import com.fs.common.utils.date.TimeTypeEnum;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCoursePeriodDays;
+import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
 import com.fs.course.mapper.FsUserCoursePeriodMapper;
+import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.mapper.FsUserCourseVideoRedPackageMapper;
 import com.fs.course.param.PeriodStatisticCountParam;
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
 import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.vo.FsCourseStaticsCountVO;
 import com.fs.course.vo.FsUserCoursePeriodVO;
@@ -26,11 +30,9 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -51,7 +53,10 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
     @Resource
     private FsUserCourseVideoRedPackageMapper fsUserCourseVideoRedPackageMapper;
-
+    @Autowired
+    private FsUserCourseVideoMapper fsUserCourseVideoMapper;
+    @Autowired
+    private IFsUserCoursePeriodDaysService fsUserCoursePeriodDaysService;
     /**
      * 查询会员营期
      *
@@ -304,4 +309,54 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     public List<FsUserCoursePeriod> selectFsPeriodlist(PeriodStatisticCountParam param) {
         return fsUserCoursePeriodMapper.selectFsPeriodlist(param);
     }
+
+    @Override
+    public List<Long> selectCoursePeriodDaysByTime(String periodSTime, String periodETime, Long companyId) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<Long> selectFsUserCoursePeriodListByPeriodId(List<Long> periodIds, Long companyId) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public R insertFsUserCoursePeriodAndCourse(FsUserCoursePeriod fsUserCoursePeriod) {
+        // 1. 参数校验:避免空指针和无效数据
+        if (fsUserCoursePeriod == null
+                || fsUserCoursePeriod.getCourseId() == null
+                || fsUserCoursePeriod.getPeriodStartingTime() == null
+                || fsUserCoursePeriod.getPeriodEndTime() == null) {
+            return R.error("营期信息不完整");
+        }
+        // 2. 插入营期主表,直接判断结果(insert返回值通常为影响行数,无需单独用变量接收)
+        if (insertFsUserCoursePeriod(fsUserCoursePeriod) <= 0) {
+            return R.error("营期创建失败");
+        }
+
+        // 3. 查询关联的课程视频(简化查询参数构建)
+        FsUserCourseVideo queryVideo = new FsUserCourseVideo();
+        queryVideo.setCourseId(fsUserCoursePeriod.getCourseId());
+        List<FsUserCourseVideo> courseVideos = fsUserCourseVideoMapper.selectFsUserCourseVideoListByCourseId(queryVideo);
+
+        //  批量处理每日课程安排(提取重复常量,简化逻辑)
+        if (!courseVideos.isEmpty()) {
+            // 定义重复使用的时间常量
+            LocalTime startTime = LocalTime.MIDNIGHT;
+            LocalTime endTime = LocalTime.of(23, 59, 59);
+            Long periodId = fsUserCoursePeriod.getPeriodId();
+
+            courseVideos.forEach(video -> {
+                FsUserCoursePeriodDays periodDaysEntity = new FsUserCoursePeriodDays();
+                periodDaysEntity.setPeriodId(periodId);
+                periodDaysEntity.setCourseId(video.getCourseId());
+                periodDaysEntity.setStartTime(startTime);
+                periodDaysEntity.setVideoIds(Collections.singletonList(video.getVideoId()));
+                periodDaysEntity.setEndTime1(endTime);
+                periodDaysEntity.setJoinTime(endTime);
+                fsUserCoursePeriodDaysService.addCourse(periodDaysEntity);
+            });
+        }
+        return R.ok("营期及课程安排创建成功");
+    }
 }

+ 5 - 0
fs-service/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml

@@ -21,6 +21,7 @@
         <result property="courseLogo"    column="course_logo"    />
         <result property="openCommentStatus"    column="open_comment_status"    />
         <result property="periodLine"    column="period_line"    />
+        <result property="courseId"    column="course_id"    />
     </resultMap>
 
     <sql id="selectFsUserCoursePeriodVo">
@@ -41,6 +42,7 @@
             <if test="periodStartingTime != null "> and period_starting_time = #{periodStartingTime}</if>
             <if test="periodEndTime != null "> and period_end_time = #{periodEndTime}</if>
             <if test="periodLine != null "> and period_line = #{periodLine}</if>
+            <if test="courseId != null "> and course_id = #{courseId}</if>
         </where>
     </select>
 
@@ -114,6 +116,7 @@
             <if test="courseLogo != null">course_logo,</if>
             <if test="openCommentStatus != null">open_comment_status,</if>
             <if test="periodLine != null">period_line,</if>
+            <if test="courseId != null">course_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="periodId != null">#{periodId},</if>
@@ -136,6 +139,7 @@
             <if test="courseLogo != null">#{courseLogo},</if>
             <if test="openCommentStatus != null">#{openCommentStatus},</if>
             <if test="periodLine != null">#{periodLine},</if>
+            <if test="courseId != null">#{courseId},</if>
         </trim>
     </insert>
 
@@ -161,6 +165,7 @@
             <if test="courseLogo != null and courseLogo !=''">course_logo = #{courseLogo},</if>
             <if test="openCommentStatus != null">open_comment_status = #{openCommentStatus},</if>
             <if test="periodLine != null">period_line = #{periodLine},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
         </trim>
         where period_id = #{periodId}
     </update>