소스 검색

feat: 销售自定义设置看课时间、看课时间判断逻辑调整

caoliqin 1 주 전
부모
커밋
6e4e6beabf

+ 17 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -9,6 +9,7 @@ import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.param.newfs.FsCourseSortLinkParam;
 import com.fs.course.param.newfs.FsUserCourseListParam;
+import com.fs.course.param.newfs.FsWatchCourseTimeParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsUserCoursePeriodService;
@@ -34,6 +35,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 @Api("课程库相关接口")
@@ -63,6 +65,7 @@ public class FsUserCourseVideoController extends AppBaseController {
     public ResponseResult<PageInfo<FsUserCourseVideoPageListVO>> list(UserCourseVideoPageParam param) {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setCompanyId(getCompanyId());
+        param.setCompanyUserId(Long.parseLong(getUserId()));
         List<FsUserCourseVideoPageListVO> list = fsUserCourseVideoService.pageListCourseVideo(param);
         PageInfo<FsUserCourseVideoPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(pageInfo);
@@ -198,10 +201,24 @@ public class FsUserCourseVideoController extends AppBaseController {
         Map<String, Object> params = new HashMap<>();
         params.put("companyId", companyId);
         params.put("dayDate", LocalDate.now());
+        params.put("companyUserId", Long.parseLong(getUserId()));
 
         PageHelper.startPage(pageNum, pageSize);
         List<FsUserCourseVideoPageListVO> list = fsUserCourseVideoService.selectCourseVideoListByMap(params);
         PageInfo<FsUserCourseVideoPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(pageInfo);
     }
+
+    @Login
+    @PostMapping("/setWatchTime")
+    @ApiOperation("销售设置课程时间")
+    public ResponseResult<Boolean> setWatchCourseTime(@RequestBody List<FsWatchCourseTimeParam> paramList) {
+        List<FsWatchCourseTimeParam> collect = paramList.stream().peek(v -> {
+            v.setCompanyUserId(Long.parseLong(getUserId()));
+            v.setCompanyId(getCompanyId());
+        }).collect(Collectors.toList());
+        return fsUserCourseVideoService.setWatchCourseTime(collect);
+    }
+
+
 }

+ 54 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsUserCourseCompanyUserTime.java

@@ -0,0 +1,54 @@
+package com.fs.course.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 营期课程-销售课程时间对象 fs_user_course_company_user_time
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCourseCompanyUserTime extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 营期ID */
+    @Excel(name = "营期ID")
+    private Long periodId;
+
+    /** 课程ID */
+    @Excel(name = "课程ID")
+    private Long courseId;
+
+    /** 视频ID */
+    @Excel(name = "视频ID")
+    private Long videoId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startDateTime;
+
+    /** 结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endDateTime;
+
+
+}

+ 89 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseCompanyUserTimeMapper.java

@@ -0,0 +1,89 @@
+package com.fs.course.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCourseCompanyUserTime;
+import com.fs.course.param.newfs.CompanyUserTimeQueryParam;
+
+/**
+ * 营期课程-销售课程时间Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface FsUserCourseCompanyUserTimeMapper extends BaseMapper<FsUserCourseCompanyUserTime> {
+    /**
+     * 查询营期课程-销售课程时间
+     *
+     * @param id 营期课程-销售课程时间主键
+     * @return 营期课程-销售课程时间
+     */
+    FsUserCourseCompanyUserTime selectFsUserCourseCompanyUserTimeById(Long id);
+
+    /**
+     * 查询营期课程-销售课程时间列表
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 营期课程-销售课程时间集合
+     */
+    List<FsUserCourseCompanyUserTime> selectFsUserCourseCompanyUserTimeList(
+            FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 新增营期课程-销售课程时间
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    int insertFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 修改营期课程-销售课程时间
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    int updateFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 删除营期课程-销售课程时间
+     *
+     * @param id 营期课程-销售课程时间主键
+     * @return 结果
+     */
+    int deleteFsUserCourseCompanyUserTimeById(Long id);
+
+    /**
+     * 批量删除营期课程-销售课程时间
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseCompanyUserTimeByIds(Long[] ids);
+
+    /**
+     * 批量查询记录
+     *
+     * @param list 查询参数列表
+     * @return 结果列表
+     */
+    List<FsUserCourseCompanyUserTime> batchSelectByParams(List<CompanyUserTimeQueryParam> list);
+
+    /**
+     * 批量插入记录
+     *
+     * @param list 待插入记录列表
+     * @return 影响行数
+     */
+    int batchInsert(List<FsUserCourseCompanyUserTime> list);
+
+    /**
+     * 批量更新记录
+     *
+     * @param list 待更新记录列表
+     * @return 影响行数
+     */
+    int batchUpdate(List<FsUserCourseCompanyUserTime> list);
+
+
+}

+ 25 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/CompanyUserTimeQueryParam.java

@@ -0,0 +1,25 @@
+package com.fs.course.param.newfs;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class CompanyUserTimeQueryParam{
+
+    /** 营期ID */
+    @Excel(name = "营期ID")
+    private Long periodId;
+
+    /** 课程ID */
+    @Excel(name = "课程ID")
+    private Long courseId;
+
+    /** 视频ID */
+    @Excel(name = "视频ID")
+    private Long videoId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+}

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

@@ -25,6 +25,7 @@ public class FsUserCourseVideoLinkParam implements Serializable {
     @ApiModelProperty(value = "销售id")
     private Long companyUserId;
 
+    @NotNull(message = "营期课程ID不能为空")
     @ApiModelProperty(value = "营期课程ID")
     private Long id;
 

+ 40 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsWatchCourseTimeParam.java

@@ -0,0 +1,40 @@
+package com.fs.course.param.newfs;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(description = "销售设置课程时间-入参")
+public class FsWatchCourseTimeParam {
+
+    @ApiModelProperty(value = "营期id", required = true)
+    private Long periodId;
+
+    @ApiModelProperty(value = "课程id", required = true)
+    private Long courseId;
+
+    @ApiModelProperty(value = "视频id", required = true)
+    private Long videoId;
+
+    @ApiModelProperty(value = "公司id,可以不传")
+    private Long companyId;
+
+    @ApiModelProperty(value = "销售id,可以不传")
+    private Long companyUserId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "开始时间")
+    private Date startDateTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "结束时间")
+    private Date endDateTime;
+//
+//    @ApiModelProperty(value = "营期课程id")
+//    private Long id;
+
+}

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/UserCourseVideoPageParam.java

@@ -29,6 +29,9 @@ public class UserCourseVideoPageParam implements Serializable {
     @ApiModelProperty(value = "公司id")
     private Long companyId;
 
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
     private String corpId;
 
     private String qwUserId;

+ 61 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseCompanyUserTimeService.java

@@ -0,0 +1,61 @@
+package com.fs.course.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCourseCompanyUserTime;
+
+/**
+ * 营期课程-销售课程时间Service接口
+ * 
+ * @author fs
+ * @date 2025-06-09
+ */
+public interface IFsUserCourseCompanyUserTimeService extends IService<FsUserCourseCompanyUserTime>{
+    /**
+     * 查询营期课程-销售课程时间
+     * 
+     * @param id 营期课程-销售课程时间主键
+     * @return 营期课程-销售课程时间
+     */
+    FsUserCourseCompanyUserTime selectFsUserCourseCompanyUserTimeById(Long id);
+
+    /**
+     * 查询营期课程-销售课程时间列表
+     * 
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 营期课程-销售课程时间集合
+     */
+    List<FsUserCourseCompanyUserTime> selectFsUserCourseCompanyUserTimeList(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 新增营期课程-销售课程时间
+     * 
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    int insertFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 修改营期课程-销售课程时间
+     * 
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    int updateFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime);
+
+    /**
+     * 批量删除营期课程-销售课程时间
+     * 
+     * @param ids 需要删除的营期课程-销售课程时间主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseCompanyUserTimeByIds(Long[] ids);
+
+    /**
+     * 删除营期课程-销售课程时间信息
+     * 
+     * @param id 营期课程-销售课程时间主键
+     * @return 结果
+     */
+    int deleteFsUserCourseCompanyUserTimeById(Long id);
+}

+ 8 - 4
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -4,10 +4,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.param.*;
-import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
-import com.fs.course.param.newfs.FsUserCourseVideoLinkParam;
-import com.fs.course.param.newfs.FsUserCourseVideoUParam;
-import com.fs.course.param.newfs.UserCourseVideoPageParam;
+import com.fs.course.param.newfs.*;
 import com.fs.course.vo.FsCourseVideoListBySidebarVO;
 import com.fs.course.vo.FsUserCourseVideoListUVO;
 import com.fs.course.vo.FsUserCourseVideoQVO;
@@ -169,4 +166,11 @@ public interface IFsUserCourseVideoService
      * @return  list
      */
     List<FsUserCourseVideoPageListVO> selectCourseVideoListByMap(Map<String, Object> params);
+
+    /**
+     * 销售设置课程看课时间
+     * @param paramList 入参
+     * @return
+     */
+    ResponseResult<Boolean> setWatchCourseTime(List<FsWatchCourseTimeParam> paramList);
 }

+ 93 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseCompanyUserTimeServiceImpl.java

@@ -0,0 +1,93 @@
+package com.fs.course.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.fs.course.mapper.FsUserCourseCompanyUserTimeMapper;
+import com.fs.course.domain.FsUserCourseCompanyUserTime;
+import com.fs.course.service.IFsUserCourseCompanyUserTimeService;
+
+/**
+ * 营期课程-销售课程时间Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-09
+ */
+@Service
+public class FsUserCourseCompanyUserTimeServiceImpl extends ServiceImpl<FsUserCourseCompanyUserTimeMapper, FsUserCourseCompanyUserTime> implements IFsUserCourseCompanyUserTimeService {
+
+    /**
+     * 查询营期课程-销售课程时间
+     *
+     * @param id 营期课程-销售课程时间主键
+     * @return 营期课程-销售课程时间
+     */
+    @Override
+    public FsUserCourseCompanyUserTime selectFsUserCourseCompanyUserTimeById(Long id)
+    {
+        return baseMapper.selectFsUserCourseCompanyUserTimeById(id);
+    }
+
+    /**
+     * 查询营期课程-销售课程时间列表
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 营期课程-销售课程时间
+     */
+    @Override
+    public List<FsUserCourseCompanyUserTime> selectFsUserCourseCompanyUserTimeList(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime)
+    {
+        return baseMapper.selectFsUserCourseCompanyUserTimeList(fsUserCourseCompanyUserTime);
+    }
+
+    /**
+     * 新增营期课程-销售课程时间
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime)
+    {
+        fsUserCourseCompanyUserTime.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCourseCompanyUserTime(fsUserCourseCompanyUserTime);
+    }
+
+    /**
+     * 修改营期课程-销售课程时间
+     *
+     * @param fsUserCourseCompanyUserTime 营期课程-销售课程时间
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCourseCompanyUserTime(FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime)
+    {
+        fsUserCourseCompanyUserTime.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserCourseCompanyUserTime(fsUserCourseCompanyUserTime);
+    }
+
+    /**
+     * 批量删除营期课程-销售课程时间
+     *
+     * @param ids 需要删除的营期课程-销售课程时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseCompanyUserTimeByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsUserCourseCompanyUserTimeByIds(ids);
+    }
+
+    /**
+     * 删除营期课程-销售课程时间信息
+     *
+     * @param id 营期课程-销售课程时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseCompanyUserTimeById(Long id)
+    {
+        return baseMapper.deleteFsUserCourseCompanyUserTimeById(id);
+    }
+}

+ 113 - 3
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -54,6 +54,7 @@ import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -63,6 +64,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
@@ -171,6 +173,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsCourseLinkMapper fsCourseLinkMapper;
 
+    @Autowired
+    private FsUserCourseCompanyUserTimeMapper companyUserTimeMapper;
     /**
      * 查询课堂视频
      *
@@ -1112,9 +1116,43 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //判断营期的课程状态是否是进行中
         if(param.getId() != null){
             FsUserCoursePeriodDays days = fsUserCoursePeriodDaysMapper.selectById(param.getId());
-            vo.setStartDateTime(days.getStartDateTime());
-            vo.setEndDateTime(days.getEndDateTime());
-            vo.setRang(DateUtil.isWithinRangeSafe(LocalDateTime.now(), days.getStartDateTime(), days.getEndDateTime()) && days.getStatus() == 1);
+
+            // 查询销售设置的看课时间
+            LocalDateTime companyUserStartDateTime = null;
+            LocalDateTime companyUserEndDateTime = null;
+
+            List<CompanyUserTimeQueryParam> queryList = new ArrayList<>();
+            CompanyUserTimeQueryParam query = new CompanyUserTimeQueryParam();
+            query.setPeriodId(param.getPeriodId());
+            query.setCourseId(param.getCourseId());
+            query.setVideoId(param.getVideoId());
+            query.setCompanyUserId(param.getCompanyUserId());
+            queryList.add(query);
+            List<FsUserCourseCompanyUserTime> fsUserCourseCompanyUserTimes = companyUserTimeMapper.batchSelectByParams(queryList);
+
+            if(CollectionUtils.isNotEmpty(fsUserCourseCompanyUserTimes)){
+                FsUserCourseCompanyUserTime fsUserCourseCompanyUserTime = fsUserCourseCompanyUserTimes.get(0);
+                Date cuStartDateTime = fsUserCourseCompanyUserTime.getStartDateTime();
+                Date cuEndDateTime = fsUserCourseCompanyUserTime.getEndDateTime();
+
+                if(cuStartDateTime != null){
+                    Instant instant = cuStartDateTime.toInstant();
+                    ZoneId zoneId = ZoneId.systemDefault();
+                    companyUserStartDateTime = instant.atZone(zoneId).toLocalDateTime();
+                }
+
+                if(cuEndDateTime != null){
+                    Instant instant = cuEndDateTime.toInstant();
+                    ZoneId zoneId = ZoneId.systemDefault();
+                    companyUserEndDateTime = instant.atZone(zoneId).toLocalDateTime();
+                }
+            }
+            vo.setStartDateTime(companyUserStartDateTime != null ? companyUserStartDateTime : days.getStartDateTime());
+            vo.setEndDateTime(companyUserEndDateTime != null ? companyUserEndDateTime : days.getEndDateTime());
+            vo.setRang(DateUtil.isWithinRangeSafe(LocalDateTime.now(),
+                    companyUserStartDateTime != null ? companyUserStartDateTime : days.getStartDateTime(),
+                    companyUserEndDateTime != null ? companyUserEndDateTime : days.getEndDateTime())
+                    && days.getStatus() == 1);
         }
         return ResponseResult.ok(vo);
     }
@@ -1249,6 +1287,78 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         return fsUserCourseVideoMapper.selectFsUserCourseVideoListByMap(params);
     }
 
+    @Override
+    public ResponseResult<Boolean> setWatchCourseTime(List<FsWatchCourseTimeParam> paramList) {
+        if (CollectionUtils.isEmpty(paramList)) {
+            return ResponseResult.fail(400, "参数不能为空");
+        }
+
+        // 1. 查询参数
+        List<CompanyUserTimeQueryParam> queryList = paramList.stream()
+                .map(param -> {
+                    CompanyUserTimeQueryParam query = new CompanyUserTimeQueryParam();
+                    query.setPeriodId(param.getPeriodId());
+                    query.setCourseId(param.getCourseId());
+                    query.setVideoId(param.getVideoId());
+                    query.setCompanyUserId(param.getCompanyUserId());
+                    return query;
+                })
+                .collect(Collectors.toList());
+
+        // 2. 批量查询现有的记录
+        List<FsUserCourseCompanyUserTime> existingRecords = companyUserTimeMapper.batchSelectByParams(queryList);
+        Map<String, FsUserCourseCompanyUserTime> existingMap = existingRecords.stream()
+                .collect(Collectors.toMap(record -> getKey(record.getPeriodId(), record.getCourseId(), record.getVideoId(), record.getCompanyUserId()),
+                        record -> record));
+
+        // 3. 分离需要更新和插入的记录
+        List<FsUserCourseCompanyUserTime> toUpdate = new ArrayList<>();
+        List<FsUserCourseCompanyUserTime> toInsert = new ArrayList<>();
+        Date now = DateUtils.getNowDate();
+
+        for (FsWatchCourseTimeParam param : paramList) {
+            String key = getKey(param.getPeriodId(), param.getCourseId(), param.getVideoId(), param.getCompanyUserId());
+            FsUserCourseCompanyUserTime record = existingMap.get(key);
+
+            if (record != null) {
+                // 需要更新
+                record.setStartDateTime(param.getStartDateTime());
+                record.setEndDateTime(param.getEndDateTime());
+                record.setUpdateTime(now);
+                toUpdate.add(record);
+            } else {
+                // 需要插入
+                FsUserCourseCompanyUserTime newRecord = new FsUserCourseCompanyUserTime();
+                newRecord.setPeriodId(param.getPeriodId());
+                newRecord.setCourseId(param.getCourseId());
+                newRecord.setVideoId(param.getVideoId());
+                newRecord.setCompanyUserId(param.getCompanyUserId());
+                newRecord.setCompanyId(param.getCompanyId());
+                newRecord.setStartDateTime(param.getStartDateTime());
+                newRecord.setEndDateTime(param.getEndDateTime());
+                newRecord.setCreateTime(now);
+                toInsert.add(newRecord);
+            }
+        }
+
+        // 4. 执行批量更新和插入
+        if (!toUpdate.isEmpty()) {
+            companyUserTimeMapper.batchUpdate(toUpdate);
+        }
+        if (!toInsert.isEmpty()) {
+            companyUserTimeMapper.batchInsert(toInsert);
+        }
+
+        return ResponseResult.ok();
+    }
+
+    /**
+     * 生成唯一键
+     */
+    private String getKey(Long periodId, Long courseId, Long videoId, Long companyUserId) {
+        return String.format("%d_%d_%d_%d", periodId, courseId, videoId, companyUserId);
+    }
+
     private String createLinkByMiniApp(Date sendTime, Long courseId, Long videoId,
                                        QwUser qwUser, Long externalId,int type,String domainName) {
         FsCourseLink link = new FsCourseLink();

+ 10 - 3
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java

@@ -39,9 +39,9 @@ public class FsUserCourseVideoPageListVO extends BaseEntity {
     @ApiModelProperty(value = "课程名称")
     private String courseName;
 
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @ApiModelProperty(value = "创建时间")
-    private Date createTime;
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @ApiModelProperty(value = "创建时间")
+//    private Date createTime;
 
     @ApiModelProperty(value = "营期id")
     private Long periodId;
@@ -49,5 +49,12 @@ public class FsUserCourseVideoPageListVO extends BaseEntity {
     @ApiModelProperty(value = "营期课程ID")
     private Long id;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "课程开始时间")
+    private Date startDateTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "课程结束时间")
+    private Date endDateTime;
 
 }

+ 141 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCourseCompanyUserTimeMapper.xml

@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.course.mapper.FsUserCourseCompanyUserTimeMapper">
+
+    <resultMap type="FsUserCourseCompanyUserTime" id="FsUserCourseCompanyUserTimeResult">
+        <result property="id"    column="id"    />
+        <result property="periodId"    column="period_id"    />
+        <result property="courseId"    column="course_id"    />
+        <result property="videoId"    column="video_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="startDateTime"    column="start_date_time"    />
+        <result property="endDateTime"    column="end_date_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectFsUserCourseCompanyUserTimeVo">
+        select id, period_id, course_id, video_id, company_user_id, company_id, start_date_time, end_date_time, create_time, create_by, update_time, update_by from fs_user_course_company_user_time
+    </sql>
+
+    <select id="selectFsUserCourseCompanyUserTimeList" parameterType="FsUserCourseCompanyUserTime" resultMap="FsUserCourseCompanyUserTimeResult">
+        <include refid="selectFsUserCourseCompanyUserTimeVo"/>
+        <where>
+            <if test="periodId != null "> and period_id = #{periodId}</if>
+            <if test="courseId != null "> and course_id = #{courseId}</if>
+            <if test="videoId != null "> and video_id = #{videoId}</if>
+            <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="startDateTime != null "> and start_date_time = #{startDateTime}</if>
+            <if test="endDateTime != null "> and end_date_time = #{endDateTime}</if>
+        </where>
+    </select>
+
+    <select id="selectFsUserCourseCompanyUserTimeById" parameterType="Long" resultMap="FsUserCourseCompanyUserTimeResult">
+        <include refid="selectFsUserCourseCompanyUserTimeVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertFsUserCourseCompanyUserTime" parameterType="FsUserCourseCompanyUserTime" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_course_company_user_time
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="periodId != null">period_id,</if>
+            <if test="courseId != null">course_id,</if>
+            <if test="videoId != null">video_id,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="startDateTime != null">start_date_time,</if>
+            <if test="endDateTime != null">end_date_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="periodId != null">#{periodId},</if>
+            <if test="courseId != null">#{courseId},</if>
+            <if test="videoId != null">#{videoId},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="startDateTime != null">#{startDateTime},</if>
+            <if test="endDateTime != null">#{endDateTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserCourseCompanyUserTime" parameterType="FsUserCourseCompanyUserTime">
+        update fs_user_course_company_user_time
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="periodId != null">period_id = #{periodId},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
+            <if test="videoId != null">video_id = #{videoId},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="startDateTime != null">start_date_time = #{startDateTime},</if>
+            <if test="endDateTime != null">end_date_time = #{endDateTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsUserCourseCompanyUserTimeById" parameterType="Long">
+        delete from fs_user_course_company_user_time where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserCourseCompanyUserTimeByIds" parameterType="String">
+        delete from fs_user_course_company_user_time where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <!-- 批量查询记录 -->
+    <select id="batchSelectByParams" resultMap="FsUserCourseCompanyUserTimeResult">
+        select id, period_id, course_id, video_id, company_user_id, company_id,
+               start_date_time, end_date_time, create_time, create_by, update_time, update_by
+        from fs_user_course_company_user_time
+        where (
+            <foreach collection="list" item="item" separator=" OR ">
+                (period_id = #{item.periodId}
+                AND course_id = #{item.courseId}
+                AND video_id = #{item.videoId}
+                AND company_user_id = #{item.companyUserId})
+            </foreach>
+        )
+    </select>
+
+    <!-- 批量插入记录 -->
+    <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_course_company_user_time
+        (period_id, course_id, video_id, company_user_id, company_id,
+         start_date_time, end_date_time, create_time)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.periodId}, #{item.courseId}, #{item.videoId}, #{item.companyUserId},
+             #{item.companyId}, #{item.startDateTime}, #{item.endDateTime},
+             #{item.createTime})
+        </foreach>
+    </insert>
+
+    <!-- 批量更新记录 -->
+    <update id="batchUpdate">
+        <foreach collection="list" item="item" separator=";">
+            update fs_user_course_company_user_time
+            set start_date_time = #{item.startDateTime},
+                end_date_time = #{item.endDateTime},
+                update_time = #{item.updateTime}
+            where id = #{item.id}
+        </foreach>
+    </update>
+</mapper>

+ 13 - 3
fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -232,17 +232,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             video.video_url,
             video.thumbnail,
             video.duration,
-            fcpd.create_time,
             video.course_id,
             video.STATUS,
             video.course_sort,
             course.course_name,
             fcpd.period_id,
-            fcpd.id
+            fcpd.id,
+            if(ccut.start_date_time is null, fcpd.start_date_time, ccut.start_date_time) as startDateTime,
+            if(ccut.end_date_time is null, fcpd.end_date_time, ccut.end_date_time) as endDateTime
         FROM `fs_user_course_video` video
         left join fs_user_course_period_days fcpd on fcpd.video_id = video.video_id
         left join fs_user_course_period fcp on fcp.period_id = fcpd.period_id
         LEFT JOIN fs_user_course course ON video.course_id = course.course_id
+        LEFT JOIN fs_user_course_company_user_time ccut ON ccut.period_id = fcpd.period_id
+            AND ccut.course_id = fcpd.course_id
+            AND ccut.video_id = fcpd.video_id
+            AND ccut.company_user_id = #{companyUserId}
         where course.is_del = 0
         AND FIND_IN_SET(#{companyId}, fcp.company_id)
         <if test="periodId != null and periodId !='' ">
@@ -284,11 +289,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             course.course_name,
             fcpd.period_id,
             fcpd.id,
-            fcpd.create_time
+            if(ccut.start_date_time is null, fcpd.start_date_time, ccut.start_date_time) as startDateTime,
+            if(ccut.end_date_time is null, fcpd.end_date_time, ccut.end_date_time) as endDateTime
         from `fs_user_course_video` video
         left join fs_user_course_period_days fcpd on fcpd.video_id = video.video_id
         left join fs_user_course_period fcp on fcp.period_id = fcpd.period_id
         left join fs_user_course course ON video.course_id = course.course_id
+        LEFT JOIN fs_user_course_company_user_time ccut ON ccut.period_id = fcpd.period_id
+            AND ccut.course_id = fcpd.course_id
+            AND ccut.video_id = fcpd.video_id
+            AND ccut.company_user_id = #{params.companyUserId}
         where course.is_del = 0
         <if test="params.companyId != null">
             and FIND_IN_SET(#{params.companyId}, fcp.company_id)