Explorar o código

发送多人消息

yingp %!s(int64=6) %!d(string=hai) anos
pai
achega
83d5b8f1f3

+ 1 - 1
apis/app-api/src/main/java/com/usoftchina/uu/app/api/AppConfigApi.java

@@ -19,7 +19,7 @@ public interface AppConfigApi {
      * @param appConfigDTO
      * @return appConfig.id
      */
-    int save(AppConfigDTO appConfigDTO);
+    boolean save(AppConfigDTO appConfigDTO);
 
     /**
      * 批量保存

+ 14 - 1
apis/message-api/src/main/java/com/usoftchina/uu/message/dto/SendMessageDTO.java

@@ -10,6 +10,7 @@ import java.util.List;
  * @date 2019/4/19
  */
 public class SendMessageDTO implements Serializable {
+    private List<Long> ids;
     /**
      * 消息类
      */
@@ -31,12 +32,24 @@ public class SendMessageDTO implements Serializable {
     }
 
     public SendMessageDTO(String code, String body, Long accountId, Long companyId) {
+        this(code, body, new ArrayList<>(Arrays.asList(new Long[]{accountId})), companyId);
+    }
+
+    public SendMessageDTO(String code, String body, List<Long> accountIds, Long companyId) {
         this.code = code;
         this.body = body;
-        this.accountIds = new ArrayList<>(Arrays.asList(new Long[]{accountId}));
+        this.accountIds = accountIds;
         this.companyId = companyId;
     }
 
+    public List<Long> getIds() {
+        return ids;
+    }
+
+    public void setIds(List<Long> ids) {
+        this.ids = ids;
+    }
+
     public String getCode() {
         return code;
     }

+ 21 - 0
apis/open-grpc-api/src/main/proto/message.proto

@@ -11,6 +11,8 @@ option java_package = "com.usoftchina.uu.open.grpc.api";
 service MessageService {
     // 发送消息
     rpc send (SendMessageRequest) returns (SendMessageResponse) {};
+    // 发送多人消息
+    rpc batchSend (BatchSendMessageRequest) returns (BatchSendMessageResponse) {};
     // 未读消息统计
     rpc getUnreadCount (GetUnreadMessageCountRequest) returns (GetUnreadMessageCountResponse) {};
     // 获取消息
@@ -32,6 +34,25 @@ message SendMessageRequest {
 // 发送消息响应参数
 message SendMessageResponse {
     ResponseHeader responseHeader = 1;
+    // 消息ID
+    int64 messageId = 2;
+}
+
+// 发送多人消息请求参数
+message BatchSendMessageRequest {
+    // 消息配置编码
+    string code = 1;
+    // 消息内容
+    string message = 2;
+    // 到指定用户
+    repeated int64 accountId = 3;
+}
+
+// 发送多人消息响应参数
+message BatchSendMessageResponse {
+    ResponseHeader responseHeader = 1;
+    // 消息ID
+    repeated int64 messageId = 2;
 }
 
 // 未读消息统计请求参数

+ 32 - 2
external/open-sdk/src/main/java/com/usoftchina/uu/open/sdk/service/UuMessageService.java

@@ -10,6 +10,7 @@ import com.usoftchina.uu.open.sdk.util.UuBeanMapper;
 import io.grpc.StatusRuntimeException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
 
 import java.util.List;
 
@@ -34,8 +35,9 @@ public class UuMessageService {
      * @param code      消息类
      * @param body      消息内容
      * @param accountId 接收账号
+     * @return 消息ID
      */
-    public void send(String code, String body, Long accountId) {
+    public Long send(String code, String body, Long accountId) {
         SendMessageRequest.Builder builder = SendMessageRequest.newBuilder();
         try {
             builder.setCode(code)
@@ -43,7 +45,35 @@ public class UuMessageService {
                     .setAccountId(accountId);
             SendMessageResponse response = messageServiceBlockingStub.send(builder.build());
             ResponseHeader header = response.getResponseHeader();
-            if (!header.getSuccess()) {
+            if (header.getSuccess()) {
+                return response.getMessageId();
+            } else {
+                throw new UuException(header);
+            }
+        } catch (StatusRuntimeException e) {
+            throw new UuException(e);
+        }
+    }
+
+    /**
+     * 发送多人消息
+     *
+     * @param code       消息类
+     * @param body       消息内容
+     * @param accountIds 接收账号集合
+     * @return 消息ID集合
+     */
+    public List<Long> send(String code, String body, List<Long> accountIds) {
+        Assert.notEmpty(accountIds, "空账号集");
+        BatchSendMessageRequest.Builder builder = BatchSendMessageRequest.newBuilder();
+        try {
+            builder.setCode(code).setMessage(body);
+            accountIds.forEach(builder::addAccountId);
+            BatchSendMessageResponse response = messageServiceBlockingStub.batchSend(builder.build());
+            ResponseHeader header = response.getResponseHeader();
+            if (header.getSuccess()) {
+                return response.getMessageIdList();
+            } else {
                 throw new UuException(header);
             }
         } catch (StatusRuntimeException e) {

+ 13 - 3
services/app-service/src/main/java/com/usoftchina/uu/app/service/impl/AppConfigServiceImpl.java

@@ -34,15 +34,25 @@ public class AppConfigServiceImpl implements AppConfigApi {
     private AppCompanyMapper appCompanyMapper;
 
     @Override
-    public int save(AppConfigDTO appConfigDTO) {
+    public boolean save(AppConfigDTO appConfigDTO) {
         AppConfig appConfig = BeanMapper.map(appConfigDTO, AppConfig.class);
-        return appConfigMapper.insertSelective(appConfig);
+        boolean saved = appConfigMapper.insertSelective(appConfig) > 0;
+        if (saved) {
+            appConfigDTO.setId(appConfig.getId());
+        }
+        return saved;
     }
 
     @Override
     public boolean save(List<AppConfigDTO> appConfigDTOList) {
         List<AppConfig> appConfigList = BeanMapper.mapList(appConfigDTOList, AppConfig.class);
-        return appConfigMapper.insertAllSelective(appConfigList) > 0;
+        boolean saved =  appConfigMapper.insertAllSelective(appConfigList) > 0;
+        if (saved) {
+            for (int i = 0, len = appConfigDTOList.size(); i < len; i++) {
+                appConfigDTOList.get(i).setId(appConfigList.get(i).getId());
+            }
+        }
+        return saved;
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 4 - 2
services/app-service/src/main/resources/mapper/AppConfigMapper.xml

@@ -84,7 +84,8 @@
             </if>
         </trim>
     </insert>
-    <insert id="insertAll" parameterType="java.util.List">
+    <insert id="insertAll" parameterType="java.util.List"
+            useGeneratedKeys="true" keyProperty="id">
         insert into app_config (group_id,name,icon,order_num,view_type,android_widget,ios_widget,web_url,scope_platform,
         scope_company_id,company_relate) values
         <foreach collection="list" item="item" index="index" open="" close="" separator=",">
@@ -94,7 +95,8 @@
             #{item.companyRelate,jdbcType=INTEGER})
         </foreach>
     </insert>
-    <insert id="insertAllSelective" parameterType="java.util.List">
+    <insert id="insertAllSelective" parameterType="java.util.List"
+            useGeneratedKeys="true" keyProperty="id">
         <foreach collection="list" item="item" index="index" separator=";">
             insert into app_config
             <trim prefix="(" suffix=")" suffixOverrides=",">

+ 3 - 0
services/message-service/src/main/java/com/usoftchina/uu/message/service/impl/MessageServiceImpl.java

@@ -91,6 +91,9 @@ public class MessageServiceImpl implements MessageApi {
         List<Message> messageList = fromSendMessageDTO(sendMessageDTO);
         boolean success = messageMapper.insertAllSelective(messageList) > 0;
         if (success) {
+            List<Long> ids = messageList.stream().map(message -> message.getId()).collect(Collectors.toList());
+            sendMessageDTO.setIds(ids);
+
             // 通过事件异步执行推送、统计等操作
             messageList.forEach(message -> {
                 SpringContextHolder.getContext().publishEvent(new MessageCreatedEvent(this, message));

+ 2 - 1
services/message-service/src/main/resources/mapper/MessageMapper.xml

@@ -67,7 +67,8 @@
             </if>
         </trim>
     </insert>
-    <insert id="insertAllSelective" parameterType="java.util.List">
+    <insert id="insertAllSelective" parameterType="java.util.List"
+            useGeneratedKeys="true" keyProperty="id">
         <foreach collection="list" item="item" index="index" separator=";">
             insert into message_unread
             <trim prefix="(" suffix=")" suffixOverrides=",">

+ 3 - 3
services/open-grpc-service/src/main/java/com/usoftchina/uu/open/grpc/service/impl/OpenAppServiceImpl.java

@@ -90,14 +90,14 @@ public class OpenAppServiceImpl extends AppServiceGrpc.AppServiceImplBase{
             // 标记为专属应用
             appConfigDTO.setScopeCompanyId(companyDTO.getId());
             appConfigDTO.setScopePlatform(platform.getValue());
-            int appId = appConfigApi.save(appConfigDTO);
+            appConfigApi.save(appConfigDTO);
 
             Boolean enable = request.getAppConfig().getEnable();
             if (null != enable && enable.booleanValue()) {
-                appConfigApi.bindCompany(appId, companyDTO.getId());
+                appConfigApi.bindCompany(appConfigDTO.getId(), companyDTO.getId());
             }
 
-            builder.setAppId(appId)
+            builder.setAppId(appConfigDTO.getId())
                     .setResponseHeader(ResponseUtils.success());
         } catch (Exception e) {
             logger.error("saveConfig error", e);

+ 23 - 0
services/open-grpc-service/src/main/java/com/usoftchina/uu/open/grpc/service/impl/OpenMessageServiceImpl.java

@@ -45,6 +45,29 @@ public class OpenMessageServiceImpl extends MessageServiceGrpc.MessageServiceImp
             // TODO 校验 message code对应的platform与当前第三方平台PlatformHolder.get()是否一致
             // TODO 校验accountId与companyId是否存在绑定关系
             messageApi.send(messageDTO);
+            builder.setMessageId(messageDTO.getIds().get(0))
+                    .setResponseHeader(ResponseUtils.success());
+        } catch (Exception e) {
+            logger.error("send error", e);
+            builder.setResponseHeader(ResponseUtils.error(e));
+        }
+        responseObserver.onNext(builder.build());
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void batchSend(BatchSendMessageRequest request, StreamObserver<BatchSendMessageResponse> responseObserver) {
+        BatchSendMessageResponse.Builder builder = BatchSendMessageResponse.newBuilder();
+        try {
+            CompanyDTO companyDTO = CompanyHolder.get();
+            SendMessageDTO messageDTO = new SendMessageDTO(request.getCode(), request.getMessage(),
+                    request.getAccountIdList(), companyDTO.getId());
+            // TODO 校验 message code对应的platform与当前第三方平台PlatformHolder.get()是否一致
+            // TODO 校验accountId与companyId是否存在绑定关系
+            messageApi.send(messageDTO);
+            messageDTO.getIds().forEach(id -> {
+                builder.addMessageId(id);
+            });
             builder.setResponseHeader(ResponseUtils.success());
         } catch (Exception e) {
             logger.error("send error", e);