feat(REQ-1465): 新增发送普通消息发送接口
背景: https://jira.axzo.cn/browse/REQ-1465?goToView=1 修改: 1、新增发送普通消息发送接口 影响: 无
This commit is contained in:
parent
bd1cb276a0
commit
15d259836f
@ -110,6 +110,10 @@
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.im.center</groupId>
|
||||
<artifactId>im-center-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@ -0,0 +1,27 @@
|
||||
package cn.axzo.msg.center.message.controller;
|
||||
|
||||
import cn.axzo.msg.center.message.service.GeneralMessageService;
|
||||
import cn.axzo.msg.center.service.general.client.GeneralMessageClient;
|
||||
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/19
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
public class GeneralMessageController implements GeneralMessageClient {
|
||||
|
||||
private final GeneralMessageService generalMessageService;
|
||||
|
||||
@Override
|
||||
public CommonResponse<String> sendMessage(GeneralMessageSendRequest request) {
|
||||
return CommonResponse.success(generalMessageService.sendMessage(request));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,87 @@
|
||||
package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/19
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class GeneralMessagePushDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -9017550674630922381L;
|
||||
|
||||
/**
|
||||
* 消息的唯一标识
|
||||
*/
|
||||
private String identityCode;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 模板icon地址
|
||||
*/
|
||||
private String templateIcon;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 卡片信息
|
||||
*/
|
||||
private String cardContent;
|
||||
/**
|
||||
* 消息所属组织类型
|
||||
*/
|
||||
private OrganizationTypeEnum orgType;
|
||||
/**
|
||||
* 消息所属组织Id
|
||||
*/
|
||||
private Long orgId;
|
||||
/**
|
||||
* 消息所属组织名称
|
||||
*/
|
||||
private String orgName;
|
||||
/**
|
||||
* 业务编码
|
||||
*/
|
||||
private String bizCode;
|
||||
/**
|
||||
* 消息发送时间戳
|
||||
*/
|
||||
private Long sendTimestamp;
|
||||
/**
|
||||
* 路由信息,可为空
|
||||
*/
|
||||
private List<MessageRouterButtonDTO> routers;
|
||||
/**
|
||||
* 参数及其对应的值的JSON串
|
||||
*/
|
||||
private JSONObject routerParams;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -60,6 +61,14 @@ public class MessageTemplateDTO implements Serializable {
|
||||
* 模板路由信息
|
||||
*/
|
||||
private List<RawMessageRouterDTO> routers;
|
||||
/**
|
||||
* 推送终端
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
/**
|
||||
* APP最小版本支持,可不配
|
||||
*/
|
||||
private String minAppVersion;
|
||||
|
||||
public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, List<RawMessageRouterDTO> routers) {
|
||||
return MessageTemplateDTO.builder()
|
||||
@ -71,6 +80,8 @@ public class MessageTemplateDTO implements Serializable {
|
||||
.msgCategory(baseTemplate.getMsgCategory())
|
||||
.icon(baseTemplate.getIcon())
|
||||
.routers(routers)
|
||||
.pushTerminals(JSON.parseArray(baseTemplate.getPushTerminal(), PushTerminalEnum.class))
|
||||
.minAppVersion(baseTemplate.getMinAppVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
package cn.axzo.msg.center.message.service;
|
||||
|
||||
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/19
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface GeneralMessageService {
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
*
|
||||
* @param request 消息所需参数
|
||||
* @return 消息的唯一标识
|
||||
*/
|
||||
String sendMessage(GeneralMessageSendRequest request);
|
||||
}
|
||||
@ -0,0 +1,145 @@
|
||||
package cn.axzo.msg.center.message.service.impl;
|
||||
|
||||
import cn.axzo.im.center.api.feign.MessageApi;
|
||||
import cn.axzo.im.center.api.vo.req.MessageInfo;
|
||||
import cn.axzo.msg.center.common.exception.ServiceException;
|
||||
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
|
||||
import cn.axzo.msg.center.dal.GeneralMessageRecordDao;
|
||||
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
|
||||
import cn.axzo.msg.center.message.domain.dto.GeneralMessagePushDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.message.service.GeneralMessageService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/19
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class GeneralMessageServiceImpl implements GeneralMessageService {
|
||||
|
||||
private final MessageApi messageApi;
|
||||
private final MessageTemplateNewService messageTemplateNewService;
|
||||
private final GeneralMessageRecordDao generalMessageRecordDao;
|
||||
|
||||
@Override
|
||||
public String sendMessage(GeneralMessageSendRequest request) {
|
||||
// 查询模板基础信息
|
||||
MessageTemplateDTO template = messageTemplateNewService.queryByTemplateCode(request.getTemplateCode())
|
||||
.orElseThrow(() -> new ServiceException("未查询到对应的模板"));
|
||||
// 构建消息记录并存储
|
||||
GeneralMessageRecord messageRecord = buildMessageRecord(request, template);
|
||||
generalMessageRecordDao.save(messageRecord);
|
||||
// 推送
|
||||
pushMessage(messageRecord, template);
|
||||
return messageRecord.getIdentityCode();
|
||||
}
|
||||
|
||||
private GeneralMessageRecord buildMessageRecord(GeneralMessageSendRequest request, MessageTemplateDTO template) {
|
||||
return GeneralMessageRecord.builder()
|
||||
.identityCode(UUIDUtil.uuidString())
|
||||
.senderId(request.getSenderPersonId())
|
||||
.senderId(request.getSenderIdentity().getId())
|
||||
.senderType(request.getSenderIdentity().getType())
|
||||
.receiverPersonId(request.getReceiverPersonId())
|
||||
.receiverId(request.getReceiverIdentity().getId())
|
||||
.receiverType(request.getReceiverIdentity().getType())
|
||||
.templateCode(template.getCode())
|
||||
.title(parseString(template.getTitle(), request.getBizExtParams()))
|
||||
.content(parseString(template.getContent(), request.getBizExtParams()))
|
||||
.orgType(request.getOrgType())
|
||||
.orgId(request.getOrgId())
|
||||
.orgName(request.getOrgName())
|
||||
.state(GeneralMessageStateEnum.HAS_BEEN_SENT)
|
||||
.bizCode(request.getBizCode())
|
||||
.routerParams(request.getRouterParams())
|
||||
.bizExtParams(request.getBizExtParams())
|
||||
.build();
|
||||
}
|
||||
|
||||
private void pushMessage(GeneralMessageRecord record, MessageTemplateDTO template) {
|
||||
if (CollectionUtils.isEmpty(template.getPushTerminals())) {
|
||||
// 模板未配置任何推送终端
|
||||
return;
|
||||
}
|
||||
List<String> appTypes = template.getPushTerminals().stream()
|
||||
.map(PushTerminalEnum::getImTerminalFlag).collect(Collectors.toList());
|
||||
GeneralMessagePushDTO message = convert(record, template);
|
||||
MessageInfo msgInfo = new MessageInfo();
|
||||
msgInfo.setAppTypeList(appTypes);
|
||||
msgInfo.setPersonId(String.valueOf(record.getSenderPersonId()));
|
||||
msgInfo.setToPersonIdList(Lists.newArrayList(String.valueOf(record.getReceiverPersonId())));
|
||||
msgInfo.setMsgHeader(record.getTitle());
|
||||
msgInfo.setMsgContent(record.getContent());
|
||||
msgInfo.setMsgTemplateId(record.getTemplateCode());
|
||||
msgInfo.setMsgTemplateContent(JSON.toJSONString(message));
|
||||
// 扩展信息
|
||||
Map<String, String> ext = new HashMap<>();
|
||||
ext.put("minAppVersion", template.getMinAppVersion());
|
||||
msgInfo.setExtendsInfo(ext);
|
||||
|
||||
messageApi.sendMessage(msgInfo);
|
||||
}
|
||||
|
||||
private GeneralMessagePushDTO convert(GeneralMessageRecord record, MessageTemplateDTO template) {
|
||||
// 对应模板的路由列表
|
||||
List<RawMessageRouterDTO> rawRouters = template.getRouters();
|
||||
// 视情况替换原始URL中的参数变量
|
||||
rawRouters.forEach(e -> MessageRouterUtil.parseRouteUrl(e, record.getRouterParams()));
|
||||
// 转化成客户端展示的数据模型
|
||||
List<MessageRouterButtonDTO> routerButtons = rawRouters.stream()
|
||||
.map(RawMessageRouterDTO::toMessageRouterButton)
|
||||
.collect(Collectors.toList());
|
||||
// 获取模板卡片信息
|
||||
String cardContent = template.getCardContent();
|
||||
if (StringUtils.isNotBlank(cardContent)) {
|
||||
cardContent = PlaceholderResolver.getDefaultResolver().resolveByMap(cardContent, record.getBizExtParams());
|
||||
}
|
||||
return GeneralMessagePushDTO.builder()
|
||||
.identityCode(record.getIdentityCode())
|
||||
.templateCode(template.getCode())
|
||||
.templateIcon(template.getIcon())
|
||||
.title(record.getTitle())
|
||||
.content(record.getContent())
|
||||
.cardContent(cardContent)
|
||||
.orgType(record.getOrgType())
|
||||
.orgId(record.getOrgId())
|
||||
.orgName(record.getOrgName())
|
||||
.bizCode(record.getBizCode())
|
||||
.sendTimestamp(System.currentTimeMillis())
|
||||
.routers(routerButtons)
|
||||
.routerParams(record.getRouterParams())
|
||||
.build();
|
||||
}
|
||||
|
||||
private String parseString(String string, JSONObject params) {
|
||||
if (Objects.isNull(params)) {
|
||||
return string;
|
||||
}
|
||||
return PlaceholderResolver.getDefaultResolver().resolveByMap(string, params);
|
||||
}
|
||||
}
|
||||
@ -8,6 +8,7 @@ import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -15,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -47,6 +49,25 @@ public final class MessageRouterUtil {
|
||||
.findFirst().orElseGet(() -> rawMessageRouter.getTerminals().get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定的终端类型选取合适的路由
|
||||
*
|
||||
* @param rawMessageRouter 原始的模板路由策略
|
||||
* @param excludeTerminalType 待排除的终端类型
|
||||
* @return 合适的路由数据
|
||||
*/
|
||||
public static List<MessageRouterTerminalDTO> selectWithout(RawMessageRouterDTO rawMessageRouter,
|
||||
TerminalTypeEnum excludeTerminalType) {
|
||||
if (RouterCategoryEnum.ACTION.equals(rawMessageRouter.getCategory())) {
|
||||
// 如果配置路由是API调用,这与终端无关
|
||||
return rawMessageRouter.getTerminals();
|
||||
}
|
||||
return rawMessageRouter.getTerminals().stream()
|
||||
.filter(e -> !Objects.equals(excludeTerminalType, e.getTerminalType()))
|
||||
// 若没有匹配的,默认选择第一个然后由前端去进行最终判断
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断路由参数的合法性
|
||||
*
|
||||
@ -74,6 +95,23 @@ public final class MessageRouterUtil {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析模板上配置的路由地址,并将发送消息时的参数替换上去
|
||||
*
|
||||
* @param router 路由信息
|
||||
* @param routerParam 路由参数
|
||||
*/
|
||||
public static void parseRouteUrl(RawMessageRouterDTO router, JSONObject routerParam) {
|
||||
// 路由参数有效
|
||||
if (Objects.nonNull(routerParam)) {
|
||||
router.getTerminals().forEach(e -> {
|
||||
// 替换原始URL中的参数变量
|
||||
String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getUrl(), routerParam);
|
||||
e.setUrl(routerUrl);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析按钮style
|
||||
*
|
||||
|
||||
@ -55,6 +55,8 @@ public class MessageRouterDTO implements Serializable {
|
||||
private TerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 按钮样式配置
|
||||
* HIGH_LIGHT: 按钮高亮展示
|
||||
* OVER_CARD: 按钮显示在卡片
|
||||
*/
|
||||
private List<ButtonStyleEnum> style;
|
||||
|
||||
|
||||
@ -18,12 +18,13 @@ public enum PushTerminalEnum {
|
||||
/**
|
||||
* B-安心筑企业版
|
||||
*/
|
||||
B_ENTERPRISE_APP("B-安心筑企业版"),
|
||||
B_ENTERPRISE_APP("B-安心筑企业版", "ENTERPRISE"),
|
||||
/**
|
||||
* C-安心筑工人版
|
||||
*/
|
||||
C_WORKER_APP("C-安心筑工人版"),
|
||||
C_WORKER_APP("C-安心筑工人版", "WORKER"),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
private final String imTerminalFlag;
|
||||
}
|
||||
|
||||
@ -16,7 +16,9 @@ import lombok.Getter;
|
||||
public enum RouterCategoryEnum {
|
||||
|
||||
JUMP("直接跳转"),
|
||||
ACTION("接口调用");
|
||||
ACTION("接口调用"),
|
||||
DETAIL("页面详情"),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
}
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
package cn.axzo.msg.center.service.general.client;
|
||||
|
||||
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
|
||||
import cn.axzo.msg.center.service.pending.client.fallback.PendingMessageClientFallback;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 普通消息模块
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/10/18
|
||||
* @version 1.0
|
||||
*/
|
||||
@Component
|
||||
@FeignClient(value = "msg-center", url = "${server.serviceUrl:http://msg-center:8080}",
|
||||
fallback = PendingMessageClientFallback.class)
|
||||
public interface GeneralMessageClient {
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
*
|
||||
* @param request 消息所需参数
|
||||
* @return 消息的唯一标识
|
||||
*/
|
||||
@PostMapping(value = "/general-message/send", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<String> sendMessage(@RequestBody @Valid GeneralMessageSendRequest request);
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package cn.axzo.msg.center.service.general.client.fallback;
|
||||
|
||||
import cn.axzo.msg.center.service.general.client.GeneralMessageClient;
|
||||
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/18
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class GeneralMessageClientFallback implements GeneralMessageClient {
|
||||
|
||||
@Override
|
||||
public CommonResponse<String> sendMessage(GeneralMessageSendRequest request) {
|
||||
log.error("fall back while sending message. req:{}", request);
|
||||
return CommonResponse.error("fall back while sending message");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
package cn.axzo.msg.center.service.general.request;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 发送消息
|
||||
* @author cold_blade
|
||||
* @date 2023/10/18
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class GeneralMessageSendRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -3030926259836918967L;
|
||||
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
@NotBlank(message = "templateCode is required")
|
||||
private String templateCode;
|
||||
/**
|
||||
* 消息发送者自然人id
|
||||
*/
|
||||
@NotNull(message = "senderPersonId is required")
|
||||
private Long senderPersonId;
|
||||
/**
|
||||
* 消息发送者身份
|
||||
*/
|
||||
@NotNull(message = "senderIdentity is required")
|
||||
private IdentityDTO senderIdentity;
|
||||
/**
|
||||
* 消息接收者自然人id
|
||||
*/
|
||||
@NotNull(message = "receiverPersonId is required")
|
||||
private Long receiverPersonId;
|
||||
/**
|
||||
* 消息接收者身份
|
||||
*/
|
||||
@NotNull(message = "receiverIdentity is required")
|
||||
private IdentityDTO receiverIdentity;
|
||||
/**
|
||||
* 消息所属组织类型
|
||||
*/
|
||||
private OrganizationTypeEnum orgType;
|
||||
/**
|
||||
* 消息所属组织Id
|
||||
*/
|
||||
private Long orgId;
|
||||
/**
|
||||
* 消息所属组织名称
|
||||
*/
|
||||
private String orgName;
|
||||
/**
|
||||
* 发送消息的业务编码
|
||||
*/
|
||||
private String bizCode;
|
||||
/**
|
||||
* 路由参数
|
||||
* 注:该字段仅存放路由相关的变量及对应的值
|
||||
*/
|
||||
private JSONObject routerParams;
|
||||
/**
|
||||
* 业务扩展参数
|
||||
* 注:标题/内容/以及卡片等的变量及对应的值放到该字段
|
||||
*/
|
||||
private JSONObject bizExtParams;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,117 @@
|
||||
package cn.axzo.msg.center.service.general.response;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 普通消息记录数模型
|
||||
* @author cold_blade
|
||||
* @date 2023/10/18
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class GeneralMessageResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5740922087866033787L;
|
||||
|
||||
/**
|
||||
* 消息的唯一标识
|
||||
*/
|
||||
private String identityCode;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 模板icon地址
|
||||
*/
|
||||
private String templateIcon;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 卡片信息
|
||||
*/
|
||||
private String cardContent;
|
||||
/**
|
||||
* 消息发送者自然人id
|
||||
*/
|
||||
private Long senderPersonId;
|
||||
/**
|
||||
* 消息发送者身份
|
||||
*/
|
||||
private IdentityDTO senderIdentity;
|
||||
/**
|
||||
* 消息接收者自然人id
|
||||
*/
|
||||
private Long receiverPersonId;
|
||||
/**
|
||||
* 消息接收者身份
|
||||
*/
|
||||
private IdentityDTO receiverIdentity;
|
||||
/**
|
||||
* 消息所属组织类型
|
||||
*/
|
||||
private OrganizationTypeEnum orgType;
|
||||
/**
|
||||
* 消息所属组织Id
|
||||
*/
|
||||
private Long orgId;
|
||||
/**
|
||||
* 消息所属组织名称
|
||||
*/
|
||||
private String orgName;
|
||||
/**
|
||||
* 业务编码
|
||||
*/
|
||||
private String bizCode;
|
||||
/**
|
||||
* 业务状态描述
|
||||
*/
|
||||
private String bizDesc;
|
||||
/**
|
||||
* 消息发送时间戳
|
||||
*/
|
||||
private Long sendTimestamp;
|
||||
/**
|
||||
* 路由信息,可为空
|
||||
*/
|
||||
private List<MessageRouterDTO> routers;
|
||||
/**
|
||||
* 参数及其对应的值的JSON串
|
||||
*/
|
||||
private JSONObject routerParams;
|
||||
/**
|
||||
* 发送终端,eg:
|
||||
* B_ENTERPRISE_APP:B-安心筑企业版
|
||||
* C_WORKER_APP:C-安心筑工人版
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
package cn.axzo.msg.center.dal;
|
||||
|
||||
import cn.axzo.msg.center.dal.mapper.GeneralMessageRecordMapper;
|
||||
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* @author cold_blade
|
||||
* @date 2023/10/5
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class GeneralMessageRecordDao extends ServiceImpl<GeneralMessageRecordMapper, GeneralMessageRecord> {
|
||||
}
|
||||
@ -5,8 +5,14 @@ import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -20,27 +26,42 @@ import java.io.Serializable;
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("general_message_record")
|
||||
public class GeneralMessageRecord extends BaseEntity<GeneralMessageRecord> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -1271402884501451185L;
|
||||
|
||||
/**
|
||||
* 发送者ID
|
||||
* 消息的唯一标识
|
||||
*/
|
||||
private String identityCode;
|
||||
/**
|
||||
* 发送者自然人 ID
|
||||
*/
|
||||
private Long senderPersonId;
|
||||
/**
|
||||
* 发送者身份ID
|
||||
*/
|
||||
private Long senderId;
|
||||
/**
|
||||
* 接收者ID
|
||||
* 发送者身份类型
|
||||
*/
|
||||
private IdentityTypeEnum senderType;
|
||||
/**
|
||||
* 接收者自然人 ID
|
||||
*/
|
||||
private Long receiverPersonId;
|
||||
/**
|
||||
* 接收者身份ID
|
||||
*/
|
||||
private Long receiverId;
|
||||
/**
|
||||
* 接收者类型
|
||||
* 接收者身份类型
|
||||
*/
|
||||
private IdentityTypeEnum receiverType;
|
||||
/**
|
||||
* 自然人 ID
|
||||
*/
|
||||
private Long personId;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
@ -76,13 +97,19 @@ public class GeneralMessageRecord extends BaseEntity<GeneralMessageRecord> imple
|
||||
/**
|
||||
* 路由参数(留存)
|
||||
*/
|
||||
private String routerParams;
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private JSONObject routerParams;
|
||||
/**
|
||||
* 重试次数
|
||||
* 业务扩展参数
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private JSONObject bizExtParams;
|
||||
/**
|
||||
* 推送重试次数
|
||||
*/
|
||||
private Integer retryCount;
|
||||
/**
|
||||
* 最终失败原因
|
||||
* 推送最终失败原因
|
||||
*/
|
||||
private String failCause;
|
||||
|
||||
|
||||
@ -62,6 +62,10 @@ public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> impleme
|
||||
* 推送终端配置 JSON字串
|
||||
*/
|
||||
private String pushTerminal;
|
||||
/**
|
||||
* APP最小版本支持,可不配
|
||||
*/
|
||||
private String minAppVersion;
|
||||
/**
|
||||
* 创建者自然人id
|
||||
*/
|
||||
|
||||
66
start/src/main/java/cn/axzo/msg/center/FeignConfig.java
Normal file
66
start/src/main/java/cn/axzo/msg/center/FeignConfig.java
Normal file
@ -0,0 +1,66 @@
|
||||
package cn.axzo.msg.center;
|
||||
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import feign.RequestInterceptor;
|
||||
import feign.RequestTemplate;
|
||||
import feign.Target;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.EnvironmentAware;
|
||||
import org.springframework.context.annotation.Profile;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/10/19
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@Profile({"dev", "test", "local"})
|
||||
public class FeignConfig implements RequestInterceptor, EnvironmentAware {
|
||||
private Environment environment;
|
||||
|
||||
@Value("${imCenterEngineEnvUrl:http://dev-app.axzo.cn/msg-center}")
|
||||
private String imCenter;
|
||||
|
||||
private static String POD_NAMESPACE;
|
||||
|
||||
static {
|
||||
Map<String, String> env = System.getenv();
|
||||
if (env != null) {
|
||||
POD_NAMESPACE = env.get("MY_POD_NAMESPACE");
|
||||
}
|
||||
log.info("init FeignConfig, POD_NAMESPACE value is {}", POD_NAMESPACE);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void apply(RequestTemplate requestTemplate) {
|
||||
if (POD_NAMESPACE == null) {
|
||||
Target.HardCodedTarget target = (Target.HardCodedTarget) requestTemplate.feignTarget();
|
||||
String url = requestTemplate.feignTarget().url();
|
||||
// 如需修改微服务地址,建议通过外部化参数来调整
|
||||
url = url.replace("http://im-center:8080", imCenter);
|
||||
String profile = environment.getProperty("spring.profiles.active");
|
||||
if (Objects.equals(profile, "test") && url.contains("dev-app.axzo.cn")) {
|
||||
url = url.replace("dev-app", "test-api");
|
||||
}
|
||||
requestTemplate.target(url);
|
||||
Field field = ReflectUtil.getField(target.getClass(), "url");
|
||||
field.setAccessible(true);
|
||||
field.set(target, url);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnvironment(Environment environment) {
|
||||
this.environment = environment;
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,8 @@ package cn.axzo.msg.center;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import static cn.axzo.msg.center.MsgCenterConfig.IM_CENTER;
|
||||
|
||||
/**
|
||||
* @author cn
|
||||
* @version 1.0
|
||||
@ -10,6 +12,8 @@ import org.springframework.context.annotation.Configuration;
|
||||
* @date 2023/5/30 11:33
|
||||
*/
|
||||
@Configuration
|
||||
@EnableFeignClients
|
||||
@EnableFeignClients(basePackages = {IM_CENTER})
|
||||
public class MsgCenterConfig {
|
||||
|
||||
public static final String IM_CENTER = "cn.axzo.im.center.api.feign";
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user