From 5887c736a1b0bef653fb5d69fb81d0da4ec97ae2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 2 Sep 2024 13:49:07 +0800 Subject: [PATCH 01/10] =?UTF-8?q?REQ-2699:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=8D=95=E4=BD=8D=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/api/MessageAPIV4Test.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 start/src/test/java/cn/axzo/msg/center/api/MessageAPIV4Test.java diff --git a/start/src/test/java/cn/axzo/msg/center/api/MessageAPIV4Test.java b/start/src/test/java/cn/axzo/msg/center/api/MessageAPIV4Test.java deleted file mode 100644 index 5fe3d971..00000000 --- a/start/src/test/java/cn/axzo/msg/center/api/MessageAPIV4Test.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.axzo.msg.center.api; - -import cn.axzo.msg.center.MsgCenterApplication; -import cn.axzo.msg.center.api.request.v4.MessageSendRequestV4; -import com.alibaba.fastjson.JSON; -import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.annotation.Commit; -import org.springframework.transaction.annotation.Transactional; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author yanglin - */ -@SpringBootTest(classes = MsgCenterApplication.class) -@RequiredArgsConstructor(onConstructor_ = @Autowired) -class MessageAPIV4Test { - - private final MessageAPIV4 messageAPIV4; - - @Test @Transactional @Commit - void exec() { - String json = "{\"eventMappingCode\":\"gaia_projectComplete_closeOrCancel_workpoint\",\"sendBasicInfo\":{\"bizCode\":\"421\",\"bizExtParams\":{\"reason\":\"记工单关联的部分工程已完结\",\"count\":\"1 单\",\"type\":\"系统自动撤销记工单\"},\"receivers\":[{\"id\":2810}],\"receiversOrgType\":\"PROJECT\",\"receiversOuId\":6458,\"receiversWorkspaceId\":326,\"routerParams\":{\"projectId\":421,\"workspaceId\":326}},\"templates\":[{\"channel\":\"NOTIFICATION\",\"templateCodes\":[\"75d88ddae7914c7089b67d944357fa1c\"]}]}"; - MessageSendRequestV4 request = JSON.parseObject(json, MessageSendRequestV4.class);; - messageAPIV4.send(request); - } - -} \ No newline at end of file From fdea50bc1708d7ce88fa73dae02539643053e6e5 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 10:27:41 +0800 Subject: [PATCH 02/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=9F=BA=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/enums/CardLinkStrategy.java | 21 ++++ .../msg/center/service/enums/GroupType.java | 20 ++++ .../dal/MessageTemplateButtonV3Dao.java | 15 +++ .../center/dal/MessageTemplateGroupV3Dao.java | 15 +++ .../msg/center/dal/MessageTemplateV3Dao.java | 15 +++ .../mapper/MessageTemplateButtonV3Mapper.java | 12 +++ .../mapper/MessageTemplateGroupV3Mapper.java | 12 +++ .../dal/mapper/MessageTemplateV3Mapper.java | 12 +++ .../domain/entity/BaseEntityWithOperator.java | 29 ++++++ .../entity/MessageTemplateButtonV3.java | 67 +++++++++++++ .../domain/entity/MessageTemplateGroupV3.java | 42 ++++++++ .../domain/entity/MessageTemplateV3.java | 99 +++++++++++++++++++ .../entity/jsondomain/CardLinkConfig.java | 18 ++++ .../domain/entity/jsondomain/GroupConfig.java | 12 +++ .../domain/entity/jsondomain/LinksConfig.java | 12 +++ 15 files changed, 401 insertions(+) create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateButtonV3Dao.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateGroupV3Dao.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateV3Dao.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateButtonV3Mapper.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateGroupV3Mapper.java create mode 100644 msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateV3Mapper.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateV3.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java create mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java new file mode 100644 index 00000000..ecbdbfd2 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java @@ -0,0 +1,21 @@ +package cn.axzo.msg.center.service.enums; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author yanglin + */ +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum CardLinkStrategy { + + NONE("无跳转"), + OPEN_TODO_DETAIL("打开待办详情"), + OPEN_CUSTOM_PAGE("打开指定页面") + + ; + + private final String desc; +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java new file mode 100644 index 00000000..1dd72513 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java @@ -0,0 +1,20 @@ +package cn.axzo.msg.center.service.enums; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author yanglin + */ +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum GroupType { + + KV_VALUES("卡片信息"), + COMPONENT_WORKER("工人卡片") + + ; + + private final String desc; +} diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateButtonV3Dao.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateButtonV3Dao.java new file mode 100644 index 00000000..7f47501b --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateButtonV3Dao.java @@ -0,0 +1,15 @@ +package cn.axzo.msg.center.dal; + +import cn.axzo.msg.center.dal.mapper.MessageTemplateButtonV3Mapper; +import cn.axzo.msg.center.domain.entity.MessageTemplateButtonV3; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +public class MessageTemplateButtonV3Dao extends ServiceImpl { +} \ No newline at end of file diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateGroupV3Dao.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateGroupV3Dao.java new file mode 100644 index 00000000..72fa0eb6 --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateGroupV3Dao.java @@ -0,0 +1,15 @@ +package cn.axzo.msg.center.dal; + +import cn.axzo.msg.center.dal.mapper.MessageTemplateGroupV3Mapper; +import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +public class MessageTemplateGroupV3Dao extends ServiceImpl { +} diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateV3Dao.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateV3Dao.java new file mode 100644 index 00000000..e8735c55 --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/MessageTemplateV3Dao.java @@ -0,0 +1,15 @@ +package cn.axzo.msg.center.dal; + +import cn.axzo.msg.center.dal.mapper.MessageTemplateV3Mapper; +import cn.axzo.msg.center.domain.entity.MessageTemplateV3; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +public class MessageTemplateV3Dao extends ServiceImpl { +} diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateButtonV3Mapper.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateButtonV3Mapper.java new file mode 100644 index 00000000..1dc26721 --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateButtonV3Mapper.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.dal.mapper; + +import cn.axzo.msg.center.domain.entity.MessageTemplateButtonV3; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author yanglin + */ +@Mapper +public interface MessageTemplateButtonV3Mapper extends BaseMapper { +} diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateGroupV3Mapper.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateGroupV3Mapper.java new file mode 100644 index 00000000..925499b7 --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateGroupV3Mapper.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.dal.mapper; + +import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author yanglin + */ +@Mapper +public interface MessageTemplateGroupV3Mapper extends BaseMapper { +} diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateV3Mapper.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateV3Mapper.java new file mode 100644 index 00000000..041d90ed --- /dev/null +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/mapper/MessageTemplateV3Mapper.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.dal.mapper; + +import cn.axzo.msg.center.domain.entity.MessageTemplateV3; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author yanglin + */ +@Mapper +public interface MessageTemplateV3Mapper extends BaseMapper { +} diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java new file mode 100644 index 00000000..a399b37d --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java @@ -0,0 +1,29 @@ +package cn.axzo.msg.center.domain.entity; + +import cn.axzo.msg.center.domain.persistence.BaseEntityExt; +import com.baomidou.mybatisplus.extension.activerecord.Model; + +/** + * @author yanglin + */ +public abstract class BaseEntityWithOperator> extends BaseEntityExt { + /** + * 创建人id + */ + private Long createPersonId; + + /** + * 创建人姓名 + */ + private String createPersonName; + + /** + * 更新人id + */ + private Long updatePersonId; + + /** + * 更新人姓名 + */ + private String updatePersonName; +} diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java new file mode 100644 index 00000000..b28274c0 --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -0,0 +1,67 @@ +package cn.axzo.msg.center.domain.entity; + +import cn.axzo.msg.center.domain.entity.jsondomain.LinksConfig; +import cn.axzo.msg.center.service.enums.PresetButtonType; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +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.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +@TableName(value = "message_template_button_v3", autoResultMap = true) +public class MessageTemplateButtonV3 extends BaseEntityWithOperator { + + /** + * 按钮名称 + */ + private String name; + + /** + * 模板code + */ + private String templateCode; + + /** + * 预设按钮类型 + */ + private PresetButtonType presetBtnCode; + + /** + * 按钮来源 + */ + private RouterButtonSourceEnum source; + + /** + * 按钮链接配置 + */ + private LinksConfig linkConfig; + + /** + * 按钮style配置 + */ + @TableField(typeHandler = FastjsonTypeHandler.class) + private JSONArray style; + + /** + * 执行人可见:true 不可见:false + */ + private Boolean executorShow; + + /** + * 待办状态可见可见:true 不可见:false + */ + private Boolean pendingShow; + + /** + * 按钮优先级,数值越大优先级越低 + */ + private Integer priority; + +} \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java new file mode 100644 index 00000000..f80a1fbc --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java @@ -0,0 +1,42 @@ +package cn.axzo.msg.center.domain.entity; + +import cn.axzo.msg.center.domain.entity.jsondomain.GroupConfig; +import cn.axzo.msg.center.service.enums.GroupType; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +@TableName(value = "message_template_group_v3", autoResultMap = true) +public class MessageTemplateGroupV3 extends BaseEntityWithOperator { + + /** + * 分组名称, 公共组件时为空 + */ + private String name; + + /** + * 模板code + */ + private String templateCode; + + /** + * 分组类型. KV_VALUES: 卡片信息; COMPONENT_WORKER:工人卡片 + */ + private GroupType groupType; + + /** + * 排列顺序 + */ + private Integer sortOrder; + + /** + * 分组配置 + */ + private GroupConfig groupConfig; + +} \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateV3.java new file mode 100644 index 00000000..ac0e28ce --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateV3.java @@ -0,0 +1,99 @@ +package cn.axzo.msg.center.domain.entity; + +import cn.axzo.msg.center.domain.entity.jsondomain.CardLinkConfig; +import cn.axzo.msg.center.domain.entity.jsondomain.LinksConfig; +import cn.axzo.msg.center.service.enums.CardLinkStrategy; +import cn.axzo.msg.center.service.enums.MessageCategoryEnum; +import cn.axzo.msg.center.service.enums.StatusEnum; +import cn.axzo.msg.center.service.enums.YesOrNo; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +@TableName(value = "message_template_v3", autoResultMap = true) +public class MessageTemplateV3 extends BaseEntityWithOperator { + + /** + * 模板名称 + */ + private String name; + + /** + * 系统自动生成的模板code + */ + private String code; + + /** + * 所属消息类型 + */ + private MessageCategoryEnum msgCategory; + + /** + * 模板标题 + */ + private String title; + + /** + * 模板类容 + */ + private String content; + + /** + * 消息详情样式. BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的 + */ + private String detailStyleCode; + + /** + * 模板icon + */ + private String icon; + + /** + * APP最小版本支持,可不配 + */ + private String minAppVersion; + + /** + * 模板状态 + */ + private StatusEnum status; + + /** + * 推送终端配置 JSON字串 + */ + private String pushTerminal; + + /** + * 卡片跳转方式. NONE: 无跳转, OPEN_TODO_DETAIL: 打开待办详情, OPEN_CUSTOM_PAGE: 打开指定页面 + */ + private CardLinkStrategy cardLinkStrategy; + + /** + * 卡片跳转配置. 在links的基础上再包一层, 避免以后卡片增加自己的配置 + */ + private CardLinkConfig cardLinkConfig; + + /** + * IM发送优先级 + */ + private Integer imSendPriority; + + /** + * push配置 + */ + @TableField(typeHandler = FastjsonTypeHandler.class) + private JSONObject pushData; + + /** + * 是否显示在列表中. YES: 是, NO: 否 + */ + private YesOrNo displayOnList; +} \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java new file mode 100644 index 00000000..d1b720ac --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java @@ -0,0 +1,18 @@ +package cn.axzo.msg.center.domain.entity.jsondomain; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class CardLinkConfig { + + /** + * 链接配置 + */ + private LinksConfig linksConfig; + +} \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java new file mode 100644 index 00000000..31875e50 --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.domain.entity.jsondomain; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class GroupConfig { +} diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java new file mode 100644 index 00000000..e0931fe8 --- /dev/null +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.domain.entity.jsondomain; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class LinksConfig { +} \ No newline at end of file From 8eb94e575013f19f6e7f1420f9d691c24e066fcb Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 10:45:04 +0800 Subject: [PATCH 03/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=9F=BA=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/domain/CardUrlConfig.java | 6 ++--- .../center/service/domain}/GroupConfig.java | 2 +- .../service/domain/MobileUrlConfig.java | 15 ++++++++++++ .../msg/center/service/domain/UrlConfig.java | 23 +++++++++++++++++++ .../msg/center/service/domain/url/AppUrl.java | 18 +++++++++++++++ .../domain/url/WebPageOpenStrategy.java | 21 +++++++++++++++++ .../msg/center/service/domain/url/WebUrl.java | 23 +++++++++++++++++++ ...Strategy.java => CardUrlOpenStrategy.java} | 2 +- .../entity/MessageTemplateButtonV3.java | 4 ++-- .../domain/entity/MessageTemplateGroupV3.java | 2 +- .../domain/entity/MessageTemplateV3.java | 12 +++++----- .../domain/entity/jsondomain/LinksConfig.java | 12 ---------- 12 files changed, 114 insertions(+), 26 deletions(-) rename msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java => msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/CardUrlConfig.java (51%) rename {msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain => msg-center-api/src/main/java/cn/axzo/msg/center/service/domain}/GroupConfig.java (69%) create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/AppUrl.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java rename msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/{CardLinkStrategy.java => CardUrlOpenStrategy.java} (91%) delete mode 100644 msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/CardUrlConfig.java similarity index 51% rename from msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java rename to msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/CardUrlConfig.java index d1b720ac..31a78378 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/CardLinkConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/CardUrlConfig.java @@ -1,4 +1,4 @@ -package cn.axzo.msg.center.domain.entity.jsondomain; +package cn.axzo.msg.center.service.domain; import lombok.Getter; import lombok.Setter; @@ -8,11 +8,11 @@ import lombok.Setter; */ @Setter @Getter -public class CardLinkConfig { +public class CardUrlConfig { /** * 链接配置 */ - private LinksConfig linksConfig; + private UrlConfig urlConfig; } \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java similarity index 69% rename from msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java rename to msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java index 31875e50..adc8048b 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/GroupConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java @@ -1,4 +1,4 @@ -package cn.axzo.msg.center.domain.entity.jsondomain; +package cn.axzo.msg.center.service.domain; import lombok.Getter; import lombok.Setter; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java new file mode 100644 index 00000000..c0587bc1 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java @@ -0,0 +1,15 @@ +package cn.axzo.msg.center.service.domain; + +import cn.axzo.msg.center.service.domain.url.AppUrl; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class MobileUrlConfig { + private AppUrl ios; + private AppUrl android; +} \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java new file mode 100644 index 00000000..c87d08ae --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java @@ -0,0 +1,23 @@ +package cn.axzo.msg.center.service.domain; + +import cn.axzo.msg.center.service.domain.url.WebUrl; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class UrlConfig { + // PC(OMS) + private WebUrl pcOms; + // PC(CMS) + private WebUrl pcCms; + // 监管平台 + private WebUrl pcGaGeneral; + // APP(工人端) + private MobileUrlConfig appWorker; + // APP(管理端) + private MobileUrlConfig appManager; +} \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/AppUrl.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/AppUrl.java new file mode 100644 index 00000000..5755c2f2 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/AppUrl.java @@ -0,0 +1,18 @@ +package cn.axzo.msg.center.service.domain.url; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class AppUrl { + + /** + * url地址 + */ + private String url; + +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java new file mode 100644 index 00000000..79ccda3b --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java @@ -0,0 +1,21 @@ +package cn.axzo.msg.center.service.domain.url; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author yanglin + */ +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum WebPageOpenStrategy { + + NEW_PAGE("新页面打开"), + CURRENT_PAGE("当前页面打开"), + DRAWER("抽屉") + + ; + + private final String desc; +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java new file mode 100644 index 00000000..7c02c478 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java @@ -0,0 +1,23 @@ +package cn.axzo.msg.center.service.domain.url; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class WebUrl { + + /** + * 网页打开方式. NEW_PAGE: 新页面打开, CURRENT_PAGE: 当前页面打开, DRAWER: 抽屉 + */ + private WebPageOpenStrategy openStrategy; + + /** + * url地址 + */ + private String url; + +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardUrlOpenStrategy.java similarity index 91% rename from msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java rename to msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardUrlOpenStrategy.java index ecbdbfd2..fa95508a 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardLinkStrategy.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardUrlOpenStrategy.java @@ -9,7 +9,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) -public enum CardLinkStrategy { +public enum CardUrlOpenStrategy { NONE("无跳转"), OPEN_TODO_DETAIL("打开待办详情"), diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java index b28274c0..171091b0 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -1,6 +1,6 @@ package cn.axzo.msg.center.domain.entity; -import cn.axzo.msg.center.domain.entity.jsondomain.LinksConfig; +import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.enums.PresetButtonType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import com.alibaba.fastjson.JSONArray; @@ -41,7 +41,7 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator private String content; /** - * 消息详情样式. BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的 + * 消息详情样式. BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的 */ private String detailStyleCode; @@ -74,12 +73,13 @@ public class MessageTemplateV3 extends BaseEntityWithOperator /** * 卡片跳转方式. NONE: 无跳转, OPEN_TODO_DETAIL: 打开待办详情, OPEN_CUSTOM_PAGE: 打开指定页面 */ - private CardLinkStrategy cardLinkStrategy; + private CardUrlOpenStrategy cardUrlOpenStrategy; /** * 卡片跳转配置. 在links的基础上再包一层, 避免以后卡片增加自己的配置 */ - private CardLinkConfig cardLinkConfig; + @TableField(typeHandler = FastjsonTypeHandler.class) + private CardUrlConfig cardUrConfig; /** * IM发送优先级 diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java deleted file mode 100644 index e0931fe8..00000000 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/jsondomain/LinksConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.axzo.msg.center.domain.entity.jsondomain; - -import lombok.Getter; -import lombok.Setter; - -/** - * @author yanglin - */ -@Setter -@Getter -public class LinksConfig { -} \ No newline at end of file From 7ef10093d75213cc7c60630846fa7b22c5ac9a53 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 10:55:27 +0800 Subject: [PATCH 04/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=9F=BA=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/domain/GroupConfig.java | 15 ++++++++++- .../msg/center/service/domain/KVConfig.java | 12 +++++++++ .../service/domain/MobileUrlConfig.java | 9 +++++++ .../msg/center/service/domain/UrlConfig.java | 26 +++++++++++++++---- .../msg/center/service/domain/url/WebUrl.java | 1 + .../url => enums}/WebPageOpenStrategy.java | 2 +- 6 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java rename msg-center-api/src/main/java/cn/axzo/msg/center/service/{domain/url => enums}/WebPageOpenStrategy.java (87%) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java index adc8048b..c0c15527 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/GroupConfig.java @@ -3,10 +3,23 @@ package cn.axzo.msg.center.service.domain; import lombok.Getter; import lombok.Setter; +import java.util.List; + /** * @author yanglin */ @Setter @Getter public class GroupConfig { -} + + /** + * key/value的配置 + */ + private List keyValues; + + /** + * 详情的配置 + */ + private UrlConfig detail; + +} \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java new file mode 100644 index 00000000..15df6e96 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java @@ -0,0 +1,12 @@ +package cn.axzo.msg.center.service.domain; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class KVConfig { +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java index c0587bc1..5d94f60e 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/MobileUrlConfig.java @@ -10,6 +10,15 @@ import lombok.Setter; @Setter @Getter public class MobileUrlConfig { + + /** + * ios的url配置 + */ private AppUrl ios; + + /** + * android的url配置 + */ private AppUrl android; + } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java index c87d08ae..40f849bf 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java @@ -10,14 +10,30 @@ import lombok.Setter; @Setter @Getter public class UrlConfig { - // PC(OMS) + + /** + * PC(OMS) + */ private WebUrl pcOms; - // PC(CMS) + + /** + * PC(CMS) + */ private WebUrl pcCms; - // 监管平台 + + /** + * 监管平台 + */ private WebUrl pcGaGeneral; - // APP(工人端) + + /** + * APP(工人端) + */ private MobileUrlConfig appWorker; - // APP(管理端) + + /** + * APP(管理端) + */ private MobileUrlConfig appManager; + } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java index 7c02c478..9b03363f 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebUrl.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.service.domain.url; +import cn.axzo.msg.center.service.enums.WebPageOpenStrategy; import lombok.Getter; import lombok.Setter; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/WebPageOpenStrategy.java similarity index 87% rename from msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java rename to msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/WebPageOpenStrategy.java index 79ccda3b..4ff27306 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/url/WebPageOpenStrategy.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/WebPageOpenStrategy.java @@ -1,4 +1,4 @@ -package cn.axzo.msg.center.service.domain.url; +package cn.axzo.msg.center.service.enums; import lombok.AccessLevel; import lombok.AllArgsConstructor; From 6ca7271f9857881039d08bf06c49e4d82b0ce889 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 10:59:02 +0800 Subject: [PATCH 05/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=9F=BA=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/service/domain/KVConfig.java | 21 ++++++++++++++++++ .../center/service/enums/KVContentType.java | 22 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/KVContentType.java diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java index 15df6e96..71a412d6 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/KVConfig.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.service.domain; +import cn.axzo.msg.center.service.enums.KVContentType; import lombok.Getter; import lombok.Setter; @@ -9,4 +10,24 @@ import lombok.Setter; @Setter @Getter public class KVConfig { + + /** + * 内容的类型. TEXT: 文本, PHONE: 手机号, ATTACHMENT: 附件, PERSON_ID: 自然人ID + */ + private KVContentType contentType; + + /** + * 键: 项目 + */ + private String key; + + /** + * 值: ${workspaceId} + */ + private String value; + + /** + * 是否显示在卡片上 + */ + private boolean displayOnCard; } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/KVContentType.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/KVContentType.java new file mode 100644 index 00000000..485b6375 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/KVContentType.java @@ -0,0 +1,22 @@ +package cn.axzo.msg.center.service.enums; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author yanglin + */ +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum KVContentType { + + TEXT("文本"), + PHONE("手机号"), + ATTACHMENT("附件"), + PERSON_ID("自然人ID") + + ; + + private final String desc; +} From 501fdaac13b2ebdf32f035b198b7f69c8d8634a0 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 11:22:19 +0800 Subject: [PATCH 06/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=9F=BA=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/service/enums/RouterCategoryEnum.java | 1 + .../msg/center/domain/entity/MessageTemplateButtonV3.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java index 5d709ac6..d1afddac 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java @@ -22,6 +22,7 @@ public enum RouterCategoryEnum { /** * 接口调用 */ + @Deprecated ACTION("接口调用"), /** * 预设按钮 diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java index 171091b0..6bbca03c 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -3,6 +3,7 @@ package cn.axzo.msg.center.domain.entity; import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.enums.PresetButtonType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @@ -38,6 +39,11 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator Date: Tue, 8 Oct 2024 14:52:04 +0800 Subject: [PATCH 07/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0JSON=20hand?= =?UTF-8?q?ler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/domain/entity/MessageTemplateButtonV3.java | 1 + .../axzo/msg/center/domain/entity/MessageTemplateGroupV3.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java index 6bbca03c..ac7f85c3 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -47,6 +47,7 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator Date: Tue, 8 Oct 2024 15:22:22 +0800 Subject: [PATCH 08/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0JSON=20hand?= =?UTF-8?q?ler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/msg/center/service/enums/GroupType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java index 1dd72513..d559f710 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/GroupType.java @@ -11,7 +11,7 @@ import lombok.Getter; @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum GroupType { - KV_VALUES("卡片信息"), + KV_VALUES("键值信息"), COMPONENT_WORKER("工人卡片") ; From a48e1c97b08958804bbb9a9e9ae14ed366e34f66 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 8 Oct 2024 15:22:41 +0800 Subject: [PATCH 09/10] =?UTF-8?q?REQ-3045:=20=E6=B7=BB=E5=8A=A0JSON=20hand?= =?UTF-8?q?ler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/domain/entity/MessageTemplateGroupV3.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java index 7a7ae432..fc7dac3a 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateGroupV3.java @@ -27,7 +27,7 @@ public class MessageTemplateGroupV3 extends BaseEntityWithOperator Date: Tue, 8 Oct 2024 15:44:37 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat:(REQ-3045)=20=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E7=AE=A1=E7=90=86V3-=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageTemplateV3Controller.java | 117 ++++ .../MessageTemplateV3SaveOrUpdateParam.java | 179 ++++++ .../MessageTemplateGroupV3Service.java | 95 +++ .../service/MessageTemplateV3Service.java | 118 ++++ .../MessageTemplateGroupV3ServiceImpl.java | 239 ++++++++ .../impl/MessageTemplateV3ServiceImpl.java | 540 ++++++++++++++++++ .../client/MessageTemplateV3Client.java | 103 ++++ .../MessageTemplateGroupV3CreateRequest.java | 39 ++ .../MessageTemplateV3CreateRequest.java | 113 ++++ .../domain/entity/BaseEntityWithOperator.java | 2 + 10 files changed, 1545 insertions(+) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageTemplateV3Controller.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupV3Service.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateV3Service.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupV3ServiceImpl.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateV3ServiceImpl.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/template/client/MessageTemplateV3Client.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateGroupV3CreateRequest.java create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateV3CreateRequest.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageTemplateV3Controller.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageTemplateV3Controller.java new file mode 100644 index 00000000..a2ee6463 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageTemplateV3Controller.java @@ -0,0 +1,117 @@ +package cn.axzo.msg.center.message.controller; + +import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.msg.center.message.domain.param.MessageTemplateSaveOrUpdateParam; +import cn.axzo.msg.center.message.domain.param.MessageTemplateV3SaveOrUpdateParam; +import cn.axzo.msg.center.message.domain.param.RelationTemplateMapInitParam; +import cn.axzo.msg.center.message.domain.vo.RelationTemplateMapInitRequest; +import cn.axzo.msg.center.message.service.MessageTemplateNewService; +import cn.axzo.msg.center.message.service.MessageTemplateNewSyncService; +import cn.axzo.msg.center.message.service.MessageTemplateV3Service; +import cn.axzo.msg.center.message.service.RelationTemplateMapService; +import cn.axzo.msg.center.service.template.client.MessageTemplateV3Client; +import cn.axzo.msg.center.service.template.request.MessageTemplateV3CreateRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateSyncDto; +import cn.axzo.msg.center.service.template.request.MessageTemplateSyncQueryRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateStatusRequest; +import cn.axzo.msg.center.service.template.response.MessageDetailStyle; +import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse; +import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse; +import cn.azxo.framework.common.model.CommonResponse; +import cn.azxo.framework.common.model.Page; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 消息模板管理 + * + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class MessageTemplateV3Controller implements MessageTemplateV3Client { + + private final MessageTemplateNewService messageTemplateNewService; + private final RelationTemplateMapService relationTemplateMapService; + private final MessageTemplateNewSyncService messageTemplateNewSyncService; + private final MessageTemplateV3Service messageTemplateV3Service; + + @Override + public CommonResponse save(MessageTemplateV3CreateRequest request) { + return CommonResponse.success( + messageTemplateV3Service.createTemplate(MessageTemplateV3SaveOrUpdateParam.from(request))); + } + + @Override + public CommonResponse update(MessageTemplateUpdateRequest request) { + messageTemplateNewService.updateTemplate(MessageTemplateSaveOrUpdateParam.from(request)); + return CommonResponse.success(); + } + + @Override + public CommonResponse detail(String templateCode) { + return CommonResponse.success(messageTemplateNewService.detail(templateCode)); + } + + @Override + public CommonResponse> page(MessageTemplatePageRequest request) { + return CommonResponse.success(messageTemplateNewService.page(request)); + } + + @Override + public CommonResponse> listByCodes(Collection templateCodes) { + return CommonResponse.success(messageTemplateNewService.listByCodes(templateCodes)); + } + + @Override + public CommonResponse updateStatus(MessageTemplateUpdateStatusRequest request) { + messageTemplateNewService.updateStatus(request.getOperatorId(), request.getTemplateCode(), request.getStatus()); + return CommonResponse.success(); + } + + @Override + public CommonResponse getSyncMessageTemplate( + MessageTemplateSyncQueryRequest request) { + MessageTemplateDetailResponse detail = messageTemplateNewService.querySyncMessageTemplate(request.getTemplateCode()); + AssertUtil.notNull(detail, "消息模板不存在"); + MessageTemplateSyncDto result = BeanUtil.copyProperties(detail, MessageTemplateSyncDto.class); + result.setTemplateCode(request.getTemplateCode()); + result.setEnv(request.getEnv()); + return CommonResponse.success(result); + } + + @Override + public CommonResponse> listTemplateDetailStyles() { + List styles = messageTemplateNewService.listTemplateDetailStyles(); + return CommonResponse.success(styles); + } + + @Override + public CommonResponse syncTemplate(MessageTemplateSyncDto param) { + log.info("syncTemplate param= [{}]", JSONUtil.toJsonStr(param)); + messageTemplateNewSyncService.syncTemplate(param); + return CommonResponse.success(); + } + + @PostMapping(value = "/message/template/relation/init", produces = {MediaType.APPLICATION_JSON_VALUE}) + public CommonResponse initRelationTemplateMap(@RequestBody @Valid RelationTemplateMapInitRequest request) { + RelationTemplateMapInitParam param = request.toInitParam(); + relationTemplateMapService.init(param); + return CommonResponse.success(); + } +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java new file mode 100644 index 00000000..97f6701a --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java @@ -0,0 +1,179 @@ +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.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.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.MessageTemplateUpdateRequest; +import cn.axzo.msg.center.utils.MessageTemplateCategoryUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * @description + * + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +@Setter +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MessageTemplateV3SaveOrUpdateParam implements Serializable { + + private static final long serialVersionUID = 6657624182580261353L; + + /** + * 模板编码 + */ + private String templateCode; + /** + * 操作者的自然人id + */ + private Long operatorId; + /** + * 操作者的自然人姓名 + */ + private String operatorName; + /** + * 模板名称 + */ + private String templateName; + /** + * 消息类型 + * GENERAL_MESSAGE: 通知 + * BIZ_PENDING_MESSAGE: 业务待办 + * APPROVAL_PENDING_MESSAGE: 审批待办 + */ + private MessageCategoryEnum msgCategory; + /** + * 消息分类树的叶结点的结点编码列表 + */ + private List leafGroupNodes; + /** + * 推送终端配置 + * B_ENTERPRISE_APP: B-安心筑企业版 + * C_WORKER_APP: C-安心筑工人版 + */ + private List pushTerminals; + /** + * 该模板最低支持的APP版本号 + */ + private String minAppVersion; + /** + * 消息标题 + */ + private String title; + /** + * 消息内容 + */ + private String content; + /** + * 消息图标 + */ + private String icon; + /** + * 消息卡片信息标签列表,可为空 + */ + private List messageTemplateGroups; + /** + * 业务详情展示策略 + */ + private MessageDetailRouteStrategyDTO bizDetailShowStrategy; + /** + * 路由策略列表 + */ + private List routers; + /** + * 待办样式, BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的 + */ + private String detailStyleCode; + + private JSONObject pushData; + + public static MessageTemplateV3SaveOrUpdateParam from(MessageTemplateV3CreateRequest request) { + MessageCategoryEnum category = MessageTemplateCategoryUtil + .checkAndReturnSubCategory(request.getCategory(), request.getSubCategory()) + .orElseThrow(() -> new ServiceException("无效的参数")); + return MessageTemplateV3SaveOrUpdateParam.builder() + .templateName(request.getTemplateName()) + .detailStyleCode(request.getDetailStyleCode()) + .operatorId(request.getOperatorId()) + .operatorName(request.getOperatorName()) + .msgCategory(category) + .leafGroupNodes(request.getLeafGroupNodes()) + .title(request.getMsgTitle()) + .content(request.getMsgContent()) + .messageTemplateGroups(request.getMessageTemplateGroups()) + .icon(request.getMsgIcon()) + .minAppVersion(request.getMinAppVersion()) + .operatorId(request.getOperatorId()) + .routers(request.getRouters()) + .pushTerminals(request.getPushTerminals()) + .bizDetailShowStrategy(request.getDetailStrategy()) + .pushData(request.getPushData()) + .build(); + } + + public static MessageTemplateV3SaveOrUpdateParam from(MessageTemplateUpdateRequest request) { + return MessageTemplateV3SaveOrUpdateParam.builder() + .templateName(request.getTemplateName()) + .detailStyleCode(request.getDetailStyleCode()) + .operatorName(request.getOperatorName()) + .templateCode(request.getTemplateCode()) + .leafGroupNodes(request.getLeafGroupNodes()) + .title(request.getMsgTitle()) + .content(request.getMsgContent()) +// .msgCardContentItems(request.getMsgCardContentItems()) + .minAppVersion(request.getMinAppVersion()) + .icon(request.getMsgIcon()) + .operatorId(request.getOperatorId()) + .operatorName(request.getOperatorName()) + .routers(request.getRouters()) + .pushTerminals(request.getPushTerminals()) + .bizDetailShowStrategy(request.getDetailStrategy()) + .pushData(request.getPushData()) + .build(); + } + + + public static MessageTemplateV3SaveOrUpdateParam fromSync(MessageTemplateSyncDto request) { + MessageCategoryEnum category = MessageTemplateCategoryUtil + .checkAndReturnSubCategory(request.getCategory(), request.getSubCategory()) + .orElseThrow(() -> new ServiceException("无效的参数")); + return MessageTemplateV3SaveOrUpdateParam.builder() + .templateName(request.getTemplateName()) + .msgCategory(category) + .leafGroupNodes(request.getLeafGroupNodes()) + .title(request.getMsgTitle()) + .content(request.getMsgContent()) +// .msgCardContentItems(request.getCardContentItems()) + .icon(request.getMsgIcon()) + .minAppVersion(request.getMinAppVersion()) + .operatorId(request.getOperatorId()) + .routers(request.getRouters()) + .pushTerminals(request.getPushTerminals()) + .bizDetailShowStrategy(request.getDetailStrategy()) + .build(); + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupV3Service.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupV3Service.java new file mode 100644 index 00000000..3c0bfe21 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupV3Service.java @@ -0,0 +1,95 @@ +package cn.axzo.msg.center.message.service; + +import cn.axzo.msg.center.service.template.request.MessageTemplateGroupV3CreateRequest; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 消息模板分类管理 + * + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +public interface MessageTemplateGroupV3Service { + + /** + * 通过分组结点编码路径查询关联的模板编码列表 + * + * @param leafNodePathCodes 分组结点编码路径列表 + * @return 模板编码列表 + */ + List listMessageTemplateCodes(Collection leafNodePathCodes); + + /** + * 通过分组结点编码路径查询关联的模板编码列表 + * + * @param leafNodePathCodes 分组结点编码路径列表 + * @return 模板编码列表 + */ + Map> groupingByMessageTemplateCodes(Collection leafNodePathCodes); + + /** + * 模板关联分类 + * + * @param templateNode 模板编码 + * @param groupNodeCodes 分类结点编码列表 + */ + void templateGroup(String templateNode, Collection groupNodeCodes); + + /** + * 模板关联分类 + * + * @param templateGroupMap 模板编码与分类结点编码列表的map + */ + void templateGroup(Map> templateGroupMap); + + /** + * 保存模版分组 + */ + void saveTemplateGroup(String messageTemplateCode, List groupV3List); + + /** + * 更新模板的分类关系 + * + * @param templateNode 模板编码 + * @param groupNodeCodes 新的模板的分类结点编码 + */ + void updateTemplateGroup(String templateNode, Collection groupNodeCodes); + + /** + * 解除模板关联的分类 + * + * @param templateNode 模板编码 + */ + void deleteTemplateGroup(String templateNode); + + /** + * 通过消息模板编码查询其关联的分类的path + * + * @param templateCodes 消息模板编码集合 + * @return 模板编码与分类的path列表的映射关系 + */ + Map> listMessageTemplateGroupPaths(Collection templateCodes); + + /** + * 解除模板与当前分类的关联关系 + * 注:当模板只关联一个分类时,该关联关系不能解除 + * + * @param curGroupNodeCode 当前分类结点的编码 + * @param templateCodes 待解除关连关系的模板编码 + */ + void remove(String curGroupNodeCode, Collection templateCodes); + + /** + * 解除模板与当前分类的关联关系 + * 注:当模板只关联一个分类时,该关联关系不能解除 + * + * @param srcGroupNodeCode 源分类结点的编码 + * @param tgtGroupNodeCode 目标分类结点的编码 + * @param templateCodes 待变更关连关系的模板编码 + */ + void move(String srcGroupNodeCode, String tgtGroupNodeCode, Collection templateCodes); +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateV3Service.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateV3Service.java new file mode 100644 index 00000000..b26d6d69 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateV3Service.java @@ -0,0 +1,118 @@ +package cn.axzo.msg.center.message.service; + +import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO; +import cn.axzo.msg.center.message.domain.param.MessageTemplateSaveOrUpdateParam; +import cn.axzo.msg.center.message.domain.param.MessageTemplateV3SaveOrUpdateParam; +import cn.axzo.msg.center.service.dto.MessageBaseTemplateDTO; +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.MessageDetailStyle; +import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse; +import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse; +import cn.azxo.framework.common.model.Page; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +/** + * @description + * 消息模板管理 + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +public interface MessageTemplateV3Service { + + /** + * 创建模板 + * + * @param param 模板内容参数 + */ + String createTemplate(MessageTemplateV3SaveOrUpdateParam param); + + /** + * 编辑模板 + * + * @param param 模板内容参数 + */ + void updateTemplate(MessageTemplateV3SaveOrUpdateParam param); + + /** + * 通过模板便阿门查询模板详情 + * + * @param templateCode 模板编码 + * @return 模板详情信息 + */ + MessageTemplateDetailResponse detail(String templateCode); + + /** + * 更新模板状态 + * + * @param operatorId 操作人id + * @param templateCode 模板编码 + * @param status 新的模板状态 + */ + void updateStatus(Long operatorId, String templateCode, StatusEnum status); + + /** + * 通过模板编码查询模板信息 + * + * @param msgTemplateCode 模板编码 + * @return 模板信息 + */ + Optional queryEnableTemplateByCode(String msgTemplateCode); + + /** + * 通过模板编码查询模板信息 + * + * @param msgTemplateCodes 模板编码列表 + * @return 模板信息 + */ + List listByTemplateCodes(List msgTemplateCodes); + + /** + * 分页查询模板数据 + * + * @param request 分页请求参数 + * @return 模板数据列表 + */ + Page page(MessageTemplatePageRequest request); + + /** + * 分页查询模板基础数据 + * + * @param request 分页请求参数 + * @return 模板数据列表 + */ + Page pageBaseTemplate(MessageTemplatePageRequest request); + + /** + * 通过模板编码查询对应的模板 + * + * @param templateCodes 模板编码集合 + * @return 模板列表 + */ + List listByCodes(Collection templateCodes); + + /** + * 通过模板id获取对应的模板编码 + * + * @param ids 模板id列表 + * @return 模板编码列表 + */ + List listTemplateCodesByIds(Collection ids); + + /** + * 查询需要同步的模板 + * @param templateCode + * @return + */ + MessageTemplateDetailResponse querySyncMessageTemplate(String templateCode); + + /** + * 获取所有消息样式 + * @return + */ + List listTemplateDetailStyles(); +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupV3ServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupV3ServiceImpl.java new file mode 100644 index 00000000..9cd8687b --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupV3ServiceImpl.java @@ -0,0 +1,239 @@ +package cn.axzo.msg.center.message.service.impl; + +import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.framework.core.util.MapUtil; +import cn.axzo.msg.center.common.enums.TableIsDeleteEnum; +import cn.axzo.msg.center.dal.MessageTemplateGroupDao; +import cn.axzo.msg.center.dal.MessageTemplateGroupV3Dao; +import cn.axzo.msg.center.domain.entity.MessageTemplateGroup; +import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3; +import cn.axzo.msg.center.message.service.MessageGroupNodeService; +import cn.axzo.msg.center.message.service.MessageTemplateGroupService; +import cn.axzo.msg.center.message.service.MessageTemplateGroupV3Service; +import cn.axzo.msg.center.service.template.request.MessageTemplateGroupV3CreateRequest; +import cn.hutool.core.bean.BeanUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MessageTemplateGroupV3ServiceImpl implements MessageTemplateGroupV3Service { + + private final MessageGroupNodeService messageGroupNodeService; + private final MessageTemplateGroupDao messageTemplateGroupDao; + private final MessageTemplateGroupV3Dao messageTemplateGroupV3Dao; + + @Override + public List listMessageTemplateCodes(Collection leafNodePathCodes) { + if (CollectionUtils.isEmpty(leafNodePathCodes)) { + log.info("leafNodePathCodes is empty."); + return Collections.emptyList(); + } + return messageTemplateGroupDao.lambdaQuery() + .in(MessageTemplateGroup::getPath, leafNodePathCodes) + .eq(MessageTemplateGroup::getIsDelete, 0) + .list().stream() + .map(MessageTemplateGroup::getTemplateCode) + .collect(Collectors.toList()); + } + + @Override + public Map> groupingByMessageTemplateCodes(Collection leafNodePathCodes) { + if (CollectionUtils.isEmpty(leafNodePathCodes)) { + log.info("leafNodePathCodes is empty."); + return Collections.emptyMap(); + } + Map> groupingBy = messageTemplateGroupDao.lambdaQuery() + .in(MessageTemplateGroup::getPath, leafNodePathCodes) + .select(MessageTemplateGroup::getPath, MessageTemplateGroup::getTemplateCode) + .list().stream() + .collect(Collectors.groupingBy(MessageTemplateGroup::getTemplateCode)); + final Map> result = Maps.newHashMap(); + groupingBy.forEach((key, value) -> { + List paths = value.stream().map(MessageTemplateGroup::getPath).collect(Collectors.toList()); + result.put(key, paths); + }); + return result; + } + + @Override + public void templateGroup(String templateNode, Collection groupNodeCodes) { + if (StringUtils.isBlank(templateNode) + || CollectionUtils.isEmpty(groupNodeCodes)) { + log.info("the param is invalid. templateNode:[{}], groupNodeCodes:{}", templateNode, groupNodeCodes); + return; + } + Map pathMap = messageGroupNodeService.leafGroupNodeCodePaths(groupNodeCodes); + List rows = groupNodeCodes.stream() + .filter(pathMap::containsKey) + .map(e -> { + MessageTemplateGroup group = new MessageTemplateGroup(); + group.setTemplateCode(templateNode); + group.setPath(pathMap.get(e)); + return group; + }).collect(Collectors.toList()); + messageTemplateGroupDao.saveBatch(rows); + } + + @Override + public void templateGroup(Map> templateGroupMap) { + if (MapUtil.isEmpty(templateGroupMap)) { + log.info("the templateGroupMap is empty."); + return; + } + Set groupNodes = templateGroupMap.values().stream() + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + Map pathMap = messageGroupNodeService.leafGroupNodeCodePaths(groupNodes); + List rows = templateGroupMap.entrySet().stream() + .flatMap(e -> e.getValue().stream() + .filter(pathMap::containsKey) + .map(nodeCode -> { + MessageTemplateGroup group = new MessageTemplateGroup(); + group.setTemplateCode(e.getKey()); + group.setPath(pathMap.get(nodeCode)); + return group; + }) + ).collect(Collectors.toList()); + messageTemplateGroupDao.saveBatch(rows); + } + + @Override + public void saveTemplateGroup(String messageTemplateCode, List groupV3List) { + if (CollectionUtils.isEmpty(groupV3List)) { + log.info("groupV3List is empty."); + return; + } + + List templateGroupV3List = groupV3List.stream().map(item -> { + MessageTemplateGroupV3 messageTemplateGroupV3 = BeanUtil.copyProperties(item, MessageTemplateGroupV3.class); + messageTemplateGroupV3.setTemplateCode(messageTemplateCode); + return messageTemplateGroupV3; + }).collect(Collectors.toList()); + messageTemplateGroupV3Dao.saveBatch(templateGroupV3List); + } + + @Override + public void updateTemplateGroup(String templateNode, Collection groupNodeCodes) { + // 先解除之前的关联关系 + deleteTemplateGroup(templateNode); + // 构建新的关联关系 + templateGroup(templateNode, groupNodeCodes); + } + + @Override + public void deleteTemplateGroup(String templateNode) { + if (StringUtils.isBlank(templateNode)) { + log.info("the templateNode is blank."); + return; + } + messageTemplateGroupDao.lambdaUpdate() + .eq(MessageTemplateGroup::getTemplateCode, templateNode) + .remove(); + } + + @Override + public Map> listMessageTemplateGroupPaths(Collection templateCodes) { + if (CollectionUtils.isEmpty(templateCodes)) { + return Collections.emptyMap(); + } + return messageTemplateGroupDao.lambdaQuery() + .in(MessageTemplateGroup::getTemplateCode, templateCodes) + .eq(MessageTemplateGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list().stream() + .collect(Collectors.groupingBy(MessageTemplateGroup::getTemplateCode, + Collectors.mapping(MessageTemplateGroup::getPath, Collectors.toList()))); + } + + @Override + public void remove(String curGroupNodeCode, Collection templateCodes) { + // 参数校验 + AssertUtil.isTrue(StringUtils.isNotBlank(curGroupNodeCode), "curGroupNodeCode can not be blank"); + AssertUtil.notEmpty(templateCodes, "templateCodes can not be empty"); + // 通过分类结点编码获取其对应的结点编码的路径 + Map nodeCodePathMap = messageGroupNodeService + .leafGroupNodeCodePaths(Lists.newArrayList(curGroupNodeCode)); + // 通过能否成功获取到其树路径来校验其有效性 + AssertUtil.isFalse(nodeCodePathMap.isEmpty(), "curGroupNodeCode is invalid"); + // 统计指定的模板编码关联的分类数量 + Map templateCodeList = messageTemplateGroupDao.lambdaQuery() + .in(MessageTemplateGroup::getTemplateCode, templateCodes) + .eq(MessageTemplateGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value) + // 这里仅查询模板编码字段即可 + .select(MessageTemplateGroup::getTemplateCode) + .list().stream() + .map(MessageTemplateGroup::getTemplateCode) + // 内存中来做groupingBy操作 + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); + // 筛选出仅关联了一个分类的模板编码 + List onlyContainsOneTemplateCodes = templateCodeList.entrySet().stream() + .filter(e -> Objects.equals(e.getValue(), 1L)) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + AssertUtil.isEmpty(onlyContainsOneTemplateCodes, removeErrorStr(onlyContainsOneTemplateCodes)); + // 解除关联关系 + messageTemplateGroupDao.lambdaUpdate() + .in(MessageTemplateGroup::getTemplateCode, templateCodes) + .eq(MessageTemplateGroup::getPath, nodeCodePathMap.get(curGroupNodeCode)) + .remove(); + } + + @Override + public void move(String srcGroupNodeCode, String tgtGroupNodeCode, Collection templateCodes) { + // 参数校验 + AssertUtil.isTrue(StringUtils.isNotBlank(srcGroupNodeCode), "srcGroupNodeCode can not be blank"); + AssertUtil.isTrue(StringUtils.isNotBlank(tgtGroupNodeCode), "tgtGroupNodeCode can not be blank"); + AssertUtil.notEmpty(templateCodes, "templateCodes can not be empty"); + // 通过分类结点编码获取其对应的结点编码的路径 + Map nodeCodePathMap = messageGroupNodeService + .leafGroupNodeCodePaths(Lists.newArrayList(srcGroupNodeCode, tgtGroupNodeCode)); + // 通过能否成功获取到其树路径来校验其有效性 + AssertUtil.isTrue(StringUtils.isNotBlank(nodeCodePathMap.get(srcGroupNodeCode)), "srcGroupNodeCode is invalid"); + AssertUtil.isTrue(StringUtils.isNotBlank(nodeCodePathMap.get(tgtGroupNodeCode)), "tgtGroupNodeCode is invalid"); + // 获取已经存在目标分类与模板关联关系的模板编码列表 + List existTgtRelationTemplates = messageTemplateGroupDao.lambdaQuery() + .eq(MessageTemplateGroup::getPath, nodeCodePathMap.get(tgtGroupNodeCode)) + .in(MessageTemplateGroup::getTemplateCode, templateCodes) + .select(MessageTemplateGroup::getTemplateCode) + .list().stream().map(MessageTemplateGroup::getTemplateCode).collect(Collectors.toList()); + templateCodes = templateCodes.stream() + // 过滤掉已经存在目标分类与模板关联关系存在的模板编码 + .filter(e -> !existTgtRelationTemplates.contains(e)) + .collect(Collectors.toList()); + if (templateCodes.isEmpty()) { + log.info("目标分类与模板的关联关系已存在. existTgtRelationTemplates:{}", existTgtRelationTemplates); + return; + } + // 更新分类路径与模板编码的映射关系 + messageTemplateGroupDao.lambdaUpdate() + .eq(MessageTemplateGroup::getPath, nodeCodePathMap.get(srcGroupNodeCode)) + .in(MessageTemplateGroup::getTemplateCode, templateCodes) + .set(MessageTemplateGroup::getPath, nodeCodePathMap.get(tgtGroupNodeCode)) + .update(); + } + + private String removeErrorStr(List onlyContainsOneTemplateCodes) { + return String.format("模板:%s。解除关联后,将无关联分类!本次操作无效!", + String.join("、", onlyContainsOneTemplateCodes)); + } +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateV3ServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateV3ServiceImpl.java new file mode 100644 index 00000000..f983dae2 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateV3ServiceImpl.java @@ -0,0 +1,540 @@ +package cn.axzo.msg.center.message.service.impl; + +import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.msg.center.common.enums.ServiceErrorCodeEnum; +import cn.axzo.msg.center.common.enums.TableIsDeleteEnum; +import cn.axzo.msg.center.common.redis.RedisUtil; +import cn.axzo.msg.center.common.utils.PageHelperUtil; +import cn.axzo.msg.center.dal.MessageBaseTemplateDao; +import cn.axzo.msg.center.dal.MessageTemplateGroupV3Dao; +import cn.axzo.msg.center.dal.MessageTemplateV3Dao; +import cn.axzo.msg.center.domain.entity.MessageBaseTemplate; +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.MessageTemplateSaveOrUpdateParam; +import cn.axzo.msg.center.message.domain.param.MessageTemplateV3SaveOrUpdateParam; +import cn.axzo.msg.center.message.service.MessageGroupNodeService; +import cn.axzo.msg.center.message.service.MessageTemplateGroupService; +import cn.axzo.msg.center.message.service.MessageTemplateGroupV3Service; +import cn.axzo.msg.center.message.service.MessageTemplateNewService; +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.enums.MessageCategoryEnum; +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.MessageDetailStyle; +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 cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +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.stream.Collectors; + +/** + * @description + * + * @author cold_blade + * @date 2023/10/5 + * @version 1.0 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MessageTemplateV3ServiceImpl implements MessageTemplateV3Service { + + private static final String SAVE_TEMPLATE_MUTEX_KEY = "msg-center:template:save:%s"; + private static final long TRY_LOCK_TIMEOUT_MILLS = 1000; + private static final int RETRY_CNT_MAX = 3; + + private static final int MAX_NUM_ONCE_QUERY = 1000; + + private final RedisUtil redisUtil; + private final MessageBaseTemplateDao messageBaseTemplateDao; + private final MessageGroupNodeService messageGroupNodeService; + private final MessageTemplateGroupService messageTemplateGroupService; + private final MessageTemplateRouterService messageTemplateRouterService; + private final PendingMessageBizConfig pendingBizConfig; + private final GroupTemplateService groupTemplateService; + private final MessageTemplateV3Dao messageTemplateV3Dao; + private final MessageTemplateGroupV3Service messageTemplateGroupV3Service; + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTemplate(MessageTemplateV3SaveOrUpdateParam param) { + // 创建模板基础数据 + String templateCode = saveTemplate(param); + // 创建模板的路由数据 +// saveTemplateRouters(param, templateCode); + // 创建模板与分类的关联关系数据 + messageTemplateGroupV3Service.saveTemplateGroup(templateCode,param.getMessageTemplateGroups()); + return templateCode; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTemplate(MessageTemplateV3SaveOrUpdateParam param) { + // 更新模板基础数据 + updateBaseTemplate(param); + // 更新模板分类信息 + updateTemplateGroupRelation(param); + // 更新模板路由信息 + updateTemplateRouters(param); + } + + @Override + public MessageTemplateDetailResponse detail(String templateCode) { + if (StringUtils.isBlank(templateCode)) { + return null; + } + MessageBaseTemplate baseTemplate = messageBaseTemplateDao.lambdaQuery() + .eq(MessageBaseTemplate::getCode, templateCode) + .eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .one(); + if (Objects.isNull(baseTemplate)) { + log.info("there is not any template match the templateCode:[{}]", templateCode); + return null; + } + // 获取模板关联分类的path列表 + List groupNodePaths = messageTemplateGroupService.listMessageTemplateGroupPaths( + Lists.newArrayList(templateCode)).getOrDefault(templateCode, Collections.emptyList()); + // 获取模板配置的路由信息 + MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(templateCode) + .orElse(null); + return convert(baseTemplate, groupNodePaths, msgTemplateRouter); + } + + @Override + public void updateStatus(Long operatorId, String templateCode, StatusEnum status) { + if (Objects.isNull(operatorId) || StringUtils.isBlank(templateCode) || Objects.isNull(status)) { + log.info("the param is invalid. operatorId:[{}], code:[{}], status:[{}]", operatorId, templateCode, status); + return; + } + messageBaseTemplateDao.lambdaUpdate() + .eq(MessageBaseTemplate::getCode, templateCode) + .eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .set(MessageBaseTemplate::getStatus, status) + .set(MessageBaseTemplate::getUpdaterId, operatorId) + .update(); + } + + @Override + public Optional queryEnableTemplateByCode(String msgTemplateCode) { + if (StringUtils.isBlank(msgTemplateCode)) { + log.info("msgTemplateCode is blank."); + return Optional.empty(); + } + MessageBaseTemplate msgBaseTemplate = messageBaseTemplateDao.lambdaQuery() + .eq(MessageBaseTemplate::getCode, msgTemplateCode) + .eq(MessageBaseTemplate::getIsDelete, 0) + .eq(MessageBaseTemplate::getStatus, StatusEnum.ENABLE) + .one(); + if (Objects.isNull(msgBaseTemplate)) { + log.info("not find the [{}] template.", msgTemplateCode); + return Optional.empty(); + } + // 获取模板的路由配置信息 + MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode) + .orElse(null); + return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, msgTemplateRouter)); + } + + @Override + public List listByTemplateCodes(List msgTemplateCodes) { + if (CollectionUtils.isEmpty(msgTemplateCodes)) { + log.info("msgTemplateCodes is empty."); + return Collections.emptyList(); + } + List msgBaseTemplates = messageBaseTemplateDao.lambdaQuery() + .in(MessageBaseTemplate::getCode, msgTemplateCodes) + .eq(MessageBaseTemplate::getIsDelete, 0) + .list(); + if (Objects.isNull(msgBaseTemplates)) { + log.info("not find the [{}] templates.", msgTemplateCodes); + return Collections.emptyList(); + } + Map templateRouterMap = messageTemplateRouterService + .groupByTemplateCode(msgTemplateCodes); + return msgBaseTemplates.stream() + .map(e -> MessageTemplateDTO.from(e, templateRouterMap.get(e.getCode()))) + .collect(Collectors.toList()); + } + + @Override + public Page page(MessageTemplatePageRequest request) { + IPage result = pageQueryBaseTemplate(request); + if (Objects.isNull(result) + || CollectionUtils.isEmpty(result.getRecords())) { + return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize()); + } + List templateCodes = result.getRecords().stream() + .map(MessageBaseTemplate::getCode) + .collect(Collectors.toList()); + Map> groupNodePaths = messageTemplateGroupService + .listMessageTemplateGroupPaths(templateCodes); + Map codeNameMap = messageGroupNodeService.groupNodeNamePaths(groupNodePaths.values().stream() + .flatMap(Collection::stream).collect(Collectors.toList())); + List records = result.getRecords().stream() + .map(e -> convert(e, groupNodePaths, codeNameMap)) + .collect(Collectors.toList()); + return Page.toPage(request.getPage(), request.getPageSize(), result.getTotal(), records); + } + + @Override + public Page pageBaseTemplate(MessageTemplatePageRequest request) { + IPage result = pageQueryBaseTemplate(request); + if (Objects.isNull(result) + || CollectionUtils.isEmpty(result.getRecords())) { + return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize()); + } + List records = result.getRecords().stream() + .map(this::convert) + .collect(Collectors.toList()); + return Page.toPage(request.getPage(), request.getPageSize(), result.getTotal(), records); + } + + @Override + public List listByCodes(Collection templateCodes) { + if (CollectionUtils.isEmpty(templateCodes)) { + log.info("the templateCodes is empty."); + return Collections.emptyList(); + } + AssertUtil.isTrue(templateCodes.size() <= MAX_NUM_ONCE_QUERY, "the collection of templateCodes is too large"); + // 查询模板基础数据 + List records = messageBaseTemplateDao.lambdaQuery() + .in(MessageBaseTemplate::getCode, templateCodes) + .eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + // 查询模板的分类结点编码path + templateCodes = records.stream().map(MessageBaseTemplate::getCode).collect(Collectors.toList()); + Map> groupNodePaths = messageTemplateGroupService + .listMessageTemplateGroupPaths(templateCodes); + // 将模板分类结点编码path转化为分类名称path + Map codeNameMap = messageGroupNodeService.groupNodeNamePaths(groupNodePaths.values().stream() + .flatMap(Collection::stream).collect(Collectors.toList())); + // 转化为页面展示的数据模型 + return records.stream() + .map(e -> convert(e, groupNodePaths, codeNameMap)) + .collect(Collectors.toList()); + } + + @Override + public List listTemplateCodesByIds(Collection ids) { + if (CollectionUtils.isEmpty(ids)) { + log.info("ids is empty."); + return Collections.emptyList(); + } + return messageBaseTemplateDao.lambdaQuery() + .in(MessageBaseTemplate::getId, ids) + .select(MessageBaseTemplate::getCode) + .list().stream() + .map(MessageBaseTemplate::getCode) + .collect(Collectors.toList()); + } + + @Override + public MessageTemplateDetailResponse querySyncMessageTemplate(String templateCode) { + MessageBaseTemplate baseTemplate = messageBaseTemplateDao.lambdaQuery() + .eq(MessageBaseTemplate::getCode, templateCode) + .eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .one(); + if (Objects.isNull(baseTemplate)) { + log.info("there is not any template match the templateCode:[{}]", templateCode); + return null; + } + // 获取模板配置的路由信息 + MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(templateCode) + .orElse(null); + return convert(baseTemplate, null, msgTemplateRouter); + } + + @Override + public List listTemplateDetailStyles() { + return new ArrayList<>(pendingBizConfig.getMessageDetailStyles()); + } + + private String saveTemplate(MessageTemplateV3SaveOrUpdateParam param) { + String templateCode = UUIDUtil.uuidString(); + MessageTemplateV3 template = convert(param); + boolean result = doSaveTemplate(template, templateCode); + int retryCnt = 0; + while (!result && retryCnt++ < RETRY_CNT_MAX) { + // 默认重试{@cod RETRY_CNT_MAX}次,若{@code RETRY_CNT_MAX}次后依然失败就报错 + templateCode = UUIDUtil.uuidString(); + result = doSaveTemplate(template, templateCode); + } + AssertUtil.isTrue(result, ServiceErrorCodeEnum.SYSTEM_BUSY.getDesc()); + return templateCode; + } + + public boolean doSaveTemplate(MessageTemplateV3 template, String templateCode) { + String opKey = String.format(SAVE_TEMPLATE_MUTEX_KEY, templateCode); + String requestId = UUIDUtil.uuidRawString(); + try { + boolean lockResult = redisUtil.getLockOps().getLockUntilTimeout(opKey, requestId, TRY_LOCK_TIMEOUT_MILLS); + AssertUtil.isTrue(lockResult, ServiceErrorCodeEnum.SYSTEM_BUSY.getDesc()); + if (isTemplateExist(templateCode)) { + return false; + } + template.setCode(templateCode); + messageTemplateV3Dao.save(template); + return true; + } finally { + redisUtil.getLockOps().releaseLock(opKey, requestId); + } + } + + private boolean isTemplateExist(String templateCode) { + return messageBaseTemplateDao.lambdaQuery() + .eq(MessageBaseTemplate::getCode, templateCode) + .eq(MessageBaseTemplate::getIsDelete, 0) + .count() > 0; + } + + private MessageTemplateV3 convert(MessageTemplateV3SaveOrUpdateParam param) { + MessageTemplateV3 template = new MessageTemplateV3(); + template.setName(param.getTemplateName()); + template.setMsgCategory(param.getMsgCategory()); + template.setTitle(param.getTitle()); + template.setContent(param.getContent()); + template.setDetailStyleCode(param.getDetailStyleCode()); +// 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()); + template.setCreatePersonId(param.getOperatorId()); + template.setCreatePersonName(param.getOperatorName()); + template.setUpdatePersonId(param.getOperatorId()); + template.setUpdatePersonName(param.getOperatorName()); + template.setPushData(param.getPushData()); + return template; + } + + public void saveTemplateRouters(MessageTemplateV3SaveOrUpdateParam param, String templateCode) { + MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, templateCode); + if (templateRouter.isValid()) { + // 模板配置了路由的场景 + messageTemplateRouterService.saveOrUpdate(templateRouter, false, templateCode); + } + } + + private void updateBaseTemplate(MessageTemplateV3SaveOrUpdateParam param) { + JSONObject pushData = param.getPushData(); + messageBaseTemplateDao.lambdaUpdate() + .eq(MessageBaseTemplate::getCode, param.getTemplateCode()) + .eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .set(MessageBaseTemplate::getUpdaterId, param.getOperatorId()) + .set(StringUtils.isNotBlank(param.getTemplateName()), + MessageBaseTemplate::getName, param.getTemplateName()) + .set(MessageBaseTemplate::getPushTerminal, JSON.toJSONString(param.getPushTerminals())) + .set(StringUtils.isNotBlank(param.getTitle()), MessageBaseTemplate::getTitle, param.getTitle()) +// .set(MessageBaseTemplate::getCardContent, JSONObjectUtil.toJSONString(param.getMsgCardContentItems())) + .set(MessageBaseTemplate::getContent, param.getContent()) + .set(StringUtils.isNotBlank(param.getDetailStyleCode()), + MessageBaseTemplate::getDetailStyleCode, param.getDetailStyleCode()) + .set(MessageBaseTemplate::getUpdatePersonId, param.getOperatorId()) + .set(MessageBaseTemplate::getUpdatePersonName, param.getOperatorName()) + .set(MessageBaseTemplate::getIcon, param.getIcon()) + .set(MessageBaseTemplate::getMinAppVersion, param.getMinAppVersion()) + .set(Objects.nonNull(pushData), MessageBaseTemplate::getPushData, + pushData == null ? null : pushData.toJSONString()) + .update(); + } + + private void updateTemplateGroupRelation(MessageTemplateV3SaveOrUpdateParam param) { + if (CollectionUtils.isEmpty(param.getLeafGroupNodes())) { + messageTemplateGroupService.deleteTemplateGroup(param.getTemplateCode()); + return; + } + messageTemplateGroupService.updateTemplateGroup(param.getTemplateCode(), param.getLeafGroupNodes()); + } + + private void updateTemplateRouters(MessageTemplateV3SaveOrUpdateParam param) { + MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, param.getTemplateCode()); + boolean isCleanOldFlag = Objects.isNull(param.getBizDetailShowStrategy()) + || CollectionUtils.isEmpty(param.getBizDetailShowStrategy().getTerminals()) + || CollectionUtils.isEmpty(param.getRouters()); + if (templateRouter.isValid() || isCleanOldFlag) { + // 模板修改了路由的场景 + messageTemplateRouterService.saveOrUpdate(templateRouter, true, param.getTemplateCode()); + } + } + + private IPage pageQueryBaseTemplate(MessageTemplatePageRequest request) { + List templateCodes = Lists.newArrayList(); + if (StringUtils.isNotBlank(request.getGroupNodeCode())) { + templateCodes = groupTemplateService.collectTemplateCodes(request.getGroupNodeCode()); + 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 pageRequest = request.toPage(); + String title = request.getTitle(); + if (title != null) { + title = title.trim(); + } + String content = request.getContent(); + if (content != null) { + content = content.trim(); + } + + return messageBaseTemplateDao.lambdaQuery() + .like(StringUtils.isNotBlank(title), MessageBaseTemplate::getTitle, title) + .like(StringUtils.isNotBlank(content), MessageBaseTemplate::getContent, content) + .apply(BooleanUtils.isFalse(request.pushSwitchOn), "(json_extract(push_data, '$.switchOn') is null or json_extract(push_data, '$.switchOn') = false)") + .apply(BooleanUtils.isTrue(request.pushSwitchOn), "json_extract(push_data, '$.switchOn') = true") + .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()) + .orderByDesc(MessageBaseTemplate::getCreateAt) + .page(pageRequest); + } + + private MessageBaseTemplateDTO convert(MessageBaseTemplate record) { + return MessageBaseTemplateDTO.builder() + .name(record.getName()) + .code(record.getCode()) + .msgCategory(record.getMsgCategory()) + .title(record.getTitle()) + .content(record.getContent()) + .cardContentItems(JSONObjectUtil.parseArray(record.getCardContent(), MessageCardContentItemDTO.class)) + .icon(record.getIcon()) + .pushTerminals(JSON.parseArray(record.getPushTerminal(), PushTerminalEnum.class)) + .createTimestamp(record.getCreateAt().getTime()) + .build(); + } + + private MessageTemplatePageResponse convert(MessageBaseTemplate record, Map> groupNodePaths, + Map codeNameMap) { + MessageDetailStyle styleType = pendingBizConfig + .findMessageDetailType(record.getDetailStyleCode()) + .orElse(null); + MessageTemplatePageResponse response = new MessageTemplatePageResponse(); + if (styleType != null) { + response.setStyleType(styleType); + } else if (record.getMsgCategory() == MessageCategoryEnum.BIZ_PENDING_MESSAGE) { + response.setStyleType(new MessageDetailStyle( + DetailStyleInfo.BIZ_COMMON_CODE, MessageCategoryEnum.BIZ_PENDING_MESSAGE, "业务待办能用", null)); + } else if (record.getMsgCategory() == MessageCategoryEnum.APPROVAL_PENDING_MESSAGE) { + response.setStyleType(new MessageDetailStyle( + DetailStyleInfo.FLOW_COMMON_CODE, MessageCategoryEnum.APPROVAL_PENDING_MESSAGE, "审批待办能用", null)); + } + response.setTemplateName(record.getName()); + response.setTemplateCode(record.getCode()); + response.setTitle(record.getTitle()); + response.setContent(record.getContent()); + response.setCategory(record.getMsgCategory()); + response.setStatus(record.getStatus()); + List nodeNamePaths = groupNodePaths.getOrDefault(record.getCode(), Collections.emptyList()).stream() + .filter(codeNameMap::containsKey) + .map(codeNameMap::get) + .collect(Collectors.toList()); + response.setGroupNodeNamePaths(nodeNamePaths); + response.setCreatePersonId(record.getCreatePersonId()); + response.setCreatePersonName(record.getCreatePersonName()); + response.setUpdatePersonId(record.getUpdatePersonId()); + response.setUpdatePersonName(record.getUpdatePersonName()); + response.setPushData(record.getPushData()); + return response; + } + + private MessageTemplateDetailResponse convert(MessageBaseTemplate record, List groupNodePaths, + MessageTemplateRouterDTO msgTemplateRouter) { + List groupNodeCodes = Lists.newArrayList(); + if (CollUtil.isNotEmpty(groupNodePaths)) { + // 将path解析中解析出分类结点(路径叶结点)的编码 + groupNodeCodes = groupNodePaths.stream() + .map(GroupTreeNodePathDTO::parseLeafNodeCode) + .collect(Collectors.toList()); + } + MessageDetailStyle styleType = pendingBizConfig + .findMessageDetailType(record.getDetailStyleCode()) + .orElse(null); + return MessageTemplateDetailResponse.builder() + .templateName(record.getName()) + .detailStyle(styleType) + .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()) + .detailStrategy(MessageRouterUtil.fetchBizDetailShowStrategy(msgTemplateRouter).orElse(null)) + .routers(MessageRouterUtil.fetchMessageRouterButtonStrategies(msgTemplateRouter)) + .minAppVersion(record.getMinAppVersion()) + .createTimestamp(record.getCreateAt().getTime()) + .updateTimestamp(record.getUpdateAt().getTime()) + .createPersonId(record.getCreatePersonId()) + .createPersonName(record.getCreatePersonName()) + .updatePersonId(record.getUpdatePersonId()) + .updatePersonName(record.getUpdatePersonName()) + .pushData(record.getPushData()) + .build(); + } + + private MessageTemplateRouterDTO buildTemplateRouter(MessageTemplateV3SaveOrUpdateParam 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 btnRouters = param.getRouters().stream() + .filter(MessageButtonRouteStrategyDTO::isValid) + .map(e -> MessageRouteButtonDTO.from(e, templateCode)) + .collect(Collectors.toList()); + templateRouter.setRouteButtons(btnRouters); + } + return templateRouter; + } +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/client/MessageTemplateV3Client.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/client/MessageTemplateV3Client.java new file mode 100644 index 00000000..8350c7db --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/client/MessageTemplateV3Client.java @@ -0,0 +1,103 @@ +package cn.axzo.msg.center.service.template.client; + +import cn.axzo.msg.center.service.template.request.MessageTemplateV3CreateRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateSyncDto; +import cn.axzo.msg.center.service.template.request.MessageTemplateSyncQueryRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateRequest; +import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateStatusRequest; +import cn.axzo.msg.center.service.template.response.MessageDetailStyle; +import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse; +import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse; +import cn.azxo.framework.common.model.CommonResponse; +import cn.azxo.framework.common.model.Page; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 消息模板管理 + */ +@Component +@FeignClient(value = "msg-center", url = "${server.serviceUrl:http://msg-center:8080}") +public interface MessageTemplateV3Client { + + /** + * 添加消息模板 + * + * @param request 模板数据模型 + * @return 模板编码 + */ + @PostMapping(value = "/message/template/add", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse save(@RequestBody @Valid MessageTemplateV3CreateRequest request); + + /** + * 编辑消息模板 + * + * @param request 模板数据模型 + */ + @PostMapping(value = "/message/template/update", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse update(@RequestBody @Valid MessageTemplateUpdateRequest request); + + /** + * 消息模板详情 + * + * @param templateCode 消息模板编码 + * @return 消息模板详情 + */ + @PostMapping(value = "/message/template/detail", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse detail(@RequestParam("templateCode") String templateCode); + + /** + * 分页查询模板 + * + * @param request 分页查询参数 + * @return 模板列表 + */ + @PostMapping(value = "/message/template/page", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse> page(@RequestBody MessageTemplatePageRequest request); + + /** + * 通过模板编码查询对应的模板 + * + * @param templateCodes 模板编码集合 + * @return 模板列表 + */ + @PostMapping(value = "/message/template/list", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse> listByCodes(@RequestParam("templateCodes") Collection templateCodes); + + /** + * 启用/禁用消息模板 + * + * @param request 模板状态 + */ + @PostMapping(value = "/message/template/update-status", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse updateStatus(@RequestBody @Valid MessageTemplateUpdateStatusRequest request); + + /** + * 查询消息模板 + */ + @PostMapping(value = "/message/template/sync/get", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse getSyncMessageTemplate(@RequestBody @Valid MessageTemplateSyncQueryRequest request); + + /** + * 同步消息模板 + * req-1896 说明:仅pre环境能同步 + */ + @PostMapping(value = "/message/template/sync", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse syncTemplate(@RequestBody @Valid MessageTemplateSyncDto request); + + /** + * 获取所有消息样式 + */ + @GetMapping(value = "/message/template/list-template-detail-styles", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse> listTemplateDetailStyles(); +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateGroupV3CreateRequest.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateGroupV3CreateRequest.java new file mode 100644 index 00000000..cd2cba63 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateGroupV3CreateRequest.java @@ -0,0 +1,39 @@ +package cn.axzo.msg.center.service.template.request; + +import cn.axzo.msg.center.service.domain.GroupConfig; +import cn.axzo.msg.center.service.enums.GroupType; +import lombok.Data; + +import java.util.List; + +/** + * @description + * + * @author cold_blade + * @date 2023/9/26 + * @version 1.0 + */ +@Data +public class MessageTemplateGroupV3CreateRequest { + + /** + * 分组名称, 公共组件时为空 + */ + private String name; + + /** + * 分组类型. KV_VALUES: 卡片信息; COMPONENT_WORKER:工人卡片 + */ + private GroupType groupType; + + /** + * 排列顺序 + */ + private Integer sortOrder; + + /** + * 分组配置 + */ + private GroupConfig groupConfig; + +} diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateV3CreateRequest.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateV3CreateRequest.java new file mode 100644 index 00000000..65c7cea5 --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/template/request/MessageTemplateV3CreateRequest.java @@ -0,0 +1,113 @@ +package cn.axzo.msg.center.service.template.request; + +import cn.axzo.msg.center.service.dto.MessageButtonRouteStrategyDTO; +import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; +import cn.axzo.msg.center.service.dto.MessageDetailRouteStrategyDTO; +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; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * @description + * + * @author cold_blade + * @date 2023/9/26 + * @version 1.0 + */ +@Setter +@Getter +public class MessageTemplateV3CreateRequest implements Serializable { + + private static final long serialVersionUID = -2894419272913799317L; + + /** + * 操作者的自然人id + */ + @NotNull(message = "operatorId is required") + private Long operatorId; + /** + * 操作人人姓名 + */ + private String operatorName; + /** + * 模板名称 + */ + @NotBlank(message = "templateName is required") + private String templateName; + /** + * 消息类型 + * NOTIFICATION: 通知 + * PENDING: 待办 + */ + @NotNull(message = "category is required") + private MessageGroupCategoryEnum category; + /** + * 消息类型 + * BIZ_PENDING_MESSAGE: 业务待办 + * APPROVAL_PENDING_MESSAGE: 审批待办 + */ + private MessageCategoryEnum subCategory; + /** + * 消息分类树的叶结点的结点编码列表 + */ + @NotEmpty(message = "leafGroupNodes is required") + private List leafGroupNodes; + /** + * 推送终端配置 + * B_ENTERPRISE_APP: B-安心筑企业版 + * C_WORKER_APP: C-安心筑工人版 + */ + private List pushTerminals; + /** + * 该模板最低支持的APP版本号 + */ + private String minAppVersion; + /** + * 消息标题 + */ + @NotBlank(message = "msgTitle is required") + private String msgTitle; + /** + * 消息内容 + */ + @NotBlank(message = "msgContent is required") + private String msgContent; + /** + * 消息图标 + */ + private String msgIcon; + /** + * 消息卡片信息标签列表,可为空 + */ + private List messageTemplateGroups; + /** + * 详情展示策略 + */ + private MessageDetailRouteStrategyDTO detailStrategy; + /** + * 路由策略列表 + */ + private List routers; + /** + * 待办样式, BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的 + */ + private String detailStyleCode; + + private JSONObject pushData; + + @Override + public String toString() { + return JSON.toJSONString(this); + } + +} diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java index a399b37d..4385063f 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/BaseEntityWithOperator.java @@ -2,10 +2,12 @@ package cn.axzo.msg.center.domain.entity; import cn.axzo.msg.center.domain.persistence.BaseEntityExt; import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; /** * @author yanglin */ +@Data public abstract class BaseEntityWithOperator> extends BaseEntityExt { /** * 创建人id