You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Activiti BPM 6.0.0.3流程实例重分配问题咨询

嘿,我之前在Activiti 6.x版本里碰到过几乎一模一样的问题,给你几个经过验证的可行方案,针对你说的流程实例没有活跃人工任务的场景:

方案1:扩展Activiti的Mapper和Service,手动更新START_USER_ID_

默认的updateExecution方法确实不支持修改START_USER_ID_字段,那我们可以自己扩展核心操作:

  • 先在自定义的IBatis Mapper XML文件里新增一个专门的更新语句,针对ACT_RU_EXECUTION表的START_USER_ID_:
<update id="updateExecutionStartUserId" parameterType="java.util.Map">
  UPDATE ACT_RU_EXECUTION
  SET START_USER_ID_ = #{newStartUserId}
  WHERE ID_ = #{executionId} AND PARENT_ID_ IS NULL
</update>

这里加PARENT_ID_ IS NULL是为了确保只更新根流程实例的记录,避免误改子流程的execution。

  • 然后在你自己封装的Activiti服务类里,注入SqlSession对象,调用这个自定义的Mapper方法来执行更新操作。
  • 记得要包裹在事务里,避免出现数据不一致的情况。
方案2:业务层补全负责人标记,结合历史表更新

如果不想改动Activiti的核心Mapper,可以从业务侧做兼容:

  • 在你的业务数据库里新建一张关联表,比如PROC_INST_ASSIGNEE,字段包括PROC_INST_ID_、ASSIGNEE_USER_ID、UPDATE_TIME,用来记录流程实例的实际负责人。
  • 当需要重分配时,直接更新这张业务表的ASSIGNEE_USER_ID;如果需要同步历史数据,也可以自定义Mapper更新ACT_HI_PROCINST表的START_USER_ID_(历史表的更新限制比运行时表少很多)。
  • 后续系统查询流程负责人时,优先读取业务表的记录,没有的话再 fallback 到Activiti原生的START_USER_ID_。
方案3:临时插入无感知人工任务(适合可修改流程定义的场景)

如果你有权限修改流程定义,可以用一个小技巧绕开运行时表的更新限制:

  • 在流程的当前暂停节点后面,临时插入一个人工任务节点,设置自动分配给目标重分配用户,同时给这个任务加一个任务创建监听器。
  • 监听器里做两件事:一是自动完成这个任务,二是调用自定义Mapper更新根流程实例的START_USER_ID_。
  • 这个任务会被自动创建并完成,用户完全感知不到,流程会继续正常流转,同时你也完成了负责人的更新。

几个关键注意点

  • 不管用哪个方案,都要确保操作在事务中执行,避免流程状态和负责人字段更新不一致。
  • 如果你的系统有基于用户的流程权限控制,重分配后一定要同步更新权限配置,确保新负责人能正常访问后续流程节点。

内容的提问来源于stack exchange,提问作者Dahakka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:19:42