Procházet zdrojové kódy

feat:会员批量发送课程消息调整

caoliqin před 4 týdny
rodič
revize
2121a32d76

+ 26 - 25
fs-admin/src/main/java/com/fs/his/controller/FsUserController.java

@@ -4,16 +4,16 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
-import com.fs.common.exception.CustomException;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
-import com.fs.course.domain.FsUserWatchStatistics;
-import com.fs.course.mapper.FsUserWatchStatisticsMapper;
+import com.fs.course.dto.BatchSendCourseDTO;
+import com.fs.course.param.FsCourseLinkCreateParam;
 import com.fs.course.service.IFsUserCompanyUserService;
+import com.fs.course.service.IFsUserCourseService;
 import com.fs.his.domain.FsUserAddress;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.mapper.FsUserMapper;
@@ -25,6 +25,8 @@ import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsUserExportListVO;
 import com.fs.his.vo.FsUserVO;
 import com.fs.his.vo.UserVo;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
 import com.fs.qw.dto.UserProjectDTO;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.vo.h5.FsUserPageListVO;
@@ -36,6 +38,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -79,6 +82,12 @@ public class FsUserController extends BaseController
     @Autowired
     private SqlSessionFactory sqlSessionFactory;
 
+    @Autowired
+    private IFsUserCourseService fsUserCourseService;
+
+    @Autowired
+    private OpenIMService openIMService;
+
     /**
      * 查询用户列表
      */
@@ -307,26 +316,18 @@ public class FsUserController extends BaseController
         return userIntegralLogsService.addIntegralTemplate(integralTemplateParam);
     }
 
-//    @PutMapping("/encryptPhoneTemp")
-//    @ApiOperation("临时接口")
-//    public void encryptPhoneTemp(){
-//        FsUser fsUser = new FsUser();
-//        List<FsUser> list = fsUserService.selectFsUserList(fsUser);
-//        List<FsUser> fsUserList = list.stream().peek(v -> v.setPhone(encryptPhone(v.getPhone()))).collect(Collectors.toList());
-//
-//        // 分批次处理,一次提交500条
-//        List<List<FsUser>> batches = Lists.partition(fsUserList, 500);
-//        batches.forEach(batch -> {
-//            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
-//            try {
-//                FsUserMapper mapper = sqlSession.getMapper(FsUserMapper.class);
-//                batch.forEach(mapper::updateFsUser);
-//                sqlSession.commit();
-//            } finally {
-//                sqlSession.close();
-//            }
-//        });
-//
-//    }
+    @ApiOperation("后台会员批量发送课程消息")
+    @PostMapping("/batchSendCourse")
+    public OpenImResponseDTO batchSendCourse(@RequestBody BatchSendCourseDTO batchSendCourseDTO) throws JsonProcessingException {
+        // 生成看课短链
+        FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+        BeanUtils.copyProperties(batchSendCourseDTO, fsCourseLinkCreateParam);
+        R courseSortLink = fsUserCourseService.createCourseSortLink(fsCourseLinkCreateParam);
+        String url = courseSortLink.get("url").toString();
+        batchSendCourseDTO.setUrl(url);
+
+        return openIMService.batchSendCourse(batchSendCourseDTO);
+    }
+
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/dto/BatchSendCourseDTO.java

@@ -13,6 +13,9 @@ import java.util.List;
 @Data
 public class BatchSendCourseDTO {
 
+    @ApiModelProperty(value = "用户ids")
+    private List<Long> userIds;
+
     @ApiModelProperty(value = "销售id")
     private Long companyUserId;
 

+ 54 - 23
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1069,8 +1069,14 @@ public class OpenIMServiceImpl implements OpenIMService {
         ObjectMapper objectMapper = new ObjectMapper();
         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略null字段
 
-        //查询需要发送的人
-        List<String> userIds = this.getRecvIds(batchSendCourseDTO);
+        //获取需要发送的人
+        List<String> userIds;
+        if(!batchSendCourseDTO.getUserIds().isEmpty()){
+            userIds = batchSendCourseDTO.getUserIds().stream().map(v -> "U" + v).collect(Collectors.toList());
+        } else {
+            userIds = this.getRecvIds(batchSendCourseDTO);
+        }
+
         //注册和添加好友
         for (String userId : userIds) {
             String uId = userId.substring(1);
@@ -1112,7 +1118,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         openImBatchMsgDTO.setIsOnlineOnly(false);
         openImBatchMsgDTO.setNotOfflinePush(false);
         long planSendTimeStamp;
-        if(batchSendCourseDTO.getSendTime() != null){
+        if(batchSendCourseDTO.getSendTime() != null && batchSendCourseDTO.getSendTime().compareTo(new Date()) > 0){
             planSendTimeStamp = batchSendCourseDTO.getSendTime().getTime();
         } else {
             planSendTimeStamp = System.currentTimeMillis();
@@ -1132,13 +1138,15 @@ public class OpenIMServiceImpl implements OpenIMService {
             OpenImBatchResponseDataDTO openImBatchResponseDataDTO = JSON.parseObject(JSON.toJSONString(data), OpenImBatchResponseDataDTO.class);
             List<OpenImBatchResponseDataDTO.Results> results = openImBatchResponseDataDTO.getResults();
 
+            // 生成发送记录
+            this.batchInsertSendLogs(openImBatchMsgDTO, openImResponseDTO, openImBatchResponseDataDTO, planSendTimeStamp);
+
             // 生成看课记录
             this.batchInsertWatchLogs(batchSendCourseDTO, results, fsUserCourse);
 
-            // 生成发送记录
-            this.batchInsertSendLogs(openImBatchMsgDTO, results, planSendTimeStamp);
-
         } else {
+            // 生成发送记录
+            this.batchInsertSendLogs(openImBatchMsgDTO, openImResponseDTO, null, planSendTimeStamp);
             log.error("发送消息失败,结果:{}", openImResponseDTO);
             throw new ServiceException("发送消息失败");
         }
@@ -1158,29 +1166,52 @@ public class OpenIMServiceImpl implements OpenIMService {
         return fsUserCompanyUsers.stream().map(v -> "U" + v.getUserId()).collect(Collectors.toList());
     }
 
-    private void batchInsertSendLogs(OpenImBatchMsgDTO openImBatchMsgDTO, List<OpenImBatchResponseDataDTO.Results> results, long planSendTimeStamp) {
+    private void batchInsertSendLogs(OpenImBatchMsgDTO openImBatchMsgDTO, OpenImResponseDTO openImResponseDTO, OpenImBatchResponseDataDTO openImBatchResponseDataDTO, long planSendTimeStamp) {
         List<ImSendLog> list = new LinkedList<>();
-        for (OpenImBatchResponseDataDTO.Results result : results) {
-            ImSendLog imSendLog = new ImSendLog();
-            imSendLog.setSendId(openImBatchMsgDTO.getSendID());
-            imSendLog.setRecvId(result.getRecvID());
-            imSendLog.setSendTitle(openImBatchMsgDTO.getOfflinePushInfo() != null ? openImBatchMsgDTO.getOfflinePushInfo().getTitle() : null);
-            imSendLog.setPlanSendTime(new Date(planSendTimeStamp));
-            imSendLog.setActualSendTime(new Date(result.getSendTime()));
-            if(planSendTimeStamp == result.getSendTime()){
-                imSendLog.setSendType(2);
-            } else {
-                imSendLog.setSendType(1);
-            }
-            imSendLog.setParamJson(JSON.toJSONString(openImBatchMsgDTO));
-            imSendLog.setStatus(0);
-            imSendLog.setResultMessage(JSON.toJSONString(results));
-//            imSendLog.setExceptionInfo();
+        if(openImResponseDTO.getErrCode() != 0){
+            ImSendLog imSendLog = createImsendLog(openImBatchMsgDTO, planSendTimeStamp);
+            imSendLog.setStatus(1);
+            imSendLog.setResultMessage(JSON.toJSONString(openImResponseDTO.getErrMsg()));
+            imSendLog.setExceptionInfo(JSON.toJSONString(openImResponseDTO.getErrDlt()));
             list.add(imSendLog);
+        } else {
+            if(openImBatchResponseDataDTO.getFailedUserIDs() != null) {
+                for (String failedUserID : openImBatchResponseDataDTO.getFailedUserIDs()) {
+                    ImSendLog imSendLog = createImsendLog(openImBatchMsgDTO, planSendTimeStamp);
+                    imSendLog.setRecvId(failedUserID);
+                    imSendLog.setStatus(1);
+                    imSendLog.setResultMessage(JSON.toJSONString(openImBatchResponseDataDTO.getResults()));
+                    list.add(imSendLog);
+                }
+            }
+            for (OpenImBatchResponseDataDTO.Results result : openImBatchResponseDataDTO.getResults()) {
+                ImSendLog imSendLog = createImsendLog(openImBatchMsgDTO, planSendTimeStamp);
+                imSendLog.setRecvId(result.getRecvID());
+                imSendLog.setActualSendTime(new Date(result.getSendTime()));
+                if(planSendTimeStamp == result.getSendTime()){
+                    imSendLog.setSendType(2);
+                } else {
+                    imSendLog.setSendType(1);
+                }
+                imSendLog.setStatus(0);
+                imSendLog.setResultMessage(JSON.toJSONString(openImBatchResponseDataDTO.getResults()));
+                list.add(imSendLog);
+            }
         }
+
         imSendLogMapper.insertImSendLogBatch(list);
     }
 
+    private static ImSendLog createImsendLog(OpenImBatchMsgDTO openImBatchMsgDTO, long planSendTimeStamp) {
+        ImSendLog imSendLog = new ImSendLog();
+        imSendLog.setSendId(openImBatchMsgDTO.getSendID());
+        imSendLog.setSendTitle(openImBatchMsgDTO.getOfflinePushInfo() != null ? openImBatchMsgDTO.getOfflinePushInfo().getTitle() : null);
+        imSendLog.setPlanSendTime(new Date(planSendTimeStamp));
+        imSendLog.setParamJson(JSON.toJSONString(openImBatchMsgDTO));
+
+        return imSendLog;
+    }
+
     @Transactional
     public void batchInsertWatchLogs(BatchSendCourseDTO batchSendCourseDTO, List<OpenImBatchResponseDataDTO.Results> results, FsUserCourse fsUserCourse) {
         List<FsCourseWatchLog> watchLogsInsertList = new LinkedList<>();

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

@@ -1760,6 +1760,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             fs_course_red_packet_log flog
                 LEFT JOIN fs_user ON fs_user.user_id = flog.user_id
                 LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+            where flog.`status` = 1
         GROUP BY
             flog.period_id,
             flog.video_id,