第一步,编写条件提供类接口
import java.util.List;
import java.util.Map;
/**
* 流转条件提供类接口
* 主要用于流程配置时提供可选流转条件和流程流转时根据条件结果来判断是否能从某个分支流转下去。
*/
public interface ConditionProvider extends Provider{
/**
* 获取流程点流转时可用分支条件
* 当分支条件与实际流转时可选意见不一致时,可通过特殊符号|来确定分支条件的可选意见
* 举个栗子:一个请假流程,需要审批,审批时可选条件是:通过、不通过
* 而流程流转时可选条件是:通过且不超过2天,通过且超过2天,不通过
* 则提供的选项可以是:通过且不超过2天|通过,通过且超过2天|通过,不通过
* @return
*/
List<String> getConditionList();
/**
* 判断业务流转时,选择的意见与流程定义中某条线上的意见是否一致
* @param condition 流程定义时,线上选择的流转条件,已经做了去ProviderName处理
* @param sourcePointId 流程定义中待流转的节点的ID
* @param businessKey 业务传递给流程的key
* @param resultInfo 流转时选择的意见,由业务调用flowNext时作为一个参数传给工作流,工作流再按固定的key放入variables中,test时取出
* @param variables 所有变量
* @return
*/
boolean testCondition(String condition,String sourcePointId, String businessKey, String resultInfo, Map<String, Object> variables);
}
第二步,编写条件接口类的具体实现
例如编写请假审核的条件
package cn.topcheer.flowchart.service.provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 请假流程流转条件(测试)
*/
public class AskForLeaveConditionProviderImpl implements ConditionProvider {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public List<String> getConditionList() {
List<String> result = new ArrayList<>();
result.add("不同意");
result.add("大于3天|同意");
result.add("小于等于3天|同意");
return result;
}
@Override
public boolean testCondition(String condition, String sourcePointId, String businessKey,String resultInfo, Map<String, Object> variables) {
if(condition!=null) {
if(resultInfo.equals("不同意")){
return condition.equals(resultInfo);
} else {
Object day = variables.get("day");
if(day != null) {
int days = (int)day;
if(condition.equals("大于3天|同意")){
if (days >3){
return true;
}
}
if(condition.equals("小于等于3天|同意")){
if (days <=3){
return true;
}
}
}
return false;
}
}
return false;
}
@Override
public String getProviderName() {
return "请假审核";
}
}
第三步,流程配置时,取出所有的条件提供器的所有实现,供用户选择
代码为
public List<String> getConditionList() {
List<String> result = new ArrayList<>();
if(providerManager.getConditionProviders()!=null) {
for (ConditionProvider conditionProvider : providerManager.getConditionProviders()) {
result.addAll(conditionProvider.getConditionList().stream().map(c->conditionProvider.getProviderName() + "."+c).collect(Collectors.toList()));
}
}
return result;
}
流程流转时,是否可流转代码为:
public boolean testFlowCondition(DelegateExecution execution,String sourcePointId,String condition,String voterName) throws UnsupportedEncodingException {
if (ConvertUtil.isEorN(condition)) return true;
Map<String,Object> variables= execution.getVariables();
String businessKey = execution.getProcessInstanceBusinessKey();
/*从condition中获取providerName,用以找到对应的ConditionProvider,如果找不到Provider,则说明内容是手动输入的*/
ConditionProvider conditionProvider = null;
String trueCondition = null;
int firstDotPosition=condition.indexOf(".");
if(firstDotPosition>0) {//存在.
String providerName = condition.substring(0, firstDotPosition);
conditionProvider = providerManager.getConditionProviderByName(providerName);
if(conditionProvider!=null)
trueCondition = condition.substring(firstDotPosition + 1);
else
trueCondition = condition;
}
String resultInfo=(String)variables.get("resultInfo");
if(conditionProvider!=null)
return conditionProvider.testCondition(trueCondition, sourcePointId, businessKey,resultInfo, variables);
else
return resultInfo!=null&&trueCondition.equals(resultInfo);
// Boolean result= getExpressionResult(variables,condition,Boolean.class);
}