Bläddra i källkod

Merge remote-tracking branch 'origin/master'

yjwang 5 dagar sedan
förälder
incheckning
9851db5208
19 ändrade filer med 476 tillägg och 29 borttagningar
  1. 24 0
      fs-company-app/src/main/java/com/fs/app/controller/CompanyTagController.java
  2. 62 0
      fs-company-app/src/main/java/com/fs/app/controller/FsUserOperationLogController.java
  3. 70 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwSopController.java
  4. 72 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/QwSopController.java
  5. 69 0
      fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java
  6. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyTagUserMapper.java
  7. 7 0
      fs-service/src/main/java/com/fs/company/service/ICompanyTagUserService.java
  8. 11 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java
  9. 4 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseComplaintRecord.java
  10. 4 1
      fs-service/src/main/java/com/fs/course/param/UserCourseComplaintRecordParam.java
  11. 10 8
      fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java
  12. 20 0
      fs-service/src/main/java/com/fs/his/param/FsUserOperationLogQueryParam.java
  13. 10 8
      fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java
  14. 51 9
      fs-service/src/main/java/com/fs/his/service/impl/FsUserOperationLogServiceImpl.java
  15. 31 0
      fs-service/src/main/java/com/fs/his/vo/FsUserOperationLogPageVo.java
  16. 8 2
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java
  17. 15 0
      fs-service/src/main/resources/mapper/company/CompanyTagUserMapper.xml
  18. 5 1
      fs-service/src/main/resources/mapper/course/FsUserCourseComplaintRecordMapper.xml
  19. 1 0
      fs-service/src/main/resources/mapper/his/FsUserOperationLogMapper.xml

+ 24 - 0
fs-company-app/src/main/java/com/fs/app/controller/CompanyTagController.java

@@ -6,8 +6,11 @@ import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyTag;
+import com.fs.company.domain.CompanyTagUser;
 import com.fs.company.service.ICompanyTagService;
 import com.fs.company.service.ICompanyTagUserService;
+import com.fs.company.vo.CompanyTagUserVO;
+import com.fs.store.vo.h5.CompanyUserTagListVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -86,4 +89,25 @@ public class CompanyTagController extends AppBaseController {
         params.put("companyId", getCompanyId());
         return R.ok().put("data", companyTagUserService.selectUserListByMap(params));
     }
+
+    @Login
+    @GetMapping("/getTagByUser")
+    @ApiOperation("会员的标签")
+    public R getTagByUser(@RequestParam("userId") Long userId) {
+        CompanyTagUser map = new CompanyTagUser();
+        map.setUserId(userId);
+        map.setCompanyId(getCompanyId());
+        map.setCompanyUserId(Long.valueOf(getUserId()));
+        List<CompanyUserTagListVO> vos = companyTagUserService.getTagByUser(map);
+        StringBuilder tags = new StringBuilder();
+        if (vos != null && !vos.isEmpty()) {
+            for (CompanyUserTagListVO vo : vos) {
+                tags.append(vo.getTagName()).append(",");
+            }
+            if (tags.length() > 0) {
+                tags.deleteCharAt(tags.length() - 1);
+            }
+        }
+        return R.ok().put("data",tags.length()>0?tags.toString():null);
+    }
 }

+ 62 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserOperationLogController.java

@@ -0,0 +1,62 @@
+package com.fs.app.controller;
+
+import java.util.List;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
+import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.his.param.FsUserOperationLogQueryParam;
+import com.fs.his.vo.FsUserOperationLogPageVo;
+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.his.domain.FsUserOperationLog;
+import com.fs.his.service.IFsUserOperationLogService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 用户操作日志Controller
+ *
+ * @author fs
+ * @date 2025-07-04
+ */
+@RestController
+@RequestMapping("/app/operationLog")
+public class FsUserOperationLogController extends AppBaseController
+{
+    @Autowired
+    private IFsUserOperationLogService fsUserOperationLogService;
+
+    /**
+     * 查询用户操作日志列表
+     */
+    @PostMapping("/page")
+    @Login
+    public ResponseResult<PageInfo<FsUserOperationLogPageVo>> list(@RequestBody FsUserOperationLogQueryParam param)
+    {
+        if (param.getUserId() == null){
+            return ResponseResult.fail(500,"未选择会员");
+        }
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<FsUserOperationLogPageVo> list = fsUserOperationLogService.selectFsUserOperationLogList(param);
+        PageInfo<FsUserOperationLogPageVo> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
+
+}

+ 70 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/ApisQwSopController.java

@@ -1,17 +1,28 @@
 package com.fs.app.controller;
 
 import com.fs.app.params.SopLogsEditParam;
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.fastGpt.service.IFastGptChatSessionService;
+import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.SopMsgParam;
+import com.fs.qw.param.sidebar.ExternalContactInfoParam;
+import com.fs.qw.param.sidebar.TagGroupListParam;
+import com.fs.qw.param.sidebar.TagGroupUpdateParam;
 import com.fs.qw.result.QwExternalContactByQwResult;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwTagGroupService;
+import com.fs.qw.vo.QwTagGroupListVO;
+import com.fs.qw.vo.sidebar.ExternalContactInfoVO;
+import com.fs.qw.vo.sidebar.ExternalContactTagVO;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.params.GetQwSopLogsByJsApiParam;
 import com.fs.sop.params.SendSopParamDetailsC;
 import com.fs.sop.service.IQwSopLogsService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -30,6 +41,13 @@ public class ApisQwSopController {
     IFastGptChatSessionService fastGptChatSessionService;
     @Autowired
     private IQwSopLogsService qwSopLogsService;
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwTagGroupService qwTagGroupService;
+
     /**
      * 更新AI发送状态
      */
@@ -87,4 +105,56 @@ public class ApisQwSopController {
         return R.ok().put("data",listPageInfo);
     }
 
+    @GetMapping("/externalContact")
+    @ApiOperation("获取侧边栏外部联系人信息")
+    public R getExternalContactInfo(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        ExternalContactInfoVO externalContactInfo = qwExternalContactService.getExternalContactInfo(qwExternalContactId);
+        return R.ok().put("data", externalContactInfo);
+    }
+
+
+    @GetMapping("/externalContact/tag")
+    @ApiOperation("获取侧边栏外部联系人标签")
+    public R getExternalContactTag(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        List<ExternalContactTagVO> tagList = qwExternalContactService.getExternalContactTag(qwExternalContactId);
+        return R.ok().put("data", tagList);
+    }
+
+    @PutMapping("/externalContact")
+    @ApiOperation("编辑外部联系人信息")
+    public R updateExternalContactInfo(@RequestBody ExternalContactInfoParam param) {
+        return qwExternalContactService.updateExternalContactInfo(param);
+    }
+
+    @GetMapping("/tagGroupList")
+    @ApiOperation("获取所有标签组和其下标签")
+    public R getTagGroupList(TagGroupListParam param) {
+        QwTagGroup qwTagGroup = new QwTagGroup();
+        BeanCopyUtils.copy(param, qwTagGroup);
+        qwTagGroup.setName(param.getTagName());
+
+        PageHelper.startPage(qwTagGroup.getPageNum(), qwTagGroup.getPageSize());
+        List<QwTagGroupListVO> list = qwTagGroupService.selectQwGroupTagList(qwTagGroup);
+
+        PageInfo<QwTagGroupListVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+    }
+
+//    @GetMapping("/searchTags")
+//    @ApiOperation("搜索标签-跟管理端保持一致")
+//    public R searchTagList(QwTagParam param) {
+//        List<QwTagGroupListVO> list = qwTagService.searchTags(param);
+//        return R.ok().put("data", list);
+//    }
+
+    @PutMapping("/externalContact/tag")
+    @ApiOperation("编辑标签")
+    public R updateExternalContactTag(@RequestBody TagGroupUpdateParam param) {
+        int i = qwExternalContactService.updateExternalContactTag(param);
+        if (i > 0) {
+            return R.ok();
+        }
+        return R.error();
+    }
+
 }

+ 72 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/QwSopController.java

@@ -1,17 +1,28 @@
 package com.fs.app.controller;
 
 import com.fs.app.params.SopLogsEditParam;
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.fastGpt.service.IFastGptChatSessionService;
+import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.SopMsgParam;
+import com.fs.qw.param.sidebar.ExternalContactInfoParam;
+import com.fs.qw.param.sidebar.TagGroupListParam;
+import com.fs.qw.param.sidebar.TagGroupUpdateParam;
 import com.fs.qw.result.QwExternalContactByQwResult;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwTagGroupService;
+import com.fs.qw.vo.QwTagGroupListVO;
+import com.fs.qw.vo.sidebar.ExternalContactInfoVO;
+import com.fs.qw.vo.sidebar.ExternalContactTagVO;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.params.GetQwSopLogsByJsApiParam;
 import com.fs.sop.params.SendSopParamDetailsC;
 import com.fs.sop.service.IQwSopLogsService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -31,6 +42,13 @@ public class QwSopController {
     IFastGptChatSessionService fastGptChatSessionService;
     @Autowired
     private IQwSopLogsService qwSopLogsService;
+
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+
+    @Autowired
+    private IQwTagGroupService qwTagGroupService;
+
     /**
      * 更新AI发送状态
      */
@@ -90,4 +108,58 @@ public class QwSopController {
         return R.ok().put("data",listPageInfo);
     }
 
+
+    @GetMapping("/externalContact")
+    @ApiOperation("获取侧边栏外部联系人信息")
+    public R getExternalContactInfo(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        ExternalContactInfoVO externalContactInfo = qwExternalContactService.getExternalContactInfo(qwExternalContactId);
+        return R.ok().put("data", externalContactInfo);
+    }
+
+
+    @GetMapping("/externalContact/tag")
+    @ApiOperation("获取侧边栏外部联系人标签")
+    public R getExternalContactTag(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        List<ExternalContactTagVO> tagList = qwExternalContactService.getExternalContactTag(qwExternalContactId);
+        return R.ok().put("data", tagList);
+    }
+
+    @PutMapping("/externalContact")
+    @ApiOperation("编辑外部联系人信息")
+    public R updateExternalContactInfo(@RequestBody ExternalContactInfoParam param) {
+        return qwExternalContactService.updateExternalContactInfo(param);
+    }
+
+    @GetMapping("/tagGroupList")
+    @ApiOperation("获取所有标签组和其下标签")
+    public R getTagGroupList(TagGroupListParam param) {
+        QwTagGroup qwTagGroup = new QwTagGroup();
+        BeanCopyUtils.copy(param, qwTagGroup);
+        qwTagGroup.setName(param.getTagName());
+
+        PageHelper.startPage(qwTagGroup.getPageNum(), qwTagGroup.getPageSize());
+        List<QwTagGroupListVO> list = qwTagGroupService.selectQwGroupTagList(qwTagGroup);
+
+        PageInfo<QwTagGroupListVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+    }
+
+//    @GetMapping("/searchTags")
+//    @ApiOperation("搜索标签-跟管理端保持一致")
+//    public R searchTagList(QwTagParam param) {
+//        List<QwTagGroupListVO> list = qwTagService.searchTags(param);
+//        return R.ok().put("data", list);
+//    }
+
+    @PutMapping("/externalContact/tag")
+    @ApiOperation("编辑标签")
+    public R updateExternalContactTag(@RequestBody TagGroupUpdateParam param) {
+        int i = qwExternalContactService.updateExternalContactTag(param);
+        if (i > 0) {
+            return R.ok();
+        }
+        return R.error();
+    }
+
+
 }

+ 69 - 0
fs-qwhook/src/main/java/com/fs/app/controller/QwUserController.java

@@ -1,13 +1,24 @@
 package com.fs.app.controller;
 
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.qw.domain.QwExternalContactInfo;
+import com.fs.qw.domain.QwTagGroup;
 import com.fs.qw.param.ExternalContactDetailsParam;
+import com.fs.qw.param.sidebar.ExternalContactInfoParam;
+import com.fs.qw.param.sidebar.TagGroupListParam;
+import com.fs.qw.param.sidebar.TagGroupUpdateParam;
 import com.fs.qw.service.IQwExternalContactInfoService;
 import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.service.IQwTagGroupService;
 import com.fs.qw.vo.ExternalContactDetailsVO;
+import com.fs.qw.vo.QwTagGroupListVO;
+import com.fs.qw.vo.sidebar.ExternalContactInfoVO;
+import com.fs.qw.vo.sidebar.ExternalContactTagVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -16,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -30,6 +42,9 @@ public class QwUserController extends BaseController {
     @Autowired
     private IQwExternalContactInfoService qwExternalContactInfoService;
 
+    @Autowired
+    private IQwTagGroupService qwTagGroupService;
+
     @GetMapping("/details")
     @ApiOperation("会员看课详情")
     public R getUserDetails(@ApiParam(value = "外部联系人id", required = true) @RequestParam Long contactId,
@@ -66,4 +81,58 @@ public class QwUserController extends BaseController {
         return R.ok();
     }
 
+
+    @GetMapping("/externalContact")
+    @ApiOperation("获取侧边栏外部联系人信息")
+    public R getExternalContactInfo(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        ExternalContactInfoVO externalContactInfo = qwExternalContactService.getExternalContactInfo(qwExternalContactId);
+        return R.ok().put("data", externalContactInfo);
+    }
+
+
+    @GetMapping("/externalContact/tag")
+    @ApiOperation("获取侧边栏外部联系人标签")
+    public R getExternalContactTag(@RequestParam(value = "qwExternalContactId") Long qwExternalContactId) {
+        List<ExternalContactTagVO> tagList = qwExternalContactService.getExternalContactTag(qwExternalContactId);
+        return R.ok().put("data", tagList);
+    }
+
+    @PutMapping("/externalContact")
+    @ApiOperation("编辑外部联系人信息")
+    public R updateExternalContactInfo(@RequestBody ExternalContactInfoParam param) {
+        return qwExternalContactService.updateExternalContactInfo(param);
+    }
+
+    @GetMapping("/tagGroupList")
+    @ApiOperation("获取所有标签组和其下标签")
+    public R getTagGroupList(TagGroupListParam param) {
+        QwTagGroup qwTagGroup = new QwTagGroup();
+        BeanCopyUtils.copy(param, qwTagGroup);
+        qwTagGroup.setName(param.getTagName());
+
+        PageHelper.startPage(qwTagGroup.getPageNum(), qwTagGroup.getPageSize());
+        List<QwTagGroupListVO> list = qwTagGroupService.selectQwGroupTagList(qwTagGroup);
+
+        PageInfo<QwTagGroupListVO> result = new PageInfo<>(list);
+        return R.ok().put("data", result);
+    }
+
+//    @GetMapping("/searchTags")
+//    @ApiOperation("搜索标签-跟管理端保持一致")
+//    public R searchTagList(QwTagParam param) {
+//        List<QwTagGroupListVO> list = qwTagService.searchTags(param);
+//        return R.ok().put("data", list);
+//    }
+
+    @PutMapping("/externalContact/tag")
+    @ApiOperation("编辑标签")
+    public R updateExternalContactTag(@RequestBody TagGroupUpdateParam param) {
+        int i = qwExternalContactService.updateExternalContactTag(param);
+        if (i > 0) {
+            return R.ok();
+        }
+        return R.error();
+    }
+
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyTagUserMapper.java

@@ -79,4 +79,6 @@ public interface CompanyTagUserMapper
      * @param params    条件
      */
     void deleteCompanyTagUserByMap(@Param("params") Map<String, Object> params);
+
+    List<CompanyUserTagListVO> getTagByUser(@Param("params")CompanyTagUser param);
 }

+ 7 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyTagUserService.java

@@ -84,4 +84,11 @@ public interface ICompanyTagUserService
      * @param tagIds   标签ID集合
      */
     void changeUserTags(List<Long> fsUserIds, List<Long> tagIds);
+
+    /**
+     * 查询会员标签
+     * @param param 分页参数
+     * @return
+     */
+    List<CompanyUserTagListVO> getTagByUser(CompanyTagUser param);
 }

+ 11 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyTagUserServiceImpl.java

@@ -176,4 +176,15 @@ public class CompanyTagUserServiceImpl implements ICompanyTagUserService
             }
         });
     }
+
+    @Override
+    public List<CompanyUserTagListVO> getTagByUser(CompanyTagUser param) {
+        // 判断是否是管理员
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        if (companyUser.isAdmin()) {
+            param.setCompanyUserId(null);
+        }
+
+        return companyTagUserMapper.getTagByUser(param);
+    }
 }

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

@@ -44,6 +44,10 @@ public class FsUserCourseComplaintRecord extends BaseEntity{
     @Excel(name = "投诉内容")
     private String complaintContent;
 
+    /** 投诉上传图片 */
+    @Excel(name = "投诉上传图片")
+    private String complaintUrl;
+
     /** 课程id */
     @Excel(name = "课程id")
     private Long courseId;

+ 4 - 1
fs-service/src/main/java/com/fs/course/param/UserCourseComplaintRecordParam.java

@@ -12,9 +12,12 @@ public class UserCourseComplaintRecordParam {
     @ApiModelProperty(value = "投诉类型id")
     private Long complaintTypeId;
 
-    @ApiModelProperty(value = "投诉内容(暂时没有,只是保留这个字段)")
+    @ApiModelProperty(value = "投诉内容")
     private String complaintContent;
 
+    @ApiModelProperty(value = "投诉上传图片")
+    private String complaintUrl;
+
     @ApiModelProperty(value = "课程id")
     private Long courseId;
 

+ 10 - 8
fs-service/src/main/java/com/fs/his/mapper/FsUserOperationLogMapper.java

@@ -3,17 +3,19 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsUserOperationLog;
+import com.fs.his.param.FsUserOperationLogQueryParam;
+import com.fs.his.vo.FsUserOperationLogPageVo;
 
 /**
  * 用户操作日志Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-07-04
  */
 public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>{
     /**
      * 查询用户操作日志
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
@@ -21,15 +23,15 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
 
     /**
      * 查询用户操作日志列表
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 用户操作日志集合
      */
-    List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLog fsUserOperationLog);
+    List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
     /**
      * 新增用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -37,7 +39,7 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
 
     /**
      * 修改用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -45,7 +47,7 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
 
     /**
      * 删除用户操作日志
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 结果
      */
@@ -53,7 +55,7 @@ public interface FsUserOperationLogMapper extends BaseMapper<FsUserOperationLog>
 
     /**
      * 批量删除用户操作日志
-     * 
+     *
      * @param logIds 需要删除的数据主键集合
      * @return 结果
      */

+ 20 - 0
fs-service/src/main/java/com/fs/his/param/FsUserOperationLogQueryParam.java

@@ -0,0 +1,20 @@
+package com.fs.his.param;
+
+import com.fs.common.param.BaseQueryParam;
+import lombok.Data;
+
+@Data
+public class FsUserOperationLogQueryParam extends BaseQueryParam {
+    /** 用户id */
+    private Long userId;
+
+    /** 操作类型 */
+    private String operationType;
+
+    /** 详情 */
+    private String details;
+
+    private Long companyId;
+
+    private Long companyUserId;
+}

+ 10 - 8
fs-service/src/main/java/com/fs/his/service/IFsUserOperationLogService.java

@@ -3,17 +3,19 @@ package com.fs.his.service;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.his.domain.FsUserOperationLog;
+import com.fs.his.param.FsUserOperationLogQueryParam;
+import com.fs.his.vo.FsUserOperationLogPageVo;
 
 /**
  * 用户操作日志Service接口
- * 
+ *
  * @author fs
  * @date 2025-07-04
  */
 public interface IFsUserOperationLogService extends IService<FsUserOperationLog>{
     /**
      * 查询用户操作日志
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
@@ -21,15 +23,15 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
 
     /**
      * 查询用户操作日志列表
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 用户操作日志集合
      */
-    List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLog fsUserOperationLog);
+    List<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog);
 
     /**
      * 新增用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -37,7 +39,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
 
     /**
      * 修改用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -45,7 +47,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
 
     /**
      * 批量删除用户操作日志
-     * 
+     *
      * @param logIds 需要删除的用户操作日志主键集合
      * @return 结果
      */
@@ -53,7 +55,7 @@ public interface IFsUserOperationLogService extends IService<FsUserOperationLog>
 
     /**
      * 删除用户操作日志信息
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 结果
      */

+ 51 - 9
fs-service/src/main/java/com/fs/his/service/impl/FsUserOperationLogServiceImpl.java

@@ -1,8 +1,16 @@
 package com.fs.his.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
+
+import com.alibaba.fastjson.JSON;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.StringUtils;
+import com.fs.course.vo.FsUserCourseVO;
+import com.fs.his.param.FsUserOperationLogQueryParam;
+import com.fs.his.vo.FsUserOperationLogPageVo;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.his.mapper.FsUserOperationLogMapper;
@@ -11,7 +19,7 @@ import com.fs.his.service.IFsUserOperationLogService;
 
 /**
  * 用户操作日志Service业务层处理
- * 
+ *
  * @author fs
  * @date 2025-07-04
  */
@@ -20,7 +28,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
 
     /**
      * 查询用户操作日志
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 用户操作日志
      */
@@ -32,19 +40,53 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
 
     /**
      * 查询用户操作日志列表
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 用户操作日志
      */
     @Override
-    public List<FsUserOperationLog> selectFsUserOperationLogList(FsUserOperationLog fsUserOperationLog)
+    public List<FsUserOperationLogPageVo> selectFsUserOperationLogList(FsUserOperationLogQueryParam fsUserOperationLog)
     {
-        return baseMapper.selectFsUserOperationLogList(fsUserOperationLog);
+        List<FsUserOperationLog> logs = baseMapper.selectFsUserOperationLogList(fsUserOperationLog);
+        ArrayList<FsUserOperationLogPageVo> vos = new ArrayList<>();
+        if(logs!=null&& !logs.isEmpty()){
+            for (FsUserOperationLog log : logs) {
+                FsUserOperationLogPageVo vo = new FsUserOperationLogPageVo();
+                BeanUtils.copyProperties(log, vo);
+                StringBuilder richText = new StringBuilder();
+                richText.append("<div>")
+                        .append("<div style='font-weight: bold;'>")
+                        .append(log.getOperationType())
+                        .append("<div>");
+                String param = log.getParam();
+                if (StringUtils.isNotBlank(param)){
+                    FsUserCourseVO courseVO = JSON.parseObject(param, FsUserCourseVO.class);
+                    if(courseVO!=null){
+                        if (StringUtils.isNotBlank(courseVO.getCourseName())){
+                            richText.append("<div style='font-weight: bold;'>").append("课节名称").append("</div>");
+                            richText.append("<p>").append(courseVO.getCourseName()).append("<p>");
+                        }
+                        if (StringUtils.isNotBlank(courseVO.getTrainingCampName())){
+                            richText.append("<div style='font-weight: bold;'>").append("所属训练营").append("</div>");
+                            richText.append("<p>").append(courseVO.getTrainingCampName()).append("<p>");
+                        }
+                        if (StringUtils.isNotBlank(courseVO.getTrainingCampName())){
+                            richText.append("<div style='font-weight: bold;'>").append("营期名称").append("</div>");
+                            richText.append("<p>").append(courseVO.getPeriodName()).append("<p>");
+                        }
+                    }
+                }
+                richText.append("</div>");
+                vo.setText(richText.toString());
+                vos.add(vo);
+            }
+        }
+        return vos;
     }
 
     /**
      * 新增用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -57,7 +99,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
 
     /**
      * 修改用户操作日志
-     * 
+     *
      * @param fsUserOperationLog 用户操作日志
      * @return 结果
      */
@@ -69,7 +111,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
 
     /**
      * 批量删除用户操作日志
-     * 
+     *
      * @param logIds 需要删除的用户操作日志主键
      * @return 结果
      */
@@ -81,7 +123,7 @@ public class FsUserOperationLogServiceImpl extends ServiceImpl<FsUserOperationLo
 
     /**
      * 删除用户操作日志信息
-     * 
+     *
      * @param logId 用户操作日志主键
      * @return 结果
      */

+ 31 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserOperationLogPageVo.java

@@ -0,0 +1,31 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FsUserOperationLogPageVo {
+    private Long logId;
+
+
+
+    /** 操作类型 */
+    @Excel(name = "操作类型")
+    private String operationType;
+
+    /** 详情 */
+    @Excel(name = "详情")
+    private String details;
+
+    @Excel(name = "参数")
+    private String param;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+
+    private String text;
+}

+ 8 - 2
fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java

@@ -666,17 +666,23 @@ public class QwSopLogsServiceImpl extends ServiceImpl<QwSopLogsMapper, QwSopLogs
                 switch (matched.getStatus()) {
                     case 0:
                         log.setSendStatus(5L);
-                        log.setRemark("员工未发送,已作废");
+                        log.setRemark("员工未在规定时间发送");
                         break;
                     case 1:
                         log.setSendStatus(1L);
                         log.setReceivingStatus(1L);
                         break;
                     case 2:
+                        log.setSendType(2);
+                        log.setSendStatus(3L);
+                        log.setRemark("因客户不是好友导致发送失败,补发");
+                        log.setReceivingStatus(0L);
+                        log.setSendTime(now);
+                        log.setSort(30000001);
                     case 3:
                         log.setSendType(2);
                         log.setSendStatus(3L);
-                        log.setRemark("客户无法接收,补发");
+                        log.setRemark("客户已经收到其他群发消息,补发");
                         log.setReceivingStatus(0L);
                         log.setSendTime(now);
                         log.setSort(30000001);

+ 15 - 0
fs-service/src/main/resources/mapper/company/CompanyTagUserMapper.xml

@@ -113,5 +113,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             find_in_set(#{tagId}, ctu.tag_ids)
         </foreach>
     </select>
+    <select id="getTagByUser" resultType="com.fs.store.vo.h5.CompanyUserTagListVO">
+        SELECT distinct
+        company_tag.tag as tagName,
+        company_tag.tag_id
+        FROM
+        company_tag_user
+        right JOIN company_tag ON FIND_IN_SET( company_tag.tag_id, company_tag_user.tag_ids ) > 0
+        where company_tag_user.user_id = #{params.userId}
+            <if test="params.companyId != null">
+                and company_tag_user.company_id = #{params.companyId}
+            </if>
+            <if test="params.companyUserId != null">
+                and company_tag_user.company_user_id = #{params.companyUserId}
+            </if>
+    </select>
 
 </mapper>

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

@@ -9,13 +9,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="userId"    column="user_id"    />
         <result property="complaintTypeId"    column="complaint_type_id"    />
         <result property="complaintContent"    column="complaint_content"    />
+        <result property="complaintUrl"    column="complaint_url"    />
         <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
+        select record_id, user_id, complaint_type_id, complaint_content, complaint_url, course_id, video_id, create_time from fs_user_course_complaint_record
     </sql>
 
     <select id="selectFsUserCourseComplaintRecordList" parameterType="FsUserCourseComplaintRecord" resultMap="FsUserCourseComplaintRecordResult">
@@ -62,6 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userId != null">user_id,</if>
             <if test="complaintTypeId != null">complaint_type_id,</if>
             <if test="complaintContent != null">complaint_content,</if>
+            <if test="complaintUrl != null">complaint_url,</if>
             <if test="courseId != null">course_id,</if>
             <if test="videoId != null">video_id,</if>
             <if test="createTime != null">create_time,</if>
@@ -70,6 +72,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userId != null">#{userId},</if>
             <if test="complaintTypeId != null">#{complaintTypeId},</if>
             <if test="complaintContent != null">#{complaintContent},</if>
+            <if test="complaintUrl != null">#{complaintUrl},</if>
             <if test="courseId != null">#{courseId},</if>
             <if test="videoId != null">#{videoId},</if>
             <if test="createTime != null">#{createTime},</if>
@@ -82,6 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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="complaintUrl != null">complaint_url = #{complaintUrl},</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>

+ 1 - 0
fs-service/src/main/resources/mapper/his/FsUserOperationLogMapper.xml

@@ -24,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="operationType != null  and operationType != ''"> and operation_type = #{operationType}</if>
             <if test="details != null  and details != ''"> and details = #{details}</if>
         </where>
+        order by create_time desc
     </select>
 
     <select id="selectFsUserOperationLogByLogId" parameterType="Long" resultMap="FsUserOperationLogResult">