基于若依的ruoyi-nbcio流程管理系统修正自定义业务表单的回写bug

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/

更多nbcio-boot功能请看演示系统 

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://218.75.87.38:9888

1、后端,在获取tod流程的时候加上dataId

// 流程发起人信息HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();String userId = historicProcessInstance.getStartUserId();String nickName = sysUserService.selectUserByUserName(userId).getNickName();flowTask.setStartUserId(userId);flowTask.setStartUserName(nickName);flowTask.setDataId(historicProcessInstance.getBusinessKey());

2、前端处理的时候加上dataId

// 跳转到处理页面handleProcess(row) {this.$router.push({path: '/workflow/process/detail/' + row.procInsId,query: {taskId: row.taskId,dataId: row.dataId,processed: true}})},

已经detail.vue里增加获取这个dataId

initData() {this.taskForm.procInsId = this.$route.params && this.$route.params.procInsId;this.taskForm.taskId  = this.$route.query && this.$route.query.taskId;this.taskForm.dataId  = this.$route.query && this.$route.query.dataId;this.processed = this.$route.query && eval(this.$route.query.processed || false);

3、后端对dataId的自自定义业务做回写处理

//处理自定义业务表单回写状态,节点与处理人信息if (StringUtils.isNotBlank(taskBo.getDataId())) {//业务数据idString dataId = taskBo.getDataId();//如果保存数据前未调用必调的FlowCommonService.initActBusiness方法,就会有问题WfMyBusiness business = wfMyBusinessService.getByDataId(dataId);//spring容器类名String serviceImplName = business.getServiceImplName();WfCallBackServiceI flowCallBackService = (WfCallBackServiceI) SpringContextUtils.getBean(serviceImplName);FlowNextDto flowNextDto = this.getNextFlowNode(taskBo.getTaskId(), taskBo.getVariables());if(flowNextDto != null) {//**有下一个节点UserTask nextUserTask = flowNextDto.getUserTask();//能够处理下个节点的候选人List<SysUser> nextFlowNodeUserList = flowNextDto.getUserList();List<String> newusername = new ArrayList<String>();if(nextFlowNodeUserList != null &&  nextFlowNodeUserList.get(0) != null ) {List<String> collect_username = nextFlowNodeUserList.stream().filter(Objects::nonNull).filter(item->item.getUserName()!=null).map(SysUser::getUserName).collect(Collectors.toList());//collect_username转换成realname// 流程发起人ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskBo.getProcInsId()).singleResult();String startUserId = processInstance.getStartUserId();if(taskBo.getVariables() !=null && taskBo.getVariables().containsKey("approval")) {//前端传回的变量值SysUser sysUser = commonService.getSysUserByUserName(taskBo.getVariables().get("approval").toString());newusername.add(sysUser.getNickName());}else {for (String oldUser : collect_username) {if(StrUtil.equalsAnyIgnoreCase(oldUser,"${INITIATOR}")) {SysUser sysUser = commonService.getSysUserByUserName(startUserId);newusername.add(sysUser.getNickName());}else {SysUser sysUser = commonService.getSysUserByUserName(oldUser);newusername.add(sysUser.getNickName());}}}}//下一个实例节点List<Task> listtask = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list();Task nexttask = null;if(listtask.size()==1) {nexttask = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().singleResult();}else {nexttask = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list().get(0);}if(nextFlowNodeUserList !=null) {business.setActStatus(ActStatus.doing);business.setTaskId(nexttask.getId());business.setTaskNameId(nextUserTask.getId());business.setTaskName(nextUserTask.getName());business.setPriority(nextUserTask.getPriority());business.setTodoUsers(JSON.toJSONString(newusername));}else {business.setActStatus(ActStatus.doing);business.setTaskId(nexttask.getId());business.setTaskNameId("");business.setTaskName("");business.setPriority("");business.setTodoUsers("");}if(ObjectUtil.isNotEmpty(taskBo.getNextApproval())) {business.setActStatus(ActStatus.doing);business.setTaskId(nexttask.getId());business.setTaskNameId(nextUserTask.getId());business.setTaskName(nextUserTask.getName());business.setPriority(nextUserTask.getPriority());business.setTodoUsers(taskBo.getNextApproval());}}else {//**没有下一个节点,流程已经结束了business.setActStatus(ActStatus.pass);business.setTaskId("");business.setTaskNameId("");business.setTaskName("");business.setTodoUsers("");}// 流程处理完后,进行回调业务层wfMyBusinessService.updateById(business);if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business);}

5、效果图

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vscode篇---添加头部信息和debug查看explore expression

vscode篇—添加头部信息和debug看explore expression 1. 添加头部信息 具体步骤看下图 然后找到python.json 在这个文件中修改具体的头部信息 {// Place your snippets for python here. Each snippet is defined under a snippet name and has a prefix, body and // desc…

剖析 AI 对音乐的影响:创造还是毁灭之路

文章目录 &#x1f4d2;一、引言 &#x1f4d2;二、AI 降低音乐创作门槛 &#x1f680;&#xff08;一&#xff09;技术进步带来的便捷 &#x1f680;&#xff08;二&#xff09;对音乐普及的推动作用 &#x1f4d2;三、AI 重塑音乐创作流程 &#x1f680;&#xff08;一…

WebGL开发框架有哪些

WebGL开发框架是用于开发WebGL应用程序的Web框架。WebGL是一种基于JavaScript的API&#xff0c;可让Web浏览器呈现3D图形。WebGL开发框架可以帮助开发人员更轻松地创建复杂的3D图形应用程序。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

蓝桥杯14小白月赛题解

直接输出pi/ti,for遍历 #include <iostream> using namespace std; #define int long long int a,b,c ; double t1.00; signed main() {cin>>a;int an0;for(int i1;i<a;i){cin>>b>>c;if(t>c*1.00/b){tc*1.00/b;ani;} }cout<<an<<e…

Java红娘婚恋相亲交友系统小程序源码

红娘婚恋相亲交友小程序&#xff1a;遇见爱情&#xff0c;从指尖开始&#x1f496; &#x1f4f1; 掌中红娘&#xff0c;随时待命 &#x1f48c; 在这个数字化时代&#xff0c;爱情也迎来了它的新舞台——“红娘婚恋相亲交友小程序”。只需轻轻一点&#xff0c;你的专属红娘就…

移动打车项目

1.技术栈&#xff1a; AndroidJNIHTTPSlibeventmysql/redis高德地图 2.概要流程设计 1.注册 2.登录 3.司机地理位置上传更新 4.乘客地理位置上传更新 5.乘客下单流程 6.司机完成订单流程

【CSS in Depth 2 精译_018】3.1.2 逻辑属性 + 3.1.3 用好逻辑属性的简写形式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

vue 实现下拉框的数据是树状结构

页面显示效果 vue实现代码 <el-form-item label"公司名称" prop"comName"><el-select ref"select" v-model"queryParams.comName" placeholder"请选择公司名称" clearable size"small"change"handl…

微信小程序新建项目发现导航条不见了,及如何找回。

原因是现在小程序新建用的是 Skyline 渲染引擎 开启全局Skyline渲染引擎&#xff0c;因为Skyline不支持原生导航栏&#xff0c;所以就没显示原生导航栏了。 解决方法也很简单 app.json文件中的 “renderer”: “skyline”, 修改为 “renderer”:“webview”app.json文件中的…

【Linux杂货铺】期末总结篇4:shell编程

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️什么是Shell脚本&#xff1f;二. ⛳️Shell 入门三. ⛳️Shell 变量3.1 &#x1f514;变…

从 Icelake 到 Iceberg Rust

本文作者丁皓是Databend 研发工程师&#xff0c;也是 ASF Member&#xff0c; Apache OpenDAL PMC Chair &#xff0c;主要研究领域包括存储、自动化与开源。 太长不看 Icelake 已经停止更新&#xff0c;请改用 iceberg-rust。 Iceberg-rust 是一个由社区驱动的项目&#xff0…

RocketMQ~架构与工作流程了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

AI基于大模型语言存在的网络安全风险

目的&#xff1a; 随着大语言模型&#xff08;LLM&#xff09;各领域的广泛应用&#xff0c;我们迫切需要了解其中潜在的风险和威胁&#xff0c;及时进行有效的防御。 申明&#xff1a; AI技术的普及正当的使用大模型技术带来的便利&#xff0c;切勿使用与非法用途&#xff…

华为云SQLServer 慢日志查看

作者&#xff1a;梦莱 1、背景 华为云目前只支持 SQLServer 登录数据库&#xff0c;不支持查看慢日志。对于开启慢日志的实例&#xff0c;也只能通过将慢日志下载到本地 再远程连接目标实例数据库查看。本篇将华为云 SQLServer 实例出现资源异常&#xff0c;排查问题的方案整…

Qt Style Sheets-入门

Qt 样式表是一种强大的机制&#xff0c;允许您自定义小部件的外观&#xff0c;这是在通过子类化QStyle已经可行的基础上的补充。Qt 样式表的概念、术语和语法在很大程度上受到 HTML级联样式表 (CSS)的启发&#xff0c;但适用于小部件的世界。 概述 样式表是文本规范&#xff0…

客流统计系统优化景区服务流程,增强游客满意度

在当今旅游业蓬勃发展的时代&#xff0c;景区面临着越来越多的挑战和机遇。如何提供更优质、更高效的服务&#xff0c;满足游客日益增长的需求&#xff0c;成为了景区管理者们关注的焦点。客流统计系统作为一种创新的技术手段&#xff0c;正逐渐成为优化景区服务流程、增强游客…

【入门级】docker

开头处生动的描述一下”码头工人”吧&#xff1a;小鲸鱼&#xff08;登记处Registry&#xff1a;比如docker hub官方&#xff09;背着好多集装箱&#xff08;仓库repository&#xff1a;存放各种各样的镜像&#xff0c;一般存放的是一类镜像&#xff0c;这一类镜像中通过tag 版…

【C++】题解:P1259 黑白棋子的移动_递归+模拟_算法竞赛_洛谷

文章目录 P1259 黑白棋子的移动 题解题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示解题思路AC CodeEnd P1259 黑白棋子的移动 题解 Link&#xff1a;Luogu - P1259 题目描述 有 2 n 2n 2n 个棋子排成一行&#xff0c;开始为位置白子全部在左边&#xff0c;黑…

fastapi入门教程

☆ FASTAPI 前期准备 运行环境和安装 安装python环境安装fastapi安装uvicron 开始使用fastapi 01.第一个简单程序 from fastapi import FastAPI app FastAPI() app.get("/") def read_root():return {"Hello": "World"}运行&#xff1a;…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前&#xff0c;需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…