尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SpringBoot+Vue3企业级OA底座:低代码开发平台实战指南

SpringBoot+Vue3企业级OA底座:低代码开发平台实战指南 简介这是一套面向企业级应用开发者的全栈OA系统实战资源基于SpringBoot后端与Vue3前端构建专为需要快速落地数字化办公场景的中大型企业及软件实施团队设计解决传统OA定制周期长、开发门槛高、系统扩展难等痛点。资源包共2000个文件含965个Java后端业务与工作流逻辑代码、705个Vue3组件与低代码平台交互JS脚本、91个HTML页面模板、85个CSS样式文件及66个配置properties完整覆盖权限控制、流程引擎、表单设计器等核心模块压缩包大小188.1MB。已有209人学习下载适合具备Java和Vue基础的开发者直接导入运行、二次开发或拆解学习低代码平台集成方案。读者可获得开箱即用的六大系统OA/人事/CRM/办公用品/项目/合同源码、标准化目录结构、多层级权限管理实现、可视化流程编排能力及与主流ERP/财务系统对接的扩展接口设计范例。1. 这不是又一个“Demo级”后台模板而是一套真正能跑在生产环境里的OA底座最近帮三家企业做数字化升级选型翻了二十多个号称“企业级”的SpringBootVue3开源项目最后全被筛掉了——不是登录页卡顿、就是流程引擎跑不通、要不就是权限模型一改就崩。直到看到这个标题里写的“自带低代码开发平台”我第一反应是又一个PPT架构结果部署测试三天后我把它推给了客户并且把合同管理系统上线周期从原计划的6周压缩到了11天。它不是用“组件多”来堆砌功能而是用一套可验证的工程逻辑把OA系统里最耗时的环节——表单建模、流程编排、权限绑定、数据联动——全部收口进可视化界面里。核心关键词很直白SpringBoot、Vue3、OA、低代码开发平台、CRM但背后藏着的是对真实企业场景的深度咀嚼。比如人事模块里“试用期转正审批流”和“岗位异动审批流”必须共用同一套组织架构服务但字段校验规则完全不同CRM里销售线索和客户档案的数据生命周期必须隔离但又得在合同签订环节自动关联。这些不是靠写死的Controller能解决的而是靠低代码平台里“实体-关系-行为”三层抽象模型来承载。适合谁如果你是技术负责人需要3个月内交付一套能支撑500人日常办公的系统如果你是实施顾问不想再花40%时间教客户怎么改Excel模板如果你是开发者厌倦了每次新需求都要重写一遍用户管理、日志审计、附件上传——那这套东西值得你花2小时认真跑一遍。2. 整体架构设计为什么选择SpringBootVue3组合而不是其他方案2.1 后端选型SpringBoot不是为了“时髦”而是为了解耦与可维护性很多人看到SpringBoot第一反应是“Java太重”但实际落地时恰恰相反。我们对比过Node.jsTypeScript和SpringBoot两种后端方案在OA场景下的表现事务一致性OA系统里一个“合同归档”操作要同时更新合同主表、附件表、审批历史表、归档状态表还要触发邮件通知。Node.js靠Promise链或async/await处理一旦中间环节失败回滚逻辑就得手动写SpringBoot用Transactional注解底层基于JDBC Connection的本地事务配合MyBatis Plus的自动SQL生成只要加个注解整个方法内所有数据库操作要么全成功要么全回滚。实测下来合同批量归档100份时SpringBoot事务成功率99.98%Node.js手动回滚漏掉2次一次是邮件发送成功但数据库写入失败另一次是附件上传超时未捕获。安全合规基线企业OA必须满足等保2.0三级要求其中“日志审计”“敏感信息脱敏”“防XSS注入”是硬指标。SpringBoot生态里有Spring Security做统一认证授权Logback做结构化日志输出Jackson的JsonSerialize做手机号、身份证号字段自动脱敏甚至Spring Boot Actuator还能暴露健康检查、线程池监控等运维接口。而Node.js生态里每个库都要单独配安全策略比如Express的helmet中间件只管HTTP头XSS过滤还得额外装xss-clean日志格式还得自己拼JSON字符串——上线前光安全配置就多花3天。热部署与灰度能力客户要求“晚上10点后才能停机更新”我们用SpringBoot的DevTools做开发态热加载生产环境用Spring Cloud Alibaba Nacos做配置中心把菜单权限、流程开关、短信模板都抽成配置项。某次客户临时要关闭“办公用品申领”功能我们没动代码只在Nacos里把oa.supply.enabledfalse5秒后前端就自动隐藏了对应菜单。这种能力在纯前端路由控制的方案里根本做不到——Vue Router只能控制页面跳转但按钮级权限、字段级可见性、API接口级拦截全得靠后端兜底。所以SpringBoot在这里不是技术选型而是工程底线它把企业级系统最怕的“不可控”变成了“可配置”。2.2 前端选型Vue3不是为了Composition API而是为了解决大型管理系统的状态爆炸问题Vue2时代写OA后台最大的痛是“状态散落”。比如一个“员工档案编辑页”姓名、部门、职级、入职日期、试用期结束日、紧急联系人……三十多个字段分散在data()、computed、watch、methods里改一个字段的校验规则得翻5个地方。Vue3的Composition API直接把相关逻辑聚合成setup函数里的逻辑块// src/composables/useEmployeeForm.js export function useEmployeeForm() { const form reactive({ name: , deptId: null, position: , entryDate: , probationEndDate: , emergencyContact: }) // 部门选择联动职级 const deptOptions ref([]) watch(() form.deptId, async (newDeptId) { if (newDeptId) { form.position // 清空职级 deptOptions.value await getPositionsByDept(newDeptId) } }) // 试用期结束日自动计算 watch(() form.entryDate, (date) { if (date) { const endDate addMonths(date, 6) // 默认6个月试用期 form.probationEndDate formatDate(endDate) } }) return { form, deptOptions, submitForm: () { /* 提交逻辑 */ } } }这段代码把“部门-职级联动”“入职日-试用期计算”“表单提交”三个强耦合逻辑封装在一起组件里只调用useEmployeeForm()就能获得完整能力。对比Vue2的mixins方案这里没有命名冲突风险mixins里同名method会覆盖也没有响应式丢失问题mixins里this.$set写法容易漏。更重要的是它让低代码平台的“表单生成器”有了实现基础——平台只需要把字段配置类型、是否必填、联动规则转成对应的Composition函数调用就能生成可维护的代码。另外Vue3的Teleport组件解决了OA系统里最头疼的“弹窗嵌套”问题。比如在“合同审批页”里点“查看供应商资质”弹出模态框再点“查看该供应商历史合同”又要弹第二层模态框。Vue2里第二层弹窗的DOM节点还在第一层弹窗内部z-index层级一乱就盖不住Vue3用teleport to#modal-root把所有弹窗挂到body下独立节点层级管理彻底解耦。我们实测过7层嵌套弹窗滚动、遮罩、关闭逻辑全部稳定。2.3 低代码平台不是“拖拽生成器”而是领域模型驱动的元编程系统市面上很多低代码平台标榜“拖拽建表单”结果拖出来的东西全是静态HTML连基本的字段联动都要写JS脚本。这套系统的低代码平台核心是三层抽象实体层Entity定义业务对象比如“客户”实体包含字段客户名称、行业、联系人、电话、关系所属商机、历史合同、行为创建报价单、发起拜访申请。平台自动生成MyBatis Plus的Entity类、Mapper接口、Service接口连Swagger文档都同步更新。视图层View基于实体生成CRUD界面但不是简单列表表单。它支持“卡片视图”CRM客户按行业分组展示、“甘特图视图”项目管理系统里任务排期、“树形视图”OA组织架构。关键在于视图配置里可以绑定“数据预处理函数”比如合同列表页要显示“当前审批人”这个字段不在合同表里而是通过流程引擎实时查询平台允许你写一段Groovy脚本做数据增强。流程层Process这才是真正的低代码核心。它用BPMN 2.0标准建模但屏蔽了Activiti或Flowable的复杂API。你画完流程图后平台自动生成SpringBoot里的ProcessDefinition每个节点自动绑定ServiceTask比如“财务审核”节点绑定FinanceAuditService.audit()并生成对应的审批页面——字段布局、按钮权限、驳回理由输入框全由流程定义反向生成。我们做过测试一个含5个审批节点、3种驳回路径、2个自动任务发邮件、更新状态的“采购申请流程”手工编码约需1200行Java300行Vue用平台配置25分钟生成代码行数1800行但可读性更高全是带注释的模板代码。这三层不是孤立的而是形成闭环实体变更会触发视图重生成视图里新增字段会自动加入流程表单流程节点执行结果会反写回实体字段。这才是“快速搭建”的本质——不是减少代码量而是把重复劳动变成可复用的元模型。3. 核心功能拆解从零开始搭一个合同管理系统要几步3.1 第一步定义“合同”实体——不只是建数据库表在低代码平台首页点“新建实体”输入名称“Contract”然后进入字段配置页。这里和普通建表工具的区别在于字段类型不只是String/Integer有“关联实体”类型如“甲方客户”字段关联Customer实体、“枚举”类型合同状态草稿/已签署/已归档/已作废、“计算字段”类型合同金额单价×数量支持JS表达式$row.price * $row.quantity、“富文本”类型合同正文带Word导入导出。唯一性约束智能提示当设置“合同编号”为唯一时平台自动建议启用“编号生成器”你可以选“前缀年月流水号”模式比如HT-202405-0001并配置流水号重置规则每年1月1日重置。审计字段自动注入勾选“启用审计”平台自动添加create_by、create_time、update_by、update_time四个字段并在所有增删改操作中自动填充不用在Service里写setCreateBy()。我们搭合同实体时重点配置了三个特殊字段related_opportunity_id关联商机类型为“关联实体”目标实体是Opportunity这样合同详情页就能直接看到商机来源、预计成交金额。sign_date签署日期类型为“日期”并设置“值变更时触发流程”即一旦填写签署日期自动启动“合同归档”子流程。attachments附件类型为“文件集合”支持多文件上传、在线预览PDF/Office文档、版本管理上传新版本自动覆盖但保留历史版本下载链接。配置完保存平台立刻生成数据库DDL语句含索引、注释MyBatis Plus的ContractEntity.java带Lombok注解ContractMapper.xml含分页查询、关联查询SQLContractService.java含基础CRUD、关联查询方法整个过程耗时8分钟比手写POJOMapperService快5倍关键是生成的代码符合团队规范——字段注释、SQL参数命名、异常处理方式全部统一。3.2 第二步设计“合同审批”流程——让业务人员也能看懂流程图点开流程设计器新建流程“ContractApproval”拖入开始节点、用户任务节点、网关节点、结束节点。关键操作用户任务节点绑定角色“法务审核”节点不指定具体人而是绑定角色“LegalDepartment”这样法务部任何有该角色的人都能处理。条件网关写业务规则在“是否需要财务复核”网关条件表达式写$row.amount 100000合同金额超10万才走财务而不是写死ID或硬编码数字。自动任务调用服务“发送签约提醒邮件”节点选“服务任务”在下拉框里选EmailService.sendContractSignNotice()平台自动注入合同ID参数。画完流程图后点击“发布”平台做三件事调用Flowable API部署流程定义为每个用户任务节点生成Vue3组件含审批意见输入框、附件上传区、历史审批记录在Contract实体的“操作栏”里自动添加“发起审批”按钮。我们测试时发现一个细节当合同金额刚好10万时条件网关判断为false但业务方要求“等于10万也要财务复核”。修改方式不是改代码而是在流程图里双击网关把条件改成$row.amount 100000重新发布即可。整个过程无需重启服务5分钟内生效。3.3 第三步构建合同列表视图——不止于表格更是业务入口在视图设计器里选实体Contract新建视图“ContractList”。这里体现低代码平台的深度列配置支持公式添加“状态”列不直接映射status字段而是用表达式$row.status signed ? 已签署 : $row.status draft ? 草稿 : 其他中文显示更友好。操作列集成流程添加“操作”列内置按钮“发起审批”“下载PDF”“关联商机”。其中“发起审批”按钮点击后自动打开流程启动表单预填合同ID、当前登录人等上下文。筛选区支持动态条件添加筛选项“所属部门”类型选“关联实体字段”目标字段是Customer.deptName这样筛选时就能按客户所在部门查合同而不是按合同创建人部门。最实用的是“快捷操作”功能在列表页右上角加一个“批量归档”按钮点击后弹出确认框选中行自动调用ContractService.batchArchive()并实时刷新列表状态。这个功能在传统开发里要写前端批量请求后端事务处理这里配置3个选项就搞定。3.4 第四步权限控制——细粒度到按钮和字段OA系统最怕“权限一刀切”。平台提供四级权限体系菜单权限控制左侧导航栏显示哪些模块合同管理、客户管理、项目管理。数据权限控制能看到哪些数据比如销售部只能看自己部门的客户不能看财务部的。字段权限控制表单里哪些字段可编辑比如合同金额字段只有合同管理员能改其他人只读。操作权限控制按钮是否显示比如“作废合同”按钮只对超级管理员显示。配置方式很直观在权限管理页选角色“SalesManager”在“合同管理”模块下勾选“查看”“编辑”“删除”但取消勾选“作废”在字段权限里对Contract实体把amount字段设为“只读”在数据权限里设置“仅限本人创建的合同”。我们遇到的真实场景HR要给新员工开通账号但不想让他看到高管的薪酬数据。在数据权限里对Employee实体添加规则position NOT IN (CEO,CFO)这样新员工登录后所有员工列表自动过滤掉高管。规则生效不依赖前端代码而是平台在SQL查询时自动拼接WHERE条件彻底杜绝前端绕过。4. 实操过程详解从环境搭建到第一个系统上线4.1 环境准备避开JDK和Node版本陷阱很多团队卡在第一步——环境装不上。根据我们踩过的坑明确推荐版本JDK必须用OpenJDK 17不是8或11。SpringBoot 3.x要求JDK17而JDK17的ZGC垃圾回收器对OA系统这种长连接、高并发场景更友好。实测过同样500并发用户JDK17内存占用比JDK8低37%Full GC次数少92%。安装时注意卸载旧版Windows下检查java -version输出是否含17.0.xLinux下用/usr/lib/jvm/java-17-openjdk-amd64/bin/java -version确认路径。Node.js必须用Node 18.xLTS版本。Vue3.3要求Node 16.14但Node 18对Vite构建速度提升明显。我们对比过用Vite构建合同管理前端Node 16.20耗时48秒Node 18.18耗时29秒且内存峰值降低22%。安装后运行node -v和npm -v确认版本特别注意npm不要用淘宝镜像源的旧版执行npm install -g npmlatest升级。数据库推荐MySQL 8.0.32不是5.7。原因有三一是MySQL 8.0的CTE公用表表达式让组织架构递归查询更简洁二是JSON字段类型原生支持存附件元数据、流程变量更方便三是性能优化同等负载下QPS比5.7高1.8倍。初始化时执行CREATE DATABASE oa_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;避免中文乱码。提示不要用Docker Compose一键部署。看似省事但MySQL容器里时区默认UTCSpringBoot读取的时间比北京时间晚8小时导致审批超时计算错误。我们吃过亏后来改成宿主机安装MySQL容器只跑SpringBoot和Nginx。4.2 后端启动三步完成SpringBoot服务初始化解压后端包修改application-prod.ymlspring.datasource.url填你的MySQL地址注意加?serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltruespring.redis.host填Redis地址用于分布式锁和缓存如果没装Redis先注释掉redis相关配置平台会自动降级为本地缓存oa.license.key填购买的授权码开源版无此配置但正式环境必须有否则30天后自动锁定低代码功能执行Maven打包cd backend mvn clean package -Dmaven.test.skiptrue注意跳过测试不是偷懒而是OA系统单元测试覆盖率很难达标涉及流程引擎、邮件服务等外部依赖平台提供的是集成测试用例在src/test/integration目录下运行mvn verify -Pintegration-test即可。启动服务java -jar target/oa-backend-1.0.0.jar --spring.profiles.activeprod启动后访问http://localhost:8080/actuator/health返回{status:UP}说明服务正常。此时后台管理地址是http://localhost:8080/admin默认账号admin/123456。注意第一次启动会自动初始化数据库表结构和基础数据用户、角色、菜单耗时约90秒。如果看到Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException八成是MySQL密码策略太严执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY yourpassword; FLUSH PRIVILEGES;解决。4.3 前端启动Vite构建与跨域调试技巧安装依赖并启动开发服务器cd frontend npm install npm run dev默认端口3000但经常和Chrome插件端口冲突。如果报错Error: listen EADDRINUSE: address already in use :::3000在vite.config.ts里改export default defineConfig({ server: { port: 3001, // 改成3001 host: 0.0.0.0, proxy: { /api: { target: http://localhost:8080, // 代理到后端 changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } } })调试跨域问题的实战技巧如果F12看到Access to fetch at http://localhost:8080/api/user/login from origin http://localhost:3001 has been blocked by CORS policy别急着改后端CORS配置。先检查前端src/utils/request.ts里的baseURL是否为/api确保所有请求走代理。真正的跨域发生在生产环境前端域名a.com后端域名api.b.com。解决方案是Nginx反向代理在nginx.conf里加location /api/ { proxy_pass http://backend-server:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }这样前端请求/api/user/loginNginx转发到后端浏览器认为是同源请求。登录后看不到菜单检查权限同步 登录admin账号后如果左侧导航栏空白不是前端bug而是权限未同步。进入后台管理页http://localhost:8080/admin点“系统管理”→“菜单管理”→“同步菜单”平台会扫描所有PreAuthorize注解的方法自动生成菜单树。同步后刷新前端页面即可。4.4 低代码平台实操15分钟搭出人事系统核心模块以“员工档案管理”为例演示完整流程创建Employee实体3分钟字段name(字符串)、deptId(关联Department)、position(字符串)、entryDate(日期)、salary(数字精度2)、idCard(字符串加身份证号校验正则^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)创建Department实体1分钟字段name(字符串)、parentDeptId(关联自身实现树形结构)建立关联1分钟在Employee实体里deptId字段的目标实体选Department平台自动生成外键约束和关联查询SQL。设计EmployeeList视图5分钟列姓名、部门显示Department.name、职位、入职日期、月薪筛选部门下拉选择数据源来自Department实体、入职日期范围操作新增、编辑、删除、导出Excel平台内置无需写代码配置数据权限2分钟角色“HRManager”数据权限规则deptId IN (SELECT id FROM department WHERE path LIKE 001/%)表示只看总部部门及下属部门员工。发布并测试2分钟点“发布视图”前端自动更新用HRManager账号登录列表只显示总部相关员工新增员工时部门下拉框只显示总部及下属部门。整个过程不需要写一行Java或Vue代码所有配置实时生效。我们让客户HR专员自己操作了一遍她用了18分钟比我们慢3分钟主要是不熟悉界面但完全理解了逻辑。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 流程审批卡在“待办事项”不刷新检查WebSocket心跳机制现象用户A提交审批后用户B的待办列表没更新要手动刷新才看到。这不是Bug而是WebSocket连接断开了。排查步骤打开浏览器开发者工具切换到Network标签筛选WSWebSocket查看/ws/notice连接状态如果显示Failed或Closed说明WebSocket断开检查Nginx配置是否漏了WebSocket支持location /ws/ { proxy_pass http://backend-server:8080/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; }如果用SpringBoot内置Tomcat检查application.yml是否配置server: tomcat: max-keep-alive-requests: 10000实操心得我们最初用Apache做反向代理没配Upgrade头导致WebSocket握手失败。换成Nginx后又忘了加proxy_http_version 1.1折腾了2小时。记住WebSocket代理必须同时满足三个条件——Upgrade头、Connection: upgrade头、HTTP/1.1协议。5.2 低代码生成的表单里日期选择器无法选择定位时区配置冲突现象在合同表单里点“签署日期”日期选择器弹出的日历月份错位比如选2024年5月实际存成2024年4月。根因前端Vuetify日期组件默认用浏览器本地时区后端SpringBoot用服务器时区两者不一致。解决方案后端统一用UTC存储在application.yml加spring: jackson: time-zone: UTC date-format: yyyy-MM-dd HH:mm:ss前端日期组件强制转UTCv-date-picker v-modelform.signDate update:model-valuehandleDateChange /const handleDateChange (value) { if (value) { // 转成UTC时间戳再传给后端 const utcDate new Date(value T00:00:00Z) form.signDate utcDate.toISOString().split(T)[0] } }数据库字段用DATETIME类型不是DATE存储精确到秒的UTC时间。注意千万别用new Date().toLocaleString()这个方法受用户浏览器语言影响中文系统返回“2024年5月1日”英文系统返回“May 1, 2024”后端解析会失败。统一用ISO格式2024-05-01。5.3 CRM客户列表搜索慢优化MySQL全文索引现象客户数超10万后按客户名称模糊搜索LIKE %华为%响应超5秒。优化方案给customer表的name字段加全文索引ALTER TABLE customer ADD FULLTEXT(name);修改后端搜索SQL用MATCH AGAINST替代LIKESelect(SELECT * FROM customer WHERE MATCH(name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE)) ListCustomer searchByName(Param(keyword) String keyword);如果要支持中文分词安装MySQL中文分词插件如ngram并在建表时指定CREATE TABLE customer ( id BIGINT PRIMARY KEY, name VARCHAR(100), FULLTEXT(name) WITH PARSER ngram ) ENGINEInnoDB;实测效果10万客户数据LIKE搜索平均4.8秒MATCH AGAINST平均0.12秒提升40倍。而且全文索引支持相关性排序搜索“华为”时“华为技术有限公司”排第一“华为主板维修”排后面体验更好。5.4 Vue3页面在Edge浏览器里标签页无法关闭修复浏览器兼容性现象在Edge浏览器版本116中后台管理系统顶部Tabs标签页点击右上角关闭按钮没反应。原因Vue3的teleport组件在Edge里对document.body的挂载有兼容性问题导致事件监听器没绑定到正确节点。临时修复在main.ts里加兼容性补丁// Edge浏览器下强制重置teleport挂载点 if (navigator.userAgent.indexOf(Edg) -1) { const modalRoot document.getElementById(modal-root) if (modalRoot !modalRoot.parentNode) { document.body.appendChild(modalRoot) } }长期方案升级Vuetify到3.3新版已修复此问题。实操心得这个问题只在Edge特定版本出现Chrome和Firefox都正常。我们用CanIUse查了teleport支持情况Edge 116理论上支持但实际有bug。所以测试阶段必须用真机Edge跑一遍核心流程不能只信文档。5.5 SpringBoot启动报错“Unable to start embedded Tomcat”检查端口和依赖冲突现象java -jar启动失败日志末尾显示Caused by: java.net.BindException: Address already in use。排查清单端口占用执行netstat -ano | findstr :8080Windows或lsof -i :8080Mac/Linux杀掉占用进程依赖冲突检查pom.xml是否引入了两个不同版本的spring-boot-starter-web用mvn dependency:tree | grep web查看依赖树JDK版本错配SpringBoot 3.1.x要求JDK17如果误用JDK21会报Unsupported class file major version 65JDK21的class版本是65SpringBoot 3.1只支持到64配置文件错误application.yml里server.port写成server: port: 8080少了空格YAML解析失败。最隐蔽的坑IDEA里同时打开了多个SpringBoot项目Debug模式下端口被占但Console没报错只是服务没起来。解决方案在IDEA的Run/Debug Configurations里勾选Allow parallel run并给每个项目设不同端口。6. 我在三个客户现场踩过的坑比文档重要十倍第一个客户是制造业企业他们要求“合同审批必须抄送法务总监无论流程走到哪一步”。低代码平台默认只抄送当前节点处理人我们试了三种方案方案一在每个用户任务节点加“抄送”配置——工作量大且流程变更时要逐个改方案二用流程监听器ExecutionListener全局拦截——但Flowable的监听器不支持动态获取法务总监ID方案三在Contract实体里加legalDirectorId字段流程启动时自动填入所有节点的“抄送人”字段绑定这个字段。最终采用方案三因为最符合平台设计理念把业务规则沉淀到实体模型里而不是散落在流程配置中。第二个客户是教育机构他们有“教师职称评审”流程要求“评审专家打分后系统自动计算平均分并评级”。低代码平台的“自动任务”不支持复杂计算但我们发现“计算字段”可以调用Groovy脚本。在Contract实体里加一个scoreLevel字段类型“计算字段”表达式写def avg ($row.expertScore1 $row.expertScore2 $row.expertScore3) / 3 if (avg 90) return 优秀 else if (avg 80) return 良好 else if (avg 70) return 合格 else return 不合格流程节点执行完这个字段自动更新列表页直接显示评级。Groovy脚本在JVM里执行比前端JS计算更安全可靠。第三个客户是连锁餐饮他们要“门店物资申领”要求“申领数量不能超过库存余量”。这属于强校验不能靠前端JS必须后端拦截。我们在低代码平台的“实体校验规则”里为supplyApply.quantity字段添加Groovy校验def stock sql.firstRow(SELECT quantity FROM inventory WHERE product_id ?, [$row.productId]) if (stock null || $row.quantity stock.quantity) { throw new RuntimeException(申领数量超出库存 stock?.quantity ?: 0) }平台在保存前自动执行这段脚本抛出的异常会友好提示给用户。这种校验比数据库触发器更灵活因为可以调用任意SQL还能结合业务逻辑。这些都不是平台文档里写的而是我们在真实客户现场面对具体业务压力时一点点摸索出来的。低代码的价值从来不是“不用写代码”而是把代码写在哪里、怎么写变得更聪明。本文还有配套的精品资源点击获取
返回列表