应用开发平台集成工作流系列之12——流程导航功能设计与实现

news2024/11/23 12:41:31

背景

流程模板主要是用于流程建模的,对于业务用户而言,需要一个业务流程的导航页,分门别类展示业务流程清单,用于发起新的流程。
并且需要根据当前用户过滤,只显示有权限发起的流程。

业务流程类别的处理

一个企业的业务流程,视企业规模的大小,会有十几个、几十个甚至上百个,如不进行分类,都混放在一起,则难以查找和使用。从管理角度,应该为业务流程分类。

业务流程类别只需要一个名称就好了,不需要额外属性,这种情况下,使用平台数据字典,新建一个字典类型,比新建一个实体要更便捷。
image.png

新建业务流程导航控制器

在模块businessflow下新建一个navigate的控制器,暴露一个get方法,返回流程数据

    /**
     * 获取流程模板及其分类
     */
    @GetMapping("/")
    @SystemLog(value = "流程一览-查询数据")
    @PreAuthorize("hasPermission(null,'businessflow:navigate:query')")
    public ResponseEntity<Result> get() {


        //获取当前用户拥有启动权限流程权限接口
        List<WorkflowTemplate> flowTemplateList = flowTemplateService.listByPermission();

        // 为空无需继续处理,直接返回即可
        if (CollectionUtils.isEmpty(flowTemplateList)) {
            return ResultUtil.success();
        }

        // 获取分类
        List<DictionaryItem> categoryList = dictionaryTypeService.getItem("ProcessDefinitionCategory");


        // 组装数据
        List<WorkflowTemplateCategoryVO> data = new ArrayList<>();
        for (int i = 0; i < categoryList.size(); i++) {
            WorkflowTemplateCategoryVO category = new WorkflowTemplateCategoryVO();
            String categoryCode = categoryList.get(i).getCode();
            category.setCode(categoryCode);
            category.setName(categoryList.get(i).getName());
            List<WorkflowTemplate> childTemplateList = flowTemplateList.stream()
                    .filter(x -> x.getCategory().equals(categoryCode)).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(childTemplateList)) {
                List<WorkflowTemplateVO> childList =mapperFacade.mapAsList(childTemplateList, WorkflowTemplateVO.class);
                category.setWorkflowTemplateVOList(childList);
                // 只有存在业务流程时才添加分类
                data.add(category);
            }
        }
        return ResultUtil.success(data);
    }

新建业务流程导航前端页面

新建导航页,效果图如下:
image.png
实现源码如下:

<template>
  <el-collapse v-model="activeNames" @change="handleChange">
    <el-collapse-item
      v-for="category in templateData"
      :key="category.code"
      :name="category.code"
      class="m-3"
    >
      <template #title>
        <div class="m-3 font-bold font-black" style="font-size: 18px"> {{ category.name }}</div>
      </template>
      <el-button
        v-for="template in category.workflowTemplateVOList"
        :key="template.code"
        type="primary"
        class="m-3"
        @click="createFlow(template.code, template.name, template.processDefinitionId)"
        >{{ template.name }}</el-button
      >
    </el-collapse-item>
  </el-collapse>
</template>

<script lang="ts">
export default {
  name: 'FlowNavigate',
  data() {
    return {
      activeNames: [],
      // 流程模板数据
      templateData: []
    }
  },
  mounted() {
    this.$api.businessflow.navigate.get().then((res) => {
      this.templateData = res.data
      const nameArray = this.templateData.map((item) => {
        return item.code
      })
      this.activeNames = nameArray
    })
  },
  methods: {
    handleChange(val) {
      console.log(val)
    },
    createFlow(processDefinitionKey, processDefinitionName, processDefinitionId) {
      this.$router.push({
        name: 'flowCreate',
        query: { processDefinitionKey, processDefinitionName, processDefinitionId }
      })
    }
  }
}
</script>

<style scoped></style>

发起流程

在导航页面点击对应的流程模板按钮,发起新的流程,效果图如下:
image.png

源码如下:

<template>
  <el-container>
    <el-header height="35" style="padding: 0">
      <el-row style="background-color: #1890ff; padding: 0; align-items: center">
        <span class="title">{{ taskData.processDefinitionName }}</span>
        <el-button-group style="position: absolute; right: 0">
          <el-button v-show="taskData.isSaved" type="primary" @click="commit">提交</el-button>
          <el-button v-show="taskData.isSaved" type="primary" @click="jump">跳转</el-button>
          <el-button type="primary" @click="save">保存</el-button>
          <el-button type="primary" @click="viewDiagram">流程图</el-button>
          <el-button type="primary" @click="close">关闭</el-button>
        </el-button-group>
        <FlowPreview ref="flowPreview" />
      </el-row>
    </el-header>
    <el-main style="padding: 0">
      <commit ref="commit" :task-id="taskData.taskId" default-comment="发起申请" @success="close" />
      <jump ref="jump" default-comment="跳转" @success="close" />
      <component :is="taskData.processDefinitionKey" ref="flowComponent" @save="saved" />
    </el-main>
  </el-container>
</template>

<script>
import Commit from '@/modules/workflow/view/task/commit.vue'
import Jump from '../task/jump.vue'
import * as flowComponent from '@/modules/businessflow/view/dictionary/list'
import { flowMixin } from '@/mixin/flowMixin'
export default {
  name: 'FlowCreate',
  components: { ...flowComponent, Commit, Jump },
  mixins: [flowMixin],
  data() {
    return {}
  },
  mounted() {
    this.taskData.processDefinitionKey = this.$route.query.processDefinitionKey
    this.taskData.processDefinitionName = this.$route.query.processDefinitionName
    this.taskData.processDefinitionId = this.$route.query.processDefinitionId
    this.$nextTick(function () {
      this.$refs.flowComponent.add(this.taskData.processDefinitionId)
    })
  },
  methods: {
    viewDiagram() {
      this.$refs.flowPreview.show(this.taskData.processDefinitionId)
    },
    saved(processInstanceId) {
      this.taskData.isSaved = true
      this.taskData.processInstanceId = processInstanceId
    }
  }
}
</script>

<style scoped>
.title {
  float: left;
  color: #fff;
  margin: 10px 20px;
}
</style>

流程发起权限控制

该功能实际是辅助流程导航的,一个企业里流程可能有数十条或数百条,不同员工的权限是不同的,在流程导航中只显示该员工拥有的发起权限的流程即可。
这里的流程发起权限,实际跟系统的菜单非常类似,属于功能权限的范畴,因此复用的平台的权限控制功能。
image.png
在平台权限项维护的地方,新增类别“流程”,用于业务流程权限控制。
每条业务流程对应一条权限项。
对于大多数日常流程,如请假流程、报销流程,对所有人开放,新建一个角色,叫通用流程发起,为该角色设置流程启动权限。
对于一些需要特殊权限的流程,可以分组建立角色或为每条流程独立建一个角色。

开发平台资料

平台名称:一二三开发平台
简介: 企业级通用开发平台
设计资料:csdn专栏
开源地址:Gitee
开源协议:MIT
开源不易,欢迎收藏、点赞、评论。

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

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

相关文章

OCR -- 文本检测

目标检测&#xff1a; 不仅要解决定位问题&#xff0c;还要解决目标分类问题&#xff0c;给定图像或者视频&#xff0c;找出目标的位置&#xff08;box&#xff09;&#xff0c;并给出目标的类别&#xff1b; 文本检测&#xff1a; 给定输入图像或者视频&#xff0c;找出文本的…

基于 SpringBoot+Vue 的口腔管理平台,附源码,数据库

第一章 简介 本项目&#xff0c;是基于 Java SpringBoot 开发的&#xff0c;主要功能包括首页、个人中心、病例就诊信息管理、复查提醒管理、预约挂号管理、我的收藏管理、订单管理&#xff0c;前台首页&#xff1b;首页、牙齿保健产品、牙齿保护小知识、留言反馈、个人中心、…

React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

React&#xff08;react18&#xff09;中组件通信05——redux ➕ react-redux&#xff08;含数据共享&#xff09; 1. 前言1.1 React中组件通信的其他方式1.2 介绍React-Redux1.2.1 简单介绍React-Redux1.2.2 官网 1.3 安装react-redux 2. 简单改写redux的例子2.1 提供store2.2…

【从0学习Solidity】37. 数字签名 Signature

【从0学习Solidity】37. 数字签名 Signature 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0…

提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复

在计算机使用过程中&#xff0c;我们可能会遇到各种稀奇古怪的问题。其中&#xff0c;msvcp140.dll 文件丢失算是比较常见的一种。那么&#xff0c;究竟什么是 msvcp140.dll 文件&#xff1f;它为什么会丢失&#xff1f;我们又该如何解决这个问题呢&#xff1f;本文将围绕这些问…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

vue指令(代码部分)

注&#xff1a;此部分为学习uni-app时接触到的vue <template><view><view>当前标题&#xff1a;{{title}}</view><view> {{num}}</view><view>{{arr[2]}}</view><view>{{obj}}</view><view>{{obj.name}}&l…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…

网络上怎么赚点零花钱

现代物质社会中&#xff0c;我们常常会被琐碎的开销困扰。无论是衣食住行还是休闲娱乐&#xff0c;总有一些额外的花费&#xff0c;使我们不得不时常思索如何赚点零花钱。而现如今&#xff0c;随着互联网的飞速发展&#xff0c;我们有了更多的机会通过网络来实现这个目标。现在…

Centos7做回收站功能-防止误删除

Centos7做回收站功能&#xff0c;就算误删了文件&#xff0c;也可以还原回来 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先创建一个回收站的目录&#xff08;我在/data下&#xff09; 在大磁盘的目录下创建.trash文件夹 mkdir -p /data/.trash 2.在/root/.bas…

Vue之ElementUI实现登陆及注册

目录 ​编辑 前言 一、ElementUI简介 1. 什么是ElementUI 2. 使用ElementUI的优势 3. ElementUI的应用场景 二、登陆注册前端界面开发 1. 修改端口号 2. 下载ElementUI所需的js依赖 2.1 添加Element-UI模块 2.2 导入Element-UI模块 2.3 测试Element-UI是否能用 3.编…

Nodejs基于Vue.js编程语言在线学习平台的设计与实现5y4p2

本编程语言在线学习平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优…

【08】FISCOBCOS一键部署【07+08即可完成一键部署,默认生成两个节点的链】

官方文档https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html#id1 一键部署 ​ 一键部署可以在 同机 快速搭建WeBASE管理台环境&#xff0c;方便用户快速体验WeBASE管理平台。 ​ 一键部署会搭建&#xff1a;节点&#xff08;FISCO-BCOS 2.0&#xff09;…

SQL数据库基础

目录 1.SQL分类 2.SQL-DDL 2.1 数据库操作 查询 创建 删除 使用某个数据库 2.2 数据表操作 创建表 查询表 修改表 3.SQL-DML(增删改) 3.1 插入 3.2 修改 3.3 删除 4.SQL-DQL(查) 4.1 基础查询 4.2 条件查询 4.3 聚合函数查询 4.4 分组查询 4.5 排序查询 …

递归法求最大公约数

如果a或b不是不是正整数&#xff0c;则函数返回-1。 主程序样例&#xff1a; 这里给出主函数及对Gcd函数的调用样例&#xff1a; #include <stdio.h> int Gcd(int a, int b); int main() { int a, b, c; scanf(“%d %d”, &a, &b); c Gcd(a,b); if (c ! -1) {…

Python实战实例代码-网络爬虫-数据分析-机器学习-图像处理

Python实战实例代码-网络爬虫-数据分析-机器学习-图像处理 Python实战实例代码1. 网络爬虫1.1 爬取网页数据1.2 爬取图片1.3 爬取动态数据&#xff08;使用Selenium&#xff09; 2. 数据分析2.1 数据清洗2.2 数据变换2.3 数据聚合 3. 机器学习3.1 线性回归3.2 随机森林3.3 K-Me…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

结构体,联合体与位段

1.结构体的内存对齐(计算结构体的大小) 1.1 为什么需要结构体内存对齐? 原因1:平台原因 不是所有的硬件平台都能访问任意地址上的任意数据的&#xff1b;某些平台只能在某些地址处取得某些特定类型的数据&#xff0c;否则抛出硬件异常。 比如&#xff0c;当一个平台要取一个…