基于jeecg-boot的flowable流程历史记录显示修改

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

gitee源代码地址

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

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

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

历史记录增加开始与结束的显示,以方便用户查看。

1、前端修改,代码如下:

<el-card class="box-card" v-if="flowRecordList"><div slot="header" class="clearfix"><span class="el-icon-notebook-1">审批记录</span></div><el-col :span="16" :offset="4"><div class="block"><el-timeline><el-timeline-item v-for="(item,index ) in flowRecordList" :key="index" :icon="setIcon(item.finishTime)":color="setColor(item.finishTime)"><p style="font-weight: 700">{{item.taskName}}</p><el-card v-if="item.activityType === 'startEvent'" class="box-card" shadow="hover">{{ item.assigneeName }} 在 {{ item.createTime }} 发起流程</el-card><el-card v-if="item.activityType === 'userTask'" :body-style="{ padding: '10px' }"><label v-if="item.assigneeName" style="font-weight: normal;margin-right: 30px;">实际办理:{{item.assigneeName}}<el-tag type="info" size="mini">{{item.deptName}}</el-tag></label><label v-if="item.candidate" style="font-weight: normal;margin-right: 30px;">候选办理:{{item.candidate}}</label><label style="font-weight: normal">接收时间: </label><labelstyle="color:#8a909c;font-weight: normal">{{item.createTime}}</label><label v-if="item.finishTime" style="margin-left: 30px;font-weight: normal">办结时间: </label><labelstyle="color:#8a909c;font-weight: normal">{{item.finishTime}}</label><label v-if="item.duration" style="margin-left: 30px;font-weight: normal">耗时: </label><labelstyle="color:#8a909c;font-weight: normal">{{item.duration}}</label><p v-if="item.listFlowCommentDto" v-for="(commentitem,index ) in item.listFlowCommentDto" :key="index"><el-tag type="success" v-if="commentitem.type === '1'"> {{commentitem.comment}}</el-tag><el-form  v-if= "commentitem.type === '1' && fileitem.type === '1'  && item.listcommentFileDto.length>0" v-for="(fileitem,fileindex ) in item.listcommentFileDto" :key="fileindex"><el-form-item label="附件"  prop="listcommentFileDto"><j-upload  v-if="fileitem.type === '1'" v-model="fileitem.fileurl" :disabled = "true"  text="上传的文件" ></j-upload>                 </el-form-item></el-form>  <el-tag type="warning" v-if="commentitem.type === '2'"> {{"退回: "+ commentitem.comment}}</el-tag><el-form v-if= "commentitem.type === '2' && fileitem.type === '2'  && item.listcommentFileDto.length>0" v-for="(fileitem,fileindex ) in item.listcommentFileDto" :key="fileindex"><el-form-item label="附件"  prop="listcommentFileDto"><j-upload v-if="fileitem.type === '2'" v-model="fileitem.fileurl" :disabled = "true"  text="退回上传的文件" ></j-upload> </el-form-item></el-form>  <el-tag type="danger" v-if="commentitem.type === '3'">  {{"驳回: "+commentitem.comment}}</el-tag><el-form v-if= "commentitem.type === '3' && fileitem.type === '3'  && item.listcommentFileDto.length>0" v-for="(fileitem,fileindex ) in item.listcommentFileDto" :key="fileindex"><el-form-item label="附件"  prop="listcommentFileDto"><j-upload v-if="fileitem.type === '3'"  v-model="fileitem.fileurl" :disabled = "true"  text="驳回上传的文件" ></j-upload></el-form-item></el-form>  <el-tag type="success" v-if="commentitem.type === '4'">  {{commentitem.comment}}</el-tag><el-form  v-if= "commentitem.type === '4' && fileitem.type === '4'  && item.listcommentFileDto.length>0" v-for="(fileitem,fileindex ) in item.listcommentFileDto" :key="fileindex"><el-form-item label="附件"  prop="listcommentFileDto"><j-upload  v-if="fileitem.type === '4'" v-model="fileitem.fileurl" :disabled = "true"  text="委派上传的文件" ></j-upload>                 </el-form-item></el-form>  <el-tag type="success" v-if="commentitem.type === '5'">  {{commentitem.comment}}</el-tag>  <el-form v-if= "commentitem.type === '5' && fileitem.type === '5' && item.listcommentFileDto.length>0" v-for="(fileitem,fileindex ) in item.listcommentFileDto" :key="fileindex"><el-form-item label="附件"  prop="listcommentFileDto" ><j-upload v-model="fileitem.fileurl" :disabled = "true"  text="转办上传的文件" ></j-upload></el-form-item></el-form>  <el-tag type="warning" v-if="commentitem.type === '7'"> {{"撤回: "+commentitem.comment}}</el-tag>  <!--撤回信息--><el-tag type="warning" v-if="commentitem.type === '6'"> {{commentitem.comment}}</el-tag>  <!--终止信息--><el-tag type="warning" v-if="commentitem.type === '8'"> {{commentitem.comment}}</el-tag>  <!--跳过信息--><el-tag type="success" v-if="commentitem.type === '9'"> {{commentitem.comment}}</el-tag>  <!--前加签--><el-tag type="success" v-if="commentitem.type === '10'"> {{commentitem.comment}}</el-tag>  <!--后加签--><el-tag type="success" v-if="commentitem.type === '11'"> {{commentitem.comment}}</el-tag>  <!--多实例加签--><el-tag type="success" v-if="commentitem.type === '12'"> {{commentitem.comment}}</el-tag>  <!--跳转信息--></p></el-card><el-card v-if="item.activityType === 'endEvent'" class="box-card" shadow="hover">{{ item.createTime }} 流程结束</el-card></el-timeline-item></el-timeline></div></el-col></el-card>

2、后端修改

/*** 流程历史流转记录* add by nbacheng* @param  procInsId 流程实例Id, 流程发布id, 任务id* @return*/@Overridepublic Result flowRecord(String procInsId,String deployId, String businessKey, String taskId, String category) {Map<String, Object> map = new HashMap<String, Object>();if (StringUtils.isNotBlank(procInsId)) {List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).activityTypes(CollUtil.newHashSet(BpmnXMLConstants.ELEMENT_EVENT_START, BpmnXMLConstants.ELEMENT_EVENT_END, BpmnXMLConstants.ELEMENT_TASK_USER)).orderByHistoricActivityInstanceStartTime().desc().orderByHistoricActivityInstanceEndTime().desc().list();List<FlowTaskDto> hisFlowList = new ArrayList<>();// 获取流程实例HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).includeProcessVariables().singleResult();String startUserId = historicProcIns.getStartUserId();for (HistoricActivityInstance histIns : list) {FlowTaskDto flowTask = new FlowTaskDto();if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(histIns.getActivityType())) {SysUser startUser = iFlowThirdService.getUserByUsername(startUserId);flowTask.setAssigneeId(startUser.getUsername());flowTask.setAssigneeName(startUser.getRealname());flowTask.setCreateTime(histIns.getStartTime());flowTask.setFinishTime(histIns.getEndTime());flowTask.setActivityType(histIns.getActivityType());}if (BpmnXMLConstants.ELEMENT_EVENT_END.equals(histIns.getActivityType())) {flowTask.setCreateTime(histIns.getStartTime());flowTask.setFinishTime(histIns.getEndTime());flowTask.setActivityType(histIns.getActivityType());}if (StringUtils.isNotBlank(histIns.getTaskId())) {flowTask.setTaskId(histIns.getTaskId());flowTask.setTaskName(histIns.getActivityName());flowTask.setCreateTime(histIns.getStartTime());flowTask.setFinishTime(histIns.getEndTime());flowTask.setActivityType(histIns.getActivityType());if (StringUtils.isNotBlank(histIns.getAssignee())) {SysUser sysUser = iFlowThirdService.getUserByUsername(histIns.getAssignee());if(sysUser !=null) {flowTask.setAssigneeId(sysUser.getUsername());flowTask.setAssigneeName(sysUser.getRealname());List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(histIns.getAssignee());flowTask.setDeptName(CollUtil.join(departNamesByUsername,","));}}// 展示审批人员List<HistoricIdentityLink> linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId());StringBuilder stringBuilder = new StringBuilder();for (HistoricIdentityLink identityLink : linksForTask) {if ("candidate".equals(identityLink.getType())) {if (StringUtils.isNotBlank(identityLink.getUserId())) {SysUser sysUser = iFlowThirdService.getUserByUsername(identityLink.getUserId());stringBuilder.append(sysUser.getRealname()).append(",");}if (StringUtils.isNotBlank(identityLink.getGroupId())) {List<SysRole> allRole = iFlowThirdService.getAllRole();SysRole sysRole = allRole.stream().filter(o -> StringUtils.equals(identityLink.getGroupId(), o.getId())).findAny().orElse(new SysRole());stringBuilder.append(sysRole.getRoleName()).append(",");}}}if (StringUtils.isNotBlank(stringBuilder)) {flowTask.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1));}flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis()));// 获取意见评论内容List<Comment> commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId());List<FlowCommentDto> listFlowCommentDto = new ArrayList<FlowCommentDto>();commentList.forEach(comment -> {if (histIns.getTaskId().equals(comment.getTaskId())) {//flowTask.setComment(FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build());//FlowCommentDto flowcommentDto = FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build();FlowCommentDto flowcommentDto = new FlowCommentDto();flowcommentDto.setType(comment.getType());flowcommentDto.setComment(comment.getFullMessage());listFlowCommentDto.add(flowcommentDto);}});flowTask.setListFlowCommentDto(listFlowCommentDto);//获取附件List<Attachment> commentfileList = taskService.getProcessInstanceAttachments(histIns.getProcessInstanceId());List<FlowCommentFileDto> listcommentFileDto =  new ArrayList<FlowCommentFileDto>();commentfileList.forEach(commentfile -> {if (histIns.getTaskId().equals(commentfile.getTaskId())) {FlowCommentFileDto flowcommenfiletDto = new FlowCommentFileDto();flowcommenfiletDto.setType(commentfile.getType());flowcommenfiletDto.setFileurl(commentfile.getUrl());listcommentFileDto.add(flowcommenfiletDto);}});flowTask.setListcommentFileDto(listcommentFileDto);// 获取历史任务节点表单数据值List<HistoricVariableInstance> listHistoricVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(procInsId).taskId(histIns.getTaskId()).list();  Map<String, Object> variables = new HashedMap<String, Object>();Map<String, Object> formconf = new HashedMap<String, Object>();for(HistoricVariableInstance historicVariableInstance:listHistoricVariableInstance) {variables.put(historicVariableInstance.getVariableName(), historicVariableInstance.getValue());}formconf.put("formValue", variables);// 获取历史任务节点表单参数if(Objects.nonNull(histIns.getTaskId())) {HistoricTaskInstance taskIns = historyService.createHistoricTaskInstanceQuery().taskId(histIns.getTaskId()).includeIdentityLinks().includeProcessVariables().includeTaskLocalVariables().finished().singleResult();if (Objects.nonNull(taskIns)) {{String formId = taskIns.getFormKey();SysForm sysForm = sysDeployFormService.selectCurSysDeployForm(formId, deployId, taskIns.getTaskDefinitionKey());if (Objects.nonNull(sysForm)) {formconf.put("config", JSONObject.parseObject(sysForm.getFormContent()).get("config"));formconf.put("list", JSONObject.parseObject(sysForm.getFormContent()).get("list"));}}}}    flowTask.setTaskFormValues(formconf);}hisFlowList.add(flowTask);}map.put("flowList", hisFlowList);}if (Objects.nonNull(category) && category.equalsIgnoreCase("online") && StringUtils.isNotBlank(businessKey)) {// 获取online数据表单配置LambdaQueryWrapper<FlowMyOnline> flowMyOnlineLambdaQueryWrapper = new LambdaQueryWrapper<>();flowMyOnlineLambdaQueryWrapper.eq(FlowMyOnline::getDataId, businessKey);//以后这里还要加上onlineIdFlowMyOnline online = flowMyOnlineService.getOne(flowMyOnlineLambdaQueryWrapper);if (Objects.nonNull(online)) {Map<String, Object> onlCgformHeadMap = flowOnlCgformHeadService.getOnlCgformHeadByFormId(online.getOnlineId());map.put("onlineConfig", onlCgformHeadMap.get("formData"));map.put("onlineId", online.getOnlineId());}}else if (Objects.nonNull(category) && StringUtils.isNotBlank(businessKey) && !Objects.equals(businessKey, "null") && (category != "online")) { // 获取初始化自定义表单FlowMyBusiness business = flowMyBusinessService.getByDataId(businessKey);String serviceImplName = business.getServiceImplName();FlowCallBackServiceI flowCallBackService = (FlowCallBackServiceI) SpringContextUtils.getBean(serviceImplName);// 流程处理完后,进行回调业务层if (flowCallBackService!=null){Object businessDataById = flowCallBackService.getBusinessDataById(businessKey);map.put("formData",businessDataById);map.put("routeName", business.getRouteName());}}else {if (StringUtils.isNotBlank(deployId)) {//获取当前节点的初始化表单if(Objects.nonNull(taskId)) {HistoricTaskInstance taskIns = historyService.createHistoricTaskInstanceQuery().taskId(taskId).includeIdentityLinks().includeProcessVariables().includeTaskLocalVariables().singleResult();if (Objects.nonNull(taskIns)) {String formId = taskIns.getFormKey();SysForm sysForm = sysDeployFormService.selectCurSysDeployForm(formId, deployId, taskIns.getTaskDefinitionKey());if (Objects.nonNull(sysForm)) {map.put("taskFormData", JSONObject.parseObject(sysForm.getFormContent()));}}}else {SysForm sysForm = sysDeployFormService.selectSysDeployFormByDeployId(deployId);if (Objects.isNull(sysForm)) {return Result.error("请先配置流程表单");}map.put("formData", JSONObject.parseObject(sysForm.getFormContent()));}}}if(isStartUserNode(taskId)) {map.put("isStartUserNode", true);}return Result.OK(map);}

3、效果图

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

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

相关文章

文件上传漏洞

条件竞争 条件竞争型的漏洞在很多漏洞中都有涉及&#xff0c;在文件上传中造成这种漏洞的原因是代码中是先保存上传的文件在服务器上&#xff0c;然后验证再删除的&#xff0c;这就会造成攻击者可以利用文件被保存在服务器上与被删除的时间间隙来访问文件&#xff0c;然后重新生…

基于Java+SpringBoot+Vue校园求职招聘系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

OpenCV实现图像的混合

原理 这其实也是加法&#xff0c;但是不同的是两幅图像的权重不同&#xff0c;这就会给人一种混合或者透明的感觉。 图像混合的计算公式如下: g(x)(1-a)f0(x) af1(x) 通过修改α的值(0→1) &#xff0c;可以实现非常炫酷的混合。 现在我们把两幅图混合在一起。 第一幅图…

分布式多级缓存

例子&#xff08;测试环境&#xff09; 项目结构图 运行反向代理服务器也就是负责反向代理到三个nginx的nginx&#xff0c;该nignx也负责前端页面的跳转。 该nginx的conf为下: 突出位置就是该nginx需要反向代理的其他nginx的IP和端口。 Lua语法 linux安装Lua #安装lua环境 …

持安科技入选数说安全《2023中国网络安全市场年度报告》

近日&#xff0c;网络安全产业研究平台数说安全发布《2023中国网络安全市场年度报告》&#xff0c;报告共分为158页核心报告&#xff0c;及番外篇《网安融资新星及融资过亿企业介绍》&#xff0c;作为以甲方身份创业的零信任办公安全明星企业&#xff0c;持安科技以网安融资新星…

SQL数据库查询超时,查询数据库的哪些表被上锁的语句

1.异常提示 2.表语句 2.1 查询锁表的语句 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECT * 若是下面没有显示内容&#xff0c;说明当前没有锁住的表 2.2若是有显示锁住的表&#…

STM32移植FAT文件系统

所谓“移植”&#xff0c;就是打通FAT源码和物理设备之间的软件接口。 FAT源码早就被公益组织给写好了&#xff0c;直接下载源码。但是FAT作为顶层应用程序&#xff0c;它需要面对的底层物理设备是不确定的&#xff0c;那么底层的物理设备驱动程序就需要程序员来自己写。物理设…

18 矩阵置0

矩阵置0 题解1 首行首列做标志记录&#xff08;原地改数组&#xff09;题解2 位计算 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 …

无涯教程-JavaScript - CUMPRINC函数

描述 CUMPRINC函数返回start_period和end_period之间的贷款累计本金。 语法 CUMPRINC (rate, nper, pv, start_period, end_period, type)争论 Argument描述Required/OptionalRateThe interest rate.RequiredNperThe total number of payment periods.RequiredPvThe presen…

Wireshark 用命令行分析数据包

1&#xff0c;那些情况需要使用命令行 Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息&#xff0c;最后只显示相关数据&#xff0c;比如用单独一行来显示IP地址。命令行工具适用于过滤数据包捕获文件&#xff0c;并提供结果给另一个支持UNIX管道的工具…

手动开发-简单的Spring基于注解配置的程序--源码解析

文章目录 设计注解$设计容器 $#完整代码# 在前文中 《手动开发-简单的Spring基于XML配置的程序–源码解析》&#xff0c;我们是从XML配置文件中去读取bean对象信息&#xff0c;再在自己设计的容器中进行初始化&#xff0c;属性注入&#xff0c;最后通过getBean()方法进行返回。…

Kafka/Spark-01消费topic到写出到topic

1 Kafka的工具类 1.1 从kafka消费数据的方法 消费者代码 def getKafkaDStream(ssc : StreamingContext , topic: String , groupId:String ) {consumerConfigs.put(ConsumerConfig.GROUP_ID_CONFIG , groupId)val kafkaDStream: InputDStream[ConsumerRecord[String, Strin…

WebRTC中 setup:actpass、active、passive

1、先看一下整个DTLS的流程 setup:actpass、active、passive就发生在Offer sdp和Anser SDP中 Offer的SDP是setup:actpass,这个是服务方&#xff1a; v0\r o- 1478416022679383738 2 IN IP4 127.0.0.1\r s-\r t0 0\r agroup:BUNDLE 0 1\r aextmap-allow-mixed\r amsid-semanti…

在MySQL客户端使用Tab健进行命令补全

在MySQL客户端中&#xff0c;你可以使用Tab键进行命令补全&#xff0c;这将提高我们的效率&#xff0c;这与Linux命令行中的行为类似。例如&#xff0c;如果你输入SEL然后按Tab键&#xff0c;MySQL客户端会自动补全为SELECT。 然而&#xff0c;需要注意的是&#xff0c;这个功能…

Unity Asset Bundle Browser 工具

Unity Asset Bundle Browser 工具 您可以在 Unity 项目中使用 Asset Bundle Browser 工具能够查看和编辑资源包的配置。 有关更多信息&#xff0c;请参阅 Unity Asset Bundle Browser 文档。 注意&#xff1a;此工具是不受支持的实用程序。查看极大的资源包可能会导致性能下…

谁在为网络安全制造标尺?

“我们想帮助企业往后退一步&#xff0c;去全局的看一下自己的安全能力建设水平如何&#xff0c;以及在当下的阶段最应该做的安全建设是什么&#xff1f; ” 度量&#xff0c;对应的是更清晰的认知。而对企业安全而言&#xff0c;这种认知&#xff0c;也更在成为一把新的标尺…

《AI辞职信一键生成》告别凡俗套路,展现独特个性!

在这个科技日新月异的时代&#xff0c;我们的生活被各种应用软件深深地渗透。其中&#xff0c;讯飞星火AI大模型的应用无疑是一种创新和突破。最近&#xff0c;我有幸体验了一款名为《AI辞职信一键生成》的web应用&#xff0c;它以其独特的功能和出色的用户体验&#xff0c;让我…

算法-88.合并两个有序数组-⭐

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

javaee springMVC 一个案例

项目结构 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

MongoDB简介以及安装

文章目录 1. MongoDB简介2. NoSQL简介3. MongoDB安装 1. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档数据库模型。它以BSON&#xff08;Binary JSON&#xff09;格式存储数据&#xff0c;支持动态模式和灵活的查询语言。MongoDB具有以下特点&#xff1a; 文…