REQ-3502: 过滤流程按钮

This commit is contained in:
yanglin 2025-01-14 11:30:11 +08:00
parent b570371b48
commit ab6845816c
4 changed files with 68 additions and 29 deletions

View File

@ -4,11 +4,8 @@ import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor;
import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory;
import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService;
import cn.axzo.msg.center.service.ButtonV3;
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.service.pending.request.CardContent;
import cn.axzo.msg.center.utils.desision.DecisionValue;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.Nullable;
@ -35,14 +32,7 @@ class BizCardButtonInterceptorFactory implements CardButtonInterceptorFactory {
log.warn("todo not found. identityCode={}", card.getBizParam());
return null;
}
return new CardButtonInterceptor() {
@Override
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
if (todo.getType() == TodoType.COPIED_TO_ME)
return DecisionValue.decide(false);
return DecisionValue.notSure();
}
};
return new TodoCardButtonInterceptor(todo);
}
}

View File

@ -0,0 +1,26 @@
package cn.axzo.msg.center.message.service.todo.card.biz;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor;
import cn.axzo.msg.center.service.ButtonV3;
import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.utils.desision.DecisionValue;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@RequiredArgsConstructor
public class TodoCardButtonInterceptor implements CardButtonInterceptor {
protected final Todo todo;
@Override
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
// 抄送不显示任何按钮
if (todo.getType() == TodoType.COPIED_TO_ME)
return DecisionValue.decide(false);
return DecisionValue.notSure();
}
}

View File

@ -1,34 +1,40 @@
package cn.axzo.msg.center.message.service.todo.card.workflow;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor;
import cn.axzo.msg.center.message.service.todo.card.biz.TodoCardButtonInterceptor;
import cn.axzo.msg.center.service.ButtonV3;
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.utils.desision.DecisionValue;
import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import static java.util.stream.Collectors.toSet;
/**
* @author yanglin
*/
@Slf4j
@RequiredArgsConstructor
class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
class WorkflowTodoCardButtonInterceptor extends TodoCardButtonInterceptor {
private final Todo todo;
private final Supplier<BpmnTaskButtonVo> workflowButtonsProvider;
private BpmnTaskButtonVo workflowButtons;
WorkflowTodoCardButtonInterceptor(Todo todo, Supplier<BpmnTaskButtonVo> workflowButtonsProvider) {
super(todo);
this.workflowButtonsProvider = workflowButtonsProvider;
}
@Override
public DecisionValue<Boolean> isPerformActionAvailable(ButtonV3 button) {
BizFinalStateEnum state = findButtonClickState(button).orElse(null);
@ -53,20 +59,26 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
@Override
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
if (todo.getState() == PendingMessageStateEnum.PROCESSING
|| todo.getType() == TodoType.COPIED_TO_ME)
DecisionValue<Boolean> decision = super.isVisibleOnCard(button);
if (decision.isDecided())
return decision;
// 进行中隐藏所有按钮
if (todo.getState() == PendingMessageStateEnum.PROCESSING)
return DecisionValue.decide(false);
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
return DecisionValue.notSure();
if (getWorkflowHideButtonKeys().contains(button.getCode()))
return DecisionValue.decide(false);
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
return DecisionValue.decide(workflowButton != null);
// 如果找不到流程按钮, 说明不需要显示按钮
if (workflowButton == null)
return DecisionValue.decide(false);
// 是否显示由待办模版控制
return DecisionValue.notSure();
}
@Override
public DecisionValue<Boolean> isSenderShow(ButtonV3 button) {
if (todo.getState() == PendingMessageStateEnum.PROCESSING ||
todo.getType() == TodoType.COPIED_TO_ME)
return DecisionValue.decide(false);
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
return DecisionValue.decide(false);
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
@ -78,9 +90,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
@Override
public DecisionValue<Boolean> isExecutorShow(ButtonV3 button) {
if (todo.getState() == PendingMessageStateEnum.PROCESSING
|| todo.getType() == TodoType.COPIED_TO_ME)
return DecisionValue.decide(false);
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
return DecisionValue.notSure();
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
@ -103,6 +112,16 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
.findFirst();
}
private Set<String> getWorkflowHideButtonKeys() {
fetchWorkflowButtons();
List<BpmnButtonMetaInfo> workflowHiddenButtons = workflowButtons.getCustomHiddenButtons();
if (workflowHiddenButtons == null)
workflowHiddenButtons = Collections.emptyList();
return workflowHiddenButtons.stream()
.map(BpmnButtonMetaInfo::getBtnKey)
.collect(toSet());
}
private void fetchWorkflowButtons() {
if (workflowButtons == null)
workflowButtons = workflowButtonsProvider.get();

View File

@ -18,7 +18,7 @@ public class DecisionValue<T> {
@SuppressWarnings("unchecked")
public static <T> DecisionValue<T> notSure() {
return (DecisionValue<T>)NOT_SURE;
return (DecisionValue<T>) NOT_SURE;
}
public static <T> DecisionValue<T> decide(T value) {
@ -26,11 +26,15 @@ public class DecisionValue<T> {
}
public T orElse(Supplier<T> supplier) {
return decision == Decision.DECIDED ? value : supplier.get();
return isDecided() ? value : supplier.get();
}
public T orElse(T value) {
return decision == Decision.DECIDED ? this.value : value;
return isDecided() ? this.value : value;
}
public boolean isDecided() {
return decision == Decision.DECIDED;
}
}