政务工作流实战——突破Activiti的五个关键决策(综述)
政务工作流实战突破Activiti的五个关键决策非科班野生程序员深耕政务信息化20年。从VC到PB再到Java自研框架browise打磨了十几年。政务审批系统的核心是工作流但我们用的Activiti 5.13在政务场景下处处碰壁——不支持任意跳转、没有流程图追踪、会签做不了、事务管不住、分支条件总忘加。啃了两个月源码找到五个突破口。不求优雅但求落地全是政务场景踩坑后的实用解法。最后感谢豆包、智谱、OpenCode决策是我做的代码是我搓的文字是他们总结的。系列导览一、任意流转——在别人的框架里找洞Activiti原生只能按BPMN定义的路径走。但政务场景是科长要能直接跳到处长、退回到科员、转办到其他科室。我的方案是在运行时动态修改ActivityImpl的连线跳转完成后恢复原状——不改流程定义不影响其他实例。核心方法turnTransition()啃了将近两个月才找到这个洞。关键词ActivityImpl、turnTransition()、运行时动态改连线、跳退回退二、流程图追踪——自己解析BPMN自己画图用户最常问我的申请走到哪了。Activiti 5.13的流程图追踪能力很弱——纯英文、不标处理人、不标时间。我的做法是自己解析BPMN XML用Java2D画图把任务执行信息直接标注在节点上已完成的节点标绿色打勾、当前节点标红色、未到达的灰色。政务用户一眼看懂。关键词BPMN XML解析、Java2D画图、节点着色、处理人和时间标注三、外挂会签——不改流程定义独立子流程搞定Activiti的multiInstance要求改流程定义、参与者写死、规则不灵活。政务场景下会签部门经常变今天三个部门明天四个。我的方案是不用multiInstance不改主流程定义用独立的子流程自建hq关联表实现会签。会签部门随时加、随时减主流程完全不受影响。关键词外挂子流程、hq关联表、动态会签、一票否决/全部通过四、分支条件自动注入——启动时扫描BPMN补全业务人员画流程图经常忘记给分支连线加条件表达式。开发时才发现缺条件回头改BPMN XML不现实。我的方案是流程部署之前自动扫描BPMN里所有sequenceFlow找出同一个源节点有多条连线的情况自动注入${nextid连线id}条件。业务人员只管画图条件框架自动补。关键词sequenceFlow扫描、条件表达式自动注入、XMLUtil.parse()五、事务统一——空壳化Activiti的JdbcTransaction业务表和Activiti流程实例必须在同一个事务里。但Activiti默认自己管连接MyBatis也自己管连接。我的方案是继承JdbcTransaction把commit/rollback/close全部架空让框架的统一事务管理器来管。Activiti以为自己管着事务实际上连接和生命周期全在框架手里。关键词CustomJdbcTransaction、空壳化、统一事务管理一句话总结Activiti是个好引擎但政务场景的需求超出了它的设计边界。与其抱怨它不够用不如在它的边界上找突破口——动态改连线、自己画图、外挂子流程、自动补条件、空壳化事务。五个决策一个原则不碰别人的源码在别人的框架里找到自己的路。