海珠做网站要多少钱,百度收录网站链接入口,销售技巧,网站上如何放入地图流程图配置 会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition;
collection 会签人员列表#xff1b;element variable 当前会签变量名称#xff0c;类似循环中的 item;completion condition: 完成条件。 ${taskExecutionServiceIm…流程图配置 会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition;
collection 会签人员列表element variable 当前会签变量名称类似循环中的 item;completion condition: 完成条件。 ${taskExecutionServiceImpl.findProcessUsers(‘applicant’)} : spring 代理下的 activiti 项目可使用 bean 下配置方法。 ${countersignComponent.isComplete(taskId)} 会签实现方法省略监听类。括号中的字符加单引号就是传递字符串不加引号就是取当前任务中的变量。 会签配置图中的 user 变量需在此处使用。
实现代码
会签实现代码
Component
RequiredArgsConstructor
public class CountersignComponent {private final TaskService taskService;public boolean isComplete(String taskId) {// 1、参数验证if(StringUtils.isAnyEmpty(taskId)){return false;}// 2、获取当前任务节点参数及会签判断后重新设置// 获取流程参数 var会签人员完成自己的审批任务时会添加流程参数 var2 为拒绝1 为同意String variable BeanUtil.nullOrUndefinedToEmptyStr(taskService.getVariableLocal(taskId, ActivitiCommonConstant.VAR.getValue()));// 当值为 2 证明已有人拒绝返回 trueif(DefaultConstant.TWO_CODE.getKey().equals(variable)){//会签结束设置参数 execType 为 4 进行下一步操作。taskService.setVariableLocal(taskId, ActivitiCommonConstant.EXEC_TYPE.getValue(), DefaultConstant.FIVE_CODE.getKey());return true;}// 当值为 1判断会签是否结束Integer complete (Integer) taskService.getVariable(taskId, ActivitiCommonConstant.NR_OF_COMPLETED_INSTANCES.getValue());if(complete 0){// 会签未结束后续处理}return false;}}用户动态获取代码 Overridepublic ListString findProcessUsers(String code) {// 1、参数验证if(StringUtils.isEmpty(code)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}// 2、查询对应流程人员具体取人逻辑根据个人业务变更ProcessParameterQuery processParameterQuery new ProcessParameterQuery();processParameterQuery.setCode(code);GostopResponseVoProcessParameterVo processParameter dev.findProcessParameter(processParameterQuery);ProcessParameterVo processParameterVo processParameter.getResult();if(Objects.isNull(processParameterVo)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}ListHospitalUserVo userInfos processParameterVo.getUserInfos();if(CollectionUtils.isEmpty(userInfos)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}return userInfos.stream().map(HospitalUserVo::getId).distinct().collect(Collectors.toList());}开启流程 Overridepublic String startProcess(CommonTaskParamVo param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessKey())){throw new BusinessException(ActivitiConstant.EXEC_ERROR_PARAMS_NULL);}// 2、启动流程定义返回流程实例ProcessInstance pi;try {CustomParamVo customParamVo param.getCustomParamVo();String paramJson JSONObject.toJSONString(customParamVo);Map paramMap JSONObject.parseObject(paramJson, Map.class);pi runtimeService.startProcessInstanceByKey(param.getProcessKey(), paramMap);} catch (Exception e) {log.error(e.getMessage());throw new BusinessException(ActivitiConstant.PROCESS_NOT_DEPLOYED);}return pi.getId();}任务执行 Overridepublic String complete(CommonTaskParamVo param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessId(), param.getUserId())){throw new BusinessException(ActivitiConstant.EXEC_ERROR_PARAMS_NULL);}// 2、查询当前人任务信息String userId param.getUserId();//与正在执行的任务管理相关的ServiceTask task taskService.createTaskQuery()//指定个人任务查询指定办理人.taskCandidateUser(userId)//使用流程实例ID查询.processInstanceId(param.getProcessId())//排序.orderByTaskCreateTime().asc()//返回列表.singleResult();if (Objects.isNull(task)) {throw new BusinessException(ActivitiConstant.TASK_NULL_ERROR);}task.setDescription(param.getDescription());task.setAssignee(userId);taskService.saveTask(task);// 2.1 设置执行人信息HospitalUserCacheVo userInfo activitComponent.getUserInfo();CustomParamVo customParamVo param.getCustomParamVo();customParamVo.setExecUserId(userInfo.getId());customParamVo.setExecUserName(userInfo.getDepartmentName());customParamVo.setExecTime(DateUtil.date2String(LocalDateTime.now()));customParamVo.setTaskId(task.getId());// 2.2 将自定义参数转为 mapString paramJson JSONObject.toJSONString(customParamVo);Map paramMap JSONObject.parseObject(paramJson, Map.class);taskService.setVariablesLocal(task.getId(), paramMap);// 3、执行当前节点信息taskService.complete(task.getId());return task.getId();}参数接收对象
Data
public class CommonTaskParamVo {/*** 用户 ID*/private String userId;/**** 流程图定义 KEY*/private String processKey;/*** 流程 ID*/private String processId;/*** 描述*/private String description;/*** 自定义参数类*/private CustomParamVo customParamVo;}
Data
public class CustomParamVo {/*** 操作类型 1 同意 2 回退 3 驳回 4 提交 5 删除*/private String execType;/*** 节点类型 1 申请节点 2 审批节点*/private String nodeType;/*** 预留参数*/private String var;/*** 执行人 ID*/private String execUserId;/*** 执行人名称*/private String execUserName;/*** 执行时间*/private String execTime;/*** 任务 ID*/private String taskId;}使用上述参数类及流程配置后查询任务流水就变得非常简单。 流水查询
Overridepublic ListFlowDataVo flowQueryProcess(FlowQuery param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessId())){return new ArrayList();}// 2、查询任务执行节点信息HistoricTaskInstanceQuery historicTaskInstanceQuery historyService.createHistoricTaskInstanceQuery();ListHistoricTaskInstance taskInfoArr historicTaskInstanceQuery.processInstanceId(param.getProcessId()).orderByTaskCreateTime().asc().list();if(CollectionUtils.isEmpty(taskInfoArr)){return new ArrayList();}// 3、查询任务执行参数信息HistoricVariableInstanceQuery historicVariableInstanceQuery historyService.createHistoricVariableInstanceQuery();ListHistoricVariableInstance variableInstanceList historicVariableInstanceQuery.processInstanceId(param.getProcessId()).list();// 4、构建返回信息对象ListFlowDataVo resultArr taskInfoArr.stream().map(taskInfo - {FlowDataVo flowDataVo new FlowDataVo();flowDataVo.setNodeName(taskInfo.getName());flowDataVo.setDescription(taskInfo.getDescription());ListHistoricVariableInstance variableArr variableInstanceList.stream().filter(e - taskInfo.getId().equals(e.getTaskId())).collect(Collectors.toList());if (CollectionUtils.isEmpty(variableArr)) {flowDataVo.setStatus(DefaultConstant.ONE_CODE.getKey());return flowDataVo;}JSONObject flowDataJson (JSONObject) JSONObject.toJSON(flowDataVo);variableArr.stream().forEach(var - {String variableName var.getVariableName();String value BeanUtil.nullOrUndefinedToEmptyStr(var.getValue());flowDataJson.put(variableName, value);});String flowDataJsonString flowDataJson.toJSONString();FlowDataVo afterFlowData JSONObject.parseObject(flowDataJsonString, FlowDataVo.class);afterFlowData.setStatus(DefaultConstant.TWO_CODE.getKey());return afterFlowData;}).collect(Collectors.toList());return resultArr;}流水查询使用 bean 对象
Data
public class FlowQuery {/*** 流程 ID*/private String processId;/*** 用户 ID*/private String userId;
}
Data
public class FlowDataVo {/*** 操作类型 1 同意 2 回退 3 驳回 4 提交 5 删除*/private String execType;/*** 节点类型 1 申请节点 2 审批节点*/private String nodeType;/*** 预留参数*/private String var;/*** 节点名称*/private String nodeName;/*** 执行状态 1 未执行 2 已执行*/private String status;/*** 执行人 ID*/private String execUserId;/*** 执行人名称*/private String execUserName;/*** 执行时间*/private String execTime;/**** 描述*/private String description;}