# 工作项状态异常问题排查与解决手册
当遇到工作项状态异常时,请根据您看到的具体报错或现象,直接查阅下方对应的问题场景,按步骤操作即可。
# 问题一:提交任务时会报错In mothod [finishWorkItemWithStrategy],expect workItem state [10,4], but current workItem [7,682] state is [12]
原因分析: 该错误信息表示执行完成工作项方法时,期望工作项状态为10(运行)或4(待领取),但当前工作项状态为其他,不符合提交任务状态,无法提交。 当出现该错误异常时通常为当前处理人打开待办任务还未提交时,当前任务被其他人处理过。
解决步骤:
查看当前状态
SELECT STATE FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID;根据状态处理
- 状态=12(已完成):该工作项已被他人处理,刷新页面查看最新状态
- 状态=4(待领取):需要先领取再处理
- 状态=13(终止):流程已终止,无法继续
# 问题二:待办列表中有任务,但点开提示“无权限处理”
现象:能看到待办任务,点击后提示当前用户不是处理人。
解决步骤:
检查工作项参与者
SELECT PARTICIPANT, PARTICIPANTTYPE FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID;确认当前用户信息
SELECT ID, CODE, NAME FROM afc_employee WHERE CODE = '你的工号';若参与者为角色/岗位
- 检查用户是否在该角色/岗位下
SELECT * FROM afc_r_party_role WHERE PARTY_ID = '用户ID' AND ROLE_ID = '角色ID';若不在,联系管理员添加权限
# 问题三:多人会签,部分人审批后流程卡住
现象:会签节点需要多人审批,但部分人审批后流程不再继续。
解决步骤:
查看会签完成条件
- 打开流程设计器,找到该人工活动
- 检查“多工作项”->“完成条件”配置
- 常见配置:全部完成、百分比完成、按投票结果
检查已审批人数
SELECT COUNT(*) FROM WFWORKITEM WHERE PROCESSINSTID = 你的流程实例ID AND ACTIVITYDEFID = '节点ID' AND STATE = 8; -- 已完成若未达到完成条件,等待其余人审批
若配置错误,修改流程定义后重新发布
# 问题四:回退后工作项状态为“已完成”(8),无法再次提交
现象:流程回退到某节点,但该节点的工作项状态显示已完成,审批人无法处理。
解决步骤:
确认回退策略
- 检查回退按钮配置
- 原路径提交:会保留原工作项状态
- 跳转提交:会创建新工作项
查看回退后生成的新工作项
SELECT WORKITEMID, STATE, CREATE_TIME FROM WFWORKITEM WHERE PROCESSINSTID = 你的流程实例ID AND ACTIVITYDEFID = '回退目标节点ID' ORDER BY CREATE_TIME DESC;若没有新工作项,手动创建
// 调用接口重新激活工作项 workFlowManager.restartWorkItem(oldWorkItemId, userId);推荐配置:回退按钮使用“跳转提交”
# 问题五:工作项状态为“挂起”(32),无法操作
现象:工作项显示为挂起状态,所有操作按钮都不可用。
解决步骤:
查询挂起原因
SELECT SUSPEND_REASON, SUSPEND_TIME FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID;恢复工作项
// 恢复挂起的工作项 workFlowManager.resumeWorkItem(workItemId, "恢复原因");若因超时挂起
- 调整超时时间配置
# application.properties bps.workitem.timeout.default=604800000 # 改为更长时间管理端操作:流程中心→实例管理→活动实例信息→点击“恢复”
# 问题六:工作项状态为“待领取”(4),但用户已登录仍看不到
现象:用户属于该角色,但待办列表中不显示工作项。
解决步骤:
检查用户是否真的属于该角色
SELECT * FROM afc_r_party_role WHERE PARTY_ID = (SELECT ID FROM afc_employee WHERE CODE = '用户工号') AND ROLE_ID = (SELECT ID FROM afc_role WHERE CODE = '角色编码');检查工作项参与者记录
SELECT PARTICIPANT FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID; -- 返回值可能是角色ID,也可能是多个用|分隔的ID若参与者包含角色ID,正常
若参与者为空,说明数据异常,手动修复
UPDATE WFWORKITEM SET PARTICIPANT = '角色ID' WHERE WORKITEMID = 你的工作项ID;
# 问题七:集群环境下,A节点处理了工作项,B节点仍显示未处理
现象:多节点部署,用户在一台服务器处理了任务,刷新后另一台服务器仍显示待处理。
解决步骤:
检查Redis会话共享配置
# application.properties spring.session.store-type=redis spring.redis.host=你的redis地址 spring.redis.port=6379检查分布式锁表
-- 确认eos_lock表存在 SELECT COUNT(*) FROM eos_lock; -- 若不存在,执行bps初始化脚本强制刷新缓存
// 清除工作项缓存 workFlowManager.evictWorkItemCache(workItemId);重启服务顺序:Redis → Nacos → BPS → AFCenter → 业务应用
# 问题八:工作项状态显示“已完成”(8),但流程节点仍高亮
现象:工作项已完成,但流程图中该节点仍显示为进行中状态。
解决步骤:
检查该节点下是否有多个工作项
SELECT COUNT(*) FROM WFWORKITEM WHERE PROCESSINSTID = 你的流程实例ID AND ACTIVITYDEFID = '节点ID';若有多个,查看是否全部完成
SELECT STATE, COUNT(*) FROM WFWORKITEM WHERE PROCESSINSTID = 你的流程实例ID AND ACTIVITYDEFID = '节点ID' GROUP BY STATE;若全部完成但流程图显示异常
- 清除浏览器缓存
- 重新加载流程图
若问题依旧,可能是前端缓存问题,打补丁
- PLATFORM_8.3.2_AFCENTER_UI_20251229_P1(移动端流程图问题)
- PLATFORM_8.3.3_AFCENTER_UI_20250919_P1(PC端流程图问题)
# 问题九:批量处理时,部分工作项提交成功,部分失败
现象:选择多个待办批量提交,有的成功,有的报错“工作项状态异常”。
解决步骤:
查看失败的批量请求日志
grep "batch" bps.log | grep "workItemId"逐个检查失败的工作项状态
SELECT WORKITEMID, STATE FROM WFWORKITEM WHERE WORKITEMID IN (失败的工作项ID列表);常见原因及处理
- 状态=8:已被他人处理 → 告知用户
- 状态=4:未领取 → 先领取再批量处理
- 状态=16:已终止 → 忽略
优化批量处理逻辑
// 批量处理前先过滤掉状态异常的工作项 List<Long> validItems = new ArrayList<>(); for (Long id : workItemIds) { WFWorkItem item = workItemManager.getWorkItem(id); if (item.getState() == 2) { // 只处理运行中的 validItems.add(id); } }
# 问题十:工作项长时间卡在“运行中”(2),无人处理
现象:工作项状态正常,但指定处理人一直未收到待办。
解决步骤:
确认处理人是否正确
SELECT PARTICIPANT, PARTICIPANTTYPE FROM WFWORKITEM WHERE WORKITEMID = 你的工作项ID;检查处理人账号是否正常
SELECT STATUS FROM afc_employee WHERE ID = '参与者ID'; -- STATUS=0为正常,1为禁用若参与者为角色,检查角色下是否有人员
SELECT * FROM afc_r_party_role WHERE ROLE_ID = '角色ID';手动转交给其他处理人
- 在流程中心→待办任务→点击“转交”
- 选择新的处理人
若需批量处理,写脚本转交
// 转交工作项 workFlowManager.transferWorkItem(workItemId, newParticipantId, "转交原因");
# 快速排查清单(速查表)
| 问题现象 | 可能原因 | 快速操作 |
|---|---|---|
| 提交报错“not running” | 状态异常 | 查WFWORKITEM.STATE,状态=4时先领取 |
| 有任务但点不开 | 参与者错误 | 对比PARTICIPANT和当前用户ID |
| 会签卡住 | 完成条件未达 | 查已完成数量,对照完成条件 |
| 回退后无法处理 | 回退策略错误 | 改用“跳转提交” |
| 状态=32挂起 | 超时/手动挂起 | 调用resumeWorkItem恢复 |
| 集群不同步 | Redis未配置 | 配置spring.session.store-type=redis |
| 流程图状态不对 | 缓存问题 | 清浏览器缓存,刷新页面 |
| 批量处理部分失败 | 部分状态异常 | 过滤掉状态!=2的工作项 |
# 紧急修复脚本(谨慎使用)
-- 1. 备份数据
CREATE TABLE WFWORKITEM_BAK_日期 AS SELECT * FROM WFWORKITEM WHERE WORKITEMID IN (问题ID列表);
-- 2. 修复为运行中(仅限确认没问题的工作项)
UPDATE WFWORKITEM
SET STATE = 2, UPDATE_TIME = NOW()
WHERE WORKITEMID IN (问题ID列表)
AND STATE NOT IN (8, 16); -- 不能修复已完成或终止的
-- 3. 清理分布式锁
DELETE FROM eos_lock WHERE LOCK_KEY LIKE '%workitem_问题ID%';
如遇到未覆盖的问题,请提供:
- 完整报错信息
- 工作项ID和当前状态
- 操作步骤
- bps.log中相关日志