瀏覽代碼

feat:会员im发课优化

caoliqin 1 周之前
父節點
當前提交
e26e7fd135

+ 1 - 5
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -324,14 +324,10 @@ public class FsUserCourseVideoController extends AppBaseController {
         return ResponseResult.ok(pageInfo);
     }
 
-//    @Login
     @ApiOperation("任务详情")
     @GetMapping("/im/sendLog/detail")
     public ResponseResult<FsImMsgSendLogVO> imSendLogDetail(@RequestParam Long logId) {
-        FsImMsgSendLog fsImMsgSendLog = imMsgSendLogService.selectFsImMsgSendLogByLogId(logId);
-        FsImMsgSendLogVO fsImMsgSendLogVO = new FsImMsgSendLogVO();
-        BeanUtils.copyProperties(fsImMsgSendLog, fsImMsgSendLogVO);
-
+        FsImMsgSendLogVO fsImMsgSendLogVO = imMsgSendLogService.selectFsImMsgSendLogDetail(logId);
         return ResponseResult.ok(fsImMsgSendLogVO);
     }
 

+ 2 - 2
fs-service/src/main/java/com/fs/course/vo/newfs/FsImSendLogVO.java

@@ -28,10 +28,10 @@ public class FsImSendLogVO implements Serializable {
     private Date planSendTime;
 
     @ApiModelProperty(value = "标签ids")
-    private String[] tagIds;
+    private String tagIds;
 
     @ApiModelProperty(value = "标签名称")
-    private String[] tagNames;
+    private String tagNames;
 
     @ApiModelProperty(value = "用户id,多个用逗号隔开")
     private String userIds;

+ 11 - 7
fs-service/src/main/java/com/fs/im/mapper/FsImMsgSendDetailMapper.java

@@ -3,17 +3,18 @@ package com.fs.im.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.im.domain.FsImMsgSendDetail;
+import com.fs.im.vo.FsImMsgSendDetailVO;
 
 /**
  * openim消息记录详情Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-08-21
  */
 public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
     /**
      * 查询openim消息记录详情
-     * 
+     *
      * @param logDetailId openim消息记录详情主键
      * @return openim消息记录详情
      */
@@ -21,7 +22,7 @@ public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
 
     /**
      * 查询openim消息记录详情列表
-     * 
+     *
      * @param fsImMsgSendDetail openim消息记录详情
      * @return openim消息记录详情集合
      */
@@ -29,7 +30,7 @@ public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
 
     /**
      * 新增openim消息记录详情
-     * 
+     *
      * @param fsImMsgSendDetail openim消息记录详情
      * @return 结果
      */
@@ -37,7 +38,7 @@ public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
 
     /**
      * 修改openim消息记录详情
-     * 
+     *
      * @param fsImMsgSendDetail openim消息记录详情
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
 
     /**
      * 删除openim消息记录详情
-     * 
+     *
      * @param logDetailId openim消息记录详情主键
      * @return 结果
      */
@@ -53,9 +54,12 @@ public interface FsImMsgSendDetailMapper extends BaseMapper<FsImMsgSendDetail>{
 
     /**
      * 批量删除openim消息记录详情
-     * 
+     *
      * @param logDetailIds 需要删除的数据主键集合
      * @return 结果
      */
     int deleteFsImMsgSendDetailByLogDetailIds(Long[] logDetailIds);
+
+    List<FsImMsgSendDetailVO> selectSendDetailVOList(Long logId);
+
 }

+ 8 - 0
fs-service/src/main/java/com/fs/im/service/IFsImMsgSendLogService.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.vo.newfs.FsImSendLogVO;
 import com.fs.im.domain.FsImMsgSendLog;
+import com.fs.im.vo.FsImMsgSendLogVO;
 
 /**
  * openim消息记录主Service接口
@@ -83,4 +84,11 @@ public interface IFsImMsgSendLogService extends IService<FsImMsgSendLog>{
      */
     ResponseResult<Boolean> deleteFsImMsgSendLogAndDetail(Long logId);
 
+    /**
+     * 查询任务详情
+     * @param logId 任务id
+     * @return
+     */
+    FsImMsgSendLogVO selectFsImMsgSendLogDetail(Long logId);
+
 }

+ 44 - 15
fs-service/src/main/java/com/fs/im/service/impl/FsImMsgSendLogServiceImpl.java

@@ -1,7 +1,9 @@
 package com.fs.im.service.impl;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.redis.RedisCache;
@@ -11,6 +13,9 @@ import com.fs.course.dto.BatchSendCourseAllDTO;
 import com.fs.course.vo.newfs.FsImSendLogVO;
 import com.fs.im.domain.FsImMsgSendDetail;
 import com.fs.im.mapper.FsImMsgSendDetailMapper;
+import com.fs.im.vo.FsImMsgSendDetailVO;
+import com.fs.im.vo.FsImMsgSendLogVO;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
@@ -131,34 +136,58 @@ public class FsImMsgSendLogServiceImpl extends ServiceImpl<FsImMsgSendLogMapper,
         if(fsImMsgSendLog.getSendStatus() == 1){
             return ResponseResult.fail(400, "当前任务已完成,不允许删除");
         }
-        baseMapper.deleteFsImMsgSendLogByLogId(logId);
+
+        // 删除数据
+        Map<String, Object> map = new HashMap<>();
+        map.put("send_union_id", fsImMsgSendLog.getSendUnionId());
+        List<FsImMsgSendLog> fsImMsgSendLogs = baseMapper.selectByMap(map);
+        List<Long> logIds = fsImMsgSendLogs.stream().map(FsImMsgSendLog::getLogId).collect(Collectors.toList());
+        baseMapper.deleteBatchIds(logIds);
 
         fsImMsgSendDetailMapper.delete(Wrappers.<FsImMsgSendDetail>query().lambda()
-                .eq(FsImMsgSendDetail::getLogId, fsImMsgSendLog.getLogId()));
+                .in(FsImMsgSendDetail::getLogId, logIds));
 
         // 删除redis缓存
-        if(fsImMsgSendLog.getMsgType() == 1){
-            String redisKey = "openIm:batchSendMsg:sendCourse";
-            Map<String, BatchSendCourseAllDTO> cacheMap = redisCache.getCacheMap(redisKey);
+//        if(fsImMsgSendLog.getMsgType() == 1){
+            String sendCourseRedisKey = "openIm:batchSendMsg:sendCourse";
+            Map<String, BatchSendCourseAllDTO> sendCourseMap = redisCache.getCacheMap(sendCourseRedisKey);
 
-            if(cacheMap != null && !cacheMap.isEmpty()){
+            if(sendCourseMap != null && !sendCourseMap.isEmpty()){
                 // 组合key
                 if(fsImMsgSendLog.getPlanSendTime() != null) {
                     String key = fsImMsgSendLog.getCourseId() + ":" + fsImMsgSendLog.getVideoId() + ":" + fsImMsgSendLog.getPlanSendTime().getTime();
-                    redisTemplate.opsForHash().delete(redisKey, key);
+                    redisTemplate.opsForHash().delete(sendCourseRedisKey, key);
                 }
             }
-        } else {
-            String redisKey = "openIm:batchSendMsg:urgeCourse";
-            Map<String, BatchSendCourseAllDTO> cacheMap = redisCache.getCacheMap(redisKey);
-            if(cacheMap != null && !cacheMap.isEmpty()){
+//        } else {
+            String urgeCourseRedisKey = "openIm:batchSendMsg:urgeCourse";
+            Map<String, BatchSendCourseAllDTO> urgeCourseMap = redisCache.getCacheMap(urgeCourseRedisKey);
+            if(urgeCourseMap != null && !urgeCourseMap.isEmpty()){
                 // 组合key
-                if(fsImMsgSendLog.getPlanSendTime() != null) {
-                    String key = fsImMsgSendLog.getCourseId() + ":" + fsImMsgSendLog.getVideoId() + ":" + fsImMsgSendLog.getPlanSendTime().getTime();
-                    redisTemplate.opsForHash().delete(redisKey, key);
+                for (FsImMsgSendLog imMsgSendLog : fsImMsgSendLogs) {
+                    if(imMsgSendLog.getPlanSendTime() != null && imMsgSendLog.getMsgType() == 2) {
+                        String key = imMsgSendLog.getCourseId() + ":" + imMsgSendLog.getVideoId() + ":" + imMsgSendLog.getPlanSendTime().getTime();
+                        redisTemplate.opsForHash().delete(urgeCourseRedisKey, key);
+                    }
                 }
             }
-        }
+//        }
         return ResponseResult.ok();
     }
+
+    @Override
+    public FsImMsgSendLogVO selectFsImMsgSendLogDetail(Long logId) {
+        FsImMsgSendLog fsImMsgSendLog = baseMapper.selectFsImMsgSendLogByLogId(logId);
+        FsImMsgSendLogVO fsImMsgSendLogVO = new FsImMsgSendLogVO();
+        BeanUtils.copyProperties(fsImMsgSendLog, fsImMsgSendLogVO);
+
+        List<FsImMsgSendLog> fsImMsgSendLogs = baseMapper.selectList(Wrappers.<FsImMsgSendLog>query().lambda()
+                .eq(FsImMsgSendLog::getSendUnionId, fsImMsgSendLog.getSendUnionId()).eq(FsImMsgSendLog::getMsgType,2));
+        List<String> urgeContents = fsImMsgSendLogs.stream().map(FsImMsgSendLog::getSendTitle).collect(Collectors.toList());
+        fsImMsgSendLogVO.setUrgeContent(urgeContents);
+
+        List<FsImMsgSendDetailVO> fsImMsgSendDetails = fsImMsgSendDetailMapper.selectSendDetailVOList(logId);
+        fsImMsgSendLogVO.setDetailList(fsImMsgSendDetails);
+        return fsImMsgSendLogVO;
+    }
 }

+ 1 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1323,6 +1323,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         // 记录发送消息记录主表
         FsImMsgSendLog fsImMsgSendLog = new FsImMsgSendLog();
         BeanUtils.copyProperties(batchSendCourseDTO, fsImMsgSendLog);
+        fsImMsgSendLog.setIsUrgeCourse(batchSendCourseDTO.getIsUrgeCourse() ? 1 : 0);
         fsImMsgSendLog.setCreateBy(batchSendCourseDTO.getCompanyUserId().toString());
         fsImMsgSendLog.setCreateTime(new Date());
         fsImMsgSendLog.setSendUnionId(sendUnionId)

+ 46 - 0
fs-service/src/main/java/com/fs/im/vo/FsImMsgSendDetailVO.java

@@ -0,0 +1,46 @@
+package com.fs.im.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.util.Date;
+
+/**
+ * openim消息记录详情VO
+ *
+ * @author caolq
+ */
+@Data
+@Accessors(chain = true)
+public class FsImMsgSendDetailVO{
+
+    @ApiModelProperty(value = "记录详情id")
+    private Long logDetailId;
+
+    @ApiModelProperty(value = "发课记录主表id")
+    private Long logId;
+
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
+    @ApiModelProperty(value = "销售名称")
+    private String companyUserName;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "实际发送时间")
+    private Date actualSendTime;
+
+    @ApiModelProperty(value = "发送状态,1-已发送;2-待发送")
+    private Integer sendStatus;
+
+    @ApiModelProperty(value = "执行状态,0-正常;1-失败")
+    private Integer status;
+
+}

+ 11 - 7
fs-service/src/main/java/com/fs/im/vo/FsImMsgSendLogVO.java

@@ -7,6 +7,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * openim消息记录主对象VO
@@ -42,20 +43,20 @@ public class FsImMsgSendLogVO implements Serializable {
     @ApiModelProperty(value = "发送类型,1-定时;2-实时")
     private Integer sendType;
 
-    @ApiModelProperty(value = "发送状态,1-已发送;2-待发送")
-    private Integer sendStatus;
+//    @ApiModelProperty(value = "发送状态,1-已发送;2-待发送")
+//    private Integer sendStatus;
 
     @ApiModelProperty(value = "是否催课,1-是;0-否")
     private Integer isUrgeCourse;
 
     @ApiModelProperty(value = "催课内容")
-    private String urgeContent;
+    private List<String> urgeContent;
 
-    @ApiModelProperty(value = "消息类型,1-发课;2-催课")
-    private Integer msgType;
+//    @ApiModelProperty(value = "消息类型,1-发课;2-催课")
+//    private Integer msgType;
 
-    @ApiModelProperty(value = "关联id")
-    private String sendUnionId;
+//    @ApiModelProperty(value = "关联id")
+//    private String sendUnionId;
 
     @ApiModelProperty(value = "关联标签id")
     private String tagIds;
@@ -63,4 +64,7 @@ public class FsImMsgSendLogVO implements Serializable {
     @ApiModelProperty(value = "关联标签名称")
     private String tagNames;
 
+    @ApiModelProperty(value = "任务详情列表")
+    private List<FsImMsgSendDetailVO> detailList;
+
 }

+ 13 - 0
fs-service/src/main/resources/mapper/im/FsImMsgSendDetailMapper.xml

@@ -133,4 +133,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <!--        </foreach>-->
 <!--    </insert>-->
 
+    <select id="selectSendDetailVOList" resultType="com.fs.im.vo.FsImMsgSendDetailVO">
+        SELECT
+        fs_im_msg_send_detail.*,
+        fs_user.nick_name as userName,
+        company_user.nick_name as companyUserName
+        FROM
+        fs_im_msg_send_detail
+        LEFT JOIN fs_user ON fs_im_msg_send_detail.user_id = fs_user.user_id
+        LEFT JOIN company_user ON company_user.user_id = fs_im_msg_send_detail.company_user_id
+        WHERE
+        log_id = #{logId}
+    </select>
+
 </mapper>