REQ-3201: 添加entity

This commit is contained in:
yanglin 2024-12-09 14:52:37 +08:00
parent 79593310bc
commit 7c54930baa
22 changed files with 607 additions and 66 deletions

View File

@ -3,9 +3,9 @@ package cn.axzo.msg.center.inside.notices.service.impl.v3.msg;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.im.center.api.feign.MessageApi;
import cn.axzo.im.center.api.vo.ApiChannel;
import cn.axzo.im.center.api.vo.PersonAccountAttribute;
import cn.axzo.im.center.api.vo.req.ExcludePushPayload;
import cn.axzo.im.center.api.vo.req.SendTemplateMessageParam;
import cn.axzo.im.center.api.vo.req.SendTemplateMessageParam.ReceivePerson;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.msg.center.api.enums.MsgStateV3Enum;
import cn.axzo.msg.center.api.request.v4.MessageSendBasicInfoV4;
@ -146,7 +146,7 @@ public class TemplateMessage {
imReq.setMsgTemplateContent(JSON.toJSONString(sendVo));
imReq.setExcludePushPayloads(new ArrayList<>());
// 接收人
ArrayList<ReceivePerson> receivers = new ArrayList<>();
ArrayList<PersonAccountAttribute> receivers = new ArrayList<>();
Set<Long> cmUnique = new HashSet<>();
Set<OuAndPerson> cmpUnique = new HashSet<>();
@ -175,7 +175,11 @@ public class TemplateMessage {
imReq.getExcludePushPayloads().add(excludePush);
}
receivers.add(new ReceivePerson(String.valueOf(receiver.getId()), ouId, appType));
PersonAccountAttribute receiverAccount = new PersonAccountAttribute();
receiverAccount.setPersonId(receiver.getId() + "");
receiverAccount.setOuId(ouId);
receiverAccount.setAppType(appType);
receivers.add(receiverAccount);
if (appType == AppTypeEnum.CM)
cmUnique.add(receiver.getId());
else if (appType == AppTypeEnum.CMP)

View File

@ -1,6 +1,6 @@
package cn.axzo.msg.center.domain.entity;
package cn.axzo.msg.center.service.domain.card;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import lombok.Getter;
import lombok.Setter;
@ -14,7 +14,7 @@ public class AppVersionConfig {
/**
* 端类型
*/
private PushTerminalEnum appType;
private AppTypeEnum appType;
/**
* 最低版本

View File

@ -1,4 +1,4 @@
package cn.axzo.msg.center.domain.entity;
package cn.axzo.msg.center.service.domain.card;
import cn.axzo.msg.center.service.enums.CardElementType;
import lombok.Getter;

View File

@ -0,0 +1,34 @@
package cn.axzo.msg.center.service.domain.card;
import cn.axzo.msg.center.service.enums.CardState;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
/**
* @author yanglin
*/
@Setter
@Getter
public class StateImageConfig {
/**
* 状态类型
*/
private CardState cardState;
/**
* 图片地址(如果页面未更换素材, 不存入数据库, 便于统一修改)
*/
private String imageUrl;
/**
* 是否启用
*/
private boolean enabled;
public String determineImageUrl() {
return StringUtils.isBlank(imageUrl) ? cardState.getDefaultImageUrl() : imageUrl;
}
}

View File

@ -0,0 +1,29 @@
package cn.axzo.msg.center.service.enums;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum CardSendState implements CodeDefinition<String> {
INIT_SEND_QUEUED("准备发送"),
INIT_SEND_SUCCESS("首次发送成功"),
INIT_SEND_FAIL("首次发送失败"),
UPDATE_SEND_SUCCESS("更新发送成功"),
UPDATE_SEND_FAIL("更新发送失败"),
;
private final String description;
@Override
public String getCode() {
return name();
}
}

View File

@ -0,0 +1,45 @@
package cn.axzo.msg.center.service.enums;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.List;
import static java.util.stream.Collectors.toList;
/**
* @author yanglin
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum CardState implements CodeDefinition<String> {
PENDING("待处理", true, ""),
AGREED("已同意", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"),
REJECTED("已拒绝", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"),
REVOKED("已撤销", true, "https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"),
ABORTED("已中止", true, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"),
COMPLETED("已处理", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"),
END("已完结", true, ""),
IN_PROGRESS("进行中", false, null)
;
private final String description;
private final boolean imageConfigurable;
private final String defaultImageUrl;
@Override
public String getCode() {
return name();
}
public static List<CardState> imageConfigurableStates() {
return Arrays.stream(values())
.filter(CardState::isImageConfigurable)
.collect(toList());
}
}

View File

@ -1,30 +0,0 @@
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 StateImageType implements CodeDefinition<String> {
PENDING("待处理", ""),
AGREED("已同意", "https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"),
REJECTED("已拒绝", "https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"),
REVOKED("已撤销", "https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"),
ABORTED("已中止", "https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"),
COMPLETED("已处理", "https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"),
END("已完结", ""),
;
private final String description;
private final String defaultImageUrl;
@Override
public String getCode() {
return name();
}
}

View File

@ -2,6 +2,9 @@ package cn.axzo.msg.center.service.pending.response.v3;
import cn.axzo.msg.center.service.domain.DetailConfig;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.domain.card.AppVersionConfig;
import cn.axzo.msg.center.service.domain.card.CardExtField;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedButtonV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupDetail;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupInfo;
@ -86,4 +89,17 @@ public interface ParsedModel3Visitor {
default void visitButtonUrl(ParsedButtonV3 button, SessionUrlInfo url) {}
default void exitButtonUrl(ParsedButtonV3 button, SessionUrlInfo url) {}
default void visitAppVersionConfig(AppVersionConfig cfg) {}
default void exitAppVersionConfig(AppVersionConfig cfg) {}
default void visitCardExtField(CardExtField field) {}
default void exitCardExtField(CardExtField field) {}
default void visitStateImageConfig(StateImageConfig cfg) {}
default void exitStateImageConfig(StateImageConfig cfg) {}
}

View File

@ -1,6 +1,8 @@
package cn.axzo.msg.center.service.pending.response.v3;
import cn.axzo.msg.center.service.domain.CardUrlConfig;
import cn.axzo.msg.center.service.domain.card.AppVersionConfig;
import cn.axzo.msg.center.service.domain.card.CardExtField;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedButtonV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedCardUrl;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupInfo;
@ -8,6 +10,7 @@ import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedKV;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedTemplateV3;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
@ -23,6 +26,9 @@ public class ParsedModelV3Walker {
if (template != null) {
visitor.visitTemplate(template);
visitCard(visitor, template);
visitAppVersionConfig(visitor, template);
visitCardExtField(visitor, template);
visitStateImageConfig(visitor, template);
}
for (ParsedGroupV3 group : new ArrayList<>(model.determineGroups()))
visitGroup(visitor, group);
@ -33,6 +39,33 @@ public class ParsedModelV3Walker {
visitor.exitModel(model);
}
private static void visitAppVersionConfig(ParsedModel3Visitor visitor,
ParsedTemplateV3 template) {
if (CollectionUtils.isEmpty(template.getAppVersionConfigs())) return;
for (AppVersionConfig cfg : template.getAppVersionConfigs()) {
visitor.visitAppVersionConfig(cfg);
visitor.exitAppVersionConfig(cfg);
}
}
private static void visitCardExtField(ParsedModel3Visitor visitor,
ParsedTemplateV3 template) {
if (CollectionUtils.isEmpty(template.getCardExtFields())) return;
for (CardExtField cfg : new ArrayList<>(template.getCardExtFields())) {
visitor.visitCardExtField(cfg);
visitor.exitCardExtField(cfg);
}
}
private static void visitStateImageConfig(ParsedModel3Visitor visitor,
ParsedTemplateV3 template) {
if (CollectionUtils.isEmpty(template.getStateImageConfigs())) return;
for (CardExtField cfg : new ArrayList<>(template.getCardExtFields())) {
visitor.visitCardExtField(cfg);
visitor.exitCardExtField(cfg);
}
}
private static void visitCard(ParsedModel3Visitor visitor,
ParsedTemplateV3 template) {
if (template == null) return;

View File

@ -2,6 +2,9 @@ package cn.axzo.msg.center.service.pending.response.v3.model;
import cn.axzo.msg.center.push.PushData;
import cn.axzo.msg.center.service.domain.CardUrlConfig;
import cn.axzo.msg.center.service.domain.card.AppVersionConfig;
import cn.axzo.msg.center.service.domain.card.CardExtField;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import cn.axzo.msg.center.service.enums.CardUrlOpenStrategy;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.StatusEnum;
@ -13,6 +16,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author yanglin
*/
@ -100,6 +105,26 @@ public class ParsedTemplateV3 {
*/
private YesOrNo displayOnList;
/**
* app最低版本控制
*/
private List<AppVersionConfig> appVersionConfigs;
/**
* 卡片样式编码
*/
private String cardStyleCode;
/**
* 卡片样式扩展字段
*/
private List<CardExtField> cardExtFields;
/**
* 卡片状态图片配置
*/
private List<StateImageConfig> stateImageConfigs;
public PushData parsePushData() {
JSONObject pushData = this.pushData;
if (pushData == null)

View File

@ -0,0 +1,15 @@
package cn.axzo.msg.center.dal;
import cn.axzo.msg.center.dal.mapper.CardMapper;
import cn.axzo.msg.center.domain.entity.Card;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author yanglin
*/
@Slf4j
@Component
public class CardDao extends ServiceImpl<CardMapper, Card> {
}

View File

@ -0,0 +1,15 @@
package cn.axzo.msg.center.dal;
import cn.axzo.msg.center.dal.mapper.CardLogMapper;
import cn.axzo.msg.center.domain.entity.CardLog;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author yanglin
*/
@Slf4j
@Component
public class CardLogDao extends ServiceImpl<CardLogMapper, CardLog> {
}

View File

@ -0,0 +1,15 @@
package cn.axzo.msg.center.dal;
import cn.axzo.msg.center.dal.mapper.CardMessageMapper;
import cn.axzo.msg.center.domain.entity.CardMessage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author yanglin
*/
@Slf4j
@Component
public class CardMessageDao extends ServiceImpl<CardMessageMapper, CardMessage> {
}

View File

@ -0,0 +1,10 @@
package cn.axzo.msg.center.dal.mapper;
import cn.axzo.msg.center.domain.entity.CardLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author yanglin
*/
public interface CardLogMapper extends BaseMapper<CardLog> {
}

View File

@ -0,0 +1,10 @@
package cn.axzo.msg.center.dal.mapper;
import cn.axzo.msg.center.domain.entity.Card;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author yanglin
*/
public interface CardMapper extends BaseMapper<Card> {
}

View File

@ -0,0 +1,10 @@
package cn.axzo.msg.center.dal.mapper;
import cn.axzo.msg.center.domain.entity.CardMessage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author yanglin
*/
public interface CardMessageMapper extends BaseMapper<CardMessage> {
}

View File

@ -0,0 +1,162 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.foundation.dao.support.mysql.type.BaseListTypeHandler;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.im.center.common.enums.YesOrNo;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
import cn.axzo.msg.center.service.domain.card.CardExtField;
import cn.axzo.msg.center.service.enums.CardSendState;
import cn.axzo.msg.center.service.enums.CardState;
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;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author yanglin
*/
@Setter
@Getter
@Accessors(chain = true)
@TableName(value = "card", autoResultMap = true)
public class Card extends BaseEntityExt<Card> {
/**
* 请求批次号
*/
private String batchNo;
/**
* IM任务id
*/
private Long imInitTaskId;
/**
* 卡片编码
*/
private String identityCode;
/**
* 业务编码
*/
private String bizCode;
/**
* 流程类代办的流程结点编码
*/
private String subBizCode;
/**
* 卡片模版编码
*/
private String templateCode;
/**
* 卡片发送状态. INIT_SEND_QUEUED: 准备发送; INIT_SEND_SUCCESS: 首次发送成功; INIT_SEND_FAIL: 首次发送成功; UPDATE_SEND_SUCCESS: 更新发送成功; UPDATE_SEND_FAIL: 更新发送失败;
*/
private CardSendState sendState;
/**
* 卡片状态. PENDING: 待处理, AGREED: 已同意, REJECTED: 已拒绝, REVOKED: 已撤销, ABORTED: 已中止, COMPLETED: 已处理, END: 已完结, IN_PROGRESS: 进行中
*/
private CardState cardState;
/**
* 卡片信息 (解析后)
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject cardContent;
/**
* 业务扩展参数
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject bizParam;
/**
* 路由扩展参数
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject routerParam;
/**
* 发送者的端
*/
private AppTypeEnum senderAppType;
/**
* 接收的端
*/
@TableField(typeHandler = AppTypeHandler.class)
private List<AppTypeEnum> receiverAppTypes;
/**
* 发送人是否为机器人. YES: , NO:
*/
private YesOrNo isSenderRobot;
/**
* 发起者的自然人ID
*/
private Long senderPersonId;
/**
* 发起人的单位id
*/
private Long senderOuId;
/**
* 发起者项目id
*/
private Long senderWorkspaceId;
/**
* 接收人自然人id
*/
private Long receiverPersonId;
/**
* 接收人单位id
*/
private Long receiverOuId;
/**
* 接收人项目id
*/
private Long receiverWorkspaceId;
/**
* 按钮状态
*/
@TableField(typeHandler = CardButtonStateHandler.class)
private List<CardButtonState> buttonStates;
/**
* 状态戳
*/
private String stateImage;
/**
* 扩展字段
*/
@TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
private RecordExt recordExt;
@Setter
@Getter
public static class RecordExt {
}
// @formatter:off
public static class AppTypeHandler
extends BaseListTypeHandler<AppTypeEnum> {}
public static class CardButtonStateHandler
extends BaseListTypeHandler<CardExtField> {}
// @formatter:on
}

View File

@ -0,0 +1,23 @@
package cn.axzo.msg.center.domain.entity;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class CardButtonState {
/**
* 按钮名称
*/
private String buttonCode;
/**
* 是否已经执行(点击)
*/
private Boolean isPerformed;
}

View File

@ -0,0 +1,73 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
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;
import lombok.experimental.Accessors;
/**
* @author yanglin
*/
@Setter
@Getter
@Accessors(chain = true)
@TableName(value = "card_log", autoResultMap = true)
public class CardLog extends BaseEntityExt<CardLog> {
/**
* 卡片唯一标识码
*/
private String identityCode;
/**
* 模版编码
*/
private String templateCode;
/**
* 业务编码
*/
private String bizCode;
/**
* 流程类代办的流程结点编码
*/
private String subBizCode;
/**
* 上下文
*/
private String context;
/**
* 批次号
*/
private String batchNo;
/**
* 卡片内容
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private Object cardContent;
/**
* 日志内容
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private Object logContent;
/**
* 扩展字段
*/
@TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
private Card.RecordExt recordExt;
@Setter
@Getter
public static class RecordExt {
}
}

View File

@ -0,0 +1,78 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* @author yanglin
*/
@Setter
@Getter
@Accessors(chain = true)
@TableName(value = "card_message", autoResultMap = true)
public class CardMessage extends BaseEntityExt<CardMessage> {
/**
* 卡片id
*/
private Long cardId;
/**
* 消息业务id
*/
private String bizMessageId;
/**
* 业务编码
*/
private String bizCode;
/**
* 消息卡片id
*/
private String cardIdentityCode;
/**
* 样式模版code
*/
private String templateCode;
/**
* 发起者的自然人ID
*/
private Long senderPersonId;
/**
* 发送者单位id
*/
private Long senderOuId;
/**
* 发送者项目id
*/
private Long senderWorkspaceId;
/**
* 接收人自然人id
*/
private Long receiverPersonId;
/**
* 接收者单位id
*/
private Long receiveOuId;
/**
* 接收者项目id
*/
private Long receiveWorkspaceId;
/**
* 终端类型. CM: 工人端, CMP: 管理端
*/
private AppTypeEnum appType;
}

View File

@ -5,6 +5,9 @@ import cn.axzo.im.center.api.feign.SendPriority;
import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler;
import cn.axzo.msg.center.push.PushData;
import cn.axzo.msg.center.service.domain.CardUrlConfig;
import cn.axzo.msg.center.service.domain.card.AppVersionConfig;
import cn.axzo.msg.center.service.domain.card.CardExtField;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import cn.axzo.msg.center.service.enums.CardUrlOpenStrategy;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;

View File

@ -1,29 +0,0 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.msg.center.service.enums.StateImageType;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class StateImageConfig {
/**
* 状态类型
*/
private StateImageType stateImageType;
/**
* 图片地址
*/
private String imageUrl;
/**
* 是否启用
*/
private Boolean enabled;
}