首页/新闻资讯/正文详情

业务方案:先记操作流水 → 走审批 → 审批通过后正式生效

发布时间:2026/9/27 4:57:38 来源:云帆数科 栏目:资讯中心
业务方案:先记操作流水 → 走审批 → 审批通过后正式生效
目录业务概述数据库设计核心 3 张表1. 主业务表比如goods_price 商品价格表2. 操作变更流水表operation_log核心3. 审批任务表approval_task工作流最小实现复杂场景接入 Flowable完整业务流程代码逻辑步骤 1用户提交变更申请事务 1步骤 2审批人处理审批同意 / 驳回分支 A审批【驳回】事务 2分支 B审批【通过】事务 3重点方案变种对比方案 A上面这套【快照流水 审批后更新主表】✅推荐方案 B主表保留多版本主表新增一条版本记录旧版本标记失效方案 C不维护主表业务查询时合并流水不推荐重点问题 边界处理业务概述核心规则用户提交变更先落操作流水记录状态 待审批此时业务实体本身不生效审批流程独立流转审批通过才把变更内容刷入主业务表状态改为生效审批驳回主业务数据不变流水标记驳回。典型场景合同变更、价格调整、权限变更、额度修改、订单改单。 核心目的留痕、可回溯、变更不即时生效审批是生效开关数据库设计核心 3 张表1. 主业务表比如goods_price 商品价格表真实生效的数据在这里审批未通过时本表不更新sqlCREATE TABLE goods_price ( id BIGINT PRIMARY KEY AUTO_INCREMENT, goods_id BIGINT NOT NULL COMMENT 商品ID, price DECIMAL(18,2) NOT NULL COMMENT 生效价格, effective_time DATETIME COMMENT 生效时间, status TINYINT COMMENT 0失效 1生效, create_time DATETIME DEFAULT NOW(), update_time DATETIME DEFAULT NOW() );2. 操作变更流水表operation_log核心用户提交修改先插入这张表保存本次要修改的目标值、变更前后快照、审批状态sqlCREATE TABLE operation_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, business_type VARCHAR(64) NOT NULL COMMENT 业务类型GOODS_PRICE, business_id BIGINT NOT NULL COMMENT 主业务ID对应goods_price.id, before_content TEXT COMMENT 变更前JSON快照, after_content TEXT COMMENT 申请变更后的JSON快照, apply_user BIGINT NOT NULL COMMENT 申请人, apply_time DATETIME DEFAULT NOW(), approval_status TINYINT NOT NULL COMMENT 0待审批 1审批通过 2审批驳回 3撤销申请, approval_user BIGINT COMMENT 审批人, approval_time DATETIME, approval_comment VARCHAR(512) COMMENT 审批意见, create_time DATETIME DEFAULT NOW(), update_time DATETIME DEFAULT NOW() );3. 审批任务表approval_task工作流最小实现复杂场景接入 Flowable记录每一条流水对应的审批节点、审批人sqlCREATE TABLE approval_task ( id BIGINT PRIMARY KEY AUTO_INCREMENT, operation_log_id BIGINT NOT NULL COMMENT 关联操作流水ID, node_name VARCHAR(64) NOT NULL COMMENT 审批节点, approver BIGINT NOT NULL COMMENT 审批人ID, task_status TINYINT NOT NULL COMMENT 0待处理 1同意 2驳回, task_sort INT COMMENT 审批顺序, create_time DATETIME DEFAULT NOW() );完整业务流程代码逻辑步骤 1用户提交变更申请事务 1查询当前主业务表旧数据序列化为beforeContent用户提交新参数组装afterContent开启事务插入operation_log状态 待审批根据审批规则生成审批任务approval_task✅主业务表【不做任何更新】事务提交返回申请单号流水 ID关键点此时查询主业务数据还是旧值变更只保存在流水里。伪代码javaTransactional(rollbackFor Exception.class) public Long applyChange(GoodsPriceDTO dto) { // 1.查询当前生效数据 GoodsPrice oldData goodsPriceMapper.selectById(dto.getGoodsId()); String beforeContent JSON.toJSONString(oldData); // 2.组装新变更数据快照 GoodsPrice newData BeanUtil.copyProperties(dto, GoodsPrice.class); String afterContent JSON.toJSONString(newData); // 3.写入操作流水待审批 OperationLog log new OperationLog(); log.setBusinessType(GOODS_PRICE); log.setBusinessId(oldData.getId()); log.setBeforeContent(beforeContent); log.setAfterContent(afterContent); log.setApprovalStatus(0); //待审批 log.setApplyUserId(getCurrentUserId()); operationLogMapper.insert(log); // 4.生成审批任务 ListApprovalTask taskList buildApprovalTask(log.getId()); approvalTaskMapper.insertBatch(taskList); return log.getId(); }步骤 2审批人处理审批同意 / 驳回分支 A审批【驳回】事务 2更新operation_log状态 驳回填写审批人、审批意见更新approval_task当前节点状态为驳回后续节点作废主业务表不修改事务提交业务保持旧数据流水永久留痕分支 B审批【通过】事务 3重点如果是多级审批需要判断是否是最后一级审批节点全部节点同意才触发生效javaTransactional(rollbackFor Exception.class) public void approve(Long logId, boolean pass, String comment) { OperationLog log operationLogMapper.selectById(logId); if (!pass) { // 驳回逻辑 log.setApprovalStatus(2); log.setApprovalComment(comment); operationLogMapper.updateById(log); // 更新审批任务状态 approvalTaskMapper.rejectTask(logId); return; } // 判断是否所有审批节点全部通过 boolean allApproved approvalTaskMapper.checkAllApproved(logId); if (!allApproved) { // 不是最后一级只更新当前审批任务不刷主表 approvalTaskMapper.passCurrentTask(logId); return; } // 全部审批完成开始生效把afterContent刷入主业务表 log.setApprovalStatus(1); log.setApprovalTime(LocalDateTime.now()); operationLogMapper.updateById(log); // JSON快照转实体更新主业务表 GoodsPrice target JSON.parseObject(log.getAfterContent(), GoodsPrice.class); goodsPriceMapper.updateById(target); }方案变种对比方案 A上面这套【快照流水 审批后更新主表】✅推荐适用变更字段不多、变更一次性生效查询主表就是最新生效数据。 优点业务查询简单历史变更全部存在流水审计友好。 缺点变更字段多的时候JSON 快照排查麻烦。方案 B主表保留多版本主表新增一条版本记录旧版本标记失效适用需要保留多版本历史例如合同。 逻辑审批通过新增一行主表版本旧版本置为失效不是原地 update。方案 C不维护主表业务查询时合并流水不推荐所有变更都存在流水业务查询主数据时合并所有已通过流水。 缺点查询逻辑复杂性能差适合极简单场景。重点问题 边界处理并发提交多份变更申请同一业务对象可以同时有多条「待审批」流水审批生效时需要考虑顺序。解决方案生效时加乐观锁主表加 version防止后审批的旧变更覆盖新变更。javaupdate goods_price set price?, versionversion1 where id? and versionoldVersion如果更新行数 0抛出异常数据已被其他变更覆盖。申请人撤销申请流水状态改为【撤销】审批任务作废主数据不变。审计追溯before_content和after_content是核心任何时候都可以查到这次修改前后的值。工作流选型审批节点固定、简单直接用上面approval_task表硬编码多级审批、动态审批人、会签或或签接入 Flowable / Camunda流水和工作流实例关联。生效时间控制延时生效业务需求审批通过但指定未来某个时间点才生效。 实现审批通过后主表不立即更新写入定时任务到时间执行更新流水标记 “待定时生效”。

相关推荐

不会代码也能搞定广西建设协会网站首页,一文搞懂全流程
不会代码也能搞定广西建设协会网站首页,一文搞懂全流程

不会代码也能搞定广西建设协会网站首页,一文搞懂全流程 看着那些高大上的协会官网,心里痒痒的?别慌,自己不会代码想做网站,其实没那么难。今天这篇,带你一文搞懂从域名到上线的每一个坑。咱们不整虚的,直接拆解广西建设协会这类行业站点背后的技术逻辑… · 2026/9/27 4:57:32

3年实测flash开发的网站vs现代技术:域名服务器避坑指南
3年实测flash开发的网站vs现代技术:域名服务器避坑指南

3年实测flash开发的网站vs现代技术:域名服务器避坑指南 域名服务器配置一上来就让你头大?别慌,我刚接手一个老Flash站点改造时,也卡在DNS解析和SSL证书匹配上整整两天。直到我把 flash开发的网站 与现代HTML5架构做了… · 2026/9/27 4:57:13

VDSR超分辨率复现指南:残差学习与PyTorch实现全解析
VDSR超分辨率复现指南:残差学习与PyTorch实现全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:57:01

TRIZ 入门指南:新手从 0 到第一个可落地方案的完整路径
TRIZ 入门指南:新手从 0 到第一个可落地方案的完整路径

很多人的 TRIZ 学习,都卡在同一个地方:40 个发明原理能背出来,但真遇到项目问题时,一个也想不起来用。 这不是记性问题,而是顺序问题。绝大多数人的入门路径是「先买书、再报班、最后下载软件」,结果理论装… · 2026/9/27 11:03:22

notepad--:从装到文件对比与跨文件批量搜索全流程
notepad--:从装到文件对比与跨文件批量搜索全流程

notepad--:从装到文件对比与跨文件批量搜索全流程 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- notepad-… · 2026/9/27 11:03:22

2026年GEO优化效果能承诺吗?AI算法黑盒下的合理预期与合同边界
2026年GEO优化效果能承诺吗?AI算法黑盒下的合理预期与合同边界

2026年GEO优化效果不能被承诺,任何保证引用率达到多少、保证每月多少咨询的承诺都缺乏技术依据。AI平台的推荐算法是黑盒,没有任何服务商能控制AI输出结果。靠谱的做法是在合同中写清交付物和验收标准,用过程指标和参考指标管理预期&#xff… · 2026/9/27 11:03:22

芯片烧录设备非标定制:从需求收集到落地验收的实战指南
芯片烧录设备非标定制:从需求收集到落地验收的实战指南

1. 非标定制不是从画图开始的:先把需求挖干净做芯片烧录设备这行久了,我最大的感受是,真正让项目翻车的,十个里有七个不是死在技术上,而是死在需求收集阶段。客户嘴上说“做个烧录设备”,但你问他芯片型号、… · 2026/9/27 11:03:16

基于Python就业推荐系统大数据推荐算法协同预测模型
基于Python就业推荐系统大数据推荐算法协同预测模型

随着大数据时代的来临,企业对于毕业生就业的需求和数据分析日益增长。为了满足这一需求,本文提出了一种基于Python就业推荐系统。该系统利用Python进行数据处理和分析,结合Hadoop、Spark等分布式计算技术,对海量招聘数据进行高效处… · 2026/9/27 11:02:58

红外PM2.5传感器+STM32:选型、接线、读取与避坑全攻略
红外PM2.5传感器+STM32:选型、接线、读取与避坑全攻略

有朋友找我做室内空气质量监测,预算压得很低,传感器选型最后落在红外散射式PM2.5模块上。这类模块几十块钱一片,加一块STM32最小系统板,整套成本能控制在百元以内,很适合毕业设计、智能家居联动和低成本环境监测场景。… · 2026/9/27 11:02:52

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码