吴树波 před 2 týdny
rodič
revize
952e194403
23 změnil soubory, kde provedl 708 přidání a 70 odebrání
  1. 97 0
      fs-admin/src/main/java/com/fs/course/controller/FsCourseFinishTempParentController.java
  2. 12 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysDictTypeController.java
  3. 4 2
      fs-admin/src/main/resources/application.yml
  4. 1 1
      fs-company/src/main/java/com/fs/course/controller/FsCourseFinishTempController.java
  5. 105 0
      fs-company/src/main/java/com/fs/course/controller/FsCourseFinishTempParentController.java
  6. 2 0
      fs-company/src/main/resources/application.yml
  7. 1 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseFinishTemp.java
  8. 48 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseFinishTempParent.java
  9. 20 23
      fs-service-system/src/main/java/com/fs/course/mapper/FsCourseFinishTempMapper.java
  10. 62 0
      fs-service-system/src/main/java/com/fs/course/mapper/FsCourseFinishTempParentMapper.java
  11. 62 0
      fs-service-system/src/main/java/com/fs/course/service/IFsCourseFinishTempParentService.java
  12. 4 1
      fs-service-system/src/main/java/com/fs/course/service/IFsCourseFinishTempService.java
  13. 123 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseFinishTempParentServiceImpl.java
  14. 12 16
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseFinishTempServiceImpl.java
  15. 18 3
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  16. 2 2
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  17. 6 0
      fs-service-system/src/main/java/com/fs/system/service/ISysDictTypeService.java
  18. 22 6
      fs-service-system/src/main/java/com/fs/system/service/impl/SysDictTypeServiceImpl.java
  19. 5 0
      fs-service-system/src/main/java/com/fs/wx/mp/config/WxMpConfiguration.java
  20. 1 1
      fs-service-system/src/main/resources/application-config-dev.yml
  21. 1 1
      fs-service-system/src/main/resources/application-config-zkzh.yml
  22. 17 14
      fs-service-system/src/main/resources/mapper/course/FsCourseFinishTempMapper.xml
  23. 83 0
      fs-service-system/src/main/resources/mapper/course/FsCourseFinishTempParentMapper.xml

+ 97 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCourseFinishTempParentController.java

@@ -0,0 +1,97 @@
+package com.fs.course.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.course.domain.FsCourseFinishTempParent;
+import com.fs.course.service.IFsCourseFinishTempParentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 完课模板Controller
+ * 
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+@RestController
+@RequestMapping("/course/courseFinishTempParent")
+public class FsCourseFinishTempParentController extends BaseController
+{
+    @Autowired
+    private IFsCourseFinishTempParentService fsCourseFinishTempParentService;
+
+    /**
+     * 查询完课模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        startPage();
+        List<FsCourseFinishTempParent> list = fsCourseFinishTempParentService.selectFsCourseFinishTempParentList(fsCourseFinishTempParent);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出完课模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:export')")
+    @Log(title = "完课模板", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        List<FsCourseFinishTempParent> list = fsCourseFinishTempParentService.selectFsCourseFinishTempParentList(fsCourseFinishTempParent);
+        ExcelUtil<FsCourseFinishTempParent> util = new ExcelUtil<FsCourseFinishTempParent>(FsCourseFinishTempParent.class);
+        return util.exportExcel(list, "完课模板数据");
+    }
+
+    /**
+     * 获取完课模板详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsCourseFinishTempParentService.selectFsCourseFinishTempParentById(id));
+    }
+
+    /**
+     * 新增完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:add')")
+    @Log(title = "完课模板", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsCourseFinishTempParent fsCourseFinishTempParent){
+
+        return toAjax(fsCourseFinishTempParentService.insertFsCourseFinishTempParent(fsCourseFinishTempParent));
+    }
+
+    /**
+     * 修改完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:edit')")
+    @Log(title = "完课模板", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        return toAjax(fsCourseFinishTempParentService.updateFsCourseFinishTempParent(fsCourseFinishTempParent));
+    }
+
+    /**
+     * 删除完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:remove')")
+    @Log(title = "完课模板", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsCourseFinishTempParentService.deleteFsCourseFinishTempParentByIds(ids));
+    }
+}

+ 12 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysDictTypeController.java

@@ -128,4 +128,16 @@ public class SysDictTypeController extends BaseController
         List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
         return AjaxResult.success(dictTypes);
     }
+
+    /**
+     * 刷新字典缓存
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public AjaxResult refreshCache()
+    {
+        dictTypeService.resetDictCache();
+        return AjaxResult.success();
+    }
 }

+ 4 - 2
fs-admin/src/main/resources/application.yml

@@ -5,5 +5,7 @@ server:
   port: 7011
 spring:
   profiles:
-    active: druid-fby
-    include: common,config-fby
+    active: dev
+    include: common,config-dev
+#    active: druid-fby
+#    include: common,config-fby

+ 1 - 1
fs-company/src/main/java/com/fs/course/controller/FsCourseFinishTempController.java

@@ -6,9 +6,9 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.core.security.LoginUser;
 import com.fs.core.security.SecurityUtils;
 import com.fs.course.domain.FsCourseFinishTemp;
-import com.fs.core.security.LoginUser;
 import com.fs.course.service.IFsCourseFinishTempService;
 import com.fs.course.vo.FsCourseFinishTempListVO;
 import org.springframework.beans.factory.annotation.Autowired;

+ 105 - 0
fs-company/src/main/java/com/fs/course/controller/FsCourseFinishTempParentController.java

@@ -0,0 +1,105 @@
+package com.fs.course.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.core.security.LoginUser;
+import com.fs.core.security.SecurityUtils;
+import com.fs.course.domain.FsCourseFinishTempParent;
+import com.fs.course.service.IFsCourseFinishTempParentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 完课模板Controller
+ * 
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+@RestController
+@RequestMapping("/course/courseFinishTempParent")
+public class FsCourseFinishTempParentController extends BaseController
+{
+    @Autowired
+    private IFsCourseFinishTempParentService fsCourseFinishTempParentService;
+
+    /**
+     * 查询完课模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        startPage();
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        fsCourseFinishTempParent.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<FsCourseFinishTempParent> list = fsCourseFinishTempParentService.selectFsCourseFinishTempParentList(fsCourseFinishTempParent);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出完课模板列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:export')")
+    @Log(title = "完课模板", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        List<FsCourseFinishTempParent> list = fsCourseFinishTempParentService.selectFsCourseFinishTempParentList(fsCourseFinishTempParent);
+        ExcelUtil<FsCourseFinishTempParent> util = new ExcelUtil<FsCourseFinishTempParent>(FsCourseFinishTempParent.class);
+        return util.exportExcel(list, "完课模板数据");
+    }
+
+    /**
+     * 获取完课模板详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(fsCourseFinishTempParentService.selectFsCourseFinishTempParentById(id));
+    }
+
+    /**
+     * 新增完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:add')")
+    @Log(title = "完课模板", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsCourseFinishTempParent fsCourseFinishTempParent){
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        fsCourseFinishTempParent.setCompanyId(loginUser.getCompany().getCompanyId());
+        return toAjax(fsCourseFinishTempParentService.insertFsCourseFinishTempParent(fsCourseFinishTempParent));
+    }
+
+    /**
+     * 修改完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:edit')")
+    @Log(title = "完课模板", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        fsCourseFinishTempParent.setCompanyId(loginUser.getCompany().getCompanyId());
+        return toAjax(fsCourseFinishTempParentService.updateFsCourseFinishTempParent(fsCourseFinishTempParent));
+    }
+
+    /**
+     * 删除完课模板
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseFinishTempParent:remove')")
+    @Log(title = "完课模板", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(fsCourseFinishTempParentService.deleteFsCourseFinishTempParentByIds(ids));
+    }
+}

+ 2 - 0
fs-company/src/main/resources/application.yml

@@ -6,3 +6,5 @@ spring:
   profiles:
     active: dev
     include: common,config-dev
+#    active: druid-fby
+#    include: common,config-fby

+ 1 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseFinishTemp.java

@@ -49,6 +49,7 @@ public class FsCourseFinishTemp extends BaseEntity
     /** 归属销售id(对多) */
     @Excel(name = "归属销售id(对多)")
     private String companyUserIds;
+    private Long parentId;
 
     /** 删除标志 */
     @Excel(name = "删除标志")

+ 48 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseFinishTempParent.java

@@ -0,0 +1,48 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 完课模板对象 fs_course_finish_temp_parent
+ *
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsCourseFinishTempParent extends BaseEntity{
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String name;
+
+    /** 课程ID */
+    @Excel(name = "课程ID")
+    private Long courseId;
+
+    /** 公司ID */
+    @Excel(name = "公司ID")
+    private Long companyId;
+
+
+    @TableField(exist = false)
+    private Long status;
+    @TableField(exist = false)
+    private String setting;
+    @TableField(exist = false)
+    private String chatSetting;
+    @TableField(exist = false)
+    private String companyUserIds;
+    @TableField(exist = false)
+    private Integer isAllCompanyUser;
+}

+ 20 - 23
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseFinishTempMapper.java

@@ -1,12 +1,13 @@
 package com.fs.course.mapper;
 
-import java.util.List;
 import com.fs.course.domain.FsCourseFinishTemp;
 import com.fs.course.vo.FsCourseFinishTempListVO;
 import com.fs.course.vo.FsCourseFinishTempVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.util.List;
+
 /**
  * 完课模板Mapper接口
  *
@@ -23,12 +24,6 @@ public interface FsCourseFinishTempMapper
      */
     public FsCourseFinishTemp selectFsCourseFinishTempById(Long id);
 
-//    @Select("select * from fs_course_finish_temp")
-//    public List<FsCourseFinishTemp> selectFsCourseFinishTempByCompanyList();
-
-    @Select("SELECT * FROM fs_course_finish_temp WHERE id = #{id}")
-    public FsCourseFinishTempVO selectFsCourseFinishTempByIdVO(Long id);
-
     /**
      * 查询完课模板列表
      *
@@ -77,6 +72,9 @@ public interface FsCourseFinishTempMapper
             "<if test = ' maps.name !=null and maps.name!=\"\" '> " +
             "and t.name like concat('%', #{maps.name}, '%') " +
             "</if>" +
+            "<if test = ' maps.parentId !=null'> " +
+            "and t.parent_id = #{maps.parentId} " +
+            "</if>" +
             "<if test = ' maps.courseId !=null  '> " +
             "and t.course_id = #{maps.courseId} " +
             "</if>" +
@@ -97,22 +95,21 @@ public interface FsCourseFinishTempMapper
             "and find_in_set(#{userId},company_user_ids) and is_del= 0 order by create_time desc  limit 1 ")
     FsCourseFinishTemp selectFsCourseFinishTempByCompanyUserId(@Param("userId") Long companyUserId, @Param("videoId")Long videoId);
 
-    @Select("SELECT *\n" +
-            "FROM fs_course_finish_temp\n" +
-            "WHERE video_id = #{videoId}\n" +
-            "  AND is_del = 0\n" +
-            "  AND (\n" +
-            "    (is_all_company_user = 1 AND company_id = #{companyId})\n" +
-            "    OR\n" +
-            "    ((is_all_company_user != 1 OR is_all_company_user IS NULL) AND FIND_IN_SET(#{userId}, company_user_ids))\n" +
-            "  )\n" +
-            "ORDER BY \n" +
-            "  CASE WHEN (is_all_company_user != 1 OR is_all_company_user IS NULL) THEN 0 ELSE 1 END,\n" +
-            "  COALESCE(update_time, create_time) DESC \n" +
-            "LIMIT 1")
+    @Select("    SELECT *\n" +
+            "    FROM fs_course_finish_temp\n" +
+            "    WHERE video_id = #{videoId}\n" +
+            "    AND is_del = 0\n" +
+            "    AND (\n" +
+            "        (is_all_company_user = 1 AND company_id = #{companyId})\n" +
+            "        OR\n" +
+            "        ((is_all_company_user != 1 OR is_all_company_user IS NULL) AND FIND_IN_SET(#{userId}, company_user_ids))\n" +
+            "    )\n" +
+            "    ORDER BY create_time DESC\n" +
+            "    LIMIT 1\n")
     FsCourseFinishTemp selectFsCourseFinishTempByCompanyId(@Param("userId") Long companyUserId,@Param("companyId") Long companyId, @Param("videoId")Long videoId);
 
-    @Select("select * from fs_course_finish_temp where type = 2 and video_id = #{videoId} " +
-            "and find_in_set(#{userId},company_user_ids) and is_del= 0 order by create_time desc  limit 1 ")
-    FsCourseFinishTemp selectFsCourseFinishTempChatSopByCompanyUserId(Long companyUserId, Long videoId);
+    @Select("SELECT * FROM fs_course_finish_temp WHERE id = #{id}")
+    public FsCourseFinishTempVO selectFsCourseFinishTempByIdVO(Long id);
+
+    void deleteByParentIds(@Param("ids") Long[] ids);
 }

+ 62 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseFinishTempParentMapper.java

@@ -0,0 +1,62 @@
+package com.fs.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsCourseFinishTempParent;
+
+import java.util.List;
+
+/**
+ * 完课模板Mapper接口
+ * 
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+public interface FsCourseFinishTempParentMapper extends BaseMapper<FsCourseFinishTempParent>{
+    /**
+     * 查询完课模板
+     * 
+     * @param id 完课模板主键
+     * @return 完课模板
+     */
+    FsCourseFinishTempParent selectFsCourseFinishTempParentById(Long id);
+
+    /**
+     * 查询完课模板列表
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 完课模板集合
+     */
+    List<FsCourseFinishTempParent> selectFsCourseFinishTempParentList(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 新增完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    int insertFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 修改完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    int updateFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 删除完课模板
+     * 
+     * @param id 完课模板主键
+     * @return 结果
+     */
+    int deleteFsCourseFinishTempParentById(Long id);
+
+    /**
+     * 批量删除完课模板
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsCourseFinishTempParentByIds(Long[] ids);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsCourseFinishTempParentService.java

@@ -0,0 +1,62 @@
+package com.fs.course.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsCourseFinishTempParent;
+
+import java.util.List;
+
+/**
+ * 完课模板Service接口
+ * 
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+public interface IFsCourseFinishTempParentService extends IService<FsCourseFinishTempParent>{
+    /**
+     * 查询完课模板
+     * 
+     * @param id 完课模板主键
+     * @return 完课模板
+     */
+    FsCourseFinishTempParent selectFsCourseFinishTempParentById(Long id);
+
+    /**
+     * 查询完课模板列表
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 完课模板集合
+     */
+    List<FsCourseFinishTempParent> selectFsCourseFinishTempParentList(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 新增完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    int insertFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 修改完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    int updateFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent);
+
+    /**
+     * 批量删除完课模板
+     * 
+     * @param ids 需要删除的完课模板主键集合
+     * @return 结果
+     */
+    int deleteFsCourseFinishTempParentByIds(Long[] ids);
+
+    /**
+     * 删除完课模板信息
+     * 
+     * @param id 完课模板主键
+     * @return 结果
+     */
+    int deleteFsCourseFinishTempParentById(Long id);
+}

+ 4 - 1
fs-service-system/src/main/java/com/fs/course/service/IFsCourseFinishTempService.java

@@ -1,10 +1,11 @@
 package com.fs.course.service;
 
-import java.util.List;
 import com.fs.course.domain.FsCourseFinishTemp;
 import com.fs.course.vo.FsCourseFinishTempListVO;
 import com.fs.course.vo.FsCourseFinishTempVO;
 
+import java.util.List;
+
 /**
  * 完课模板Service接口
  *
@@ -64,6 +65,8 @@ public interface IFsCourseFinishTempService
      */
     public int deleteFsCourseFinishTempById(Long id);
 
+    void deleteByParentIds(Long[] ids);
+
     /**
      * 将所有的CompanyUserId更新为 企业微信账号
      */

+ 123 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseFinishTempParentServiceImpl.java

@@ -0,0 +1,123 @@
+package com.fs.course.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.DateUtils;
+import com.fs.course.domain.FsCourseFinishTemp;
+import com.fs.course.domain.FsCourseFinishTempParent;
+import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.mapper.FsCourseFinishTempParentMapper;
+import com.fs.course.service.IFsCourseFinishTempParentService;
+import com.fs.course.service.IFsCourseFinishTempService;
+import com.fs.course.service.IFsUserCourseService;
+import com.fs.course.service.IFsUserCourseVideoService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 完课模板Service业务层处理
+ * 
+ * @author 吴树波
+ * @date 2025-05-22
+ */
+@Service
+@AllArgsConstructor
+public class FsCourseFinishTempParentServiceImpl extends ServiceImpl<FsCourseFinishTempParentMapper, FsCourseFinishTempParent> implements IFsCourseFinishTempParentService {
+
+    private final IFsUserCourseService fsUserCourseService;
+    private final IFsUserCourseVideoService fsUserCourseVideoService;
+    private final IFsCourseFinishTempService fsCourseFinishTempService;
+
+    /**
+     * 查询完课模板
+     * 
+     * @param id 完课模板主键
+     * @return 完课模板
+     */
+    @Override
+    public FsCourseFinishTempParent selectFsCourseFinishTempParentById(Long id)
+    {
+        return baseMapper.selectFsCourseFinishTempParentById(id);
+    }
+
+    /**
+     * 查询完课模板列表
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 完课模板
+     */
+    @Override
+    public List<FsCourseFinishTempParent> selectFsCourseFinishTempParentList(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        return baseMapper.selectFsCourseFinishTempParentList(fsCourseFinishTempParent);
+    }
+
+    /**
+     * 新增完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    @Override
+    public int insertFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent){
+        Long courseId = fsCourseFinishTempParent.getCourseId();
+        FsUserCourseVideo fsUserCourseVideo = new FsUserCourseVideo();
+        fsUserCourseVideo.setCourseId(courseId);
+        List<FsUserCourseVideo> videoList = fsUserCourseVideoService.selectFsUserCourseVideoListByCourseId(fsUserCourseVideo);
+        int insert = baseMapper.insert(fsCourseFinishTempParent);
+        fsCourseFinishTempParent.setCreateTime(DateUtils.getNowDate());
+        videoList.forEach(e -> {
+            FsCourseFinishTemp temp = new FsCourseFinishTemp();
+            temp.setName(e.getFileName());
+            temp.setStatus(fsCourseFinishTempParent.getStatus());
+            temp.setSetting(fsCourseFinishTempParent.getSetting());
+            temp.setChatSetting(fsCourseFinishTempParent.getChatSetting());
+            temp.setCompanyId(fsCourseFinishTempParent.getCompanyId());
+            temp.setCourseId(e.getCourseId());
+            temp.setVideoId(e.getVideoId());
+            temp.setCompanyUserIds(fsCourseFinishTempParent.getCompanyUserIds());
+            temp.setIsAllCompanyUser(fsCourseFinishTempParent.getIsAllCompanyUser());
+            temp.setParentId(fsCourseFinishTempParent.getId());
+            fsCourseFinishTempService.insertFsCourseFinishTemp(temp);
+        });
+        return insert;
+    }
+
+    /**
+     * 修改完课模板
+     * 
+     * @param fsCourseFinishTempParent 完课模板
+     * @return 结果
+     */
+    @Override
+    public int updateFsCourseFinishTempParent(FsCourseFinishTempParent fsCourseFinishTempParent)
+    {
+        fsCourseFinishTempParent.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateById(fsCourseFinishTempParent);
+    }
+
+    /**
+     * 批量删除完课模板
+     * 
+     * @param ids 需要删除的完课模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsCourseFinishTempParentByIds(Long[] ids){
+        int i = baseMapper.deleteFsCourseFinishTempParentByIds(ids);
+        fsCourseFinishTempService.deleteByParentIds(ids);
+        return i;
+    }
+
+    /**
+     * 删除完课模板信息
+     * 
+     * @param id 完课模板主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsCourseFinishTempParentById(Long id){
+        return deleteFsCourseFinishTempParentByIds(new Long[]{id});
+    }
+}

+ 12 - 16
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseFinishTempServiceImpl.java

@@ -1,34 +1,25 @@
 package com.fs.course.service.impl;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.StringUtils;
-import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.course.domain.FsCourseFinishTemp;
+import com.fs.course.mapper.FsCourseFinishTempMapper;
+import com.fs.course.service.IFsCourseFinishTempService;
 import com.fs.course.vo.FsCourseFinishTempListVO;
 import com.fs.course.vo.FsCourseFinishTempVO;
 import com.fs.fastGpt.domain.FastGptChatReplaceWords;
 import com.fs.fastGpt.mapper.FastGptChatReplaceWordsMapper;
-import com.fs.fastgptApi.util.AudioUtils;
-import com.fs.fastgptApi.vo.AudioVO;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.vo.QwSopCourseFinishTempSetting;
-import com.fs.qw.vo.QwSopTempSetting;
 import com.fs.qw.vo.QwUserVO;
-import com.fs.voice.utils.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.course.mapper.FsCourseFinishTempMapper;
-import com.fs.course.domain.FsCourseFinishTemp;
-import com.fs.course.service.IFsCourseFinishTempService;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
 
 /**
  * 完课模板Service业务层处理
@@ -179,6 +170,11 @@ public class FsCourseFinishTempServiceImpl implements IFsCourseFinishTempService
         return fsCourseFinishTempMapper.deleteFsCourseFinishTempById(id);
     }
 
+    @Override
+    public void deleteByParentIds(Long[] ids) {
+        fsCourseFinishTempMapper.deleteByParentIds(ids);
+    }
+
 //    @Override
 //    public void updateFsCourseFinishTempByCompanyUserId() {
 //        List<FsCourseFinishTemp> fsCourseFinishTemps = fsCourseFinishTempMapper.selectFsCourseFinishTempByCompanyList();

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

@@ -4,15 +4,18 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.PubFun;
 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.param.CompanyRedPacketParam;
 import com.fs.course.param.PeriodCountParam;
 import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.PeriodRedPacketVO;
 import com.fs.course.vo.UpdateCourseTimeVo;
@@ -54,6 +57,7 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
     private final FsUserMapper  fsUserMapper;
 
     private final FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
+    private final IFsUserCourseVideoService fsUserCourseVideoService;
 
     /**
      * 查询营期课程
@@ -143,15 +147,26 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         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());
+        List<FsUserCourseVideo> videoList = fsUserCourseVideoService.selectFsUserCourseVideoListByCourseId(fsUserCourseVideo);
+        Map<Long, FsUserCourseVideo> videoMap = PubFun.listToMapByGroupObject(videoList, FsUserCourseVideo::getVideoId);
         List<FsUserCoursePeriodDays> collect = entity.getVideoIds().stream().map(e -> {
+            FsUserCourseVideo video = videoMap.get(e);
             FsUserCoursePeriodDays day = new FsUserCoursePeriodDays();
             day.setPeriodId(entity.getPeriodId());
             day.setLesson(dayList.size() + i.getAndIncrement());
             day.setDayDate(period.getPeriodStartingTime().plusDays(day.getLesson()));
             day.setCourseId(entity.getCourseId());
-            day.setStartDateTime(LocalDateTime.of(day.getDayDate(), entity.getStartTime()));
-            day.setEndDateTime(LocalDateTime.of(day.getDayDate(), entity.getEndTime1()));
-            day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), entity.getJoinTime()));
+            if(video.getViewStartTime() != null){
+                day.setStartDateTime(LocalDateTime.of(day.getDayDate(), video.getViewStartTime()));
+            }
+            if(video.getViewEndTime() != null){
+                day.setEndDateTime(LocalDateTime.of(day.getDayDate(), video.getViewEndTime()));
+            }
+            if(video.getLastJoinTime() != null){
+                day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), video.getLastJoinTime()));
+            }
             day.setVideoId(e);
             day.setCreateTime(new Date());
             // 默认开启今天及以后的两天

+ 2 - 2
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -79,8 +79,8 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     @Autowired
     private FsCourseAnswerLogsMapper fsCourseAnswerLogsMapper;
 
-    private static final String realLink = "/courseH5/pages/course/learning?course=";
-    private static final String shortLink = "/courseH5/pages/course/learning?s=";
+    private static final String realLink = "/pages/course/learning?course=";
+    private static final String shortLink = "/pages/course/learning?s=";
     private static final String userRealLink = "/pages/user/users/becomeVIP?";
 
     /**

+ 6 - 0
fs-service-system/src/main/java/com/fs/system/service/ISysDictTypeService.java

@@ -86,4 +86,10 @@ public interface ISysDictTypeService
      * @return 结果
      */
     public String checkDictTypeUnique(SysDictType dictType);
+    /**
+     * 重置字典缓存数据
+     */
+    public void resetDictCache();
+
+    public void loadingDictCache();
 }

+ 22 - 6
fs-service-system/src/main/java/com/fs/system/service/impl/SysDictTypeServiceImpl.java

@@ -1,8 +1,10 @@
 package com.fs.system.service.impl;
 
 import java.util.List;
+import java.util.Map;
 import javax.annotation.PostConstruct;
 
+import com.fs.common.utils.PubFun;
 import com.fs.system.mapper.SysDictDataMapper;
 import com.fs.system.mapper.SysDictTypeMapper;
 import com.fs.system.service.ISysDictTypeService;
@@ -36,12 +38,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
     @PostConstruct
     public void init()
     {
-        List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
-        for (SysDictType dictType : dictTypeList)
-        {
-            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
-            DictUtils.setDictCache(dictType.getDictType(), dictDatas);
-        }
+        loadingDictCache();
     }
 
     /**
@@ -56,6 +53,16 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
         return dictTypeMapper.selectDictTypeList(dictType);
     }
 
+    /**
+     * 加载字典缓存数据
+     */
+    @Override
+    public void loadingDictCache(){
+        List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
+        List<SysDictData> dictDataList = dictDataMapper.selectDictDataAll();
+        Map<String, List<SysDictData>> dictDataMap = PubFun.listToMapByGroupList(dictDataList, SysDictData::getDictType);
+        dictTypeList.stream().filter(e -> dictDataMap.containsKey(e.getDictType())).forEach(e -> DictUtils.setDictCache(e.getDictType(), dictDataMap.get(e.getDictType())));
+    }
     /**
      * 根据所有字典类型
      * 
@@ -148,6 +155,15 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
         DictUtils.clearDictCache();
     }
 
+    /**
+     * 重置字典缓存数据
+     */
+    @Override
+    public void resetDictCache(){
+        clearCache();
+        loadingDictCache();
+    }
+
     /**
      * 新增保存字典类型信息
      * 

+ 5 - 0
fs-service-system/src/main/java/com/fs/wx/mp/config/WxMpConfiguration.java

@@ -2,6 +2,7 @@ package com.fs.wx.mp.config;
 
 import com.fs.wx.mp.handler.*;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.redis.JedisWxRedisOps;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -28,6 +29,7 @@ import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY;
  *
  * @author <a href="https://github.com/binarywang">Binary Wang</a>
  */
+@Slf4j
 @AllArgsConstructor
 @Configuration
 @EnableConfigurationProperties(WxMpProperties.class)
@@ -51,6 +53,9 @@ public class WxMpConfiguration {
         if (configs == null) {
             throw new RuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");
         }
+        configs.forEach(e -> {
+            log.info("微信公众号APPID:{}", e.getAppId());
+        });
 
         WxMpService service = new WxMpServiceImpl();
         service.setMultiConfigStorages(configs

+ 1 - 1
fs-service-system/src/main/resources/application-config-dev.yml

@@ -84,7 +84,7 @@ wx:
         msgDataFormat: JSON
 
   pay:
-    appId: wx11a2ce7c2bbc4521 #微信公众号或者小程序等的appid
+    appId: wx93ce67750e3cfba3 #微信公众号或者小程序等的appid
     mchId: 1703311381 #微信支付商户号
     mchKey: FotTIbIzn4AisMW7de712LJQIazSqqAl #微信支付商户密钥
     v3Key: y5Eo99q93qzdQRAs6E2BDKIF7f3EnS3G

+ 1 - 1
fs-service-system/src/main/resources/application-config-zkzh.yml

@@ -92,7 +92,7 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wx961fadab9bcb792b # 第一个公众号的appid  //公众号名称:云联
+      - appId: wx93ce67750e3cfba3 # 第一个公众号的appid  //公众号名称:云联
         secret: eddde2a1d4ca0c6c443a67e542b6864c
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值

+ 17 - 14
fs-service-system/src/main/resources/mapper/course/FsCourseFinishTempMapper.xml

@@ -1,7 +1,7 @@
 <?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">
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.course.mapper.FsCourseFinishTempMapper">
 
     <resultMap type="FsCourseFinishTemp" id="FsCourseFinishTempResult">
@@ -17,15 +17,13 @@
         <result property="companyUserIds"    column="company_user_ids"    />
         <result property="updateTime"    column="update_time"    />
         <result property="isDel"    column="is_del"    />
-        <result property="chatSetting"    column="chat_setting"    />
-        <result property="isAllCompanyUser"    column="is_all_company_user"    />
     </resultMap>
 
     <sql id="selectFsCourseFinishTempVo">
-        select * from fs_course_finish_temp
+        select id, name, status, setting, company_id, create_by, create_time, course_id, video_id, company_user_ids, update_time, is_del from fs_course_finish_temp
     </sql>
 
-    <select id="selectFsCourseFinishTempList" parameterType="FsCourseFinishTemp" resultType="FsCourseFinishTemp">
+    <select id="selectFsCourseFinishTempList" parameterType="FsCourseFinishTemp" resultMap="FsCourseFinishTempResult">
         <include refid="selectFsCourseFinishTempVo"/>
         <where>
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
@@ -36,11 +34,10 @@
             <if test="videoId != null "> and video_id = #{videoId}</if>
             <if test="companyUserIds != null  and companyUserIds != ''"> and company_user_ids = #{companyUserIds}</if>
             <if test="isDel != null "> and is_del = #{isDel}</if>
-            <if test="isAllCompanyUser != null "> and is_all_company_user = #{isAllCompanyUser}</if>
         </where>
     </select>
 
-    <select id="selectFsCourseFinishTempById" parameterType="Long" resultType="FsCourseFinishTemp">
+    <select id="selectFsCourseFinishTempById" parameterType="Long" resultMap="FsCourseFinishTempResult">
         <include refid="selectFsCourseFinishTempVo"/>
         where id = #{id}
     </select>
@@ -59,9 +56,10 @@
             <if test="companyUserIds != null">company_user_ids,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="isDel != null">is_del,</if>
-            <if test="isAllCompanyUser != null">is_all_company_user,</if>
             <if test="chatSetting != null">chat_setting,</if>
-        </trim>
+            <if test="parentId != null">parent_id,</if>
+            <if test="isAllCompanyUser != null">is_all_company_user,</if>
+         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="name != null">#{name},</if>
             <if test="status != null">#{status},</if>
@@ -74,9 +72,10 @@
             <if test="companyUserIds != null">#{companyUserIds},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="isDel != null">#{isDel},</if>
-            <if test="isAllCompanyUser != null">#{isAllCompanyUser},</if>
             <if test="chatSetting != null">#{chatSetting},</if>
-        </trim>
+            <if test="parentId != null">#{parentId},</if>
+            <if test="isAllCompanyUser != null">#{isAllCompanyUser},</if>
+         </trim>
     </insert>
 
     <update id="updateFsCourseFinishTemp" parameterType="FsCourseFinishTemp">
@@ -93,8 +92,6 @@
             <if test="companyUserIds != null">company_user_ids = #{companyUserIds},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="isDel != null">is_del = #{isDel},</if>
-            <if test="isAllCompanyUser != null">is_all_company_user = #{isAllCompanyUser},</if>
-            <if test="chatSetting != null">chat_setting = #{chatSetting},</if>
         </trim>
         where id = #{id}
     </update>
@@ -109,4 +106,10 @@
             #{id}
         </foreach>
     </delete>
+    <delete id="deleteByParentIds">
+        update fs_course_finish_temp set is_del = 1 where parent_id in
+        <foreach item="id" collection="ids" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
 </mapper>

+ 83 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseFinishTempParentMapper.xml

@@ -0,0 +1,83 @@
+<?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.FsCourseFinishTempParentMapper">
+    
+    <resultMap type="FsCourseFinishTempParent" id="FsCourseFinishTempParentResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="courseId"    column="course_id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectFsCourseFinishTempParentVo">
+        select * from fs_course_finish_temp_parent
+    </sql>
+
+    <select id="selectFsCourseFinishTempParentList" parameterType="FsCourseFinishTempParent" resultMap="FsCourseFinishTempParentResult">
+        <include refid="selectFsCourseFinishTempParentVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="courseId != null "> and course_id = #{courseId}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+        </where>
+    </select>
+    
+    <select id="selectFsCourseFinishTempParentById" parameterType="Long" resultMap="FsCourseFinishTempParentResult">
+        <include refid="selectFsCourseFinishTempParentVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFsCourseFinishTempParent" parameterType="FsCourseFinishTempParent" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_course_finish_temp_parent
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="courseId != null">course_id,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="courseId != null">#{courseId},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsCourseFinishTempParent" parameterType="FsCourseFinishTempParent">
+        update fs_course_finish_temp_parent
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsCourseFinishTempParentById" parameterType="Long">
+        delete from fs_course_finish_temp_parent where id = #{id}
+    </delete>
+
+    <delete id="deleteFsCourseFinishTempParentByIds" parameterType="String">
+        delete from fs_course_finish_temp_parent where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>