芋道框架审批流实战:从数据库字段到前端弹窗,一个完整OA审批模块的搭建实录

张开发
2026/4/8 16:59:21 15 分钟阅读

分享文章

芋道框架审批流实战:从数据库字段到前端弹窗,一个完整OA审批模块的搭建实录
芋道框架审批流实战从数据库字段到前端弹窗一个完整OA审批模块的搭建实录在当今企业数字化转型浪潮中审批流程自动化已成为提升运营效率的关键环节。芋道框架CloudVue3作为一款现代化的企业级开发平台其内置的BPM工作流引擎为开发者提供了快速构建审批模块的能力。本文将从一个真实业务场景出发手把手带你完成碳排放数据上报审批模块的全栈实现。1. 审批模块的数据库设计基础任何审批流程的起点都是数据存储设计。在芋道框架中我们需要为业务表添加几个核心字段来支持审批流功能ALTER TABLE tb_carbon_report ADD COLUMN process_instance_id VARCHAR(64) COMMENT 流程实例ID, ADD COLUMN batch_no VARCHAR(32) COMMENT 批次号, ADD COLUMN status TINYINT DEFAULT 1 COMMENT 状态(1:草稿 2:审批中 3:通过 4:驳回);这三个字段构成了审批流的基础数据结构process_instance_id关联BPM引擎中的流程实例batch_no标识同一批提交的数据status跟踪审批状态的生命周期实际项目中我们还需要考虑字段索引优化字段名索引类型说明process_instance_id普通索引加速流程实例查询batch_no普通索引支持批次操作查询status普通索引加速状态过滤提示状态字段建议使用枚举类而非魔法数字例如public enum ApproveStatus { DRAFT(1), PROCESSING(2), APPROVED(3), REJECTED(4); // ... }2. 后端服务层实现要点2.1 实体类设计在领域对象中我们需要确保审批相关字段的正确映射Data TableName(tb_carbon_report) public class CarbonReportDO { // 基础业务字段... TableField(process_instance_id) private String processInstanceId; TableField(batch_no) private String batchNo; TableField(status) private Integer status; }VO对象则需要考虑接口文档的友好性Data Schema(description 碳排放报告VO) public class CarbonReportVO { Schema(description 流程实例ID, example yr-b-20230801123456) private String processInstanceId; Schema(description 批次号, example BATCH-20230801-001) private String batchNo; Schema(description 审批状态, example 1) private Integer status; }2.2 审批提交服务实现审批提交是工作流集成的核心环节需要处理以下关键点生成唯一批次号启动BPM流程实例批量更新业务数据状态Service RequiredArgsConstructor public class CarbonReportServiceImpl implements CarbonReportService { private final BpmUtil bpmUtil; private final CarbonReportMapper reportMapper; private static final String PROCESS_KEY carbon-report; private static final String BATCH_PREFIX CR-; Override Transactional public void submitApproval(ListLong reportIds) { // 生成批次号 String batchNo generateBatchNumber(); // 启动工作流 String instanceId bpmUtil.startProcess(PROCESS_KEY, batchNo); // 批量更新报告状态 LambdaUpdateWrapperCarbonReportDO updateWrapper new LambdaUpdateWrapper(); updateWrapper.in(CarbonReportDO::getId, reportIds) .set(CarbonReportDO::getBatchNo, batchNo) .set(CarbonReportDO::getProcessInstanceId, instanceId) .set(CarbonReportDO::getStatus, ApproveStatus.PROCESSING.getCode()); reportMapper.update(null, updateWrapper); } private String generateBatchNumber() { return BATCH_PREFIX LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyyMMddHHmmss)); } }注意Transactional注解确保批次号和流程实例的原子性更新避免数据不一致3. 流程引擎配置实战3.1 流程定义设计在芋道管理后台的工作流程模块中我们需要创建新流程定义标识符需与代码中PROCESS_KEY一致设计审批节点建议使用BPMN 2.0标准配置表单查看地址典型的多级审批流程可能包含部门主管审批环保专员审核分管领导审批3.2 状态监听器实现审批状态变更需要通过监听器同步回业务系统Component public class CarbonReportListener extends BpmProcessInstanceStatusEventListener { private static final String PROCESS_KEY carbon-report; Resource private CarbonReportService reportService; Override protected String getProcessDefinitionKey() { return PROCESS_KEY; } Override protected void onEvent(BpmProcessInstanceStatusEvent event) { reportService.updateStatusByInstance( event.getId(), convertBpmStatus(event.getStatus()) ); } private Integer convertBpmStatus(Integer bpmStatus) { switch (bpmStatus) { case 2: return ApproveStatus.APPROVED.getCode(); case 3: return ApproveStatus.REJECTED.getCode(); default: return ApproveStatus.PROCESSING.getCode(); } } }4. 前端交互实现技巧4.1 列表页状态展示在Vue3的表格中我们可以通过状态标签增强用户体验el-table-column label状态 width120 template #default{row} el-tag :typestatusTagType(row.status) effectplain {{ statusText(row.status) }} /el-tag /template /el-table-column配套的状态映射方法const statusTagType (status: number) { switch(status) { case 1: return info // 草稿 case 2: return warning // 审批中 case 3: return success // 通过 case 4: return danger // 驳回 default: return } }4.2 审批提交弹窗提交审批时需要确认选择的数据el-dialog title提交审批 v-modeldialogVisible el-table :dataselectedItems !-- 数据列定义 -- /el-table template #footer el-button clicksubmitApproval typeprimary 确认提交 /el-button /template /el-dialog提交逻辑需要处理异常情况const submitApproval async () { if (selectedItems.value.length 0) { return ElMessage.warning(请至少选择一条数据) } try { await CarbonReportApi.submitApproval( selectedItems.value.map(item item.id) ) ElMessage.success(提交成功) emit(refresh) dialogVisible.value false } catch (e) { ElMessage.error(提交失败 e.message) } }5. 调试与性能优化5.1 常见问题排查开发过程中可能遇到的典型问题流程实例无法启动检查PROCESS_KEY是否与后台配置一致确认BPM服务是否正常查看日志中的详细错误信息状态不同步验证监听器是否注册成功检查流程定义Key匹配调试事件回调参数批量操作超时增加事务超时设置考虑分批次处理添加进度提示5.2 性能优化建议对于大规模审批场景数据库优化CREATE INDEX idx_report_batch ON tb_carbon_report(batch_no); CREATE INDEX idx_report_status ON tb_carbon_report(status);缓存策略Cacheable(value reportStatus, key #instanceId) public Integer getStatusByInstance(String instanceId) { // 查询实现 }异步处理Async public void asyncUpdateStatus(ListLong ids, Integer status) { // 批量状态更新 }在实际项目中我们发现合理设置批量操作大小建议每次50-100条能显著提升审批流处理效率同时避免数据库连接被长时间占用。

更多文章