Prechádzať zdrojové kódy

Merge branch 'refs/heads/master' into develop_rayson

rayson 7 mesiacov pred
rodič
commit
5e2bdea37d
13 zmenil súbory, kde vykonal 268 pridanie a 9 odobranie
  1. 58 0
      menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImCollectMessageReqVo.java
  2. 25 0
      menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImCollectUserReqVo.java
  3. 24 0
      menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImMessageApi.java
  4. 5 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/WuKongMessageController.java
  5. 9 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserMapper.java
  6. 5 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserService.java
  7. 61 9
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserServiceImpl.java
  8. 2 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongApiService.java
  9. 4 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongMessageService.java
  10. 54 0
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongMessageServiceImpl.java
  11. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/MessageCenterController.java
  12. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/message/MessageCenterService.java
  13. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/message/MessageCenterServiceImpl.java

+ 58 - 0
menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImCollectMessageReqVo.java

@@ -0,0 +1,58 @@
+package com.citu.module.menduner.im.api;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImCollectMessageReqVo {
+
+    /**
+     * 此参数 为空 发送全部消息
+     */
+    private List<ImCollectUserReqVo> userVoList=new ArrayList<>();
+
+
+    private String message;
+
+    /**
+     * 1.指定
+     * 2.全部
+     */
+    private Integer collectUserType=1;
+
+    /**
+     * 1.文本消息
+     */
+    private Integer messageType=1;
+
+    public Integer getCollectUserType() {
+        return collectUserType;
+    }
+
+    public void setCollectUserType(Integer collectUserType) {
+        this.collectUserType = collectUserType;
+    }
+
+    public Integer getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(Integer messageType) {
+        this.messageType = messageType;
+    }
+
+    public List<ImCollectUserReqVo> getUserVoList() {
+        return userVoList;
+    }
+
+    public void setUserVoList(List<ImCollectUserReqVo> userVoList) {
+        this.userVoList = userVoList;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 25 - 0
menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImCollectUserReqVo.java

@@ -0,0 +1,25 @@
+package com.citu.module.menduner.im.api;
+
+public class ImCollectUserReqVo {
+
+    private Long userId;
+
+    private Long enterpriseId;
+
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getEnterpriseId() {
+        return enterpriseId;
+    }
+
+    public void setEnterpriseId(Long enterpriseId) {
+        this.enterpriseId = enterpriseId;
+    }
+}

+ 24 - 0
menduner/menduner-im-api/src/main/java/com/citu/module/menduner/im/api/ImMessageApi.java

@@ -0,0 +1,24 @@
+package com.citu.module.menduner.im.api;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 用户账户")
+public interface ImMessageApi {
+
+    /**
+     * 发送系统消息
+     * @param reqVo
+     * @return
+     */
+    @PostMapping("/im/messages/system")
+    public CommonResult systemMessage(@RequestBody ImCollectMessageReqVo reqVo);
+
+
+
+}

+ 5 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/controller/app/WuKongMessageController.java

@@ -2,6 +2,7 @@ package com.citu.module.menduner.im.controller.app;
 
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.im.api.ImCollectMessageReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.ChannelMessageSyncReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.HistoryMessagesReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.MessagesBackReqVo;
@@ -71,6 +72,10 @@ public class WuKongMessageController {
     public CommonResult messagesBack(@RequestBody MessagesBackReqVo reqVo){
         return service.messagesBack(reqVo);
     }
+    @PostMapping("/im/messages/system")
+    public CommonResult systemMessage(@RequestBody ImCollectMessageReqVo reqVo){
+        return service.systemMessage(reqVo);
+    }
 
 
     @Autowired

+ 9 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/dal/mysql/UserMapper.java

@@ -4,7 +4,16 @@ import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.module.menduner.im.dal.dataobject.UserDO;
 import com.github.yulichang.base.MPJBaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 @Mapper
 public interface UserMapper extends BaseMapperX<UserDO> {
+    @Select("SELECT * FROM im_user WHERE user_id = #{userId}    and  enterprise_Id =#{enterpriseId} ")
+    UserDO selectUserDO(@Param("userId") Long userId,@Param("enterpriseId") Long enterpriseId);
+
+    @Select("select uid from im_user ")
+    List<String> getAllUids();
 }

+ 5 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserService.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.im.service;
 
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.api.ImCollectUserReqVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserInfoVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserReqVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserResoVO;
@@ -14,4 +15,8 @@ public interface UserService {
     String getCurrentLoginUid(Long enterpriseId);
 
     CommonResult<List<ImUserInfoVo>> getUserByUids(Set<String> uids);
+
+    List<String> getUsers(List<ImCollectUserReqVo> userVoList);
+
+    List<String> getAllUids();
 }

+ 61 - 9
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.citu.framework.common.exception.enums.GlobalErrorCodeConstants;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.im.api.ImCollectUserReqVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserInfoVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserReqVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserResoVO;
@@ -17,6 +18,7 @@ import com.citu.module.menduner.system.api.user.UserInfoReqDTO;
 import com.citu.module.menduner.system.api.user.UserInfoRespDTO;
 import com.citu.module.menduner.system.enums.user.MdeUserTypeEnum;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -38,23 +40,18 @@ public class UserServiceImpl implements UserService{
 
 
     @Override
-    @Transactional()
     public CommonResult<ImUserResoVO> getUser(ImUserReqVo reqVo) {
 
         if(null==reqVo.getEnterpriseId()){
             reqVo.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
         }
-        UserDO userDO = mapper.selectOne(new LambdaQueryWrapper<UserDO>()
-                .eq(UserDO::getUserId,reqVo.getUserId())
-                .eq(UserDO::getEnterpriseId,reqVo.getEnterpriseId())
-        );
+        UserDO userDO = mapper.selectUserDO(reqVo.getUserId(),reqVo.getEnterpriseId());
 
         Long userLoginId = LoginUserContext.getUserId();
         Long loginEnterpriseId = DEFAULT_ENTERPRISE_ID;
         try{
             loginEnterpriseId=LoginUserContext.getEnterpriseId();
         } catch (Exception e){
-
         }
         if(null == userDO){
             // 开始注册
@@ -66,14 +63,19 @@ public class UserServiceImpl implements UserService{
             userDO.setToken(IdUtil.fastSimpleUUID());
             userDO.setUid(IdUtil.fastSimpleUUID());
 //            userDO.setContent(reqVo.getContent());
-            mapper.insert(userDO);
+            try {
+                mapper.insert(userDO);
+            }catch (DuplicateKeyException e){
+                userDO = mapper.selectUserDO(reqVo.getUserId(),reqVo.getEnterpriseId());
+            }
             CommonResult<Boolean> booleanCommonResult = wuKongUserService.userToken(userDO.getUid(), userDO.getToken());
             if(!booleanCommonResult.isSuccess()){
                 return CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR);
             }
         }
         if(!Objects.equals(userLoginId, reqVo.getUserId())  || !Objects.equals(loginEnterpriseId, reqVo.getEnterpriseId()) ){
-            userDO.setToken(null);
+            userDO.setToken(null);//    @Transactional()
+
         }
         ImUserResoVO imUserResoVO = UserConvert.INSTANCE.userDOConvertUserResoVO(userDO);
         imUserResoVO.setWsUrl(wuKongUserService.getWsUrl(userDO.getUid()));
@@ -97,7 +99,11 @@ public class UserServiceImpl implements UserService{
             userDO.setEnterpriseId(enterpriseId);
             userDO.setToken(IdUtil.fastSimpleUUID());
             userDO.setUid(IdUtil.fastSimpleUUID());
-            mapper.insert(userDO);
+            try {
+                mapper.insert(userDO);
+            }catch (DuplicateKeyException e){
+                userDO = mapper.selectOne(new LambdaQueryWrapper<UserDO>().eq(UserDO::getUserId,userLoginId).eq(UserDO::getEnterpriseId,enterpriseId));
+            }
             CommonResult<Boolean> booleanCommonResult = wuKongUserService.userToken(userDO.getUid(), userDO.getToken());
             if(!booleanCommonResult.isSuccess()){
 //                 throw new Exception("系统异常!"); //todo
@@ -107,6 +113,50 @@ public class UserServiceImpl implements UserService{
         return userDO.getUid();
     }
 
+    private UserDO getOrSave(Long userId, Long enterpriseId){
+        enterpriseId = null==enterpriseId?DEFAULT_ENTERPRISE_ID:enterpriseId;
+        UserDO userDO = mapper.selectOne(new LambdaQueryWrapper<UserDO>()
+                .select(UserDO::getUid)
+                .eq(UserDO::getUserId,userId)
+                .eq(null!=enterpriseId,UserDO::getEnterpriseId,enterpriseId));
+        if(null == userDO) {
+            // 开始注册
+            userDO = new UserDO();
+            userDO.setCreateTime(LocalDateTime.now());
+            userDO.setUpdateTime(LocalDateTime.now());
+            userDO.setUserId(userId);
+            userDO.setEnterpriseId(enterpriseId);
+            userDO.setToken(IdUtil.fastSimpleUUID());
+            userDO.setUid(IdUtil.fastSimpleUUID());
+            try {
+                mapper.insert(userDO);
+            } catch (DuplicateKeyException e) {
+                userDO = mapper.selectOne(new LambdaQueryWrapper<UserDO>().eq(UserDO::getUserId, userId).eq(UserDO::getEnterpriseId, enterpriseId));
+            }
+            CommonResult<Boolean> booleanCommonResult = wuKongUserService.userToken(userDO.getUid(), userDO.getToken());
+            if (!booleanCommonResult.isSuccess()) {
+//                 throw new Exception("系统异常!"); //todo
+            }
+        }
+        return userDO;
+    }
+
+    @Override
+    public List<String> getUsers(List<ImCollectUserReqVo> userVoList) {
+        List<String> uids = new ArrayList<>();
+        for (ImCollectUserReqVo imCollectUserReqVo : userVoList) {
+            UserDO orSave = getOrSave(imCollectUserReqVo.getUserId(), imCollectUserReqVo.getEnterpriseId());
+            uids.add(orSave.getUid());
+        }
+        return uids;
+    }
+
+    @Override
+    public List<String>  getAllUids() {
+      return   mapper.getAllUids();
+    }
+
+
     @Override
     public CommonResult<List<ImUserInfoVo>> getUserByUids(Set<String> uids) {
         if(null == uids || uids.isEmpty()){
@@ -152,6 +202,8 @@ public class UserServiceImpl implements UserService{
     }
 
 
+
+
     @Autowired
     public void setWuKongUserService(WuKongUserService wuKongUserService) {
         this.wuKongUserService = wuKongUserService;

+ 2 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongApiService.java

@@ -45,7 +45,9 @@ public interface WuKongApiService {
 
     /**
      * 添加系统账号
+     * { uids:[]}
      */
+    @Deprecated
     @PostMapping("/user/systemuids_add")
     public WukongApiResp   userSystemUidsAdd(@RequestBody List<String> uids);
 

+ 4 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongMessageService.java

@@ -1,6 +1,8 @@
 package com.citu.module.menduner.im.service.wukong;
 
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.api.ImCollectMessageReqVo;
+import com.citu.module.menduner.im.api.ImCollectUserReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.ChannelMessageSyncReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.HistoryMessagesReqVo;
 import com.citu.module.menduner.im.controller.app.base.wukong.MessagesBackReqVo;
@@ -11,4 +13,6 @@ public interface WuKongMessageService {
     CommonResult historyMessages(HistoryMessagesReqVo reqVo);
 
     CommonResult messagesBack(MessagesBackReqVo reqVo);
+
+    CommonResult systemMessage(ImCollectMessageReqVo reqVo);
 }

+ 54 - 0
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/wukong/WuKongMessageServiceImpl.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.im.api.ImCollectMessageReqVo;
+import com.citu.module.menduner.im.api.ImMessageApi;
 import com.citu.module.menduner.im.controller.app.base.wukong.*;
 import com.citu.module.menduner.im.dal.dataobject.BackMessage;
 import com.citu.module.menduner.im.dal.dataobject.UserMsgDO;
@@ -15,6 +17,7 @@ import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -103,6 +106,57 @@ public class WuKongMessageServiceImpl implements WuKongMessageService {
          return CommonResult.success(wukongApiResp);
     }
 
+    @Override
+    public CommonResult systemMessage(ImCollectMessageReqVo reqVo) {
+     // system 系统消息uid
+        // 参数效验
+        if(1==reqVo.getCollectUserType() && reqVo.getUserVoList().isEmpty()){
+            throw  new RuntimeException("请传入收件人信息");
+        }
+       List<String> uids =  new ArrayList<>();
+        if(2==reqVo.getCollectUserType()){
+            uids =   userService.getAllUids(); // todo 暂不考虑性能和OOM情况
+        }else {
+          uids =  userService.getUsers(reqVo.getUserVoList());
+        }
+        asyncSystemMessage(uids, reqVo.getMessageType(), reqVo.getMessage());
+
+
+
+        return CommonResult.success("已异步发送消息");
+    }
+
+    @Async
+    public void asyncSystemMessage(List<String> uids,Integer messageType, String message) {
+
+        int pageSize = 100;
+        int size = uids.size();
+        int pageNum = (int) Math.ceil(size / (double) pageSize);
+
+        // system 系统消息uid
+        ImMessageSendReqVo reqVo =new ImMessageSendReqVo();
+        Map<String,Object> payloadMap =new HashMap<>();
+        payloadMap.put("type",-1);
+//        payloadMap.put("message_id",reqVo.getMessageId());
+        payloadMap.put("content",ImmutableMap.of("text",message));
+        reqVo.setPayload(Base64.encode(JSON.toJSONString(payloadMap)));
+        reqVo.setFromUid("system");
+        ImHeaderReqVo imHeaderReqVo =new ImHeaderReqVo();
+        imHeaderReqVo.setNoPersist(0);
+        imHeaderReqVo.setRedDot(1);
+        imHeaderReqVo.setSyncOnce(0);
+        reqVo.setHeader(imHeaderReqVo);
+        for (int i = 0; i < pageNum; i++) {
+            int start = i * pageSize;
+            int end = Math.min(start + pageSize, size);
+            List<String> batch = uids.subList(start, end);
+            reqVo.setSubscribers(batch);
+            // 处理当前批次的数据
+            wuKongApiService.userSendbatch(reqVo);
+        }
+
+    }
+
     @Autowired
     public void setUserMsgMapper(UserMsgMapper userMsgMapper) {
         this.userMsgMapper = userMsgMapper;

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/MessageCenterController.java

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.controller.app;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Component
+@RequestMapping
+public class MessageCenterController {
+
+}

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/message/MessageCenterService.java

@@ -0,0 +1,4 @@
+package com.citu.module.menduner.system.service.message;
+
+public interface   MessageCenterService {
+}

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/message/MessageCenterServiceImpl.java

@@ -0,0 +1,7 @@
+package com.citu.module.menduner.system.service.message;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class MessageCenterServiceImpl implements MessageCenterService{
+}