REQ-3502: 过滤流程按钮
This commit is contained in:
parent
b570371b48
commit
ab6845816c
@ -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.CardButtonInterceptor;
|
||||||
import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory;
|
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.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.BizCategoryEnum;
|
||||||
import cn.axzo.msg.center.service.enums.TodoType;
|
|
||||||
import cn.axzo.msg.center.service.pending.request.CardContent;
|
import cn.axzo.msg.center.service.pending.request.CardContent;
|
||||||
import cn.axzo.msg.center.utils.desision.DecisionValue;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@ -35,14 +32,7 @@ class BizCardButtonInterceptorFactory implements CardButtonInterceptorFactory {
|
|||||||
log.warn("todo not found. identityCode={}", card.getBizParam());
|
log.warn("todo not found. identityCode={}", card.getBizParam());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new CardButtonInterceptor() {
|
return new TodoCardButtonInterceptor(todo);
|
||||||
@Override
|
|
||||||
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
|
|
||||||
if (todo.getType() == TodoType.COPIED_TO_ME)
|
|
||||||
return DecisionValue.decide(false);
|
|
||||||
return DecisionValue.notSure();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,34 +1,40 @@
|
|||||||
package cn.axzo.msg.center.message.service.todo.card.workflow;
|
package cn.axzo.msg.center.message.service.todo.card.workflow;
|
||||||
|
|
||||||
import cn.axzo.msg.center.domain.entity.Todo;
|
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.ButtonV3;
|
||||||
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
|
||||||
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
|
||||||
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
|
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.msg.center.utils.desision.DecisionValue;
|
||||||
import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
|
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;
|
||||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope;
|
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import static java.util.stream.Collectors.toSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author yanglin
|
* @author yanglin
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
class WorkflowTodoCardButtonInterceptor extends TodoCardButtonInterceptor {
|
||||||
class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
|
|
||||||
|
|
||||||
private final Todo todo;
|
|
||||||
private final Supplier<BpmnTaskButtonVo> workflowButtonsProvider;
|
private final Supplier<BpmnTaskButtonVo> workflowButtonsProvider;
|
||||||
private BpmnTaskButtonVo workflowButtons;
|
private BpmnTaskButtonVo workflowButtons;
|
||||||
|
|
||||||
|
WorkflowTodoCardButtonInterceptor(Todo todo, Supplier<BpmnTaskButtonVo> workflowButtonsProvider) {
|
||||||
|
super(todo);
|
||||||
|
this.workflowButtonsProvider = workflowButtonsProvider;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DecisionValue<Boolean> isPerformActionAvailable(ButtonV3 button) {
|
public DecisionValue<Boolean> isPerformActionAvailable(ButtonV3 button) {
|
||||||
BizFinalStateEnum state = findButtonClickState(button).orElse(null);
|
BizFinalStateEnum state = findButtonClickState(button).orElse(null);
|
||||||
@ -53,20 +59,26 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
|
public DecisionValue<Boolean> isVisibleOnCard(ButtonV3 button) {
|
||||||
if (todo.getState() == PendingMessageStateEnum.PROCESSING
|
DecisionValue<Boolean> decision = super.isVisibleOnCard(button);
|
||||||
|| todo.getType() == TodoType.COPIED_TO_ME)
|
if (decision.isDecided())
|
||||||
|
return decision;
|
||||||
|
// 进行中隐藏所有按钮
|
||||||
|
if (todo.getState() == PendingMessageStateEnum.PROCESSING)
|
||||||
return DecisionValue.decide(false);
|
return DecisionValue.decide(false);
|
||||||
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
|
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
|
||||||
return DecisionValue.notSure();
|
return DecisionValue.notSure();
|
||||||
|
if (getWorkflowHideButtonKeys().contains(button.getCode()))
|
||||||
|
return DecisionValue.decide(false);
|
||||||
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
||||||
return DecisionValue.decide(workflowButton != null);
|
// 如果找不到流程按钮, 说明不需要显示按钮
|
||||||
|
if (workflowButton == null)
|
||||||
|
return DecisionValue.decide(false);
|
||||||
|
// 是否显示由待办模版控制
|
||||||
|
return DecisionValue.notSure();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DecisionValue<Boolean> isSenderShow(ButtonV3 button) {
|
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)
|
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
|
||||||
return DecisionValue.decide(false);
|
return DecisionValue.decide(false);
|
||||||
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
||||||
@ -78,9 +90,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DecisionValue<Boolean> isExecutorShow(ButtonV3 button) {
|
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)
|
if (button.getSource() == RouterButtonSourceEnum.CUSTOM)
|
||||||
return DecisionValue.notSure();
|
return DecisionValue.notSure();
|
||||||
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null);
|
||||||
@ -103,6 +112,16 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor {
|
|||||||
.findFirst();
|
.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() {
|
private void fetchWorkflowButtons() {
|
||||||
if (workflowButtons == null)
|
if (workflowButtons == null)
|
||||||
workflowButtons = workflowButtonsProvider.get();
|
workflowButtons = workflowButtonsProvider.get();
|
||||||
|
|||||||
@ -18,7 +18,7 @@ public class DecisionValue<T> {
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static <T> DecisionValue<T> notSure() {
|
public static <T> DecisionValue<T> notSure() {
|
||||||
return (DecisionValue<T>)NOT_SURE;
|
return (DecisionValue<T>) NOT_SURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> DecisionValue<T> decide(T value) {
|
public static <T> DecisionValue<T> decide(T value) {
|
||||||
@ -26,11 +26,15 @@ public class DecisionValue<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public T orElse(Supplier<T> supplier) {
|
public T orElse(Supplier<T> supplier) {
|
||||||
return decision == Decision.DECIDED ? value : supplier.get();
|
return isDecided() ? value : supplier.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public T orElse(T value) {
|
public T orElse(T value) {
|
||||||
return decision == Decision.DECIDED ? this.value : value;
|
return isDecided() ? this.value : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDecided() {
|
||||||
|
return decision == Decision.DECIDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user