Browse Source

营期注册链接

wangxy 5 days ago
parent
commit
196869e45f
28 changed files with 739 additions and 237 deletions
  1. 9 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java
  2. 14 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCoursePeriodController.java
  3. 34 0
      fs-service/src/main/java/com/fs/course/domain/FsSalesUserPeriodRelation.java
  4. 5 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodCompany.java
  5. 10 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java
  6. 101 0
      fs-service/src/main/java/com/fs/course/mapper/FsSalesUserPeriodRelationMapper.java
  7. 19 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodCompanyMapper.java
  8. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java
  9. 3 0
      fs-service/src/main/java/com/fs/course/param/CompanyRedPacketParam.java
  10. 10 0
      fs-service/src/main/java/com/fs/course/param/PeriodStatisticCountParam.java
  11. 5 0
      fs-service/src/main/java/com/fs/course/param/newfs/FsUserCourseAddCompanyUserParam.java
  12. 14 0
      fs-service/src/main/java/com/fs/course/service/IFsSalesUserPeriodRelationService.java
  13. 5 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodCompanyService.java
  14. 7 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java
  15. 7 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodCompanyServiceImpl.java
  16. 66 40
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  17. 191 194
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  18. 51 0
      fs-service/src/main/java/com/fs/course/service/impl/IFsSalesUserPeriodRelationServiceImpl.java
  19. 12 0
      fs-service/src/main/java/com/fs/course/vo/FsPeriodCountVO.java
  20. 5 0
      fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java
  21. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  22. 1 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  23. 103 0
      fs-service/src/main/resources/mapper/course/FsSalesUserPeriodRelationMapper.xml
  24. 13 0
      fs-service/src/main/resources/mapper/course/FsUserCoursePeriodCompanyMapper.xml
  25. 5 1
      fs-service/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml
  26. 2 1
      fs-service/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml
  27. 20 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  28. 23 0
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

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

@@ -227,6 +227,15 @@ public class FsUserCoursePeriodController extends BaseController {
         fsUserCoursePeriodCompanyService.changeRedPacketState(params.getPeriodId(), params.getCompanyId(), params.getState());
         return R.ok("修改成功");
     }
+    @PreAuthorize("@ss.hasPermi('course:period:changeRegistrationSwitchState')")
+    @PostMapping(value = "/changeRegistrationSwitchState")
+    @Log(title = "营期销售公司报名开关状态", businessType = BusinessType.UPDATE)
+    public R changeRegistrationSwitchState(@RequestBody PeriodCompanyRedPacketState params) {
+        fsUserCoursePeriodCompanyService.changeRegistrationSwitchState(params.getPeriodId(), params.getCompanyId(), params.getState());
+        return R.ok("修改成功");
+    }
+
+
 
     @PostMapping("/periodCount")
     @ApiOperation("营期统计")

+ 14 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCoursePeriodController.java

@@ -14,6 +14,7 @@ import com.fs.course.param.CompanyRedPacketParam;
 import com.fs.course.param.FsBatchPeriodRedPackageParam;
 import com.fs.course.param.PeriodCountParam;
 import com.fs.course.param.PeriodStatisticCountParam;
+import com.fs.course.service.IFsSalesUserPeriodRelationService;
 import com.fs.course.service.IFsUserCoursePeriodDaysService;
 import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.service.IFsUserCourseVideoRedPackageService;
@@ -49,6 +50,10 @@ public class FsUserCoursePeriodController extends BaseController {
 
     private final IFsUserCoursePeriodService fsUserCoursePeriodService;
 
+    private  final IFsSalesUserPeriodRelationService salesUserPeriodRelationService;
+
+    private final IFsUserCoursePeriodDaysService fsUserCoursePeriodDaysService;
+
     @PostMapping("/periodCourseStatisticCount")
     @ApiOperation("会员详情训练营数据总览")
     public R periodCourseStatisticCount(@RequestBody PeriodStatisticCountParam param) {
@@ -64,4 +69,13 @@ public class FsUserCoursePeriodController extends BaseController {
         List<FsUserCoursePeriod> list = fsUserCoursePeriodService.selectFsPeriodlist(param);
         return R.ok().put("data", list);
     }
+
+    @GetMapping("/isShowShare")
+    public  R  isShowShare(Long  daysId )
+    {
+        return R.ok().put("data", fsUserCoursePeriodDaysService.isShowShare(daysId));
+    }
+
+
+
 }

+ 34 - 0
fs-service/src/main/java/com/fs/course/domain/FsSalesUserPeriodRelation.java

@@ -0,0 +1,34 @@
+package com.fs.course.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+public class FsSalesUserPeriodRelation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 销售ID,关联company_user表 */
+    private Long salesId;
+
+    /** 用户ID,关联fs_user表 */
+    private Long userId;
+
+    /** 营期ID,关联fs_user_course_period表 */
+    private Long periodId;
+
+    /** 绑定时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime bindTime;
+
+    /**
+     * 小节id
+     */
+    private Long daysId;
+}

+ 5 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodCompany.java

@@ -29,4 +29,9 @@ public class FsUserCoursePeriodCompany {
      * 是否开启红包 0关闭 1开启
      */
     private Integer openRedPacket;
+
+    /**
+     * 是否开启注册链接 0关闭 1开启
+     */
+    private  Integer  openRegistrationSwitch;
 }

+ 10 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java

@@ -82,6 +82,11 @@ public class FsUserCoursePeriodDays extends BaseEntityTow {
 
     @TableField(exist = false)
     private List<Long> videoIds;
+
+    /** 未注册链接视频ID列表 */
+    @TableField(exist = false)
+    private  List<Long> noRegisterVideoIds;
+
     @TableField(exist = false)
     private String courseName;
     @TableField(exist = false)
@@ -99,4 +104,9 @@ public class FsUserCoursePeriodDays extends BaseEntityTow {
     @TableField(exist = false)
     private Long projectId;
 
+    /*
+     * 注册链接开关;0关闭1开启
+     */
+    private  Integer  registrationSwitch;
+
 }

+ 101 - 0
fs-service/src/main/java/com/fs/course/mapper/FsSalesUserPeriodRelationMapper.java

@@ -0,0 +1,101 @@
+package com.fs.course.mapper;
+
+import com.fs.course.domain.FsSalesUserPeriodRelation;
+import org.apache.ibatis.annotations.Param;
+
+
+import java.util.List;
+
+public interface FsSalesUserPeriodRelationMapper {
+
+
+    /**
+     * 查询销售-用户-营期关系
+     *
+     * @param id 销售-用户-营期关系主键
+     * @return 销售-用户-营期关系
+     */
+    public FsSalesUserPeriodRelation selectFsSalesUserPeriodRelationById(Long id);
+
+    /**
+     * 查询销售-用户-营期关系列表
+     *
+     * @param fsSalesUserPeriodRelation 销售-用户-营期关系
+     * @return 销售-用户-营期关系集合
+     */
+    public List<FsSalesUserPeriodRelation> selectFsSalesUserPeriodRelationList(FsSalesUserPeriodRelation fsSalesUserPeriodRelation);
+
+    /**
+     * 新增销售-用户-营期关系
+     *
+     * @param fsSalesUserPeriodRelation 销售-用户-营期关系
+     * @return 结果
+     */
+    public int insertFsSalesUserPeriodRelation(FsSalesUserPeriodRelation fsSalesUserPeriodRelation);
+
+    /**
+     * 修改销售-用户-营期关系
+     *
+     * @param fsSalesUserPeriodRelation 销售-用户-营期关系
+     * @return 结果
+     */
+    public int updateFsSalesUserPeriodRelation(FsSalesUserPeriodRelation fsSalesUserPeriodRelation);
+
+    /**
+     * 删除销售-用户-营期关系
+     *
+     * @param id 销售-用户-营期关系主键
+     * @return 结果
+     */
+    public int deleteFsSalesUserPeriodRelationById(Long id);
+
+    /**
+     * 批量删除销售-用户-营期关系
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteFsSalesUserPeriodRelationByIds(Long[] ids);
+
+    /**
+     * 根据销售ID、用户ID和营期ID查询关系
+     *
+     * @param salesId 销售ID
+     * @param userId 用户ID
+     * @param periodId 营期ID
+     * @return 销售-用户-营期关系
+     */
+    public FsSalesUserPeriodRelation selectBySalesUserPeriod(Long salesId, Long userId, Long periodId);
+
+    /**
+     * 根据销售ID、用户ID、营期ID和小节ID查询关系
+     *
+     * @param salesId 销售ID
+     * @param userId 用户ID
+     * @param periodId 营期ID
+     * @param daysId 小节ID
+     * @return 销售-用户-营期-小节关系
+     */
+    public FsSalesUserPeriodRelation selectBySalesUserPeriodAndDays(@Param("salesId") Long salesId, @Param("userId") Long userId,
+                                                                    @Param("periodId") Long periodId, @Param("daysId") Long daysId);
+
+    /**
+     * 根据用户ID和营期ID查询关系列表
+     *
+     * @param userId 用户ID
+     * @param periodId 营期ID
+     * @return 销售-用户-营期关系集合
+     */
+    public List<FsSalesUserPeriodRelation> selectByUserAndPeriod(@Param("userId") Long userId, @Param("periodId") Long periodId);
+
+    /**
+     * 根据用户ID、营期ID和小节ID查询关系
+     *
+     * @param userId 用户ID
+     * @param periodId 营期ID
+     * @param daysId 小节ID
+     * @return 销售-用户-营期-小节关系
+     */
+    public FsSalesUserPeriodRelation selectByUserPeriodAndDays(@Param("userId") Long userId, @Param("periodId") Long periodId,
+                                                               @Param("daysId") Long daysId);
+}

+ 19 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodCompanyMapper.java

@@ -5,6 +5,9 @@ import com.fs.course.domain.FsUserCoursePeriodCompany;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.util.List;
+import java.util.Map;
+
 public interface FsUserCoursePeriodCompanyMapper extends BaseMapper<FsUserCoursePeriodCompany> {
 
     /**
@@ -12,9 +15,25 @@ public interface FsUserCoursePeriodCompanyMapper extends BaseMapper<FsUserCourse
      */
     void saveOrUpdate(@Param("periodId") Long periodId, @Param("companyId") Long companyId, @Param("state") Integer state);
 
+    /**
+     * 修改营期公司注册链接开关状态
+     */
+    void updateRegistrationSwitch(@Param("periodId") Long periodId, @Param("companyId") Long companyId, @Param("state") Integer state);
+
     /**
      * 根据营期ID和公司ID查询红包配置
      */
     @Select("select * from fs_user_course_period_company where period_id = #{periodId} and company_id = #{companyId}")
     FsUserCoursePeriodCompany selectByPeriodIdAndCompanyId(@Param("periodId") Long periodId, @Param("companyId") Long companyId);
+
+    /**
+     * 根据营期id 查询注册链接开关状态
+     */
+    @Select("select open_registration_switch from fs_user_course_period_company where period_id = #{periodId}")
+    List< Integer> selectRegistrationSwitchByPeriodId(@Param("periodId") Long periodId);
+
+    /**
+     * 批量查询多个营期ID的注册链接开关状态
+     */
+    List<Map<String, Object>> selectRegistrationSwitchByPeriodIds(@Param("periodIds") List<Long> periodIds);
 }

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

@@ -36,6 +36,8 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
      */
     List<FsUserCoursePeriodDays> selectFsUserCoursePeriodDaysList(FsUserCoursePeriodDays fsUserCoursePeriodDays);
 
+    List<FsUserCoursePeriodDays> selectDaysListByPeriodIdAndCourseId(@Param("periodId") Long periodId, @Param("courseId") Long courseId);
+
     /**
      * 新增营期课程
      *

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/CompanyRedPacketParam.java

@@ -24,5 +24,8 @@ public class CompanyRedPacketParam implements Serializable {
 
     // 是否开启红包 0关闭 1开启
     private Integer openRedPacket;
+    
+    // 是否开启注册开关 0关闭 1开启
+    private  Integer openRegistrationSwitch;
 
 }

+ 10 - 0
fs-service/src/main/java/com/fs/course/param/PeriodStatisticCountParam.java

@@ -28,5 +28,15 @@ public class PeriodStatisticCountParam implements Serializable {
      */
     private Long userId;
 
+    /**
+     * 销售Id
+     */
+    private  Long salesId;
+
+    /**
+     * 营期课程小节id
+     */
+    private Long id;
+
 }
 

+ 5 - 0
fs-service/src/main/java/com/fs/course/param/newfs/FsUserCourseAddCompanyUserParam.java

@@ -37,4 +37,9 @@ public class FsUserCourseAddCompanyUserParam implements Serializable {
     @ApiModelProperty(value = "项目ID")
     private Long projectId;
     private Integer isOpenCourse;
+
+    /**
+     * 营期课程id
+     */
+    private Long id;
 }

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

@@ -0,0 +1,14 @@
+package com.fs.course.service;
+
+public interface IFsSalesUserPeriodRelationService {
+
+    /**
+     * 建立销售-用户-营期关系
+     *
+     * @param salesId 销售ID
+     * @param userId 用户ID
+     * @param periodId 营期ID
+     * @return 结果
+     */
+   int bindSalesUserPeriod(Long salesId, Long userId, Long periodId,Long daysId);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodCompanyService.java

@@ -10,4 +10,9 @@ public interface IFsUserCoursePeriodCompanyService extends IService<FsUserCourse
      * 修改营期公司红包状态
      */
     void changeRedPacketState(Long periodId, Long companyId, Integer state);
+
+    /**
+     * 修改营期公司报名开关状态
+     */
+    void  changeRegistrationSwitchState(Long periodId, Long companyId, Integer state);
 }

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

@@ -52,6 +52,13 @@ public interface IFsUserCoursePeriodDaysService extends IService<FsUserCoursePer
      */
     int updateFsUserCoursePeriodDays(FsUserCoursePeriodDays fsUserCoursePeriodDays);
 
+    /**
+     * 是否显示分享链接按钮
+     * @param id
+     * @return
+     */
+    boolean isShowShare(Long id);
+
     /**
      * 批量删除营期课程
      *

+ 7 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodCompanyServiceImpl.java

@@ -21,4 +21,11 @@ public class FsUserCoursePeriodCompanyServiceImpl extends ServiceImpl<FsUserCour
             baseMapper.saveOrUpdate(periodId, companyId, state);
         }
     }
+
+    @Override
+    public void changeRegistrationSwitchState(Long periodId, Long companyId, Integer state) {
+        if (periodId != null && companyId != null && Arrays.asList(0, 1).contains(state)) {
+            baseMapper.updateRegistrationSwitch(periodId, companyId, state);
+        }
+    }
 }

+ 66 - 40
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.course.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
@@ -13,6 +14,7 @@ import com.fs.company.domain.CompanyDomain;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.mapper.FsUserCoursePeriodCompanyMapper;
 import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
 import com.fs.course.mapper.FsUserCoursePeriodMapper;
 import com.fs.course.mapper.FsUserCourseVideoRedPackageMapper;
@@ -65,8 +67,11 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
     private final FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
     private final IFsUserCourseVideoService fsUserCourseVideoService;
 
+    private final FsUserCoursePeriodCompanyMapper fsUserCoursePeriodCompanyMapper;
+
     @Autowired
     private FsUserCourseVideoRedPackageMapper fsUserCourseVideoRedPackageMapper;
+
     /**
      * 查询营期课程
      *
@@ -74,8 +79,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 营期课程
      */
     @Override
-    public FsUserCoursePeriodDays selectFsUserCoursePeriodDaysById(Long id)
-    {
+    public FsUserCoursePeriodDays selectFsUserCoursePeriodDaysById(Long id) {
         return baseMapper.selectFsUserCoursePeriodDaysById(id);
     }
 
@@ -86,8 +90,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 营期课程
      */
     @Override
-    public List<FsUserCoursePeriodDays> selectFsUserCoursePeriodDaysList(FsUserCoursePeriodDays fsUserCoursePeriodDays)
-    {
+    public List<FsUserCoursePeriodDays> selectFsUserCoursePeriodDaysList(FsUserCoursePeriodDays fsUserCoursePeriodDays) {
         return baseMapper.selectFsUserCoursePeriodDaysList(fsUserCoursePeriodDays);
     }
 
@@ -98,8 +101,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 结果
      */
     @Override
-    public int insertFsUserCoursePeriodDays(FsUserCoursePeriodDays fsUserCoursePeriodDays)
-    {
+    public int insertFsUserCoursePeriodDays(FsUserCoursePeriodDays fsUserCoursePeriodDays) {
         fsUserCoursePeriodDays.setCreateTime(DateUtils.getNowDate());
         return baseMapper.insert(fsUserCoursePeriodDays);
     }
@@ -111,12 +113,25 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 结果
      */
     @Override
-    public int updateFsUserCoursePeriodDays(FsUserCoursePeriodDays fsUserCoursePeriodDays)
-    {
+    public int updateFsUserCoursePeriodDays(FsUserCoursePeriodDays fsUserCoursePeriodDays) {
         fsUserCoursePeriodDays.setUpdateTime(DateUtils.getNowDate());
         return baseMapper.updateById(fsUserCoursePeriodDays);
     }
 
+    @Override
+    public boolean isShowShare(Long id) {
+        FsUserCoursePeriodDays fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysById(id);
+        if (fsUserCoursePeriodDays == null) {
+            throw new RuntimeException("营期课程不存在");
+        }
+        Integer registrationSwitch = fsUserCoursePeriodDays.getRegistrationSwitch();
+        List<Integer> selected = fsUserCoursePeriodCompanyMapper.selectRegistrationSwitchByPeriodId(fsUserCoursePeriodDays.getPeriodId());
+        if (CollectionUtils.isEmpty(selected)) {
+            throw new RuntimeException("营期公司未选择");
+        }
+        return (registrationSwitch == 1) && selected.contains(1);
+    }
+
     /**
      * 批量删除营期课程
      *
@@ -124,17 +139,16 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 结果
      */
     @Override
-    public int deleteFsUserCoursePeriodDaysByIds(Long[] ids)
-    {
+    public int deleteFsUserCoursePeriodDaysByIds(Long[] ids) {
         int flag = 0;
         List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectBatchIds(Arrays.asList(ids));
         List<Long> periodDayIds = fsUserCoursePeriodDays.stream().map(FsUserCoursePeriodDays::getId).collect(Collectors.toList());
         List<Long> getPeriodIds = fsUserCoursePeriodDays.stream().map(FsUserCoursePeriodDays::getPeriodId).collect(Collectors.toList());
         List<Long> videoIds = fsUserCoursePeriodDays.stream().map(FsUserCoursePeriodDays::getVideoId).collect(Collectors.toList());
-        if(!periodDayIds.isEmpty()){
-            flag = fsUserCoursePeriodDaysMapper.updateBatchDelFlag(periodDayIds.toArray(new Long[0]),1);
+        if (!periodDayIds.isEmpty()) {
+            flag = fsUserCoursePeriodDaysMapper.updateBatchDelFlag(periodDayIds.toArray(new Long[0]), 1);
             //删除红包记录
-            fsUserCourseVideoRedPackageMapper.deleteFsUserCourseVideoRedPackageByVedioIds(videoIds.toArray(new Long[0]),getPeriodIds.toArray(new Long[0]));
+            fsUserCourseVideoRedPackageMapper.deleteFsUserCourseVideoRedPackageByVedioIds(videoIds.toArray(new Long[0]), getPeriodIds.toArray(new Long[0]));
         }
         return flag;
     }
@@ -146,24 +160,24 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
      * @return 结果
      */
     @Override
-    public int deleteFsUserCoursePeriodDaysById(Long id)
-    {
+    public int deleteFsUserCoursePeriodDaysById(Long id) {
         return baseMapper.deleteFsUserCoursePeriodDaysById(id);
     }
 
     @Override
     public R addCourse(FsUserCoursePeriodDays entity) {
         FsUserCoursePeriod period = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(entity.getPeriodId());
-        List<FsUserCoursePeriodDays> dayList = list(new QueryWrapper<FsUserCoursePeriodDays>().eq("period_id", period.getPeriodId()).eq("del_flag","0"));
+        List<FsUserCoursePeriodDays> dayList = list(new QueryWrapper<FsUserCoursePeriodDays>().eq("period_id", period.getPeriodId()).eq("del_flag", "0"));
         long days;
-        if(period.getPeriodType() == 2){
+        if (period.getPeriodType() == 2) {
             days = 1;
-        }else{
+        } else {
             days = DateUtil.differenceTime(period.getPeriodStartingTime(), period.getPeriodEndTime(), TimeTypeEnum.DAY);
         }
         days++;
-        if(dayList.size() + entity.getVideoIds().size() > days) return R.error("课程不能超过营期范围");
-        if(dayList.stream().anyMatch(e -> entity.getVideoIds().contains(e.getVideoId()))) return R.error("不能添加相同章节");
+        if (dayList.size() + entity.getVideoIds().size() > days) return R.error("课程不能超过营期范围");
+        if (dayList.stream().anyMatch(e -> entity.getVideoIds().contains(e.getVideoId())))
+            return R.error("不能添加相同章节");
         AtomicInteger i = new AtomicInteger(0);
         FsUserCourseVideo fsUserCourseVideo = new FsUserCourseVideo();
         fsUserCourseVideo.setCourseId(entity.getCourseId());
@@ -176,30 +190,35 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             day.setLesson(dayList.size() + i.getAndIncrement());
             day.setDayDate(period.getPeriodStartingTime().plusDays(day.getLesson()));
             day.setCourseId(entity.getCourseId());
-            if(entity.getStartTime() != null){
+            if (entity.getStartTime() != null) {
                 day.setStartDateTime(LocalDateTime.of(day.getDayDate(), entity.getStartTime()));
-            }else if(video.getViewStartTime() != null){
+            } else if (video.getViewStartTime() != null) {
                 day.setStartDateTime(LocalDateTime.of(day.getDayDate(), video.getViewStartTime()));
             }
-            if(entity.getEndTime1() != null){
+            if (entity.getEndTime1() != null) {
                 day.setEndDateTime(LocalDateTime.of(day.getDayDate(), entity.getEndTime1()));
-            }else if(video.getViewEndTime() != null){
+            } else if (video.getViewEndTime() != null) {
                 day.setEndDateTime(LocalDateTime.of(day.getDayDate(), video.getViewEndTime()));
             }
             SysConfig config = sysConfigMapper.selectConfigByConfigKey("joinTime.switch.config");
-            if (ObjectUtils.isNotEmpty(config)&&config.getConfigValue().equals("1")){
+            if (ObjectUtils.isNotEmpty(config) && config.getConfigValue().equals("1")) {
                 entity.setJoinTime(entity.getEndTime1());
             }
-            if(entity.getJoinTime() != null){
+            if (entity.getJoinTime() != null) {
                 day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), entity.getJoinTime()));
-            }else if(video.getLastJoinTime() != null){
+            } else if (video.getLastJoinTime() != null) {
                 day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), video.getLastJoinTime()));
             }
             day.setVideoId(e);
             day.setCreateTime(new Date());
+            if (entity.getNoRegisterVideoIds() != null && entity.getNoRegisterVideoIds().contains(e)) {
+                day.setRegistrationSwitch(0);
+            } else {
+                day.setRegistrationSwitch(1);
+            }
             // 默认开启今天及以后的两天
             LocalDate compareDay = LocalDate.now().plusDays(1);
-            if(day.getDayDate().isBefore(compareDay)){
+            if (day.getDayDate().isBefore(compareDay)) {
                 day.setStatus(1);
             } else {
                 day.setStatus(0);
@@ -224,7 +243,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
 
     @Override
     public List<CompanyRedPacketParam> getCompanyByPeriod(Long periodId, Long videoId) {
-        if(videoId == null ){
+        if (videoId == null) {
             return fsUserCoursePeriodMapper.selectCompanyByPeriod(periodId);
         }
         return fsUserCoursePeriodMapper.selectCompanyByPeriodVideo(periodId, videoId);
@@ -251,6 +270,8 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         courseAnalysisParam.setVideoIdList(param.getVideoIdList());
         courseAnalysisParam.setCompanyId(param.getCompanyId());
         courseAnalysisParam.setCompanyUserIds(param.getCompanyUserIds());
+        //查询营期维度的看课人数和完课人数
+        FsPeriodCountVO fsPeriodCountVO = fsUserMapper.selectFsPeriodCountVO(courseAnalysisParam);
         List<FsCourseAnalysisCountVO> courseCountList = fsUserMapper.courseAnalysisWatchLog(courseAnalysisParam);
         List<FsCourseAnalysisCountVO> redPacketCountList = fsUserMapper.courseAnalysisRedPacketCount(courseAnalysisParam);
         List<FsCourseAnalysisCountVO> answerCountList = fsUserMapper.courseAnalysisAnswerCount(courseAnalysisParam);
@@ -277,7 +298,10 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             FsPeriodCountVO allVO = new FsPeriodCountVO();
             BeanUtils.copyProperties(v, allVO);
             allVO.setTitle(v.getVideoName());
-
+            if(fsPeriodCountVO != null){
+                allVO.setCoursePeriodWatchNum(fsPeriodCountVO.getCoursePeriodWatchNum());
+                allVO.setCoursePeriodCompleteNum(fsPeriodCountVO.getCoursePeriodCompleteNum());
+            }
             FsCourseAnalysisCountVO countVO = getCourseAnalysisCountVO(v, courseMap, redPacketMap, answerMap);
             allVO.setCountDetailsVO(countVO);
             return allVO;
@@ -355,9 +379,9 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             day.setEndDateTime(vo.getEndTime1());
 
             SysConfig config = sysConfigMapper.selectConfigByConfigKey("joinTime.switch.config");
-            if (ObjectUtils.isNotEmpty(config)&&config.getConfigValue().equals("1")){
+            if (ObjectUtils.isNotEmpty(config) && config.getConfigValue().equals("1")) {
                 day.setLastJoinTime(vo.getEndTime1());
-            }else {
+            } else {
                 day.setLastJoinTime(vo.getJoinTime());
             }
 
@@ -365,9 +389,9 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             day.setDayDate(vo.getStartTime().toLocalDate());
             // 设置状态
             LocalDateTime compareDayTime = LocalDateTime.now();
-            if(compareDayTime.isAfter(day.getStartDateTime()) && compareDayTime.isBefore(day.getEndDateTime())){
+            if (compareDayTime.isAfter(day.getStartDateTime()) && compareDayTime.isBefore(day.getEndDateTime())) {
                 day.setStatus(1);
-            } else if(compareDayTime.isBefore(day.getStartDateTime())){
+            } else if (compareDayTime.isBefore(day.getStartDateTime())) {
                 day.setStatus(0);
             } else {
                 day.setStatus(2);
@@ -381,14 +405,15 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
     public R updateCourseDate(UpdateCourseTimeVo vo) {
         FsUserCoursePeriodDays day = getById(vo.getId());
         FsUserCoursePeriod period = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(day.getPeriodId());
-        if(!DateUtil.isWithinRangeSafe(vo.getDayDate(), period.getPeriodStartingTime(), period.getPeriodEndTime())) return R.error("时间不在营期范围内");
+        if (!DateUtil.isWithinRangeSafe(vo.getDayDate(), period.getPeriodStartingTime(), period.getPeriodEndTime()))
+            return R.error("时间不在营期范围内");
         day.setDayDate(vo.getDayDate());
         day.setStartDateTime(LocalDateTime.of(day.getDayDate(), day.getStartDateTime().toLocalTime()));
         day.setEndDateTime(LocalDateTime.of(day.getDayDate(), day.getEndDateTime().toLocalTime()));
         day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), day.getLastJoinTime().toLocalTime()));
         // 默认开启今天及以后的两天,为进行中
         LocalDate compareDay = LocalDate.now().plusDays(1);
-        if(day.getDayDate().isBefore(compareDay)){
+        if (day.getDayDate().isBefore(compareDay)) {
             day.setStatus(1);
         } else {
             day.setStatus(0);
@@ -423,7 +448,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
 
     @Override
     public List<Long> selectFsUserCoursePeriodDaysByTime(String periodSTime, String periodETime) {
-        return fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysByTime(periodSTime,periodETime);
+        return fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysByTime(periodSTime, periodETime);
     }
 
     private static FsCourseAnalysisCountVO getCourseAnalysisCountVO(FsUserCoursePeriodDays v, Map<Long, FsCourseAnalysisCountVO> courseMap, Map<Long, FsCourseAnalysisCountVO> redPacketMap, Map<Long, FsCourseAnalysisCountVO> answerMap) {
@@ -438,15 +463,16 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         countVO.setRedPacketNum(redPacketVO.getRedPacketNum())
                 .setRedPacketAmount(redPacketVO.getRedPacketAmount() != null ? redPacketVO.getRedPacketAmount() : new BigDecimal(BigInteger.ZERO));
         countVO.setAnswerNum(answerVO.getAnswerNum()).setAnswerRightNum(answerVO.getAnswerRightNum())
-                .setAnswerRightRate(answerVO.getAnswerRightRate()!=null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO))
+                .setAnswerRightRate(answerVO.getAnswerRightRate() != null ? answerVO.getAnswerRightRate() : new BigDecimal(BigInteger.ZERO))
                 .setAnswerTimes(answerVO.getAnswerTimes()).setAnswerRightTimes(answerVO.getAnswerRightTimes());
         return countVO;
     }
 
     /**
      * 查询营期选项列表
-     * @param params    参数
-     * @return  list
+     *
+     * @param params 参数
+     * @return list
      */
     @Override
     public List<OptionsVO> selectPeriodListByMap(Map<String, Object> params) {

File diff suppressed because it is too large
+ 191 - 194
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java


+ 51 - 0
fs-service/src/main/java/com/fs/course/service/impl/IFsSalesUserPeriodRelationServiceImpl.java

@@ -0,0 +1,51 @@
+package com.fs.course.service.impl;
+
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.course.domain.FsSalesUserPeriodRelation;
+import com.fs.course.mapper.FsSalesUserPeriodRelationMapper;
+import com.fs.course.service.IFsSalesUserPeriodRelationService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class IFsSalesUserPeriodRelationServiceImpl implements IFsSalesUserPeriodRelationService {
+
+    private final FsSalesUserPeriodRelationMapper fsSalesUserPeriodRelationMapper;
+
+    private final CompanyUserMapper companyUserMapper;
+
+    @Override
+    public int bindSalesUserPeriod(Long salesId, Long userId, Long periodId,Long daysId) {
+
+        List<FsSalesUserPeriodRelation> existingRelations = fsSalesUserPeriodRelationMapper.selectByUserAndPeriod(userId, periodId);
+        if (!existingRelations.isEmpty()) {
+            // 检查是否是同一个销售
+            boolean isSameSales = existingRelations.stream()
+                    .anyMatch(relation -> relation.getSalesId().equals(salesId));
+
+            if (!isSameSales) {
+                CompanyUser companyUser = companyUserMapper.selectCompanyUserById(salesId);
+                String nickName = "";
+                if (companyUser != null) {
+                    nickName = companyUser.getNickName();
+                }
+                throw new RuntimeException("该用户已被" + nickName + "销售绑定,无法重复绑定");
+            }
+        }
+        //创建新的绑定关系
+        FsSalesUserPeriodRelation relation = new FsSalesUserPeriodRelation();
+        relation.setSalesId(salesId);
+        relation.setUserId(userId);
+        relation.setPeriodId(periodId);
+        relation.setDaysId(daysId);
+        relation.setBindTime(LocalDateTime.now());
+        return fsSalesUserPeriodRelationMapper.insertFsSalesUserPeriodRelation(relation);
+    }
+}
+
+

+ 12 - 0
fs-service/src/main/java/com/fs/course/vo/FsPeriodCountVO.java

@@ -28,4 +28,16 @@ public class FsPeriodCountVO {
     @ApiModelProperty(value = "统计明细")
     private FsCourseAnalysisCountVO countDetailsVO;
 
+    /**
+     * 营期观看人数
+     */
+    @ApiModelProperty(value = "营期观看人数")
+    private int coursePeriodWatchNum;
+
+    /**
+     * 营期完播人数
+     */
+    @ApiModelProperty(value = "营期完播人数")
+    private int coursePeriodCompleteNum;
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java

@@ -69,4 +69,9 @@ public class FsUserCourseVideoPageListVO extends BaseEntity {
     @ApiModelProperty(value = "项目名称")
     private String projectName;
 
+    /**
+     * 是否注册链接
+     */
+    private  boolean registerLink;
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -6,6 +6,7 @@ import java.util.Map;
 import com.fs.course.domain.FsUserWatchCourseStatistics;
 import com.fs.course.domain.FsUserWatchStatistics;
 import com.fs.course.param.CourseAnalysisParam;
+import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.his.domain.FsUser;
 import com.fs.his.dto.FindUsersByDTO;
@@ -262,6 +263,7 @@ public interface FsUserMapper
     List<FsCourseAnalysisCountVO> courseAnalysisRedPacketCount(CourseAnalysisParam param);
     List<FsCourseAnalysisCountVO> courseAnalysisAnswerCount(CourseAnalysisParam param);
 
+    FsPeriodCountVO selectFsPeriodCountVO(CourseAnalysisParam param);
     FsUser selectFsUserById(@Param("userId") Long userId);
 
     int batchUpdateFsUserByIds(@Param("ids") String[] ids, @Param("status") Integer status);

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

@@ -1472,7 +1472,7 @@ FROM
             </when>
         </choose>
         COUNT(DISTINCT CASE WHEN log_type = 3 THEN user_id END) AS pendingCount,
-        COUNT(DISTINCT CASE WHEN log_type = 1 THEN user_id END) AS watchingCount,
+        COUNT(DISTINCT CASE WHEN log_type != 3 THEN user_id END) AS watchingCount,
         COUNT(DISTINCT CASE WHEN log_type = 2 THEN user_id END) AS finishedCount,
         COUNT(DISTINCT CASE WHEN log_type = 4 THEN user_id END) AS interruptedCount,
         COUNT(DISTINCT user_id) AS accessCount

+ 103 - 0
fs-service/src/main/resources/mapper/course/FsSalesUserPeriodRelationMapper.xml

@@ -0,0 +1,103 @@
+<?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.FsSalesUserPeriodRelationMapper">
+
+    <resultMap type="FsSalesUserPeriodRelation" id="FsSalesUserPeriodRelationResult">
+        <result property="id" column="id"/>
+        <result property="salesId" column="sales_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="periodId" column="period_id"/>
+        <result property="daysId" column="days_id"/>
+        <result property="bindTime" column="bind_time"/>
+    </resultMap>
+
+    <sql id="selectFsSalesUserPeriodRelationVo">
+        select id, sales_id, user_id, period_id, days_id, bind_time from fs_sales_user_period_relation
+    </sql>
+
+    <select id="selectFsSalesUserPeriodRelationList" parameterType="FsSalesUserPeriodRelation" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        <where>
+            <if test="salesId != null "> and sales_id = #{salesId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="periodId != null "> and period_id = #{periodId}</if>
+            <if test="daysId != null "> and days_id = #{daysId}</if>
+        </where>
+    </select>
+
+    <select id="selectFsSalesUserPeriodRelationById" parameterType="Long" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectBySalesUserPeriod" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        where sales_id = #{salesId} and user_id = #{userId} and period_id = #{periodId}
+    </select>
+
+    <select id="selectBySalesUserPeriodAndDays" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        where sales_id = #{salesId} and user_id = #{userId} and period_id = #{periodId} and days_id = #{daysId}
+    </select>
+
+    <select id="selectByUserAndPeriod" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        where user_id = #{userId} and period_id = #{periodId}
+    </select>
+
+    <select id="selectByUserPeriodAndDays" resultMap="FsSalesUserPeriodRelationResult">
+        <include refid="selectFsSalesUserPeriodRelationVo"/>
+        where user_id = #{userId} and period_id = #{periodId} and days_id = #{daysId}
+    </select>
+
+    <insert id="insertFsSalesUserPeriodRelation" parameterType="FsSalesUserPeriodRelation" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_sales_user_period_relation
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="salesId != null">sales_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="periodId != null">period_id,</if>
+            <if test="daysId != null">days_id,</if>
+            <if test="bindTime != null">bind_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="salesId != null">#{salesId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="periodId != null">#{periodId},</if>
+            <if test="daysId != null">#{daysId},</if>
+            <if test="bindTime != null">#{bindTime},</if>
+        </trim>
+        ON DUPLICATE KEY UPDATE
+        <trim suffixOverrides=",">
+            <if test="salesId != null">sales_id = #{salesId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
+            <if test="daysId != null">days_id = #{daysId},</if>
+            <if test="bindTime != null">bind_time = #{bindTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateFsSalesUserPeriodRelation" parameterType="FsSalesUserPeriodRelation">
+        update fs_sales_user_period_relation
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="salesId != null">sales_id = #{salesId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
+            <if test="daysId != null">days_id = #{daysId},</if>
+            <if test="bindTime != null">bind_time = #{bindTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsSalesUserPeriodRelationById" parameterType="Long">
+        delete from fs_sales_user_period_relation where id = #{id}
+    </delete>
+
+    <delete id="deleteFsSalesUserPeriodRelationByIds" parameterType="Long">
+        delete from fs_sales_user_period_relation where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 13 - 0
fs-service/src/main/resources/mapper/course/FsUserCoursePeriodCompanyMapper.xml

@@ -12,4 +12,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         on duplicate key update
             open_red_packet = VALUES(open_red_packet)
     </insert>
+    <update id="updateRegistrationSwitch">
+        INSERT INTO fs_user_course_period_company (period_id, company_id, open_registration_switch)
+        VALUES (#{periodId}, #{companyId}, #{state})
+            ON DUPLICATE KEY UPDATE open_registration_switch = VALUES(open_registration_switch)
+    </update>
+    <select id="selectRegistrationSwitchByPeriodIds" resultType="java.util.Map">
+        SELECT period_id, open_registration_switch
+        FROM fs_user_course_period_company
+        WHERE period_id IN
+        <foreach collection="periodIds" item="periodId" open="(" separator="," close=")">
+            #{periodId}
+        </foreach>
+    </select>
 </mapper>

+ 5 - 1
fs-service/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml

@@ -19,6 +19,7 @@
         <result property="updateBy"    column="update_by"    />
         <result property="updateTime"    column="update_time"    />
         <result property="remark"    column="remark"    />
+        <result property="registrationSwitch"    column="registration_switch"    />
     </resultMap>
 
     <sql id="selectFsUserCoursePeriodDaysVo">
@@ -64,7 +65,7 @@
     </select>
     <select id="selectFsUserCoursePeriodDaysById" parameterType="Long" resultMap="FsUserCoursePeriodDaysResult">
         <include refid="selectFsUserCoursePeriodDaysVo"/>
-        where id = #{id}
+        where id = #{id} and del_flag ='0'
     </select>
 
     <insert id="insertFsUserCoursePeriodDays" parameterType="FsUserCoursePeriodDays" useGeneratedKeys="true" keyProperty="id">
@@ -239,4 +240,7 @@
         ORDER BY
             a.day_date
     </select>
+    <select id="selectDaysListByPeriodIdAndCourseId" resultType="com.fs.course.domain.FsUserCoursePeriodDays">
+        select * from fs_user_course_period_days where del_flag ='0' and period_id = #{periodId} and course_id = #{courseId}
+    </select>
 </mapper>

+ 2 - 1
fs-service/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml

@@ -204,7 +204,8 @@
         SELECT
             company.company_id,
             company.company_name,
-            IF(ucpc.open_red_packet is null, 1, ucpc.open_red_packet) openRedPacket
+            IF(ucpc.open_red_packet is null, 1, ucpc.open_red_packet) openRedPacket,
+            IF(ucpc.open_registration_switch is null, 0, ucpc.open_registration_switch) openRegistrationSwitch
         FROM
             company
                 LEFT JOIN fs_user_course_period fcp ON FIND_IN_SET ( company.company_id, fcp.company_id ) > 0

+ 20 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2332,6 +2332,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{userId}
         </foreach>
     </select>
+    <select id="selectFsPeriodCountVO" resultType="com.fs.course.vo.FsPeriodCountVO">
+        SELECT
+            COUNT(DISTINCT IF(log_type != 3, user_id, NULL)) AS coursePeriodWatchNum,
+            COUNT(DISTINCT CASE WHEN log_type = 2 THEN user_id END) AS coursePeriodCompleteNum
+        FROM fs_course_watch_log
+        <where>
+            <if test="companyId != null">
+                AND company_id = #{companyId}
+            </if>
+            <if test="periodId != null">
+                AND period_id = #{periodId}
+            </if>
+            <if test="companyUserIds != null and companyUserIds.size > 0">
+                AND company_user_id in
+                <foreach collection="companyUserIds" open="(" close=")" separator="," item="companyUserId">
+                    #{companyUserId}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
 
 </mapper>

+ 23 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

@@ -7,6 +7,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.app.annotation.UserOperationLog;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.annotation.RepeatSubmit;
+import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.app.annotation.Login;
@@ -53,6 +54,9 @@ public class CourseFsUserController extends AppBaseController {
     @Autowired
     private IFsCourseQuestionBankService questionBankService;
 
+    @Autowired
+    private  IFsSalesUserPeriodRelationService salesUserPeriodRelationService;
+
 
 
     @Login
@@ -66,6 +70,25 @@ public class CourseFsUserController extends AppBaseController {
         return courseVideoService.isAddCompanyUser(param);
     }
 
+    /**
+     * 销售分享营期给用户(建立销售-用户-营期关系)
+     *
+     * @return 结果
+     */
+    @PostMapping("/bindPeriodToUser")
+    public AjaxResult bindPeriodToUser(@RequestBody PeriodStatisticCountParam param) {
+        try {
+            int result = salesUserPeriodRelationService.bindSalesUserPeriod(param.getSalesId(), param.getUserId(), param.getPeriodId(),param.getId());
+            if (result > 0) {
+                return AjaxResult.success("绑定成功");
+            } else {
+                return AjaxResult.error("绑定失败");
+            }
+        } catch (Exception e) {
+            return AjaxResult.error("绑定异常: " + e.getMessage());
+        }
+    }
+
     /**
      * 绑定关系
      *

Some files were not shown because too many files changed in this diff