《云尚办公》详细步骤实现

资料获取:
链接: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,完成当前任务。

我的信息显示

请添加图片描述

前端:
请添加图片描述
请添加图片描述

后端:
请添加图片描述
请添加图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值