Merge branch 'feature/REQ-1507' of https://axzsource.com/universal/infrastructure/backend/msg-center-plat into feature/REQ-1507
This commit is contained in:
commit
be3b796fd6
@ -44,7 +44,6 @@
|
||||
<dependency>
|
||||
<groupId>cn.axzo.msgcenter</groupId>
|
||||
<artifactId>msg-center-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
@ -114,6 +113,10 @@
|
||||
<groupId>cn.axzo.im.center</groupId>
|
||||
<artifactId>im-center-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.apollo</groupId>
|
||||
<artifactId>apollo-workspace-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@ -11,7 +11,7 @@ import cn.axzo.msg.center.im.domain.dto.IMSendMessageDTO;
|
||||
import cn.axzo.msg.center.im.domain.enums.IMChannelEnum;
|
||||
import cn.axzo.msg.center.im.domain.param.IMSendSingleMessageParam;
|
||||
import cn.axzo.msg.center.inside.notices.service.IYouMengMessageService;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.ButtonRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.azxo.framework.common.utils.StringUtils;
|
||||
@ -85,7 +85,7 @@ public class YouMengHandler implements IMChannelHandler {
|
||||
|
||||
private JSONObject buildMessageExt2(IMSendMessageDTO message) {
|
||||
final JSONObject extra = new JSONObject();
|
||||
Collection<MessageRouterDTO> messageRouters = message.getRouters();
|
||||
Collection<ButtonRouterDTO> messageRouters = message.getRouters();
|
||||
if (messageRouters.isEmpty()) {
|
||||
extra.put("ar", "");
|
||||
extra.put("ir", "");
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package cn.axzo.msg.center.im.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.ButtonRouterDTO;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -47,7 +47,7 @@ public class IMSendMessageDTO implements Serializable {
|
||||
/**
|
||||
* 消息路由列表
|
||||
*/
|
||||
private Collection<MessageRouterDTO> routers;
|
||||
private Collection<ButtonRouterDTO> routers;
|
||||
/**
|
||||
* 消息参数 key value
|
||||
*/
|
||||
|
||||
@ -2,6 +2,7 @@ package cn.axzo.msg.center.inside.notices.config;
|
||||
|
||||
import cn.axzo.msg.center.api.enums.MsgTempBizCategoryEnum;
|
||||
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyTypeRes;
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -15,6 +16,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -44,6 +46,8 @@ public class PendingMessageBizConfig {
|
||||
|
||||
private Map<MsgTempBizCategoryEnum, String> categoryJumpUrl;
|
||||
|
||||
private Map<AppTerminalTypeEnum, List<Long>> msgGroupConfig;
|
||||
|
||||
public List<MsgTempBizCategoryConfig> tempCategoriesConfig() {
|
||||
return Arrays.stream(MsgTempBizCategoryEnum.values())
|
||||
.filter(e -> category.containsKey(e))
|
||||
@ -59,6 +63,14 @@ public class PendingMessageBizConfig {
|
||||
categoryJumpUrl.get(category));
|
||||
}
|
||||
|
||||
public List<Long> fetchMessageGroupTreeNodeIds(AppTerminalTypeEnum appTerminalType) {
|
||||
if (Objects.isNull(appTerminalType)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// TODO: [cold_blade] [P2] 需要配置各个应用终端映射的业务中心分类的结点id
|
||||
return msgGroupConfig.getOrDefault(appTerminalType, Collections.emptyList());
|
||||
}
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
|
||||
@ -32,6 +32,10 @@ import cn.axzo.msg.center.inside.notices.service.MessageRecordService;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageRelationService;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageRouterService;
|
||||
import cn.axzo.msg.center.inside.notices.service.RawMessageRecordService;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
|
||||
import cn.axzo.msg.center.message.service.PendingMessageNewService;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -94,6 +98,8 @@ public class MessageCoreServiceImpl implements MessageCoreService {
|
||||
|
||||
@Resource
|
||||
private RawMessageRecordService rawMessageRecordService;
|
||||
@Resource
|
||||
private PendingMessageNewService pendingMessageNewService;
|
||||
|
||||
public MsgRouteTypeEnum getSystemType(String systemType) {
|
||||
/*String systemType = ContextInfoHolder.get().getSystemAndDeviceInfo().getSystemType();*/
|
||||
@ -323,8 +329,12 @@ public class MessageCoreServiceImpl implements MessageCoreService {
|
||||
List<MsgStateEnum> states = Lists.newArrayList(MsgStateEnum.HAS_BEEN_SENT, MsgStateEnum.RECEIVED);
|
||||
int generalCnt = rawMessageRecordService.countPersonMessage(request.getPersonId(), MsgTypeEnum.GENERAL_MESSAGE,
|
||||
null, null, states);
|
||||
int pendingCnt = rawMessageRecordService.countPersonMessage(request.getPersonId(), MsgTypeEnum.PENDING_MESSAGE,
|
||||
null, null, states);
|
||||
// 统计待办的数量
|
||||
MessageGroupNodeStatisticParam param = new MessageGroupNodeStatisticParam();
|
||||
param.setOperator(PersonDTO.builder().id(request.getPersonId()).build());
|
||||
param.setTerminalType(AppTerminalTypeEnum.CMS_WEB_PC);
|
||||
param.setWithIdentify(false);
|
||||
int pendingCnt = pendingMessageNewService.countUncompleted(param);
|
||||
return new MessageStatisticRes(generalCnt, pendingCnt);
|
||||
}
|
||||
|
||||
|
||||
@ -29,6 +29,7 @@ import cn.axzo.msg.center.inside.notices.service.MessageRelationService;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageRouterService;
|
||||
import cn.axzo.msg.center.inside.notices.service.PendingMessageService;
|
||||
import cn.axzo.msg.center.inside.notices.utils.MessageRecordHelper;
|
||||
import cn.axzo.msg.center.message.service.PendingMessageNewService;
|
||||
import cn.axzo.msg.center.notices.common.enums.ReturnCodeEnum;
|
||||
import cn.axzo.msg.center.notices.common.exception.BizException;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
@ -99,13 +100,12 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
private final MessageModuleService messageModuleService;
|
||||
private final MessageRelationService messageRelationService;
|
||||
private final PendingMessageBizConfig pendingMessageBizConfig;
|
||||
private final PendingMessageNewService pendingMessageNewService;
|
||||
|
||||
@Override
|
||||
public List<PendingMessageTemporarilyStatisticRes> temporarilyStatistic(PendingMessageTemporarilyStatisticReq request) {
|
||||
// 参数检测
|
||||
checkParam(request);
|
||||
// 获取数据冷热隔离的分界
|
||||
final LocalDateTime queryFrom = getQueryFromTime();
|
||||
final List<MsgTempBizCategoryConfig> categoryConfigs = pendingMessageBizConfig.tempCategoriesConfig();
|
||||
if (CollectionUtils.isEmpty(categoryConfigs)) {
|
||||
log.warn("the nacos config is lost......");
|
||||
@ -115,7 +115,7 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
return categoryConfigs.stream()
|
||||
// 自然排序,前端仅做渲染,展示顺序的工作由后端配置
|
||||
.sorted()
|
||||
.map(e -> statisticAndPickFirst(request, e, SPECIFY_IDENTIFIES, queryFrom))
|
||||
.map(e -> statistic(request, e))
|
||||
.collect(Collectors.toList());
|
||||
} catch (Exception e) {
|
||||
log.error("broke out some exception while statistic pending message.", e);
|
||||
@ -288,13 +288,10 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
return module;
|
||||
}
|
||||
|
||||
private PendingMessageTemporarilyStatisticRes statisticAndPickFirst(PendingMessageTemporarilyStatisticReq request,
|
||||
MsgTempBizCategoryConfig categoryConfig,
|
||||
Collection<ReceiveTypeEnum> identifyTypes,
|
||||
LocalDateTime begin) {
|
||||
Set<Long> relationIds = categoryConfig.getConfigRelationIds();
|
||||
private PendingMessageTemporarilyStatisticRes statistic(PendingMessageTemporarilyStatisticReq request,
|
||||
MsgTempBizCategoryConfig categoryConfig) {
|
||||
// 统计数量
|
||||
Integer count = doStatistic(request, relationIds, identifyTypes, begin);
|
||||
Integer count = pendingMessageNewService.countUncompleted(request.getPersonId(), categoryConfig.getConfigRelationIds());
|
||||
PendingMessageTemporarilyStatisticRes res = new PendingMessageTemporarilyStatisticRes();
|
||||
res.setUnCompletedCount(count);
|
||||
res.setCategoryCode(categoryConfig.getCategory().name());
|
||||
@ -303,24 +300,10 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
if (StringUtils.isNotBlank(categoryConfig.getJumpUrl())) {
|
||||
// 分类指定了具体的跳转地址,则优先使用其指定的地址,这里指定为原生APP
|
||||
res.setRouter(new MessageRouterInfoRes(NativeTypeEnum.H5.getMessage(), categoryConfig.getJumpUrl(), ""));
|
||||
} else if (1 == count) {
|
||||
// 这里仅统计已发送的待办
|
||||
MessageRecord record = selectOne(request.getPersonId(), request.getIdentifyId(), identifyTypes,
|
||||
relationIds, SEND_SUCCESSFULLY_STATES, begin);
|
||||
if (Objects.nonNull(record)) {
|
||||
res.setMessageId(record.getId());
|
||||
res.setRouter(getRouter(record, request.getSystemType()));
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
private Integer doStatistic(PendingMessageTemporarilyStatisticReq request, Collection<Long> relationIds,
|
||||
Collection<ReceiveTypeEnum> identifyTypes, LocalDateTime begin) {
|
||||
return doStatistic(request.getPersonId(), request.getIdentifyId(), relationIds, identifyTypes,
|
||||
SEND_SUCCESSFULLY_STATES, begin);
|
||||
}
|
||||
|
||||
private void checkParam(PendingMessageTemporarilyStatisticReq request) {
|
||||
if (Objects.isNull(request)
|
||||
|| Objects.isNull(request.getIdentifyId())) {
|
||||
@ -382,10 +365,6 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
.orElse(MsgTempBizCategoryEnum.PENDING_TASK);
|
||||
}
|
||||
|
||||
private MessageRouterInfoRes getRouter(MessageRecord msgRecord, String systemType) {
|
||||
return listRouters(Lists.newArrayList(msgRecord), systemType).get(msgRecord.getId());
|
||||
}
|
||||
|
||||
private Map<Long, MessageRouterInfoRes> listRouters(Collection<MessageRecord> msgRecords, String systemType) {
|
||||
final Set<Long> relationIds = msgRecords.stream().map(MessageRecord::getRelationId).collect(Collectors.toSet());
|
||||
Map<Long, List<MessageRouter>> rawRouterMap = messageRouterService.listRoutersByRelationIds(relationIds).stream()
|
||||
@ -482,24 +461,6 @@ public class PendingMessageServiceImpl implements PendingMessageService {
|
||||
return MsgRouteTypeEnum.WEB;
|
||||
}
|
||||
|
||||
private MessageRecord selectOne(Long personId, Long identifyId, Collection<ReceiveTypeEnum> identifyTypes,
|
||||
Collection<Long> relationIds, Collection<MsgStateEnum> states,
|
||||
LocalDateTime queryFrom) {
|
||||
List<MessageRecord> records = messageRecordDao.lambdaQuery()
|
||||
.eq(MessageRecord::getType, MsgTypeEnum.PENDING_MESSAGE)
|
||||
.eq(Objects.nonNull(personId), MessageRecord::getPersonId, personId)
|
||||
.eq(Objects.nonNull(identifyId), MessageRecord::getToId, identifyId)
|
||||
.in(CollectionUtils.isNotEmpty(identifyTypes), MessageRecord::getReceiveType, identifyTypes)
|
||||
.in(CollectionUtils.isNotEmpty(states), MessageRecord::getState, states)
|
||||
.in(CollectionUtils.isNotEmpty(relationIds), MessageRecord::getRelationId, relationIds)
|
||||
.ge(Objects.nonNull(queryFrom), MessageRecord::getCreateAt, queryFrom)
|
||||
.eq(MessageRecord::getIsDelete, YesNoEnum.NO.getCode())
|
||||
.orderByDesc(MessageRecord::getCreateAt)
|
||||
.last("LIMIT 1")
|
||||
.list();
|
||||
return CollectionUtils.isEmpty(records) ? null : records.get(0);
|
||||
}
|
||||
|
||||
private IPage<MessageRecord> page(Long personId, Long identifyId, Collection<ReceiveTypeEnum> identifyTypes,
|
||||
Collection<Long> relationIds, Collection<MsgStateEnum> states,
|
||||
LocalDateTime queryFrom, IPage<MessageRecord> page) {
|
||||
|
||||
@ -3,16 +3,25 @@ package cn.axzo.msg.center.message.controller;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeSaveOrUpdateParam;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.group.client.MessageGroupClient;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeAddRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeListRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeUpdateRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupQueryRequest;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupNodeBriefResponse;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupTreeNodeResponse;
|
||||
import cn.axzo.msg.center.utils.TreeHelperUtil;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import com.google.common.collect.Maps;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -47,10 +56,78 @@ public class MessageGroupController implements MessageGroupClient {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> list(MessageCategoryEnum category) {
|
||||
List<MessageGroupTreeNodeResponse> groupTreeNodes = messageGroupNodeService.listGroupTree(category).stream()
|
||||
.map(GroupTreeNodeDTO::toMessageGroupTreeNodeResponse)
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> list(MessageGroupQueryRequest request) {
|
||||
List<GroupTreeNodeDTO> trees = messageGroupNodeService.listGroupTree(request.getCategory());
|
||||
List<MessageGroupTreeNodeResponse> groupTreeNodes;
|
||||
if (StringUtils.isNotBlank(request.getNodeName())) {
|
||||
// 根据结点类型为分类类型的结点名称搜索时需要剪枝
|
||||
final Function<GroupTreeNodeDTO, Boolean> cutFunc = e ->
|
||||
TreeHelperUtil.containsMountTemplateChild(e, request.getNodeName());
|
||||
groupTreeNodes = trees.stream()
|
||||
.map(e -> convertCutTree(e, cutFunc))
|
||||
.filter(e -> CollectionUtils.isNotEmpty(e.getChildren()))
|
||||
.collect(Collectors.toList());
|
||||
} else {
|
||||
groupTreeNodes = trees.stream()
|
||||
.map(GroupTreeNodeDTO::toMessageGroupTreeNodeResponse)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return CommonResponse.success(groupTreeNodes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> listCutTree(MessageGroupQueryRequest request) {
|
||||
Function<GroupTreeNodeDTO, Boolean> cutFunc;
|
||||
if (StringUtils.isBlank(request.getNodeName())) {
|
||||
cutFunc = TreeHelperUtil::containsMountTemplateChild;
|
||||
} else {
|
||||
cutFunc = e -> TreeHelperUtil.containsMountTemplateChild(e, request.getNodeName());
|
||||
}
|
||||
List<MessageGroupTreeNodeResponse> groupTreeNodes = messageGroupNodeService
|
||||
.listGroupTree(request.getCategory()).stream()
|
||||
.map(e -> convertCutTree(e, cutFunc))
|
||||
.filter(e -> CollectionUtils.isNotEmpty(e.getChildren()))
|
||||
.collect(Collectors.toList());
|
||||
return CommonResponse.success(groupTreeNodes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupNodeBriefResponse>> listNodeBriefInfo(MessageGroupNodeListRequest request) {
|
||||
List<MessageGroupNodeBriefResponse> groupTreeNodes = messageGroupNodeService
|
||||
.listLeafNodes(request.getTerminalType(), request.getGroupCategory()).stream()
|
||||
.map(e -> new MessageGroupNodeBriefResponse(e.getNodeName(), e.getNodeCode()))
|
||||
.collect(Collectors.toList());
|
||||
return CommonResponse.success(groupTreeNodes);
|
||||
}
|
||||
|
||||
private MessageGroupTreeNodeResponse convertCutTree(GroupTreeNodeDTO srcRootNode,
|
||||
Function<GroupTreeNodeDTO, Boolean> cutFunc) {
|
||||
MessageGroupTreeNodeResponse tgtRootNode = convert(srcRootNode);
|
||||
if (CollectionUtils.isEmpty(srcRootNode.getNodeChildren())) {
|
||||
return tgtRootNode;
|
||||
}
|
||||
Map<GroupTreeNodeDTO, MessageGroupTreeNodeResponse> map = Maps.newHashMap();
|
||||
map.put(srcRootNode, tgtRootNode);
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>(srcRootNode.getNodeChildren());
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
if (cutFunc.apply(node)) {
|
||||
MessageGroupTreeNodeResponse child = convert(node);
|
||||
map.get(node.getParentNode()).addChild(child);
|
||||
map.put(node, child);
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
}
|
||||
return tgtRootNode;
|
||||
}
|
||||
|
||||
private MessageGroupTreeNodeResponse convert(GroupTreeNodeDTO node) {
|
||||
return MessageGroupTreeNodeResponse.builder()
|
||||
.category(node.getCategory())
|
||||
.nodeName(node.getNodeName())
|
||||
.nodeCode(node.getNodeCode())
|
||||
.nodeIcon(node.getNodeIcon())
|
||||
.parentNodeCode(node.getParentNodeCode())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
package cn.axzo.msg.center.message.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/17
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
public class PendingMessageDataInitController {
|
||||
|
||||
|
||||
}
|
||||
@ -1,17 +1,22 @@
|
||||
package cn.axzo.msg.center.message.controller;
|
||||
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
|
||||
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
|
||||
import cn.axzo.msg.center.message.service.PendingMessageNewService;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
|
||||
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.MessageGroupNodeResponse;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -35,20 +40,31 @@ public class PendingMessageNewController implements PendingMessageClient {
|
||||
private final PendingMessageNewService pendingMessageNewService;
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
|
||||
List<MessageGroupNodeStatisticDTO> groupNodes = pendingMessageNewService
|
||||
public CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(PendingMessageStatisticRequest request) {
|
||||
List<PendingMessageStatisticDTO> groupNodes = pendingMessageNewService
|
||||
.groupStatistic(MessageGroupNodeStatisticParam.from(request));
|
||||
return CommonResponse.success(groupNodes.stream()
|
||||
.map(MessageGroupNodeStatisticDTO::toResponse)
|
||||
.map(PendingMessageStatisticDTO::toResponse)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Integer> countUncompleted(PendingMessageCountUncompletedRequest request) {
|
||||
Integer count = pendingMessageNewService.countUncompleted(MessageGroupNodeStatisticParam.from(request));
|
||||
return CommonResponse.success(count);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Page<PendingMessageResponse>> pageQuery(PendingMessagePageRequest request) {
|
||||
return CommonResponse.success(pendingMessageNewService.pageQuery(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<PendingMessageResponse> query(PendingMessageQueryRequest request) {
|
||||
return CommonResponse.success(pendingMessageNewService.query(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<PendingMessageResponse> detail(String msgIdentityCode, TerminalTypeEnum terminalType) {
|
||||
PendingMessageDTO pendingMessage = pendingMessageNewService.detail(msgIdentityCode, terminalType)
|
||||
@ -56,21 +72,36 @@ public class PendingMessageNewController implements PendingMessageClient {
|
||||
if (Objects.isNull(pendingMessage)) {
|
||||
return CommonResponse.success();
|
||||
}
|
||||
return CommonResponse.success(pendingMessage.toResponse());
|
||||
return CommonResponse.success(pendingMessage.toResponse(terminalType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<String> push(PendingMessagePushRequest request) {
|
||||
public CommonResponse<List<PushPendingMessageDTO>> push(PendingMessagePushRequest request) {
|
||||
return CommonResponse.success(pendingMessageNewService.push(PendingMessagePushParam.from(request)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> complete(String msgIdentityCode) {
|
||||
return CommonResponse.success(pendingMessageNewService.complete(msgIdentityCode));
|
||||
public CommonResponse<Boolean> complete(String requestNo) {
|
||||
return CommonResponse.success(pendingMessageNewService.complete(requestNo));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> revoke(String msgIdentityCode) {
|
||||
return CommonResponse.success(pendingMessageNewService.revoke(msgIdentityCode));
|
||||
public CommonResponse<Boolean> completeById(CompletePendingMessageByIdRequest param) {
|
||||
return CommonResponse.success(pendingMessageNewService.completeById(param));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> revoke(String requestNo) {
|
||||
return CommonResponse.success(pendingMessageNewService.revoke(requestNo));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> completeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
return CommonResponse.success(pendingMessageNewService.completeByTemplateCodeBizCode(param));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> revokeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
return CommonResponse.success(pendingMessageNewService.revokeByTemplateCodeBizCode(param));
|
||||
}
|
||||
}
|
||||
|
||||
@ -32,6 +32,10 @@ public class GroupTreeNodePathDTO implements Serializable {
|
||||
* 结点编码
|
||||
*/
|
||||
private String nodeCode;
|
||||
/**
|
||||
* 结点名称
|
||||
*/
|
||||
private String nodeName;
|
||||
/**
|
||||
* 结点名称格式的路径
|
||||
*/
|
||||
@ -50,10 +54,10 @@ public class GroupTreeNodePathDTO implements Serializable {
|
||||
return nodeCodes[nodeCodes.length - 1];
|
||||
}
|
||||
|
||||
public static GroupTreeNodePathDTO of(String nodeCode, Collection<GroupTreeNodeDTO> nodes) {
|
||||
public static GroupTreeNodePathDTO of(GroupTreeNodeDTO node, Collection<GroupTreeNodeDTO> nodes) {
|
||||
String nodeNamePath = formatPath(GroupTreeNodeDTO::getNodeName, nodes, NODE_NAME_PATH_SPLITER);
|
||||
String nodeCodePath = formatPath(GroupTreeNodeDTO::getNodeCode, nodes, NODE_CODE_PATH_SPLITER);
|
||||
return new GroupTreeNodePathDTO(nodeCode, nodeNamePath, nodeCodePath);
|
||||
return new GroupTreeNodePathDTO(node.getNodeCode(), node.getNodeName(), nodeNamePath, nodeCodePath);
|
||||
}
|
||||
|
||||
private static String formatPath(Function<GroupTreeNodeDTO, String> pathFunc, Collection<GroupTreeNodeDTO> nodes,
|
||||
|
||||
@ -1,81 +0,0 @@
|
||||
package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.basics.common.model.IBaseTree;
|
||||
import cn.axzo.core.utils.converter.BeanConverter;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.pending.response.MessageGroupNodeResponse;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息分类结点DTO
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/9/26
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageGroupNodeStatisticDTO implements IBaseTree<MessageGroupNodeStatisticDTO, String>, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5171436359992401120L;
|
||||
|
||||
/**
|
||||
* 树结点
|
||||
*/
|
||||
private GroupTreeNodeDTO treeNode;
|
||||
/**
|
||||
* 子节点列表
|
||||
*/
|
||||
private List<MessageGroupNodeStatisticDTO> nodeChildren;
|
||||
/**
|
||||
* 结点对应的代办数量
|
||||
*/
|
||||
private Integer pendingCount;
|
||||
|
||||
public static MessageGroupNodeStatisticDTO of(GroupTreeNodeDTO groupNode) {
|
||||
return MessageGroupNodeStatisticDTO.builder()
|
||||
.treeNode(groupNode)
|
||||
.build();
|
||||
}
|
||||
|
||||
public MessageGroupNodeResponse toResponse() {
|
||||
MessageGroupNodeResponse response = new MessageGroupNodeResponse();
|
||||
response.setCategory(treeNode.getCategory());
|
||||
response.setNodeCode(treeNode.getNodeCode());
|
||||
response.setNodeName(treeNode.getNodeName());
|
||||
response.setParentNodeCode(treeNode.getParentNodeCode());
|
||||
response.setPendingCount(this.pendingCount);
|
||||
List<MessageGroupNodeResponse> children = this.nodeChildren.stream()
|
||||
.map(MessageGroupNodeStatisticDTO::toResponse).collect(Collectors.toList());
|
||||
response.setNodeChildren(children);
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNodeCode() {
|
||||
return treeNode.getNodeCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParentNodeCode() {
|
||||
return treeNode.getParentNodeCode();
|
||||
}
|
||||
}
|
||||
@ -11,13 +11,9 @@ import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -66,7 +62,7 @@ public class MessageTemplateDTO implements Serializable {
|
||||
/**
|
||||
* 模板路由信息
|
||||
*/
|
||||
private List<RawMessageRouterDTO> routers;
|
||||
private MessageTemplateRouterDTO msgTemplateRouter;
|
||||
/**
|
||||
* 推送终端
|
||||
*/
|
||||
@ -76,7 +72,8 @@ public class MessageTemplateDTO implements Serializable {
|
||||
*/
|
||||
private String minAppVersion;
|
||||
|
||||
public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, List<RawMessageRouterDTO> routers) {
|
||||
public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
// 业务详情展示策略
|
||||
return MessageTemplateDTO.builder()
|
||||
.name(baseTemplate.getName())
|
||||
.code(baseTemplate.getCode())
|
||||
@ -85,21 +82,12 @@ public class MessageTemplateDTO implements Serializable {
|
||||
.msgCardContentItems(JSONObjectUtil.parseArray(baseTemplate.getCardContent(), MessageCardContentItemDTO.class))
|
||||
.msgCategory(baseTemplate.getMsgCategory())
|
||||
.icon(baseTemplate.getIcon())
|
||||
.routers(routers)
|
||||
.msgTemplateRouter(msgTemplateRouter)
|
||||
.pushTerminals(JSON.parseArray(baseTemplate.getPushTerminal(), PushTerminalEnum.class))
|
||||
.minAppVersion(baseTemplate.getMinAppVersion())
|
||||
.build();
|
||||
}
|
||||
|
||||
public Map<String, String> toCardContentMap() {
|
||||
if (CollectionUtils.isEmpty(msgCardContentItems)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Map<String, String> map = new HashMap<>();
|
||||
msgCardContentItems.forEach(e -> map.put(e.getLabel(), e.getValue()));
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
|
||||
@ -0,0 +1,334 @@
|
||||
package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteButton;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteDetail;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouterConfig;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/8
|
||||
* @version 1.0
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageTemplateRouterDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -4230859886203498149L;
|
||||
|
||||
/**
|
||||
* 业务详情路由
|
||||
*/
|
||||
private MessageRouteDetailDTO routeDetail;
|
||||
/**
|
||||
* 按钮路由列表
|
||||
*/
|
||||
private List<MessageRouteButtonDTO> routeButtons;
|
||||
|
||||
public boolean isValid() {
|
||||
return Objects.nonNull(routeDetail)
|
||||
|| CollectionUtils.isNotEmpty(routeButtons);
|
||||
}
|
||||
|
||||
public boolean isInValid() {
|
||||
return !isValid();
|
||||
}
|
||||
|
||||
public Optional<String> fetchTemplateCode() {
|
||||
if (Objects.nonNull(routeDetail)) {
|
||||
return Optional.ofNullable(routeDetail.getTemplateCode());
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(routeButtons)) {
|
||||
return Optional.ofNullable(routeButtons.get(0).getTemplateCode());
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class MessageRouteDetailDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6332526731908737802L;
|
||||
|
||||
/**
|
||||
* 显示名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 模板code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 业务详情展示策略
|
||||
*/
|
||||
private BizDetailShowStrategyEnum showStrategy;
|
||||
/**
|
||||
* 跳转路由的配置列表
|
||||
*/
|
||||
private List<MessageRouterConfigDTO> routerConfigs;
|
||||
|
||||
public static MessageRouteDetailDTO from(MessageRouteDetail msgRouteDetail,
|
||||
List<MessageRouterConfig> routerConfigs) {
|
||||
AssertUtil.notNull(msgRouteDetail, "msgRouteDetail can not be null");
|
||||
AssertUtil.notEmpty(routerConfigs, "routerConfigs can not be empty");
|
||||
|
||||
return MessageRouteDetailDTO.builder()
|
||||
.name(msgRouteDetail.getName())
|
||||
.templateCode(msgRouteDetail.getTemplateCode())
|
||||
.showStrategy(msgRouteDetail.getShowStrategy())
|
||||
.routerConfigs(routerConfigs.stream().map(MessageRouterConfigDTO::from).collect(Collectors.toList()))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static MessageRouteDetailDTO from(MessageDetailRouteStrategyDTO bizDetailShowStrategy, String templateCode) {
|
||||
AssertUtil.notNull(bizDetailShowStrategy, "btnRouter can not be null");
|
||||
AssertUtil.notEmpty(templateCode, "templateCode can not be empty");
|
||||
|
||||
List<MessageRouterConfigDTO> configs = bizDetailShowStrategy.getTerminals().stream()
|
||||
.map(e -> MessageRouterConfigDTO.builder().url(e.getUrl()).terminalType(e.getTerminalType()).build())
|
||||
.collect(Collectors.toList());
|
||||
return MessageRouteDetailDTO.builder()
|
||||
.name(MessageRouterUtil.DETAIL_ROUTER_DESC)
|
||||
.templateCode(templateCode)
|
||||
.showStrategy(bizDetailShowStrategy.getShowStrategy())
|
||||
.routerConfigs(configs)
|
||||
.build();
|
||||
}
|
||||
|
||||
public MessageRouteDetail fetchMessageRouteDetail() {
|
||||
return MessageRouteDetail.builder()
|
||||
.name(this.name)
|
||||
.showStrategy(this.showStrategy)
|
||||
.templateCode(this.templateCode)
|
||||
.build();
|
||||
}
|
||||
|
||||
public List<MessageRouterConfig> fetchMessageRouterConfigs() {
|
||||
return CollectionUtils.isEmpty(this.routerConfigs) ? Collections.emptyList() :
|
||||
this.routerConfigs.stream()
|
||||
.map(e -> e.fetchMessageRouterConfig(this.templateCode))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public MessageDetailRouteStrategyDTO toBizDetailShowStrategyDTO() {
|
||||
List<MessageRouterTerminalDTO> terminals = this.routerConfigs.stream()
|
||||
.map(e -> MessageRouterTerminalDTO.builder().terminalType(e.terminalType).url(e.url).build())
|
||||
.collect(Collectors.toList());
|
||||
return MessageDetailRouteStrategyDTO.builder().showStrategy(this.showStrategy).terminals(terminals).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class MessageRouteButtonDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -7544674409859277745L;
|
||||
|
||||
/**
|
||||
* 按钮名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 按钮唯一标识
|
||||
*/
|
||||
private String btnCode;
|
||||
/**
|
||||
* 模板code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 按钮来源
|
||||
*/
|
||||
private RouterButtonSourceEnum source;
|
||||
/**
|
||||
* 路由类型
|
||||
*/
|
||||
private RouterCategoryEnum category;
|
||||
/**
|
||||
* API地址,仅当按钮是接口调用类型时有值
|
||||
*/
|
||||
private String apiUrl;
|
||||
/**
|
||||
* 跳转路由的配置列表
|
||||
*/
|
||||
private List<MessageRouterConfigDTO> routerConfigs;
|
||||
/**
|
||||
* 按钮style配置
|
||||
*/
|
||||
private JSONArray style;
|
||||
/**
|
||||
* 按钮优先级,数值越大优先级越低
|
||||
*/
|
||||
private Integer priority;
|
||||
|
||||
public static MessageRouteButtonDTO from(MessageRouteButton routeButton,
|
||||
List<MessageRouterConfig> routerConfigs) {
|
||||
AssertUtil.notNull(routeButton, "msgRouteDetail can not be null");
|
||||
|
||||
List<MessageRouterConfigDTO> configs = CollectionUtils.isEmpty(routerConfigs) ? Collections.emptyList() :
|
||||
routerConfigs.stream().map(MessageRouterConfigDTO::from).collect(Collectors.toList());
|
||||
return MessageRouteButtonDTO.builder()
|
||||
.name(routeButton.getName())
|
||||
.btnCode(routeButton.getBtnCode())
|
||||
.templateCode(routeButton.getTemplateCode())
|
||||
.source(routeButton.getSource())
|
||||
.category(routeButton.getCategory())
|
||||
.apiUrl(routeButton.getApiUrl())
|
||||
.style(routeButton.getStyle())
|
||||
.priority(routeButton.getPriority())
|
||||
.routerConfigs(configs)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static MessageRouteButtonDTO from(MessageButtonRouteStrategyDTO btnRouter, String templateCode) {
|
||||
AssertUtil.notNull(btnRouter, "btnRouter can not be null");
|
||||
AssertUtil.notEmpty(templateCode, "templateCode can not be empty");
|
||||
|
||||
JSONArray style = CollectionUtils.isEmpty(btnRouter.getStyle()) ? null
|
||||
: JSON.parseArray(JSON.toJSONString(btnRouter.getStyle()));
|
||||
List<MessageRouterConfigDTO> routerConfigs = CollectionUtils.isEmpty(btnRouter.getTerminals()) ? null :
|
||||
btnRouter.getTerminals().stream()
|
||||
.map(e -> MessageRouterConfigDTO.builder().url(e.getUrl()).terminalType(e.getTerminalType()).build())
|
||||
.collect(Collectors.toList());
|
||||
return MessageRouteButtonDTO.builder()
|
||||
.name(btnRouter.getDesc())
|
||||
.btnCode(btnRouter.getIdentityCode())
|
||||
.templateCode(templateCode)
|
||||
.source(btnRouter.getSource())
|
||||
.category(btnRouter.getCategory())
|
||||
.apiUrl(btnRouter.getApiUrl())
|
||||
.routerConfigs(routerConfigs)
|
||||
.style(style)
|
||||
.build();
|
||||
}
|
||||
|
||||
public MessageRouteButton fetchMessageRouteButton() {
|
||||
return MessageRouteButton.builder()
|
||||
.name(this.name)
|
||||
.btnCode(this.btnCode)
|
||||
.templateCode(this.templateCode)
|
||||
.source(this.source)
|
||||
.category(this.category)
|
||||
.apiUrl(this.apiUrl)
|
||||
.style(this.style)
|
||||
.build();
|
||||
}
|
||||
|
||||
public List<MessageRouterConfig> fetchMessageRouterConfigs(String routerCode) {
|
||||
return CollectionUtils.isEmpty(this.routerConfigs) ? Collections.emptyList() :
|
||||
this.routerConfigs.stream()
|
||||
.map(e -> e.fetchMessageRouterConfig(routerCode))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
if (RouterCategoryEnum.ACTION.equals(this.category)) {
|
||||
return StringUtils.isNotBlank(apiUrl);
|
||||
}
|
||||
return CollectionUtils.isNotEmpty(routerConfigs);
|
||||
}
|
||||
|
||||
public MessageButtonRouteStrategyDTO toMessageRouterButton() {
|
||||
List<MessageRouterTerminalDTO> terminals = CollectionUtils.isEmpty(this.routerConfigs) ?
|
||||
Collections.emptyList() : this.routerConfigs.stream()
|
||||
.map(e -> MessageRouterTerminalDTO.builder().terminalType(e.terminalType).url(e.url).build())
|
||||
.collect(Collectors.toList());
|
||||
return MessageButtonRouteStrategyDTO.builder()
|
||||
.desc(this.name)
|
||||
.category(this.category)
|
||||
.identityCode(this.btnCode)
|
||||
.source(this.source)
|
||||
.style(MessageRouterUtil.parseButtonStyle(this.style))
|
||||
.apiUrl(this.apiUrl)
|
||||
.terminals(terminals)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class MessageRouterConfigDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -303015602477458085L;
|
||||
|
||||
/**
|
||||
* 路由编码
|
||||
*/
|
||||
private String routerCode;
|
||||
/**
|
||||
* 路由的系统类型
|
||||
*/
|
||||
private TerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 路由地址
|
||||
*/
|
||||
private String url;
|
||||
|
||||
static MessageRouterConfigDTO from(MessageRouterConfig config) {
|
||||
return MessageRouterConfigDTO.builder()
|
||||
.routerCode(config.getRouterCode())
|
||||
.terminalType(config.getTerminalType())
|
||||
.url(config.getUrl())
|
||||
.build();
|
||||
}
|
||||
|
||||
MessageRouterConfig fetchMessageRouterConfig(String routerCode) {
|
||||
return MessageRouterConfig.builder()
|
||||
.routerCode(routerCode)
|
||||
.terminalType(this.terminalType)
|
||||
.url(this.url)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,11 +2,13 @@ package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.PendingMessageRecord;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.utils.DateFormatUtil;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -48,9 +50,9 @@ public class PendingMessageDTO implements Serializable {
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 卡片信息的JSON字符串
|
||||
* 卡片信息
|
||||
*/
|
||||
private String cardContent;
|
||||
private List<MessageCardContentItemDTO> cardItems;
|
||||
/**
|
||||
* 代办发起者信息
|
||||
*/
|
||||
@ -71,10 +73,30 @@ public class PendingMessageDTO implements Serializable {
|
||||
* 业务状态描述
|
||||
*/
|
||||
private String bizDesc;
|
||||
/**
|
||||
* 业务标签
|
||||
*/
|
||||
private String bizFlag;
|
||||
/**
|
||||
* 工作台id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
/**
|
||||
* 工作台名称
|
||||
*/
|
||||
private String workspaceName;
|
||||
/**
|
||||
* 待办发起人的
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 业务类型
|
||||
*/
|
||||
private BizCategoryEnum bizCategory;
|
||||
/**
|
||||
* 待办截至时间
|
||||
*/
|
||||
private LocalDateTime deadline;
|
||||
/**
|
||||
* 申请时间戳
|
||||
*/
|
||||
@ -86,11 +108,11 @@ public class PendingMessageDTO implements Serializable {
|
||||
/**
|
||||
* 路由信息,可为空
|
||||
*/
|
||||
private List<MessageRouterDTO> routers;
|
||||
private MessageTemplateRouterDTO msgTemplateRouter;
|
||||
/**
|
||||
* 参数及其对应的值的JSON串
|
||||
* 业务终态的印章图片地址
|
||||
*/
|
||||
private String routerParams;
|
||||
private String bizFinalStateIcon;
|
||||
|
||||
public static PendingMessageDTO from(PendingMessageRecord pendingMessageRecord) {
|
||||
// 代办发起者信息
|
||||
@ -100,6 +122,7 @@ public class PendingMessageDTO implements Serializable {
|
||||
.id(pendingMessageRecord.getPromoterId())
|
||||
.type(pendingMessageRecord.getPromoterType())
|
||||
.build())
|
||||
.name(pendingMessageRecord.getPromoterName())
|
||||
.build();
|
||||
// 代办执行者信息
|
||||
PersonDTO executor = PersonDTO.builder()
|
||||
@ -108,6 +131,7 @@ public class PendingMessageDTO implements Serializable {
|
||||
.id(pendingMessageRecord.getExecutorId())
|
||||
.type(pendingMessageRecord.getExecutorType())
|
||||
.build())
|
||||
.name(pendingMessageRecord.getExecutorName())
|
||||
.build();
|
||||
return PendingMessageDTO.builder()
|
||||
.identityCode(pendingMessageRecord.getIdentityCode())
|
||||
@ -118,32 +142,43 @@ public class PendingMessageDTO implements Serializable {
|
||||
.bizCode(pendingMessageRecord.getBizCode())
|
||||
.subBizCode(pendingMessageRecord.getSubBizCode())
|
||||
.bizDesc(pendingMessageRecord.getBizDesc())
|
||||
.bizFlag(pendingMessageRecord.getBizFlag())
|
||||
.workspaceId(pendingMessageRecord.getOrgId())
|
||||
.workspaceName(pendingMessageRecord.getOrgName())
|
||||
.ouId(pendingMessageRecord.getOuId())
|
||||
.bizCategory(pendingMessageRecord.getBizCategory())
|
||||
.deadline(DateFormatUtil.toLocalDateTime(pendingMessageRecord.getDeadline()))
|
||||
.createTime(DateFormatUtil.toLocalDateTime(pendingMessageRecord.getCreateAt()))
|
||||
.updateTime(DateFormatUtil.toLocalDateTime(pendingMessageRecord.getUpdateAt()))
|
||||
.routerParams(pendingMessageRecord.getRouterParams())
|
||||
.build();
|
||||
}
|
||||
|
||||
public PendingMessageResponse toResponse() {
|
||||
public PendingMessageResponse toResponse(TerminalTypeEnum terminalType) {
|
||||
return PendingMessageResponse.builder()
|
||||
.identityCode(this.identityCode)
|
||||
.title(this.title)
|
||||
.content(this.content)
|
||||
.cardContent(this.cardContent)
|
||||
.cardItems(this.cardItems)
|
||||
.promoterPersonId(Optional.ofNullable(this.promoter).map(PersonDTO::getId).orElse(null))
|
||||
.promoterName(Optional.ofNullable(this.promoter).map(PersonDTO::getName).orElse(null))
|
||||
.promoterIdentity(Optional.ofNullable(this.promoter).map(PersonDTO::getIdentity).orElse(null))
|
||||
.executorPersonId(Optional.ofNullable(this.executor).map(PersonDTO::getId).orElse(null))
|
||||
.executorName(Optional.ofNullable(this.executor).map(PersonDTO::getName).orElse(null))
|
||||
.executorIdentity(Optional.ofNullable(this.executor).map(PersonDTO::getIdentity).orElse(null))
|
||||
.bizCode(this.bizCode)
|
||||
.subBizCode(this.subBizCode)
|
||||
.bizDesc(this.bizDesc)
|
||||
.bizFlag(this.bizFlag)
|
||||
.bizCategory(this.bizCategory)
|
||||
.workspaceId(this.workspaceId)
|
||||
.workspaceName(this.workspaceName)
|
||||
.ouId(this.ouId)
|
||||
.createTimestamp(DateFormatUtil.toTimestamp(this.createTime))
|
||||
.updateTimestamp(DateFormatUtil.toTimestamp(this.updateTime))
|
||||
.routers(this.routers)
|
||||
.routerParams(this.routerParams)
|
||||
.bizExtParams("{}")
|
||||
.deadlineTimestamp(DateFormatUtil.toTimestamp(this.deadline))
|
||||
.detailRouter(MessageRouterUtil.fetchBizDetailRouter(this.msgTemplateRouter, terminalType).orElse(null))
|
||||
.buttonRouters(MessageRouterUtil.fetchMessageRouterButtons(this.msgTemplateRouter, terminalType))
|
||||
.bizFinalStateIcon(this.bizFinalStateIcon)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息分类结点DTO
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/9/26
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PendingMessageStatisticDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5171436359992401120L;
|
||||
|
||||
/**
|
||||
* 叶结点编码
|
||||
*/
|
||||
private String leafNodeCode;
|
||||
/**
|
||||
* 叶节点名称
|
||||
*/
|
||||
private String leafNodeName;
|
||||
/**
|
||||
* 结点对应的代办数量
|
||||
*/
|
||||
private Integer pendingCount;
|
||||
|
||||
public static PendingMessageStatisticDTO of(GroupTreeNodePathDTO groupNode) {
|
||||
return PendingMessageStatisticDTO.builder()
|
||||
.leafNodeName(groupNode.getNodeName())
|
||||
.leafNodeCode(groupNode.getNodeCode())
|
||||
.build();
|
||||
}
|
||||
|
||||
public PendingMessageStatisticResponse toResponse() {
|
||||
PendingMessageStatisticResponse response = new PendingMessageStatisticResponse();
|
||||
response.setGroupCode(this.leafNodeCode);
|
||||
response.setGroupName(this.leafNodeName);
|
||||
response.setPendingCount(this.pendingCount);
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -1,144 +0,0 @@
|
||||
package cn.axzo.msg.center.message.domain.dto;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.MessageTemplateRouter;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO;
|
||||
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 cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/9/28
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class RawMessageRouterDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -3751613307785030747L;
|
||||
|
||||
/**
|
||||
* 路由描述
|
||||
*/
|
||||
private String desc;
|
||||
/**
|
||||
* 路由分类
|
||||
* JUMP: 直接跳转
|
||||
* ACTION: 接口调用
|
||||
*/
|
||||
private RouterCategoryEnum category;
|
||||
/**
|
||||
* 路由终端
|
||||
*/
|
||||
private List<MessageRouterTerminalDTO> terminals;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 按钮样式配置
|
||||
*/
|
||||
private List<ButtonStyleEnum> style;
|
||||
|
||||
public static RawMessageRouterDTO from(List<MessageTemplateRouter> msgTemplateRouters) {
|
||||
MessageTemplateRouter router = msgTemplateRouters.get(0);
|
||||
List<MessageRouterTerminalDTO> terminals = msgTemplateRouters.stream()
|
||||
.map(RawMessageRouterDTO::convert2Terminal)
|
||||
.collect(Collectors.toList());
|
||||
return RawMessageRouterDTO.builder()
|
||||
.desc(router.getName())
|
||||
.category(router.getCategory())
|
||||
.templateCode(router.getTemplateCode())
|
||||
.style(MessageRouterUtil.parseButtonStyle(router.getStyle()))
|
||||
.terminals(terminals)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static RawMessageRouterDTO from(MessageRouterButtonDTO router, String templateCode) {
|
||||
return RawMessageRouterDTO.builder()
|
||||
.desc(router.getDesc())
|
||||
.category(router.getCategory())
|
||||
.terminals(router.getTerminals())
|
||||
.style(router.getStyle())
|
||||
.templateCode(templateCode)
|
||||
.build();
|
||||
}
|
||||
|
||||
public MessageRouterButtonDTO toMessageRouterButton() {
|
||||
return MessageRouterButtonDTO.builder()
|
||||
.desc(this.desc)
|
||||
.category(this.category)
|
||||
.terminals(this.terminals)
|
||||
.style(this.style)
|
||||
.build();
|
||||
}
|
||||
|
||||
public List<MessageTemplateRouter> toMessageTemplateRouters() {
|
||||
return this.terminals.stream()
|
||||
.map(this::convert)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public MessageRouterDTO toMessageRouter(TerminalTypeEnum terminalType) {
|
||||
MessageRouterTerminalDTO terminal = MessageRouterUtil.select(this, terminalType);
|
||||
return MessageRouterDTO.builder()
|
||||
.desc(this.desc)
|
||||
.category(this.category)
|
||||
.style(this.style)
|
||||
.terminalType(terminal.getTerminalType())
|
||||
.url(terminal.getUrl())
|
||||
.build();
|
||||
}
|
||||
|
||||
private MessageTemplateRouter convert(MessageRouterTerminalDTO terminal) {
|
||||
MessageTemplateRouter router = new MessageTemplateRouter();
|
||||
router.setName(desc);
|
||||
router.setCategory(category);
|
||||
router.setTemplateCode(templateCode);
|
||||
router.setStyle(JSON.toJSONString(style));
|
||||
router.setUrl(terminal.getUrl());
|
||||
router.setTerminalType(terminal.getTerminalType());
|
||||
return router;
|
||||
}
|
||||
|
||||
private static MessageRouterTerminalDTO convert2Terminal(MessageTemplateRouter router) {
|
||||
return MessageRouterTerminalDTO.builder()
|
||||
.url(router.getUrl())
|
||||
.terminalType(router.getTerminalType())
|
||||
.build();
|
||||
}
|
||||
|
||||
public RawMessageRouterDTO deepClone() {
|
||||
return RawMessageRouterDTO.builder()
|
||||
.desc(this.desc)
|
||||
.category(this.category)
|
||||
.terminals(this.terminals.stream().map(MessageRouterTerminalDTO::deepClone).collect(Collectors.toList()))
|
||||
.templateCode(this.templateCode)
|
||||
.style(Lists.newArrayList(this.getStyle()))
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -3,9 +3,9 @@ package cn.axzo.msg.center.message.domain.param;
|
||||
import cn.axzo.core.utils.converter.BeanConverter;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@ -31,36 +31,35 @@ public class MessageGroupNodeStatisticParam implements Serializable {
|
||||
*/
|
||||
private PersonDTO operator;
|
||||
/**
|
||||
* 业务方是否只关注特定身份的消息
|
||||
* true: 是
|
||||
* false: 否
|
||||
* 应用终端类型
|
||||
*/
|
||||
private Boolean withIdentify;
|
||||
private AppTerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 消息的分类结点编码集合
|
||||
*/
|
||||
private Collection<String> groupNodeCodes;
|
||||
/**
|
||||
* 代办角色
|
||||
* PROMOTER: 发起者
|
||||
* EXECUTOR: 执行者
|
||||
* 业务方是否只关注特定身份的消息
|
||||
* true: 是
|
||||
* false: 否
|
||||
*/
|
||||
private PendingMessageRoleCategoryEnum roleCategory;
|
||||
/**
|
||||
* 代办消息状态
|
||||
* UNSENT: 未发送
|
||||
* HAS_BEEN_SENT: 已发送
|
||||
* COMPLETED: 已办
|
||||
* RETRACT: 已撤回
|
||||
* DELETED: 已删除
|
||||
*/
|
||||
private PendingMessageStateEnum msgState;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
private Boolean withIdentify;
|
||||
|
||||
public static MessageGroupNodeStatisticParam from(MessageGroupNodeStatisticRequest request) {
|
||||
public static MessageGroupNodeStatisticParam from(PendingMessageStatisticRequest request) {
|
||||
MessageGroupNodeStatisticParam param = BeanConverter.convert(request, MessageGroupNodeStatisticParam.class);
|
||||
IdentityDTO identity = IdentityDTO.builder()
|
||||
.id(request.getIdentityId())
|
||||
.type(request.getIdentityType())
|
||||
.build();
|
||||
PersonDTO person = PersonDTO.builder()
|
||||
.id(request.getPersonId())
|
||||
.identity(identity)
|
||||
.build();
|
||||
param.setOperator(person);
|
||||
return param;
|
||||
}
|
||||
|
||||
public static MessageGroupNodeStatisticParam from(PendingMessageCountUncompletedRequest request) {
|
||||
MessageGroupNodeStatisticParam param = BeanConverter.convert(request, MessageGroupNodeStatisticParam.class);
|
||||
IdentityDTO identity = IdentityDTO.builder()
|
||||
.id(request.getIdentityId())
|
||||
|
||||
@ -1,11 +1,14 @@
|
||||
package cn.axzo.msg.center.message.domain.param;
|
||||
|
||||
import cn.axzo.msg.center.common.exception.ServiceException;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import cn.axzo.msg.center.service.template.request.MessageTemplateCreateRequest;
|
||||
import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateRequest;
|
||||
import cn.axzo.msg.center.utils.MessageTemplateCategoryUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -32,67 +35,81 @@ public class MessageTemplateSaveOrUpdateParam implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 6657624182580261353L;
|
||||
|
||||
/**
|
||||
* 模板名称
|
||||
*/
|
||||
private String templateName;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 消息分类树的叶结点的结点编码列表
|
||||
*/
|
||||
private List<String> leafGroupNodes;
|
||||
/**
|
||||
* 所属消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
*/
|
||||
private MessageCategoryEnum msgCategory;
|
||||
/**
|
||||
* 模板标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 模板类容
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 消息卡片信息标签列表
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 模板icon
|
||||
*/
|
||||
private String icon;
|
||||
/**
|
||||
* 操作者自然人id
|
||||
* 操作者的自然人id
|
||||
*/
|
||||
private Long operatorId;
|
||||
/**
|
||||
* 路由列表
|
||||
* 模板名称
|
||||
*/
|
||||
private List<MessageRouterButtonDTO> routers;
|
||||
private String templateName;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 通知
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum msgCategory;
|
||||
/**
|
||||
* 消息分类树的叶结点的结点编码列表
|
||||
*/
|
||||
private List<String> leafGroupNodes;
|
||||
/**
|
||||
* 推送终端配置
|
||||
* B_ENTERPRISE_APP: B-安心筑企业版
|
||||
* C_WORKER_APP: C-安心筑工人版
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
/**
|
||||
* 该模板最低支持的APP版本号
|
||||
*/
|
||||
private String minAppVersion;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String content;
|
||||
/**
|
||||
* 消息图标
|
||||
*/
|
||||
private String icon;
|
||||
/**
|
||||
* 消息卡片信息标签列表,可为空
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 业务详情展示策略
|
||||
*/
|
||||
private MessageDetailRouteStrategyDTO bizDetailShowStrategy;
|
||||
/**
|
||||
* 路由策略列表
|
||||
*/
|
||||
private List<MessageButtonRouteStrategyDTO> routers;
|
||||
|
||||
public static MessageTemplateSaveOrUpdateParam from(MessageTemplateCreateRequest request) {
|
||||
MessageCategoryEnum category = MessageTemplateCategoryUtil
|
||||
.checkAndReturnSubCategory(request.getCategory(), request.getSubCategory())
|
||||
.orElseThrow(() -> new ServiceException("无效的参数"));
|
||||
return MessageTemplateSaveOrUpdateParam.builder()
|
||||
.templateName(request.getTemplateName())
|
||||
.msgCategory(request.getCategory())
|
||||
.msgCategory(category)
|
||||
.leafGroupNodes(request.getLeafGroupNodes())
|
||||
.title(request.getMsgTitle())
|
||||
.content(request.getMsgContent())
|
||||
.msgCardContentItems(request.getMsgCardContentItems())
|
||||
.icon(request.getMsgIcon())
|
||||
.minAppVersion(request.getMinAppVersion())
|
||||
.operatorId(request.getOperatorId())
|
||||
.routers(request.getRouters())
|
||||
.pushTerminals(request.getPushTerminals())
|
||||
.bizDetailShowStrategy(request.getDetailStrategy())
|
||||
.build();
|
||||
}
|
||||
|
||||
@ -104,10 +121,12 @@ public class MessageTemplateSaveOrUpdateParam implements Serializable {
|
||||
.title(request.getMsgTitle())
|
||||
.content(request.getMsgContent())
|
||||
.msgCardContentItems(request.getMsgCardContentItems())
|
||||
.minAppVersion(request.getMinAppVersion())
|
||||
.icon(request.getMsgIcon())
|
||||
.operatorId(request.getOperatorId())
|
||||
.routers(request.getRouters())
|
||||
.pushTerminals(request.getPushTerminals())
|
||||
.bizDetailShowStrategy(request.getDetailStrategy())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.msg.center.message.domain.param;
|
||||
import cn.axzo.core.utils.converter.BeanConverter;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -13,6 +14,8 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -36,7 +39,7 @@ public class PendingMessagePushParam implements Serializable {
|
||||
/**
|
||||
* 执行者
|
||||
*/
|
||||
private PersonDTO executor;
|
||||
private List<PersonDTO> executor;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
@ -46,13 +49,19 @@ public class PendingMessagePushParam implements Serializable {
|
||||
*/
|
||||
private OrganizationTypeEnum orgType;
|
||||
/**
|
||||
* 消息所属组织Id
|
||||
* 消息所属项目部Id
|
||||
*/
|
||||
private Long orgId;
|
||||
private Long workspaceId;
|
||||
// /**
|
||||
// * 删除工作台名称,通过id查
|
||||
// * 消息所属项目部名称
|
||||
// */
|
||||
// private String workspaceName;
|
||||
|
||||
/**
|
||||
* 消息所属组织名称
|
||||
* 消息所属企业id
|
||||
*/
|
||||
private String orgName;
|
||||
private Long ouId;
|
||||
/**
|
||||
* 业务类型
|
||||
*/
|
||||
@ -77,6 +86,18 @@ public class PendingMessagePushParam implements Serializable {
|
||||
* 路由参数(json string)
|
||||
*/
|
||||
private String routerParams;
|
||||
/**
|
||||
* 业务标签
|
||||
*/
|
||||
private String bizFlag;
|
||||
/**
|
||||
* 业务终态,可为空
|
||||
*/
|
||||
private BizFinalStateEnum bizFinalState;
|
||||
/**
|
||||
* 待办的截止时间
|
||||
*/
|
||||
private Date deadline;
|
||||
|
||||
public static PendingMessagePushParam from(PendingMessagePushRequest request) {
|
||||
return BeanConverter.convert(request, PendingMessagePushParam.class);
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
package cn.axzo.msg.center.message.domain.vo;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
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.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -17,6 +19,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -80,19 +83,10 @@ public class GeneralMessagePushVO implements Serializable {
|
||||
private Long sendTimestamp;
|
||||
|
||||
public static GeneralMessagePushVO from(GeneralMessageRecord record, String templateIcon, String orgIcon,
|
||||
List<MessageRouterButtonDTO> routerButtons,
|
||||
MessageTemplateRouterDTO msgTemplateRouter,
|
||||
List<MessageCardContentItemDTO> cardContentItems) {
|
||||
CardButton cardDetailButton = CollectionUtils.isEmpty(routerButtons) ? null : routerButtons.stream()
|
||||
.filter(e -> RouterCategoryEnum.DETAIL.equals(e.getCategory()))
|
||||
.findFirst()
|
||||
.map(CardButton::from)
|
||||
.orElse(null);
|
||||
List<CardButton> cardButtons = CollectionUtils.isEmpty(routerButtons) ? Collections.emptyList() :
|
||||
routerButtons.stream()
|
||||
.filter(e -> !RouterCategoryEnum.DETAIL.equals(e.getCategory()))
|
||||
.filter(MessageRouterButtonDTO::isShowOnCard)
|
||||
.map(CardButton::from)
|
||||
.collect(Collectors.toList());
|
||||
CardButton cardDetailButton = parseDetailButton(msgTemplateRouter);
|
||||
List<CardButton> cardButtons = parseCardButtons(msgTemplateRouter);
|
||||
List<CardExtensionItem> cardExtension = CollectionUtils.isEmpty(cardContentItems) ? Collections.emptyList() :
|
||||
cardContentItems.stream()
|
||||
.map(CardExtensionItem::from)
|
||||
@ -117,6 +111,23 @@ public class GeneralMessagePushVO implements Serializable {
|
||||
.build();
|
||||
}
|
||||
|
||||
private static CardButton parseDetailButton(MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
if (Objects.isNull(msgTemplateRouter) || Objects.isNull(msgTemplateRouter.getRouteDetail())) {
|
||||
return null;
|
||||
}
|
||||
return CardButton.from(msgTemplateRouter.getRouteDetail());
|
||||
}
|
||||
|
||||
private static List<CardButton> parseCardButtons(MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
if (Objects.isNull(msgTemplateRouter)
|
||||
|| CollectionUtils.isEmpty(msgTemplateRouter.getRouteButtons())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return msgTemplateRouter.getRouteButtons().stream()
|
||||
.map(CardButton::from)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
@ -178,12 +189,34 @@ public class GeneralMessagePushVO implements Serializable {
|
||||
*/
|
||||
private List<ButtonAction> actionPaths;
|
||||
|
||||
static CardButton from(MessageRouterButtonDTO routerButton) {
|
||||
static CardButton from(MessageTemplateRouterDTO.MessageRouteDetailDTO routeDetail) {
|
||||
return CardButton.builder()
|
||||
.title(routerButton.getDesc())
|
||||
.title(routeDetail.getName())
|
||||
.action(RouterCategoryEnum.JUMP.name())
|
||||
.isHighlight(false)
|
||||
.actionPaths(routeDetail.getRouterConfigs().stream()
|
||||
.map(e -> new ButtonAction(e.getTerminalType().name(), e.getUrl()))
|
||||
.collect(Collectors.toList())
|
||||
).build();
|
||||
}
|
||||
|
||||
static CardButton from(MessageTemplateRouterDTO.MessageRouteButtonDTO routerButton) {
|
||||
List<ButtonStyleEnum> buttonStyles = Objects.isNull(routerButton.getStyle()) ? Collections.emptyList() :
|
||||
JSON.parseArray(routerButton.getStyle().toJSONString(), ButtonStyleEnum.class);
|
||||
if (RouterCategoryEnum.ACTION.equals(routerButton.getCategory())) {
|
||||
return CardButton.builder()
|
||||
.title(routerButton.getName())
|
||||
.action(routerButton.getCategory().name())
|
||||
.isHighlight(buttonStyles.stream().allMatch(ButtonStyleEnum.HIGH_LIGHT::equals))
|
||||
.actionPaths(Lists.newArrayList(
|
||||
new ButtonAction(TerminalTypeEnum.WEB_VIEW.name(), routerButton.getApiUrl())))
|
||||
.build();
|
||||
}
|
||||
return CardButton.builder()
|
||||
.title(routerButton.getName())
|
||||
.action(routerButton.getCategory().name())
|
||||
.isHighlight(routerButton.isHighlight())
|
||||
.actionPaths(routerButton.getTerminals().stream()
|
||||
.isHighlight(buttonStyles.stream().allMatch(ButtonStyleEnum.HIGH_LIGHT::equals))
|
||||
.actionPaths(routerButton.getRouterConfigs().stream()
|
||||
.map(e -> new ButtonAction(e.getTerminalType().name(), e.getUrl()))
|
||||
.collect(Collectors.toList())
|
||||
).build();
|
||||
|
||||
@ -1,9 +1,12 @@
|
||||
package cn.axzo.msg.center.message.service;
|
||||
|
||||
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeSaveOrUpdateParam;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -35,12 +38,20 @@ public interface MessageGroupNodeService {
|
||||
Map<String, String> leafGroupNodeCodePaths(Collection<String> leafGroupNodeCodes);
|
||||
|
||||
/**
|
||||
* 根据结点编码查询结点信息
|
||||
* 获取分类结点(叶结点)编码的路径
|
||||
*
|
||||
* @param rootNodeCode 结点编码
|
||||
* @return 结点信息
|
||||
* @param leafNodeCode 分类结点(根结点)的编码
|
||||
* @return 分类结点(叶结点)编码的路径
|
||||
*/
|
||||
Optional<GroupTreeNodeDTO> queryRootNode(String rootNodeCode);
|
||||
Optional<GroupTreeNodePathDTO> queryLeafGroupNodeCodePath(String leafNodeCode);
|
||||
|
||||
/**
|
||||
* 获取分类结点(叶结点)编码的路径
|
||||
*
|
||||
* @param rootNodeCodes 分类结点(根结点)的编码列表
|
||||
* @return 分类结点(叶结点)编码的路径
|
||||
*/
|
||||
List<GroupTreeNodePathDTO> leafGroupNodeCodePathsByRootNodeCodes(Collection<String> rootNodeCodes);
|
||||
|
||||
/**
|
||||
* 新增结点
|
||||
@ -69,5 +80,23 @@ public interface MessageGroupNodeService {
|
||||
* @param category 消息/待办
|
||||
* @return 分类树列表
|
||||
*/
|
||||
List<GroupTreeNodeDTO> listGroupTree(MessageCategoryEnum category);
|
||||
List<GroupTreeNodeDTO> listGroupTree(@Nullable MessageGroupCategoryEnum category);
|
||||
|
||||
/**
|
||||
* 获取各个应用端对应的业务中心分类结点编码配置
|
||||
*
|
||||
* @param category 分类树的种类
|
||||
* @param appTerminalType 应用终端类型
|
||||
* @return 对应的分类树的根节点编码列表
|
||||
*/
|
||||
List<String> listGroupTreeRootNodeCodes(MessageGroupCategoryEnum category, AppTerminalTypeEnum appTerminalType);
|
||||
|
||||
/**
|
||||
* 获取对应的应用终端配置的分类结点信息
|
||||
*
|
||||
* @param appTerminalType 应用终端类型
|
||||
* @param category 模板分类结点的类型
|
||||
* @return 分类结点列表
|
||||
*/
|
||||
List<GroupTreeNodeDTO> listLeafNodes(AppTerminalTypeEnum appTerminalType, MessageGroupCategoryEnum category);
|
||||
}
|
||||
|
||||
@ -46,6 +46,14 @@ public interface MessageGroupTreeNodeCacheService {
|
||||
*/
|
||||
Optional<GroupTreeNodePathDTO> queryLeafNodePath(String leafNodeCode);
|
||||
|
||||
/**
|
||||
* 获取根节点对应的所有叶结点对应的树的路径
|
||||
*
|
||||
* @param rootNodeCode 根结点编码
|
||||
* @return 路径
|
||||
*/
|
||||
List<GroupTreeNodePathDTO> listLeafNodePaths(String rootNodeCode);
|
||||
|
||||
/**
|
||||
* 刷新缓存
|
||||
*/
|
||||
|
||||
@ -14,12 +14,12 @@ import java.util.Map;
|
||||
public interface MessageTemplateGroupService {
|
||||
|
||||
/**
|
||||
* 通过分组结点编码查询关联的模板编码列表
|
||||
* 通过分组结点编码路径查询关联的模板编码列表
|
||||
*
|
||||
* @param groupNodeCode 分组结点编码
|
||||
* @param leafNodePathCodes 分组结点编码路径列表
|
||||
* @return 模板编码列表
|
||||
*/
|
||||
List<String> listMessageTemplateCodes(String groupNodeCode);
|
||||
List<String> listMessageTemplateCodes(Collection<String> leafNodePathCodes);
|
||||
|
||||
/**
|
||||
* 模板关联分类
|
||||
|
||||
@ -92,4 +92,12 @@ public interface MessageTemplateNewService {
|
||||
* @return 模板列表
|
||||
*/
|
||||
List<MessageTemplatePageResponse> listByCodes(Collection<String> templateCodes);
|
||||
|
||||
/**
|
||||
* 通过模板id获取对应的模板编码
|
||||
*
|
||||
* @param ids 模板id列表
|
||||
* @return 模板编码列表
|
||||
*/
|
||||
List<String> listTemplateCodesByIds(Collection<Long> ids);
|
||||
}
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
package cn.axzo.msg.center.message.service;
|
||||
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -17,27 +18,20 @@ import java.util.Map;
|
||||
public interface MessageTemplateRouterService {
|
||||
|
||||
/**
|
||||
* 根据消息模板编码查询配置的路由列表
|
||||
* 根据消息模板编码查询配置的路由
|
||||
*
|
||||
* @param templateCode 消息模板编码
|
||||
* @return 路由列表
|
||||
* @return 路由
|
||||
*/
|
||||
List<RawMessageRouterDTO> queryByTemplateCode(String templateCode);
|
||||
Optional<MessageTemplateRouterDTO> queryByTemplateCode(String templateCode);
|
||||
|
||||
/**
|
||||
* 批量插入模板路由
|
||||
* 保存OR更新消息模板的路由
|
||||
*
|
||||
* @param routers 路由列表
|
||||
* @param router 路由配置
|
||||
* @param isUpdate 是否更新
|
||||
*/
|
||||
void batchInsert(List<RawMessageRouterDTO> routers);
|
||||
|
||||
/**
|
||||
* 更新模板的路由信息
|
||||
*
|
||||
* @param templateCode 模板编码
|
||||
* @param routers 路由列表
|
||||
*/
|
||||
void updateTemplateRoutes(String templateCode, List<MessageRouterButtonDTO> routers);
|
||||
void saveOrUpdate(MessageTemplateRouterDTO router, boolean isUpdate);
|
||||
|
||||
/**
|
||||
* 根据消息模板编码查询配置的路由列表
|
||||
@ -45,5 +39,5 @@ public interface MessageTemplateRouterService {
|
||||
* @param templateCodes 消息模板编码列表
|
||||
* @return 路由列表
|
||||
*/
|
||||
Map<String, List<RawMessageRouterDTO>> groupByTemplateCode(List<String> templateCodes);
|
||||
Map<String, MessageTemplateRouterDTO> groupByTemplateCode(Collection<String> templateCodes);
|
||||
}
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package cn.axzo.msg.center.message.service;
|
||||
|
||||
/**
|
||||
* @description xxx
|
||||
* @author cold_blade
|
||||
* @date 2023/11/17
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface PendingMessageDataInitService {
|
||||
|
||||
void transformPendingMessageRecord(Integer diffDays, Long minRecordId);
|
||||
}
|
||||
@ -1,14 +1,19 @@
|
||||
package cn.axzo.msg.center.message.service;
|
||||
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
|
||||
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@ -21,7 +26,30 @@ import java.util.Optional;
|
||||
*/
|
||||
public interface PendingMessageNewService {
|
||||
|
||||
List<MessageGroupNodeStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);
|
||||
/**
|
||||
* 分类统计待办的待处理状态的数量
|
||||
*
|
||||
* @param param 统计入参
|
||||
* @return 分类信息及其对应的待处理的待办数量列表
|
||||
*/
|
||||
List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);
|
||||
|
||||
/**
|
||||
* 统计个人在某个应用终端的待处理的待办数量
|
||||
*
|
||||
* @param param 统计入参
|
||||
* @return 待处理的待办数量
|
||||
*/
|
||||
Integer countUncompleted(MessageGroupNodeStatisticParam param);
|
||||
|
||||
/**
|
||||
* 根据模板id列表统计指定的自然人的待办数量
|
||||
*
|
||||
* @param personId 自然人id
|
||||
* @param templateIds 模板id列表
|
||||
* @return 指定的人的待办数量
|
||||
*/
|
||||
Integer countUncompleted(Long personId, Collection<Long> templateIds);
|
||||
|
||||
/**
|
||||
* 代办列表分页查询
|
||||
@ -31,6 +59,14 @@ public interface PendingMessageNewService {
|
||||
*/
|
||||
Page<PendingMessageResponse> pageQuery(PendingMessagePageRequest request);
|
||||
|
||||
/**
|
||||
* 代办列表指定item查询
|
||||
*
|
||||
* @param request 查询相关参数
|
||||
* @return 指定的item数据
|
||||
*/
|
||||
PendingMessageResponse query(PendingMessageQueryRequest request);
|
||||
|
||||
/**
|
||||
* 查询代办详情
|
||||
*
|
||||
@ -46,21 +82,45 @@ public interface PendingMessageNewService {
|
||||
* @param param 代办核心参数
|
||||
* @return 代办唯一标识
|
||||
*/
|
||||
String push(PendingMessagePushParam param);
|
||||
List<PushPendingMessageDTO> push(PendingMessagePushParam param);
|
||||
|
||||
/**
|
||||
* 完成代办
|
||||
*
|
||||
* @param msgIdentityCode 代办唯一标识
|
||||
* @param requestNo 代办唯一标识
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
Boolean complete(String msgIdentityCode);
|
||||
Boolean complete(String requestNo);
|
||||
|
||||
/**
|
||||
* 完成代办
|
||||
*
|
||||
* @param param 代办唯一标识
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
Boolean completeById(CompletePendingMessageByIdRequest param);
|
||||
|
||||
/**
|
||||
* 撤销代办
|
||||
*
|
||||
* @param msgIdentityCode 代办唯一标识
|
||||
* @param requestNo 代办唯一标识
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
Boolean revoke(String msgIdentityCode);
|
||||
Boolean revoke(String requestNo);
|
||||
|
||||
/**
|
||||
* 通过业务编码和模版编码完成代办
|
||||
*
|
||||
* @param param
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
Boolean completeByTemplateCodeBizCode(CompletePendingMessageRequest param);
|
||||
|
||||
/**
|
||||
* 通过业务编码和模版编码撤销代办
|
||||
*
|
||||
* @param param
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
Boolean revokeByTemplateCodeBizCode(CompletePendingMessageRequest param);
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
|
||||
import cn.axzo.msg.center.domain.enums.UserTypeEnum;
|
||||
import cn.axzo.msg.center.inside.notices.config.MessageSystemConfig;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.SendImMessageDTO;
|
||||
import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO;
|
||||
import cn.axzo.msg.center.message.service.GeneralMessageOldService;
|
||||
@ -23,7 +23,6 @@ import cn.axzo.msg.center.message.service.MessageSendTwiceRecordService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
@ -181,15 +180,9 @@ public class GeneralMessageServiceImpl implements GeneralMessageService {
|
||||
|
||||
private GeneralMessagePushVO convert(GeneralMessageRecord record, MessageTemplateDTO template) {
|
||||
// 对应模板的路由列表
|
||||
List<RawMessageRouterDTO> rawRouters = template.getRouters();
|
||||
MessageTemplateRouterDTO msgTemplateRouter = template.getMsgTemplateRouter();
|
||||
// 解析路由地址
|
||||
List<RawMessageRouterDTO> routers = rawRouters.stream()
|
||||
.map(e -> MessageRouterUtil.parseAndConcatRouteUrl(e, record.getRouterParams()))
|
||||
.collect(Collectors.toList());
|
||||
// 转化成客户端展示的数据模型
|
||||
List<MessageRouterButtonDTO> routerButtons = routers.stream()
|
||||
.map(RawMessageRouterDTO::toMessageRouterButton)
|
||||
.collect(Collectors.toList());
|
||||
msgTemplateRouter = MessageRouterUtil.parseAndConcatRouteUrl(msgTemplateRouter, record.getRouterParams());
|
||||
// 获取模板卡片信息
|
||||
List<MessageCardContentItemDTO> rawCardContentItems = template.getMsgCardContentItems();
|
||||
List<MessageCardContentItemDTO> cardContentItems = rawCardContentItems;
|
||||
@ -205,7 +198,8 @@ public class GeneralMessageServiceImpl implements GeneralMessageService {
|
||||
e.setValue(value);
|
||||
});
|
||||
}
|
||||
return GeneralMessagePushVO.from(record, template.getIcon(), messageSystemConfig.getOrgIcon(), routerButtons, cardContentItems);
|
||||
return GeneralMessagePushVO
|
||||
.from(record, template.getIcon(), messageSystemConfig.getOrgIcon(), msgTemplateRouter, cardContentItems);
|
||||
}
|
||||
|
||||
private String parseString(String string, JSONObject params) {
|
||||
|
||||
@ -7,12 +7,15 @@ import cn.axzo.msg.center.dal.MessageGroupNodeDao;
|
||||
import cn.axzo.msg.center.dal.MessageTemplateGroupDao;
|
||||
import cn.axzo.msg.center.domain.entity.MessageGroupNode;
|
||||
import cn.axzo.msg.center.domain.entity.MessageTemplateGroup;
|
||||
import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
|
||||
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeSaveOrUpdateParam;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupTreeNodeCacheService;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
|
||||
import cn.axzo.msg.center.utils.TreeHelperUtil;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -41,6 +44,7 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService {
|
||||
|
||||
private final MessageGroupNodeDao messageGroupNodeDao;
|
||||
private final MessageTemplateGroupDao messageTemplateGroupDao;
|
||||
private final PendingMessageBizConfig pendingMessageBizConfig;
|
||||
private final MessageGroupTreeNodeCacheService messageGroupTreeNodeCacheService;
|
||||
|
||||
@Override
|
||||
@ -73,8 +77,19 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<GroupTreeNodeDTO> queryRootNode(String rootNodeCode) {
|
||||
return messageGroupTreeNodeCacheService.queryRootNode(rootNodeCode);
|
||||
public Optional<GroupTreeNodePathDTO> queryLeafGroupNodeCodePath(String leafNodeCode) {
|
||||
return messageGroupTreeNodeCacheService.queryLeafNodePath(leafNodeCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GroupTreeNodePathDTO> leafGroupNodeCodePathsByRootNodeCodes(Collection<String> rootNodeCodes) {
|
||||
if (CollectionUtils.isEmpty(rootNodeCodes)) {
|
||||
log.info("rootNodeCodes is empty.");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return rootNodeCodes.stream()
|
||||
.flatMap(e -> messageGroupTreeNodeCacheService.listLeafNodePaths(e).stream())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -124,11 +139,36 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GroupTreeNodeDTO> listGroupTree(MessageCategoryEnum category) {
|
||||
public List<GroupTreeNodeDTO> listGroupTree(MessageGroupCategoryEnum category) {
|
||||
return messageGroupTreeNodeCacheService.listAllGroupTree().stream()
|
||||
// 查询消息/待办 OR 两者的分类树
|
||||
// 分类过滤条件
|
||||
.filter(e -> Objects.isNull(category)
|
||||
|| Objects.equals(e.getCategory().getMsgCategory(), category))
|
||||
|| category.getMsgGroupNodeCategories().contains(e.getCategory()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> listGroupTreeRootNodeCodes(MessageGroupCategoryEnum category, AppTerminalTypeEnum appTerminalType) {
|
||||
AssertUtil.notNull(category, "category can not be null");
|
||||
List<Long> nodeIds = MessageGroupCategoryEnum.PENDING.equals(category) ?
|
||||
pendingMessageBizConfig.fetchMessageGroupTreeNodeIds(appTerminalType) : Collections.emptyList();
|
||||
return messageGroupTreeNodeCacheService.listAllGroupTree().stream()
|
||||
.filter(e -> category.getMsgGroupNodeCategories().contains(e.getCategory()))
|
||||
.filter(e -> CollectionUtils.isEmpty(nodeIds) || nodeIds.contains(e.getNodeId()))
|
||||
.map(GroupTreeNodeDTO::getNodeCode)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GroupTreeNodeDTO> listLeafNodes(AppTerminalTypeEnum appTerminalType, MessageGroupCategoryEnum category) {
|
||||
AssertUtil.notNull(category, "category can not be null");
|
||||
List<Long> nodeIds = MessageGroupCategoryEnum.PENDING.equals(category) ?
|
||||
pendingMessageBizConfig.fetchMessageGroupTreeNodeIds(appTerminalType) : Collections.emptyList();
|
||||
return messageGroupTreeNodeCacheService.listAllGroupTree().stream()
|
||||
.filter(e -> category.getMsgGroupNodeCategories().contains(e.getCategory()))
|
||||
.filter(e -> CollectionUtils.isEmpty(nodeIds) || nodeIds.contains(e.getNodeId()))
|
||||
.flatMap(e -> e.getLeafNodes().stream())
|
||||
.filter(GroupTreeNodeDTO::canMountTemplate)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package cn.axzo.msg.center.message.service.impl;
|
||||
|
||||
import cn.axzo.basics.common.util.TreeUtil;
|
||||
import cn.axzo.msg.center.common.enums.TableIsDeleteEnum;
|
||||
import cn.axzo.msg.center.common.redis.RedisUtil;
|
||||
import cn.axzo.msg.center.dal.MessageGroupNodeDao;
|
||||
@ -8,6 +7,7 @@ import cn.axzo.msg.center.domain.entity.MessageGroupNode;
|
||||
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupTreeNodeCacheService;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.utils.TreeHelperUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
@ -15,6 +15,7 @@ import org.apache.commons.compress.utils.Lists;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@ -82,6 +83,17 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GroupTreeNodePathDTO> listLeafNodePaths(String rootNodeCode) {
|
||||
if (StringUtils.isBlank(rootNodeCode)) {
|
||||
log.info("leafNodeCode is blank.");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return getLeafTreeNodePathsCache().stream()
|
||||
.filter(e -> e.getNodeCodePath().startsWith(rootNodeCode))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void refreshCache() {
|
||||
// 清除redis中的缓存标识
|
||||
@ -97,9 +109,8 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod
|
||||
LinkedList<GroupTreeNodeDTO> queue = new LinkedList<>(root.getNodeChildren());
|
||||
while (!queue.isEmpty()) {
|
||||
GroupTreeNodeDTO node = queue.pop();
|
||||
Optional<GroupTreeNodeDTO> childOp = node.getChild(treeNodeCode);
|
||||
if (childOp.isPresent()) {
|
||||
return childOp.get();
|
||||
if (Objects.equals(node.getNodeCode(), treeNodeCode)) {
|
||||
return node;
|
||||
}
|
||||
queue.addAll(node.getNodeChildren());
|
||||
}
|
||||
@ -135,8 +146,8 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod
|
||||
}
|
||||
|
||||
private synchronized void initialize(boolean refreshCache) {
|
||||
List<GroupTreeNodeDTO> groupNodes = listAllValidNodesFromDB();
|
||||
allGroupTreesCache = TreeUtil.buildTree(groupNodes);
|
||||
List<MessageGroupNode> groupNodes = listAllValidNodesFromDB();
|
||||
allGroupTreesCache = TreeHelperUtil.buildTrees(groupNodes);
|
||||
leafTreeNodePathsCache = allGroupTreesCache.stream()
|
||||
.flatMap(e -> parseRootNode(e).stream())
|
||||
.collect(Collectors.toList());
|
||||
@ -145,44 +156,34 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod
|
||||
}
|
||||
}
|
||||
|
||||
private List<GroupTreeNodeDTO> listAllValidNodesFromDB() {
|
||||
private List<MessageGroupNode> listAllValidNodesFromDB() {
|
||||
return messageGroupNodeDao.lambdaQuery()
|
||||
.eq(MessageGroupNode::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.list().stream()
|
||||
.map(this::convert)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private GroupTreeNodeDTO convert(MessageGroupNode groupNode) {
|
||||
return GroupTreeNodeDTO.builder()
|
||||
.nodeName(groupNode.getName())
|
||||
.nodeCode(groupNode.getCode())
|
||||
.category(groupNode.getCategory())
|
||||
.parentNodeCode(groupNode.getParentCode())
|
||||
.isLeaf(groupNode.getIsLeaf())
|
||||
.status(groupNode.getStatus())
|
||||
.build();
|
||||
.list();
|
||||
}
|
||||
|
||||
private List<GroupTreeNodePathDTO> parseRootNode(GroupTreeNodeDTO root) {
|
||||
List<GroupTreeNodePathDTO> paths = Lists.newArrayList();
|
||||
LinkedList<GroupTreeNodeDTO> pathNodeStack = new LinkedList<>();
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>();
|
||||
stack.push(root);
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
pathNodeStack.push(node);
|
||||
if (CollectionUtils.isEmpty(node.getNodeChildren())) {
|
||||
// 当前结点为树的叶结点(逻辑上的,有可能不是业务维度的叶结点)
|
||||
paths.add(GroupTreeNodePathDTO.of(node.getNodeCode(), reverseStack(pathNodeStack)));
|
||||
pathNodeStack.pop();
|
||||
} else {
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
}
|
||||
List<GroupTreeNodeDTO> stack = new ArrayList<>();
|
||||
parse(root, stack, paths);
|
||||
return paths;
|
||||
}
|
||||
|
||||
private void parse(GroupTreeNodeDTO node, List<GroupTreeNodeDTO> stack, List<GroupTreeNodePathDTO> paths) {
|
||||
if (!stack.isEmpty()
|
||||
&& !Objects.equals(stack.get(stack.size() - 1).getNodeCode(), node.getParentNodeCode())) {
|
||||
stack.remove(stack.size() - 1);
|
||||
}
|
||||
stack.add(node);
|
||||
if (CollectionUtils.isEmpty(node.getNodeChildren())) {
|
||||
// 当前结点为树的叶结点(逻辑上的,有可能不是业务维度的叶结点)
|
||||
paths.add(GroupTreeNodePathDTO.of(node, stack));
|
||||
stack.remove(node);
|
||||
} else {
|
||||
node.getNodeChildren().forEach(e -> parse(e, stack, paths));
|
||||
}
|
||||
}
|
||||
|
||||
private List<GroupTreeNodeDTO> reverseStack(LinkedList<GroupTreeNodeDTO> pathNodeStack) {
|
||||
List<GroupTreeNodeDTO> list = Lists.newArrayList();
|
||||
for (GroupTreeNodeDTO node : pathNodeStack) {
|
||||
|
||||
@ -37,13 +37,13 @@ public class MessageTemplateGroupServiceImpl implements MessageTemplateGroupServ
|
||||
private final MessageTemplateGroupDao messageTemplateGroupDao;
|
||||
|
||||
@Override
|
||||
public List<String> listMessageTemplateCodes(String groupNodeCode) {
|
||||
if (StringUtils.isBlank(groupNodeCode)) {
|
||||
log.info("groupNodeCode is blank.");
|
||||
public List<String> listMessageTemplateCodes(Collection<String> leafNodePathCodes) {
|
||||
if (CollectionUtils.isEmpty(leafNodePathCodes)) {
|
||||
log.info("groupNodePathCodes is empty.");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return messageTemplateGroupDao.lambdaQuery()
|
||||
.like(MessageTemplateGroup::getPath, groupNodeCode)
|
||||
.in(MessageTemplateGroup::getPath, leafNodePathCodes)
|
||||
.eq(MessageTemplateGroup::getIsDelete, 0)
|
||||
.list().stream()
|
||||
.map(MessageTemplateGroup::getTemplateCode)
|
||||
@ -137,7 +137,6 @@ public class MessageTemplateGroupServiceImpl implements MessageTemplateGroupServ
|
||||
// 统计指定的模板编码关联的分类数量
|
||||
Map<String, Long> templateCodeList = messageTemplateGroupDao.lambdaQuery()
|
||||
.in(MessageTemplateGroup::getTemplateCode, templateCodes)
|
||||
.eq(MessageTemplateGroup::getPath, nodeCodePathMap.get(curGroupNodeCode))
|
||||
.eq(MessageTemplateGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
// 这里仅查询模板编码字段即可
|
||||
.select(MessageTemplateGroup::getTemplateCode)
|
||||
|
||||
@ -9,21 +9,25 @@ import cn.axzo.msg.center.dal.MessageBaseTemplateDao;
|
||||
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
|
||||
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageTemplateSaveOrUpdateParam;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateGroupService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateRouterService;
|
||||
import cn.axzo.msg.center.service.dto.MessageBaseTemplateDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import cn.axzo.msg.center.service.enums.StatusEnum;
|
||||
import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest;
|
||||
import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse;
|
||||
import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse;
|
||||
import cn.axzo.msg.center.utils.JSONObjectUtil;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import cn.axzo.msg.center.utils.MessageTemplateCategoryUtil;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -71,6 +75,7 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String createTemplate(MessageTemplateSaveOrUpdateParam param) {
|
||||
// 参数检测 TODO:[cold_blade] [P0]
|
||||
// 创建模板基础数据
|
||||
String templateCode = saveTemplate(param);
|
||||
// 创建模板的路由数据
|
||||
@ -107,8 +112,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
// 获取模板关联分类的path列表
|
||||
List<String> groupNodePaths = messageTemplateGroupService.listMessageTemplateGroupPaths(
|
||||
Lists.newArrayList(templateCode)).getOrDefault(templateCode, Collections.emptyList());
|
||||
List<RawMessageRouterDTO> routers = messageTemplateRouterService.queryByTemplateCode(templateCode);
|
||||
return convert(baseTemplate, groupNodePaths, routers);
|
||||
// 获取模板配置的路由信息
|
||||
MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(templateCode)
|
||||
.orElse(null);
|
||||
return convert(baseTemplate, groupNodePaths, msgTemplateRouter);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -139,8 +146,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
log.info("not find the [{}] template.", msgTemplateCode);
|
||||
return Optional.empty();
|
||||
}
|
||||
List<RawMessageRouterDTO> routers = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode);
|
||||
return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, routers));
|
||||
// 获取模板的路由配置信息
|
||||
MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode)
|
||||
.orElse(null);
|
||||
return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, msgTemplateRouter));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -157,45 +166,23 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
log.info("not find the [{}] templates.", msgTemplateCodes);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
Map<String, List<RawMessageRouterDTO>> templateRouterMap = messageTemplateRouterService
|
||||
Map<String, MessageTemplateRouterDTO> templateRouterMap = messageTemplateRouterService
|
||||
.groupByTemplateCode(msgTemplateCodes);
|
||||
return msgBaseTemplates.stream()
|
||||
.map(e -> MessageTemplateDTO.from(e, templateRouterMap.getOrDefault(e.getCode(), Collections.emptyList())))
|
||||
.map(e -> MessageTemplateDTO.from(e, templateRouterMap.get(e.getCode())))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<MessageTemplatePageResponse> page(MessageTemplatePageRequest request) {
|
||||
List<String> templateCodes = Lists.newArrayList();
|
||||
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
|
||||
templateCodes = messageTemplateGroupService.listMessageTemplateCodes(request.getGroupNodeCode());
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
// 入参中的分类没有关联任何模板,直接返回查询结果
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotBlank(request.getTemplateCode())) {
|
||||
if (CollectionUtils.isNotEmpty(templateCodes)
|
||||
&& !templateCodes.contains(request.getTemplateCode())) {
|
||||
// 分页查询的入参中没指定的模板编码与分类映射的模板编码无交集
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
// 取两者的交集
|
||||
templateCodes = Lists.newArrayList(request.getTemplateCode());
|
||||
}
|
||||
IPage<MessageBaseTemplate> pageRequest = request.toPage();
|
||||
IPage<MessageBaseTemplate> result = messageBaseTemplateDao.lambdaQuery()
|
||||
.like(StringUtils.isNotBlank(request.getTemplateName()),
|
||||
MessageBaseTemplate::getName, request.getTemplateName())
|
||||
.in(CollectionUtils.isNotEmpty(templateCodes),
|
||||
MessageBaseTemplate::getCode, request.getTemplateCode())
|
||||
.eq(Objects.nonNull(request.getCategory()), MessageBaseTemplate::getMsgCategory, request.getCategory())
|
||||
.eq(Objects.nonNull(request.getStatus()), MessageBaseTemplate::getStatus, request.getStatus())
|
||||
.page(pageRequest);
|
||||
if (CollectionUtils.isEmpty(result.getRecords())) {
|
||||
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request);
|
||||
if (Objects.isNull(result)
|
||||
|| CollectionUtils.isEmpty(result.getRecords())) {
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
templateCodes = result.getRecords().stream().map(MessageBaseTemplate::getCode).collect(Collectors.toList());
|
||||
List<String> templateCodes = result.getRecords().stream()
|
||||
.map(MessageBaseTemplate::getCode)
|
||||
.collect(Collectors.toList());
|
||||
Map<String, List<String>> groupNodePaths = messageTemplateGroupService
|
||||
.listMessageTemplateGroupPaths(templateCodes);
|
||||
Map<String, String> codeNameMap = messageGroupNodeService.groupNodeNamePaths(groupNodePaths.values().stream()
|
||||
@ -208,33 +195,9 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
|
||||
@Override
|
||||
public Page<MessageBaseTemplateDTO> pageBaseTemplate(MessageTemplatePageRequest request) {
|
||||
List<String> templateCodes = Lists.newArrayList();
|
||||
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
|
||||
templateCodes = messageTemplateGroupService.listMessageTemplateCodes(request.getGroupNodeCode());
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
// 入参中的分类没有关联任何模板,直接返回查询结果
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotBlank(request.getTemplateCode())) {
|
||||
if (CollectionUtils.isNotEmpty(templateCodes)
|
||||
&& !templateCodes.contains(request.getTemplateCode())) {
|
||||
// 分页查询的入参中没指定的模板编码与分类映射的模板编码无交集
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
// 取两者的交集
|
||||
templateCodes = Lists.newArrayList(request.getTemplateCode());
|
||||
}
|
||||
IPage<MessageBaseTemplate> pageRequest = request.toPage();
|
||||
IPage<MessageBaseTemplate> result = messageBaseTemplateDao.lambdaQuery()
|
||||
.like(StringUtils.isNotBlank(request.getTemplateName()),
|
||||
MessageBaseTemplate::getName, request.getTemplateName())
|
||||
.in(CollectionUtils.isNotEmpty(templateCodes),
|
||||
MessageBaseTemplate::getCode, request.getTemplateCode())
|
||||
.eq(Objects.nonNull(request.getCategory()), MessageBaseTemplate::getMsgCategory, request.getCategory())
|
||||
.eq(Objects.nonNull(request.getStatus()), MessageBaseTemplate::getStatus, request.getStatus())
|
||||
.page(pageRequest);
|
||||
if (CollectionUtils.isEmpty(result.getRecords())) {
|
||||
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request);
|
||||
if (Objects.isNull(result)
|
||||
|| CollectionUtils.isEmpty(result.getRecords())) {
|
||||
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
|
||||
}
|
||||
List<MessageBaseTemplateDTO> records = result.getRecords().stream()
|
||||
@ -268,6 +231,20 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> listTemplateCodesByIds(Collection<Long> ids) {
|
||||
if (CollectionUtils.isEmpty(ids)) {
|
||||
log.info("ids is empty.");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return messageBaseTemplateDao.lambdaQuery()
|
||||
.in(MessageBaseTemplate::getIsDelete, ids)
|
||||
.select(MessageBaseTemplate::getCode)
|
||||
.list().stream()
|
||||
.map(MessageBaseTemplate::getCode)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private String saveTemplate(MessageTemplateSaveOrUpdateParam param) {
|
||||
String templateCode = UUIDUtil.uuidString();
|
||||
MessageBaseTemplate template = convert(param);
|
||||
@ -315,19 +292,18 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
template.setCardContent(JSONObjectUtil.toJSONString(param.getMsgCardContentItems()));
|
||||
template.setIcon(param.getIcon());
|
||||
template.setPushTerminal(JSONObjectUtil.toJSONString(param.getPushTerminals()));
|
||||
template.setMinAppVersion(param.getMinAppVersion());
|
||||
template.setCreatorId(param.getOperatorId());
|
||||
template.setUpdaterId(param.getOperatorId());
|
||||
return template;
|
||||
}
|
||||
|
||||
private void saveTemplateRouters(MessageTemplateSaveOrUpdateParam param, String templateCode) {
|
||||
if (CollectionUtils.isEmpty(param.getRouters())) {
|
||||
return;
|
||||
MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, templateCode);
|
||||
if (templateRouter.isValid()) {
|
||||
// 模板配置了路由的场景
|
||||
messageTemplateRouterService.saveOrUpdate(templateRouter, false);
|
||||
}
|
||||
List<RawMessageRouterDTO> routers = param.getRouters().stream()
|
||||
.map(e -> RawMessageRouterDTO.from(e, templateCode))
|
||||
.collect(Collectors.toList());
|
||||
messageTemplateRouterService.batchInsert(routers);
|
||||
}
|
||||
|
||||
private void updateBaseTemplate(MessageTemplateSaveOrUpdateParam param) {
|
||||
@ -344,6 +320,8 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
JSONObjectUtil.toJSONString(param.getMsgCardContentItems()))
|
||||
.set(StringUtils.isNotBlank(param.getContent()), MessageBaseTemplate::getContent, param.getContent())
|
||||
.set(StringUtils.isNotBlank(param.getIcon()), MessageBaseTemplate::getIcon, param.getIcon())
|
||||
.set(StringUtils.isNotBlank(param.getMinAppVersion()), MessageBaseTemplate::getMinAppVersion,
|
||||
param.getMinAppVersion())
|
||||
.update();
|
||||
}
|
||||
|
||||
@ -355,10 +333,43 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
}
|
||||
|
||||
private void updateTemplateRouters(MessageTemplateSaveOrUpdateParam param) {
|
||||
if (CollectionUtils.isEmpty(param.getRouters())) {
|
||||
return;
|
||||
MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, param.getTemplateCode());
|
||||
if (templateRouter.isValid()) {
|
||||
// 模板修改了路由的场景
|
||||
messageTemplateRouterService.saveOrUpdate(templateRouter, true);
|
||||
}
|
||||
messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), param.getRouters());
|
||||
}
|
||||
|
||||
private IPage<MessageBaseTemplate> pageQueryBaseTemplate(MessageTemplatePageRequest request) {
|
||||
List<String> templateCodes = Lists.newArrayList();
|
||||
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
|
||||
Optional<GroupTreeNodePathDTO> nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode());
|
||||
templateCodes = nodePath
|
||||
.map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath())))
|
||||
.orElseGet(Collections::emptyList);
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
// 入参中的分类没有关联任何模板,直接返回查询结果
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotBlank(request.getTemplateCode())) {
|
||||
if (CollectionUtils.isNotEmpty(templateCodes)
|
||||
&& !templateCodes.contains(request.getTemplateCode())) {
|
||||
// 分页查询的入参中没指定的模板编码与分类映射的模板编码无交集
|
||||
return null;
|
||||
}
|
||||
// 取两者的交集
|
||||
templateCodes = Lists.newArrayList(request.getTemplateCode());
|
||||
}
|
||||
IPage<MessageBaseTemplate> pageRequest = request.toPage();
|
||||
return messageBaseTemplateDao.lambdaQuery()
|
||||
.like(StringUtils.isNotBlank(request.getTemplateName()),
|
||||
MessageBaseTemplate::getName, request.getTemplateName())
|
||||
.in(CollectionUtils.isNotEmpty(templateCodes), MessageBaseTemplate::getCode, templateCodes)
|
||||
.in(CollectionUtils.isNotEmpty(request.getCategories()), MessageBaseTemplate::getMsgCategory,
|
||||
request.getCategories())
|
||||
.eq(Objects.nonNull(request.getStatus()), MessageBaseTemplate::getStatus, request.getStatus())
|
||||
.page(pageRequest);
|
||||
}
|
||||
|
||||
private MessageBaseTemplateDTO convert(MessageBaseTemplate record) {
|
||||
@ -393,27 +404,43 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
|
||||
}
|
||||
|
||||
private MessageTemplateDetailResponse convert(MessageBaseTemplate record, List<String> groupNodePaths,
|
||||
List<RawMessageRouterDTO> routers) {
|
||||
MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
// 将path解析中解析出分类结点(路径叶结点)的编码
|
||||
List<String> groupNodeCodes = groupNodePaths.stream()
|
||||
.map(GroupTreeNodePathDTO::parseLeafNodeCode)
|
||||
.collect(Collectors.toList());
|
||||
// 转化为页面相关的数据模型
|
||||
List<MessageRouterButtonDTO> routerButtons = routers.stream()
|
||||
.map(RawMessageRouterDTO::toMessageRouterButton)
|
||||
.collect(Collectors.toList());
|
||||
return MessageTemplateDetailResponse.builder()
|
||||
.templateName(record.getName())
|
||||
.category(record.getMsgCategory())
|
||||
.category(MessageTemplateCategoryUtil.parentCategory(record.getMsgCategory()))
|
||||
.subCategory(MessageTemplateCategoryUtil.parseAndReturnSubCategory(record.getMsgCategory()))
|
||||
.leafGroupNodes(groupNodeCodes)
|
||||
.pushTerminals(JSON.parseArray(record.getPushTerminal(), PushTerminalEnum.class))
|
||||
.msgTitle(record.getTitle())
|
||||
.msgContent(record.getContent())
|
||||
.cardContentItems(JSONObjectUtil.parseArray(record.getCardContent(), MessageCardContentItemDTO.class))
|
||||
.msgIcon(record.getIcon())
|
||||
.routers(routerButtons)
|
||||
.detailStrategy(MessageRouterUtil.fetchBizDetailShowStrategy(msgTemplateRouter).orElse(null))
|
||||
.routers(MessageRouterUtil.fetchMessageRouterButtonStrategies(msgTemplateRouter))
|
||||
.minAppVersion(record.getMinAppVersion())
|
||||
.createTimestamp(record.getCreateAt().getTime())
|
||||
.updateTimestamp(record.getUpdateAt().getTime())
|
||||
.build();
|
||||
}
|
||||
|
||||
private MessageTemplateRouterDTO buildTemplateRouter(MessageTemplateSaveOrUpdateParam param, String templateCode) {
|
||||
MessageTemplateRouterDTO templateRouter = MessageTemplateRouterDTO.builder().build();
|
||||
if (Objects.nonNull(param.getBizDetailShowStrategy())
|
||||
&& CollectionUtils.isNotEmpty(param.getBizDetailShowStrategy().getTerminals())) {
|
||||
MessageRouteDetailDTO detailRouter = MessageRouteDetailDTO.from(param.getBizDetailShowStrategy(), templateCode);
|
||||
templateRouter.setRouteDetail(detailRouter);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(param.getRouters())) {
|
||||
List<MessageRouteButtonDTO> btnRouters = param.getRouters().stream()
|
||||
.filter(MessageButtonRouteStrategyDTO::isValid)
|
||||
.map(e -> MessageRouteButtonDTO.from(e, templateCode))
|
||||
.collect(Collectors.toList());
|
||||
templateRouter.setRouteButtons(btnRouters);
|
||||
}
|
||||
return templateRouter;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,21 +1,40 @@
|
||||
package cn.axzo.msg.center.message.service.impl;
|
||||
|
||||
import cn.axzo.msg.center.dal.MessageTemplateRouterDao;
|
||||
import cn.axzo.msg.center.domain.entity.MessageTemplateRouter;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.framework.core.util.MapUtil;
|
||||
import cn.axzo.msg.center.dal.MessageRouteButtonDao;
|
||||
import cn.axzo.msg.center.dal.MessageRouteDetailDao;
|
||||
import cn.axzo.msg.center.dal.MessageRouterConfigDao;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteButton;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteDetail;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouterConfig;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateRouterService;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import com.google.common.collect.Lists;
|
||||
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
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 org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -29,66 +48,256 @@ import java.util.stream.Collectors;
|
||||
@RequiredArgsConstructor
|
||||
public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterService {
|
||||
|
||||
private final MessageTemplateRouterDao messageTemplateRouterDao;
|
||||
private final MessageRouteDetailDao messageRouteDetailDao;
|
||||
private final MessageRouteButtonDao messageRouteButtonDao;
|
||||
private final MessageRouterConfigDao messageRouterConfigDao;
|
||||
|
||||
@Override
|
||||
public List<RawMessageRouterDTO> queryByTemplateCode(String templateCode) {
|
||||
public Optional<MessageTemplateRouterDTO> queryByTemplateCode(String templateCode) {
|
||||
if (StringUtils.isBlank(templateCode)) {
|
||||
log.warn("the template code is blank.");
|
||||
return Collections.emptyList();
|
||||
log.info("templateCode is blank.");
|
||||
}
|
||||
return listByTemplateCodes(Lists.newArrayList(templateCode));
|
||||
MessageTemplateRouterDTO router = MessageTemplateRouterDTO.builder()
|
||||
.routeDetail(queryDetailRouter(templateCode))
|
||||
.routeButtons(listButtonRouters(templateCode))
|
||||
.build();
|
||||
return router.isValid() ? Optional.of(router) : Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchInsert(List<RawMessageRouterDTO> routers) {
|
||||
if (CollectionUtils.isEmpty(routers)) {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveOrUpdate(MessageTemplateRouterDTO router, boolean isUpdate) {
|
||||
if (Objects.isNull(router) || router.isInValid()) {
|
||||
log.info("invalid message template router. router:{}", router);
|
||||
return;
|
||||
}
|
||||
List<MessageTemplateRouter> messageTemplateRouters = routers.stream()
|
||||
.flatMap(e -> e.toMessageTemplateRouters().stream())
|
||||
.collect(Collectors.toList());
|
||||
messageTemplateRouterDao.saveBatch(messageTemplateRouters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTemplateRoutes(String templateCode, List<MessageRouterButtonDTO> routers) {
|
||||
if (StringUtils.isBlank(templateCode)
|
||||
|| CollectionUtils.isEmpty(routers)) {
|
||||
log.info("the param is invalid. templateCode:[{}], routers:{}", templateCode, routers);
|
||||
return;
|
||||
if (isUpdate) {
|
||||
// 更新的逻辑为删除旧的重新创建
|
||||
remove(router.fetchTemplateCode().orElse(null));
|
||||
}
|
||||
// 移除之前的路由信息
|
||||
messageTemplateRouterDao.lambdaUpdate()
|
||||
.eq(MessageTemplateRouter::getTemplateCode, templateCode)
|
||||
.remove();
|
||||
// 创建信息的路由信息
|
||||
List<RawMessageRouterDTO> newRouters = routers.stream()
|
||||
.map(e -> RawMessageRouterDTO.from(e, templateCode))
|
||||
.collect(Collectors.toList());
|
||||
batchInsert(newRouters);
|
||||
saveDetailRouter(router.getRouteDetail());
|
||||
batchSaveButtonRouter(router.getRouteButtons());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<RawMessageRouterDTO>> groupByTemplateCode(List<String> templateCodes) {
|
||||
public Map<String, MessageTemplateRouterDTO> groupByTemplateCode(Collection<String> templateCodes) {
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
log.info("templateCodes is empty.");
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return listByTemplateCodes(templateCodes).stream()
|
||||
.collect(Collectors.groupingBy(RawMessageRouterDTO::getTemplateCode));
|
||||
Set<String> distinctTemplateCodes = Sets.newHashSet(templateCodes);
|
||||
Map<String, MessageRouteDetailDTO> detailRouters = listDetailRoutersGroupingByTemplateCode(distinctTemplateCodes);
|
||||
Map<String, List<MessageRouteButtonDTO>> buttonRouters = listButtonRoutersGroupingByTemplateCode(distinctTemplateCodes);
|
||||
return distinctTemplateCodes.stream()
|
||||
.filter(e -> detailRouters.containsKey(e) || buttonRouters.containsKey(e))
|
||||
.collect(Collectors.toMap(Function.identity(), e -> MessageTemplateRouterDTO.builder()
|
||||
.routeDetail(detailRouters.get(e))
|
||||
.routeButtons(buttonRouters.get(e))
|
||||
.build())
|
||||
);
|
||||
}
|
||||
|
||||
private List<RawMessageRouterDTO> listByTemplateCodes(List<String> templateCodes) {
|
||||
// 根据模板编码进行分组
|
||||
Map<String, List<MessageTemplateRouter>> routers = messageTemplateRouterDao
|
||||
.listByTemplateCode(templateCodes).stream()
|
||||
.collect(Collectors.groupingBy(MessageTemplateRouter::getTemplateCode));
|
||||
return routers.values().stream()
|
||||
.flatMap(e -> {
|
||||
// 模板路由的按钮维度
|
||||
Map<String, List<MessageTemplateRouter>> btnMap = e.stream()
|
||||
.collect(Collectors.groupingBy(MessageTemplateRouter::getName));
|
||||
return btnMap.values().stream().map(RawMessageRouterDTO::from);
|
||||
}).collect(Collectors.toList());
|
||||
private MessageRouteDetailDTO queryDetailRouter(String templateCode) {
|
||||
MessageRouteDetail msgRouteDetail = selectRouteDetail(templateCode);
|
||||
if (Objects.isNull(msgRouteDetail)) {
|
||||
return null;
|
||||
}
|
||||
List<MessageRouterConfig> routerConfigs = listByRouterCode(msgRouteDetail.getTemplateCode());
|
||||
return MessageRouteDetailDTO.from(msgRouteDetail, routerConfigs);
|
||||
}
|
||||
|
||||
private Map<String, MessageRouteDetailDTO> listDetailRoutersGroupingByTemplateCode(Collection<String> templateCodes) {
|
||||
Map<String, MessageRouteDetail> routeDetails = listRouteDetailsGroupingByTemplateCode(templateCodes);
|
||||
if (MapUtil.isEmpty(routeDetails)) {
|
||||
log.info("there is not any route detail. templateCodes:{}", templateCodes);
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Map<String, List<MessageRouterConfig>> routerConfigs = groupingByRouterCode(templateCodes);
|
||||
Map<String, MessageRouteDetailDTO> result = Maps.newHashMap();
|
||||
routeDetails.entrySet().stream()
|
||||
.filter(e -> routerConfigs.containsKey(e.getKey()))
|
||||
.forEach(e -> result.put(e.getKey(), MessageRouteDetailDTO.from(e.getValue(), routerConfigs.get(e.getKey()))));
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<MessageRouteButtonDTO> listButtonRouters(String templateCode) {
|
||||
List<MessageRouteButton> routeButtons = messageRouteButtonDao.lambdaQuery()
|
||||
.eq(MessageRouteButton::getTemplateCode, templateCode)
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(routeButtons)) {
|
||||
log.info("the is not any router button. templateCode:[{}]", templateCode);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<String> btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toList());
|
||||
Map<String, List<MessageRouterConfig>> btnRouterConfigs = groupingByRouterCode(btnCodes);
|
||||
return routeButtons.stream()
|
||||
.map(e -> MessageRouteButtonDTO.from(e, btnRouterConfigs.get(e.getBtnCode())))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Map<String, List<MessageRouteButtonDTO>> listButtonRoutersGroupingByTemplateCode(
|
||||
Collection<String> templateCodes) {
|
||||
List<MessageRouteButton> routeButtons = messageRouteButtonDao.lambdaQuery()
|
||||
.in(MessageRouteButton::getTemplateCode, templateCodes)
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(routeButtons)) {
|
||||
log.info("the is not any router button. templateCodes:{}", templateCodes);
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Set<String> btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toSet());
|
||||
Map<String, List<MessageRouterConfig>> btnRouterConfigs = groupingByRouterCode(btnCodes);
|
||||
return routeButtons.stream()
|
||||
.map(e -> MessageRouteButtonDTO.from(e, btnRouterConfigs.get(e.getBtnCode())))
|
||||
.collect(Collectors.groupingBy(MessageRouteButtonDTO::getTemplateCode));
|
||||
}
|
||||
|
||||
private MessageRouteDetail selectRouteDetail(String templateCode) {
|
||||
List<MessageRouteDetail> msgRouteDetails = messageRouteDetailDao.lambdaQuery()
|
||||
.eq(MessageRouteDetail::getTemplateCode, templateCode)
|
||||
.orderByDesc(MessageRouteDetail::getId)
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(msgRouteDetails)) {
|
||||
return null;
|
||||
}
|
||||
if (msgRouteDetails.size() > 1) {
|
||||
log.warn("there is some dirty data in table:[message_route_detail]");
|
||||
}
|
||||
return msgRouteDetails.get(0);
|
||||
}
|
||||
|
||||
private Map<String, MessageRouteDetail> listRouteDetailsGroupingByTemplateCode(Collection<String> templateCodes) {
|
||||
List<MessageRouteDetail> msgRouteDetails = messageRouteDetailDao.lambdaQuery()
|
||||
.in(MessageRouteDetail::getTemplateCode, templateCodes)
|
||||
.orderByDesc(MessageRouteDetail::getId)
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(msgRouteDetails)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Map<String, List<MessageRouteDetail>> groupingBy = msgRouteDetails.stream()
|
||||
.collect(Collectors.groupingBy(MessageRouteDetail::getTemplateCode));
|
||||
Map<String, MessageRouteDetail> result = Maps.newHashMap();
|
||||
for (List<MessageRouteDetail> elem : groupingBy.values()) {
|
||||
MessageRouteDetail detail = elem.get(0);
|
||||
result.put(detail.getTemplateCode(), detail);
|
||||
if (msgRouteDetails.size() > 1) {
|
||||
log.warn("there is some dirty data in table:[message_route_detail]. templateCode:[{}]",
|
||||
elem.get(0).getTemplateCode());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<MessageRouterConfig> listByRouterCode(String routerCode) {
|
||||
if (StringUtils.isBlank(routerCode)) {
|
||||
log.info("routerCode is blank.");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return messageRouterConfigDao.lambdaQuery()
|
||||
.eq(MessageRouterConfig::getRouterCode, routerCode)
|
||||
.list();
|
||||
}
|
||||
|
||||
private Map<String, List<MessageRouterConfig>> groupingByRouterCode(Collection<String> routerCodes) {
|
||||
if (CollectionUtils.isEmpty(routerCodes)) {
|
||||
log.info("routerCodes is empty.");
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return messageRouterConfigDao.lambdaQuery()
|
||||
.in(MessageRouterConfig::getRouterCode, routerCodes)
|
||||
.list().stream()
|
||||
.collect(Collectors.groupingBy(MessageRouterConfig::getRouterCode));
|
||||
}
|
||||
|
||||
private void saveDetailRouter(MessageRouteDetailDTO detailRouter) {
|
||||
if (Objects.isNull(detailRouter)) {
|
||||
log.info("detailRouter is null.");
|
||||
return;
|
||||
}
|
||||
messageRouteDetailDao.save(detailRouter.fetchMessageRouteDetail());
|
||||
messageRouterConfigDao.saveBatch(detailRouter.fetchMessageRouterConfigs());
|
||||
}
|
||||
|
||||
private void batchSaveButtonRouter(List<MessageRouteButtonDTO> buttonRouters) {
|
||||
if (CollectionUtils.isEmpty(buttonRouters)) {
|
||||
log.info("buttonRouters is empty.");
|
||||
return;
|
||||
}
|
||||
List<MessageRouteButtonWrapper> routeButtonWrappers = buttonRouters.stream()
|
||||
.filter(MessageRouteButtonDTO::isValid)
|
||||
.map(e -> MessageRouteButtonWrapper.of(e.fetchMessageRouteButton(), e))
|
||||
.collect(Collectors.toList());
|
||||
// 生成自定义按钮的唯一标识和顺序
|
||||
buildButtonCodeAndPriority(routeButtonWrappers);
|
||||
// 保存模板对应的按钮路由
|
||||
List<MessageRouteButton> routeButtons = routeButtonWrappers.stream()
|
||||
.map(MessageRouteButtonWrapper::getRouteButton)
|
||||
.collect(Collectors.toList());
|
||||
messageRouteButtonDao.saveBatch(routeButtons);
|
||||
List<MessageRouterConfig> routerConfigs = routeButtonWrappers.stream()
|
||||
.filter(e -> RouterCategoryEnum.JUMP.equals(e.getButtonRouter().getCategory()))
|
||||
.flatMap(this::routerConfigStream)
|
||||
.collect(Collectors.toList());
|
||||
messageRouterConfigDao.saveBatch(routerConfigs);
|
||||
}
|
||||
|
||||
private void buildButtonCodeAndPriority(List<MessageRouteButtonWrapper> routeButtonWrappers) {
|
||||
for (int i = 0; i < routeButtonWrappers.size(); i++) {
|
||||
MessageRouteButton button = routeButtonWrappers.get(i).getRouteButton();
|
||||
if (RouterButtonSourceEnum.CUSTOM.equals(button.getSource())) {
|
||||
// 这里仅对自定义的按钮设置按钮标识
|
||||
button.setBtnCode(UUIDUtil.uuidString());
|
||||
}
|
||||
// 优先级默认从1开始
|
||||
button.setPriority(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
private Stream<MessageRouterConfig> routerConfigStream(MessageRouteButtonWrapper routeButtonWrapper) {
|
||||
// 获取对应按钮的唯一标识
|
||||
String btnCode = routeButtonWrapper.getRouteButton().getBtnCode();
|
||||
// 转化为存储的数据模型
|
||||
List<MessageRouterConfig> routerConfigs = routeButtonWrapper.buttonRouter.fetchMessageRouterConfigs(btnCode);
|
||||
return routerConfigs.stream();
|
||||
}
|
||||
|
||||
private void remove(String templateCode) {
|
||||
if (StringUtils.isBlank(templateCode)) {
|
||||
log.info("===remove=== templateCode is blank.");
|
||||
return;
|
||||
}
|
||||
Set<String> routerCodes = Sets.newHashSet();
|
||||
// 查询对应模板的路由按钮
|
||||
Set<String> btnCodes = messageRouteButtonDao.lambdaQuery()
|
||||
.eq(MessageRouteButton::getTemplateCode, templateCode)
|
||||
.select(MessageRouteButton::getBtnCode)
|
||||
.list().stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isNotEmpty(btnCodes)) {
|
||||
// 逻辑删除该模板对应的路由按钮
|
||||
messageRouteButtonDao.lambdaUpdate().eq(MessageRouteButton::getTemplateCode, templateCode).remove();
|
||||
routerCodes.addAll(btnCodes);
|
||||
}
|
||||
// 逻辑删除业务详情路由
|
||||
boolean result = messageRouteDetailDao.lambdaUpdate()
|
||||
.eq(MessageRouteDetail::getTemplateCode, templateCode)
|
||||
.remove();
|
||||
if (result) {
|
||||
routerCodes.add(templateCode);
|
||||
}
|
||||
if (CollectionUtils.isEmpty(routerCodes)) {
|
||||
return;
|
||||
}
|
||||
// 逻辑删除该模板对应的路由按钮的URL相关配置
|
||||
messageRouterConfigDao.lambdaUpdate().in(MessageRouterConfig::getRouterCode, routerCodes).remove();
|
||||
}
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
private static class MessageRouteButtonWrapper {
|
||||
private MessageRouteButton routeButton;
|
||||
private MessageRouteButtonDTO buttonRouter;
|
||||
|
||||
static MessageRouteButtonWrapper of(MessageRouteButton routeButton, MessageRouteButtonDTO buttonRouter) {
|
||||
return new MessageRouteButtonWrapper(routeButton, buttonRouter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,107 @@
|
||||
package cn.axzo.msg.center.message.service.impl;
|
||||
|
||||
import cn.axzo.msg.center.api.enums.MsgTypeEnum;
|
||||
import cn.axzo.msg.center.dal.MessageRecordDao;
|
||||
import cn.axzo.msg.center.dal.PendingMessageRecordDao;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRecord;
|
||||
import cn.axzo.msg.center.domain.entity.PendingMessageRecord;
|
||||
import cn.axzo.msg.center.domain.enums.YesNoEnum;
|
||||
import cn.axzo.msg.center.message.service.PendingMessageDataInitService;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
import cn.axzo.msg.center.utils.DateFormatUtil;
|
||||
import cn.axzo.msg.center.utils.PersonIdentityUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/17
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class PendingMessageDataInitServiceImpl implements PendingMessageDataInitService {
|
||||
|
||||
private static final PersonDTO SYSTEM = PersonDTO.builder()
|
||||
.id(0L)
|
||||
.name("系统")
|
||||
.identity(IdentityDTO.builder().id(0L).type(IdentityTypeEnum.NOT_SUPPORT).build())
|
||||
.build();
|
||||
|
||||
private final MessageRecordDao messageRecordDao;
|
||||
private final PendingMessageRecordDao pendingMessageRecordDao;
|
||||
|
||||
@Override
|
||||
public void transformPendingMessageRecord(Integer diffDays, Long minRecordId) {
|
||||
LocalDateTime queryFrom = LocalDateTime.now().minusDays(diffDays);
|
||||
Long scrollId = Long.MAX_VALUE;
|
||||
List<MessageRecord> records = messageRecordDao.lambdaQuery()
|
||||
.eq(MessageRecord::getType, MsgTypeEnum.PENDING_MESSAGE)
|
||||
.eq(MessageRecord::getIsDelete, YesNoEnum.NO.getCode())
|
||||
.ge(MessageRecord::getCreateAt, DateFormatUtil.toDate(queryFrom))
|
||||
.between(MessageRecord::getId, minRecordId, scrollId)
|
||||
.orderByDesc(MessageRecord::getId)
|
||||
.list();
|
||||
while (!records.isEmpty()) {
|
||||
batchSavePendingMessage(records);
|
||||
scrollId = records.stream().min(Comparator.comparing(MessageRecord::getId))
|
||||
.map(MessageRecord::getId).orElse(0L);
|
||||
records = messageRecordDao.lambdaQuery()
|
||||
.eq(MessageRecord::getType, MsgTypeEnum.PENDING_MESSAGE)
|
||||
.eq(MessageRecord::getIsDelete, YesNoEnum.NO.getCode())
|
||||
.ge(MessageRecord::getCreateAt, DateFormatUtil.toDate(queryFrom))
|
||||
.between(MessageRecord::getId, minRecordId, scrollId)
|
||||
.orderByDesc(MessageRecord::getId)
|
||||
.list();
|
||||
}
|
||||
}
|
||||
|
||||
private void batchSavePendingMessage(List<MessageRecord> records) {
|
||||
// TODO: [zuoqinbo]
|
||||
}
|
||||
|
||||
private PendingMessageRecord convert(MessageRecord record) {
|
||||
PendingMessageRecord pendingMsgRecord = new PendingMessageRecord();
|
||||
pendingMsgRecord.setPromoterPersonId(SYSTEM.getId());
|
||||
pendingMsgRecord.setPromoterId(SYSTEM.getIdentity().getId());
|
||||
pendingMsgRecord.setPromoterType(SYSTEM.getIdentity().getType());
|
||||
pendingMsgRecord.setPromoterName(SYSTEM.getName());
|
||||
pendingMsgRecord.setExecutorPersonId(record.getPersonId());
|
||||
pendingMsgRecord.setExecutorId(record.getToId());
|
||||
pendingMsgRecord.setExecutorType(PersonIdentityUtil.toIdentityType(record.getReceiveType()));
|
||||
pendingMsgRecord.setTemplateCode(getTemplateCode(record.getRelationId()));
|
||||
pendingMsgRecord.setTitle(record.getTitle());
|
||||
pendingMsgRecord.setContent(record.getContent());
|
||||
pendingMsgRecord.setOrgType(OrganizationTypeEnum.valueOf(record.getTerminalType().name()));
|
||||
pendingMsgRecord.setOrgId(record.getTerminalId());
|
||||
pendingMsgRecord.setOrgName(record.getTerminalName());
|
||||
pendingMsgRecord.setState(PendingMessageStateEnum.codeOf(record.getState().getCode()));
|
||||
if (Objects.nonNull(record.getBizId()) && record.getBizId() > 0L) {
|
||||
pendingMsgRecord.setBizCode(String.valueOf(record.getBizId()));
|
||||
}
|
||||
pendingMsgRecord.setRouterParams(record.getRouterParams());
|
||||
pendingMsgRecord.setBizExtParam(record.getExtra());
|
||||
pendingMsgRecord.setOuId(record.getTenantId());
|
||||
pendingMsgRecord.setBizCategory(BizCategoryEnum.OTHER);
|
||||
pendingMsgRecord.setFailCause(String.valueOf(record.getId()));
|
||||
return pendingMsgRecord;
|
||||
}
|
||||
|
||||
private String getTemplateCode(Long relationId) {
|
||||
// TODO: [zuoqinbo]
|
||||
// 需要通过映射表获取 https://alidocs.dingtalk.com/i/nodes/YndMj49yWj7q1dB9h793q5dKV3pmz5aA?iframeQuery=utm_source%3Dportal%26utm_medium%3Dportal_recent
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@ -1,39 +1,47 @@
|
||||
package cn.axzo.msg.center.message.service.impl;
|
||||
|
||||
import cn.axzo.apollo.core.web.Result;
|
||||
import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi;
|
||||
import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes;
|
||||
import cn.axzo.msg.center.common.enums.TableIsDeleteEnum;
|
||||
import cn.axzo.msg.center.common.exception.ServiceException;
|
||||
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
|
||||
import cn.axzo.msg.center.dal.PendingMessageRecordDao;
|
||||
import cn.axzo.msg.center.domain.entity.PendingMessageRecord;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
|
||||
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
|
||||
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateGroupService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
|
||||
import cn.axzo.msg.center.message.service.PendingMessageNewService;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.dto.QueryOrderByDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
|
||||
import cn.axzo.msg.center.utils.JSONObjectUtil;
|
||||
import cn.axzo.msg.center.utils.MessageCardUtil;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import cn.axzo.msg.center.utils.OrderFieldParseUtil;
|
||||
import cn.axzo.msg.center.utils.TreeHelperUtil;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
@ -47,7 +55,6 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
@ -69,27 +76,67 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
private final MessageGroupNodeService messageGroupNodeService;
|
||||
private final MessageTemplateNewService messageTemplateNewService;
|
||||
private final MessageTemplateGroupService messageTemplateGroupService;
|
||||
private final WorkspaceApi workspaceApi;
|
||||
|
||||
@Override
|
||||
public List<MessageGroupNodeStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param) {
|
||||
return param.getGroupNodeCodes().stream()
|
||||
.flatMap(e -> statistic(e, param).stream())
|
||||
public List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param) {
|
||||
List<String> groupTreeRootNodeCodes = messageGroupNodeService
|
||||
.listGroupTreeRootNodeCodes(MessageGroupCategoryEnum.PENDING, param.getTerminalType());
|
||||
List<GroupTreeNodePathDTO> leafNodePaths = messageGroupNodeService.leafGroupNodeCodePathsByRootNodeCodes(groupTreeRootNodeCodes);
|
||||
return leafNodePaths.parallelStream()
|
||||
.map(e -> statistic(e, param))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer countUncompleted(MessageGroupNodeStatisticParam param) {
|
||||
List<String> groupTreeRootNodeCodes = messageGroupNodeService
|
||||
.listGroupTreeRootNodeCodes(MessageGroupCategoryEnum.PENDING, param.getTerminalType());
|
||||
List<GroupTreeNodePathDTO> leafNodePaths = messageGroupNodeService.leafGroupNodeCodePathsByRootNodeCodes(groupTreeRootNodeCodes);
|
||||
return doStatistic(leafNodePaths, param);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer countUncompleted(Long personId, Collection<Long> templateIds) {
|
||||
if (Objects.isNull(personId) || CollectionUtils.isEmpty(templateIds)) {
|
||||
log.info("the personId is null or templateIds is empty. personId:[{}], templateIds:{}", personId, templateIds);
|
||||
return 0;
|
||||
}
|
||||
List<String> templateCodes = messageTemplateNewService.listTemplateCodesByIds(templateIds);
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
log.info("the templateCodes is empty. templateIds:{}", templateIds);
|
||||
return 0;
|
||||
}
|
||||
PersonDTO operator = PersonDTO.builder().id(personId).build();
|
||||
LambdaQueryChainWrapper<PendingMessageRecord> query = pendingMessageRecordDao.lambdaQuery()
|
||||
.in(PendingMessageRecord::getTemplateCode, templateCodes)
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT);
|
||||
buildPersonCondition(query, false, PendingMessageRoleCategoryEnum.EXECUTOR, operator);
|
||||
return query.count();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<PendingMessageResponse> pageQuery(PendingMessagePageRequest request) {
|
||||
PersonDTO operator = PersonDTO.from(request.getPersonId(), request.getIdentityId(), request.getIdentityType());
|
||||
PendingMessageStateEnum pendingMessageState = fetchPendingMessageState(request.getRoleCategory(), request.getMsgState());
|
||||
BizFinalStateEnum bizFinalState = fetchBizFinalState(request.getRoleCategory(), request.getBizFinalState());
|
||||
// 开始构建分页查询条件
|
||||
LambdaQueryChainWrapper<PendingMessageRecord> query = pendingMessageRecordDao.lambdaQuery()
|
||||
.eq(Objects.nonNull(request.getMsgState()), PendingMessageRecord::getState, request.getMsgState())
|
||||
.like(StringUtils.isNotBlank(request.getTitle()), PendingMessageRecord::getTitle, request.getTitle())
|
||||
.eq(PendingMessageRecord::getIsDelete, 0);
|
||||
.eq(Objects.nonNull(pendingMessageState), PendingMessageRecord::getState, pendingMessageState)
|
||||
.eq(Objects.nonNull(bizFinalState), PendingMessageRecord::getBizFinalState, bizFinalState)
|
||||
.eq(Objects.nonNull(request.getWorkspaceId()), PendingMessageRecord::getOrgId, request.getWorkspaceId());
|
||||
if (StringUtils.isNotBlank(request.getTitle())) {
|
||||
query.and(v -> v.like(PendingMessageRecord::getTitle, request.getTitle())
|
||||
.or().like(PendingMessageRecord::getPromoterName, request.getTitle()));
|
||||
}
|
||||
// 构建人维度的查询条件
|
||||
buildPersonCondition(query, request.getWithIdentify(), request.getRoleCategory(), operator);
|
||||
// 模板的分类,对代办进行分组过滤
|
||||
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
|
||||
List<String> templateCodes = messageTemplateGroupService
|
||||
.listMessageTemplateCodes(request.getGroupNodeCode());
|
||||
Optional<GroupTreeNodePathDTO> nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode());
|
||||
List<String> templateCodes = nodePath
|
||||
.map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath())))
|
||||
.orElseGet(Collections::emptyList);
|
||||
query.in(CollectionUtils.isNotEmpty(templateCodes), PendingMessageRecord::getTemplateCode, templateCodes);
|
||||
}
|
||||
// 构建排序条件
|
||||
@ -101,11 +148,23 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
.collect(Collectors.toList());
|
||||
List<MessageTemplateDTO> messageTemplates = messageTemplateNewService.listByTemplateCodes(templateCodes);
|
||||
List<PendingMessageResponse> responseRecords = result.getRecords().stream()
|
||||
.map(e -> convert(e, request.getTerminalType(), messageTemplates).toResponse())
|
||||
.map(e -> convert(e, messageTemplates).toResponse(request.getTerminalType()))
|
||||
.collect(Collectors.toList());
|
||||
return Page.toPage(request.getPage(), request.getPageSize(), result.getTotal(), responseRecords);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PendingMessageResponse query(PendingMessageQueryRequest request) {
|
||||
return pendingMessageRecordDao.queryByIdentityCode(request.getMsgIdentityCode())
|
||||
.filter(v -> filter(v, request))
|
||||
.map(v -> {
|
||||
List<MessageTemplateDTO> messageTemplates = messageTemplateNewService
|
||||
.listByTemplateCodes(Lists.newArrayList(v.getTemplateCode()));
|
||||
return convert(v, messageTemplates).toResponse(request.getTerminalType());
|
||||
})
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<PendingMessageDTO> detail(String msgIdentityCode, TerminalTypeEnum terminalType) {
|
||||
if (StringUtils.isBlank(msgIdentityCode)) {
|
||||
@ -119,111 +178,163 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
}
|
||||
List<MessageTemplateDTO> messageTemplates = messageTemplateNewService
|
||||
.listByTemplateCodes(Lists.newArrayList(record.getTemplateCode()));
|
||||
return pendingMessageRecordDao.queryByIdentityCode(msgIdentityCode)
|
||||
.map(v -> convert(v, terminalType, messageTemplates));
|
||||
return Optional.of(convert(record, messageTemplates));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String push(PendingMessagePushParam param) {
|
||||
public List<PushPendingMessageDTO> push(PendingMessagePushParam param) {
|
||||
MessageTemplateDTO msgTemplate = messageTemplateNewService
|
||||
.queryByTemplateCode(param.getTemplateCode())
|
||||
.orElseThrow(() -> new ServiceException("not found message template."));
|
||||
PendingMessageRecord record = convert(param, msgTemplate);
|
||||
pendingMessageRecordDao.save(record);
|
||||
return record.getIdentityCode();
|
||||
// 生成requestNo
|
||||
String requestNo = UUIDUtil.uuidString();
|
||||
// 查询工作台信息
|
||||
SimpleWorkspaceRes workspace = null;
|
||||
Long workspaceId = param.getWorkspaceId();
|
||||
Result<SimpleWorkspaceRes> workspaceRes = workspaceApi.getOne(workspaceId);
|
||||
if (200 == workspaceRes.getCode()) {
|
||||
workspace = workspaceRes.getData();
|
||||
} else {
|
||||
log.info("未查询到工作台信息 workspaceId:{}", workspaceId);
|
||||
}
|
||||
List<PendingMessageRecord> record = convert(param, msgTemplate, requestNo, workspace);
|
||||
pendingMessageRecordDao.saveBatch(record);
|
||||
// TODO 消息推送 @luofu
|
||||
return record.stream().map(e -> PushPendingMessageDTO.builder()
|
||||
.id(e.getId())
|
||||
.executorId(e.getExecutorId())
|
||||
.executorPersonId(e.getExecutorPersonId())
|
||||
.requestNo(e.getRequestNo())
|
||||
.build()).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean complete(String msgIdentityCode) {
|
||||
if (StringUtils.isBlank(msgIdentityCode)) {
|
||||
log.warn("the message identity code is blank.");
|
||||
public Boolean complete(String requestNo) {
|
||||
if (StringUtils.isBlank(requestNo)) {
|
||||
log.warn("the message requestNo is blank.");
|
||||
return false;
|
||||
}
|
||||
log.info("the [{}] record is updated complete.", msgIdentityCode);
|
||||
log.info("the [{}] record is updated complete.", requestNo);
|
||||
return pendingMessageRecordDao.lambdaUpdate()
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.COMPLETED)
|
||||
.eq(PendingMessageRecord::getIdentityCode, msgIdentityCode)
|
||||
.eq(PendingMessageRecord::getRequestNo, requestNo)
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT)
|
||||
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean revoke(String msgIdentityCode) {
|
||||
if (StringUtils.isBlank(msgIdentityCode)) {
|
||||
log.warn("the message identity code is blank.");
|
||||
return false;
|
||||
}
|
||||
log.info("the [{}] record is updated retract.", msgIdentityCode);
|
||||
public Boolean completeById(CompletePendingMessageByIdRequest param) {
|
||||
log.info("the [{}] record is updated complete by id.", param);
|
||||
return pendingMessageRecordDao.lambdaUpdate()
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.RETRACT)
|
||||
.eq(PendingMessageRecord::getIdentityCode, msgIdentityCode)
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.COMPLETED)
|
||||
.eq(PendingMessageRecord::getId, param.getId())
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT)
|
||||
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.update();
|
||||
}
|
||||
|
||||
private PendingMessageDTO convert(PendingMessageRecord pendingMessageRecord, TerminalTypeEnum terminalType,
|
||||
List<MessageTemplateDTO> messageTemplates) {
|
||||
PendingMessageDTO pendingMessage = PendingMessageDTO.from(pendingMessageRecord);
|
||||
// 对应模板的路由列表
|
||||
List<RawMessageRouterDTO> rawRouters = messageTemplates.stream()
|
||||
.filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode()))
|
||||
.findFirst()
|
||||
.map(MessageTemplateDTO::getRouters)
|
||||
.orElseGet(Collections::emptyList);
|
||||
List<MessageRouterDTO> routers = rawRouters.stream()
|
||||
.map(e -> {
|
||||
MessageRouterDTO router = e.toMessageRouter(terminalType);
|
||||
// 视情况替换原始URL中的参数变量
|
||||
MessageRouterUtil.parseRouteUrl(router, pendingMessageRecord.getRouterParams());
|
||||
return router;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
pendingMessage.setRouters(routers);
|
||||
// 获取模板卡片信息
|
||||
String cardContent = messageTemplates.stream()
|
||||
.filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode()))
|
||||
.findFirst()
|
||||
.map(e -> JSON.toJSONString(e.toCardContentMap()))
|
||||
.orElse(null);
|
||||
if (StringUtils.isNotBlank(cardContent) && StringUtils.isNotBlank(pendingMessageRecord.getRouterParams())) {
|
||||
cardContent = PlaceholderResolver.getDefaultResolver()
|
||||
.resolveByMap(cardContent, JSON.parseObject(pendingMessageRecord.getRouterParams()));
|
||||
@Override
|
||||
public Boolean revoke(String requestNo) {
|
||||
if (StringUtils.isBlank(requestNo)) {
|
||||
log.warn("the message requestNo is blank.");
|
||||
return false;
|
||||
}
|
||||
pendingMessage.setCardContent(cardContent);
|
||||
log.info("the [{}] record is updated retract.", requestNo);
|
||||
return pendingMessageRecordDao.lambdaUpdate()
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.RETRACT)
|
||||
.eq(PendingMessageRecord::getRequestNo, requestNo)
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT)
|
||||
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean completeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
log.info("the [{}] record is completeByTemplateCodeBizCode retract.", param);
|
||||
return pendingMessageRecordDao.lambdaUpdate()
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.COMPLETED)
|
||||
.eq(PendingMessageRecord::getTemplateCode, param.getTemplateCode())
|
||||
.eq(PendingMessageRecord::getBizCode, param.getBizCode())
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT)
|
||||
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean revokeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
log.info("the [{}] record is revokeByTemplateCodeBizCode retract.", param);
|
||||
return pendingMessageRecordDao.lambdaUpdate()
|
||||
.set(PendingMessageRecord::getState, PendingMessageStateEnum.RETRACT)
|
||||
.eq(PendingMessageRecord::getTemplateCode, param.getTemplateCode())
|
||||
.eq(PendingMessageRecord::getBizCode, param.getBizCode())
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT)
|
||||
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.update();
|
||||
}
|
||||
|
||||
private PendingMessageDTO convert(PendingMessageRecord pendingMessageRecord, List<MessageTemplateDTO> messageTemplates) {
|
||||
PendingMessageDTO pendingMessage = PendingMessageDTO.from(pendingMessageRecord);
|
||||
// 对应模板的路由策略
|
||||
MessageTemplateRouterDTO msgTemplateRouter = messageTemplates.stream()
|
||||
.filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode()))
|
||||
.findFirst()
|
||||
.map(MessageTemplateDTO::getMsgTemplateRouter)
|
||||
.orElse(null);
|
||||
// 解析并替换掉路由地址中的动态参数变量
|
||||
msgTemplateRouter = MessageRouterUtil
|
||||
.parseAndConcatRouteUrl(msgTemplateRouter, JSONObjectUtil.parseObject(pendingMessageRecord.getRouterParams()));
|
||||
pendingMessage.setMsgTemplateRouter(msgTemplateRouter);
|
||||
// 获取模板卡片信息
|
||||
List<MessageCardContentItemDTO> msgCardContentItems = messageTemplates.stream()
|
||||
.filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode()))
|
||||
.findFirst()
|
||||
.map(MessageTemplateDTO::getMsgCardContentItems)
|
||||
.orElse(null);
|
||||
// 解析并替换卡片信息里面的动态参数变量
|
||||
msgCardContentItems = MessageCardUtil.parseMessageCard(msgCardContentItems, pendingMessageRecord.getBizExtParam());
|
||||
pendingMessage.setCardItems(msgCardContentItems);
|
||||
// TODO: [cold_blade] [P0] 业务终态图标url
|
||||
return pendingMessage;
|
||||
}
|
||||
|
||||
private List<MessageGroupNodeStatisticDTO> statistic(String rootNodeCode, MessageGroupNodeStatisticParam param) {
|
||||
GroupTreeNodeDTO rootNode = messageGroupNodeService.queryRootNode(rootNodeCode)
|
||||
.orElseThrow(() -> new ServiceException("groupNodeCode is invalid."));
|
||||
MessageGroupNodeStatisticDTO rootWrapper = TreeHelperUtil.wrapper(rootNode, MessageGroupNodeStatisticDTO::of);
|
||||
LinkedList<MessageGroupNodeStatisticDTO> stack = new LinkedList<>();
|
||||
stack.push(rootWrapper);
|
||||
MessageGroupNodeStatisticDTO wrapper;
|
||||
while (!stack.isEmpty()) {
|
||||
wrapper = stack.pop();
|
||||
statistic(wrapper, param);
|
||||
stack.addAll(wrapper.getNodeChildren());
|
||||
}
|
||||
// 外部传的是根节点,但是前端希望只返回根节点的字节的
|
||||
return rootWrapper.getNodeChildren();
|
||||
private PendingMessageStatisticDTO statistic(GroupTreeNodePathDTO leafNodePath, MessageGroupNodeStatisticParam param) {
|
||||
PendingMessageStatisticDTO dto = PendingMessageStatisticDTO.of(leafNodePath);
|
||||
dto.setPendingCount(doStatistic(leafNodePath, param));
|
||||
return dto;
|
||||
}
|
||||
|
||||
private void statistic(MessageGroupNodeStatisticDTO groupNode, MessageGroupNodeStatisticParam param) {
|
||||
List<String> templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNode.getNodeCode());
|
||||
private int doStatistic(GroupTreeNodePathDTO leafNodePath, MessageGroupNodeStatisticParam param) {
|
||||
return doStatistic(Lists.newArrayList(leafNodePath), param);
|
||||
}
|
||||
|
||||
private int doStatistic(Collection<GroupTreeNodePathDTO> groupNodePaths, MessageGroupNodeStatisticParam param) {
|
||||
List<String> groupNodePathCodes = groupNodePaths.stream()
|
||||
.map(GroupTreeNodePathDTO::getNodeCodePath)
|
||||
.collect(Collectors.toList());
|
||||
List<String> templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNodePathCodes);
|
||||
if (CollectionUtils.isEmpty(templateCodes)) {
|
||||
groupNode.setPendingCount(0);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
LambdaQueryChainWrapper<PendingMessageRecord> query = pendingMessageRecordDao.lambdaQuery()
|
||||
.in(PendingMessageRecord::getTemplateCode, templateCodes)
|
||||
.like(StringUtils.isNotBlank(param.getTitle()), PendingMessageRecord::getTitle, param.getTitle())
|
||||
.eq(Objects.nonNull(param.getMsgState()), PendingMessageRecord::getState, param.getMsgState())
|
||||
.eq(PendingMessageRecord::getIsDelete, 0);
|
||||
buildPersonCondition(query, param.getWithIdentify(), param.getRoleCategory(), param.getOperator());
|
||||
groupNode.setPendingCount(query.count());
|
||||
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT);
|
||||
buildPersonCondition(query, param.getWithIdentify(), PendingMessageRoleCategoryEnum.EXECUTOR, param.getOperator());
|
||||
return query.count();
|
||||
}
|
||||
|
||||
private PendingMessageStateEnum fetchPendingMessageState(PendingMessageRoleCategoryEnum roleCategory,
|
||||
PendingMessageStateEnum pendingMessageState) {
|
||||
// 当且仅当查询的角色不为发起者时,待办状态参数才有意义
|
||||
return PendingMessageRoleCategoryEnum.PROMOTER.equals(roleCategory) ? null : pendingMessageState;
|
||||
}
|
||||
|
||||
private BizFinalStateEnum fetchBizFinalState(PendingMessageRoleCategoryEnum roleCategory, BizFinalStateEnum bizFinalState) {
|
||||
// 当且仅当查询的角色为发起者时,业务终态参数才有意义
|
||||
return Optional.ofNullable(roleCategory)
|
||||
.filter(PendingMessageRoleCategoryEnum.PROMOTER::equals)
|
||||
.map(v -> bizFinalState)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
private void buildPersonCondition(LambdaQueryChainWrapper<PendingMessageRecord> query, Boolean withIdentify,
|
||||
@ -257,6 +368,8 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
private void buildSortCondition(LambdaQueryChainWrapper<PendingMessageRecord> query,
|
||||
Collection<QueryOrderByDTO> orderFields) {
|
||||
if (CollectionUtils.isEmpty(orderFields)) {
|
||||
// 默认时间降序
|
||||
query.orderByDesc(PendingMessageRecord::getId);
|
||||
return;
|
||||
}
|
||||
orderFields.stream()
|
||||
@ -270,43 +383,52 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
});
|
||||
}
|
||||
|
||||
private PendingMessageRecord convert(PendingMessagePushParam param, MessageTemplateDTO msgTemplate) {
|
||||
PendingMessageRecord record = new PendingMessageRecord();
|
||||
record.setIdentityCode(UUIDUtil.uuidString());
|
||||
record.setState(PendingMessageStateEnum.HAS_BEEN_SENT);
|
||||
// 构建代办记录的人维度的相关信息
|
||||
buildPersonInfo(record, param.getPromoter(), param.getExecutor());
|
||||
// 构建模板信息
|
||||
buildTemplateInfo(record, msgTemplate, param.getRouterParams());
|
||||
// 构建代办所属企业/项目等相关信息
|
||||
record.setOrgType(Objects.isNull(param.getOrgType()) ? OrganizationTypeEnum.UNKNOWN : param.getOrgType());
|
||||
record.setOrgId(param.getOrgId());
|
||||
record.setOrgName(param.getOrgName());
|
||||
// 构建业务类信息
|
||||
buildBusinessInfo(record, param);
|
||||
return record;
|
||||
private List<PendingMessageRecord> convert(PendingMessagePushParam param, MessageTemplateDTO msgTemplate,
|
||||
String requestNo, SimpleWorkspaceRes workspace) {
|
||||
// 多个执行者生成多条record
|
||||
return param.getExecutor().stream().map(executor -> {
|
||||
PendingMessageRecord record = new PendingMessageRecord();
|
||||
record.setOuId(param.getOuId());
|
||||
record.setIdentityCode(UUIDUtil.uuidString());
|
||||
record.setRequestNo(requestNo);
|
||||
record.setState(PendingMessageStateEnum.HAS_BEEN_SENT);
|
||||
// 构建代办记录的人维度的相关信息
|
||||
buildPersonInfo(record, param.getPromoter(), executor);
|
||||
// 构建模板信息
|
||||
buildTemplateInfo(record, msgTemplate, param.getBizExtParams());
|
||||
// 构建代办所属企业/项目等相关信息
|
||||
record.setOrgType(Objects.isNull(param.getOrgType()) ? OrganizationTypeEnum.UNKNOWN : param.getOrgType());
|
||||
record.setOrgId(param.getWorkspaceId());
|
||||
if (workspace != null) {
|
||||
record.setOrgName(workspace.getName());
|
||||
}
|
||||
// 构建业务类信息
|
||||
buildBusinessInfo(record, param);
|
||||
return record;
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private void buildPersonInfo(PendingMessageRecord record, PersonDTO promoter, PersonDTO executor) {
|
||||
record.setPromoterId(promoter.getIdentity().getId());
|
||||
record.setPromoterType(promoter.getIdentity().getType());
|
||||
record.setPromoterPersonId(promoter.getId());
|
||||
record.setPromoterName(promoter.getName());
|
||||
record.setExecutorId(executor.getIdentity().getId());
|
||||
record.setExecutorType(executor.getIdentity().getType());
|
||||
record.setExecutorPersonId(executor.getId());
|
||||
record.setExecutorName(executor.getName());
|
||||
|
||||
}
|
||||
|
||||
private void buildTemplateInfo(PendingMessageRecord record, MessageTemplateDTO msgTemplate, String routeParam) {
|
||||
// TODO:[cold_blade] [P3] 后续其它业务对接的时候,需要明确业务扩展字段和路由参数的分界
|
||||
JSONObject routerParamObj = JSONObjectUtil.parseObject(routeParam);
|
||||
private void buildTemplateInfo(PendingMessageRecord record, MessageTemplateDTO msgTemplate, String bizParam) {
|
||||
JSONObject bizExtParam = JSONObjectUtil.parseObject(bizParam);
|
||||
String title = PlaceholderResolver
|
||||
.getDefaultResolver().resolveByMap(msgTemplate.getTitle(), routerParamObj);
|
||||
.getDefaultResolver().resolveByMap(msgTemplate.getTitle(), bizExtParam);
|
||||
String content = PlaceholderResolver
|
||||
.getDefaultResolver().resolveByMap(msgTemplate.getContent(), routerParamObj);
|
||||
.getDefaultResolver().resolveByMap(msgTemplate.getContent(), bizExtParam);
|
||||
record.setTitle(title);
|
||||
record.setContent(content);
|
||||
record.setTemplateCode(msgTemplate.getCode());
|
||||
record.setRouterParams(routerParamObj.toJSONString());
|
||||
}
|
||||
|
||||
private void buildBusinessInfo(PendingMessageRecord record, PendingMessagePushParam param) {
|
||||
@ -315,10 +437,26 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
|
||||
record.setBizDesc(param.getBizDesc());
|
||||
record.setBizCategory(param.getBizCategory());
|
||||
record.setBizExtParam(JSONObjectUtil.checkAndReturn(param.getBizExtParams()));
|
||||
record.setRouterParams(JSONObjectUtil.checkAndReturn(param.getRouterParams()));
|
||||
record.setBizFlag(param.getBizFlag());
|
||||
record.setBizFinalState(param.getBizFinalState());
|
||||
record.setDeadline(param.getDeadline());
|
||||
}
|
||||
|
||||
private static class GroupTreeNodeWrapper {
|
||||
private GroupTreeNodeDTO treeNode;
|
||||
private int pendingCnt;
|
||||
private boolean filter(PendingMessageRecord pendingMessage, PendingMessageQueryRequest request) {
|
||||
if (Objects.nonNull(request.getBizFinalState())
|
||||
&& !request.getBizFinalState().equals(pendingMessage.getBizFinalState())) {
|
||||
return false;
|
||||
}
|
||||
if (Objects.nonNull(request.getMsgState())
|
||||
&& !request.getMsgState().equals(pendingMessage.getState())) {
|
||||
return false;
|
||||
}
|
||||
if (StringUtils.isNotBlank(request.getTitle())
|
||||
&& !pendingMessage.getTitle().contains(request.getTitle())) {
|
||||
return false;
|
||||
}
|
||||
return Objects.isNull(request.getWorkspaceId())
|
||||
|| Objects.equals(request.getWorkspaceId(), pendingMessage.getOrgId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,19 +12,19 @@ import cn.axzo.msg.center.domain.entity.RelationTemplateMap;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageRelationService;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageRouterService;
|
||||
import cn.axzo.msg.center.inside.notices.service.MessageTemplateService;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouterConfigDTO;
|
||||
import cn.axzo.msg.center.message.domain.param.RelationTemplateMapInitParam;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateGroupService;
|
||||
import cn.axzo.msg.center.message.service.MessageTemplateRouterService;
|
||||
import cn.axzo.msg.center.message.service.RelationTemplateMapService;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO;
|
||||
import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
|
||||
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.utils.JSONObjectUtil;
|
||||
import cn.axzo.msg.center.utils.MessageRouterUtil;
|
||||
import cn.axzo.msg.center.utils.UUIDUtil;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -145,9 +145,10 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic
|
||||
// 批量插入
|
||||
messageBaseTemplateDao.saveBatch(wrappers.stream()
|
||||
.map(CreateNewTemplateAndMapWrapper::getBaseTemplate).collect(Collectors.toList()));
|
||||
messageTemplateRouterService.batchInsert(wrappers.stream()
|
||||
.filter(e -> CollectionUtils.isNotEmpty(e.getRouters()))
|
||||
.flatMap(e -> e.getRouters().stream()).collect(Collectors.toList()));
|
||||
// TODO: [cold_blade] P0
|
||||
// messageTemplateRouterService.batchInsert(wrappers.stream()
|
||||
// .filter(e -> CollectionUtils.isNotEmpty(e.getRouters()))
|
||||
// .flatMap(e -> e.getRouters().stream()).collect(Collectors.toList()));
|
||||
List<String> groupNodes = Lists.newArrayList(param.getGroupNodeCode());
|
||||
Map<String, List<String>> templateGroupNodeMap = wrappers.stream()
|
||||
.map(CreateNewTemplateAndMapWrapper::getBaseTemplate)
|
||||
@ -170,12 +171,28 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic
|
||||
.relationId(relationId)
|
||||
.build();
|
||||
if (CollectionUtils.isNotEmpty(routers)) {
|
||||
wrapper.setRouters(Lists.newArrayList(
|
||||
RawMessageRouterDTO.from(convert(routers), baseTemplate.getCode())));
|
||||
wrapper.setMsgTemplateRouter(convert2MessageTemplateRouter(routers, baseTemplate.getCode()));
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
private MessageTemplateRouterDTO convert2MessageTemplateRouter(List<MessageRouter> routers, String templateCode) {
|
||||
List<MessageRouterConfigDTO> routerConfigs = routers.stream()
|
||||
.map(e -> MessageRouterConfigDTO.builder()
|
||||
.routerCode(templateCode)
|
||||
.terminalType(TerminalTypeEnum.codeOf(e.getRouterType().getCode()))
|
||||
.url(e.getRouterUrl())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
MessageRouteDetailDTO detailRouter = MessageRouteDetailDTO.builder()
|
||||
.name(MessageRouterUtil.DETAIL_ROUTER_DESC)
|
||||
.templateCode(templateCode)
|
||||
.showStrategy(BizDetailShowStrategyEnum.JUMP_TO)
|
||||
.routerConfigs(routerConfigs)
|
||||
.build();
|
||||
return MessageTemplateRouterDTO.builder().routeDetail(detailRouter).build();
|
||||
}
|
||||
|
||||
private MessageBaseTemplate convert(MessageTemplate srcTemplate) {
|
||||
MessageBaseTemplate template = new MessageBaseTemplate();
|
||||
template.setCode(UUIDUtil.uuidString());
|
||||
@ -190,22 +207,6 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic
|
||||
return template;
|
||||
}
|
||||
|
||||
private MessageRouterButtonDTO convert(List<MessageRouter> routers) {
|
||||
return MessageRouterButtonDTO.builder()
|
||||
.style(Lists.newArrayList(ButtonStyleEnum.values()))
|
||||
.desc("查看详情")
|
||||
.category(RouterCategoryEnum.DETAIL)
|
||||
.terminals(routers.stream().map(this::convert).collect(Collectors.toList()))
|
||||
.build();
|
||||
}
|
||||
|
||||
private MessageRouterTerminalDTO convert(MessageRouter router) {
|
||||
return MessageRouterTerminalDTO.builder()
|
||||
.url(router.getRouterUrl())
|
||||
.terminalType(TerminalTypeEnum.codeOf(router.getRouterType().getCode()))
|
||||
.build();
|
||||
}
|
||||
|
||||
private Set<Long> getAllOriginalRelationIds() {
|
||||
return relationTemplateMapDao.lambdaQuery()
|
||||
.select(RelationTemplateMap::getOriginalRelationId)
|
||||
@ -220,6 +221,6 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic
|
||||
private static class CreateNewTemplateAndMapWrapper {
|
||||
private Long relationId;
|
||||
private MessageBaseTemplate baseTemplate;
|
||||
private List<RawMessageRouterDTO> routers;
|
||||
private MessageTemplateRouterDTO msgTemplateRouter;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
@ -21,13 +22,23 @@ import java.util.Optional;
|
||||
public final class DateFormatUtil {
|
||||
|
||||
public static LocalDateTime toLocalDateTime(Date date) {
|
||||
if (Objects.isNull(date)) {
|
||||
return null;
|
||||
}
|
||||
ZoneId zoneId = ZoneId.systemDefault();
|
||||
return date.toInstant().atZone(zoneId).toLocalDateTime();
|
||||
}
|
||||
|
||||
public static long toTimestamp(LocalDateTime dateTime) {
|
||||
public static Long toTimestamp(LocalDateTime dateTime) {
|
||||
return Optional.ofNullable(dateTime)
|
||||
.map(v -> v.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli())
|
||||
.orElse(0L);
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public static Date toDate(LocalDateTime dateTime) {
|
||||
return Optional.ofNullable(dateTime)
|
||||
.map(v -> toTimestamp(dateTime))
|
||||
.map(Date::new)
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
package cn.axzo.msg.center.utils;
|
||||
|
||||
import cn.axzo.msg.center.common.utils.BeanConvertUtils;
|
||||
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息卡片信息工具方法
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/10
|
||||
* @version 1.0
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class MessageCardUtil {
|
||||
|
||||
/**
|
||||
* 解析模板上配置的卡片信息,并替换其中的动态参数
|
||||
*
|
||||
* @param msgCardContentItems 路由信息
|
||||
* @param bizExtParamStr 业务扩展参数
|
||||
* @return List<MessageCardContentItemDTO>
|
||||
*/
|
||||
public static List<MessageCardContentItemDTO> parseMessageCard(List<MessageCardContentItemDTO> msgCardContentItems,
|
||||
String bizExtParamStr) {
|
||||
if (CollectionUtils.isNotEmpty(msgCardContentItems) && StringUtils.isNotBlank(bizExtParamStr)) {
|
||||
JSONObject bizExtParam = JSON.parseObject(bizExtParamStr);
|
||||
// 复制一个副本,避免直接修改
|
||||
msgCardContentItems = BeanConvertUtils.copyList(msgCardContentItems, MessageCardContentItemDTO.class);
|
||||
msgCardContentItems.forEach(e -> {
|
||||
String modifiedValue = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getValue(), bizExtParam);
|
||||
e.setValue(modifiedValue);
|
||||
});
|
||||
}
|
||||
return msgCardContentItems;
|
||||
}
|
||||
}
|
||||
@ -1,22 +1,34 @@
|
||||
package cn.axzo.msg.center.utils;
|
||||
|
||||
import cn.axzo.msg.center.common.utils.BeanConvertUtils;
|
||||
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
|
||||
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO;
|
||||
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouterConfigDTO;
|
||||
import cn.axzo.msg.center.service.dto.ButtonRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.DetailRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
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.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -30,93 +42,141 @@ import java.util.stream.Collectors;
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class MessageRouterUtil {
|
||||
|
||||
// 非法路由参数的定义
|
||||
private static final String INVALID_ROUTER_PARAM = "null";
|
||||
public static final String DETAIL_ROUTER_DESC = "详情";
|
||||
|
||||
/**
|
||||
* 根据指定的终端类型选取合适的路由
|
||||
* 获取业务详情路由策略
|
||||
*
|
||||
* @param rawMessageRouter 原始的模板路由策略
|
||||
* @param terminalType 当前请求的终端类型
|
||||
* @return 合适的路由数据
|
||||
* @param msgTemplateRouter 模板路由配置
|
||||
* @return 业务展示详情策略
|
||||
*/
|
||||
public static MessageRouterTerminalDTO select(RawMessageRouterDTO rawMessageRouter, TerminalTypeEnum terminalType) {
|
||||
if (RouterCategoryEnum.ACTION.equals(rawMessageRouter.getCategory())) {
|
||||
return rawMessageRouter.getTerminals().get(0);
|
||||
public static Optional<MessageDetailRouteStrategyDTO> fetchBizDetailShowStrategy(MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
if (Objects.isNull(msgTemplateRouter)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return rawMessageRouter.getTerminals().stream()
|
||||
.filter(e -> Objects.equals(terminalType, e.getTerminalType()))
|
||||
// 若没有匹配的,默认选择第一个然后由前端去进行最终判断
|
||||
.findFirst().orElseGet(() -> rawMessageRouter.getTerminals().get(0));
|
||||
return Optional.ofNullable(msgTemplateRouter.getRouteDetail())
|
||||
.map(MessageRouteDetailDTO::toBizDetailShowStrategyDTO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定的终端类型选取合适的路由
|
||||
* 获取业务详情路由
|
||||
*
|
||||
* @param rawMessageRouter 原始的模板路由策略
|
||||
* @param excludeTerminalType 待排除的终端类型
|
||||
* @return 合适的路由数据
|
||||
* @param msgTemplateRouter 模板路由配置
|
||||
* @return 业务展示详情策略
|
||||
*/
|
||||
public static List<MessageRouterTerminalDTO> selectWithout(RawMessageRouterDTO rawMessageRouter,
|
||||
TerminalTypeEnum excludeTerminalType) {
|
||||
if (RouterCategoryEnum.ACTION.equals(rawMessageRouter.getCategory())) {
|
||||
// 如果配置路由是API调用,这与终端无关
|
||||
return rawMessageRouter.getTerminals();
|
||||
public static Optional<DetailRouterDTO> fetchBizDetailRouter(MessageTemplateRouterDTO msgTemplateRouter,
|
||||
TerminalTypeEnum terminalType) {
|
||||
if (Objects.isNull(msgTemplateRouter)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return rawMessageRouter.getTerminals().stream()
|
||||
.filter(e -> !Objects.equals(excludeTerminalType, e.getTerminalType()))
|
||||
// 若没有匹配的,默认选择第一个然后由前端去进行最终判断
|
||||
return Optional.ofNullable(msgTemplateRouter.getRouteDetail())
|
||||
.map(v -> convert(v, terminalType));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取业务按钮路由策略
|
||||
*
|
||||
* @param msgTemplateRouter 模板路由配置
|
||||
* @return 业务按钮路由策略
|
||||
*/
|
||||
public static List<MessageButtonRouteStrategyDTO> fetchMessageRouterButtonStrategies(MessageTemplateRouterDTO msgTemplateRouter) {
|
||||
if (Objects.isNull(msgTemplateRouter)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (CollectionUtils.isEmpty(msgTemplateRouter.getRouteButtons())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return msgTemplateRouter.getRouteButtons().stream()
|
||||
.map(MessageRouteButtonDTO::toMessageRouterButton)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断路由参数的合法性
|
||||
* 获取业务按钮路由
|
||||
*
|
||||
* @param routerParam 路由参数
|
||||
* @return 合法返回 {@code true} 否则返回 {@code false}
|
||||
* @param msgTemplateRouter 模板路由配置
|
||||
* @return 业务按钮路由
|
||||
*/
|
||||
public static boolean isRouterParamValid(String routerParam) {
|
||||
return StringUtils.isNotEmpty(routerParam)
|
||||
&& !INVALID_ROUTER_PARAM.equals(routerParam);
|
||||
public static List<ButtonRouterDTO> fetchMessageRouterButtons(MessageTemplateRouterDTO msgTemplateRouter,
|
||||
TerminalTypeEnum terminalType) {
|
||||
if (Objects.isNull(msgTemplateRouter)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (CollectionUtils.isEmpty(msgTemplateRouter.getRouteButtons())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return msgTemplateRouter.getRouteButtons().stream()
|
||||
.sorted(Comparator.comparing(MessageRouteButtonDTO::getPriority))
|
||||
.map(e -> convert(e, terminalType))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析模板上配置的路由地址,并将发送消息时的参数替换上去
|
||||
* 解析按钮风格的存储模型
|
||||
*
|
||||
* @param router 路由信息
|
||||
* @param routerParam 路由参数
|
||||
* @param styleObj 按钮style对象
|
||||
* @return 按钮style列表
|
||||
*/
|
||||
public static void parseRouteUrl(MessageRouterDTO router, String routerParam) {
|
||||
// 路由参数有效
|
||||
if (isRouterParamValid(routerParam)) {
|
||||
// 替换原始URL中的参数变量
|
||||
String routerUrl = PlaceholderResolver
|
||||
.getDefaultResolver().resolveByMap(router.getUrl(), JSON.parseObject(routerParam));
|
||||
router.setUrl(routerUrl);
|
||||
public static List<ButtonStyleEnum> parseButtonStyle(JSONArray styleObj) {
|
||||
if (Objects.isNull(styleObj)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return JSON.parseArray(styleObj.toJSONString(), ButtonStyleEnum.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析模板上配置的路由地址,将发送消息时的参数替换上去,并将路由参数追加到模板的路由地址后面,兼容APP端新老版本
|
||||
*
|
||||
* @param router 路由信息
|
||||
* @param msgTemplateRouter 路由信息
|
||||
* @param routerParam 路由参数
|
||||
* @return RawMessageRouterDTO
|
||||
* @return MessageTemplateRouterDTO
|
||||
*/
|
||||
public static RawMessageRouterDTO parseAndConcatRouteUrl(RawMessageRouterDTO router, JSONObject routerParam) {
|
||||
public static MessageTemplateRouterDTO parseAndConcatRouteUrl(MessageTemplateRouterDTO msgTemplateRouter,
|
||||
JSONObject routerParam) {
|
||||
// 路由参数有效
|
||||
if (Objects.nonNull(routerParam) && !routerParam.isEmpty()) {
|
||||
if (Objects.nonNull(routerParam) && Objects.nonNull(msgTemplateRouter)) {
|
||||
// 拷贝一份,避免修改入参
|
||||
router = router.deepClone();
|
||||
router.getTerminals().forEach(e -> {
|
||||
// 替换原始URL中的参数变量
|
||||
String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getUrl(), routerParam);
|
||||
// 将routerParam追加到原始的URL后面
|
||||
routerUrl = concatRouterParam(routerUrl, routerParam);
|
||||
e.setUrl(routerUrl);
|
||||
});
|
||||
msgTemplateRouter = BeanConvertUtils.copyBean(msgTemplateRouter, MessageTemplateRouterDTO.class);
|
||||
// 编排业务详情路由
|
||||
parseAndConcatDetailRouterUrl(msgTemplateRouter.getRouteDetail(), routerParam);
|
||||
// 编排路由按钮
|
||||
parseAndConcatButtonRouterUrl(msgTemplateRouter.getRouteButtons(), routerParam);
|
||||
}
|
||||
return router;
|
||||
return msgTemplateRouter;
|
||||
}
|
||||
|
||||
private static void parseAndConcatDetailRouterUrl(MessageRouteDetailDTO routeDetail, JSONObject routerParam) {
|
||||
if (Objects.isNull(routeDetail)) {
|
||||
return;
|
||||
}
|
||||
routeDetail.getRouterConfigs()
|
||||
.forEach(e -> concatRouterParam(e::getUrl, e::setUrl, routerParam));
|
||||
}
|
||||
|
||||
private static void parseAndConcatButtonRouterUrl(List<MessageRouteButtonDTO> routeButtons, JSONObject routerParam) {
|
||||
if (CollectionUtils.isEmpty(routeButtons)) {
|
||||
return;
|
||||
}
|
||||
routeButtons.forEach(e -> {
|
||||
if (StringUtils.isNotBlank(e.getApiUrl())) {
|
||||
// API调用类型的按钮
|
||||
concatRouterParam(e::getApiUrl, e::setApiUrl, routerParam);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(e.getRouterConfigs())) {
|
||||
// 页面跳转类型的按钮
|
||||
e.getRouterConfigs()
|
||||
.forEach(config -> concatRouterParam(config::getUrl, config::setUrl, routerParam));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void concatRouterParam(Supplier<String> getUrlSupplier, Consumer<String> setUrlConsumer,
|
||||
JSONObject routerParam) {
|
||||
// 替换原始URL中的参数变量
|
||||
String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(getUrlSupplier.get(), routerParam);
|
||||
// 将routerParam追加到原始的URL后面
|
||||
routerUrl = concatRouterParam(routerUrl, routerParam);
|
||||
setUrlConsumer.accept(routerUrl);
|
||||
}
|
||||
|
||||
private static String concatRouterParam(String originalUrl, JSONObject routerParam) {
|
||||
@ -134,16 +194,46 @@ public final class MessageRouterUtil {
|
||||
return originalUrl + paramBuilder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析按钮style
|
||||
*
|
||||
* @param style 按钮style的JSON字串
|
||||
* @return 按钮style的枚举列表
|
||||
*/
|
||||
public static List<ButtonStyleEnum> parseButtonStyle(String style) {
|
||||
if (StringUtils.isBlank(style)) {
|
||||
return Collections.emptyList();
|
||||
private static DetailRouterDTO convert(MessageRouteDetailDTO detailRouteStrategy, TerminalTypeEnum terminalType) {
|
||||
MessageRouterConfigDTO routerTerminal = select(detailRouteStrategy.getRouterConfigs(), terminalType);
|
||||
return DetailRouterDTO.builder()
|
||||
.showStrategy(detailRouteStrategy.getShowStrategy())
|
||||
.url(routerTerminal.getUrl())
|
||||
.terminalType(routerTerminal.getTerminalType())
|
||||
.build();
|
||||
}
|
||||
|
||||
private static ButtonRouterDTO convert(MessageRouteButtonDTO routeButton, TerminalTypeEnum terminalType) {
|
||||
if (RouterCategoryEnum.ACTION.equals(routeButton.getCategory())) {
|
||||
return ButtonRouterDTO.builder()
|
||||
.desc(routeButton.getName())
|
||||
.style(parseButtonStyle(routeButton.getStyle()))
|
||||
.category(routeButton.getCategory())
|
||||
.url(routeButton.getApiUrl())
|
||||
.build();
|
||||
}
|
||||
return JSON.parseArray(style, ButtonStyleEnum.class);
|
||||
MessageRouterConfigDTO routerConfig = select(routeButton.getRouterConfigs(), terminalType);
|
||||
return ButtonRouterDTO.builder()
|
||||
.desc(routeButton.getName())
|
||||
.style(parseButtonStyle(routeButton.getStyle()))
|
||||
.category(routeButton.getCategory())
|
||||
.url(routerConfig.getUrl())
|
||||
.terminalType(routerConfig.getTerminalType())
|
||||
.build();
|
||||
}
|
||||
|
||||
private static MessageRouterConfigDTO select(List<MessageRouterConfigDTO> routerTerminals,
|
||||
TerminalTypeEnum terminalType) {
|
||||
return routerTerminals.stream()
|
||||
.filter(e -> Objects.equals(terminalType, e.getTerminalType()))
|
||||
.findFirst()
|
||||
// 优先选择H5,没有则选择第一个元素
|
||||
.orElseGet(() -> selectH5(routerTerminals).orElseGet(() -> routerTerminals.get(0)));
|
||||
}
|
||||
|
||||
private static Optional<MessageRouterConfigDTO> selectH5(List<MessageRouterConfigDTO> routerTerminals) {
|
||||
return routerTerminals.stream()
|
||||
.filter(e -> Objects.equals(TerminalTypeEnum.WEB_VIEW, e.getTerminalType()))
|
||||
.findFirst();
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,92 @@
|
||||
package cn.axzo.msg.center.utils;
|
||||
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
import cn.axzo.msg.center.common.exception.ServiceException;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/7
|
||||
* @version 1.0
|
||||
*/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class MessageTemplateCategoryUtil {
|
||||
|
||||
/**
|
||||
* 校验并返回对应的消息模板子类型
|
||||
*
|
||||
* @param category 消息模板类型
|
||||
* @param subCategory 消息模板子类型
|
||||
* @return 消息模板子类型
|
||||
*/
|
||||
public static Optional<MessageCategoryEnum> checkAndReturnSubCategory(MessageGroupCategoryEnum category,
|
||||
MessageCategoryEnum subCategory) {
|
||||
AssertUtil.notNull(category, "category is null.");
|
||||
if (Objects.isNull(subCategory) && MessageGroupCategoryEnum.NOTIFICATION.equals(category)) {
|
||||
// 通知类型的消息模板无二级分类
|
||||
return category.getMsgCategories().stream().findFirst();
|
||||
}
|
||||
return category.getMsgCategories().stream()
|
||||
.filter(e -> e.equals(subCategory))
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回消息模板子类型对应的父类型
|
||||
*
|
||||
* @param subCategory 消息模板子类型
|
||||
* @return 消息模板父类型
|
||||
*/
|
||||
public static MessageGroupCategoryEnum parentCategory(MessageCategoryEnum subCategory) {
|
||||
AssertUtil.notNull(subCategory, "subCategory is null.");
|
||||
return Arrays.stream(MessageGroupCategoryEnum.values())
|
||||
.filter(e -> e.getMsgCategories().contains(subCategory))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new ServiceException("无效的参数"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回消息模板子类型
|
||||
*
|
||||
* @param subCategory 消息模板子类型
|
||||
* @return 消息模板子类型
|
||||
*/
|
||||
public static MessageCategoryEnum parseAndReturnSubCategory(MessageCategoryEnum subCategory) {
|
||||
AssertUtil.notNull(subCategory, "subCategory is null.");
|
||||
MessageGroupCategoryEnum parent = parentCategory(subCategory);
|
||||
if (MessageGroupCategoryEnum.NOTIFICATION.equals(parent)) {
|
||||
return null;
|
||||
}
|
||||
return subCategory;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析消息模板类型查询条件
|
||||
*
|
||||
* @param category 消息模板类型
|
||||
* @param subCategory 消息模板子类型
|
||||
* @return 消息模板子类型
|
||||
*/
|
||||
public static Set<MessageCategoryEnum> parseCategoryCondition(MessageGroupCategoryEnum category,
|
||||
MessageCategoryEnum subCategory) {
|
||||
if (Objects.isNull(category)) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
if (Objects.isNull(subCategory)) {
|
||||
return category.getMsgCategories();
|
||||
}
|
||||
return category.getMsgCategories().stream()
|
||||
.filter(e -> e.equals(subCategory))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
@ -1,17 +1,17 @@
|
||||
package cn.axzo.msg.center.utils;
|
||||
|
||||
import cn.axzo.basics.common.model.IBaseTree;
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
import cn.axzo.msg.center.domain.entity.MessageGroupNode;
|
||||
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
|
||||
import com.google.common.collect.Maps;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -22,32 +22,82 @@ import java.util.stream.Collectors;
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class TreeHelperUtil {
|
||||
|
||||
public static <T extends IBaseTree<T, O>, O> T wrapper(GroupTreeNodeDTO treeNode,
|
||||
Function<GroupTreeNodeDTO, T> wrapperFunc) {
|
||||
AssertUtil.notNull(treeNode, "treeNode is null");
|
||||
AssertUtil.notNull(wrapperFunc, "wrapperFunc is null");
|
||||
|
||||
final Map<GroupTreeNodeDTO, T> convertMap = Maps.newHashMap();
|
||||
T root = wrapperFunc.apply(treeNode);
|
||||
convertMap.put(treeNode, root);
|
||||
LinkedList<GroupTreeNodeDTO> treeNodeStack = new LinkedList<>();
|
||||
treeNodeStack.push(treeNode);
|
||||
while (!treeNodeStack.isEmpty()) {
|
||||
treeNode = treeNodeStack.pop();
|
||||
List<GroupTreeNodeDTO> children = treeNode.getNodeChildren();
|
||||
convertMap.get(treeNode).setNodeChildren(children.stream()
|
||||
.map(e -> {
|
||||
T wrapper = wrapperFunc.apply(e);
|
||||
convertMap.put(e, wrapper);
|
||||
return wrapper;
|
||||
}).collect(Collectors.toList()));
|
||||
treeNodeStack.addAll(children);
|
||||
public static List<GroupTreeNodeDTO> buildTrees(List<MessageGroupNode> nodes) {
|
||||
if (CollectionUtils.isEmpty(nodes)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return root;
|
||||
List<GroupTreeNodeDTO> rootNodes = nodes.stream()
|
||||
.filter(e -> StringUtils.isBlank(e.getParentCode()))
|
||||
.map(TreeHelperUtil::convert)
|
||||
.collect(Collectors.toList());
|
||||
rootNodes.forEach(e -> buildTree(e, nodes));
|
||||
return rootNodes;
|
||||
}
|
||||
|
||||
public static boolean isLeafNodeCategory(MessageGroupNodeCategoryEnum category) {
|
||||
return MessageGroupNodeCategoryEnum.GENERAL_MESSAGE_CATEGORY.equals(category)
|
||||
|| MessageGroupNodeCategoryEnum.PENDING_MESSAGE_CATEGORY.equals(category);
|
||||
}
|
||||
|
||||
public static boolean containsMountTemplateChild(GroupTreeNodeDTO treeNode) {
|
||||
if (Objects.isNull(treeNode)) {
|
||||
return false;
|
||||
}
|
||||
if (CollectionUtils.isEmpty(treeNode.getNodeChildren())) {
|
||||
return treeNode.canMountTemplate();
|
||||
}
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>(treeNode.getNodeChildren());
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
if (node.canMountTemplate()) {
|
||||
return true;
|
||||
}
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean containsMountTemplateChild(GroupTreeNodeDTO treeNode, String mountTemplateNodeName) {
|
||||
if (Objects.isNull(treeNode) || StringUtils.isBlank(mountTemplateNodeName)) {
|
||||
return false;
|
||||
}
|
||||
if (CollectionUtils.isEmpty(treeNode.getNodeChildren())) {
|
||||
return treeNode.canMountTemplate() && treeNode.getNodeName().contains(mountTemplateNodeName);
|
||||
}
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>(treeNode.getNodeChildren());
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
if (node.canMountTemplate()) {
|
||||
return node.getNodeName().contains(mountTemplateNodeName);
|
||||
}
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void buildTree(GroupTreeNodeDTO parentNode, List<MessageGroupNode> nodes) {
|
||||
List<MessageGroupNode> children = nodes.stream()
|
||||
.filter(e -> Objects.equals(e.getParentCode(), parentNode.getNodeCode()))
|
||||
.collect(Collectors.toList());
|
||||
if (children.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
children.forEach(e -> {
|
||||
GroupTreeNodeDTO child = convert(e);
|
||||
parentNode.addChild(child);
|
||||
buildTree(child, nodes);
|
||||
});
|
||||
}
|
||||
|
||||
private static GroupTreeNodeDTO convert(MessageGroupNode groupNode) {
|
||||
return GroupTreeNodeDTO.builder()
|
||||
.nodeId(groupNode.getId())
|
||||
.nodeName(groupNode.getName())
|
||||
.nodeCode(groupNode.getCode())
|
||||
.nodeIcon(groupNode.getIcon())
|
||||
.category(groupNode.getCategory())
|
||||
.isLeaf(groupNode.getIsLeaf())
|
||||
.status(groupNode.getStatus())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>msg-center-api</artifactId>
|
||||
<version>${msg-center-api-version}</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
|
||||
@ -25,7 +25,7 @@ import java.util.List;
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageRouterDTO implements Serializable {
|
||||
public class ButtonRouterDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1326971022827041566L;
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
package cn.axzo.msg.center.service.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/9
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class DetailRouterDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6069254958617169824L;
|
||||
|
||||
/**
|
||||
* 展示策略
|
||||
*/
|
||||
private BizDetailShowStrategyEnum showStrategy;
|
||||
/**
|
||||
* 页面地址
|
||||
*/
|
||||
private String url;
|
||||
/**
|
||||
* 页面地址所属应用端(如果是API接口地址,请忽略改字段值)
|
||||
* WEB: web端页面
|
||||
* MINI_PROGRAM: 安心筑小程序端页面
|
||||
* IOS: 原生IOS端页面
|
||||
* ANDROID: 原生Android端页面
|
||||
* WEB_VIEW: H5页面
|
||||
* WECHAT_MINI_PROGRAM: 微信小程序页面
|
||||
*/
|
||||
private TerminalTypeEnum terminalType;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -4,15 +4,17 @@ import cn.axzo.basics.common.model.IBaseTree;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.StatusEnum;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupTreeNodeResponse;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
@ -32,6 +34,10 @@ public class GroupTreeNodeDTO implements IBaseTree<GroupTreeNodeDTO, String>, Se
|
||||
|
||||
private static final long serialVersionUID = -3244632155934087302L;
|
||||
|
||||
/**
|
||||
* 存储模型的主键id
|
||||
*/
|
||||
private Long nodeId;
|
||||
/**
|
||||
* 模板分组结点名称
|
||||
*/
|
||||
@ -40,6 +46,10 @@ public class GroupTreeNodeDTO implements IBaseTree<GroupTreeNodeDTO, String>, Se
|
||||
* 模板分组结点名称code
|
||||
*/
|
||||
private String nodeCode;
|
||||
/**
|
||||
* 结点图标
|
||||
*/
|
||||
private String nodeIcon;
|
||||
/**
|
||||
* 结点类型
|
||||
*/
|
||||
@ -47,7 +57,7 @@ public class GroupTreeNodeDTO implements IBaseTree<GroupTreeNodeDTO, String>, Se
|
||||
/**
|
||||
* 父节点
|
||||
*/
|
||||
private String parentNodeCode;
|
||||
private GroupTreeNodeDTO parentNode;
|
||||
/**
|
||||
* 是否为叶节点
|
||||
*/
|
||||
@ -60,7 +70,42 @@ public class GroupTreeNodeDTO implements IBaseTree<GroupTreeNodeDTO, String>, Se
|
||||
* 子节点列表
|
||||
*/
|
||||
@Builder.Default
|
||||
private List<GroupTreeNodeDTO> nodeChildren = Collections.emptyList();
|
||||
private List<GroupTreeNodeDTO> nodeChildren = Lists.newArrayList();
|
||||
|
||||
public void addChild(GroupTreeNodeDTO child) {
|
||||
if (Objects.isNull(child)) {
|
||||
return;
|
||||
}
|
||||
if (Objects.isNull(nodeChildren)) {
|
||||
nodeChildren = Lists.newArrayList();
|
||||
}
|
||||
nodeChildren.add(child);
|
||||
child.setParentNode(this);
|
||||
}
|
||||
|
||||
public boolean contains(MessageGroupNodeCategoryEnum category, String nodeName) {
|
||||
if (Objects.isNull(category)) {
|
||||
return false;
|
||||
}
|
||||
if (Objects.equals(this.category, category)) {
|
||||
return Objects.equals(this.nodeName, nodeName);
|
||||
}
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>();
|
||||
stack.push(this);
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
if (Objects.equals(node.category, category) && Objects.equals(node.nodeName, nodeName)) {
|
||||
return true;
|
||||
}
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParentNodeCode() {
|
||||
return Optional.ofNullable(parentNode).map(GroupTreeNodeDTO::getNodeCode).orElse(null);
|
||||
}
|
||||
|
||||
public void setNodeChildren(List<GroupTreeNodeDTO> nodeChildren) {
|
||||
this.nodeChildren = Optional.ofNullable(nodeChildren).orElseGet(Collections::emptyList);
|
||||
@ -74,17 +119,31 @@ public class GroupTreeNodeDTO implements IBaseTree<GroupTreeNodeDTO, String>, Se
|
||||
.category(category)
|
||||
.nodeName(nodeName)
|
||||
.nodeCode(nodeCode)
|
||||
.parentNodeCode(parentNodeCode)
|
||||
.parentNodeCode(getParentNodeCode())
|
||||
.nodeIcon(nodeIcon)
|
||||
.children(children)
|
||||
.build();
|
||||
}
|
||||
|
||||
public Optional<GroupTreeNodeDTO> getChild(String treeNodeCode) {
|
||||
if (StringUtils.isBlank(treeNodeCode) || Objects.isNull(nodeChildren)) {
|
||||
return Optional.empty();
|
||||
public List<GroupTreeNodeDTO> getLeafNodes() {
|
||||
if (CollectionUtils.isEmpty(this.nodeChildren)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return nodeChildren.stream()
|
||||
.filter(e -> Objects.equals(e.getNodeCode(), treeNodeCode))
|
||||
.findFirst();
|
||||
List<GroupTreeNodeDTO> leafNodes = Lists.newArrayList();
|
||||
LinkedList<GroupTreeNodeDTO> stack = new LinkedList<>(this.nodeChildren);
|
||||
while (!stack.isEmpty()) {
|
||||
GroupTreeNodeDTO node = stack.pop();
|
||||
if (CollectionUtils.isEmpty(node.getNodeChildren())) {
|
||||
leafNodes.add(node);
|
||||
} else {
|
||||
stack.addAll(node.getNodeChildren());
|
||||
}
|
||||
}
|
||||
return leafNodes;
|
||||
}
|
||||
|
||||
public boolean canMountTemplate() {
|
||||
return MessageGroupNodeCategoryEnum.GENERAL_MESSAGE_CATEGORY.equals(this.category)
|
||||
|| MessageGroupNodeCategoryEnum.PENDING_MESSAGE_CATEGORY.equals(this.category);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.msg.center.service.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -9,6 +10,7 @@ import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
@ -25,10 +27,14 @@ import java.util.List;
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageRouterButtonDTO implements Serializable {
|
||||
public class MessageButtonRouteStrategyDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -9083376003614521781L;
|
||||
|
||||
/**
|
||||
* 按钮唯一标识
|
||||
*/
|
||||
private String identityCode;
|
||||
/**
|
||||
* 路由描述
|
||||
*/
|
||||
@ -37,9 +43,14 @@ public class MessageRouterButtonDTO implements Serializable {
|
||||
* 路由分类
|
||||
* JUMP: 直接跳转
|
||||
* ACTION: 接口调用
|
||||
* DETAIL: 页面详情
|
||||
*/
|
||||
private RouterCategoryEnum category;
|
||||
/**
|
||||
* 按钮来源
|
||||
* SYSTEM: 系统
|
||||
* CUSTOM: 自定义
|
||||
*/
|
||||
private RouterButtonSourceEnum source;
|
||||
/**
|
||||
* 按钮样式配置
|
||||
* HIGH_LIGHT: 按钮高亮展示
|
||||
@ -47,18 +58,20 @@ public class MessageRouterButtonDTO implements Serializable {
|
||||
*/
|
||||
private List<ButtonStyleEnum> style;
|
||||
/**
|
||||
* 路由终端列表,若当前按钮为ACTION,则只能配一个接口地址
|
||||
* 路由按钮的跳转url配置
|
||||
*/
|
||||
private List<MessageRouterTerminalDTO> terminals;
|
||||
/**
|
||||
* 当按钮类型为API调用时,该字段有值
|
||||
*/
|
||||
private String apiUrl;
|
||||
|
||||
public boolean isHighlight() {
|
||||
return CollectionUtils.isNotEmpty(style)
|
||||
&& style.stream().anyMatch(ButtonStyleEnum.HIGH_LIGHT::equals);
|
||||
}
|
||||
|
||||
public boolean isShowOnCard() {
|
||||
return CollectionUtils.isNotEmpty(style)
|
||||
&& style.stream().anyMatch(ButtonStyleEnum.OVER_CARD::equals);
|
||||
public boolean isValid() {
|
||||
if (RouterCategoryEnum.ACTION.equals(category)) {
|
||||
return StringUtils.isNotBlank(apiUrl);
|
||||
}
|
||||
return CollectionUtils.isNotEmpty(terminals)
|
||||
&& terminals.stream().allMatch(MessageRouterTerminalDTO::isValid);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -0,0 +1,41 @@
|
||||
package cn.axzo.msg.center.service.dto;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
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/11/6
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageDetailRouteStrategyDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -3496745332397525305L;
|
||||
|
||||
/**
|
||||
* 展示策略
|
||||
*/
|
||||
private BizDetailShowStrategyEnum showStrategy;
|
||||
/**
|
||||
* 路由终端列表,若当前按钮为ACTION,则只能配一个接口地址
|
||||
*/
|
||||
private List<MessageRouterTerminalDTO> terminals;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -7,6 +7,7 @@ import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@ -46,6 +47,10 @@ public class MessageRouterTerminalDTO implements Serializable {
|
||||
.build();
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return StringUtils.isNotBlank(url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
|
||||
@ -35,6 +35,10 @@ public class PersonDTO implements Serializable {
|
||||
* 身份信息
|
||||
*/
|
||||
private IdentityDTO identity;
|
||||
/**
|
||||
* 姓名
|
||||
*/
|
||||
private String name;
|
||||
|
||||
public static PersonDTO from(Long personId, Long identityId, IdentityTypeEnum identityType) {
|
||||
IdentityDTO identity = IdentityDTO.builder()
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 应用终端类型枚举
|
||||
* @author cold_blade
|
||||
* @date 2023/11/9
|
||||
* @version 1.0
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum AppTerminalTypeEnum {
|
||||
|
||||
/**
|
||||
* B-安心筑企业版
|
||||
*/
|
||||
B_ENTERPRISE_APP("B-安心筑企业版"),
|
||||
/**
|
||||
* C-安心筑工人版
|
||||
*/
|
||||
C_WORKER_APP("C-安心筑工人版"),
|
||||
/**
|
||||
* CMS PC端
|
||||
*/
|
||||
CMS_WEB_PC("CMS PC端"),
|
||||
/**
|
||||
* OMS PC端
|
||||
*/
|
||||
OMS_WEB_PC("OMS PC端"),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 业务详情展示策略
|
||||
* @author cold_blade
|
||||
* @date 2023/11/6
|
||||
* @version 1.0
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum BizDetailShowStrategyEnum {
|
||||
|
||||
/**
|
||||
* 内嵌展示
|
||||
*/
|
||||
INLINE,
|
||||
/**
|
||||
* 跳转展示
|
||||
*/
|
||||
JUMP_TO;
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 业务终态的状态枚举,包含审批流的相关状态
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/7
|
||||
* @version 1.0
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum BizFinalStateEnum {
|
||||
|
||||
/**
|
||||
* 已处理
|
||||
*/
|
||||
COMPLETED,
|
||||
/**
|
||||
* 已撤销
|
||||
*/
|
||||
RETRACT,
|
||||
/**
|
||||
* 已通过
|
||||
*/
|
||||
PASSED,
|
||||
/**
|
||||
* 已拒绝
|
||||
*/
|
||||
REJECTED;
|
||||
}
|
||||
@ -15,8 +15,9 @@ import lombok.Getter;
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum MessageCategoryEnum {
|
||||
|
||||
GENERAL_MESSAGE(1, "普通消息"),
|
||||
PENDING_MESSAGE(2, "待办消息");
|
||||
GENERAL_MESSAGE(1, "通知"),
|
||||
BIZ_PENDING_MESSAGE(2, "业务待办"),
|
||||
APPROVAL_PENDING_MESSAGE(3, "审批待办");
|
||||
|
||||
private final Integer code;
|
||||
private final String message;
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息分类的类型枚举
|
||||
* @author cold_blade
|
||||
* @date 2023/11/6
|
||||
* @version 1.0
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum MessageGroupCategoryEnum {
|
||||
|
||||
/**
|
||||
* 通知
|
||||
*/
|
||||
NOTIFICATION(MessageGroupNodeCategoryEnum.NOTIFICATION, Sets.newHashSet(MessageCategoryEnum.GENERAL_MESSAGE)),
|
||||
/**
|
||||
* 待办
|
||||
*/
|
||||
PENDING(MessageGroupNodeCategoryEnum.PENDING,
|
||||
Sets.newHashSet(MessageCategoryEnum.BIZ_PENDING_MESSAGE, MessageCategoryEnum.APPROVAL_PENDING_MESSAGE));
|
||||
|
||||
private final Set<MessageGroupNodeCategoryEnum> msgGroupNodeCategories;
|
||||
private final Set<MessageCategoryEnum> msgCategories;
|
||||
}
|
||||
@ -1,9 +1,12 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
@ -15,15 +18,20 @@ import lombok.Getter;
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum MessageGroupNodeCategoryEnum {
|
||||
|
||||
GENERAL_MESSAGE_CENTER("消息中心", 1, MessageCategoryEnum.GENERAL_MESSAGE),
|
||||
GENERAL_MESSAGE_MODULE("消息模块", 2, MessageCategoryEnum.GENERAL_MESSAGE),
|
||||
GENERAL_MESSAGE_CATEGORY("消息分类", 3, MessageCategoryEnum.GENERAL_MESSAGE),
|
||||
PENDING_MESSAGE_CENTER("待办中心", 1, MessageCategoryEnum.PENDING_MESSAGE),
|
||||
PENDING_MESSAGE_MODULE("待办模块", 2, MessageCategoryEnum.PENDING_MESSAGE),
|
||||
PENDING_MESSAGE_CATEGORY("待办分类", 3, MessageCategoryEnum.PENDING_MESSAGE),
|
||||
GENERAL_MESSAGE_CENTER("消息中心", 1),
|
||||
GENERAL_MESSAGE_MODULE("消息模块", 2),
|
||||
GENERAL_MESSAGE_CATEGORY("消息分类", 3),
|
||||
PENDING_MESSAGE_CENTER("待办中心", 1),
|
||||
PENDING_MESSAGE_MODULE("待办模块", 2),
|
||||
PENDING_MESSAGE_CATEGORY("待办分类", 3),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
private final int level;
|
||||
private final MessageCategoryEnum msgCategory;
|
||||
|
||||
public static final Set<MessageGroupNodeCategoryEnum> NOTIFICATION =
|
||||
Sets.newHashSet(GENERAL_MESSAGE_CENTER, GENERAL_MESSAGE_MODULE, GENERAL_MESSAGE_CATEGORY);
|
||||
|
||||
public static final Set<MessageGroupNodeCategoryEnum> PENDING =
|
||||
Sets.newHashSet(PENDING_MESSAGE_CENTER, PENDING_MESSAGE_MODULE, PENDING_MESSAGE_CATEGORY);
|
||||
}
|
||||
|
||||
@ -4,7 +4,10 @@ import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 工作台类型
|
||||
* @description
|
||||
*
|
||||
* @author cold_blade
|
||||
@ -20,4 +23,5 @@ public enum OrganizationTypeEnum {
|
||||
|
||||
private final Integer code;
|
||||
private final String message;
|
||||
|
||||
}
|
||||
|
||||
@ -4,6 +4,9 @@ import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
@ -24,4 +27,11 @@ public enum PendingMessageStateEnum {
|
||||
|
||||
private final Integer code;
|
||||
private final String message;
|
||||
|
||||
public static PendingMessageStateEnum codeOf(Integer code) {
|
||||
return Arrays.stream(values())
|
||||
.filter(e -> Objects.equals(e.code, code))
|
||||
.findFirst()
|
||||
.orElse(HAS_BEEN_SENT);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,24 @@
|
||||
package cn.axzo.msg.center.service.enums;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/7
|
||||
* @version 1.0
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum RouterButtonSourceEnum {
|
||||
|
||||
/**
|
||||
* 系统
|
||||
*/
|
||||
SYSTEM,
|
||||
/**
|
||||
* 自定义
|
||||
*/
|
||||
CUSTOM;
|
||||
}
|
||||
@ -17,7 +17,8 @@ public enum RouterCategoryEnum {
|
||||
|
||||
JUMP("直接跳转"),
|
||||
ACTION("接口调用"),
|
||||
DETAIL("页面详情"),
|
||||
@Deprecated
|
||||
DETAIL("查看详情"),
|
||||
;
|
||||
|
||||
private final String desc;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
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.dto.ButtonRouterDTO;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -98,7 +98,7 @@ public class GeneralMessageResponse implements Serializable {
|
||||
/**
|
||||
* 路由信息,可为空
|
||||
*/
|
||||
private List<MessageRouterDTO> routers;
|
||||
private List<ButtonRouterDTO> routers;
|
||||
/**
|
||||
* 参数及其对应的值的JSON串
|
||||
*/
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
package cn.axzo.msg.center.service.group.client;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.group.client.fallback.MessageGroupClientFallback;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeAddRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeListRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeUpdateRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupQueryRequest;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupNodeBriefResponse;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupTreeNodeResponse;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
@ -57,9 +59,25 @@ public interface MessageGroupClient {
|
||||
/**
|
||||
* 查询通知/待办的分类信息
|
||||
*
|
||||
* @param category 消息分类
|
||||
* @param request 分页查询相关参数
|
||||
*/
|
||||
@PostMapping(value = "/message/group/node/list", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<List<MessageGroupTreeNodeResponse>> list(@RequestParam(value = "category", required = false)
|
||||
MessageCategoryEnum category);
|
||||
CommonResponse<List<MessageGroupTreeNodeResponse>> list(@RequestBody MessageGroupQueryRequest request);
|
||||
|
||||
/**
|
||||
* 查询通知/待办的分类信息
|
||||
*
|
||||
* @param request 分页查询相关参数
|
||||
*/
|
||||
@PostMapping(value = "/message/group/cutTree/list", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<List<MessageGroupTreeNodeResponse>> listCutTree(@RequestBody MessageGroupQueryRequest request);
|
||||
|
||||
/**
|
||||
* 查询通知/待办的分类信息
|
||||
*
|
||||
* @param request 分页查询相关参数
|
||||
*/
|
||||
@PostMapping(value = "/message/group/node/brief/list", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<List<MessageGroupNodeBriefResponse>> listNodeBriefInfo(@RequestBody
|
||||
MessageGroupNodeListRequest request);
|
||||
}
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
package cn.axzo.msg.center.service.group.client.fallback;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.group.client.MessageGroupClient;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeAddRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeListRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupNodeUpdateRequest;
|
||||
import cn.axzo.msg.center.service.group.request.MessageGroupQueryRequest;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupNodeBriefResponse;
|
||||
import cn.axzo.msg.center.service.group.response.MessageGroupTreeNodeResponse;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -40,8 +42,20 @@ public class MessageGroupClientFallback implements MessageGroupClient {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> list(MessageCategoryEnum category) {
|
||||
log.error("fall back while listing message group node. category:[{}]", category);
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> list(MessageGroupQueryRequest request) {
|
||||
log.error("fall back while listing message group node. request:{}", request);
|
||||
return CommonResponse.error("fall back while listing message group node");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupTreeNodeResponse>> listCutTree(MessageGroupQueryRequest request) {
|
||||
log.error("fall back while listing message group cutTree. request:{}", request);
|
||||
return CommonResponse.error("fall back while listing message group cutTree");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupNodeBriefResponse>> listNodeBriefInfo(MessageGroupNodeListRequest request) {
|
||||
log.error("fall back while listing message group node brief info. request:{}", request);
|
||||
return CommonResponse.error("fall back while listing message group node brief info.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
package cn.axzo.msg.center.service.group.request;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/13
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class MessageGroupNodeListRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 6386337063784961842L;
|
||||
|
||||
/**
|
||||
* 应用终端类型
|
||||
*/
|
||||
private AppTerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 消息模板分类的种类
|
||||
*/
|
||||
private MessageGroupCategoryEnum groupCategory;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package cn.axzo.msg.center.service.group.request;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/9
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class MessageGroupQueryRequest {
|
||||
|
||||
private MessageGroupCategoryEnum category;
|
||||
private String nodeName;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
package cn.axzo.msg.center.service.group.response;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
* @date 2023/11/13
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MessageGroupNodeBriefResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -4032240752827379030L;
|
||||
|
||||
/**
|
||||
* 分类名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -2,11 +2,13 @@ package cn.axzo.msg.center.service.group.response;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
@ -47,11 +49,23 @@ public class MessageGroupTreeNodeResponse implements Serializable {
|
||||
* 父节点编码
|
||||
*/
|
||||
private String parentNodeCode;
|
||||
/**
|
||||
* 结点图标
|
||||
*/
|
||||
private String nodeIcon;
|
||||
/**
|
||||
* 子节点列表
|
||||
*/
|
||||
private List<MessageGroupTreeNodeResponse> children;
|
||||
|
||||
public void addChild(MessageGroupTreeNodeResponse treeNode) {
|
||||
if (CollectionUtils.isEmpty(children)) {
|
||||
children = Lists.newArrayList();
|
||||
}
|
||||
children.add(treeNode);
|
||||
treeNode.setParentNodeCode(this.nodeCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
|
||||
@ -2,11 +2,16 @@ package cn.axzo.msg.center.service.pending.client;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.client.fallback.PendingMessageClientFallback;
|
||||
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.MessageGroupNodeResponse;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
@ -32,9 +37,24 @@ import java.util.List;
|
||||
fallback = PendingMessageClientFallback.class)
|
||||
public interface PendingMessageClient {
|
||||
|
||||
/**
|
||||
* 分类统计待办的待处理状态的数量
|
||||
*
|
||||
* @param request 统计入参
|
||||
* @return 分类信息及其对应的待处理的待办数量列表
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/record/group/statistic", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(@RequestBody @Valid
|
||||
MessageGroupNodeStatisticRequest request);
|
||||
CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(@RequestBody @Valid
|
||||
PendingMessageStatisticRequest request);
|
||||
|
||||
/**
|
||||
* 统计个人在某个应用终端的待处理的待办数量
|
||||
*
|
||||
* @param request 统计入参
|
||||
* @return 待处理的待办数量
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/record/count/uncompleted", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Integer> countUncompleted(@RequestBody PendingMessageCountUncompletedRequest request);
|
||||
|
||||
/**
|
||||
* 代办列表分页查询
|
||||
@ -45,6 +65,15 @@ public interface PendingMessageClient {
|
||||
@PostMapping(value = "/pending-message/record/page", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Page<PendingMessageResponse>> pageQuery(@RequestBody @Valid PendingMessagePageRequest request);
|
||||
|
||||
/**
|
||||
* 代办列表指定待办的查询
|
||||
*
|
||||
* @param request 查询相关参数
|
||||
* @return 指定待办
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/record/query", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<PendingMessageResponse> query(@RequestBody @Valid PendingMessageQueryRequest request);
|
||||
|
||||
/**
|
||||
* 查询代办详情
|
||||
*
|
||||
@ -63,23 +92,50 @@ public interface PendingMessageClient {
|
||||
* @return 代办唯一标识
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/push", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<String> push(@RequestBody @Valid PendingMessagePushRequest request);
|
||||
CommonResponse<List<PushPendingMessageDTO>> push(@RequestBody @Valid PendingMessagePushRequest request);
|
||||
|
||||
/**
|
||||
* 完成代办
|
||||
*
|
||||
* @param msgIdentityCode 代办唯一标识
|
||||
* @param requestNo 代办唯一标识
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/complete", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Boolean> complete(@RequestParam("msgIdentityCode") String msgIdentityCode);
|
||||
CommonResponse<Boolean> complete(@RequestParam("requestNo") String requestNo);
|
||||
|
||||
/**
|
||||
* 完成代办
|
||||
*
|
||||
* @param param
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/complete/by-id", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Boolean> completeById(@RequestBody @Valid CompletePendingMessageByIdRequest param);
|
||||
|
||||
/**
|
||||
* 撤销代办
|
||||
*
|
||||
* @param msgIdentityCode 代办唯一标识
|
||||
* @param requestNo 代办唯一标识
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/revoke", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Boolean> revoke(@RequestParam("msgIdentityCode") String msgIdentityCode);
|
||||
CommonResponse<Boolean> revoke(@RequestParam("requestNo") String requestNo);
|
||||
|
||||
/**
|
||||
* 通过模版编号和业务编号完成代办
|
||||
*
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/complete/by-biz-code", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Boolean> completeByTemplateCodeBizCode(@RequestBody @Valid CompletePendingMessageRequest param);
|
||||
|
||||
/**
|
||||
* 通过模版编号和业务编号撤销代办
|
||||
*
|
||||
* @param param
|
||||
* @return 成功返回 {@code true} 失败返回 {@code false}
|
||||
*/
|
||||
@PostMapping(value = "/pending-message/revoke/by-biz-code", produces = {MediaType.APPLICATION_JSON_VALUE})
|
||||
CommonResponse<Boolean> revokeByTemplateCodeBizCode(@RequestBody @Valid CompletePendingMessageRequest param);
|
||||
}
|
||||
@ -2,11 +2,16 @@ package cn.axzo.msg.center.service.pending.client.fallback;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
|
||||
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.MessageGroupNodeResponse;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
|
||||
import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
|
||||
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.azxo.framework.common.model.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -26,17 +31,29 @@ import java.util.List;
|
||||
public class PendingMessageClientFallback implements PendingMessageClient {
|
||||
|
||||
@Override
|
||||
public CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
|
||||
public CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(PendingMessageStatisticRequest request) {
|
||||
log.error("fall back while statistic pending message. req:{}", request);
|
||||
return CommonResponse.error("fall back while statistic pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Integer> countUncompleted(PendingMessageCountUncompletedRequest request) {
|
||||
log.error("fall back while counting pending message. req:{}", request);
|
||||
return CommonResponse.error("fall back while counting pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Page<PendingMessageResponse>> pageQuery(PendingMessagePageRequest request) {
|
||||
log.error("fall back while page querying pending message. req:{}", request);
|
||||
return CommonResponse.error("fall back while page querying pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<PendingMessageResponse> query(PendingMessageQueryRequest request) {
|
||||
log.error("fall back while querying pending message. req:{}", request);
|
||||
return CommonResponse.error("fall back while querying pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<PendingMessageResponse> detail(String msgIdentityCode, TerminalTypeEnum terminalType) {
|
||||
log.error("fall back while querying pending message. msgIdentityCode:[{}], terminalType:[{}]",
|
||||
@ -45,7 +62,7 @@ public class PendingMessageClientFallback implements PendingMessageClient {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<String> push(PendingMessagePushRequest request) {
|
||||
public CommonResponse<List<PushPendingMessageDTO>> push(PendingMessagePushRequest request) {
|
||||
log.error("fall back while push pending message. request:{}", request);
|
||||
return CommonResponse.error("fall back while push pending message");
|
||||
}
|
||||
@ -56,9 +73,27 @@ public class PendingMessageClientFallback implements PendingMessageClient {
|
||||
return CommonResponse.error("fall back while completing pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> completeById(CompletePendingMessageByIdRequest param) {
|
||||
log.error("fall back while completing pending message. CompletePendingMessageByIdRequest:[{}]", param);
|
||||
return CommonResponse.error("fall back while completing pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> revoke(String msgIdentityCode) {
|
||||
log.error("fall back while revoking pending message. msgIdentityCode:[{}]", msgIdentityCode);
|
||||
return CommonResponse.error("fall back while revoking pending message");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> completeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
log.error("fall back while completing pending message by biz code. request:[{}]", param);
|
||||
return CommonResponse.error("fall back while completing pending message by biz code");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResponse<Boolean> revokeByTemplateCodeBizCode(CompletePendingMessageRequest param) {
|
||||
log.error("fall back while revoking pending message by biz code. msgIdentityCode:[{}]", param);
|
||||
return CommonResponse.error("fall back while revoking pending message by biz code");
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,24 @@
|
||||
package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author haiyangjin
|
||||
* @date 2023/11/16
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class CompletePendingMessageByIdRequest {
|
||||
/**
|
||||
* 关联业务主键
|
||||
*/
|
||||
@NotNull(message = "消息ID不能为空")
|
||||
private Long id;
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author haiyangjin
|
||||
* @date 2023/11/15
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class CompletePendingMessageRequest implements Serializable {
|
||||
/**
|
||||
* 关联业务主键
|
||||
*/
|
||||
@NotNull(message = "bizCode is required")
|
||||
private String bizCode;
|
||||
|
||||
/**
|
||||
* 模版code
|
||||
*/
|
||||
@NotNull(message = "templateCode is required")
|
||||
private String templateCode;
|
||||
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/13
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class PendingMessageCountUncompletedRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 4714687359949832971L;
|
||||
|
||||
/**
|
||||
* 当前登录账户的自然id(前端不care)
|
||||
*/
|
||||
@NotNull(message = "personId is required")
|
||||
private Long personId;
|
||||
/**
|
||||
* 当前登录账户的身份id(前端不care)
|
||||
*/
|
||||
private Long identityId;
|
||||
/**
|
||||
* 当前登录账户的身份类型(前端不care)
|
||||
*/
|
||||
private IdentityTypeEnum identityType;
|
||||
/**
|
||||
* 应用终端类型
|
||||
*/
|
||||
private AppTerminalTypeEnum terminalType;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import cn.axzo.basics.common.page.PageRequest;
|
||||
import cn.axzo.msg.center.service.dto.QueryOrderByDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
@ -71,6 +72,13 @@ public class PendingMessagePageRequest extends PageRequest implements Serializab
|
||||
* DELETED: 已删除
|
||||
*/
|
||||
private PendingMessageStateEnum msgState;
|
||||
/**
|
||||
* COMPLETED: 已处理
|
||||
* RETRACT: 已撤销
|
||||
* PASSED: 已通过
|
||||
* REJECTED: 已拒绝
|
||||
*/
|
||||
private BizFinalStateEnum bizFinalState;
|
||||
/**
|
||||
* 代办消息的分类结点编码
|
||||
*/
|
||||
@ -79,6 +87,10 @@ public class PendingMessagePageRequest extends PageRequest implements Serializab
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 工作台id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
/**
|
||||
* 排序字段集合
|
||||
*/
|
||||
|
||||
@ -2,6 +2,7 @@ package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.PersonDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
@ -10,6 +11,8 @@ import lombok.Setter;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -33,7 +36,7 @@ public class PendingMessagePushRequest implements Serializable {
|
||||
* 执行者
|
||||
*/
|
||||
@NotNull(message = "executor is required")
|
||||
private PersonDTO executor;
|
||||
private List<PersonDTO> executor;
|
||||
/**
|
||||
* 模板编码
|
||||
*/
|
||||
@ -44,13 +47,20 @@ public class PendingMessagePushRequest implements Serializable {
|
||||
*/
|
||||
private OrganizationTypeEnum orgType;
|
||||
/**
|
||||
* 消息所属组织Id
|
||||
* 消息所属工作台ID
|
||||
*/
|
||||
private Long orgId;
|
||||
@NotNull
|
||||
private Long workspaceId;
|
||||
|
||||
/**
|
||||
* 消息所属组织名称
|
||||
* 消息所属企业id
|
||||
*/
|
||||
private String orgName;
|
||||
private Long ouId;
|
||||
// /**
|
||||
// * 删除工作台名称,通过id查
|
||||
// * 消息所属项目部名称
|
||||
// */
|
||||
// private String workspaceName;
|
||||
/**
|
||||
* 业务类型
|
||||
*/
|
||||
@ -76,6 +86,18 @@ public class PendingMessagePushRequest implements Serializable {
|
||||
* 路由参数(json string)
|
||||
*/
|
||||
private String routerParams;
|
||||
/**
|
||||
* 业务标签
|
||||
*/
|
||||
private String bizFlag;
|
||||
/**
|
||||
* 业务终态,可为空
|
||||
*/
|
||||
private BizFinalStateEnum bizFinalState;
|
||||
/**
|
||||
* 待办的截止时间
|
||||
*/
|
||||
private Date deadline;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -0,0 +1,70 @@
|
||||
package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 代办记录查询参数的数模型
|
||||
* @author cold_blade
|
||||
* @date 2023/9/23
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class PendingMessageQueryRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 3981382821433771344L;
|
||||
|
||||
/**
|
||||
* APP终端类型(前端不care)
|
||||
* WEB: web端页面
|
||||
* MINI_PROGRAM: 安心筑小程序端页面
|
||||
* IOS: 原生IOS端页面
|
||||
* ANDROID: 原生Android端页面
|
||||
* WEB_VIEW: H5页面
|
||||
* WECHAT_MINI_PROGRAM: 微信小程序页面
|
||||
*/
|
||||
private TerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 代办消息状态
|
||||
* UNSENT: 未发送
|
||||
* HAS_BEEN_SENT: 已发送
|
||||
* COMPLETED: 已办
|
||||
* RETRACT: 已撤回
|
||||
* DELETED: 已删除
|
||||
*/
|
||||
private PendingMessageStateEnum msgState;
|
||||
/**
|
||||
* COMPLETED: 已处理
|
||||
* RETRACT: 已撤销
|
||||
* PASSED: 已通过
|
||||
* REJECTED: 已拒绝
|
||||
*/
|
||||
private BizFinalStateEnum bizFinalState;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 工作台id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
/**
|
||||
* 待办消息记录的唯一标识
|
||||
*/
|
||||
@NotBlank(message = "msgIdentityCode is required")
|
||||
private String msgIdentityCode;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -1,13 +1,11 @@
|
||||
package cn.axzo.msg.center.service.pending.request;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
@ -21,7 +19,7 @@ import java.util.Collection;
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class MessageGroupNodeStatisticRequest implements Serializable {
|
||||
public class PendingMessageStatisticRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 9160942889637654608L;
|
||||
|
||||
@ -41,34 +39,11 @@ public class MessageGroupNodeStatisticRequest implements Serializable {
|
||||
/**
|
||||
* 消息的分类结点编码集合
|
||||
*/
|
||||
@NotEmpty(message = "groupNodeCodes is required")
|
||||
private Collection<String> groupNodeCodes;
|
||||
/**
|
||||
* 业务方是否只关注特定身份的消息
|
||||
* true: 是
|
||||
* false: 否
|
||||
* 应用终端类型
|
||||
*/
|
||||
private Boolean withIdentify;
|
||||
/**
|
||||
* 代办角色
|
||||
* PROMOTER: 发起者
|
||||
* CREATOR: 创建者
|
||||
* EXECUTOR: 执行者
|
||||
*/
|
||||
private PendingMessageRoleCategoryEnum roleCategory;
|
||||
/**
|
||||
* 代办消息状态
|
||||
* UNSENT: 未发送
|
||||
* HAS_BEEN_SENT: 已发送
|
||||
* COMPLETED: 已办
|
||||
* RETRACT: 已撤回
|
||||
* DELETED: 已删除
|
||||
*/
|
||||
private PendingMessageStateEnum msgState;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String title;
|
||||
private AppTerminalTypeEnum terminalType;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
@ -1,60 +0,0 @@
|
||||
package cn.axzo.msg.center.service.pending.response;
|
||||
|
||||
import cn.axzo.basics.common.model.IBaseTree;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/9/23
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class MessageGroupNodeResponse implements IBaseTree<MessageGroupNodeResponse, String>, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 972200410809186003L;
|
||||
|
||||
/**
|
||||
* 结点类型
|
||||
* GENERAL_MESSAGE_CENTER: 消息中心
|
||||
* GENERAL_MESSAGE_MODULE: 消息模块
|
||||
* GENERAL_MESSAGE_CATEGORY: 消息分类
|
||||
* PENDING_MESSAGE_CENTER: 待办中心
|
||||
* PENDING_MESSAGE_MODULE: 待办模块
|
||||
* PENDING_MESSAGE_CATEGORY: 待办分类
|
||||
*/
|
||||
private MessageGroupNodeCategoryEnum category;
|
||||
/**
|
||||
* 结点名称
|
||||
*/
|
||||
private String nodeName;
|
||||
/**
|
||||
* 结点编码
|
||||
*/
|
||||
private String nodeCode;
|
||||
/**
|
||||
* 父节点编码
|
||||
*/
|
||||
private String parentNodeCode;
|
||||
/**
|
||||
* 子节点列表
|
||||
*/
|
||||
private List<MessageGroupNodeResponse> nodeChildren;
|
||||
/**
|
||||
* 结点对应的代办数量
|
||||
*/
|
||||
private Integer pendingCount;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,9 @@
|
||||
package cn.axzo.msg.center.service.pending.response;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.ButtonRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.DetailRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.IdentityDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -44,11 +46,15 @@ public class PendingMessageResponse implements Serializable {
|
||||
/**
|
||||
* 卡片信息
|
||||
*/
|
||||
private String cardContent;
|
||||
private List<MessageCardContentItemDTO> cardItems;
|
||||
/**
|
||||
* 代办发起者自然人id
|
||||
*/
|
||||
private Long promoterPersonId;
|
||||
/**
|
||||
* 发起者姓名
|
||||
*/
|
||||
private String promoterName;
|
||||
/**
|
||||
* 代办发起者身份
|
||||
*/
|
||||
@ -57,6 +63,10 @@ public class PendingMessageResponse implements Serializable {
|
||||
* 代办执行者自然人id
|
||||
*/
|
||||
private Long executorPersonId;
|
||||
/**
|
||||
* 执行者姓名
|
||||
*/
|
||||
private String executorName;
|
||||
/**
|
||||
* 代办执行者身份
|
||||
*/
|
||||
@ -73,6 +83,22 @@ public class PendingMessageResponse implements Serializable {
|
||||
* 业务状态描述
|
||||
*/
|
||||
private String bizDesc;
|
||||
/**
|
||||
* 业务标签
|
||||
*/
|
||||
private String bizFlag;
|
||||
/**
|
||||
* 工作台id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
/**
|
||||
* 工作台名称
|
||||
*/
|
||||
private String workspaceName;
|
||||
/**
|
||||
* 待办发起人的企业id
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 业务类型
|
||||
*/
|
||||
@ -86,17 +112,21 @@ public class PendingMessageResponse implements Serializable {
|
||||
*/
|
||||
private Long updateTimestamp;
|
||||
/**
|
||||
* 路由信息,可为空
|
||||
* 待办截至时间戳
|
||||
*/
|
||||
private List<MessageRouterDTO> routers;
|
||||
private Long deadlineTimestamp;
|
||||
/**
|
||||
* 参数及其对应的值的JSON串
|
||||
* 业务详情路由
|
||||
*/
|
||||
private String routerParams;
|
||||
private DetailRouterDTO detailRouter;
|
||||
/**
|
||||
* 业务扩展参数
|
||||
* 按钮路由
|
||||
*/
|
||||
private String bizExtParams;
|
||||
private List<ButtonRouterDTO> buttonRouters;
|
||||
/**
|
||||
* 业务终态的印章图片地址
|
||||
*/
|
||||
private String bizFinalStateIcon;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
package cn.axzo.msg.center.service.pending.response;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @description
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/9/23
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class PendingMessageStatisticResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 972200410809186003L;
|
||||
|
||||
/**
|
||||
* 分类名称
|
||||
*/
|
||||
private String groupName;
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
private String groupCode;
|
||||
/**
|
||||
* 分类对应的代办数量
|
||||
*/
|
||||
private Integer pendingCount;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
package cn.axzo.msg.center.service.pending.response;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author haiyangjin
|
||||
* @date 2023/11/15
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PushPendingMessageDTO {
|
||||
/**
|
||||
* 消息记录ID
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 请求批次号
|
||||
*/
|
||||
private String requestNo;
|
||||
|
||||
/**
|
||||
* 执行者ID
|
||||
*/
|
||||
private Long executorId;
|
||||
|
||||
/**
|
||||
* 执行者的自然人ID
|
||||
*/
|
||||
private Long executorPersonId;
|
||||
}
|
||||
@ -1,8 +1,10 @@
|
||||
package cn.axzo.msg.center.service.template.request;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
@ -39,11 +41,17 @@ public class MessageTemplateCreateRequest implements Serializable {
|
||||
private String templateName;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
* NOTIFICATION: 通知
|
||||
* PENDING: 待办
|
||||
*/
|
||||
@NotNull(message = "category is required")
|
||||
private MessageCategoryEnum category;
|
||||
private MessageGroupCategoryEnum category;
|
||||
/**
|
||||
* 消息类型
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum subCategory;
|
||||
/**
|
||||
* 消息分类树的叶结点的结点编码列表
|
||||
*/
|
||||
@ -55,15 +63,15 @@ public class MessageTemplateCreateRequest implements Serializable {
|
||||
* C_WORKER_APP: C-安心筑工人版
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
/**
|
||||
* 该模板最低支持的APP版本号
|
||||
*/
|
||||
private String minAppVersion;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
@NotBlank(message = "msgTitle is required")
|
||||
private String msgTitle;
|
||||
/**
|
||||
* 消息卡片信息标签列表,可为空
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
@ -73,10 +81,18 @@ public class MessageTemplateCreateRequest implements Serializable {
|
||||
* 消息图标
|
||||
*/
|
||||
private String msgIcon;
|
||||
/**
|
||||
* 消息卡片信息标签列表,可为空
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 详情展示策略
|
||||
*/
|
||||
private MessageDetailRouteStrategyDTO detailStrategy;
|
||||
/**
|
||||
* 路由策略列表
|
||||
*/
|
||||
private List<MessageRouterButtonDTO> routers;
|
||||
private List<MessageButtonRouteStrategyDTO> routers;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -8,6 +8,7 @@ import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author cold_blade
|
||||
@ -29,11 +30,12 @@ public class MessageTemplatePageRequest extends PageRequest implements Serializa
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
* 消息子类型
|
||||
* GENERAL_MESSAGE: 通知
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum category;
|
||||
private Collection<MessageCategoryEnum> categories;
|
||||
/**
|
||||
* 分类树的结点编码
|
||||
*/
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
package cn.axzo.msg.center.service.template.request;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
@ -49,14 +50,14 @@ public class MessageTemplateUpdateRequest implements Serializable {
|
||||
* C_WORKER_APP: C-安心筑工人版
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
/**
|
||||
* 该模板最低支持的APP版本号
|
||||
*/
|
||||
private String minAppVersion;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String msgTitle;
|
||||
/**
|
||||
* 消息卡片信息标签列表
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
@ -65,10 +66,18 @@ public class MessageTemplateUpdateRequest implements Serializable {
|
||||
* 消息图标
|
||||
*/
|
||||
private String msgIcon;
|
||||
/**
|
||||
* 消息卡片信息标签列表
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> msgCardContentItems;
|
||||
/**
|
||||
* 详情展示策略
|
||||
*/
|
||||
private MessageDetailRouteStrategyDTO detailStrategy;
|
||||
/**
|
||||
* 路由策略列表
|
||||
*/
|
||||
private List<MessageRouterButtonDTO> routers;
|
||||
private List<MessageButtonRouteStrategyDTO> routers;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
package cn.axzo.msg.center.service.template.response;
|
||||
|
||||
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
|
||||
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -11,7 +13,6 @@ import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@ -35,10 +36,16 @@ public class MessageTemplateDetailResponse implements Serializable {
|
||||
private String templateName;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
* NOTIFICATION: 通知
|
||||
* PENDING: 待办
|
||||
*/
|
||||
private MessageCategoryEnum category;
|
||||
private MessageGroupCategoryEnum category;
|
||||
/**
|
||||
* 消息子类型
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum subCategory;
|
||||
/**
|
||||
* 消息分类树的叶结点的结点编码列表
|
||||
*/
|
||||
@ -49,14 +56,14 @@ public class MessageTemplateDetailResponse implements Serializable {
|
||||
* C_WORKER_APP: C-安心筑工人版
|
||||
*/
|
||||
private List<PushTerminalEnum> pushTerminals;
|
||||
/**
|
||||
* 该模板最低支持的APP版本号
|
||||
*/
|
||||
private String minAppVersion;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
private String msgTitle;
|
||||
/**
|
||||
* 卡片信息标签列表
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> cardContentItems;
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
@ -65,10 +72,18 @@ public class MessageTemplateDetailResponse implements Serializable {
|
||||
* 消息图标
|
||||
*/
|
||||
private String msgIcon;
|
||||
/**
|
||||
* 卡片信息标签列表
|
||||
*/
|
||||
private List<MessageCardContentItemDTO> cardContentItems;
|
||||
/**
|
||||
* 详情展示策略
|
||||
*/
|
||||
private MessageDetailRouteStrategyDTO detailStrategy;
|
||||
/**
|
||||
* 路由策略列表
|
||||
*/
|
||||
private List<MessageRouterButtonDTO> routers;
|
||||
private List<MessageButtonRouteStrategyDTO> routers;
|
||||
/**
|
||||
* 模板创建时间戳
|
||||
*/
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.msg.center.service.template.response;
|
||||
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.StatusEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.Getter;
|
||||
@ -30,10 +31,16 @@ public class MessageTemplateListResponse implements Serializable {
|
||||
private String templateCode;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
* NOTIFICATION: 通知
|
||||
* PENDING: 待办
|
||||
*/
|
||||
private MessageCategoryEnum category;
|
||||
private MessageGroupCategoryEnum category;
|
||||
/**
|
||||
* 消息子类型
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum subCategory;
|
||||
/**
|
||||
* 消息标题
|
||||
*/
|
||||
|
||||
@ -30,8 +30,9 @@ public class MessageTemplatePageResponse implements Serializable {
|
||||
private String templateCode;
|
||||
/**
|
||||
* 消息类型
|
||||
* GENERAL_MESSAGE: 普通消息
|
||||
* PENDING_MESSAGE: 待办消息
|
||||
* GENERAL_MESSAGE: 通知
|
||||
* BIZ_PENDING_MESSAGE: 业务待办
|
||||
* APPROVAL_PENDING_MESSAGE: 审批待办
|
||||
*/
|
||||
private MessageCategoryEnum category;
|
||||
/**
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
package cn.axzo.msg.center.dal;
|
||||
|
||||
import cn.axzo.msg.center.dal.mapper.MessageRouteButtonMapper;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteButton;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* @author cold_blade
|
||||
* @date 2023/11/8
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MessageRouteButtonDao extends ServiceImpl<MessageRouteButtonMapper, MessageRouteButton> {
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
package cn.axzo.msg.center.dal;
|
||||
|
||||
import cn.axzo.msg.center.dal.mapper.MessageRouteDetailMapper;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteDetail;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* @author cold_blade
|
||||
* @date 2023/11/8
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MessageRouteDetailDao extends ServiceImpl<MessageRouteDetailMapper, MessageRouteDetail> {
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
package cn.axzo.msg.center.dal;
|
||||
|
||||
import cn.axzo.msg.center.dal.mapper.MessageRouterConfigMapper;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouterConfig;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* @author cold_blade
|
||||
* @date 2023/9/28
|
||||
* @version 1.0
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MessageRouterConfigDao extends ServiceImpl<MessageRouterConfigMapper, MessageRouterConfig> {
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package cn.axzo.msg.center.dal.mapper;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteButton;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息路由按钮表Mapper
|
||||
* @author cold_blade
|
||||
* @date 2023/9/20
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface MessageRouteButtonMapper extends BaseMapper<MessageRouteButton> {
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
package cn.axzo.msg.center.dal.mapper;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouteDetail;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息路由业务详情表Mapper
|
||||
* @author cold_blade
|
||||
* @date 2023/9/20
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface MessageRouteDetailMapper extends BaseMapper<MessageRouteDetail> {
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
package cn.axzo.msg.center.dal.mapper;
|
||||
|
||||
import cn.axzo.msg.center.domain.entity.MessageRouterConfig;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* @description
|
||||
* 消息路由配置表Mapper
|
||||
* @author cold_blade
|
||||
* @date 2023/9/20
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface MessageRouterConfigMapper extends BaseMapper<MessageRouterConfig> {
|
||||
}
|
||||
@ -35,7 +35,6 @@
|
||||
<dependency>
|
||||
<groupId>cn.axzo.msgcenter</groupId>
|
||||
<artifactId>msg-center-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@ -29,7 +29,7 @@ import java.io.Serializable;
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("general_message_record")
|
||||
@TableName(value = "general_message_record", autoResultMap = true)
|
||||
public class GeneralMessageRecord extends BaseEntity<GeneralMessageRecord> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -1271402884501451185L;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package cn.axzo.msg.center.domain.entity;
|
||||
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntity;
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
|
||||
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.StatusEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -20,7 +20,7 @@ import java.io.Serializable;
|
||||
@Setter
|
||||
@Getter
|
||||
@TableName("message_base_template")
|
||||
public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> implements Serializable {
|
||||
public class MessageBaseTemplate extends BaseEntityExt<MessageBaseTemplate> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -880409106378455813L;
|
||||
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
package cn.axzo.msg.center.domain.entity;
|
||||
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
|
||||
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
|
||||
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
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;
|
||||
|
||||
/**
|
||||
* 消息路由按钮
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/7
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName(value = "message_route_button", autoResultMap = true)
|
||||
public class MessageRouteButton extends BaseEntityExt<MessageRouteButton> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 2815163121368837804L;
|
||||
|
||||
/**
|
||||
* 按钮名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 按钮唯一标识
|
||||
*/
|
||||
private String btnCode;
|
||||
/**
|
||||
* 模板code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 按钮来源
|
||||
*/
|
||||
private RouterButtonSourceEnum source;
|
||||
/**
|
||||
* 路由类型
|
||||
*/
|
||||
private RouterCategoryEnum category;
|
||||
/**
|
||||
* API地址,仅当按钮是接口调用类型时有值
|
||||
*/
|
||||
private String apiUrl;
|
||||
/**
|
||||
* 按钮style配置
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private JSONArray style;
|
||||
/**
|
||||
* 按钮优先级,数值越大优先级越低
|
||||
*/
|
||||
private Integer priority;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
package cn.axzo.msg.center.domain.entity;
|
||||
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
|
||||
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 消息路由详情
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/8
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("message_route_detail")
|
||||
public class MessageRouteDetail extends BaseEntityExt<MessageRouteDetail> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6868015511438657632L;
|
||||
|
||||
/**
|
||||
* 显示名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 模板code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 业务详情展示策略
|
||||
*/
|
||||
private BizDetailShowStrategyEnum showStrategy;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
package cn.axzo.msg.center.domain.entity;
|
||||
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
|
||||
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 消息路由配置
|
||||
*
|
||||
* @author cold_blade
|
||||
* @date 2023/11/7
|
||||
* @version 1.0
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("message_router_config")
|
||||
public class MessageRouterConfig extends BaseEntityExt<MessageRouterConfig> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 2472826034240755399L;
|
||||
|
||||
/**
|
||||
* 路由编码
|
||||
*/
|
||||
private String routerCode;
|
||||
/**
|
||||
* 路由的系统类型
|
||||
*/
|
||||
private TerminalTypeEnum terminalType;
|
||||
/**
|
||||
* 路由地址
|
||||
*/
|
||||
private String url;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,8 @@
|
||||
package cn.axzo.msg.center.domain.entity;
|
||||
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntity;
|
||||
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
|
||||
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
|
||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
|
||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||
@ -11,6 +12,7 @@ import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @description
|
||||
@ -22,7 +24,7 @@ import java.io.Serializable;
|
||||
@Setter
|
||||
@Getter
|
||||
@TableName("pending_message_record")
|
||||
public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> implements Serializable {
|
||||
public class PendingMessageRecord extends BaseEntityExt<PendingMessageRecord> implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 2184329278851311992L;
|
||||
|
||||
@ -30,6 +32,10 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 消息的唯一标识
|
||||
*/
|
||||
private String identityCode;
|
||||
/**
|
||||
* 请求批次号
|
||||
*/
|
||||
private String requestNo;
|
||||
/**
|
||||
* 发起者ID
|
||||
*/
|
||||
@ -38,6 +44,10 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 发起者的自然人ID
|
||||
*/
|
||||
private Long promoterPersonId;
|
||||
/**
|
||||
* 发起者姓名
|
||||
*/
|
||||
private String promoterName;
|
||||
/**
|
||||
* 发起者身份
|
||||
*/
|
||||
@ -50,6 +60,10 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 执行者的自然人ID
|
||||
*/
|
||||
private Long executorPersonId;
|
||||
/**
|
||||
* 执行者姓名
|
||||
*/
|
||||
private String executorName;
|
||||
/**
|
||||
* 执行者身份
|
||||
*/
|
||||
@ -78,6 +92,10 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 消息所属组织名称
|
||||
*/
|
||||
private String orgName;
|
||||
/**
|
||||
* 消息所属企业ID
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 待办状态
|
||||
*/
|
||||
@ -98,6 +116,10 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 业务描述eg:流程结点描述
|
||||
*/
|
||||
private String bizDesc;
|
||||
/**
|
||||
* 业务标签
|
||||
*/
|
||||
private String bizFlag;
|
||||
/**
|
||||
* 业务扩展参数
|
||||
*/
|
||||
@ -106,6 +128,14 @@ public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> imple
|
||||
* 路由参数(留存)
|
||||
*/
|
||||
private String routerParams;
|
||||
/**
|
||||
* 业务终态,可为空
|
||||
*/
|
||||
private BizFinalStateEnum bizFinalState;
|
||||
/**
|
||||
* 待办的截止时间
|
||||
*/
|
||||
private Date deadline;
|
||||
/**
|
||||
* 重试次数
|
||||
*/
|
||||
|
||||
@ -45,7 +45,6 @@
|
||||
<dependency>
|
||||
<groupId>cn.axzo.msgcenter</groupId>
|
||||
<artifactId>msg-center-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.msg.center.domain</groupId>
|
||||
|
||||
@ -61,7 +61,6 @@
|
||||
<dependency>
|
||||
<groupId>cn.axzo.msgcenter</groupId>
|
||||
<artifactId>msg-center-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user