1. 为什么选择Vue3+低代码构建OA工作流
企业OA系统最让人头疼的就是流程设计。传统开发模式下,每次业务变更都需要前端改页面、后端改接口,开发周期长、维护成本高。而低代码流程设计器的出现,让业务人员也能参与流程配置,这正是Easy Process的核心价值。
我去年接手过一个政府部门的OA系统改造项目,他们原有的工作流引擎基于某商业软件,每次调整审批流程都要找原厂工程师,简单加个抄送节点报价2万起步。后来我们用Vue3+自研设计器重构后,现在办公室主任自己就能拖拽配置出差审批流程。
Vue3特别适合这类场景的三个原因:
- 组合式API:流程节点的校验逻辑、属性配置可以封装成独立hook
- 依赖注入:跨层级组件共享流程数据时不用再层层传递props
- TypeScript支持:流程节点类型、配置项都能获得完善的类型提示
实测下来,基于Easy Process的设计器开发效率提升明显。上周我们给电商客户做的退货审批流程,从需求对接到上线只用了3天,其中2天是在和他们业务部门确认流程细节,真正开发时间不到8小时。
2. 快速上手Easy Process设计器
2.1 环境准备与项目初始化
先确保本地有Node 14+环境,推荐用pnpm管理依赖(实测安装速度比npm快60%):
# 克隆项目 git clone https://gitee.com/quxiou-code/easy-process.git cd easy-process # 安装依赖(国内用户建议加上淘宝镜像) pnpm install --registry=https://registry.npmmirror.com # 启动开发服务器 pnpm dev启动后会看到仿钉钉的流程设计界面。这里有个小技巧:浏览器访问http://localhost:3000/?mock=1会自动加载测试数据,方便直接调试。
2.2 核心概念快速理解
设计器里有几个关键概念需要掌握:
- 节点类型:发起人(start)、审批人(approver)、条件(condition)等
- 节点配置:每个节点有自己的属性抽屉(比如审批人可设置多人会签)
- 流程结构:通过childNode和conditionNodes实现分支逻辑
举个例子,假设我们要做个请假审批流程:
- 发起人节点设置"申请人信息"
- 条件节点判断"请假天数>3天?"
- 分支1:小于等于3天直接到部门经理审批
- 分支2:大于3天需要先总监审批再到经理
在Easy Process里实现这个逻辑,就是拖拽5个节点加连线,全程不用写业务代码。
3. 深度定制企业级流程
3.1 依赖注入的妙用
传统方案中,如果要在节点组件里获取流程数据,需要从顶层组件层层传递props。Easy Process通过Vue3的provide/inject实现了跨级数据获取:
// 在任意子组件中获取流程数据 import { inject } from 'vue' import { KEY_PROCESS_DATA } from './config/keys' const processData = inject(KEY_PROCESS_DATA)我们在金融项目里用这个特性做了个骚操作:在审批节点注入风控系统的API,实时校验申请人征信分数,分数不足时自动跳转风控审批分支。
3.2 节点校验实战
流程提交前的校验是刚需。比如采购审批中,金额超过预算需要特殊处理。在Easy Process中实现校验只需要两步:
- 在节点组件注册校验器:
validator.register(props.tempNodeId, () => { if (processData.value.amount > 100000) { return { valid: false, message: "大额采购需附加说明" } } return { valid: true } })- 提交时触发全局校验:
proxy.$refs.process.validate((valid, messages) => { if (valid) { submit() } else { alert(messages.join('\n')) } })最近给物流客户做的方案中,我们通过校验器实现了"同一路线不能重复派单"的业务规则,比在后端做校验的体验更即时。
4. 与企业现有系统集成
4.1 单点登录对接
大多数企业已有统一认证系统。我们可以在初始化设计器时注入用户数据:
// 从企业SSO获取当前用户信息 const userData = await getSSOUserInfo() // 初始化流程数据时带入 const processData = ref({ ...templateData, currentUser: userData, departments: await getOrgTree() })这样在审批人节点配置时,就可以直接显示企业组织架构树,而不是手动输入账号。
4.2 与BPM引擎对接
Easy Process生成的流程数据需要与后端BPM引擎配合。推荐的数据交互方式:
// 前端获取设计结果 const flowJSON = proxy.$refs.process.getResult() // 转换为Activiti/Camunda兼容格式 const convertParams = { ...flowJSON, // 业务系统需要的附加字段 bizType: 'leave_approval' } // 提交到后端 await saveProcessDefinition(convertParams)在去年某制造业项目里,我们通过适配器模式实现了同时支持Flowable和钉钉宜搭两种后端引擎,前端代码完全不用修改。
5. 性能优化实践
当流程节点超过50个时,需要注意渲染性能。我们通过以下手段保证流畅度:
- 虚拟滚动:只渲染可视区域内的节点
- 节点分级加载:复杂流程先显示主干,点击展开详情
- Web Worker处理校验:将复杂校验逻辑放到worker线程
有个实际案例:某保险公司理赔流程有上百个条件分支,初始加载需要3秒。加入懒加载后,首屏时间降到800ms以内。关键代码:
// 动态加载节点组件 const NodeComponent = defineAsyncComponent(() => import(`./node/${nodeType}.vue`) )6. 扩展自定义节点类型
假设要增加一个"邮件通知"节点:
- 在nodeType.js添加类型常量:
export const EMAIL_NODE = 'email'- 配置节点元信息:
// nodeConfig.js nodeConfig[EMAIL_NODE] = { title: "邮件通知", icon: { name: "email", color: "#FFA500" }, defaultNode: { nodeName: "邮件通知", nodeType: EMAIL_NODE, config: { receivers: [], templateId: "" } } }- 创建emailNode.vue和emailDrawer.vue
最近给高校做的OA里,我们扩展了"短信通知"、"会议室预订"等特色节点,这些都在标准版基础上二次开发的。