feat:feature-REQ/2129 恢复旧的发送消息接口,保持不报错,后面去掉

This commit is contained in:
lilong 2024-03-19 16:12:47 +08:00
parent eef5273948
commit 2d582c7c01
5 changed files with 183 additions and 3 deletions

View File

@ -1,14 +1,20 @@
package cn.axzo.im.center.api.feign; package cn.axzo.im.center.api.feign;
import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.im.center.api.vo.req.CustomMessageInfo;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.im.center.api.vo.req.SendCustomMessageParam; import cn.axzo.im.center.api.vo.req.SendCustomMessageParam;
import cn.axzo.im.center.api.vo.req.SendMessageParam; import cn.axzo.im.center.api.vo.req.SendMessageParam;
import cn.axzo.im.center.api.vo.resp.MessageCustomResp;
import cn.axzo.im.center.api.vo.resp.MessageDispatchResp;
import cn.axzo.im.center.api.vo.resp.MessageTaskResp; import cn.axzo.im.center.api.vo.resp.MessageTaskResp;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/** /**
* IM消息管理API * IM消息管理API
* *
@ -42,4 +48,25 @@ public interface MessageApi {
@PostMapping("/api/im/custom-message/send") @PostMapping("/api/im/custom-message/send")
ApiResult<MessageTaskResp> sendCustomMessage(@RequestBody @Validated SendCustomMessageParam messageInfo); ApiResult<MessageTaskResp> sendCustomMessage(@RequestBody @Validated SendCustomMessageParam messageInfo);
/**
* 发送消息,单条消息批量发送消息统一入口
* 1.该接口一次请求接收人支持最大2000人
* 2.网易云信一分钟支持120次调用,每次调用IM中心设置100个账户(能返回msgId最大支持100人)
* 3.IM中心接收人有工人端和管理端账户,故当接收人最大2000人时需要调用网易云信发送4000条消息
* 4.按照每批次发送100条消息,需要发送40次
* 5.因此该接口一分钟内最大支持3次接收人为2000人的请求
*
* @param messageInfo 发送消息请求参数
* @return 发送消息请求响应
*/
@PostMapping("api/im/message/dispatch")
ApiResult<List<MessageDispatchResp>> sendMessage(@RequestBody @Validated MessageInfo messageInfo);
/**
* 发送自定义消息
*/
@PostMapping("api/im/custom-message/send")
ApiResult<List<MessageCustomResp>> sendCustomMessage(@RequestBody @Validated CustomMessageInfo messageInfo);
} }

View File

@ -0,0 +1,50 @@
package cn.axzo.im.center.api.vo.req;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.im.center.common.enums.BizTypeEnum;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author syl
* @date 2023/12/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CustomMessageInfo {
/**
* 发送消息到App端
* 工人端企业端服务器
* CMCMPSYSTEM
*
* @See cn.axzo.im.center.common.enums.AppTypeEnum
*/
@NotEmpty(message = "消息接收端类型appTypeList不能为空")
private List<AppTypeEnum> appTypeList;
/**
* 接收用户自然人Id
*/
@NotBlank(message = "接收用户自然人Id不能为空")
private String toPersonId;
/**
* 业务类型
*/
@NotNull(message = "业务类型不能为空")
private BizTypeEnum bizType;
/**
* 推送内容 - 业务数据json格式
*/
private String payload;
}

View File

@ -0,0 +1,73 @@
package cn.axzo.im.center.api.vo.req;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import com.google.common.collect.Maps;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* IM消息信息
*
* @author zuoqinbo
* @version V1.0
* @date 2023/10/9 16:01
*/
@Data
public class MessageInfo {
/**
* 发送消息到App端
* 工人端企业端服务器
* CMCMPSYSTEM
*
* @See cn.axzo.im.center.common.enums.AppTypeEnum
*/
@NotNull(message = "消息接收端类型appTypeList不能为空")
private List<AppTypeEnum> appTypeList;
/**
* 发送用户Id,目前暂不支持非机器人发送消息
*/
private String personId;
/**
* 消息接收用户Id列表
*/
@NotNull(message = "接收消息用户personIdList不能为空")
private Set<String> toPersonIdList;
/**
* 消息标题
*/
@NotNull(message = "消息标题不能为空")
private String msgHeader;
/**
* 消息内容
*/
@NotNull(message = "消息内容不能为空")
private String msgContent;
/**
* 消息模板ID
*/
@NotNull(message = "消息模板ID不能为空")
private String msgTemplateId;
/**
* 消息模板内容
*/
@NotNull(message = "消息模板内容不能为空")
private String msgTemplateContent;
/**
* 消息扩展信息
*/
private Map<String, String> extendsInfo = Maps.newHashMap();
}

View File

@ -5,8 +5,12 @@ import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.im.center.api.feign.MessageApi; import cn.axzo.im.center.api.feign.MessageApi;
import cn.axzo.im.center.api.vo.req.AccountQuery; import cn.axzo.im.center.api.vo.req.AccountQuery;
import cn.axzo.im.center.api.vo.req.CustomMessageInfo;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.im.center.api.vo.req.SendCustomMessageParam; import cn.axzo.im.center.api.vo.req.SendCustomMessageParam;
import cn.axzo.im.center.api.vo.req.SendMessageParam; import cn.axzo.im.center.api.vo.req.SendMessageParam;
import cn.axzo.im.center.api.vo.resp.MessageCustomResp;
import cn.axzo.im.center.api.vo.resp.MessageDispatchResp;
import cn.axzo.im.center.api.vo.resp.MessageTaskResp; import cn.axzo.im.center.api.vo.resp.MessageTaskResp;
import cn.axzo.im.center.api.vo.resp.UserAccountResp; import cn.axzo.im.center.api.vo.resp.UserAccountResp;
import cn.axzo.im.center.common.enums.AccountTypeEnum; import cn.axzo.im.center.common.enums.AccountTypeEnum;
@ -15,19 +19,23 @@ import cn.axzo.im.channel.IMChannelProvider;
import cn.axzo.im.entity.AccountRegister; import cn.axzo.im.entity.AccountRegister;
import cn.axzo.im.entity.MessageTask; import cn.axzo.im.entity.MessageTask;
import cn.axzo.im.service.AccountService; import cn.axzo.im.service.AccountService;
import cn.axzo.im.service.MessageService;
import cn.axzo.im.service.MessageTaskService; import cn.axzo.im.service.MessageTaskService;
import cn.axzo.im.service.RobotMsgTemplateService; import cn.axzo.im.service.RobotMsgTemplateService;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.github.resilience4j.ratelimiter.RequestNotPermitted;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -52,6 +60,28 @@ public class MessageController implements MessageApi {
private AccountService accountService; private AccountService accountService;
@Autowired @Autowired
private RobotMsgTemplateService robotMsgTemplateService; private RobotMsgTemplateService robotMsgTemplateService;
@Autowired
private MessageService messageService;
@Override
public ApiResult<List<MessageDispatchResp>> sendMessage(MessageInfo messageInfo) {
// List<MessageDispatchResp> messageRespList = messageService.sendMessage(messageInfo);
return ApiResult.ok(null);
}
@Override
public ApiResult<List<MessageCustomResp>> sendCustomMessage(CustomMessageInfo customMessage) {
// List<MessageCustomResp> messageRespList = messageService.sendCustomMessage(customMessage);
return ApiResult.ok(null);
}
@ExceptionHandler({ RequestNotPermitted.class })
@ResponseStatus(HttpStatus.TOO_MANY_REQUESTS)
public ApiResult<String> handleRequestNotPermitted() {
return ApiResult.err("服务器资源繁忙,请求被拒绝!");
}
/** /**
* 发送消息时只是存储在messageTask中通过xxlJob或者mq异步去处理 * 发送消息时只是存储在messageTask中通过xxlJob或者mq异步去处理

View File

@ -104,9 +104,9 @@ ALTER TABLE im_account_register ADD COLUMN `ou_id` bigint null comment 'organiza
CREATE TABLE IF NOT EXISTS im_message_task CREATE TABLE IF NOT EXISTS im_message_task
( (
id bigint auto_increment comment '主键', id bigint auto_increment comment '主键',
biz_id varchar(50) null comment '业务请求时可以带的排查问题的id', biz_id varchar(50) not null default '' comment '业务请求时可以带的排查问题的id',
send_im_account varchar(100) not null comment '发送者的三方平台账号id', send_im_account varchar(100) not null comment '发送者的三方平台账号id',
send_person_id varchar(100) null comment 'IM消息发送personId自定义消息没有personId', send_person_id varchar(100) not null default '' comment 'IM消息发送personId自定义消息没有personId',
receive_persons json not null comment 'IM消息接收人person列表', receive_persons json not null comment 'IM消息接收人person列表',
status varchar(32) not null default 'PENDING' comment '消息状态PENDING、SUCCEED、FAILED', status varchar(32) not null default 'PENDING' comment '消息状态PENDING、SUCCEED、FAILED',
title VARCHAR(128) NOT NULL DEFAULT '' COMMENT '标题', title VARCHAR(128) NOT NULL DEFAULT '' COMMENT '标题',