Merge branch 'dev' of axzsource.com:universal/infrastructure/backend/msg-center-plat into dev

This commit is contained in:
yanglin 2024-10-10 14:17:45 +08:00
commit b64b2c6c93
20 changed files with 184 additions and 155 deletions

View File

@ -161,6 +161,10 @@
<groupId>cn.axzo.apollo</groupId>
<artifactId>apollo-api</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
</dependency>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>

View File

@ -3,11 +3,10 @@ package cn.axzo.msg.center.message.domain.param;
import cn.axzo.msg.center.common.exception.ServiceException;
import cn.axzo.msg.center.service.dto.MessageTemplateButtonV3DTO;
import cn.axzo.msg.center.service.dto.MessageTemplateCardJumpV3DTO;
import cn.axzo.msg.center.service.template.request.MessageTemplateGroupV3CreateRequest;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import cn.axzo.msg.center.service.template.request.MessageTemplateGroupV3CreateRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateV3CreateRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateSyncDto;
import cn.axzo.msg.center.service.template.request.MessageTemplateV3DeleteRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateV3UpdateRequest;
import cn.axzo.msg.center.utils.MessageTemplateCategoryUtil;
@ -140,6 +139,7 @@ public class MessageTemplateV3SaveOrUpdateParam implements Serializable {
.title(request.getMsgTitle())
.content(request.getMsgContent())
.groups(request.getGroups())
.cardJump(request.getCardJump())
.minAppVersion(request.getMinAppVersion())
.icon(request.getMsgIcon())
.operatorId(request.getOperatorId())

View File

@ -1,12 +1,9 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3;
import cn.axzo.msg.center.domain.entity.MessageTemplateButtonV3;
import cn.axzo.msg.center.service.dto.MessageTemplateButtonV3DTO;
import cn.axzo.msg.center.service.template.request.MessageTemplateGroupV3CreateRequest;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 消息模板分类管理
@ -30,4 +27,6 @@ public interface MessageTemplateButtonV3Service {
void deleteTemplateButton(String templateNode);
List<MessageTemplateButtonV3> listMessageTemplateButtonByCode(String messageTemplateCode);
}

View File

@ -6,6 +6,7 @@ import cn.axzo.msg.center.message.service.MessageTemplateButtonV3Service;
import cn.axzo.msg.center.service.dto.MessageTemplateButtonV3DTO;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -65,4 +66,16 @@ public class MessageTemplateButtonV3ServiceImpl implements MessageTemplateButton
.setSql("is_delete = id")
.update();
}
@Override
public List<MessageTemplateButtonV3> listMessageTemplateButtonByCode(String messageTemplateCode) {
if (StringUtils.isBlank(messageTemplateCode)) {
log.info("messageTemplateCode is blank.");
return Lists.newArrayList();
}
return messageTemplateButtonV3Dao.lambdaQuery()
.eq(MessageTemplateButtonV3::getTemplateCode, messageTemplateCode)
.eq(MessageTemplateButtonV3::getIsDelete, 0)
.list();
}
}

View File

@ -16,6 +16,15 @@ 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;
@ -26,14 +35,6 @@ import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
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;
/**
* @description
@ -79,7 +80,7 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe
return;
}
saveDetailRouter(router.getRouteDetail());
batchSaveButtonRouter(router.getRouteButtons());
batchSaveButtonRouter(router.getRouteButtons(), isUpdate);
}
@Override
@ -220,7 +221,7 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe
messageRouterConfigDao.saveBatch(detailRouter.fetchMessageRouterConfigs());
}
private void batchSaveButtonRouter(List<MessageRouteButtonDTO> buttonRouters) {
private void batchSaveButtonRouter(List<MessageRouteButtonDTO> buttonRouters, boolean isUpdate) {
if (CollectionUtils.isEmpty(buttonRouters)) {
log.info("buttonRouters is empty.");
return;
@ -230,7 +231,7 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe
.map(e -> MessageRouteButtonWrapper.of(e.fetchMessageRouteButton(), e))
.collect(Collectors.toList());
// 生成自定义按钮的唯一标识和顺序
buildButtonCodeAndPriority(routeButtonWrappers);
buildButtonCodeAndPriority(routeButtonWrappers, isUpdate);
// 保存模板对应的按钮路由
List<MessageRouteButton> routeButtons = routeButtonWrappers.stream()
.map(MessageRouteButtonWrapper::getRouteButton)
@ -243,10 +244,10 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe
messageRouterConfigDao.saveBatch(routerConfigs);
}
private void buildButtonCodeAndPriority(List<MessageRouteButtonWrapper> routeButtonWrappers) {
private void buildButtonCodeAndPriority(List<MessageRouteButtonWrapper> routeButtonWrappers, boolean isUpdate) {
for (int i = 0; i < routeButtonWrappers.size(); i++) {
MessageRouteButton button = routeButtonWrappers.get(i).getRouteButton();
if (RouterButtonSourceEnum.CUSTOM.equals(button.getSource())) {
if (!isUpdate && RouterButtonSourceEnum.CUSTOM.equals(button.getSource())) {
// 这里仅对自定义的按钮设置按钮标识
button.setBtnCode(UUIDUtil.uuidString());
}

View File

@ -8,14 +8,14 @@ import cn.axzo.msg.center.common.utils.PageHelperUtil;
import cn.axzo.msg.center.dal.MessageBaseTemplateDao;
import cn.axzo.msg.center.dal.MessageTemplateV3Dao;
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
import cn.axzo.msg.center.domain.entity.MessageTemplateButtonV3;
import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3;
import cn.axzo.msg.center.domain.entity.MessageTemplateV3;
import cn.axzo.msg.center.inside.notices.config.DetailStyleInfo;
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.dto.MessageTemplateDTO;
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.MessageTemplateV3SaveOrUpdateParam;
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
import cn.axzo.msg.center.message.service.MessageTemplateButtonV3Service;
@ -25,23 +25,24 @@ import cn.axzo.msg.center.message.service.MessageTemplateRouterService;
import cn.axzo.msg.center.message.service.MessageTemplateV3Service;
import cn.axzo.msg.center.message.service.group.GroupTemplateService;
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.MessageTemplateButtonV3DTO;
import cn.axzo.msg.center.service.dto.MessageTemplateCardJumpV3DTO;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import cn.axzo.msg.center.service.enums.StatusEnum;
import cn.axzo.msg.center.service.enums.YesOrNo;
import cn.axzo.msg.center.service.template.request.MessageTemplateV3PageRequest;
import cn.axzo.msg.center.service.template.response.MessageDetailStyle;
import cn.axzo.msg.center.service.template.response.MessageTemplateGroupV3DTO;
import cn.axzo.msg.center.service.template.response.MessageTemplateV3DetailResponse;
import cn.axzo.msg.center.service.template.response.MessageTemplateV3PageResponse;
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 cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -132,7 +133,7 @@ public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service {
messageTemplateV3Dao.lambdaUpdate()
.eq(MessageTemplateV3::getCode, param.getTemplateCode())
.eq(MessageTemplateV3::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.setSql("is_delete = id")
.set(MessageTemplateV3::getDisplayOnList, YesOrNo.NO.getCode())
.update();
}
@ -152,10 +153,15 @@ public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service {
}
// 卡片分组
List<MessageTemplateGroupV3> templateGroupV3List = messageTemplateGroupV3Service.listMessageTemplateGroupByCode(templateCode);
// 获取模板配置的路由信息
// MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(templateCode)
// .orElse(null);
return convert(baseTemplate, templateGroupV3List, null);
//按钮列表
List<MessageTemplateButtonV3> buttonV3List = messageTemplateButtonV3Service.listMessageTemplateButtonByCode(templateCode);
// 获取模板关联分类的path列表
List<String> groupNodePaths = messageTemplateGroupService.listMessageTemplateGroupPaths(
Lists.newArrayList(templateCode)).getOrDefault(templateCode, Collections.emptyList());
return convert(baseTemplate, templateGroupV3List, buttonV3List, groupNodePaths);
}
@Override
@ -362,7 +368,7 @@ public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service {
.set(Objects.nonNull(param.getCardJump()) && Objects.nonNull(param.getCardJump().getCardUrlOpenStrategy())
,MessageTemplateV3::getCardUrlOpenStrategy,param.getCardJump().getCardUrlOpenStrategy())
.set(Objects.nonNull(param.getCardJump()) && Objects.nonNull(param.getCardJump().getCardUrlConfig())
,MessageTemplateV3::getCardUrlConfig, param.getCardJump().getCardUrlConfig())
,MessageTemplateV3::getCardUrlConfig, JSON.toJSONString(param.getCardJump().getCardUrlConfig()))
.set(StringUtils.isNotBlank(param.getDetailStyleCode()),
MessageTemplateV3::getDetailStyleCode, param.getDetailStyleCode())
.set(MessageTemplateV3::getUpdatePersonId, param.getOperatorId())
@ -474,18 +480,24 @@ public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service {
}
private MessageTemplateV3DetailResponse convert(MessageTemplateV3 record, List<MessageTemplateGroupV3> messageTemplateGroups,
MessageTemplateRouterDTO msgTemplateRouter) {
List<MessageTemplateButtonV3> buttonV3List, List<String> groupNodePaths) {
List<String> groupNodeCodes = Lists.newArrayList();
// if (CollUtil.isNotEmpty(groupNodePaths)) {
// // 将path解析中解析出分类结点路径叶结点的编码
// groupNodeCodes = groupNodePaths.stream()
// .map(GroupTreeNodePathDTO::parseLeafNodeCode)
// .collect(Collectors.toList());
// }
if (CollUtil.isNotEmpty(groupNodePaths)) {
// 将path解析中解析出分类结点路径叶结点的编码
groupNodeCodes = groupNodePaths.stream()
.map(GroupTreeNodePathDTO::parseLeafNodeCode)
.collect(Collectors.toList());
}
MessageDetailStyle styleType = pendingBizConfig
.findMessageDetailType(record.getDetailStyleCode())
.orElse(null);
MessageTemplateCardJumpV3DTO cardJumpV3DTO = MessageTemplateCardJumpV3DTO.builder().build();
if (Objects.nonNull(record)) {
cardJumpV3DTO = MessageTemplateCardJumpV3DTO.builder().cardUrlConfig(record.getCardUrlConfig()).cardUrlOpenStrategy(record.getCardUrlOpenStrategy()).build();
}
return MessageTemplateV3DetailResponse.builder()
.templateCode(record.getCode())
.templateName(record.getName())
.detailStyle(styleType)
.category(MessageTemplateCategoryUtil.parentCategory(record.getMsgCategory()))
@ -494,10 +506,10 @@ public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service {
.pushTerminals(JSON.parseArray(record.getPushTerminal(), PushTerminalEnum.class))
.msgTitle(record.getTitle())
.msgContent(record.getContent())
.messageTemplateGroups(CollectionUtils.isNotEmpty(messageTemplateGroups) ? BeanUtil.copyToList(messageTemplateGroups, MessageTemplateGroupV3DTO.class) : Lists.newArrayList())
.groups(CollectionUtils.isNotEmpty(messageTemplateGroups) ? BeanUtil.copyToList(messageTemplateGroups, MessageTemplateGroupV3DTO.class) : Lists.newArrayList())
.buttons(CollectionUtils.isNotEmpty(buttonV3List) ? BeanUtil.copyToList(buttonV3List, MessageTemplateButtonV3DTO.class) : Lists.newArrayList())
.cardJump(cardJumpV3DTO)
.msgIcon(record.getIcon())
// .detailStrategy(MessageRouterUtil.fetchBizDetailShowStrategy(msgTemplateRouter).orElse(null))
// .routers(MessageRouterUtil.fetchMessageRouterButtonStrategies(msgTemplateRouter))
.minAppVersion(record.getMinAppVersion())
.createTimestamp(record.getCreateAt().getTime())
.updateTimestamp(record.getUpdateAt().getTime())

View File

@ -0,0 +1,23 @@
package cn.axzo.msg.center.service.domain;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class DetailConfig {
/**
* 详情名称
*/
private String name;
/**
* 链接配置
*/
private UrlConfig urlConfig;
}

View File

@ -20,6 +20,6 @@ public class GroupConfig {
/**
* 详情的配置
*/
private UrlConfig detail;
private DetailConfig detail;
}

View File

@ -35,7 +35,7 @@ public class MessageTemplateButtonV3DTO implements Serializable {
/**
* 预设按钮类型
*/
private PresetButtonType presetBtnCode;
private PresetButtonType presetBtnType;
/**
* 按钮来源
@ -87,7 +87,7 @@ public class MessageTemplateButtonV3DTO implements Serializable {
// return StringUtils.isNotBlank(apiUrl);
// }
if (RouterCategoryEnum.PRESET_BUTTON.equals(category)) {
return presetBtnCode != null;
return presetBtnType != null;
}
//TODO
return true;

View File

@ -22,7 +22,6 @@ public enum RouterCategoryEnum {
/**
* 接口调用
*/
@Deprecated
ACTION("接口调用"),
/**
* 预设按钮

View File

@ -38,7 +38,7 @@ public interface MessageTemplateV3Client {
* @param request 模板数据模型
* @return 模板编码
*/
@PostMapping(value = "/message/template/add/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/add", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<String> save(@RequestBody @Valid MessageTemplateV3CreateRequest request);
/**
@ -46,7 +46,7 @@ public interface MessageTemplateV3Client {
*
* @param request 模板数据模型
*/
@PostMapping(value = "/message/template/update/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/update", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Void> update(@RequestBody @Valid MessageTemplateV3UpdateRequest request);
/**
@ -54,7 +54,7 @@ public interface MessageTemplateV3Client {
*
* @param request 模板数据模型
*/
@PostMapping(value = "/message/template/delete/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/delete", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Void> delete(@RequestBody @Valid MessageTemplateV3DeleteRequest request);
/**
@ -63,7 +63,7 @@ public interface MessageTemplateV3Client {
* @param templateCode 消息模板编码
* @return 消息模板详情
*/
@PostMapping(value = "/message/template/detail/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/detail", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<MessageTemplateV3DetailResponse> detail(@RequestParam("templateCode") String templateCode);
/**
@ -72,7 +72,7 @@ public interface MessageTemplateV3Client {
* @param request 分页查询参数
* @return 模板列表
*/
@PostMapping(value = "/message/template/page/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/page", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Page<MessageTemplateV3PageResponse>> page(@RequestBody MessageTemplateV3PageRequest request);
/**
@ -81,7 +81,7 @@ public interface MessageTemplateV3Client {
* @param templateCodes 模板编码集合
* @return 模板列表
*/
@PostMapping(value = "/message/template/list/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/list", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<List<MessageTemplatePageResponse>> listByCodes(@RequestParam("templateCodes") Collection<String> templateCodes);
/**
@ -89,25 +89,25 @@ public interface MessageTemplateV3Client {
*
* @param request 模板状态
*/
@PostMapping(value = "/message/template/update-status/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/update-status", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Void> updateStatus(@RequestBody @Valid MessageTemplateV3UpdateStatusRequest request);
/**
* 查询消息模板
*/
@PostMapping(value = "/message/template/sync/get/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/sync/get", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<MessageTemplateSyncDto> getSyncMessageTemplate(@RequestBody @Valid MessageTemplateSyncQueryRequest request);
/**
* 同步消息模板
* req-1896 说明仅pre环境能同步
*/
@PostMapping(value = "/message/template/sync/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@PostMapping(value = "/message/template/v3/sync", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Void> syncTemplate(@RequestBody @Valid MessageTemplateSyncDto request);
/**
* 获取所有消息样式
*/
@GetMapping(value = "/message/template/list-template-detail-styles/v3", produces = {MediaType.APPLICATION_JSON_VALUE})
@GetMapping(value = "/message/template/v3/list-template-detail-styles", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<List<MessageDetailStyle>> listTemplateDetailStyles();
}

View File

@ -29,8 +29,13 @@ public class MessageTemplateV3DeleteRequest implements Serializable {
/**
* 操作者的自然人id
*/
@NotNull(message = "operatorId is required")
private Long operatorId;
/**
* 操作人姓名
*/
private String operatorName;
/**
* 模板编码
*/

View File

@ -2,6 +2,8 @@ package cn.axzo.msg.center.service.template.request;
import cn.axzo.msg.center.service.dto.MessageTemplateButtonV3DTO;
import cn.axzo.msg.center.service.dto.MessageTemplateCardJumpV3DTO;
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 com.alibaba.fastjson.JSONObject;
@ -29,8 +31,11 @@ public class MessageTemplateV3UpdateRequest implements Serializable {
/**
* 操作者的自然人id
*/
@NotNull(message = "operatorId is required")
private Long operatorId;
/**
* 操作人人姓名
*/
private String operatorName;
/**
* 模板编码
*/
@ -40,6 +45,22 @@ public class MessageTemplateV3UpdateRequest implements Serializable {
* 模板名称
*/
private String templateName;
/**
* 消息类型
* NOTIFICATION: 通知
* PENDING: 待办
*/
@NotNull(message = "category is required")
private MessageGroupCategoryEnum category;
/**
* 消息类型
* BIZ_PENDING_MESSAGE: 业务待办
* APPROVAL_PENDING_MESSAGE: 审批待办
*/
private MessageCategoryEnum subCategory;
/**
* 消息分类树的叶结点的结点编码列表
*/
@ -82,10 +103,7 @@ public class MessageTemplateV3UpdateRequest implements Serializable {
* 待办样式, BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的
*/
private String detailStyleCode;
/**
* 操作人人姓名
*/
private String operatorName;
private JSONObject pushData;

View File

@ -1,7 +1,5 @@
package cn.axzo.msg.center.service.template.response;
import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageTemplateButtonV3DTO;
import cn.axzo.msg.center.service.dto.MessageTemplateCardJumpV3DTO;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
@ -11,9 +9,8 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
@ -23,8 +20,7 @@ import java.util.List;
* @date 2023/10/11
* @version 1.0
*/
@Setter
@Getter
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ -32,6 +28,11 @@ public class MessageTemplateV3DetailResponse implements Serializable {
private static final long serialVersionUID = 6772912658753264863L;
/**
* 模板编码
*/
private String templateCode;
/**
* 模板名称
*/
@ -77,7 +78,7 @@ public class MessageTemplateV3DetailResponse implements Serializable {
/**
* 卡片分组
*/
private List<MessageTemplateGroupV3DTO> messageTemplateGroups;
private List<MessageTemplateGroupV3DTO> groups;
/**
* 卡片跳转
*/

View File

@ -1,7 +1,7 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
import cn.axzo.msg.center.service.enums.PresetButtonType;
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
@ -12,8 +12,6 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author yanglin
*/
@ -35,7 +33,7 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator<MessageTempl
/**
* 预设按钮类型
*/
private PresetButtonType presetBtnCode;
private PresetButtonType presetBtnType;
/**
* 按钮来源
@ -47,17 +45,22 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator<MessageTempl
*/
private RouterCategoryEnum category;
/**
* API地址,仅当按钮是接口调用类型时有值
*/
private String apiUrl;
/**
* 按钮链接配置
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
@TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
private UrlConfig urlConfig;
/**
* 按钮style配置
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<ButtonStyleEnum> style;
private JSONArray style;
/**
* 执行人可见true 不可见false
@ -74,4 +77,18 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator<MessageTempl
*/
private Integer priority;
@TableField(typeHandler = FastjsonTypeHandler.class)
private RecordExt recordExt;
public RecordExt getOrCreateRecordExt() {
if (recordExt == null) recordExt = new RecordExt();
return recordExt;
}
@Setter
@Getter
public static class RecordExt {
private String btnCode;
}
}

View File

@ -11,12 +11,14 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* @author yanglin
*/
@Setter
@Getter
@Accessors(chain = true)
@TableName(value = "message_template_v3", autoResultMap = true)
public class MessageTemplateV3 extends BaseEntityWithOperator<MessageTemplateV3> {

View File

@ -89,6 +89,10 @@
<artifactId>msg-center-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
</dependency>
</dependencies>
<!-- <build>-->

View File

@ -1,80 +0,0 @@
package cn.axzo.msg.center.notices.client.config;
import cn.axzo.trade.datasecurity.mybatisplus.interceptor.MybatisPlusCryptInterceptor;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.InterceptorChain;
import org.apache.ibatis.session.SqlSessionFactory;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Set;
/**
* @author yanglin
*/
@Slf4j
//@Component
public class MybatisInterceptorAnalyzeProcessor implements BeanPostProcessor {
private static final Set<Class<?>> EXPECTED_INTERCEPTORS = Sets.newHashSet(
MybatisPlusCryptInterceptor.class);
@Override
public Object postProcessBeforeInitialization(
@NotNull Object bean, @NotNull String beanName) throws BeansException {
if (bean instanceof SqlSessionFactory) {
try {
analyze((SqlSessionFactory) bean);
} catch (Exception e) {
log.warn("SqlSessionFactory analyze error", e);
}
}
return bean;
}
private void analyze(SqlSessionFactory sessionFactory) {
org.apache.ibatis.session.Configuration configuration = sessionFactory.getConfiguration();
InterceptorChain oldChain = getFieldValue(configuration, "interceptorChain");
List<Interceptor> oldInterceptors = getFieldValue(oldChain, "interceptors");
AnalyzeInterceptorChain newChain = new AnalyzeInterceptorChain();
for (Interceptor interceptor : oldInterceptors)
newChain.addInterceptor(interceptor);
setFieldValue(configuration, "interceptorChain", newChain);
}
@SuppressWarnings({"unchecked", "DataFlowIssue"})
private static <T> T getFieldValue(Object obj, String fieldName) {
Field field = ReflectionUtils.findField(obj.getClass(), fieldName);
field.setAccessible(true);
return (T)ReflectionUtils.getField(field, obj);
}
@SuppressWarnings("DataFlowIssue")
private static void setFieldValue(Object obj, String fieldName, Object value) {
Field field = ReflectionUtils.findField(obj.getClass(), fieldName);
Field modifiers = ReflectionUtils.findField(Field.class, "modifiers");
field.setAccessible(true);
modifiers.setAccessible(true);
ReflectionUtils.setField(modifiers, field, field.getModifiers() & ~Modifier.FINAL);
ReflectionUtils.setField(field, obj, value);
}
private static class AnalyzeInterceptorChain extends InterceptorChain {
@Override
public void addInterceptor(Interceptor interceptor) {
super.addInterceptor(interceptor);
if (EXPECTED_INTERCEPTORS.contains(interceptor.getClass()))
log.info("Adding interceptor={}", interceptor.getClass().getName());
else
log.warn("Unexpected interceptor={}", interceptor.getClass().getName(), new RuntimeException());
}
}
}

13
pom.xml
View File

@ -37,6 +37,8 @@
<lombok.version>1.18.22</lombok.version>
<binarywang.weixin-java.version>4.5.0</binarywang.weixin-java.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
<feign-httpclient.version>11.8</feign-httpclient.version>
<jetbrains.version>26.0.0</jetbrains.version>
</properties>
<dependencyManagement>
@ -87,9 +89,14 @@
<version>${msg-center-api-version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>${feign-httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>${jetbrains.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -78,6 +78,10 @@
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
</dependencies>
<build>