根据任务id、参数,预测、获取下一任务节点集合、候选用户集合、候选组集合、参与用户id集合等。
List<UserTaskVo> nextUserTasks = (taskId, variableMap);
Service
1.1 NewProcessService
package ;
import ;
import ;
import ;
public interface NewProcessService {
/**
* 获取el表达式的值
* @param exp el表达式
* @param variableMap map参数
* @return true/false
*/
boolean getElValue(String exp, Map<String, Object> variableMap);
/**
* 获取el表达式的值
* @param processInstanceId 流程实例id
* @param exp el表达式
* @param variableMap map参数
* @return true/false
*/
boolean getElValue(String processInstanceId, String exp, Map<String, Object> variableMap);
/**
* 获取el表达式的值
* @param taskId 流程任务id
* @param exp el表达式
* @param variableMap map参数
* @return true/false
*/
boolean getElValueByTaskId(String taskId, String exp, Map<String, Object> variableMap);
/**
* 获取skip是否跳过节点el表达式的值
* @param exp el表达式
* @param variableMap map参数
* @return true 跳过节点/false 不跳过节点
*/
boolean getSkipElValue(String exp, Map<String, Object> variableMap);
/**
* 根据参数,预测、获取下一任务节点集合
*
* @param taskId 任务id
* @param variables 参数
* @return 下一任务节点集合
*/
List<UserTaskVo> getNextUserTasks(String taskId, Map<String, Object> variables);
/**
* 根据参数,预测、获取下一任务节点集合
*
* @param taskId 任务id
* @param code 业务ID
* @param variables 参数
* @return 下一任务节点集合
*/
List<UserTaskVo> getNextUserTasks(String taskId, String code, Map<String, Object> variables);
}
ServiceImpl
2.1 NewProcessServiceImpl
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import org.;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@Service
public class NewProcessServiceImpl implements NewProcessService {
protected Logger log = (());
@Autowired
private RuntimeService runtimeService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngine processEngine;
@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
@Autowired
private VUserGroupMapper vUserGroupMapper;
@Autowired
private ActRuVariableMapper actRuVariableMapper;
@Override
public boolean getElValue(String exp, Map<String, Object> variableMap) {
return (null, exp, variableMap);
}
@Override
public boolean getElValue(String processInstanceId, String exp, Map<String, Object> variableMap) {
if ((exp)) {
return true;
}
ManagementService managementService = ();
boolean flag = (new ExpressionCmd(processEngine, processInstanceId, exp, variableMap));
//删除垃圾数据
();
return flag;
}
@Override
public boolean getElValueByTaskId(String taskId, String exp, Map<String, Object> variableMap) {
if ((exp)) {
return true;
}
Map<String, Object> variables = (taskId);
(variableMap);
ManagementService managementService = ();
boolean flag = (new ExpressionCmd(exp, variables));
//删除垃圾数据
();
return flag;
}
@Override
public boolean getSkipElValue(String exp, Map<String, Object> variableMap) {
//表达式为空,节点不跳过
if ((exp)) {
return false;
}
//skip:true 跳过节点/false 不跳过节点
boolean skip = false;
Map<String, Object> variables = new HashMap<>(variableMap);
Object flowableSkipExpressionEnabled = ("_FLOWABLE_SKIP_EXPRESSION_ENABLED");
//流程参数含有_FLOWABLE_SKIP_EXPRESSION_ENABLED,且为true时,表示FLOWABLE跳过表达式已启用
if (null != flowableSkipExpressionEnabled && "true".equals(())) {
//返回true,表示跳过该任务节点;
ManagementService managementService = ();
skip = (new ExpressionCmd(exp, variables));
//删除垃圾数据
();
}
return skip;
}
public void deleteException(){
//删除垃圾数据
();
();
}
/**
* 获取下一任务节点集合
*
* @param taskId 任务id
* @param variables 参数
* @return 下一任务节点集合
*/
@Override
public List<UserTaskVo> getNextUserTasks(String taskId, Map<String, Object> variables) {
return (taskId, null, variables);
}
@Override
public List<UserTaskVo> getNextUserTasks(String taskId, String code, Map<String, Object> variables) {
if ((taskId)) {
return new ArrayList<>();
}
Task task = ().taskId(taskId).singleResult();
if (null == task) {
return new ArrayList<>();
}
Map<String, Object> variableMap = (());
(variables);
String procId = "";
ProcessDefinition processDefinition = ()
.processDefinitionId(()).singleResult();
if (null != processDefinition) {
procId = ();
}
List<UserTaskVo> userTasks = new ArrayList<>();
List<FlowElement> nextFlowNodes = (task, variableMap);
for (FlowElement nextFlowNode : nextFlowNodes) {
List<String> candidateUserIdList = new ArrayList<>(); //参与用户id
List<CandidateUserVo> candidateUsers = new ArrayList<>(); //候选用户
List<CandidateGroupVo> candidateGroups = new ArrayList<>(); //候选组
UserTask flowElement = (UserTask) nextFlowNode;
String flowId = ();
String flowName = ();
String assignee = ();
if ((assignee)) {
// 节点分配给了具体参与者
String key = (assignee);
Object userIdStr = (key);
if (null != userIdStr && (())) {
// 节点分配给了具体参与者
String userId = ();
String userName = "";
User user = ().userId(userId).singleResult();
if (null != user) {
userName = ();
}
(userId);
(new CandidateUserVo(userId, userName));
}
} else {
// 候选用户
for (String candidateUser : ()) {
String key = (candidateUser);
Object userIdStr = (key);
if (null != userIdStr && (())) {
//value可能是集合
List<String> userIds = (userIdStr);
for (String userId : userIds) {
String userName = "";
User user = ().userId(userId).singleResult();
if (null != user) {
userName = ();
}
(userId);
(new CandidateUserVo(userId, userName));
}
}
}
//候选组
for (String candidateGroup : ()) {
String key = (candidateGroup);
Object groupIdStr = (key);
if (null != groupIdStr && (())) {
//value可能是集合
List<String> groupIds = (groupIdStr);
for (String groupId : groupIds) {
String groupName = "";
Group group = ().groupId(groupId).singleResult();
if (null != group) {
groupName = ();
}
(new CandidateGroupVo(groupId, groupName));
// 查询候选组用户id
builderGroup = new ();
// 条件
Sqls sqlGroup = ();
("groupId", groupId);
(sqlGroup);
List<VUserGroup> vUserGroupList = (());
if (!(vUserGroupList)) {
for (VUserGroup vUserGroup : vUserGroupList) {
(());
}
}
}
}
}
}
UserTaskVo userTask = new UserTaskVo(null, flowId, flowName, procId, code,
candidateUserIdList, candidateUsers, candidateGroups);
(userTask);
}
return userTasks;
}
/**
* 获取下一任务节点集合
*
* @param taskId 任务id
* @param variables 参数
* @return 下一任务节点集合
*/
public List<FlowElement> getNextFlowNodes(String taskId, Map<String, Object> variables) {
if ((taskId)) {
return new ArrayList<>();
}
Task task = ().taskId(taskId).singleResult();
if (null == task) {
return new ArrayList<>();
}
Map<String, Object> variableMap = (());
(variables);
return (task, variableMap);
}
/**
* 获取下一任务节点集合
*
* @param task 当前任务
* @param variables 参数
* @return 下一任务节点集合
*/
public List<FlowElement> getNextFlowNodes(Task task, Map<String, Object> variables) {
if (null == task) {
return new ArrayList<>();
}
// 当前审批节点
String currentActivityId = (); //当前环节id
BpmnModel bpmnModel = (());
//复制一份
List<FlowElement> flowElements = new ArrayList<>(().getFlowElements());
List<FlowElement> nextElements = new ArrayList<>();
FlowNode flowNode = (FlowNode) (currentActivityId);
// 输出连线
List<SequenceFlow> outFlows = ();
FlowElement targetElement;
List<SequenceFlow> sequenceFlows = (variables, outFlows);
for (SequenceFlow sequenceFlow : sequenceFlows) {
targetElement = (flowElements, ());
(nextElements, flowElements, targetElement, variables);
}
return nextElements;
}
/**
* 获取下一环节任务节点集合
*/
private void getNextElementList(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
if (null == curFlowElement) {
return;
}
// 任务节点
if (curFlowElement instanceof UserTask) {
(nextElements, flowElements, curFlowElement, variableMap);
return;
}
// 排他网关
if (curFlowElement instanceof ExclusiveGateway) {
(nextElements, flowElements, curFlowElement, variableMap);
return;
}
// 并行网关
if (curFlowElement instanceof ParallelGateway) {
(nextElements, flowElements, curFlowElement, variableMap);
}
// 包含网关
if (curFlowElement instanceof InclusiveGateway) {
(nextElements, flowElements, curFlowElement, variableMap);
}
// 事件网关
if (curFlowElement instanceof EventGateway) {
(nextElements, flowElements, curFlowElement, variableMap);
}
}
/**
* 任务节点
*/
private void dueUserTaskElement(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
UserTask userTask = (UserTask) curFlowElement;
//skip:true 跳过节点/false 不跳过节点
boolean skip = ((), variableMap);
if (!skip) {
//不跳过节点,
(curFlowElement);
} else {
//跳过节点,查询下一节点
List<SequenceFlow> outgoingFlows = ();
if (() > 0) {
String targetRef = (0).getTargetRef();
if (() > 1) {
// 找到表达式成立的sequenceFlow
SequenceFlow sequenceFlow = getSequenceFlow(variableMap, outgoingFlows);
targetRef = ();
}
// 根据ID找到FlowElement
FlowElement targetElement = (flowElements, targetRef);
(nextElements, flowElements, targetElement, variableMap);
}
}
}
/**
* 排他网关
*/
private void dueExclusiveGateway(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
// 获取符合条件的sequenceFlow的目标FlowElement
List<SequenceFlow> exclusiveGatewayOutgoingFlows = ((ExclusiveGateway) curFlowElement).getOutgoingFlows();
(curFlowElement);
// 找到表达式成立的sequenceFlow
SequenceFlow sequenceFlow = (variableMap, exclusiveGatewayOutgoingFlows);
// 根据ID找到FlowElement
FlowElement targetElement = (flowElements, ());
(nextElements, flowElements, targetElement, variableMap);
}
/**
* 并行网关
*/
private void dueParallelGateway(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
FlowElement targetElement;
List<SequenceFlow> parallelGatewayOutgoingFlows = ((ParallelGateway) curFlowElement).getOutgoingFlows();
for (SequenceFlow sequenceFlow : parallelGatewayOutgoingFlows) {
targetElement = (flowElements, ());
(nextElements, flowElements, targetElement, variableMap);
}
}
/**
* 包含网关
*/
private void dueInclusiveGateway(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
FlowElement targetElement;
List<SequenceFlow> inclusiveGatewayOutgoingFlows = ((InclusiveGateway) curFlowElement).getOutgoingFlows();
List<SequenceFlow> sequenceFlows = (variableMap, inclusiveGatewayOutgoingFlows);
for (SequenceFlow sequenceFlow : sequenceFlows) {
targetElement = (flowElements, ());
(nextElements, flowElements, targetElement, variableMap);
}
}
/**
* 事件网关
*/
private void dueEventGateway(List<FlowElement> nextElements, Collection<FlowElement> flowElements, FlowElement curFlowElement, Map<String, Object> variableMap) {
}
/**
* 根据ID找到FlowElement
* @param flowElements 流程节点集合
* @param targetRef id
* @return FlowElement
*/
private FlowElement getFlowElement(Collection<FlowElement> flowElements, String targetRef) {
return ().filter(flowElement -> (())).findFirst().orElse(null);
}
/**
* 根据传入的变量,计算出表达式成立的那一条SequenceFlow
*
* @param variableMap 变量map
* @param outgoingFlows 输出流
* @return SequenceFlow连线
*/
private SequenceFlow getSequenceFlow(Map<String, Object> variableMap, List<SequenceFlow> outgoingFlows) {
List<SequenceFlow> sequenceFlows = (variableMap, outgoingFlows);
if (null != sequenceFlows && () > 0) {
return (0);
}
return (0);
}
/**
* 根据传入的变量,计算出表达式成立的SequenceFlow连线集合
*
* @param variableMap 变量map
* @param outgoingFlows 输出流
* @return SequenceFlow连线集合
*/
private List<SequenceFlow> getSequenceFlows(Map<String, Object> variableMap, List<SequenceFlow> outgoingFlows) {
List<SequenceFlow> sequenceFlows;
sequenceFlows = ().filter(item -> {
try {
return ((), variableMap);
} catch (Exception e) {
();
return false;
}
}).collect(());
return sequenceFlows;
}
}
command
ExpressionCmd
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* 表达式
*/
public class ExpressionCmd implements Command<Boolean>, Serializable {
protected ProcessEngine processEngine;
protected String processInstanceId;
protected String exp;
protected Map<String, Object> variableMap;
public ExpressionCmd(String exp, Map<String, Object> variableMap) {
= exp;
= variableMap;
}
public ExpressionCmd(ProcessEngine processEngine, String processInstanceId, String exp, Map<String, Object> variableMap) {
= processEngine;
= processInstanceId;
= exp;
= variableMap;
}
@Override
public Boolean execute(CommandContext commandContext) {
//表达式为空时,直接返回true
if (()) {
return ;
}
//复制一份
Map<String, Object> variables = new HashMap<>();
Expression expression = ().createExpression();
//流程实例id不为空
if (()) {
RuntimeService runtimeService = ();
ExecutionEntity processExecutionEntity = (ExecutionEntity) ().processInstanceId().includeProcessVariables().singleResult();
if (null != processExecutionEntity) {
//流程实例参数
Map<String, Object> processVariables = ();
if (null != processVariables) {
();
variables = processVariables;
}
}
}
ExecutionEntity executionEntity = new ExecutionEntityImpl();
(variables);
Object value = (executionEntity);
return value != null && "true".equals(());
}
}
mapper
ActRuVariableMapper
package ;
import ;
import ;
public interface ActRuVariableMapper extends MyMapper<ActRuVariable> {
/**
* 删除运行变量(异常)
*/
int deleteRuVariableException();
/**
* 删除历史变量(异常)
*/
int deleteHiVariableException();
}
mapperXML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/">
<mapper namespace="">
<resultMap type="">
<!--
WARNING - @
-->
<id column="ID_" jdbcType="VARCHAR" property="id"/>
<result column="REV_" jdbcType="INTEGER" property="rev"/>
<result column="TYPE_" jdbcType="VARCHAR" property="type"/>
<result column="NAME_" jdbcType="VARCHAR" property="name"/>
<result column="EXECUTION_ID_" jdbcType="VARCHAR" property="executionId"/>
<result column="PROC_INST_ID_" jdbcType="VARCHAR" property="procInstId"/>
<result column="TASK_ID_" jdbcType="VARCHAR" property="taskId"/>
<result column="SCOPE_ID_" jdbcType="VARCHAR" property="scopeId"/>
<result column="SUB_SCOPE_ID_" jdbcType="VARCHAR" property="subScopeId"/>
<result column="SCOPE_TYPE_" jdbcType="VARCHAR" property="scopeType"/>
<result column="BYTEARRAY_ID_" jdbcType="VARCHAR" property="bytearrayId"/>
<result column="DOUBLE_" jdbcType="DOUBLE" property="double_"/>
<result column="LONG_" jdbcType="BIGINT" property="long_"/>
<result column="TEXT_" jdbcType="VARCHAR" property="text_"/>
<result column="TEXT2_" jdbcType="VARCHAR" property="text2_"/>
</resultMap>
<delete >
delete from ACT_RU_VARIABLE where EXECUTION_ID_ is null
</delete>
<delete >
delete from act_hi_varinst where EXECUTION_ID_ is null
</delete>
</mapper>
model
ActRuVariable
package ;
import ;
import ;
import ;
import ;
import ;
/**
* 流程运行变量
*/
@Table(name = "act_ru_variable")
public class ActRuVariable implements Serializable {
@Id
@Column(name = "ID_")
private String id;
@Column(name = "REV_")
private BigDecimal rev;
@Column(name = "TYPE_")
private String type;
@Column(name = "NAME_")
private String name;
@Column(name = "EXECUTION_ID_")
private String executionId;
@Column(name = "PROC_INST_ID_")
private String procInstId;
@Column(name = "TASK_ID_")
private String taskId;
@Column(name = "SCOPE_ID_")
private String scopeId;
@Column(name = "SUB_SCOPE_ID_")
private String subScopeId;
@Column(name = "SCOPE_TYPE_")
private String scopeType;
@Column(name = "BYTEARRAY_ID_")
private String bytearrayId;
@Column(name = "DOUBLE_")
private Double double_;
@Column(name = "LONG_")
private Long long_;
@Column(name = "TEXT_")
private String text_;
@Column(name = "TEXT2_")
private String text2_;
/**
* @return ID_
*/
public String getId() {
return id;
}
/**
* @param id
*/
public void setId(String id) {
= id;
}
/**
* @return REV_
*/
public BigDecimal getRev() {
return rev;
}
/**
* @param rev
*/
public void setRev(BigDecimal rev) {
= rev;
}
/**
* @return TYPE_
*/
public String getType() {
return type;
}
/**
* @param type
*/
public void setType(String type) {
= type;
}
/**
* @return NAME_
*/
public String getName() {
return name;
}
/**
* @param name
*/
public void setName(String name) {
= name;
}
/**
* @return EXECUTION_ID_
*/
public String getExecutionId() {
return executionId;
}
/**
* @param executionId
*/
public void setExecutionId(String executionId) {
= executionId;
}
/**
* @return PROC_INST_ID_
*/
public String getProcInstId() {
return procInstId;
}
/**
* @param procInstId
*/
public void setProcInstId(String procInstId) {
= procInstId;
}
/**
* @return TASK_ID_
*/
public String getTaskId() {
return taskId;
}
/**
* @param taskId
*/
public void setTaskId(String taskId) {
= taskId;
}
/**
* @return SCOPE_ID_
*/
public String getScopeId() {
return scopeId;
}
/**
* @param scopeId
*/
public void setScopeId(String scopeId) {
= scopeId;
}
/**
* @return SUB_SCOPE_ID_
*/
public String getSubScopeId() {
return subScopeId;
}
/**
* @param subScopeId
*/
public void setSubScopeId(String subScopeId) {
= subScopeId;
}
/**
* @return SCOPE_TYPE_
*/
public String getScopeType() {
return scopeType;
}
/**
* @param scopeType
*/
public void setScopeType(String scopeType) {
= scopeType;
}
/**
* @return BYTEARRAY_ID_
*/
public String getBytearrayId() {
return bytearrayId;
}
/**
* @param bytearrayId
*/
public void setBytearrayId(String bytearrayId) {
= bytearrayId;
}
/**
* @return DOUBLE_
*/
public Double getDouble_() {
return double_;
}
/**
* @param double_
*/
public void setDouble_(Double double_) {
this.double_ = double_;
}
/**
* @return LONG_
*/
public Long getLong_() {
return long_;
}
/**
* @param long_
*/
public void setLong_(Long long_) {
this.long_ = long_;
}
/**
* @return TEXT_
*/
public String getText_() {
return text_;
}
/**
* @param text_
*/
public void setText_(String text_) {
this.text_ = text_;
}
/**
* @return TEXT2_
*/
public String getText2_() {
return text2_;
}
/**
* @param text2_
*/
public void setText2_(String text2_) {
this.text2_ = text2_;
}
}
Tasklist
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@Table(name = "v_tasklist")
public class Tasklist implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "TASK_ID")
private String taskId;
@Column(name = "PROC_INST_ID")
private String procInstId;
@Column(name = "ACT_ID")
private String actId;
@Column(name = "ACT_NAME")
private String actName;
@Column(name = "ASSIGNEE")
private String assignee;
@Column(name = "DELEGATION_ID")
private String delegationId;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "CREATE_TIME")
private Date createTime;
@Column(name = "DUE_DATE")
private Date dueDate;
@Column(name = "CANDIDATE")
private String candidate;
@Column(name = "PROC_ID")
private String procId;
@Column(name = "CODE")
private String code;
@Column(name = "SUSPENSION_STATE")
private Integer suspensionState;
@Transient
private Integer taskCount;
@Transient
private Set<String> authProjects;
@Transient
private Set<String> noAuthProjects;
@Transient
private List<Object> businessList;
public Set<String> getAuthProjects() {
return ;
}
public void setAuthProjects(Set<String> authProjects) {
= authProjects;
}
public Set<String> getNoAuthProjects() {
return ;
}
public void setNoAuthProjects(Set<String> noAuthProjects) {
= noAuthProjects;
}
public Integer getTaskCount() {
return ;
}
public void setTaskCount(Integer taskCount) {
= taskCount;
}
public String getCode() {
return ;
}
public void setCode(String code) {
= code;
}
public String getTaskId() {
return ;
}
public void setTaskId(String taskId) {
= taskId;
}
public String getProcInstId() {
return ;
}
public void setProcInstId(String procInstId) {
= procInstId;
}
public String getActId() {
return ;
}
public void setActId(String actId) {
= actId;
}
public String getActName() {
return ;
}
public void setActName(String actName) {
= actName;
}
public String getAssignee() {
return ;
}
public void setAssignee(String assignee) {
= assignee;
}
public String getDelegationId() {
return ;
}
public void setDelegationId(String delegationId) {
= delegationId;
}
public String getDescription() {
return ;
}
public void setDescription(String description) {
= description;
}
public Date getCreateTime() {
return ;
}
public void setCreateTime(Date createTime) {
= createTime;
}
public Date getDueDate() {
return ;
}
public void setDueDate(Date dueDate) {
= dueDate;
}
public String getCandidate() {
return ;
}
public void setCandidate(String candidate) {
= candidate;
}
public String getProcId() {
return ;
}
public void setProcId(String procId) {
= procId;
}
public Integer getSuspensionState() {
return ;
}
public void setSuspensionState(Integer suspensionState) {
= suspensionState;
}
public List<Object> getBusinessList() {
return ;
}
public void setBusinessList(List<Object> businessList) {
= businessList;
}
}
VUserGroup
package ;
import ;
import ;
import ;
@Table(name = "v_user_group")
public class VUserGroup implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "id")
private String id;
@Column(name = "user_name")
private String userName;
@Column(name = "group_id")
private String groupId;
@Column(name = "group_name")
private String groupName;
private String type;
public VUserGroup() {
}
public String getId() {
return ;
}
public void setId(String id) {
= id;
}
public String getUserName() {
return ;
}
public void setUserName(String userName) {
= userName;
}
public String getGroupId() {
return ;
}
public void setGroupId(String groupId) {
= groupId;
}
public String getGroupName() {
return ;
}
public void setGroupName(String groupName) {
= groupName;
}
public String getType() {
return ;
}
public void setType(String type) {
= type;
}
}
vo
CandidateGroupVo
package ;
import ;
@SuppressWarnings("serial")
public class CandidateGroupVo implements Serializable {
private String groupId; //候选组
private String groupName; //候选组
public CandidateGroupVo() {
super();
}
public CandidateGroupVo(String groupId, String groupName) {
super();
= groupId;
= groupName;
}
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
= groupId;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
= groupName;
}
}
CandidateUserVo
package ;
import ;
@SuppressWarnings("serial")
public class CandidateUserVo implements Serializable {
private String userId; //候选用户
private String userName; //候选用户
public CandidateUserVo() {
super();
}
public CandidateUserVo(String userId, String userName) {
super();
= userId;
= userName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
= userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
= userName;
}
}
UserTaskVo
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class UserTaskVo extends Tasklist {
/**
* 拼接任务数量(0)
*/
@Transient
private String actConcatName;
@Transient
private Long menuId;
@Transient
private List<String> candidateUserIdList; //参与用户id
@Transient
private List<CandidateUserVo> candidateUsers; //候选用户
@Transient
private List<CandidateGroupVo> candidateGroups; //候选组
public UserTaskVo() {
super();
}
public UserTaskVo(Tasklist tasklist) {
super();
(tasklist, this);
= () + "(" + () + ")";
}
public UserTaskVo(String taskId, String actId, String actName, String procId, List<CandidateUserVo> candidateUsers, List<CandidateGroupVo> candidateGroups) {
this(taskId, actId, actName, procId, null, candidateUsers, candidateGroups);
}
public UserTaskVo(String taskId, String actId, String actName, String procId, String code, List<CandidateUserVo> candidateUsers, List<CandidateGroupVo> candidateGroups) {
this(taskId, actId, actName, procId, code, null, candidateUsers, candidateGroups);
}
public UserTaskVo(String taskId, String actId, String actName, String procId, String code, List<String> candidateUserIdList, List<CandidateUserVo> candidateUsers, List<CandidateGroupVo> candidateGroups) {
super();
(taskId);
(actId);
(actName);
(procId);
(code);
//去重
if (null != candidateUserIdList && () > 0) {
candidateUserIdList = ().distinct().collect(());
}
if (null != candidateUsers && () > 0) {
candidateUsers = ().collect(((() -> new TreeSet<>((CandidateUserVo::getUserId))), ArrayList::new));
}
if (null != candidateGroups && () > 0) {
candidateGroups = ().collect(((() -> new TreeSet<>((CandidateGroupVo::getGroupId))), ArrayList::new));
}
= candidateUserIdList;
= candidateUsers;
= candidateGroups;
}
public String getActConcatName() {
return actConcatName;
}
public void setActConcatName(String actConcatName) {
= actConcatName;
}
public Long getMenuId() {
return menuId;
}
public void setMenuId(Long menuId) {
= menuId;
}
public List<String> getCandidateUserIdList() {
return candidateUserIdList;
}
public void setCandidateUserIdList(List<String> candidateUserIdList) {
//去重
if (null != candidateUserIdList && () > 0) {
candidateUserIdList = ().distinct().collect(());
}
= candidateUserIdList;
}
public List<CandidateUserVo> getCandidateUsers() {
return candidateUsers;
}
public void setCandidateUsers(List<CandidateUserVo> candidateUsers) {
//去重
if (null != candidateUsers && () > 0) {
candidateUsers = ().collect(((() -> new TreeSet<>((CandidateUserVo::getUserId))), ArrayList::new));
}
= candidateUsers;
}
public List<CandidateGroupVo> getCandidateGroups() {
return candidateGroups;
}
public void setCandidateGroups(List<CandidateGroupVo> candidateGroups) {
//去重
if (null != candidateGroups && () > 0) {
candidateGroups = ().collect(((() -> new TreeSet<>((CandidateGroupVo::getGroupId))), ArrayList::new));
}
= candidateGroups;
}
}
utils
CastUtils
package ;
import ;
import ;
/**
* 转换工具类
*/
public class CastUtils {
/**
* 将obj转换为字符串列表
* @param obj obj
* @return 字符串列表
*/
public static List<String> castObjToStringList(Object obj) {
if (null == obj) {
return null;
}
List<String> result = new ArrayList<>();
if (obj instanceof List<?>) {
for (Object o : (List<?>) obj) {
(());
}
} else if (obj instanceof String) {
(());
}
return result;
}
/**
* obj转list
* @param obj obj
* @param clazz clazz
* @param <T> T
* @return T
*/
public static <T> List<T> castList(Object obj, Class<T> clazz) {
if (null == obj) {
return null;
}
if (obj instanceof List<?>) {
List<T> result = new ArrayList<>();
for (Object o : (List<?>) obj) {
((o));
}
return result;
}
return null;
}
}
VariableUtils
package ;
import ;
import ;
import ;
import ;
import ;
/**
* 变量工具类
*/
public class VariableUtils {
/**
* 格式化变量名,去除${}符号
* @param variableName 变量名
* @return 变量名
*/
public static String formatVariableName(String variableName) {
variableName = ("[${}]", "").trim();
return variableName;
}
/**
* 获取格式化后的变量值
* @param variableType 变量类型
* @param variableValue 变量值
* @return 格式化后的变量值
*/
public static Object getFormatVariableValue(String variableType, String variableValue) {
if ((variableType)) {
throw new RuntimeException("变量类型为空!");
}
if (!"".equals(variableType) && (variableValue)) {
throw new RuntimeException("变量值为空!");
}
Object value;
try {
switch (variableType) {
case "": //字符串
value = variableValue;
break;
case "": //整数
value = new Integer(variableValue);
break;
case "": //金额
value = new BigDecimal(variableValue);
break;
case "": //列表
String[] split = (",");
value = new ArrayList<>((split));
break;
default:
// 不是以上的类型!但愿可以通过反射注入吧!
Class<?> aClass = (variableType);
// Constructor<?> constructor = ();
// value = (variableValue);
value = (variableValue, aClass);
break;
}
} catch (Exception e) {
();
throw new RuntimeException((), e);
}
return value;
}
}
Test
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import .junit4.SpringJUnit4ClassRunner;
import ;
import ;
import ;
@RunWith()
@SpringBootTest
public class TestFlowable {
@Autowired
private NewProcessService newProcessService;
@Test
public void getElValueTest() {
String exp = "${abc == 1}";
Map<String, Object> variableMap = new HashMap<>();
("abc", "1");
boolean flag = (exp, variableMap);
(flag);
}
@Test
public void getElValueTest2() {
String exp = "${halt == 'B'}";
String taskId = "00b55b40-5904-11ed-acc1-005056b2814b";
Map<String, Object> variableMap = new HashMap<>();
("halt", "B");
List<UserTaskVo> nextUserTasks = (taskId, variableMap);
(());
}
}