资料获取:
链接:https://pan.baidu.com/s/1CiPlmlakIwCN_fKykJvOug
提取码:8c4j
审批设置
审批类型
1、分页查询
流程如下:
前端:
后端:
数据库:
2、添加
流程如下:
前端:
后端:
数据库:
3、修改
流程如下:
前端:
后端:
数据库:
4、删除
流程如下:
前端:
后端:
数据库:
审批模板
1、分页查询
流程和上述的分页查询基本类似
2、添加审批模板
流程如下:
前端:
后端:
数据库:
3、查看审批模板
4、修改审批模板
5、删除
前端:
后端:
数据库:
6、发布
前端:
后端:
具体来说,这段代码的作用是将指定路径中的zip文件输入流读取进来,然后创建一个ZipInputStream对象对其进行解析。接着,通过Activiti提供的repositoryService.createDeployment()方法创建了一个Deployment对象,并通过addZipInputStream()方法将之前读取进来的zip文件输入流添加到Deployment中。然后使用name()方法为这次部署命名,并通过deploy()方法执行部署操作,将该流程定义部署到Activiti的流程库中。通常情况下,流程定义部署后需要通过runtimeService.startProcessInstanceByKey()方法开启一个新的流程实例,才能开始该流程的执行。
审批管理
审批列表
员工端审批
OA审批
查看审批分类
流程如下:
前端:
后端:
审批申请
根据审批模板渲染动态表单,根据动态表单启动流程实例
获取审批模板数据
流程如下:
前端:
后端:
启动流程实例
流程如下:
方法名为startUp,通过传入一个ProcessFormVo对象作为参数。这个对象包含了需要审批的流程信息,例如审批模板ID、表单数据等等。
在方法中,首先通过sysUserService.getById(LoginUserInfoHelper.getUserId())获取当前用户的信息,将其保存到sysUser对象中。
然后,通过processTemplateService.getById(processFormVo.getProcessTemplateId())获取需要使用的审批模板信息,将其保存到processTemplate对象中。
接下来,创建一个Process对象,将processFormVo中的属性值复制到其中,同时设置一些额外的属性,例如状态、流程编号、用户ID、表单数据等等。
方法中还使用baseMapper.insert(process)将该对象保存到数据库中。
之后,调用runtimeService.startProcessInstanceByKey方法,启动一个新的流程实例。该方法需要传入三个参数:流程定义key、业务key和流程参数。其中,流程定义key和业务key都可以从之前获取的processTemplate和process对象中获取。至于流程参数,代码中使用formValues将processFormVo对象中的表单数据进行解析,将其转换成一个Map,并设置为流程参数。
接着,通过getCurrentTaskList(processInstance.getId())方法,获取当前流程实例中的所有任务信息,并循环遍历每个任务。对于每个任务,都通过task.getAssignee()获取相应用户的登录名称,再通过sysUserService.getUserByUserName(assigneeName)获取该用户的真实名称,最后将其保存到nameList数组中。
在获取完所有任务的审批人信息后,通过messageService.pushPendingMessage(process.getId(),user.getId(),task.getId())向相应的用户发送推送消息。
然后,更新之前创建的Process对象的流程实例ID、描述等属性,并将其保存回数据库中,以便后续的审批操作。
最后使用processRecordService.record(process.getId(),1,“发起申请”)记录操作审批信息记录,用于审批流程的追踪和记录。
前端:
后端:
数据库:
返回
这是一个Vue.js中的指令,用于在点击元素时回退到上一个页面。
具体来说,它是@click事件绑定的一段JS代码,其中router是Vue.js路由对象,back()方法用于回退到上一个页面。整个指令可以解释为:“在点击元素时执行router.back()方法,回退到上一个页面。
需要注意的是,这个指令需要绑定在可点击的元素上,例如按钮、链接等,才能起作用。同时,它只能回退到上一个历史记录,而不能实现更复杂的页面跳转或导航功能。
记录提交记录
待处理列表
启动流程后,审批人就可以在待处理列表中获取审批列表了
前端:
后端:
数据库:
审批详情
前端:
后端:
具体实现步骤如下:
1、根据传入的流程id,通过MyBatis-Plus提供的selectById方法查询Process表中对应的数据,获取流程信息并赋值给process变量。
2、使用LambdaQueryWrapper构建条件查询,根据传入的流程id在ProcessRecord表中查询所有对应的流程记录信息,并将结果封装到processRecordList集合中。
3、根据process对象中的流程模板id,使用getById方法从ProcessTemplate表中查询对应的模板信息,并将结果封装到processTemplate变量中。
4、获取当前用户的信息,并遍历当前流程实例中所有任务列表,判断当前任务的审批人是否是当前用户;如果是,则将isApprove变量设为true。
5、将以上查询结果封装到一个map集合中,并返回结果。
审批
审批通过
前端:
后端:
具体看源代码
数据库:
审批拒绝
前端:
后端:
和上述代码实现一样
数据库:
已处理
前端:
后端:
具体查看源代码
数据库:
已发起
前端:
后端:
具体查看源代码
数据库:
结束流程
//结束流程
private void endTask(String taskId) {
//1 根据任务id获取任务对象 Task
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//2 获取流程定义模型 BpmnModel
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
//3 获取结束流向节点
List<EndEvent> endEventList = bpmnModel.getMainProcess().findFlowElementsOfType(EndEvent.class);
if(CollectionUtils.isEmpty(endEventList)) {
return;
}
FlowNode endFlowNode = (FlowNode)endEventList.get(0);
//4 当前流向节点
FlowNode currentFlowNode = (FlowNode)bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
// 临时保存当前活动的原始方向
List originalSequenceFlowList = new ArrayList<>();
originalSequenceFlowList.addAll(currentFlowNode.getOutgoingFlows());
//5 清理当前流动方向
currentFlowNode.getOutgoingFlows().clear();
//6 创建新流向
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlow");
newSequenceFlow.setSourceFlowElement(currentFlowNode);
newSequenceFlow.setTargetFlowElement(endFlowNode);
//7 当前节点指向新方向
List newSequenceFlowList = new ArrayList();
newSequenceFlowList.add(newSequenceFlow);
currentFlowNode.setOutgoingFlows(newSequenceFlowList);
//8 完成当前任务
taskService.complete(task.getId());
}
具体实现步骤如下:
1、根据传入的任务id,使用TaskService提供的createTaskQuery和taskId方法查询任务对象,并将结果赋值给task变量。
2、获取流程定义模型BpmnModel,使用RepositoryService提供的getBpmnModel方法,并传入任务对象的ProcessDefinitionId。
3、获取结束流向节点,使用BpmnModel提供的findFlowElementsOfType方法查询BpmnModel中所有的结束事件节点,并将查找结果封装到endEventList集合中;如果查找结果为空,则直接返回。
4、获取当前流向节点,使用BpmnModel提供的getFlowElement方法,并传入任务对象中的TaskDefinitionKey。
5、临时保存当前活动的原始方向,将当前流向节点的出口流转集合拷贝一份,保存到originalSequenceFlowList集合中。
6、清理当前流动方向,将当前流向节点的出口流转集合从源头清空。
7、创建新流向,创建一个新的SequenceFlow对象,并设置其id、源节点和目标节点。
8、当前节点指向新方向,将新建的SequenceFlow对象添加到newSequenceFlowList集合中,并将其赋值给currentFlowNode节点的出口流转集合属性,使其指向新方向。
9、完成当前任务,使用TaskService提供的complete方法,传入任务id,完成当前任务。
我的信息显示
前端:
后端: