芋道-------如何实现工作流退回后重新提交到之前退回的节点

一、概述

      上一节,我们讲过了工作流如何退回到申请人,接下来我们来讲一讲,如何重新提交。这里重新提交可以是再走一遍正常流程,同时也可以是直接跳过中间的步骤,直接继续给上一步退回的人审批。文章中会提及这两种情况。

       首先,我们可以看到,在芋道的工作流中有一个好处是在业务表中与工作流关联起来了,同时也为当前的状态设置了单独的字段。所以这样我们能很容易的判断出来,当前节点处于什么状态。

二、逻辑梳理

    思路如下:首先在流程详情页面中,判断当前的节点的上一个节点是什么状态,然后拿到退回节点的状态,因为下一步我们将根据这个状态,把原本不可更改的详情页,改成可编辑的,这样用户才可以修改后重新提交。然后重新提交后,我们需要对业务表进行更新,同时需要继续启动流程。

总结:1、将task中所有任务按照时间进行排序,找到倒数第二个task即当前节点的上一个。

           2、然后判断result是否为‘5’(驳回),如果是,将标识isRerurn改成true。

           3、修改页面信息,对于申请信息,我们要考虑,何时可编辑,何时只能查看;对于审批任务何时可以显示,何时不需要显示。

           4、后台更新业务表、继续启动流程。

三、代码实现

1、判断当前节点的任务是否是被退回的

      为什么判断的是上一个节点,而不是当前节点,因为,当前节点一定是已经由上一个节点处理过后,才得到的结果。因此,我们要判断是由退回走到当前节点的还是正常流程通过走过来的。

     经过查看后台代码,发现result为5的表示的是当前任务节点是被驳回状态,同时在前台我们可以看到他已经按照时间顺序排好,因此我们只要判断数组中第二个位置的result是否为5即可,这个时候将标识isReturn设为true。

2、修改审批界面 --- 审批任务

    由于如果是重新提交,根据业务需求页面上就不需要审批任务这个模块,只留一个编辑表单信息就可以,所以这里加了条件限制,判断如果不是申请人就不显示审批任务。

3、修改审批界面 --- 申请信息组件值传递

      然后我们将 isReturn 和 runningTasks 这两个参数传到组件中,isReturn是是否是退回的标识,runningTasks是,当前登录人的任务列表。

      因为具体业务的表单信息,属于动态的,所以这里面他们引用了组件,我们需要把参数信息传到对应的表单页面,这样表单页面拿到信息,进而判断出什么时候可以编辑的,什么时候显示的。

     这里讲一下为什么传递这两个参数,首先,我们单纯的知道了什么时候退回,并不能控制住审批信息的显示和编辑,因为如果只是知道当前节点属于退回后的节点,其他人再进入到页面的时候,也会显示重新提交这个界面。

    所以我们还需要判断当前登录的人,是否是要退回到某个节点的人,在进行处理。这个时候,我们发现既有的代码中有一段runningTasks的逻辑,他其实就是将当前任务中需要登录用户处理的任务存起来,这样我们其实只要判断,这个runningTasks中是否有值即可,如果他有值,证明这个节点其实已经走到了当前登录的用户这里了,如果同时他又是退回后的节点,那么它就可以编辑该界面。

4、修改审批界面 --- 申请信息界面
<template><div class="app-container"><!-- <el-form ref="form" :model="form" label-width="100px"><el-form-item label="开始时间:" prop="startTime">{{ parseTime(form.startTime, "{y}-{m}-{d}") }}</el-form-item><el-form-item label="结束时间:" prop="endTime">{{ parseTime(form.endTime, "{y}-{m}-{d}") }}</el-form-item><el-form-item label="请假类型:" prop="type"><dict-tag :type="DICT_TYPE.BPM_OA_LEAVE_TYPE" :value="form.type" /></el-form-item><el-form-item label="原因:" prop="reason"> {{ form.reason }}</el-form-item></el-form> --><!-- 对话框(添加 / 修改) --><el-form ref="form" :model="form" label-width="100px"><el-form-item label="开始时间:" prop="startTime"><template v-if="isReturn && runningTasks.length != 0"><el-date-pickerv-model="form.startTime"type="date":editable="!isReturn"></el-date-picker></template><template v-else>{{ parseTime(form.startTime, "{y}-{m}-{d}") }}</template></el-form-item><el-form-item label="结束时间:" prop="endTime"><template v-if="isReturn && runningTasks.length != 0"><el-date-pickerv-model="form.endTime"type="date":editable="!isReturn"></el-date-picker></template><template v-else>{{ parseTime(form.endTime, "{y}-{m}-{d}") }}</template></el-form-item><el-form-item label="请假类型:" prop="type"><template v-if="isReturn && runningTasks.length != 0"><el-select v-model="form.type"><el-optionv-for="dict in typeDictData":key="parseInt(dict.value)":label="dict.label":value="parseInt(dict.value)"/></el-select></template><template v-else><dict-tag :type="DICT_TYPE.BPM_OA_LEAVE_TYPE" :value="form.type" /></template></el-form-item><el-form-item label="原因:" prop="reason"><template v-if="isReturn && runningTasks.length != 0"><el-input v-model="form.reason"></el-input></template><template v-else>{{ form.reason }}</template></el-form-item><el-form-item v-if="isReturn && runningTasks.length != 0"><el-button type="primary" @click="submitForm">重新提交</el-button></el-form-item></el-form></div>
</template><script>
import { updateLeave, getLeave } from "@/api/bpm/leave";
import { getDictDatas, DICT_TYPE } from "@/utils/dict";
export default {name: "BpmOALeaveDetail",components: {},props: {id: {type: [String, Number],default: undefined,},isReturn: {type: [Boolean],default: undefined,},runningTasks: {type: [Array],default: undefined,},},data() {return {leaveId: Number, // 请假编号// 表单参数form: {startTime: undefined,endTime: undefined,type: undefined,reason: undefined,},typeDictData: getDictDatas(DICT_TYPE.BPM_OA_LEAVE_TYPE),};},created() {this.leaveId = this.id || this.$route.query.id;if (!this.leaveId) {this.$message.error("未传递 id 参数,无法查看 OA 请假信息");return;}console.log("🚀 ~ runningTasks:",this.isReturn,this.runningTasks,this.runningTasks.length);this.getDetail();},methods: {/** 获得请假信息 */getDetail() {getLeave(this.leaveId).then((response) => {this.form = response.data;});},/** 提交按钮 */submitForm() {this.$refs["form"].validate((valid) => {if (!valid) {return;}// 添加的提交updateLeave(this.form).then((response) => {this.$modal.msgSuccess("重新提交成功!");this.$tab.closeOpenPage({ path: "/bpm/oa/leave" });});});},},
};
</script>
5、后台处理
Controller:
    @PutMapping("/update")public CommonResult<Long> updateLeave(@RequestBody BpmOALeaveUpdateReqVO updateReqVO){return success(leaveService.updateLeave(updateReqVO));}
Service :
    Long updateLeave( BpmOALeaveUpdateReqVO updateReqVO);

ServiceIml:

    public Long updateLeave(BpmOALeaveUpdateReqVO updateReqVO) {// 插入 OA 请假单long day = LocalDateTimeUtil.between(updateReqVO.getStartTime(), updateReqVO.getEndTime()).toDays();BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(updateReqVO).setUserId(SecurityFrameworkUtils.getLoginUserId()).setDay(day).setId(updateReqVO.getId()).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());leaveMapper.updateById(leave);List<BpmTaskRespVO> taskList = taskService.getTaskListByProcessInstanceId(updateReqVO.getProcessInstanceId());List<String> returnTaskKeyList = new ArrayList<>();returnTaskKeyList.add(taskList.get(0).getDefinitionKey());runtimeService.createChangeActivityStateBuilder().processInstanceId(updateReqVO.getProcessInstanceId()).moveActivityIdsToSingleActivityId(returnTaskKeyList, // 当前要跳转的节点列表( 1 或多)taskList.get(1).getDefinitionKey()) // targetKey 跳转到的节点(1).changeState();// 更新任务拓展表为通过 审批记录中添加对应节点信息taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(taskList.get(0).getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()).setReason("重新提交"));// 更新 BPM 流程//taskService.approveTask(getLoginUserId(), reqVO);leaveMapper.updateById(new BpmOALeaveDO().setId(leave.getId()).setProcessInstanceId(updateReqVO.getProcessInstanceId()));return leave.getId();}

注释中的 taskService.approveTask(getLoginUserId(), reqVO); 就是退回后还按照正常顺序流程走的写法 ;而现在的写法是重新提交后直接跳到退回的那个节点

以上就是实现工作流退回后重新提交到之前退回的节点全部流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479879.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在iStoreOS软路由系统中安装cpolar实现公网远程本地电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

Weblogic漏洞复现【含解密和shell连接工具】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、漏洞成因 序列化和反序列化本身并不存在问题&#x…

阿里云服务器价格购买价格表,一目了然!

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

第三百六十六回

文章目录 1. 概念介绍2. 使用方法2.1 List2.2 Map2.3 Set 3. 示例代码4. 内容总结 我们在上一章回中介绍了"convert包"相关的内容&#xff0c;本章回中将介绍collection.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的内容是col…

【常识】大数据设计基础知识

底层存储&#xff1a;hadoop&#xff08;hdfsmapreduce&#xff09; Hadoop已经有十几年的历史&#xff0c;它是大数据领域的存储基石&#xff0c;HDFS目前仍然没有成熟替代品;MapR 文件系统在业内已经具有一定知名度了&#xff0c;不仅 MapR 宣布它自己的文件系统比 HDFS 快2-…

SICTF Round#3 wp web

web hacker sql无列名注入&#xff1b; 提示查询username参数&#xff0c;flag在flag表中&#xff1b; 传参测试发现&#xff0c;union select 可用&#xff0c;空格被过滤可以使用/**/代替 &#xff0c;or也被过滤了且无法大小写、双写等绕过&#xff0c;导致无法查询flag表…

深度学习图像算法工程师--面试准备(1)

1 请问人工神经网络中为什么 ReLU 要好过于 tanh 和 Sigmoid function&#xff1f; 采⽤Sigmoid 等函数&#xff0c;算激活函数时&#xff08;指数运算&#xff09;&#xff0c;计算量⼤&#xff0c;反向传播求误差梯度时&#xff0c;求导涉及除法和指数运算&#xff0c;计算量…

MySQL - 增量同步和全量同步

增量同步和全量同步是数据同步过程中常用的两种方式&#xff0c;它们在定义、区别以及适用场景上有一些明显的差异。 一、定义 增量同步是指在数据同步中仅同步更新或新增的数据&#xff0c;而不包括已经同步过的数据。全量同步则是指将所有数据进行一次完整的同步&#xff0c…

财政部《关于加强数据资产管理的指导意见》要点解析

财政部1月11日印发的《关于加强数据资产管理的指导意见》&#xff08;以下简称《指导意见》&#xff09;是规范和加强数据资产管理&#xff0c;更好推动数字经济发展的重要文件。最近对文件的解析内容不少&#xff0c;这里结合一些公开内容再跟大家做一些解析。 四个核心要点 …

OpenAI Sora引领AI跳舞视频新浪潮:字节跳动发布创新舞蹈视频生成框架

OpenAI的Sora已经引起广泛关注&#xff0c;预计今年AI跳舞视频将在抖音平台上大放异彩。下面将为您详细介绍一款字节跳动发布的AI视频动画框架。 技术定位&#xff1a;这款框架采用先进的diffusion技术&#xff0c;专注于生成人类舞蹈视频。它不仅能够实现人体动作和表情的迁移…

视频生成模型作为世界模拟器

我们探索了在视频数据上大规模训练生成模型。具体来说&#xff0c;我们联合训练文本条件扩散模型&#xff0c;处理不同持续时间、分辨率和宽高比的视频和图像。我们利用一种在时空补丁上操作视频和图像潜码的transformer架构。我们最大的模型&#xff0c;Sora&#xff0c;能够生…

通用二进制方式安装MySQL8.0.x

一、必要说明 1、系统&#xff1a;openEuler操作系统 2、版本&#xff1a;MySQL - 8.0.36 3、下载地址&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0 二、安装步骤 1、下载glibc版本的Mysql [rootnode2 ~]# wget -c https://dev.mysql.com/get/Downloads/MySQ…