Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public List<FlowRecord> generateRecords(FlowSession flowSession) {
if (currentRecord.isReturnRecord()) {
// 退回后的流程重新提交
BaseAuditNode currentNode = (BaseAuditNode) flowSession.getWorkflow().getFlowNode(currentRecord.getReturnNodeId());
StrategyManager strategyManager = currentNode.strategies();
StrategyManager strategyManager = currentNode.strategyManager();
// 是否退回到退回节点
if (strategyManager.isResume()) {
FlowSession triggerSession = flowSession.updateSession(currentNode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,30 @@
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

@Setter
@Getter
public class FormFieldPermission {

private String formCode;
private String fieldName;
private PermissionType type;

public Map<String,Object> toMap() {
Map<String,Object> map = new HashMap<>();
map.put("formCode",formCode);
map.put("fieldName",fieldName);
map.put("type",type.name());
return map;
}

public static FormFieldPermission fromMap(Map<String,Object> map) {
FormFieldPermission permission = new FormFieldPermission();
permission.setFormCode((String) map.get("formCode"));
permission.setFieldName((String) map.get("fieldName"));
permission.setType(PermissionType.valueOf((String) map.get("type")));
return permission;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,11 @@

import com.codingapi.flow.action.IFlowAction;
import com.codingapi.flow.action.PassAction;
import com.codingapi.flow.error.ErrorThrow;
import com.codingapi.flow.form.FormMeta;
import com.codingapi.flow.form.permission.FormFieldPermission;
import com.codingapi.flow.node.builder.IFormFieldPermissionsNode;
import com.codingapi.flow.node.manager.ActionManager;
import com.codingapi.flow.node.manager.FieldPermissionManager;
import com.codingapi.flow.node.manager.OperatorManager;
import com.codingapi.flow.node.manager.StrategyManager;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.script.node.ErrorTriggerScript;
import com.codingapi.flow.script.node.NodeTitleScript;
import com.codingapi.flow.script.node.OperatorLoadScript;
import com.codingapi.flow.session.FlowAdvice;
import com.codingapi.flow.session.FlowSession;
import com.codingapi.flow.strategy.INodeStrategy;
Expand All @@ -26,11 +18,10 @@
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class BaseAuditNode extends BaseFlowNode implements IFlowNode, IFormFieldPermissionsNode {
public abstract class BaseAuditNode extends BaseFlowNode implements IFlowNode {

public static final String DEFAULT_VIEW = "default";

Expand All @@ -41,118 +32,20 @@ public abstract class BaseAuditNode extends BaseFlowNode implements IFlowNode, I
@Setter
private String view;

/**
* 审批人配置脚本
*/
private OperatorLoadScript operatorScript;

/**
* 节点待办标题脚本
*/
private NodeTitleScript nodeTitleScript;

/**
* 异常触发脚本
*/
private ErrorTriggerScript errorTriggerScript;

/**
* 表单字段权限
*/
@Setter
private List<FormFieldPermission> formFieldPermissions;

/**
* 节点策略
*/
@Setter
private List<INodeStrategy> nodeStrategies;


public BaseAuditNode(String id, String name, List<IFlowAction> actions, String view, OperatorLoadScript operatorScript, NodeTitleScript nodeTitleScript, ErrorTriggerScript errorTriggerScript, List<FormFieldPermission> formFieldPermissions, List<INodeStrategy> nodeStrategies) {
super(id, name, actions);
public BaseAuditNode(String id, String name, String view, List<IFlowAction> actions, List<INodeStrategy> nodeStrategies) {
super(id, name, 0, actions, nodeStrategies);
this.view = view;
this.operatorScript = operatorScript;
this.nodeTitleScript = nodeTitleScript;
this.errorTriggerScript = errorTriggerScript;
this.formFieldPermissions = formFieldPermissions;
this.nodeStrategies = nodeStrategies;
}

@Override
public Map<String, Object> toMap() {
Map<String, Object> map = new HashMap<>();
map.put("name", name);
map.put("id", id);
Map<String, Object> map = super.toMap();
map.put("view", view);
map.put("operatorScript", operatorScript.getScript());
map.put("nodeTitleScript", nodeTitleScript.getScript());
map.put("errorTriggerScript", errorTriggerScript.getScript());
map.put("formFieldPermissions", formFieldPermissions);
map.put("type", getType());
map.put("actions", actions.stream().map(IFlowAction::toMap).toList());
map.put("nodeStrategies", nodeStrategies.stream().map(INodeStrategy::toMap).toList());
return map;
}



/**
* 设置审批人配置脚本
*
* @param operatorScript 审批人配置脚本
*/
public void setOperatorScript(String operatorScript) {
this.operatorScript = new OperatorLoadScript(operatorScript);
}

/**
* 设置节点待办标题脚本
*
* @param nodeTitleScript 节点待办标题脚本
*/
public void setNodeTitleScript(String nodeTitleScript) {
this.nodeTitleScript = new NodeTitleScript(nodeTitleScript);
}

/**
* 错误触发脚本
*
* @param errorTriggerScript 错误触发脚本
*/
public void setErrorTriggerScript(String errorTriggerScript) {
this.errorTriggerScript = new ErrorTriggerScript(errorTriggerScript);
}


public FieldPermissionManager formFieldsPermissionsManager() {
return new FieldPermissionManager(formFieldPermissions);
}

public ActionManager actionManager() {
return new ActionManager(actions);
}


public OperatorManager operators(FlowSession flowSession) {
return new OperatorManager(operatorScript.execute(flowSession));
}

public String generateTitle(FlowSession flowSession) {
return nodeTitleScript.execute(flowSession);
}

public ErrorThrow errorTrigger(FlowSession flowSession) {
return errorTriggerScript.execute(flowSession);
}

public void addAction(IFlowAction action) {
if (this.actions == null) {
this.actions = new ArrayList<>();
}
this.actions.add(action);
}

public void verifyNode(FormMeta form) {
if (!StringUtils.hasText(view)) {
throw new IllegalArgumentException("view can not be null");
Expand All @@ -166,18 +59,8 @@ public void verifyNode(FormMeta form) {
if (actions == null || actions.isEmpty()) {
throw new IllegalArgumentException("actions can not be null");
}
if (operatorScript == null) {
throw new IllegalArgumentException("operator can not be null");
}
if (nodeTitleScript == null) {
throw new IllegalArgumentException("nodeTitle can not be null");
}
FieldPermissionManager fieldPermissionManager = this.formFieldsPermissionsManager();
fieldPermissionManager.verifyPermissions(form);
}

public StrategyManager strategies() {
return new StrategyManager(nodeStrategies);
StrategyManager strategyManager = this.strategyManager();
strategyManager.verifyStrategies(form);
}


Expand All @@ -188,8 +71,8 @@ public boolean continueTrigger(FlowSession session) {

@Override
public void fillNewRecord(FlowSession session, FlowRecord flowRecord) {
StrategyManager strategyManager = this.strategies();
flowRecord.setTitle(this.generateTitle(session));
StrategyManager strategyManager = this.strategyManager();
flowRecord.setTitle(strategyManager.generateTitle(session));
flowRecord.setTimeoutTime(strategyManager.getTimeoutTime());
flowRecord.setMergeable(strategyManager.isMergeable());
}
Expand All @@ -200,7 +83,7 @@ public boolean isDone(FlowSession session) {
FlowRecord currentRecord = session.getCurrentRecord();
// 多人审批
if (currentRecords.size() > 1) {
StrategyManager strategyManager = this.strategies();
StrategyManager strategyManager = this.strategyManager();
MultiOperatorAuditStrategy.Type multiOperatorAuditStrategyType = strategyManager.getMultiOperatorAuditStrategyType();
// 顺序审批
if (multiOperatorAuditStrategyType == MultiOperatorAuditStrategy.Type.SEQUENCE) {
Expand Down Expand Up @@ -235,21 +118,20 @@ public boolean isDone(FlowSession session) {
@Override
public List<FlowRecord> generateCurrentRecords(FlowSession session) {

if(this.isWaitParallelRecord(session)){
if (this.isWaitParallelRecord(session)) {
return List.of();
}

List<FlowRecord> records = new ArrayList<>();
FlowRecord currentRecord = session.getCurrentRecord();
OperatorManager operatorManager = this.operators(session);
StrategyManager strategyManager = this.strategyManager();
OperatorManager operatorManager = strategyManager.loadOperators(session);
List<IFlowOperator> operators = operatorManager.getOperators();
for (int order = 0; order < operators.size(); order++) {
IFlowOperator operator = operators.get(order);
FlowRecord flowRecord = new FlowRecord(session.updateSession(operator), this.id, order);
FlowRecord flowRecord = new FlowRecord(session.updateSession(operator), this.id, order);
records.add(flowRecord);
}
if (operators.size() > 1) {
StrategyManager strategyManager = this.strategies();
MultiOperatorAuditStrategy.Type multiOperatorAuditStrategyType = strategyManager.getMultiOperatorAuditStrategyType();
// 如果是顺序审批,则隐藏掉后续的人员的审批记录
if (multiOperatorAuditStrategyType == MultiOperatorAuditStrategy.Type.SEQUENCE) {
Expand Down Expand Up @@ -281,13 +163,14 @@ public void verifySession(FlowSession session) {
FlowRecord flowRecord = session.getCurrentRecord();
Workflow workflow = session.getWorkflow();
// 数据验证
FieldPermissionManager fieldPermissionManager = this.formFieldsPermissionsManager();
fieldPermissionManager.verifyFormData(workflow.getForm(), flowRecord.getFormData(), session.getFormData().toMapData());
// FieldPermissionManager fieldPermissionManager = this.formFieldsPermissionsManager();
// fieldPermissionManager.verifyFormData(workflow.getForm(), flowRecord.getFormData(), session.getFormData().toMapData());

FlowAdvice flowAdvice = session.getAdvice();
IFlowAction flowAction = flowAdvice.getAction();

StrategyManager strategyManager = this.strategies();
StrategyManager strategyManager = this.strategyManager();
strategyManager.verifySession(session);
// 是否必须填写审批意见
if (strategyManager.isEnableAdvice()) {
if (!StringUtils.hasText(flowAdvice.getAdvice())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
import com.codingapi.flow.form.FormMeta;
import com.codingapi.flow.node.builder.NodeMapBuilder;
import com.codingapi.flow.node.manager.ActionManager;
import com.codingapi.flow.node.manager.StrategyManager;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.session.FlowAdvice;
import com.codingapi.flow.session.FlowSession;
import com.codingapi.flow.strategy.INodeStrategy;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
Expand Down Expand Up @@ -49,23 +51,41 @@ public abstract class BaseFlowNode implements IFlowNode {
@Getter
protected List<IFlowAction> actions;

/**
* 节点策略
*/
@Getter
protected List<INodeStrategy> strategies;


public void setStrategies(List<INodeStrategy> strategies) {
if(strategies!=null && !strategies.isEmpty()) {
if(this.strategies!=null){
this.strategies.addAll(strategies);
}else {
this.strategies = strategies;
}
}
}

public BaseFlowNode(String name, String id) {
this(name, id, 0, new ArrayList<>());
this(name, id, 0, new ArrayList<>(), new ArrayList<>());
}

public BaseFlowNode(String id, String name, int order) {
this(id, name, order, new ArrayList<>());
this(id, name, order, new ArrayList<>(), new ArrayList<>());
}

public BaseFlowNode(String id, String name, List<IFlowAction> actions) {
this(id, name, 0, actions);
this(id, name, 0, actions, new ArrayList<>());
}

public BaseFlowNode(String id, String name, int order, List<IFlowAction> actions) {
public BaseFlowNode(String id, String name, int order, List<IFlowAction> actions, List<INodeStrategy> strategies) {
this.id = id;
this.name = name;
this.order = order;
this.actions = actions;
this.strategies = strategies;
}

@Override
Expand All @@ -76,6 +96,7 @@ public Map<String, Object> toMap() {
map.put("type", getType());
map.put("order", String.valueOf(order));
map.put("actions", actions.stream().map(IFlowAction::toMap).toList());
map.put("strategies", strategies.stream().map(INodeStrategy::toMap).toList());
return map;
}

Expand All @@ -87,6 +108,7 @@ public static <T extends BaseFlowNode> T loadFromMap(Map<String, Object> map, Cl
node.setName((String) map.get("name"));
node.setOrder(Integer.parseInt((String) map.get("order")));
node.setActions(NodeMapBuilder.loadActions(map));
node.setStrategies(NodeMapBuilder.loadNodeStrategies(map));
return node;
}

Expand Down Expand Up @@ -168,4 +190,10 @@ public ActionManager actionManager() {
return new ActionManager(actions);
}

@Override
public StrategyManager strategyManager() {
return new StrategyManager(strategies);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.codingapi.flow.form.FormMeta;
import com.codingapi.flow.node.manager.ActionManager;
import com.codingapi.flow.node.manager.StrategyManager;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.session.FlowSession;

Expand Down Expand Up @@ -74,6 +75,12 @@ public interface IFlowNode {
*/
ActionManager actionManager();

/**
* 获取节点策略管理器
* @return 节点策略管理器
*/
StrategyManager strategyManager();

/**
* 节点是否完成
* 当前节点是否完成,由于IFlowAction无法判断节点是否完成,是否完成需要根据节点配置的多人审批规则来判定,因此在提交通过节点时
Expand Down
Loading