Merge branch 'feature/REQ-3401'

# Conflicts:
#	inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/v3/ModelV3Parser.java
#	inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRespBuilder.java
This commit is contained in:
yanglin 2025-01-21 10:15:40 +08:00
commit e6780e6d69
8 changed files with 44 additions and 66 deletions

View File

@ -14,12 +14,10 @@ import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.enums.TodoType; import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.service.pending.ClientRequest;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse; import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3;
import cn.axzo.msg.center.service.template.response.MessageDetailStyle; import cn.axzo.msg.center.service.template.response.MessageDetailStyle;
import cn.axzo.msg.center.utils.DateFormatUtil; import cn.axzo.msg.center.utils.DateFormatUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -33,7 +31,6 @@ import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* @description * @description
@ -285,64 +282,6 @@ public class PendingMessageDTO implements Serializable {
return null; return null;
} }
public PendingMessageResponse toResponse(ClientRequest request) {
boolean isCreatedToday = false;
if (createTime != null) {
Date createAt = DateFormatUtil.toDate(createTime);
isCreatedToday = DateUtil.isSameDay(createAt, new Date());
}
return PendingMessageResponse.builder()
// 发起人单位项目信息
.promoterOuId(promoterOuId)
.promoterWorkspaceId(promoterWorkspaceId)
.promoterWorkspaceName(promoterWorkspaceName)
.promoterWorkspaceType(promoterWorkspaceType)
// 接收者单位项目信息
.executorOuId(executorOuId)
.executorWorkspaceId(executorWorkspaceId)
.executorWorkspaceName(executorWorkspaceName)
.executorWorkspaceType(executorWorkspaceType)
// 其它信息
.bizExtParamObj(bizExtParamObj)
.routerExtParamObj(routerExtParamObj)
//页面展示
.ouId(this.ouId)
.workspaceId(workspaceId)
.workspaceName(workspaceName)
// 样式
.detailStyle(detailStyle)
.isCreatedToday(isCreatedToday)
.isRead(isRead)
.todoType(todoType)
.proposedButtons(proposedButtons)
.templateCategory(templateCategory)
.identityCode(this.identityCode)
.templateCode(this.templateCode)
.title(this.title)
.content(this.content)
.promoterPersonId(Optional.ofNullable(this.promoter).map(PersonDTO::getId).orElse(null))
.promoterName(Optional.ofNullable(this.promoter).map(PersonDTO::getName).orElse(null))
.promoterIdentity(Optional.ofNullable(this.promoter).map(PersonDTO::getIdentity).orElse(null))
.executorPersonId(Optional.ofNullable(this.executor).map(PersonDTO::getId).orElse(null))
.executorName(Optional.ofNullable(this.executor).map(PersonDTO::getName).orElse(null))
.executorIdentity(Optional.ofNullable(this.executor).map(PersonDTO::getIdentity).orElse(null))
.bizCode(this.bizCode)
.subBizCode(this.subBizCode)
.bizDesc(this.bizDesc)
.bizFlag(this.bizFlag)
.state(this.getState())
.bizCategory(this.bizCategory)
.createTimestamp(DateFormatUtil.toTimestamp(this.createTime))
.updateTimestamp(DateFormatUtil.toTimestamp(this.updateTime))
.deadlineTimestamp(DateFormatUtil.toTimestamp(this.deadline))
.bizFinalStateIcon(Optional.ofNullable(bizFinalState).map(BizFinalStateEnum::getIcon).orElse(null))
.bizFinalState(bizFinalState)
.modelV3(modelV3)
.displayOnCardKeyValues(modelV3.determineDisplayOnCardKeyValues())
.cardUrlOpenStrategy(cardUrlOpenStrategy)
.build();
}
@Override @Override
public String toString() { public String toString() {
return JSON.toJSONString(this); return JSON.toJSONString(this);

View File

@ -79,6 +79,7 @@ public class ModelV3Parser {
@Override @Override
public void visitGroupKeyValue(ParsedGroupV3 group, ParsedKV kv) { public void visitGroupKeyValue(ParsedGroupV3 group, ParsedKV kv) {
kv.setValueVariable(kv.getValue());
kv.setValue(resolveBizParam(kv.getValue())); kv.setValue(resolveBizParam(kv.getValue()));
if (kv.getContentType() == KVContentType.PERSON_ID if (kv.getContentType() == KVContentType.PERSON_ID

View File

@ -122,10 +122,12 @@ public class TodoRangeQueryService {
if (respResult.getList() != null) { if (respResult.getList() != null) {
ArrayList<ParsedKV> keyValues = new ArrayList<>(); ArrayList<ParsedKV> keyValues = new ArrayList<>();
for (PendingMessageResponse response : respResult.getList()) { for (PendingMessageResponse response : respResult.getList()) {
if (request.isButtonDisplayOnCardAware())
response.determineButtonRouters() response.determineButtonRouters()
.removeIf(btn -> !btn.determineStyles().contains(ButtonStyleEnum.OVER_CARD)); .removeIf(btn -> !btn.determineStyles().contains(ButtonStyleEnum.OVER_CARD));
if (response.getModelV3() != null) { if (response.getModelV3() != null) {
response.getModelV3().getButtons().removeIf(btn -> { response.getModelV3().getButtons().removeIf(btn -> {
if (!request.isButtonDisplayOnCardAware()) return false;
YesOrNo supportBatchProcess = request.getSupportBatchProcess(); YesOrNo supportBatchProcess = request.getSupportBatchProcess();
boolean notBatchProcessQuery = supportBatchProcess == null || supportBatchProcess == YesOrNo.NO; boolean notBatchProcessQuery = supportBatchProcess == null || supportBatchProcess == YesOrNo.NO;
return notBatchProcessQuery && !btn.hasStyle(ButtonStyleEnum.OVER_CARD); return notBatchProcessQuery && !btn.hasStyle(ButtonStyleEnum.OVER_CARD);
@ -151,6 +153,7 @@ public class TodoRangeQueryService {
PendingMessagePageRequest request, List<String> templateCodes) { PendingMessagePageRequest request, List<String> templateCodes) {
Date startingAt = DateFormatUtil.toDate(LocalDateTime.now().minusDays(90)); Date startingAt = DateFormatUtil.toDate(LocalDateTime.now().minusDays(90));
LambdaQueryWrapper<TodoBusiness> query = businessQuery(request.getTitle(), true) LambdaQueryWrapper<TodoBusiness> query = businessQuery(request.getTitle(), true)
.in(CollectionUtils.isNotEmpty(request.getTemplateCodes()), TodoBusiness::getTemplateCode, request.getTemplateCodes())
.eq(TodoBusiness::getPromoterPersonId, request.getPersonId()) .eq(TodoBusiness::getPromoterPersonId, request.getPersonId())
.eq(TodoBusiness::getIsDelete, TableIsDeleteEnum.NORMAL.value) .eq(TodoBusiness::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.gt(TodoBusiness::getCreateAt, startingAt) .gt(TodoBusiness::getCreateAt, startingAt)
@ -186,6 +189,7 @@ public class TodoRangeQueryService {
LambdaQueryWrapper<Todo> query = todoQuery(query(Todo.class), ouInfo, ouCollector) LambdaQueryWrapper<Todo> query = todoQuery(query(Todo.class), ouInfo, ouCollector)
// 查询的待办类型: COPIED_TO_ME, EXECUTABLE // 查询的待办类型: COPIED_TO_ME, EXECUTABLE
.eq(Todo::getType, request.determineToDoType()) .eq(Todo::getType, request.determineToDoType())
.in(CollectionUtils.isNotEmpty(request.getTemplateCodes()), Todo::getTemplateCode, request.getTemplateCodes())
.eq(Todo::getExecutorPersonId, request.getPersonId()) .eq(Todo::getExecutorPersonId, request.getPersonId())
//判断是否支持批量过滤 //判断是否支持批量过滤
.eq(request.getSupportBatchProcess() != null, Todo::getSupportBatchProcess, request.getSupportBatchProcess()) .eq(request.getSupportBatchProcess() != null, Todo::getSupportBatchProcess, request.getSupportBatchProcess())

View File

@ -34,6 +34,7 @@ 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.ParsedCardUrl;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupDetail; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupDetail;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupV3; 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.ParsedModelV3;
import cn.axzo.msg.center.service.pending.response.v3.model.SessionUrlInfo; import cn.axzo.msg.center.service.pending.response.v3.model.SessionUrlInfo;
import cn.axzo.msg.center.service.pending.response.v3.model.SessionUrlSelector; import cn.axzo.msg.center.service.pending.response.v3.model.SessionUrlSelector;
@ -262,7 +263,13 @@ public class TodoRespBuilder {
Runnable modelV3Builder = () -> { Runnable modelV3Builder = () -> {
response.setModelV3(parsedModel); response.setModelV3(parsedModel);
response.setDisplayOnCardKeyValues(parsedModel.determineDisplayOnCardKeyValues()); List<ParsedKV> keyValues = parsedModel.collectKeyValues();
boolean isKeyValueDisplayOnCardAware = request == null || request.isKeyValueDisplayOnCardAware();
if (isKeyValueDisplayOnCardAware)
keyValues = keyValues.stream()
.filter(ParsedKV::isDisplayOnCard)
.collect(toList());
response.setDisplayOnCardKeyValues(keyValues);
response.setCardUrlOpenStrategy(templateModel.getTemplate().getCardUrlOpenStrategy()); response.setCardUrlOpenStrategy(templateModel.getTemplate().getCardUrlOpenStrategy());
ParsedModelV3Walker.walkDown(parsedModel, new ParsedModel3Visitor() { ParsedModelV3Walker.walkDown(parsedModel, new ParsedModel3Visitor() {
@Override @Override

View File

@ -16,4 +16,12 @@ public interface ClientRequest {
return ModelVersion.V3.getVersionNumber(); return ModelVersion.V3.getVersionNumber();
} }
default boolean isKeyValueDisplayOnCardAware() {
return false;
}
default boolean isButtonDisplayOnCardAware() {
return false;
}
} }

View File

@ -23,6 +23,7 @@ import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Set;
/** /**
* @description * @description
@ -51,6 +52,10 @@ public class PendingMessagePageRequest extends PageRequest implements ClientRequ
* 应用终端 * 应用终端
*/ */
private AppTerminalTypeEnum appTerminalType; private AppTerminalTypeEnum appTerminalType;
/**
* 模板编码集合
*/
private Set<String> templateCodes;
/** /**
* 当前登录账户的自然id(前端不care) * 当前登录账户的自然id(前端不care)
*/ */
@ -153,6 +158,16 @@ public class PendingMessagePageRequest extends PageRequest implements ClientRequ
*/ */
private Integer modelVersion; private Integer modelVersion;
/**
* 是否根据配置'是否显示在卡片上'过滤key/value
*/
private boolean isKeyValueDisplayOnCardAware = true;
/**
* 是否根据配置'是否显示在卡片上'过滤按钮
*/
private boolean isButtonDisplayOnCardAware = true;
// !! 用于排查问题 // !! 用于排查问题
private String analysisToken; private String analysisToken;
private AnalysisInfo a = new AnalysisInfo(); private AnalysisInfo a = new AnalysisInfo();

View File

@ -37,6 +37,11 @@ public class ParsedKV {
@JsonIgnore @JsonIgnore
private boolean displayOnCard; private boolean displayOnCard;
/**
* 原始变量
*/
private String valueVariable;
@JsonIgnore @JsonIgnore
public boolean isValueAbsent() { public boolean isValueAbsent() {
return ValueUtils.isValueAbsent(value); return ValueUtils.isValueAbsent(value);

View File

@ -67,14 +67,13 @@ public class ParsedModelV3 implements MessageButtonProvider<ParsedButtonV3>, Pus
return template == null ? null : template.getCode(); return template == null ? null : template.getCode();
} }
public List<ParsedKV> determineDisplayOnCardKeyValues() { public List<ParsedKV> collectKeyValues() {
return determineGroups().stream() return determineGroups().stream()
.filter(group -> group.getGroupType() == GroupType.KV_VALUES) .filter(group -> group.getGroupType() == GroupType.KV_VALUES)
.map(ParsedGroupV3::getGroupInfo) .map(ParsedGroupV3::getGroupInfo)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(ParsedGroupInfo::getKeyValues) .map(ParsedGroupInfo::getKeyValues)
.flatMap(Collection::stream) .flatMap(Collection::stream)
.filter(ParsedKV::isDisplayOnCard)
.collect(toList()); .collect(toList());
} }