当前位置: 首页 > news >正文

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(一)

更多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、后端增加所有任务列表包括导出,代码如下:

@Overridepublic TableDataInfo<WfTaskVo> selectPageAllProcessList(ProcessQuery processQuery, PageQuery pageQuery) {Page<WfTaskVo> page = new Page<>();HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().orderByProcessInstanceStartTime().desc();// 构建搜索条件ProcessUtils.buildProcessSearch(historicProcessInstanceQuery, processQuery);int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.listPage(offset, pageQuery.getPageSize());page.setTotal(historicProcessInstanceQuery.count());List<WfTaskVo> taskVoList = new ArrayList<>();for (HistoricProcessInstance hisIns : historicProcessInstances) {WfTaskVo taskVo = new WfTaskVo();// 获取流程状态HistoricVariableInstance processStatusVariable = historyService.createHistoricVariableInstanceQuery().processInstanceId(hisIns.getId()).variableName(ProcessConstants.PROCESS_STATUS_KEY).singleResult();String processStatus = null;if (ObjectUtil.isNotNull(processStatusVariable)) {processStatus = Convert.toStr(processStatusVariable.getValue());}// 兼容旧流程if (processStatus == null) {processStatus = ObjectUtil.isNull(hisIns.getEndTime()) ? ProcessStatus.RUNNING.getStatus() : ProcessStatus.COMPLETED.getStatus();}Map<String, Object>  processVariables = hisIns.getProcessVariables();if(processVariables.containsKey("dataId")) {taskVo.setDataId(processVariables.get("dataId").toString());}taskVo.setProcessStatus(processStatus);taskVo.setCreateTime(hisIns.getStartTime());taskVo.setFinishTime(hisIns.getEndTime());taskVo.setProcInsId(hisIns.getId());// 计算耗时if (Objects.nonNull(hisIns.getEndTime())) {taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime()));} else {taskVo.setDuration(DateUtils.getDatePoor(DateUtils.getNowDate(), hisIns.getStartTime()));}// 流程部署实例信息Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(hisIns.getDeploymentId()).singleResult();taskVo.setDeployId(hisIns.getDeploymentId());taskVo.setProcDefId(hisIns.getProcessDefinitionId());taskVo.setProcDefName(hisIns.getProcessDefinitionName());taskVo.setProcDefVersion(hisIns.getProcessDefinitionVersion());taskVo.setCategory(deployment.getCategory());// 当前所处流程List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).includeIdentityLinks().list();// 任务列表if (CollUtil.isNotEmpty(taskList)) {taskVo.setTaskName(taskList.stream().map(Task::getName).filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));taskVo.setTaskId(taskList.get(0).getId());} else {List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list();taskVo.setTaskId(historicTaskInstance.get(0).getId());}taskVoList.add(taskVo);}page.setRecords(taskVoList);return TableDataInfo.build(page);}@Overridepublic List<WfTaskVo> selectAllProcessList(ProcessQuery processQuery) {HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery().orderByProcessInstanceStartTime().desc();// 构建搜索条件ProcessUtils.buildProcessSearch(historicProcessInstanceQuery, processQuery);List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery.list();List<WfTaskVo> taskVoList = new ArrayList<>();for (HistoricProcessInstance hisIns : historicProcessInstances) {WfTaskVo taskVo = new WfTaskVo();taskVo.setCreateTime(hisIns.getStartTime());taskVo.setFinishTime(hisIns.getEndTime());taskVo.setProcInsId(hisIns.getId());// 计算耗时if (Objects.nonNull(hisIns.getEndTime())) {taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime()));} else {taskVo.setDuration(DateUtils.getDatePoor(DateUtils.getNowDate(), hisIns.getStartTime()));}// 流程部署实例信息Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(hisIns.getDeploymentId()).singleResult();taskVo.setDeployId(hisIns.getDeploymentId());taskVo.setProcDefId(hisIns.getProcessDefinitionId());taskVo.setProcDefName(hisIns.getProcessDefinitionName());taskVo.setProcDefVersion(hisIns.getProcessDefinitionVersion());taskVo.setCategory(deployment.getCategory());// 当前所处流程List<Task> taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).includeIdentityLinks().list();if (CollUtil.isNotEmpty(taskList)) {taskVo.setTaskName(taskList.stream().map(Task::getName).filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));}taskVoList.add(taskVo);}return taskVoList;}

2、接口部分

 /***  所有的流程*/@SaCheckPermission("workflow:process:allList")@GetMapping(value = "/allList")public TableDataInfo<WfTaskVo> allProcessList(ProcessQuery processQuery, PageQuery pageQuery) {return processService.selectPageAllProcessList(processQuery, pageQuery);}/*** 导出所有流程列表*/@SaCheckPermission("workflow:process:allExport")@Log(title = "所有流程", businessType = BusinessType.EXPORT)@PostMapping("/allExport")public void allExport(@Validated ProcessQuery processQuery, HttpServletResponse response) {List<WfTaskVo> list = processService.selectAllProcessList(processQuery);List<WfOwnTaskExportVo> listVo = BeanUtil.copyToList(list, WfOwnTaskExportVo.class);for (WfOwnTaskExportVo exportVo : listVo) {exportVo.setStatus(ObjectUtil.isNull(exportVo.getFinishTime()) ? "进行中" : "已完成");}ExcelUtil.exportExcel(listVo, "所有流程", WfOwnTaskExportVo.class, response);}

3、效果图如下:

下一节讲前端部分。

相关文章:

  • Flask快速入门(路由、CBV、请求和响应、session)
  • 数据结构-算法和算法分析
  • Kafka 负载均衡挑战及解决思路
  • 深入理解预处理
  • Microsoft Edge 查看已保存账号的密码
  • 排序算法及源代码
  • OpenCV--形态学
  • gitlab-cicd-k8s
  • C++ | Leetcode C++题解之第168题Excel表列名称
  • 华为云与AWS负载均衡服务深度对比:性能、成本与可用性
  • 嵌入式期末复习--补充(答案来自文心一言)
  • 基准电压端口,需要外接退耦电容为什么
  • C++入门二-重载和引用
  • MybatisPlus 调用 原生SQL
  • 百度一下首页制作(HTML+CSS)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • angular2开源库收集
  • docker-consul
  • leetcode讲解--894. All Possible Full Binary Trees
  • miaov-React 最佳入门
  • MySQL QA
  • PHP的Ev教程三(Periodic watcher)
  • text-decoration与color属性
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 计算机在识别图像时“看到”了什么?
  • 简单易用的leetcode开发测试工具(npm)
  • 利用jquery编写加法运算验证码
  • 使用docker-compose进行多节点部署
  • 物联网链路协议
  • 用Canvas画一棵二叉树
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​渐进式Web应用PWA的未来
  • ​浅谈 Linux 中的 core dump 分析方法
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)STL算法之遍历容器
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (不用互三)AI绘画工具应该如何选择
  • (三)c52学习之旅-点亮LED灯
  • (十三)Flask之特殊装饰器详解
  • (已解决)什么是vue导航守卫
  • (原)Matlab的svmtrain和svmclassify
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)创业的注意事项
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **CentOS7安装Maven**
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • . Flume面试题
  • .NET 8 跨平台高性能边缘采集网关
  • .Net Core 中间件与过滤器
  • .Net Core中Quartz的使用方法