Ver Fonte

Merge remote-tracking branch 'origin/master'

zyp há 2 dias atrás
pai
commit
3c52855b9b
47 ficheiros alterados com 2060 adições e 36 exclusões
  1. 33 8
      fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchCommentController.java
  2. 110 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseComplaintRecordController.java
  3. 101 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseComplaintTypeController.java
  4. 6 0
      fs-admin/src/main/java/com/fs/his/controller/FsPackageCateController.java
  5. 103 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysUserSetController.java
  6. 1 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  7. 1 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseWatchComment.java
  8. 56 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseComplaintRecord.java
  9. 29 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseComplaintType.java
  10. 4 2
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchCommentMapper.java
  11. 69 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseComplaintRecordMapper.java
  12. 61 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseComplaintTypeMapper.java
  13. 33 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchCommentPageParam.java
  14. 24 0
      fs-service/src/main/java/com/fs/course/param/UserCourseComplaintRecordParam.java
  15. 4 2
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchCommentService.java
  16. 71 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java
  17. 69 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintTypeService.java
  18. 5 3
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java
  19. 103 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java
  20. 134 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintTypeServiceImpl.java
  21. 58 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchCommentListVO.java
  22. 46 0
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseComplaintRecordPageListVO.java
  23. 27 0
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseComplaintTypeListVO.java
  24. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsPackageCateMapper.java
  25. 4 6
      fs-service/src/main/java/com/fs/his/param/FsPackageCateUParam.java
  26. 1 0
      fs-service/src/main/java/com/fs/his/service/IFsPackageCateService.java
  27. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageCateServiceImpl.java
  28. 8 0
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  29. 5 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  30. 27 0
      fs-service/src/main/java/com/fs/system/domain/SysUserSet.java
  31. 61 0
      fs-service/src/main/java/com/fs/system/mapper/SysUserSetMapper.java
  32. 61 0
      fs-service/src/main/java/com/fs/system/service/ISysUserSetService.java
  33. 101 0
      fs-service/src/main/java/com/fs/system/service/impl/SysUserSetServiceImpl.java
  34. 3 0
      fs-service/src/main/resources/application-config-dev.yml
  35. 82 0
      fs-service/src/main/resources/application-config-druid-fcky.yml
  36. 3 0
      fs-service/src/main/resources/application-config-druid-jnmy.yml
  37. 150 0
      fs-service/src/main/resources/application-druid-fcky.yml
  38. 4 2
      fs-service/src/main/resources/db/20250530-初始化表结构.sql
  39. 34 0
      fs-service/src/main/resources/db/20250605-初始化表结构.sql
  40. 6 1
      fs-service/src/main/resources/mapper/company/CompanyMapper.xml
  41. 35 10
      fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml
  42. 102 0
      fs-service/src/main/resources/mapper/course/FsUserCourseComplaintRecordMapper.xml
  43. 74 0
      fs-service/src/main/resources/mapper/course/FsUserCourseComplaintTypeMapper.xml
  44. 6 0
      fs-service/src/main/resources/mapper/his/FsPackageCateMapper.xml
  45. 62 0
      fs-service/src/main/resources/mapper/system/SysUserSetMapper.xml
  46. 28 2
      fs-user-app/src/main/java/com/fs/app/controller/PackageController.java
  47. 48 0
      fs-user-app/src/main/java/com/fs/app/controller/UserCourseComplaintController.java

+ 33 - 8
fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchCommentController.java

@@ -1,6 +1,13 @@
 package com.fs.course.controller;
 
 import java.util.List;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.param.FsCourseWatchCommentPageParam;
+import com.fs.course.vo.FsCourseWatchCommentListVO;
+import com.fs.qw.service.IQwExternalContactService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -22,7 +29,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 看课评论Controller
- * 
+ *
  * @author fs
  * @date 2025-05-26
  */
@@ -33,16 +40,21 @@ public class FsCourseWatchCommentController extends BaseController
     @Autowired
     private IFsCourseWatchCommentService fsCourseWatchCommentService;
 
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
     /**
      * 查询看课评论列表
      */
     @PreAuthorize("@ss.hasPermi('course:courseWatchComment:list')")
     @GetMapping("/list")
-    public TableDataInfo list(FsCourseWatchComment fsCourseWatchComment)
+    public R list(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam)
     {
-        startPage();
-        List<FsCourseWatchComment> list = fsCourseWatchCommentService.selectFsCourseWatchCommentList(fsCourseWatchComment);
-        return getDataTable(list);
+//        startPage();
+        PageHelper.startPage(fsCourseWatchCommentPageParam.getPageNum(), fsCourseWatchCommentPageParam.getPageSize());
+        List<FsCourseWatchCommentListVO> list = fsCourseWatchCommentService.selectFsCourseWatchCommentList(fsCourseWatchCommentPageParam);
+        PageInfo<FsCourseWatchCommentListVO> pageInfo = new PageInfo<>(list);
+        return R.ok().put("rows", pageInfo);
     }
 
     /**
@@ -51,10 +63,10 @@ public class FsCourseWatchCommentController extends BaseController
     @PreAuthorize("@ss.hasPermi('course:courseWatchComment:export')")
     @Log(title = "看课评论", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(FsCourseWatchComment fsCourseWatchComment)
+    public AjaxResult export(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam)
     {
-        List<FsCourseWatchComment> list = fsCourseWatchCommentService.selectFsCourseWatchCommentList(fsCourseWatchComment);
-        ExcelUtil<FsCourseWatchComment> util = new ExcelUtil<FsCourseWatchComment>(FsCourseWatchComment.class);
+        List<FsCourseWatchCommentListVO> list = fsCourseWatchCommentService.selectFsCourseWatchCommentList(fsCourseWatchCommentPageParam);
+        ExcelUtil<FsCourseWatchCommentListVO> util = new ExcelUtil<FsCourseWatchCommentListVO>(FsCourseWatchCommentListVO.class);
         return util.exportExcel(list, "看课评论数据");
     }
 
@@ -100,4 +112,17 @@ public class FsCourseWatchCommentController extends BaseController
     {
         return toAjax(fsCourseWatchCommentService.deleteFsCourseWatchCommentByCommentIds(commentIds));
     }
+
+    @Log(title = "手动拉黑外部联系人用户", businessType = BusinessType.UPDATE)
+    @PutMapping("/addBlack")
+    public R addBlack(Integer commentStatus, Long fsUserId)
+    {
+        int i = qwExternalContactService.updateQwExternalContactByFsUserId(commentStatus, fsUserId);
+        if (i > 0){
+            return R.ok();
+        } else {
+            return R.error();
+        }
+    }
+
 }

+ 110 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseComplaintRecordController.java

@@ -0,0 +1,110 @@
+package com.fs.course.controller;
+
+import java.util.List;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.vo.FsUserCourseComplaintRecordPageListVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.course.domain.FsUserCourseComplaintRecord;
+import com.fs.course.service.IFsUserCourseComplaintRecordService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 看课投诉记录Controller
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@RestController
+@RequestMapping("/course/userCourseComplaintRecord")
+public class FsUserCourseComplaintRecordController extends BaseController
+{
+    @Autowired
+    private IFsUserCourseComplaintRecordService fsUserCourseComplaintRecordService;
+
+    /**
+     * 查询看课投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:list')")
+    @GetMapping("/list")
+    public R list(FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+//        startPage();
+        PageHelper.startPage(fsUserCourseComplaintRecord.getPageNum(), fsUserCourseComplaintRecord.getPageSize());
+        List<FsUserCourseComplaintRecordPageListVO> list = fsUserCourseComplaintRecordService.selectFsUserCourseComplaintRecordList(fsUserCourseComplaintRecord);
+        PageInfo<FsUserCourseComplaintRecordPageListVO> pageInfo = new PageInfo<>(list);
+        return R.ok().put("rows", pageInfo);
+    }
+
+    /**
+     * 导出看课投诉记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:export')")
+    @Log(title = "看课投诉记录", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        List<FsUserCourseComplaintRecordPageListVO> list = fsUserCourseComplaintRecordService.selectFsUserCourseComplaintRecordList(fsUserCourseComplaintRecord);
+        ExcelUtil<FsUserCourseComplaintRecordPageListVO> util = new ExcelUtil<>(FsUserCourseComplaintRecordPageListVO.class);
+        return util.exportExcel(list, "看课投诉记录");
+    }
+
+    /**
+     * 获取看课投诉记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:query')")
+    @GetMapping(value = "/{recordId}")
+    public AjaxResult getInfo(@PathVariable("recordId") Long recordId)
+    {
+        return AjaxResult.success(fsUserCourseComplaintRecordService.selectFsUserCourseComplaintRecordByRecordId(recordId));
+    }
+
+    /**
+     * 新增看课投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:add')")
+    @Log(title = "看课投诉记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        return toAjax(fsUserCourseComplaintRecordService.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord));
+    }
+
+    /**
+     * 修改看课投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:edit')")
+    @Log(title = "看课投诉记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        return toAjax(fsUserCourseComplaintRecordService.updateFsUserCourseComplaintRecord(fsUserCourseComplaintRecord));
+    }
+
+    /**
+     * 删除看课投诉记录
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintRecord:remove')")
+    @Log(title = "看课投诉记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{recordIds}")
+    public AjaxResult remove(@PathVariable Long[] recordIds)
+    {
+        return toAjax(fsUserCourseComplaintRecordService.deleteFsUserCourseComplaintRecordByRecordIds(recordIds));
+    }
+}

+ 101 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseComplaintTypeController.java

@@ -0,0 +1,101 @@
+package com.fs.course.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.course.domain.FsUserCourseComplaintType;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.common.utils.poi.ExcelUtil;
+
+/**
+ * 看课投诉类型Controller
+ * 
+ * @author fs
+ * @date 2025-06-04
+ */
+@RestController
+@RequestMapping("/course/userCourseComplaintType")
+public class FsUserCourseComplaintTypeController extends BaseController
+{
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+    /**
+     * 查询看课投诉类型列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:list')")
+    @GetMapping("/list")
+    public AjaxResult list(FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        List<FsUserCourseComplaintType> list = fsUserCourseComplaintTypeService.selectFsUserCourseComplaintTypeList(fsUserCourseComplaintType);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 导出看课投诉类型列表
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:export')")
+    @Log(title = "看课投诉类型", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        List<FsUserCourseComplaintType> list = fsUserCourseComplaintTypeService.selectFsUserCourseComplaintTypeList(fsUserCourseComplaintType);
+        ExcelUtil<FsUserCourseComplaintType> util = new ExcelUtil<FsUserCourseComplaintType>(FsUserCourseComplaintType.class);
+        return util.exportExcel(list, "看课投诉类型数据");
+    }
+
+    /**
+     * 获取看课投诉类型详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:query')")
+    @GetMapping(value = "/{complaintTypeId}")
+    public AjaxResult getInfo(@PathVariable("complaintTypeId") Long complaintTypeId)
+    {
+        return AjaxResult.success(fsUserCourseComplaintTypeService.selectFsUserCourseComplaintTypeByComplaintTypeId(complaintTypeId));
+    }
+
+    /**
+     * 新增看课投诉类型
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:add')")
+    @Log(title = "看课投诉类型", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        return toAjax(fsUserCourseComplaintTypeService.insertFsUserCourseComplaintType(fsUserCourseComplaintType));
+    }
+
+    /**
+     * 修改看课投诉类型
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:edit')")
+    @Log(title = "看课投诉类型", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        return toAjax(fsUserCourseComplaintTypeService.updateFsUserCourseComplaintType(fsUserCourseComplaintType));
+    }
+
+    /**
+     * 删除看课投诉类型
+     */
+    @PreAuthorize("@ss.hasPermi('course:userCourseComplaintType:remove')")
+    @Log(title = "看课投诉类型", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{complaintTypeIds}")
+    public AjaxResult remove(@PathVariable Long[] complaintTypeIds)
+    {
+        return toAjax(fsUserCourseComplaintTypeService.deleteFsUserCourseComplaintTypeByComplaintTypeIds(complaintTypeIds));
+    }
+}

+ 6 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPackageCateController.java

@@ -125,4 +125,10 @@ public class FsPackageCateController extends BaseController
         Map map = fsPackageCateService.selectFsArticleCateAllList();
         return AjaxResult.success(map);
     }
+    @GetMapping("/cateList")
+    public TableDataInfo cateList()
+    {
+        List<OptionsVO> list = fsPackageCateService.selectCateList();
+        return getDataTable(list);
+    }
 }

+ 103 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysUserSetController.java

@@ -0,0 +1,103 @@
+package com.fs.web.controller.system;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.system.domain.SysUserSet;
+import com.fs.system.service.ISysUserSetService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 用户设置Controller
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@RestController
+@RequestMapping("/system/set")
+public class SysUserSetController extends BaseController
+{
+    @Autowired
+    private ISysUserSetService sysUserSetService;
+
+    /**
+     * 查询用户设置列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysUserSet sysUserSet)
+    {
+        startPage();
+        List<SysUserSet> list = sysUserSetService.selectSysUserSetList(sysUserSet);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出用户设置列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:export')")
+    @Log(title = "用户设置", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysUserSet sysUserSet)
+    {
+        List<SysUserSet> list = sysUserSetService.selectSysUserSetList(sysUserSet);
+        ExcelUtil<SysUserSet> util = new ExcelUtil<SysUserSet>(SysUserSet.class);
+        return util.exportExcel(list, "用户设置数据");
+    }
+
+    /**
+     * 获取用户设置详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:query')")
+    @GetMapping(value = "/{userId}")
+    public AjaxResult getInfo(@PathVariable("userId") Long userId)
+    {
+        return AjaxResult.success(sysUserSetService.selectSysUserSetByUserId(userId));
+    }
+
+    /**
+     * 新增用户设置
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:add')")
+    @Log(title = "用户设置", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysUserSet sysUserSet)
+    {
+        return toAjax(sysUserSetService.insertSysUserSet(sysUserSet));
+    }
+
+    /**
+     * 修改用户设置
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:edit')")
+    @Log(title = "用户设置", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysUserSet sysUserSet)
+    {
+        return toAjax(sysUserSetService.updateSysUserSet(sysUserSet));
+    }
+
+    /**
+     * 删除用户设置
+     */
+    @PreAuthorize("@ss.hasPermi('system:set:remove')")
+    @Log(title = "用户设置", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(sysUserSetService.deleteSysUserSetByUserIds(userIds));
+    }
+}

+ 1 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -94,6 +94,7 @@ public class Company extends BaseEntity
     private String followDoctorIds;
 
     private String doctorIds;
+    private String packageCateIds;
     /**
     * 重启时间
     */

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

@@ -1,5 +1,6 @@
 package com.fs.course.domain;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fs.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 56 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseComplaintRecord.java

@@ -0,0 +1,56 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 看课投诉记录对象 fs_user_course_complaint_record
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCourseComplaintRecord extends BaseEntity{
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    @TableField(exist = false)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    @TableField(exist = false)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "用户昵称")
+    @TableField(exist = false)
+    private String nickName;
+
+    /** 投诉记录id */
+    private Long recordId;
+
+    /** 用户id,关联fs_user */
+    @Excel(name = "用户id,关联fs_user")
+    private Long userId;
+
+    /** 投诉类型id */
+    @Excel(name = "投诉类型id")
+    private Long complaintTypeId;
+
+    /** 投诉内容 */
+    @Excel(name = "投诉内容")
+    private String complaintContent;
+
+    /** 课程id */
+    @Excel(name = "课程id")
+    private Long courseId;
+
+    /** 视频小节id */
+    @Excel(name = "视频小节id")
+    private Long videoId;
+
+
+}

+ 29 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseComplaintType.java

@@ -0,0 +1,29 @@
+package com.fs.course.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.TreeEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 看课投诉类型对象 fs_user_course_complaint_type
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCourseComplaintType extends TreeEntity{
+
+    /** 投诉类型id */
+    private Long complaintTypeId;
+
+    /** 投诉类型名称 */
+    @Excel(name = "投诉类型名称")
+    private String complaintTypeName;
+
+    /** 级别(目前只有两级) */
+    @Excel(name = "级别", readConverterExp = "目=前只有两级")
+    private Integer typeLevel;
+
+}

+ 4 - 2
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchCommentMapper.java

@@ -4,6 +4,8 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.course.domain.FsCourseWatchComment;
 import com.fs.course.param.FsCourseWatchCommentListParam;
+import com.fs.course.param.FsCourseWatchCommentPageParam;
+import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.course.vo.FsCourseWatchCommentVO;
 import org.apache.ibatis.annotations.Update;
 
@@ -25,10 +27,10 @@ public interface FsCourseWatchCommentMapper extends BaseMapper<FsCourseWatchComm
     /**
      * 查询看课评论列表
      *
-     * @param fsCourseWatchComment 看课评论
+     * @param fsCourseWatchCommentPageParam 看课评论
      * @return 看课评论集合
      */
-    List<FsCourseWatchComment> selectFsCourseWatchCommentList(FsCourseWatchComment fsCourseWatchComment);
+    List<FsCourseWatchCommentListVO> selectFsCourseWatchCommentList(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam);
 
     /**
      * 新增看课评论

+ 69 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseComplaintRecordMapper.java

@@ -0,0 +1,69 @@
+package com.fs.course.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCourseComplaintRecord;
+import com.fs.course.vo.FsUserCourseComplaintRecordPageListVO;
+
+/**
+ * 看课投诉记录Mapper接口
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface FsUserCourseComplaintRecordMapper extends BaseMapper<FsUserCourseComplaintRecord>{
+    /**
+     * 查询看课投诉记录
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 看课投诉记录
+     */
+    FsUserCourseComplaintRecord selectFsUserCourseComplaintRecordByRecordId(Long recordId);
+
+    /**
+     * 查询看课投诉记录列表
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 看课投诉记录集合
+     */
+    List<FsUserCourseComplaintRecord> selectFsUserCourseComplaintRecordList(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 查询看课分页列表
+     * @param fsUserCourseComplaintRecord 记录
+     * @return list
+     */
+    List<FsUserCourseComplaintRecordPageListVO> selectFsUserCourseComplaintRecordPageList(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 新增看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    int insertFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 修改看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    int updateFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 删除看课投诉记录
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintRecordByRecordId(Long recordId);
+
+    /**
+     * 批量删除看课投诉记录
+     *
+     * @param recordIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintRecordByRecordIds(Long[] recordIds);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseComplaintTypeMapper.java

@@ -0,0 +1,61 @@
+package com.fs.course.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCourseComplaintType;
+
+/**
+ * 看课投诉类型Mapper接口
+ * 
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface FsUserCourseComplaintTypeMapper extends BaseMapper<FsUserCourseComplaintType>{
+    /**
+     * 查询看课投诉类型
+     * 
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 看课投诉类型
+     */
+    FsUserCourseComplaintType selectFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId);
+
+    /**
+     * 查询看课投诉类型列表
+     * 
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 看课投诉类型集合
+     */
+    List<FsUserCourseComplaintType> selectFsUserCourseComplaintTypeList(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 新增看课投诉类型
+     * 
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    int insertFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 修改看课投诉类型
+     * 
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    int updateFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 删除看课投诉类型
+     * 
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId);
+
+    /**
+     * 批量删除看课投诉类型
+     * 
+     * @param complaintTypeIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintTypeByComplaintTypeIds(Long[] complaintTypeIds);
+}

+ 33 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchCommentPageParam.java

@@ -0,0 +1,33 @@
+package com.fs.course.param;
+
+import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 看课评论对象 fs_course_watch_comment
+ *
+ * @author fs
+ * @date 2025-05-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsCourseWatchCommentPageParam extends BaseEntity{
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "用户名称")
+    private String nickName;
+
+    @ApiModelProperty(value = "模糊搜索")
+    private String keywords;
+
+    @ApiModelProperty(value = "是否全部")
+    private Boolean isAll = false;
+
+}

+ 24 - 0
fs-service/src/main/java/com/fs/course/param/UserCourseComplaintRecordParam.java

@@ -0,0 +1,24 @@
+package com.fs.course.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class UserCourseComplaintRecordParam {
+
+    @ApiModelProperty(value = "用户id,不传")
+    private Long userId;
+
+    @ApiModelProperty(value = "投诉类型id")
+    private Long complaintTypeId;
+
+    @ApiModelProperty(value = "投诉内容(暂时没有,只是保留这个字段)")
+    private String complaintContent;
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "视频小节id")
+    private Long videoId;
+
+}

+ 4 - 2
fs-service/src/main/java/com/fs/course/service/IFsCourseWatchCommentService.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseWatchComment;
 import com.fs.course.param.FsCourseWatchCommentListParam;
+import com.fs.course.param.FsCourseWatchCommentPageParam;
 import com.fs.course.param.FsCourseWatchCommentSaveParam;
+import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.course.vo.FsCourseWatchCommentVO;
 
 /**
@@ -26,10 +28,10 @@ public interface IFsCourseWatchCommentService extends IService<FsCourseWatchComm
     /**
      * 查询看课评论列表
      *
-     * @param fsCourseWatchComment 看课评论
+     * @param fsCourseWatchCommentPageParam 看课评论
      * @return 看课评论集合
      */
-    List<FsCourseWatchComment> selectFsCourseWatchCommentList(FsCourseWatchComment fsCourseWatchComment);
+    List<FsCourseWatchCommentListVO> selectFsCourseWatchCommentList(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam);
 
     /**
      * 新增看课评论

+ 71 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintRecordService.java

@@ -0,0 +1,71 @@
+package com.fs.course.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCourseComplaintRecord;
+import com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.vo.FsUserCourseComplaintRecordPageListVO;
+
+/**
+ * 看课投诉记录Service接口
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface IFsUserCourseComplaintRecordService extends IService<FsUserCourseComplaintRecord>{
+    /**
+     * 查询看课投诉记录
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 看课投诉记录
+     */
+    FsUserCourseComplaintRecord selectFsUserCourseComplaintRecordByRecordId(Long recordId);
+
+    /**
+     * 查询看课投诉记录列表
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 看课投诉记录集合
+     */
+    List<FsUserCourseComplaintRecordPageListVO> selectFsUserCourseComplaintRecordList(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 新增看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    int insertFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 修改看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    int updateFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord);
+
+    /**
+     * 批量删除看课投诉记录
+     *
+     * @param recordIds 需要删除的看课投诉记录主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintRecordByRecordIds(Long[] recordIds);
+
+    /**
+     * 删除看课投诉记录信息
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintRecordByRecordId(Long recordId);
+
+    /**
+     * 提交投诉记录
+     * @param userCourseComplaintRecordParam 入参
+     * @return int
+     */
+    int submitRecord(UserCourseComplaintRecordParam userCourseComplaintRecordParam);
+
+}

+ 69 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseComplaintTypeService.java

@@ -0,0 +1,69 @@
+package com.fs.course.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCourseComplaintType;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+
+/**
+ * 看课投诉类型Service接口
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface IFsUserCourseComplaintTypeService extends IService<FsUserCourseComplaintType>{
+    /**
+     * 查询看课投诉类型
+     *
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 看课投诉类型
+     */
+    FsUserCourseComplaintType selectFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId);
+
+    /**
+     * 查询看课投诉类型列表
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 看课投诉类型集合
+     */
+    List<FsUserCourseComplaintType> selectFsUserCourseComplaintTypeList(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 新增看课投诉类型
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    int insertFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 修改看课投诉类型
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    int updateFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType);
+
+    /**
+     * 批量删除看课投诉类型
+     *
+     * @param complaintTypeIds 需要删除的看课投诉类型主键集合
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintTypeByComplaintTypeIds(Long[] complaintTypeIds);
+
+    /**
+     * 删除看课投诉类型信息
+     *
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 结果
+     */
+    int deleteFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId);
+
+    /**
+     * 获取投诉类型树结构
+     * @return list
+     */
+    List<FsUserCourseComplaintTypeListVO> getAllComplaintTypeTree();
+
+}

+ 5 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchCommentServiceImpl.java

@@ -9,7 +9,9 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.course.param.FsCourseWatchCommentListParam;
+import com.fs.course.param.FsCourseWatchCommentPageParam;
 import com.fs.course.param.FsCourseWatchCommentSaveParam;
+import com.fs.course.vo.FsCourseWatchCommentListVO;
 import com.fs.course.vo.FsCourseWatchCommentVO;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.system.domain.SysKeyword;
@@ -60,13 +62,13 @@ public class FsCourseWatchCommentServiceImpl extends ServiceImpl<FsCourseWatchCo
     /**
      * 查询看课评论列表
      *
-     * @param fsCourseWatchComment 看课评论
+     * @param fsCourseWatchCommentPageParam 看课评论
      * @return 看课评论
      */
     @Override
-    public List<FsCourseWatchComment> selectFsCourseWatchCommentList(FsCourseWatchComment fsCourseWatchComment)
+    public List<FsCourseWatchCommentListVO> selectFsCourseWatchCommentList(FsCourseWatchCommentPageParam fsCourseWatchCommentPageParam)
     {
-        return baseMapper.selectFsCourseWatchCommentList(fsCourseWatchComment);
+        return baseMapper.selectFsCourseWatchCommentList(fsCourseWatchCommentPageParam);
     }
 
     /**

+ 103 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintRecordServiceImpl.java

@@ -0,0 +1,103 @@
+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 com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.vo.FsUserCourseComplaintRecordPageListVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import com.fs.course.mapper.FsUserCourseComplaintRecordMapper;
+import com.fs.course.domain.FsUserCourseComplaintRecord;
+import com.fs.course.service.IFsUserCourseComplaintRecordService;
+
+/**
+ * 看课投诉记录Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Service
+public class FsUserCourseComplaintRecordServiceImpl extends ServiceImpl<FsUserCourseComplaintRecordMapper, FsUserCourseComplaintRecord> implements IFsUserCourseComplaintRecordService {
+
+    /**
+     * 查询看课投诉记录
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 看课投诉记录
+     */
+    @Override
+    public FsUserCourseComplaintRecord selectFsUserCourseComplaintRecordByRecordId(Long recordId)
+    {
+        return baseMapper.selectFsUserCourseComplaintRecordByRecordId(recordId);
+    }
+
+    /**
+     * 查询看课投诉记录列表
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 看课投诉记录
+     */
+    @Override
+    public List<FsUserCourseComplaintRecordPageListVO> selectFsUserCourseComplaintRecordList(FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        return baseMapper.selectFsUserCourseComplaintRecordPageList(fsUserCourseComplaintRecord);
+    }
+
+    /**
+     * 新增看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        fsUserCourseComplaintRecord.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
+    }
+
+    /**
+     * 修改看课投诉记录
+     *
+     * @param fsUserCourseComplaintRecord 看课投诉记录
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCourseComplaintRecord(FsUserCourseComplaintRecord fsUserCourseComplaintRecord)
+    {
+        return baseMapper.updateFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
+    }
+
+    /**
+     * 批量删除看课投诉记录
+     *
+     * @param recordIds 需要删除的看课投诉记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseComplaintRecordByRecordIds(Long[] recordIds)
+    {
+        return baseMapper.deleteFsUserCourseComplaintRecordByRecordIds(recordIds);
+    }
+
+    /**
+     * 删除看课投诉记录信息
+     *
+     * @param recordId 看课投诉记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseComplaintRecordByRecordId(Long recordId)
+    {
+        return baseMapper.deleteFsUserCourseComplaintRecordByRecordId(recordId);
+    }
+
+    @Override
+    public int submitRecord(UserCourseComplaintRecordParam userCourseComplaintRecordParam) {
+        FsUserCourseComplaintRecord fsUserCourseComplaintRecord = new FsUserCourseComplaintRecord();
+        BeanUtils.copyProperties(userCourseComplaintRecordParam, fsUserCourseComplaintRecord);
+        fsUserCourseComplaintRecord.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCourseComplaintRecord(fsUserCourseComplaintRecord);
+    }
+}

+ 134 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseComplaintTypeServiceImpl.java

@@ -0,0 +1,134 @@
+package com.fs.course.service.impl;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import com.fs.course.mapper.FsUserCourseComplaintTypeMapper;
+import com.fs.course.domain.FsUserCourseComplaintType;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+
+/**
+ * 看课投诉类型Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Service
+public class FsUserCourseComplaintTypeServiceImpl extends ServiceImpl<FsUserCourseComplaintTypeMapper, FsUserCourseComplaintType> implements IFsUserCourseComplaintTypeService {
+
+    /**
+     * 查询看课投诉类型
+     *
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 看课投诉类型
+     */
+    @Override
+    public FsUserCourseComplaintType selectFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId)
+    {
+        return baseMapper.selectFsUserCourseComplaintTypeByComplaintTypeId(complaintTypeId);
+    }
+
+    /**
+     * 查询看课投诉类型列表
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 看课投诉类型
+     */
+    @Override
+    public List<FsUserCourseComplaintType> selectFsUserCourseComplaintTypeList(FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        return baseMapper.selectFsUserCourseComplaintTypeList(fsUserCourseComplaintType);
+    }
+
+    /**
+     * 新增看课投诉类型
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        fsUserCourseComplaintType.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsUserCourseComplaintType(fsUserCourseComplaintType);
+    }
+
+    /**
+     * 修改看课投诉类型
+     *
+     * @param fsUserCourseComplaintType 看课投诉类型
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCourseComplaintType(FsUserCourseComplaintType fsUserCourseComplaintType)
+    {
+        fsUserCourseComplaintType.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsUserCourseComplaintType(fsUserCourseComplaintType);
+    }
+
+    /**
+     * 批量删除看课投诉类型
+     *
+     * @param complaintTypeIds 需要删除的看课投诉类型主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseComplaintTypeByComplaintTypeIds(Long[] complaintTypeIds)
+    {
+        return baseMapper.deleteFsUserCourseComplaintTypeByComplaintTypeIds(complaintTypeIds);
+    }
+
+    /**
+     * 删除看课投诉类型信息
+     *
+     * @param complaintTypeId 看课投诉类型主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseComplaintTypeByComplaintTypeId(Long complaintTypeId)
+    {
+        return baseMapper.deleteFsUserCourseComplaintTypeByComplaintTypeId(complaintTypeId);
+    }
+
+    @Override
+    public List<FsUserCourseComplaintTypeListVO> getAllComplaintTypeTree() {
+        FsUserCourseComplaintType fsUserCourseComplaintType = new FsUserCourseComplaintType();
+        List<FsUserCourseComplaintType> list = baseMapper.selectFsUserCourseComplaintTypeList(fsUserCourseComplaintType);
+        List<FsUserCourseComplaintTypeListVO> collect = list.stream().map(v -> {
+            FsUserCourseComplaintTypeListVO listVO = new FsUserCourseComplaintTypeListVO();
+            BeanUtils.copyProperties(v, listVO);
+            return listVO;
+        }).collect(Collectors.toList());
+
+        //构造树列表
+        return this.buildTree(collect);
+    }
+
+    private List<FsUserCourseComplaintTypeListVO> buildTree(List<FsUserCourseComplaintTypeListVO> complaintTypeList) {
+        List<FsUserCourseComplaintTypeListVO> complaintTypeVOList = new ArrayList<>();
+        Map<Long, FsUserCourseComplaintTypeListVO> complaintTypeMap = new HashMap<>();
+
+        for (FsUserCourseComplaintTypeListVO complaintTypeVO : complaintTypeList) {
+            complaintTypeVO.setChildrenType(new ArrayList<>());
+            complaintTypeMap.put(complaintTypeVO.getComplaintTypeId(), complaintTypeVO);
+        }
+
+        // 构造树列表
+        for (FsUserCourseComplaintTypeListVO complaintTypeVO : complaintTypeList) {
+            if(complaintTypeVO.getParentId() == null || complaintTypeVO.getParentId() == 0){
+                complaintTypeVOList.add(complaintTypeVO);
+            } else {
+                FsUserCourseComplaintTypeListVO complaintTypeListVOChildren = complaintTypeMap.get(complaintTypeVO.getParentId());
+                if(complaintTypeListVOChildren != null){
+                    complaintTypeListVOChildren.getChildrenType().add(complaintTypeVO);
+                }
+            }
+        }
+        return complaintTypeVOList;
+    }
+}

+ 58 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchCommentListVO.java

@@ -0,0 +1,58 @@
+package com.fs.course.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "评论列表-管理端")
+public class FsCourseWatchCommentListVO {
+
+    @ApiModelProperty(value = "评论id")
+    private Long commentId;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @Excel(name = "用户名称")
+    @ApiModelProperty(value = "用户名称")
+    private String nickName;
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "视频id")
+    private Long videoId;
+
+    @Excel(name = "评论内容", width = 120)
+    @ApiModelProperty(value = "评论内容")
+    private String content;
+
+    @Excel(name = "评论时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "评论时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value = "时间(用于弹幕记录时间)")
+    private Integer time;
+
+    @ApiModelProperty(value = "字体大小")
+    private String fontSize;
+
+    @ApiModelProperty(value = "展示模式")
+    private String mode;
+
+    @ApiModelProperty(value = "字体颜色")
+    private String color;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "小节名称")
+    private String title;
+
+}

+ 46 - 0
fs-service/src/main/java/com/fs/course/vo/FsUserCourseComplaintRecordPageListVO.java

@@ -0,0 +1,46 @@
+package com.fs.course.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsUserCourseComplaintRecordPageListVO extends BaseEntity{
+
+    /** 投诉记录id */
+    private Long recordId;
+
+    /** 用户id */
+    private Long userId;
+
+    @Excel(name = "用户昵称")
+    private String nickName;
+
+    @Excel(name = "投诉类型")
+    private String complaintTypeName;
+
+//    @Excel(name = "投诉内容")
+    private String complaintContent;
+
+    @Excel(name = "课程名称")
+    private String courseName;
+
+    @Excel(name = "小节名称")
+    private String title;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Excel(name = "看课状态")
+    private String status;
+
+}

+ 27 - 0
fs-service/src/main/java/com/fs/course/vo/FsUserCourseComplaintTypeListVO.java

@@ -0,0 +1,27 @@
+package com.fs.course.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.List;
+
+@ApiModel(value = "类型列表返回类")
+@Data
+public class FsUserCourseComplaintTypeListVO {
+
+    @ApiModelProperty(value = "投诉类型id")
+    private Long complaintTypeId;
+
+    @ApiModelProperty(value = "投诉类型名称")
+    private String complaintTypeName;
+
+    @ApiModelProperty(value = "级别,目前只有两级")
+    private Integer typeLevel;
+
+    @ApiModelProperty(value = "父级id")
+    private Long parentId;
+
+    @ApiModelProperty(value = "子类型")
+    private List<FsUserCourseComplaintTypeListVO> childrenType;
+
+}

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

@@ -67,4 +67,6 @@ public interface FsPackageCateMapper
     List<OptionsVO> selectFsArticleCateByType(Integer type);
     @Select("select *  FROM fs_package_cate where type=#{type} and cate_code=#{cateCode}")
     FsPackageCate selectFsPackageCateByCateCode(@Param("cateCode") Long cateCode, @Param("type")Integer type);
+
+    List<OptionsVO> selectCateList();
 }

+ 4 - 6
fs-service/src/main/java/com/fs/his/param/FsPackageCateUParam.java

@@ -1,13 +1,9 @@
 package com.fs.his.param;
 
-import com.fs.common.annotation.Excel;
-import com.fs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 套餐包分类对象 fs_package_cate
@@ -16,7 +12,7 @@ import java.io.Serializable;
  * @date 2024-05-08
  */
 @Data
-public class FsPackageCateUParam  implements Serializable
+public class FsPackageCateUParam implements Serializable
 {
 
     /** ID */
@@ -43,4 +39,6 @@ public class FsPackageCateUParam  implements Serializable
 
     private String keyword;
 
+    private List<Integer> companyPackageCates;
+
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/IFsPackageCateService.java

@@ -64,5 +64,6 @@ public interface IFsPackageCateService
     public int deleteFsPackageCateByCateId(Long cateId);
 
     Map selectFsArticleCateAllList();
+    List<OptionsVO> selectCateList();
 
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPackageCateServiceImpl.java

@@ -119,4 +119,9 @@ public class FsPackageCateServiceImpl implements IFsPackageCateService
         map.put("privateType",t2);
         return map;
     }
+
+    @Override
+    public List<OptionsVO> selectCateList() {
+        return fsPackageCateMapper.selectFsArticleCateByType(2);
+    }
 }

+ 8 - 0
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -184,4 +184,12 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
 
 
     List<QwExternalListByHeavyVO> getQwExternalListByHeavy(FsCourseListBySidebarParam param);
+
+    /**
+     * 根据userid修改外部联系人评论状态
+     * @param commentStatus 评论状态
+     * @param fsUserId 用户id
+     * @return
+     */
+    int updateQwExternalContactByFsUserId(Integer commentStatus, Long fsUserId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -342,6 +342,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwUserMapper.getQwExternalListByHeavy(param);
     }
 
+    @Override
+    public int updateQwExternalContactByFsUserId(Integer commentStatus, Long fsUserId) {
+        return qwExternalContactMapper.updateQwExternalContactByFsUserId(commentStatus, fsUserId);
+    }
+
     /**
      * 处理一个分组(组内串行)
      */

+ 27 - 0
fs-service/src/main/java/com/fs/system/domain/SysUserSet.java

@@ -0,0 +1,27 @@
+package com.fs.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户设置对象 sys_user_set
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysUserSet extends BaseEntity{
+
+    /** 系统用户id */
+    private Long userId;
+
+    /** 价格显示比例 */
+    @Excel(name = "价格显示比例")
+    private int rate;
+
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/system/mapper/SysUserSetMapper.java

@@ -0,0 +1,61 @@
+package com.fs.system.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.system.domain.SysUserSet;
+
+/**
+ * 用户设置Mapper接口
+ * 
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface SysUserSetMapper extends BaseMapper<SysUserSet>{
+    /**
+     * 查询用户设置
+     * 
+     * @param userId 用户设置主键
+     * @return 用户设置
+     */
+    SysUserSet selectSysUserSetByUserId(Long userId);
+
+    /**
+     * 查询用户设置列表
+     * 
+     * @param sysUserSet 用户设置
+     * @return 用户设置集合
+     */
+    List<SysUserSet> selectSysUserSetList(SysUserSet sysUserSet);
+
+    /**
+     * 新增用户设置
+     * 
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    int insertSysUserSet(SysUserSet sysUserSet);
+
+    /**
+     * 修改用户设置
+     * 
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    int updateSysUserSet(SysUserSet sysUserSet);
+
+    /**
+     * 删除用户设置
+     * 
+     * @param userId 用户设置主键
+     * @return 结果
+     */
+    int deleteSysUserSetByUserId(Long userId);
+
+    /**
+     * 批量删除用户设置
+     * 
+     * @param userIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteSysUserSetByUserIds(Long[] userIds);
+}

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

@@ -0,0 +1,61 @@
+package com.fs.system.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.system.domain.SysUserSet;
+
+/**
+ * 用户设置Service接口
+ * 
+ * @author fs
+ * @date 2025-06-04
+ */
+public interface ISysUserSetService extends IService<SysUserSet>{
+    /**
+     * 查询用户设置
+     * 
+     * @param userId 用户设置主键
+     * @return 用户设置
+     */
+    SysUserSet selectSysUserSetByUserId(Long userId);
+
+    /**
+     * 查询用户设置列表
+     * 
+     * @param sysUserSet 用户设置
+     * @return 用户设置集合
+     */
+    List<SysUserSet> selectSysUserSetList(SysUserSet sysUserSet);
+
+    /**
+     * 新增用户设置
+     * 
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    int insertSysUserSet(SysUserSet sysUserSet);
+
+    /**
+     * 修改用户设置
+     * 
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    int updateSysUserSet(SysUserSet sysUserSet);
+
+    /**
+     * 批量删除用户设置
+     * 
+     * @param userIds 需要删除的用户设置主键集合
+     * @return 结果
+     */
+    int deleteSysUserSetByUserIds(Long[] userIds);
+
+    /**
+     * 删除用户设置信息
+     * 
+     * @param userId 用户设置主键
+     * @return 结果
+     */
+    int deleteSysUserSetByUserId(Long userId);
+}

+ 101 - 0
fs-service/src/main/java/com/fs/system/service/impl/SysUserSetServiceImpl.java

@@ -0,0 +1,101 @@
+package com.fs.system.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.system.mapper.SysUserSetMapper;
+import com.fs.system.domain.SysUserSet;
+import com.fs.system.service.ISysUserSetService;
+
+/**
+ * 用户设置Service业务层处理
+ *
+ * @author fs
+ * @date 2025-06-04
+ */
+@Service
+public class SysUserSetServiceImpl extends ServiceImpl<SysUserSetMapper, SysUserSet> implements ISysUserSetService {
+
+    /**
+     * 查询用户设置
+     *
+     * @param userId 用户设置主键
+     * @return 用户设置
+     */
+    @Override
+    public SysUserSet selectSysUserSetByUserId(Long userId)
+    {
+        return baseMapper.selectSysUserSetByUserId(userId);
+    }
+
+    /**
+     * 查询用户设置列表
+     *
+     * @param sysUserSet 用户设置
+     * @return 用户设置
+     */
+    @Override
+    public List<SysUserSet> selectSysUserSetList(SysUserSet sysUserSet)
+    {
+        return baseMapper.selectSysUserSetList(sysUserSet);
+    }
+
+    /**
+     * 新增用户设置
+     *
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    @Override
+    public int insertSysUserSet(SysUserSet sysUserSet)
+    {
+        //查询是否存在
+        SysUserSet temp = baseMapper.selectSysUserSetByUserId(sysUserSet.getUserId());
+        if(temp!=null){
+            temp.setRate(sysUserSet.getRate());
+            return baseMapper.updateSysUserSet(sysUserSet);
+        } else {
+            sysUserSet.setCreateTime(DateUtils.getNowDate());
+            return baseMapper.insertSysUserSet(sysUserSet);
+        }
+
+    }
+
+    /**
+     * 修改用户设置
+     *
+     * @param sysUserSet 用户设置
+     * @return 结果
+     */
+    @Override
+    public int updateSysUserSet(SysUserSet sysUserSet)
+    {
+        return baseMapper.updateSysUserSet(sysUserSet);
+    }
+
+    /**
+     * 批量删除用户设置
+     *
+     * @param userIds 需要删除的用户设置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserSetByUserIds(Long[] userIds)
+    {
+        return baseMapper.deleteSysUserSetByUserIds(userIds);
+    }
+
+    /**
+     * 删除用户设置信息
+     *
+     * @param userId 用户设置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysUserSetByUserId(Long userId)
+    {
+        return baseMapper.deleteSysUserSetByUserId(userId);
+    }
+}

+ 3 - 0
fs-service/src/main/resources/application-config-dev.yml

@@ -67,3 +67,6 @@ headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
   ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:

+ 82 - 0
fs-service/src/main/resources/application-config-druid-fcky.yml

@@ -0,0 +1,82 @@
+baidu:
+  token: 12313231232
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  cp:
+    corpId: wwb2a1055fb6c9a7c2
+    appConfigs:
+      - agentId: 1000005
+        secret: ec7okROXJqkNafq66-L6aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx5d3096e20e4bd8ba # 第一个公众号的appid  //公众号名称:成都九州在线互联网医院
+        secret: 1afa05f0c71beff0d52fb849c62e479a # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://127.0.0.1:7771
+  h5CommonApi: http://127.0.0.1:7771
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDXv75pKcgeR6YnobBYhbIkyykLjuwlNlv
+  secret_key: zmMiqjPr55rPwISUJuITSDmDVZO0PcbN
+  bucket: fc-1361520560
+  app_id: 1361520560
+  region: ap-beijing
+  proxy: fc
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 蜂巢快药
+headerImg:
+  imgUrl: https
+ipad:
+  ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+
+
+

+ 3 - 0
fs-service/src/main/resources/application-config-druid-jnmy.yml

@@ -74,6 +74,9 @@ headerImg:
   imgUrl: https
 ipad:
   ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id: -SjnK9K6cNKASa6AD9Q_c0YT7J1lPTEpPIpqbMJF8F0
+  inquiry_temp_id: hwFXVh0AWqeasBsZpa0-urb3CrPeYEwBiy3P6AMMGFQ
 
 
 

+ 150 - 0
fs-service/src/main/resources/application-druid-fcky.yml

@@ -0,0 +1,150 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-fcky,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 10.206.0.14
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrz_1q2w3e4r5t6y
+        # 连接超时时间
+        timeout: 20s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        #        clickhouse:
+        #            type: com.alibaba.druid.pool.DruidDataSource
+        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+        #            url: jdbc:clickhouse://cc-2vc8zzo26w0l7m2l6.public.clickhouse.ads.aliyuncs.com/sop?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+        #            username: rt_2024
+        #            password: Yzx_19860213
+        #            initialSize: 10
+        #            maxActive: 100
+        #            minIdle: 10
+        #            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.3:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.3:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 4 - 2
fs-service/src/main/resources/db/20250530-初始化表结构.sql

@@ -18,7 +18,7 @@ CREATE TABLE `sys_keyword`  (
 SET FOREIGN_KEY_CHECKS = 1;
 
 
-    
+
 
 SET NAMES utf8mb4;
 SET FOREIGN_KEY_CHECKS = 0;
@@ -44,7 +44,9 @@ CREATE TABLE `fs_course_watch_comment`  (
                                             `mode` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '展示模式',
                                             `color` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '字体颜色',
                                             PRIMARY KEY (`comment_id`) USING BTREE,
-                                            INDEX `user_id_index`(`user_id` ASC) USING BTREE
+                                            INDEX `user_id_index`(`user_id` ASC) USING BTREE,
+                                            INDEX `course_id_index`(`course_id` ASC) USING BTREE,
+                                            INDEX `video_id_index`(`video_id` ASC) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 128 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '看课评论表' ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 34 - 0
fs-service/src/main/resources/db/20250605-初始化表结构.sql

@@ -0,0 +1,34 @@
+-- ----------------------------
+-- Table structure for fs_user_course_complaint_record
+-- ----------------------------
+DROP TABLE IF EXISTS `fs_user_course_complaint_record`;
+CREATE TABLE `fs_user_course_complaint_record`  (
+                                                    `record_id` bigint NOT NULL AUTO_INCREMENT COMMENT '投诉记录id',
+                                                    `user_id` bigint NULL DEFAULT NULL COMMENT '用户id,关联fs_user',
+                                                    `complaint_type_id` bigint NULL DEFAULT NULL COMMENT '投诉类型id',
+                                                    `complaint_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '投诉内容',
+                                                    `course_id` bigint NULL DEFAULT NULL COMMENT '课程id',
+                                                    `video_id` bigint NULL DEFAULT NULL COMMENT '视频小节id',
+                                                    `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                                    PRIMARY KEY (`record_id`) USING BTREE,
+                                                    INDEX `user_id_index`(`user_id` ASC) USING BTREE,
+                                                    INDEX `complaint_type_id_index`(`complaint_type_id` ASC) USING BTREE,
+                                                    INDEX `course_id_index`(`course_id` ASC) USING BTREE,
+                                                    INDEX `video_id_index`(`video_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '看课投诉记录' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for fs_user_course_complaint_type
+-- ----------------------------
+DROP TABLE IF EXISTS `fs_user_course_complaint_type`;
+CREATE TABLE `fs_user_course_complaint_type`  (
+                                                  `complaint_type_id` bigint NOT NULL AUTO_INCREMENT COMMENT '投诉类型id',
+                                                  `parent_id` bigint NULL DEFAULT NULL COMMENT '父id,关联主键id',
+                                                  `complaint_type_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '投诉类型名称',
+                                                  `type_level` int NULL DEFAULT NULL COMMENT '级别(目前只有两级)',
+                                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                                  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+                                                  PRIMARY KEY (`complaint_type_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '看课投诉类型表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -32,10 +32,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="followDoctorIds"    column="follow_doctor_ids"    />
         <result property="doctorIds"    column="doctor_ids"    />
         <result property="restartTime"    column="restart_time"    />
+        <result property="packageCateIds"    column="package_cate_ids"    />
     </resultMap>
 
     <sql id="selectCompanyVo">
-        select company_id,follow_doctor_ids,doctor_ids, company_name,manager, company_mobile, company_address, create_time, update_time, status, start_time, limit_time, money ,tui_money, voice_api_id,company_type,user_id,app_id,app_key,remark,link_name,limit_user_count,is_del,voice_caller_number,oms_code,restart_time from company
+        select company_id,follow_doctor_ids,doctor_ids, company_name,manager, company_mobile, company_address, create_time, update_time, status, start_time, limit_time, money ,tui_money, voice_api_id,company_type,user_id,app_id,app_key,remark,link_name,limit_user_count,is_del,voice_caller_number,oms_code,restart_time,package_cate_ids from company
     </sql>
 
     <select id="selectCompanyList" parameterType="Company" resultMap="CompanyResult">
@@ -49,6 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null "> and is_del = #{isDel}</if>
             <if test="voiceApiId != null "> and voice_api_id = #{voiceApiId}</if>
             <if test="restartTime != null "> and restart_time = #{restartTime}</if>
+            <if test="packageCateIds != null "> and package_cate_ids = #{packageCateIds}</if>
         </where>
     </select>
 
@@ -84,6 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followDoctorIds != null">follow_doctor_ids,</if>
             <if test="doctorIds != null">doctor_ids,</if>
             <if test="restartTime != null">restart_time,</if>
+            <if test="packageCateIds != null">package_cate_ids,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -110,6 +113,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followDoctorIds != null">#{followDoctorIds},</if>
             <if test="doctorIds != null">#{doctorIds},</if>
             <if test="restartTime != null">#{restartTime},</if>
+            <if test="packageCateIds != null">#{packageCateIds},</if>
          </trim>
     </insert>
 
@@ -141,6 +145,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followDoctorIds != null">follow_doctor_ids = #{followDoctorIds},</if>
             <if test="doctorIds != null">doctor_ids = #{doctorIds},</if>
             <if test="restartTime != null">restart_time = #{restartTime},</if>
+            <if test="packageCateIds != null">package_cate_ids = #{packageCateIds},</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 35 - 10
fs-service/src/main/resources/mapper/course/FsCourseWatchCommentMapper.xml

@@ -27,17 +27,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                font_size, mode, color from fs_course_watch_comment
     </sql>
 
-    <select id="selectFsCourseWatchCommentList" parameterType="FsCourseWatchComment" resultMap="FsCourseWatchCommentResult">
-        <include refid="selectFsCourseWatchCommentVo"/>
+    <select id="selectFsCourseWatchCommentList" resultType="com.fs.course.vo.FsCourseWatchCommentListVO">
+        SELECT
+        fs_course_watch_comment.comment_id,
+        fs_course_watch_comment.user_id,
+        fs_course_watch_comment.user_type,
+        fs_course_watch_comment.course_id,
+        fs_course_watch_comment.video_id,
+        fs_course_watch_comment.type,
+        fs_course_watch_comment.parent_id,
+        fs_course_watch_comment.content,
+        fs_course_watch_comment.create_time,
+        fs_course_watch_comment.update_time,
+        fs_course_watch_comment.is_revoke,
+        fs_course_watch_comment.`time`,
+        fs_course_watch_comment.font_size,
+        fs_course_watch_comment.`mode`,
+        fs_course_watch_comment.color,
+        fs_user.nick_name
+        <if test="isAll != null and isAll == true ">
+            ,fs_user_course.course_name, fs_user_course_video.title
+        </if>
+        FROM
+        fs_course_watch_comment
+        LEFT JOIN fs_user ON fs_user.user_id = fs_course_watch_comment.user_id
+        <if test="isAll != null and isAll == true">
+            LEFT JOIN fs_user_course on fs_user_course.course_id = fs_course_watch_comment.course_id
+            LEFT JOIN fs_user_course_video on fs_user_course_video.video_id = fs_course_watch_comment.video_id
+        </if>
         <where>
-            <if test="userId != null "> and user_id = #{userId}</if>
-            <if test="userType != null "> and user_type = #{userType}</if>
-            <if test="courseId != null "> and course_id = #{courseId}</if>
-            <if test="videoId != null "> and video_id = #{videoId}</if>
-            <if test="type != null "> and type = #{type}</if>
-            <if test="parentId != null "> and parent_id = #{parentId}</if>
-            <if test="content != null  and content != ''"> and content = #{content}</if>
-            <if test="isRevoke != null "> and is_revoke = #{isRevoke}</if>
+            <if test="nickName != null and nickName != '' ">and fs_user.nick_name like concat('%', #{nickName}, '%')</if>
+            <if test="isAll != null and isAll == true and keywords != null and keywords !='' ">
+                AND (fs_user.nickname LIKE concat('%',#{keywords},'%')
+                or  fs_user_course.course_name LIKE concat('%',#{keywords},'%')
+                or  fs_user_course_video.title LIKE concat('%',#{keywords},'%')
+                )
+            </if>
         </where>
     </select>
 

+ 102 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseComplaintRecordMapper.xml

@@ -0,0 +1,102 @@
+<?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.FsUserCourseComplaintRecordMapper">
+
+    <resultMap type="FsUserCourseComplaintRecord" id="FsUserCourseComplaintRecordResult">
+        <result property="recordId"    column="record_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="complaintTypeId"    column="complaint_type_id"    />
+        <result property="complaintContent"    column="complaint_content"    />
+        <result property="courseId"    column="course_id"    />
+        <result property="videoId"    column="video_id"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectFsUserCourseComplaintRecordVo">
+        select record_id, user_id, complaint_type_id, complaint_content, course_id, video_id, create_time from fs_user_course_complaint_record
+    </sql>
+
+    <select id="selectFsUserCourseComplaintRecordList" parameterType="FsUserCourseComplaintRecord" resultMap="FsUserCourseComplaintRecordResult">
+        <include refid="selectFsUserCourseComplaintRecordVo"/>
+        <where>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="complaintTypeId != null "> and complaint_type_id = #{complaintTypeId}</if>
+            <if test="complaintContent != null  and complaintContent != ''"> and complaint_content = #{complaintContent}</if>
+            <if test="courseId != null "> and course_id = #{courseId}</if>
+            <if test="videoId != null "> and video_id = #{videoId}</if>
+        </where>
+    </select>
+
+    <select id="selectFsUserCourseComplaintRecordPageList" resultType="com.fs.course.vo.FsUserCourseComplaintRecordPageListVO">
+        SELECT
+        cr.*,
+        ct.complaint_type_name,
+        uc.course_name,
+        ucv.title,
+        fs_user.nick_name,
+        if(ec.comment_status = 1,'已拉黑','正常') as status
+        FROM
+        fs_user_course_complaint_record cr
+        LEFT JOIN fs_user_course_complaint_type ct ON ct.complaint_type_id = cr.complaint_type_id
+        LEFT JOIN fs_user_course uc ON uc.course_id = cr.course_id
+        LEFT JOIN fs_user_course_video ucv ON ucv.video_id = cr.video_id
+        LEFT JOIN fs_user ON fs_user.user_id = cr.user_id
+        left join qw_external_contact ec on cr.user_id = ec.fs_user_id
+        <where>
+            <if test="nickName != null and nickName != '' ">
+                and fs_user.nick_name like concat('%', #{nickName}, '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectFsUserCourseComplaintRecordByRecordId" parameterType="Long" resultMap="FsUserCourseComplaintRecordResult">
+        <include refid="selectFsUserCourseComplaintRecordVo"/>
+        where record_id = #{recordId}
+    </select>
+
+    <insert id="insertFsUserCourseComplaintRecord" parameterType="FsUserCourseComplaintRecord" useGeneratedKeys="true" keyProperty="recordId">
+        insert into fs_user_course_complaint_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="complaintTypeId != null">complaint_type_id,</if>
+            <if test="complaintContent != null">complaint_content,</if>
+            <if test="courseId != null">course_id,</if>
+            <if test="videoId != null">video_id,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="complaintTypeId != null">#{complaintTypeId},</if>
+            <if test="complaintContent != null">#{complaintContent},</if>
+            <if test="courseId != null">#{courseId},</if>
+            <if test="videoId != null">#{videoId},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserCourseComplaintRecord" parameterType="FsUserCourseComplaintRecord">
+        update fs_user_course_complaint_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="complaintTypeId != null">complaint_type_id = #{complaintTypeId},</if>
+            <if test="complaintContent != null">complaint_content = #{complaintContent},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
+            <if test="videoId != null">video_id = #{videoId},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where record_id = #{recordId}
+    </update>
+
+    <delete id="deleteFsUserCourseComplaintRecordByRecordId" parameterType="Long">
+        delete from fs_user_course_complaint_record where record_id = #{recordId}
+    </delete>
+
+    <delete id="deleteFsUserCourseComplaintRecordByRecordIds" parameterType="String">
+        delete from fs_user_course_complaint_record where record_id in
+        <foreach item="recordId" collection="array" open="(" separator="," close=")">
+            #{recordId}
+        </foreach>
+    </delete>
+</mapper>

+ 74 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseComplaintTypeMapper.xml

@@ -0,0 +1,74 @@
+<?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.FsUserCourseComplaintTypeMapper">
+
+    <resultMap type="FsUserCourseComplaintType" id="FsUserCourseComplaintTypeResult">
+        <result property="complaintTypeId"    column="complaint_type_id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="complaintTypeName"    column="complaint_type_name"    />
+        <result property="typeLevel"    column="type_level"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectFsUserCourseComplaintTypeVo">
+        select complaint_type_id, parent_id, complaint_type_name, type_level, create_time, update_time from fs_user_course_complaint_type
+    </sql>
+
+    <select id="selectFsUserCourseComplaintTypeList" parameterType="FsUserCourseComplaintType" resultMap="FsUserCourseComplaintTypeResult">
+        <include refid="selectFsUserCourseComplaintTypeVo"/>
+        <where>
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+            <if test="complaintTypeName != null  and complaintTypeName != ''"> and complaint_type_name like concat('%', #{complaintTypeName}, '%')</if>
+            <if test="typeLevel != null "> and type_level = #{typeLevel}</if>
+        </where>
+    </select>
+
+    <select id="selectFsUserCourseComplaintTypeByComplaintTypeId" parameterType="Long" resultMap="FsUserCourseComplaintTypeResult">
+        <include refid="selectFsUserCourseComplaintTypeVo"/>
+        where complaint_type_id = #{complaintTypeId}
+    </select>
+
+    <insert id="insertFsUserCourseComplaintType" parameterType="FsUserCourseComplaintType" useGeneratedKeys="true" keyProperty="complaintTypeId">
+        insert into fs_user_course_complaint_type
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">parent_id,</if>
+            <if test="complaintTypeName != null">complaint_type_name,</if>
+            <if test="typeLevel != null">type_level,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">#{parentId},</if>
+            <if test="complaintTypeName != null">#{complaintTypeName},</if>
+            <if test="typeLevel != null">#{typeLevel},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserCourseComplaintType" parameterType="FsUserCourseComplaintType">
+        update fs_user_course_complaint_type
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="complaintTypeName != null">complaint_type_name = #{complaintTypeName},</if>
+            <if test="typeLevel != null">type_level = #{typeLevel},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where complaint_type_id = #{complaintTypeId}
+    </update>
+
+    <delete id="deleteFsUserCourseComplaintTypeByComplaintTypeId" parameterType="Long">
+        delete from fs_user_course_complaint_type where complaint_type_id = #{complaintTypeId}
+    </delete>
+
+    <delete id="deleteFsUserCourseComplaintTypeByComplaintTypeIds" parameterType="String">
+        delete from fs_user_course_complaint_type where complaint_type_id in
+        <foreach item="complaintTypeId" collection="array" open="(" separator="," close=")">
+            #{complaintTypeId}
+        </foreach>
+    </delete>
+</mapper>

+ 6 - 0
fs-service/src/main/resources/mapper/his/FsPackageCateMapper.xml

@@ -24,6 +24,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="cateCode != null "> and cate_code = #{cateCode}</if>
             <if test="type != null "> and type = #{type}</if>
             <if test="cateName != null  and cateName != ''"> and cate_name like concat('%', #{cateName}, '%')</if>
+            <if test="companyPackageCates != null  and companyPackageCates != ''">
+                AND cate_code IN
+                <foreach collection="companyPackageCates" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
             <if test="status != null "> and status = #{status}</if>
             <if test="imgUrl != null  and imgUrl != ''"> and img_url = #{imgUrl}</if>
             <if test="sort != null "> and sort = #{sort}</if>

+ 62 - 0
fs-service/src/main/resources/mapper/system/SysUserSetMapper.xml

@@ -0,0 +1,62 @@
+<?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.system.mapper.SysUserSetMapper">
+    
+    <resultMap type="SysUserSet" id="SysUserSetResult">
+        <result property="userId"    column="user_id"    />
+        <result property="rate"    column="rate"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectSysUserSetVo">
+        select user_id, rate, create_time from sys_user_set
+    </sql>
+
+    <select id="selectSysUserSetList" parameterType="SysUserSet" resultMap="SysUserSetResult">
+        <include refid="selectSysUserSetVo"/>
+        <where>  
+            <if test="rate != null "> and rate = #{rate}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysUserSetByUserId" parameterType="Long" resultMap="SysUserSetResult">
+        <include refid="selectSysUserSetVo"/>
+        where user_id = #{userId}
+    </select>
+        
+    <insert id="insertSysUserSet" parameterType="SysUserSet">
+        insert into sys_user_set
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="rate != null">rate,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="rate != null">#{rate},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysUserSet" parameterType="SysUserSet">
+        update sys_user_set
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="rate != null">rate = #{rate},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where user_id = #{userId}
+    </update>
+
+    <delete id="deleteSysUserSetByUserId" parameterType="Long">
+        delete from sys_user_set where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteSysUserSetByUserIds" parameterType="String">
+        delete from sys_user_set where user_id in 
+        <foreach item="userId" collection="array" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+</mapper>

+ 28 - 2
fs-user-app/src/main/java/com/fs/app/controller/PackageController.java

@@ -1,11 +1,18 @@
 package com.fs.app.controller;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.file.ImageUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.domain.FsUserCourseFavorite;
 import com.fs.course.param.FsUserCourseFollowUParam;
 import com.fs.his.domain.*;
@@ -54,13 +61,32 @@ public class PackageController extends AppBaseController {
     private IFsDoctorService doctorService;
     @Autowired
     private IFsStoreService storeService;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private ICompanyService companyService;
 
     @ApiOperation("获取套餐分类")
     @Cacheable(value = "getPackagCateList", key = "#param")
     @GetMapping("/getPackagCateList")
     public R getPackagCateList(FsPackageCateUParam param) {
-        List<FsPackageCate> cates = packageCateService.selectFsPackageCateList(param);
-        return R.ok().put("data", cates);
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            Long companyUserId = getCompanyUserId();
+            CompanyUser companyUser=companyUserService.selectCompanyUserById(companyUserId);
+            Company company = companyService.selectCompanyById(companyUser.getCompanyId());
+            String packageCateIds = company.getPackageCateIds();
+            List<Integer> cateIdList = objectMapper.readValue(packageCateIds, new TypeReference<List<Integer>>() {});
+            if (param.getType()==2){
+                param.setCompanyPackageCates(cateIdList);
+            }
+        } catch (Exception e) {
+            log.info("获取套餐分类:销售未登录");
+        } finally {
+            List<FsPackageCate> cates = packageCateService.selectFsPackageCateList(param);
+            return R.ok().put("data", cates);
+        }
+
     }
 
     @ApiOperation("获取套餐列表")

+ 48 - 0
fs-user-app/src/main/java/com/fs/app/controller/UserCourseComplaintController.java

@@ -0,0 +1,48 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.course.param.UserCourseComplaintRecordParam;
+import com.fs.course.service.IFsUserCourseComplaintRecordService;
+import com.fs.course.service.IFsUserCourseComplaintTypeService;
+import com.fs.course.vo.FsUserCourseComplaintTypeListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api("看课投诉相关接口")
+@RestController
+@RequestMapping("/app/user/complaint")
+public class UserCourseComplaintController extends AppBaseController {
+
+    @Autowired
+    private IFsUserCourseComplaintTypeService fsUserCourseComplaintTypeService;
+
+    @Autowired
+    private IFsUserCourseComplaintRecordService fsUserCourseComplaintRecordService;
+
+    @Login
+    @ApiOperation("获取投诉类型")
+    @GetMapping("/getTypeTree")
+    public R getTypeTree() {
+        List<FsUserCourseComplaintTypeListVO> allComplaintTypeTree = fsUserCourseComplaintTypeService.getAllComplaintTypeTree();
+        return R.ok().put("data", allComplaintTypeTree);
+    }
+
+    @Login
+    @ApiOperation("提交反馈记录")
+    @PostMapping("/record")
+    public R submitRecord(@RequestBody UserCourseComplaintRecordParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        int i = fsUserCourseComplaintRecordService.submitRecord(param);
+        if (i > 0) {
+            return R.ok();
+        } else {
+            return R.error();
+        }
+    }
+
+}