当前位置: 首页 > news >正文

网站集群怎么做做淘宝客网站制作教程

网站集群怎么做,做淘宝客网站制作教程,上海自助建站,百度seo最成功的优化1、下图为项目结构 2、最外层 pom引入依赖 properties!--camunda 标明版本#xff0c;注意要个自己的Spring 版本匹配#xff0c;匹配关系自行查询官网--camunda.version7.18.0/camunda.version /properties 3、common模块引入依赖 …1、下图为项目结构 2、最外层 pom引入依赖 properties!--camunda 标明版本注意要个自己的Spring 版本匹配匹配关系自行查询官网--camunda.version7.18.0/camunda.version /properties 3、common模块引入依赖 !--camunda -- dependencygroupIdorg.camunda.bpm.springboot/groupIdartifactIdcamunda-bpm-spring-boot-starter/artifactIdversion${camunda.version}/version /dependency dependencygroupIdorg.camunda.bpm.springboot/groupIdartifactIdcamunda-bpm-spring-boot-starter-rest/artifactIdversion${camunda.version}/version /dependency dependencygroupIdorg.camunda.bpm.springboot/groupIdartifactIdcamunda-bpm-spring-boot-starter-webapp/artifactIdversion${camunda.version}/version /dependency!-- Camunda BPMN模型处理 -- dependencygroupIdorg.camunda.bpm.model/groupIdartifactIdcamunda-bpmn-model/artifactIdversion${camunda.version}/version /dependency dependencygroupIdorg.camunda.bpm/groupIdartifactIdcamunda-engine/artifactIdversion${camunda.version}/version /dependency 4、yml配置 # camunda配置 camunda:bpm:#登录用户信息admin-user:#用户名id: demo#密码password: demofilter:create: All tasks#指定数据类型database:type: mysqlschema-update: false#禁止自动部署resources 下面的bpmnauto-deployment-enabled: false#禁止index 跳转到Camunda 自带的管理页面默认为true#webapp:#index-redirect-enabled: true4、若依要跳过鉴权 security配置:跳过鉴权.antMatchers(/camunda/**).permitAll()   5、启动类加注解 ,如下 EnableProcessApplication 激活一系列Camunda相关的自动配置,每次启动时自动读取resource下的npmn文件 5、npmn存放的位置 7、npmn文件xml和图片,其中办结节点为调用监听 ?xml version1.0 encodingUTF-8? bpmn:definitions xmlns:bpmnhttp://www.omg.org/spec/BPMN/20100524/MODEL xmlns:bpmndihttp://www.omg.org/spec/BPMN/20100524/DI xmlns:dchttp://www.omg.org/spec/DD/20100524/DC xmlns:camundahttp://camunda.org/schema/1.0/bpmn xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dihttp://www.omg.org/spec/DD/20100524/DI xmlns:modelerhttp://camunda.org/schema/modeler/1.0 idDefinitions_1ch5lf5 targetNamespacehttp://bpmn.io/schema/bpmn exporterCamunda Modeler exporterVersion5.24.0 modeler:executionPlatformCamunda Platform modeler:executionPlatformVersion7.21.0bpmn:process idtestDemo name测试任务 isExecutabletruebpmn:startEvent idStartEvent_1 name发起人bpmn:extensionElementscamunda:formDatacamunda:formField idproposer label申请人 typestring /camunda:formField idlineLeader label直线领导 typestring /camunda:formField idbusinessId label业务id typestring /camunda:formField iddeptLeader label部门领导 typestring /camunda:formField idflowIdea label签字意见 typestring //camunda:formData/bpmn:extensionElementsbpmn:outgoingFlow_0oxuvns/bpmn:outgoing/bpmn:startEventbpmn:userTask idActivity_0ku6n8k name直线领导 camunda:assignee${lineLeader}bpmn:extensionElementscamunda:formDatacamunda:formField idapproved label是否批准 typeboolean defaultValuenull /camunda:formField idflowIdea label签字意见 typestring //camunda:formDatacamunda:executionListener expression${approved} eventend //bpmn:extensionElementsbpmn:incomingFlow_0oxuvns/bpmn:incomingbpmn:outgoingFlow_02zwlzw/bpmn:outgoing/bpmn:userTaskbpmn:sequenceFlow idFlow_0oxuvns sourceRefStartEvent_1 targetRefActivity_0ku6n8k /bpmn:serviceTask idActivity_12qqf3m name办结 camunda:classcom.yuepu.oa.comunda.controller.serviceTask.OaTestDemoHandlerServicebpmn:extensionElements /bpmn:incomingFlow_11pxoey/bpmn:incomingbpmn:incomingFlow_0l7p130/bpmn:incomingbpmn:outgoingFlow_09is9cj/bpmn:outgoing/bpmn:serviceTaskbpmn:endEvent idEvent_1g0bd0pbpmn:incomingFlow_09is9cj/bpmn:incoming/bpmn:endEventbpmn:sequenceFlow idFlow_09is9cj sourceRefActivity_12qqf3m targetRefEvent_1g0bd0p /bpmn:exclusiveGateway idGateway_1xg1je9bpmn:incomingFlow_02zwlzw/bpmn:incomingbpmn:outgoingFlow_0x0c9jk/bpmn:outgoingbpmn:outgoingFlow_0l7p130/bpmn:outgoing/bpmn:exclusiveGatewaybpmn:sequenceFlow idFlow_02zwlzw sourceRefActivity_0ku6n8k targetRefGateway_1xg1je9 /bpmn:sequenceFlow idFlow_0x0c9jk name同意 sourceRefGateway_1xg1je9 targetRefActivity_0eg4sr2bpmn:conditionExpression xsi:typebpmn:tFormalExpression${approved}/bpmn:conditionExpression/bpmn:sequenceFlowbpmn:sequenceFlow idFlow_11pxoey sourceRefActivity_0eg4sr2 targetRefActivity_12qqf3m /bpmn:userTask idActivity_0eg4sr2 name部门领导 camunda:assignee${deptLeader}bpmn:extensionElementscamunda:formDatacamunda:formField idapproved label是否批准 typeboolean defaultValuenull /camunda:formField idflowIdea label签字意见 typestring defaultValuenull //camunda:formDatacamunda:executionListener expression${approvednull} eventstart /camunda:executionListener expression${flowIdeanull} eventstart //bpmn:extensionElementsbpmn:incomingFlow_0x0c9jk/bpmn:incomingbpmn:outgoingFlow_11pxoey/bpmn:outgoing/bpmn:userTaskbpmn:sequenceFlow idFlow_0l7p130 name拒绝 sourceRefGateway_1xg1je9 targetRefActivity_12qqf3mbpmn:conditionExpression xsi:typebpmn:tFormalExpression${!approved}/bpmn:conditionExpression/bpmn:sequenceFlow/bpmn:processbpmndi:BPMNDiagram idBPMNDiagram_1bpmndi:BPMNPlane idBPMNPlane_1 bpmnElementtestDemobpmndi:BPMNShape id_BPMNShape_StartEvent_2 bpmnElementStartEvent_1dc:Bounds x152 y102 width36 height36 /bpmndi:BPMNLabeldc:Bounds x154 y145 width33 height14 //bpmndi:BPMNLabel/bpmndi:BPMNShapebpmndi:BPMNShape idActivity_0y4bxvq_di bpmnElementActivity_0ku6n8kdc:Bounds x350 y80 width100 height80 /bpmndi:BPMNLabel //bpmndi:BPMNShapebpmndi:BPMNShape idActivity_059wrju_di bpmnElementActivity_12qqf3mdc:Bounds x850 y80 width100 height80 /bpmndi:BPMNLabel //bpmndi:BPMNShapebpmndi:BPMNShape idEvent_1g0bd0p_di bpmnElementEvent_1g0bd0pdc:Bounds x1032 y102 width36 height36 //bpmndi:BPMNShapebpmndi:BPMNShape idGateway_1xg1je9_di bpmnElementGateway_1xg1je9 isMarkerVisibletruedc:Bounds x505 y95 width50 height50 //bpmndi:BPMNShapebpmndi:BPMNShape idActivity_07ucok0_di bpmnElementActivity_0eg4sr2dc:Bounds x640 y80 width100 height80 /bpmndi:BPMNLabel //bpmndi:BPMNShapebpmndi:BPMNEdge idFlow_0oxuvns_di bpmnElementFlow_0oxuvnsdi:waypoint x188 y120 /di:waypoint x350 y120 /bpmndi:BPMNLabeldc:Bounds x297 y102 width33 height14 //bpmndi:BPMNLabel/bpmndi:BPMNEdgebpmndi:BPMNEdge idFlow_09is9cj_di bpmnElementFlow_09is9cjdi:waypoint x950 y120 /di:waypoint x1032 y120 //bpmndi:BPMNEdgebpmndi:BPMNEdge idFlow_02zwlzw_di bpmnElementFlow_02zwlzwdi:waypoint x450 y120 /di:waypoint x505 y120 //bpmndi:BPMNEdgebpmndi:BPMNEdge idFlow_0x0c9jk_di bpmnElementFlow_0x0c9jkdi:waypoint x555 y120 /di:waypoint x640 y120 /bpmndi:BPMNLabeldc:Bounds x586 y102 width23 height14 //bpmndi:BPMNLabel/bpmndi:BPMNEdgebpmndi:BPMNEdge idFlow_11pxoey_di bpmnElementFlow_11pxoeydi:waypoint x740 y120 /di:waypoint x850 y120 //bpmndi:BPMNEdgebpmndi:BPMNEdge idFlow_0l7p130_di bpmnElementFlow_0l7p130di:waypoint x530 y145 /di:waypoint x530 y390 /di:waypoint x900 y390 /di:waypoint x900 y160 /bpmndi:BPMNLabeldc:Bounds x704 y372 width22 height14 //bpmndi:BPMNLabel/bpmndi:BPMNEdge/bpmndi:BPMNPlane/bpmndi:BPMNDiagram /bpmn:definitions 8、流程定义相关接口 controller层package com.yuepu.oa.comunda.controller;import com.yuepu.common.core.domain.AjaxResult; import com.yuepu.common.core.domain.entity.SysUser; import com.yuepu.common.utils.SecurityUtils; import com.yuepu.oa.comunda.entity.DeployRequestParam; import com.yuepu.oa.comunda.service.ProcessDefinitionService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*;/*** 流程定义相关接口* author lonewalker*/ RequestMapping(/process/definition) RequiredArgsConstructor RestController public class ProcessDefinitionController {private final ProcessDefinitionService processDefinitionService;/*** 发布流程定义* param requestParam 请求参数* return 提示信息*/PostMapping(/deploy)public AjaxResult deployProcessDefinition(RequestBody DeployRequestParam requestParam){SysUser userInfo SecurityUtils.getLoginUser().getUser();return AjaxResult.success(processDefinitionService.deploy(userInfo,requestParam));}/*** 删除部署* param deploymentId 部署id* return 提示信息*/DeleteMapping(/deleteDeployment)public String deleteDeployment(RequestParam(deploymentId)String deploymentId){return processDefinitionService.deleteDeployment(deploymentId);}/*** 挂起流程定义* param processDefinitionId 流程定义id* return 提示信息*/PostMapping(/suspendById)public String suspendProcessDefinitionById(RequestParam(processDefinitionId)String processDefinitionId){return processDefinitionService.suspendProcessDefinitionById(processDefinitionId);}/*** 根据任务流程id获取模型* */PostMapping(/getBpmnModelInstance)public AjaxResult getBpmnModelInstance(RequestParam(processDefinitionId)String processDefinitionId){return AjaxResult.success(processDefinitionService.getBpmnModelInstance(processDefinitionId));}/*** 根据任务的key获取当前任务相关实例的最高版本号* */PostMapping(/getHighestVersionByKey)public AjaxResult getLastVersionByKey(RequestParam(taskKey)String taskKey){return AjaxResult.success(processDefinitionService.getHighestVersionByKey(taskKey));}}servicer层package com.yuepu.oa.comunda.service;import com.yuepu.common.core.domain.entity.SysUser; import com.yuepu.oa.comunda.entity.DeployRequestParam;import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set;/*** author lonewalker*/ public interface ProcessDefinitionService {/*** 发布流程定义* param user 用户信息* param requestParam 请求参数* return 提示信息*/String deploy(SysUser user, DeployRequestParam requestParam);/*** 删除部署* param deploymentId 部署id* return 提示信息*/String deleteDeployment(String deploymentId);/*** 获取已部署的流程模型* param processDefinitionId 流程定义id* return 提示信息*/String getBpmnModelInstance(String processDefinitionId);/*** 挂起流程定义* param processDefinitionId 流程定义id* return 提示信息*/String suspendProcessDefinitionById(String processDefinitionId);/*** 根据任务的key获取当前任务相关实例的最高版本号* */int getHighestVersionByKey(String taskKey); }servicer层package com.yuepu.oa.comunda.service.impl;import cn.hutool.core.util.ObjectUtil; import com.yuepu.common.core.domain.entity.SysUser; import com.yuepu.common.utils.SecurityUtils; import com.yuepu.common.utils.StringUtils; import com.yuepu.oa.comunda.entity.DeployRequestParam; import com.yuepu.oa.comunda.service.ProcessDefinitionService; import com.yuepu.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.BpmPlatform; import org.camunda.bpm.engine.*; import org.camunda.bpm.engine.history.*; import org.camunda.bpm.engine.repository.Deployment; import org.camunda.bpm.engine.repository.ProcessDefinition; import org.camunda.bpm.engine.repository.ProcessDefinitionQuery; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.task.Task; import org.camunda.bpm.engine.variable.VariableMap; import org.camunda.bpm.engine.variable.Variables; import org.camunda.bpm.model.bpmn.Bpmn; import org.camunda.bpm.model.bpmn.BpmnModelInstance; import org.camunda.bpm.model.bpmn.instance.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.lang.Process; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors;/*** author lonewalker*/ Slf4j RequiredArgsConstructor Service(processDefinitionService) public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {ResourceRepositoryService repositoryService;Resourceprivate TaskService taskService;Resourceprivate RuntimeService runtimeService;ResourceISysUserService systemUserService;Autowiredprivate ProcessEngine processEngine;Overridepublic String deploy(SysUser user, DeployRequestParam requestParam) {Deployment deploy repositoryService.createDeployment().addClasspathResource(requestParam.getResourcePath()).name(requestParam.getBpmnName()).deploy();//AssertUtil.checkService(ObjectUtil.isNull(deploy), ServiceExceptionEnum.SERVE_EXCEPTION.getDesc());return deploy.getId();}Overridepublic String deleteDeployment(String deploymentId) {//这里可以做级联删除默认为false,级联会删除流程实例和job//repositoryService.deleteDeployment(deploymentId,true);repositoryService.deleteDeployment(deploymentId);return 删除成功;}Overridepublic String getBpmnModelInstance(String processDefinitionId) {BpmnModelInstance bpmnModelInstance repositoryService.getBpmnModelInstance(processDefinitionId);if (ObjectUtil.isNotNull(bpmnModelInstance)){CollectionUserTask userTasks bpmnModelInstance.getModelElementsByType(UserTask.class);Definitions definitions bpmnModelInstance.getDefinitions();log.info(啥也不是);}return null;}Overridepublic String suspendProcessDefinitionById(String processDefinitionId) {repositoryService.suspendProcessDefinitionById(processDefinitionId);return 挂起成功;}OverrideTransactional(rollbackFor RuntimeException.class)public int getHighestVersionByKey(String taskKey) {// 从流程引擎中获取仓库服务(RepositoryService)。RepositoryService repositoryService processEngine.getRepositoryService();// 创建流程定义查询按任务key进行过滤。ProcessDefinitionQuery query repositoryService.createProcessDefinitionQuery().processDefinitionKey(taskKey);// 执行查询并获取所有流程定义。ListProcessDefinition processDefinitions query.list();// 如果没有找到任何流程定义则返回-1表示无版本。if (processDefinitions.isEmpty()) {throw new RuntimeException(没有找到任何流程定义);}// 找到最高版本的流程定义。int highestVersion processDefinitions.stream().mapToInt(ProcessDefinition::getVersion).max().orElse(-1);// 输出最高版本号。System.out.println(最高版本号: highestVersion);return highestVersion;} } 9、流程实例相关接口 package com.yuepu.oa.comunda.controller;import com.yuepu.common.annotation.Log; import com.yuepu.common.core.domain.AjaxResult; import com.yuepu.common.enums.BusinessType; import com.yuepu.oa.comunda.service.ProcessInstanceService; import org.camunda.bpm.engine.*; import org.camunda.bpm.engine.repository.Deployment; import org.camunda.bpm.engine.repository.ProcessDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource; import java.util.List;/*** 流程实例相关接口** author lonewalker*/ RequestMapping(/process/instance/) RestController public class ProcessInstanceController {protected final Logger logger LoggerFactory.getLogger(this.getClass());Resourceprivate RepositoryService repositoryService;Resourceprivate TaskService taskService;AutowiredProcessInstanceService processInstanceService;/*** 查询平台标签列表-根据平台id* {code Auth} jln*/Log(title 删除流程, businessType BusinessType.SELECT)GetMapping(value /delByFlowId)public AjaxResult delByFlowId() {ListProcessDefinition processDefinitions repositoryService.createProcessDefinitionQuery().list();for (ProcessDefinition processDefinition : processDefinitions) {boolean cascade true; // 级联删除历史数据boolean skipCustomListeners false; // 不跳过自定义监听器boolean skipIoMappings false; // 不跳过IO映射repositoryService.deleteProcessDefinition(processDefinition.getId(), cascade, skipCustomListeners, skipIoMappings);}return AjaxResult.success();}Log(title 查询流程定义, businessType BusinessType.SELECT)GetMapping(value /processes/def)public AjaxResult findProcesses() {ListProcessDefinition listrepositoryService.createProcessDefinitionQuery().list();return AjaxResult.success(list);}Log(title 查询任务, businessType BusinessType.SELECT)GetMapping(value /task)public AjaxResult finTasks() {return AjaxResult.success(taskService.createTaskQuery().list());}PostMapping(value /deplopy)public String deplopy(RequestParam String name,String zwName,String type){Deployment deployment repositoryService.createDeployment().name(zwName).addClasspathResource(BPMN/name.type).deploy();return deployment.getId()_deployment.getName();}/*** 获取流程实例模型* return 提示信息*/PostMapping(/getCamundaModelById)public AjaxResult getCamundaModelById(RequestParam String processInstanceId){return AjaxResult.success(processInstanceService.getCamundaModelById(processInstanceId));}/*** 根据流程实例id获取流程节点信息,不包含申请人*/PostMapping(/getNodeAndOwnersByProcessInstanceId)public AjaxResult getNodeAndOwnersByProcessInstanceId(RequestParam String processInstanceId,String processDefinitionId){processInstanceService.getNodeAndOwnersByProcessInstanceId(processInstanceId,processDefinitionId);return AjaxResult.success();}}package com.yuepu.oa.comunda.service;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** author lonewalker*/ public interface ProcessInstanceService {/*** 重新激活任务实例* param businessKey 业务id, 格式:表名_id业务id* desiredVariableNames, 需要携带的变量名列表* return 提示信息*/String RestartProcessByKeyExample(SetString desiredVariableNames,String processInstanceId,String businessKey,String flowIdea);void approveOrRejectByBusinessKeyExample(String processInstanceId, String businessKey,Boolean approve,String flowIdea);String getNowNodeUserName(String processInstanceId);/*** 获取当前进行至节点* */String getNowCurrentName(String processInstanceId);/** 获取当前待处理人userId*/String getWaitCurrentName(String processInstanceId);Integer ifEndTaskById(String processInstanceId);HashMap getTaskDateBy(String processInstanceId);String getCamundaModelById(String processInstanceId);/*** 根据流程实例id获取流程节点信息,不包含申请人* */MapString, String getNodeAndOwnersByProcessInstanceId(String processInstanceId, String processDefinitionId);}package com.yuepu.oa.comunda.service.impl;import com.yuepu.common.core.domain.entity.SysUser; import com.yuepu.common.utils.SecurityUtils; import com.yuepu.common.utils.StringUtils; import com.yuepu.oa.comunda.service.ProcessInstanceService; import com.yuepu.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.engine.*; import org.camunda.bpm.engine.history.HistoricProcessInstance; import org.camunda.bpm.engine.history.HistoricTaskInstance; import org.camunda.bpm.engine.history.HistoricVariableInstance; import org.camunda.bpm.engine.history.HistoricVariableInstanceQuery; import org.camunda.bpm.engine.repository.ProcessDefinition; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.task.Task; import org.camunda.bpm.engine.variable.VariableMap; import org.camunda.bpm.engine.variable.Variables; import org.camunda.bpm.model.bpmn.Bpmn; import org.camunda.bpm.model.bpmn.BpmnModelInstance; import org.camunda.bpm.model.bpmn.instance.UserTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author lonewalker*/ Slf4j RequiredArgsConstructor Service(processInstanceService) public class ProcessInstanceServiceImpl implements ProcessInstanceService {Resourceprivate TaskService taskService;ResourceISysUserService systemUserService;OverrideTransactional(rollbackFor RuntimeException.class)public String RestartProcessByKeyExample(SetString desiredVariableNames,String processInstanceId,String businessKey,String flowIdea) {/*这里是重启时还是重启当前版本的流程// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 获取历史服务和运行时服务HistoryService historyService processEngine.getHistoryService();RuntimeService runtimeService processEngine.getRuntimeService();// 查询具有特定业务键的已完成历史流程实例并按结束时间降序排列取第一条记录即最新完成的HistoricProcessInstance historicProcessInstance historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(businessKey).processInstanceId(processInstanceId).finished().orderByProcessInstanceEndTime().desc().listPage(0, 1) // 从第0个开始取1个结果.stream().findFirst().orElse(null);if (historicProcessInstance ! null) {// 获取流程定义IDString processDefinitionId historicProcessInstance.getProcessDefinitionId();// 获取上一次流程实例的所有变量MapString, Object filteredVariables new HashMap();for (HistoricVariableInstance variable : historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list()) {if (desiredVariableNames.contains(variable.getName())) {filteredVariables.put(variable.getName(), variable.getValue());}}filteredVariables.put(flowIdea,flowIdea);// 使用相同的业务键和变量重新启动流程实例ProcessInstance newProcessInstance runtimeService.startProcessInstanceById(processDefinitionId, businessKey, filteredVariables);System.out.println(流程已重新启动流程实例ID: newProcessInstance.getId());return newProcessInstance.getId();} else {throw new RuntimeException(未找到已完成的流程实例业务键: businessKey);}*/// 以下是 每次启动时获取最新的版本进行启动,并携带之前的变量值// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 获取历史服务、运行时服务和仓库服务HistoryService historyService processEngine.getHistoryService();RuntimeService runtimeService processEngine.getRuntimeService();RepositoryService repositoryService processEngine.getRepositoryService();// 查询具有特定业务键的已完成历史流程实例并按结束时间降序排列取第一条记录即最新完成的HistoricProcessInstance historicProcessInstance historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(businessKey).processInstanceId(processInstanceId).finished().orderByProcessInstanceEndTime().desc().singleResult(); // 直接获取单个结果if (historicProcessInstance ! null) {// 使用流程定义的key和版本号查找最新的流程定义String processDefinitionKey historicProcessInstance.getProcessDefinitionKey();int processDefinitionVersion historicProcessInstance.getProcessDefinitionVersion();ProcessDefinition processDefinition repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey).processDefinitionVersion(processDefinitionVersion).latestVersion() // 确保获取的是最新版本.singleResult();if (processDefinition ! null) {// 获取上一次流程实例的所有变量MapString, Object filteredVariables new HashMap();for (HistoricVariableInstance variable : historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list()) {if (desiredVariableNames.contains(variable.getName())) {filteredVariables.put(variable.getName(), variable.getValue());}}// 使用相同的业务键和变量重新启动流程实例ProcessInstance newProcessInstance runtimeService.startProcessInstanceById(processDefinition.getId(), businessKey, filteredVariables);System.out.println(流程已重新启动流程实例ID: newProcessInstance.getId());return newProcessInstance.getId();} else {throw new RuntimeException(未找到对应的流程定义key: processDefinitionKey , 版本号: processDefinitionVersion);}} else {throw new RuntimeException(未找到已完成的流程实例业务键: businessKey);}}OverrideTransactional(rollbackFor Exception.class)public void approveOrRejectByBusinessKeyExample(String processInstanceId,String businessKey,Boolean approve,String flowIdea) {// 查询与业务键关联的当前任务Task currentTask taskService.createTaskQuery().processInstanceBusinessKey(businessKey).processInstanceId(processInstanceId).active().singleResult();if (currentTask ! null) {// 获取任务的办理人String assignee currentTask.getAssignee();// 检查当前用户是否为任务的办理人if (SecurityUtils.getUserId().toString().equals(assignee)) {// 创建变量映射可以包含审批结果等信息VariableMap variables Variables.createVariables();variables.put(approved, approve);variables.put(flowIdea,flowIdea);// 完成任务相当于批准taskService.complete(currentTask.getId(), variables);// throw new RuntimeException(与业务键 businessKey 关联的当前任务已被批准。);} else {throw new RuntimeException(当前登录人不是任务处理人无法执行操作。);}} else {throw new RuntimeException(没有找到与之相关联的活动任务。);}}OverrideTransactional(rollbackFor RuntimeException.class)public String getNowNodeUserName(String processInstanceId) {String assignee;// 查询与业务键关联的当前任务Task currentTask taskService.createTaskQuery().processInstanceId(processInstanceId).active().singleResult();if (currentTask ! null) {// 获取任务的办理人assignee currentTask.getAssignee();}return assignee;}OverrideTransactional(rollbackFor RuntimeException.class)public String getNowCurrentName(String processInstanceId) {// 查询与业务键关联的当前任务Task currentTask taskService.createTaskQuery().processInstanceId(processInstanceId).active().singleResult();if (currentTask ! null) {// 获取节点名称return currentTask.getName();}else{return ;}}Overridepublic String getWaitCurrentName(String processInstanceId) {// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();TaskService taskService processEngine.getTaskService();// 查询该流程实例下的所有活动任务ListTask tasks taskService.createTaskQuery().processInstanceId(processInstanceId).list();StringBuilder sbnew StringBuilder();for (Task task : tasks) {System.out.println(Task ID: task.getId());System.out.println(Task Name: task.getName());System.out.println(Assignee: task.getAssignee()); // 处理人信息if(StringUtils.isNotEmpty(task.getAssignee())){SysUser user systemUserService.selectUserById(Long.valueOf(task.getAssignee()));sb.append(user.getNickName()).append(,);}}return sb.toString();}Overridepublic Integer ifEndTaskById(String processInstanceId) {// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 使用HistoryService查询历史流程实例HistoryService historyService processEngine.getHistoryService();HistoricProcessInstance historicProcessInstance historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if (historicProcessInstance ! null) {// 检查流程实例状态String state historicProcessInstance.getState();if (COMPLETED.equals(state)) {// 流程实例已经结束。return 0;} else {// 其他状态可能包括ACTIVE, SUSPENDED, TERMINATED等具体取决于流程实例的生命周期return 1;}} else {throw new RuntimeException(无法找到流程实例的历史记录可能流程未结束或已被清理。);}}Overridepublic HashMap getTaskDateBy(String processInstanceId) {HashMap mapnew HashMap();// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 查询历史流程实例以获取流程定义IDHistoricProcessInstance historicProcessInstance processEngine.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if (historicProcessInstance ! null) {String processDefinitionId historicProcessInstance.getProcessDefinitionId();// 使用流程定义ID查询流程定义的详细信息包括版本号ProcessDefinition processDefinition processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();if (processDefinition ! null) {map.put(taskId,processDefinition.getId());map.put(taskVersion,processDefinition.getVersion());} else {throw new RuntimeException(未找到对应的流程定义);}} else {throw new RuntimeException(未找到指定的流程实例);}return map;}Overridepublic String getCamundaModelById(String processInstanceId) {// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 获取RuntimeServiceRuntimeService runtimeService processEngine.getRuntimeService();// 通过流程实例ID获取流程实例ProcessInstance processInstance runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if (processInstance ! null) {// 获取流程定义IDString processDefinitionId processInstance.getProcessDefinitionId();// 通过流程定义ID获取BPMN模型实例BpmnModelInstance bpmnModelInstance processEngine.getRepositoryService().getBpmnModelInstance(processDefinitionId);// 将BpmnModelInstance转换为XML字符串String bpmnXml Bpmn.convertToString(bpmnModelInstance);return bpmnXml;} else {System.out.println(流程实例未找到);throw new RuntimeException(流程实例未找到);}}Overridepublic MapString, String getNodeAndOwnersByProcessInstanceId(String processInstanceId,String processDefinitionId) {// 初始化流程引擎ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();// 获取流程定义的BPMN模型实例BpmnModelInstance bpmnModelInstance processEngine.getRepositoryService().getBpmnModelInstance(processDefinitionId);// 查询历史任务实例获取负责人信息HistoryService historyService processEngine.getHistoryService();MapString, String userTaskToAssigneeMap new HashMap();// 获取申请人HistoricProcessInstance historicProcessInstance historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if (historicProcessInstance ! null) {String starterUserId historicProcessInstance.getStartUserId();if (starterUserId ! null) {System.out.println(流程实例发起人启动用户ID: starterUserId);} else {System.out.println(无法获取发起人信息可能是因为流程实例是由系统或匿名触发的。);}} else {System.out.println(未找到对应的流程实例。);}// 获取所有UserTask节点的IDCollectionUserTask userTasks bpmnModelInstance.getModelElementsByType(UserTask.class);for (UserTask userTask : userTasks) {String userTaskId userTask.getId();String userTaskName userTask.getName();String variableKeyuserTask.getCamundaAssignee();HistoricTaskInstance historicTaskInstance historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).taskDefinitionKey(userTaskId).singleResult();if (historicTaskInstance ! null) {String assignee historicTaskInstance.getAssignee();userTaskToAssigneeMap.put(userTaskName, assignee ! null ? assignee : 未分配);} else {// 如果当前没有找到对应的历史任务实例可能是任务还未到达或已被删除variableKey extractVariable(variableKey);// 查询启动时设置的变量HistoricVariableInstanceQuery variableQuery historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId).variableName(variableKey);// 获取变量实例HistoricVariableInstance historicVariableInstance variableQuery.singleResult();if (historicVariableInstance ! null) {userTaskToAssigneeMap.put(userTaskName, historicVariableInstance.getValue().toString());} else {throw new RuntimeException(该任务中没有该变量: variableKey);}}}userTaskToAssigneeMap.put(办结,);return userTaskToAssigneeMap;}/*** 从形如${...}的字符串中提取变量名。** param input 含有变量模板的字符串如${varName}* return 提取出的变量名如varName*/public static String extractVariable(String input) {// 正则表达式匹配${...}中的内容Pattern pattern Pattern.compile(\\$\\{(.?)\\});Matcher matcher pattern.matcher(input);if (matcher.find()) {// 返回匹配到的第一组内容即变量名return matcher.group(1);} else {// 如果没有匹配到则返回null或抛出异常根据实际情况选择return null;}}}10、测试用例 /*** OA测试任务* TableName oa_test_demo*/ Data public class OaTestDemo implements Serializable {/*** */TableId(value id, type IdType.AUTO)private Integer id;/*** 任务key*/private String taskKey;/*** 状态0待审核1已完成2已驳回*/private Integer status;/*** 标题*/private String title;/*** */private String content;/*** 申请人id*/private Integer proposerId;/*** 申请日期*/private Date proposerTime;/*** 签字意见*/private String flowIdea;/*** */private Integer userId;/*** */private Integer deptId;/*** 更新日期*/private Date updateTime;/*** 更新人id*/private Integer updateBy;/*** 是否删除(0否1是)*/private Integer isDeleted;/*** 当前进行节点名称*/private String currentName;/*** 流程实例id*/private String actHiProcinstId;private String businessKey;private static final long serialVersionUID 1L;/** 签字意见*/TableField(exist false)ListTaskAudit flowIds;private String code;private String taskVersion;private String taskId;/* 流程线*/TableField(exist false)private ListModelFlowNodeUtilVo flowMap; }以下是关键业务逻辑 发起一个任务流程实例OverrideTransactional(rollbackFor RuntimeException.class)public Integer startProcessInstanceByKey(SysUser user, OaTestDemo oaTestDemo) {oaTestDemo.setProposerId(user.getUserId().intValue());oaTestDemo.setProposerTime(new Date());oaTestDemo.setUserId(user.getUserId().intValue());oaTestDemo.setDeptId(user.getDeptId().intValue());oaTestDemo.setStatus(0);oaTestDemo.setCode(getCode());oaTestDemoMapper.insert(oaTestDemo);int idoaTestDemo.getId();String businessKeybusinessid;SysUser leaderInfo userService.selectUserById(user.getLeaderId());// 获取部门领导SysUser deptUserauditUtils.getDeptLeader(user);MapString, Object paramMap new HashMap(10);paramMap.put(proposer,user.getUserId().toString() );paramMap.put(lineLeader,leaderInfo.getUserId().toString() );paramMap.put(businessId,oaTestDemo.getId().toString() );paramMap.put(deptLeader,deptUser.getUserId().toString());paramMap.put(flowIdea,flowIdea );// 根据流程定义的key和版本号查找流程定义ProcessDefinition processDefinition repositoryService.createProcessDefinitionQuery().processDefinitionKey(oaTestDemo.getTaskKey()) // 替换为你的流程定义key.processDefinitionVersion(processDefinitionService.getHighestVersionByKey(oaTestDemo.getTaskKey())) // 替换为你想要的版本号.singleResult();if (processDefinition null) {throw new RuntimeException(流程定义未找到);}/*关键代码runtimeService.startProcessInstanceById(processDefinitionId, businessKey, variables) 是Camunda BPM引擎中用于启动流程实例的一个方法。processDefinitionId: 这个参数是一个字符串代表你想要启动的流程定义的唯一标识符。 businessKey:这也是一个字符串参数用于给流程实例分配一个业务键。业务键是一个可选的参数但是它非常有用因为它可以帮助你在业务层面唯一地标识一个流程实例。例如如果你的应用程序中每个订单都启动了一个流程实例你可以使用订单ID作为业务键这样你就可以通过订单ID轻松地查询到相关的流程实例状态。variables: 这是一个MapString, Object类型的参数用于传递流程实例启动时的变量。这些变量可以被流程中的活动所使用例如它们可以作为任务表单的预填充值或者用于决定流程的分支路径。*/ProcessInstance processInstance runtimeService.startProcessInstanceById(processDefinition.getId(), businessKey, paramMap);if(ObjectUtil.isNull(processInstance)){throw new RuntimeException(ProcessExceptionEnum.START_PROCESS_INSTANCE_FAIL.getDesc());}// 以下代码是讲流程实例的关键信息绑定到业务表中oaTestDemo.setActHiProcinstId(processInstance.getId());oaTestDemo.setBusinessKey(businessKey);oaTestDemo.setCurrentName(processInstanceService.getNowCurrentName(processInstance.getId()));HashMap mapprocessInstanceService.getTaskDateBy(processInstance.getId());oaTestDemo.setTaskVersion(map.get(taskVersion).toString());oaTestDemo.setTaskId(map.get(taskId).toString());oaTestDemoMapper.updateById(oaTestDemo);taskAuditService.addAuditFlow(user,oaTestDemo,AuditInfoEnum.commit.code,flowIdea);this.addStartTblFlowMessage(oaTestDemo,false);return oaTestDemo.getId();}批准或驳回 OverrideTransactional(rollbackFor Exception.class)public void approveOrRejectOaTestDemo(OaTestDemo oaTestDemo,Boolean approve) {// 关键代码 调用流程实例的审批 processInstanceService.approveOrRejectByBusinessKeyExample(oaTestDemo.getActHiProcinstId(),oaTestDemo.getBusinessKey(),approve,flowIdea);SysUser user userService.selectUserById(SecurityUtils.getUserId());Integer ifHaveNextNode processInstanceService.ifEndTaskById(oaTestDemo.getActHiProcinstId());}重新提交流程实例OverrideTransactional(rollbackFor RuntimeException.class)public void againSubmit(OaTestDemo oaTestDemo) {OaTestDemo oldTestDemooaTestDemoMapper.selectById(oaTestDemo.getId());if(oldTestDemonull){throw new RuntimeException(未获取到数据,请确定参数是否正确);}if(!oldTestDemo.getProposerId().equals(SecurityUtils.getUserId().intValue())){throw new RuntimeException(非申请人,不支持该操作);}// 关键代码 ,以上根据自己项目需要自行编写// 定义需要携带的变量名列表根据实际情况调整SetString desiredVariableNames new HashSet(Arrays.asList(proposer, lineLeader, deptLeader, businessId));// processInstanceId 流程实例idString processInstanceId processInstanceService.RestartProcessByKeyExample(desiredVariableNames,oldTestDemo.getActHiProcinstId(),oldTestDemo.getBusinessKey(),flowIdea);// 关键代码 ,以下根据自己项目需要自行编写oldTestDemo.setActHiProcinstId(processInstanceId);oaTestDemoMapper.updateById(oldTestDemo);} 11、测试用例中我绑定的监听类 package com.yuepu.oa.comunda.controller.serviceTask;import com.yuepu.oa.comunda.entity.OaTestDemo; import com.yuepu.oa.mapper.OaTestDemoMapper; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;Service(oaTestDemoHandler) public class OaTestDemoHandlerService implements JavaDelegate {private final OaTestDemoMapper oaTestDemoMapper;Autowiredpublic OaTestDemoHandlerService(OaTestDemoMapper oaTestDemoMapper) {this.oaTestDemoMapper oaTestDemoMapper;}Overridepublic void execute(DelegateExecution delegateExecution) throws Exception {System.out.println(调用监听);// 更安全的获取变量值避免空指针异常String businessIdStr (String) delegateExecution.getVariable(businessId);if (businessIdStr ! null) {Integer businessId Integer.parseInt(businessIdStr);OaTestDemo oaTestDemo oaTestDemoMapper.selectById(businessId);if (oaTestDemo null) {throw new RuntimeException(没有找到businessessId的匹配记录 : businessId);}// 更安全的类型转换Boolean approved (Boolean) delegateExecution.getVariable(approved);if (approved ! null approved) {oaTestDemo.setStatus(1);oaTestDemo.setCurrentName(办结);} else {oaTestDemo.setStatus(2);oaTestDemo.setCurrentName(发起人);}oaTestDemoMapper.updateById(oaTestDemo);}} }如果需要获取流程线,建议在启动流程实例的时候,通过一个固定变量对象存放到流程实例中,流程实例无法获取还未进行到节点的信息, 如果需要获取为执行到的节点处理人信息, 但是可以通过流程实例id获取流程变量 以下是camunda某些表作用的解释 http://localhost:8081/api/camunda/app/ ACT_HI_ 表示流程历史记录 act_hi_actinst 执行的活动历史 act_hi_taskinst执行任务历史 act_hi_procinst执行流程实例历史 act_hi_varinst流程变量历史表 ACT_RE_ 表示流程资源存储 act_re_procdef流程定义存储 act_re_deployment: 自动部署springboot每次启动都会重新部署生成记录 ACT_RU_ 表示流程运行时表数据流程结束后会删除 act_ru_execution运行时流程实例 act_ru_task运行时的任务 act_ru_variable运行时的流程变量 ACT_GE_ 流程通用数据 act_ge_bytearray每次部署的文件2进制数据所以如果文件修改后重启也没用因为重新生成了记录需要清掉数据库或者这个表记录 登录界面 act_hi_actinst 全称: ACT_HI_ACTINST 含义: 此表存储了流程实例中每一个活动如任务、网关等的每一次执行的历史记录。每个流程实例中的每个活动都会在这个表中至少有一条记录如果活动被执行多次则会有对应多条记录。 主要字段: ID_: 历史活动实例的唯一标识。 PROC_DEF_ID_: 关联的流程定义ID。 PROC_INST_ID_: 关联的流程实例ID。 EXECUTION_ID_: 执行实例ID表示活动在哪一个执行路径上被执行。 ACT_ID_: 流程定义中活动的ID。 START_TIME_, END_TIME_: 活动开始和结束的时间戳。 DURATION_: 活动持续的时间。 用途: 用于审计、统计分析或追踪具体活动的执行历史例如查看某任务何时开始、何时结束耗时多久等。 act_hi_procinst 全称: ACT_HI_PROCINST 含义: 此表记录了每个流程实例的整体历史信息每启动一次流程实例就会在这个表中生成一条记录。 主要字段: ID_: 历史流程实例的唯一标识。 PROC_DEF_ID_: 启动的流程定义ID。 BUSINESS_KEY_: 流程实例的业务键用于关联业务数据。 START_TIME_, END_TIME_: 流程实例的启动和结束时间。 DURATION_: 流程实例的总持续时间。 START_USER_ID_: 启动流程实例的用户ID。 用途: 用于查看流程实例级别的信息如流程实例的总体执行时间、启动者等适合于监控流程实例的宏观状态和进行整体分析。 act_hi_actinst执行的活动历史 记录内容此表记录了流程实例中每一个流程活动如服务任务、用户任务、排他网关等的每一次执行的详细历史信息。这包括了自动活动和人工任务的执行记录。 关键字段包括ACTIVITY_ID_(活动ID)PROC_INST_ID_(关联的流程实例ID)START_TIME_和END_TIME_(活动开始和结束时间)以及DURATION_(活动执行时长)等。 用途用于跟踪和分析流程中各个活动的执行情况例如了解每个活动的执行效率、耗时等对流程优化和故障排查非常有用。 act_hi_taskinst执行任务历史 记录内容专注于记录用户任务Human Task的执行历史即那些需要用户交互的任务实例。这包括了任务的创建、分配、完成、取消等状态变化。 关键字段除了包含PROC_INST_ID_(关联的流程实例ID)外还包括TASK_DEF_KEY_(任务定义的ID)CREATE_TIME_和CLAIM_TIME_(任务创建和认领时间)以及COMPLETED_TIME_(任务完成时间)等。 用途主要用于追溯和审计用户任务的处理过程比如查看哪些任务被谁处理处理时间等对于管理任务分配和监控个人工作量非常有帮助。 act_hi_procinst执行流程实例历史 记录内容记录整个流程实例从启动到结束的生命周期信息包括流程实例的整体状态变化和基本信息。 关键字段包括PROC_INST_ID_(流程实例ID)PROC_DEF_ID_(流程定义ID)BUSINESS_KEY_(业务键关联外部业务数据)START_TIME_和END_TIME_(流程实例的启动和结束时间)以及DURATION_(流程实例总耗时)等。 用途适用于分析流程实例的整体执行情况比如查看流程的平均执行时间、成功率等对于评估流程性能和优化流程设计至关重要。 总结来说act_hi_actinst关注流程内部活动的执行细节act_hi_taskinst专注于用户任务的生命周期管理而act_hi_procinst则提供了流程实例从头到尾的概览信息。三者结合起来可以提供全面的流程执行历史数据分析视角。 act_ru_execution运行时执行实例 记录内容此表存储了流程实例及其所有执行路径的当前状态信息。它包含了正在运行或暂停的流程实例、活动、并行分支等的执行情况。也就是说这个表反映了流程实例在任何给定时刻的动态视图。 关键字段包括ID_(执行实例ID)PROC_INST_ID_(关联的流程实例ID)PROC_DEF_ID_(流程定义ID)ACT_ID_(当前活动ID如果有的话)以及状态相关的字段如SUSPENSION_STATE_(挂起状态)、ACTUAL_START_TIME_(实际开始时间)等。 用途主要用于流程引擎内部管理和查询当前运行中的流程实例状态比如决定下一步应执行哪个活动或是处理流程实例的暂停、继续等操作。 与历史表的区别 数据持久性act_ru_execution表中的数据是临时的随着流程实例的推进相关记录可能会被修改或删除。而历史表如act_hi_*系列的数据一旦记录通常是不会被修改或删除的用于长期存储和历史分析。 用途不同运行时表服务于流程引擎的运行时决策和状态管理是流程执行的核心数据结构。历史表则服务于审计、监控、报表生成等后处理需求帮助分析过去发生的流程行为。 数据内容运行时表包含更多关于流程实例当前状态和执行路径的信息而历史表则更多关注于流程实例、任务或活动的生命周期记录尤其是它们的开始、结束和关键状态变更。
http://www.w-s-a.com/news/605831/

相关文章:

  • 如何搭建个人网站ps做网站首页怎么运用起来
  • 中小企业商务网站建设wordpress 安全加固
  • asp网站开发设计文档php建设网站怎么用
  • 服装公司网站建设需求分析报告seo搜索引擎优化实战
  • wordpress 扒站最近最新新闻
  • 手机wap网站开发与设计wordpress域名无法访问
  • 百度收录网站收费吗做网站用vs还是dw
  • 维度网络专业做网站嘉兴网站建设方案服务
  • 成品电影网站建设中国最顶尖设计师
  • 网站建设报价清单明细视频网站如何做营销
  • 建设农业网站的论文做国外网站有哪些
  • 怎么做网页 网站制作张家港网站制作哪家好
  • 创世网站建设公司书籍封面设计网站
  • 国外优秀网站设计欣赏小程序推广赚佣金
  • 徐州人才网官方网站邯郸seo优化公司
  • 海南响应式网站建设哪里好瑞安电影城网站建设
  • wordpress widgetkit济南优化网站厂家
  • 麦片网站建设佛山短视频推广渠道
  • 免费自助建网站销售的网络建设
  • 传媒大气的网站网站怎么做分类聚合
  • 网站可以自己备案吗crm系统架构图
  • 罗湖网站建设58做网站的公司盐城
  • 网站开发答辩想要去网站做友情链接怎么发邮件
  • 网站名称填写什么广告网络推广怎么做
  • 做网站架构需要注意什么百度竞价排名推广
  • 网站接口设置地税局内网网站建设
  • 谷歌提交网站入口wordpress前台自动登录
  • 规模以上工业企业的标准是什么洛阳霞光seo网络公司
  • 怎样用文本建一个网站做美容美发学校网站公司
  • 南宁企业网站建设制作芜湖网站建设推广