SpringBoot+Flowable 流程抄送设计:COPY_NODE、候选人解析与「抄送我的」台账如何落地
🌐演示地址:http://ruoyioffice.com | 📦源码1·GitHub:ruoyi-office | 📦源码2·GitCode:ruoyi-office | 📦源码3·Gitee:ruoyi-office | 💬微信:17156169080(备注「RuoYi Office」)
加签、转办改的是「谁来审」;超时管的是「人不审怎么办」。还有一类刚需:领导要知情,但不该出现在待办里挡流程。这就是抄送——知会不审批。本文讲 RuoYi Office 如何把简单流程「抄送人」节点与办理中手动抄送,都落到同一张抄送台账。
▲ 新风格全景(纸感双栏):自动抄送节点 vs 手动抄送动作,中间「台账同源」;底部强调不是待办
引言:抄送不是缩小版审批
| 审批 / 办理 | 抄送 | |
|---|---|---|
| 任务形态 | UserTask / 待办 | 台账记录,通常无待办完成动作 |
| 是否卡住流程 | 是(除非或签等提前完成) | 否 |
| 配置入口 | 审批人节点 | COPY_NODE 或办理按钮 |
| 列表入口 | 我的待办 / 已办 | 抄送我的 |
配错后果:把抄送人做成审批人 → 领导待办爆炸、流程被不知情节点卡住。
一、自动抄送:COPY_NODE → ServiceTask
简单流程节点类型:
COPY_NODE(12,"抄送人","serviceTask"),SimpleModelUtils.CopyNodeConvert:
ServiceTaskserviceTask=newServiceTask();serviceTask.setImplementationType(DELEGATE_EXPRESSION);serviceTask.setImplementation("${bpmCopyTaskDelegate}");addCandidateElements(candidateStrategy,candidateParam,serviceTask);执行时BpmCopyTaskDelegate:
Set<Long>userIds=taskCandidateInvoker.calculateUsersByTask(execution);if(CollUtil.isEmpty(userIds))return;processInstanceCopyService.createProcessInstanceCopy(userIds,null,processInstanceId,activityId,activityName,null);要点:
- 复用候选人策略——指定角色/部门负责人/自选等与审批节点同一套 Invoker
- 空抄送人直接跳过——不抛错卡死流程
- 无 taskId(节点自动抄送)——台账仍记 activityId/Name
▲ 在流程模型里插入「抄送人」节点并配置候选人;发布后随定义自动执行
二、手动抄送:办理中 copyTask
审批人办理时选人抄送:
// BpmTaskServiceImplprocessInstanceCopyService.createProcessInstanceCopy(reqVO.getCopyUserIds(),reqVO.getReason(),reqVO.getId()/* taskId */);重载先取 Task,再写入:
userId(被抄送人)reason(抄送意见)processInstanceId/processInstanceName/categorytaskId/activityId/activityNamestartUserId
自动与手动最终都进BpmProcessInstanceCopyDO批量 insert。
三、台账与入口:「抄送我的」
▲ 「抄送我的」:只读知会列表,与待办分离;可从工作台抄送 Tab 进入
▲ 对照:待办要处理才会推进;抄送列表不承担 completionCondition
产品语义建议:
- 打开抄送单据 → 详情只读(或按表单字段权限)
- 不提供「同意/拒绝」主按钮(除非你们另做「阅知确认」产品,那是另一条状态机)
四、和协作能力的边界
| 能力 | 改变什么 |
|---|---|
| 加签 / 转办 / 委派 | 审批责任人 |
| 候选人策略 | 下一关谁审 |
| 超时处理 | 人不审时系统动作 |
| 抄送 | 知情面,不改审批责任 |
消息通知可在写台账后额外推送;但「抄送成功」的数据真相源应是抄送表,而不是只发一条易丢的 IM。
五、推荐体验路径
在线演示:http://ruoyioffice.com/web/(账号admin/admin123)
- 流程模型:加一个抄送人节点(如抄送发起人部门负责人),发布。
- 发起流程,用被抄送账号打开抄送我的,确认有记录且无待办。
- 在审批待办中点抄送其他人,再看台账是否多一条带 reason 的记录。
- 确认流程不因抄送人未读而卡住。
源码仓库:GitHub | GitCode | Gitee
常见问题(FAQ)
抄送人会不会收到待办?
默认不会。Delegate 只写抄送表;待办来自 UserTask。若消息中心另发通知,那是提醒通道,不是审批任务。
抄送节点候选人解析失败怎么办?
当前实现 userIds 为空则 return,流程继续。若业务要求「必须抄到人」,需在模型校验或 Delegate 内显式失败策略。
和「抄送即知会确认」有何差别?
知会确认要额外状态(已阅/未阅)与可能的阻塞规则;本设计是轻量台账。加已阅可在抄送表扩字段,不必改成 UserTask。
手动抄送能否抄给自己?
取决于前端是否过滤;后端按 userIds 写入。产品上可禁自抄,减少噪声。
结语
流程抄送的工程要点是:自动节点用 ServiceTask + 候选人 Invoker,手动动作走 copyTask,两者写入同一台账;入口与待办彻底拆开。这样领导能知情,流程不被「假审批人」拖死。
你们现在抄送是 IM 群里@一下,还是流程里有正式节点?有没有把抄送误配成会签?欢迎评论区交流。
💡想要体验 RuoYi Office 的强大功能?
🌐在线演示:http://ruoyioffice.com/web/(账号 admin / admin123)
📦源码仓库:GitHub | GitCode | Gitee
💬技术咨询:添加微信17156169080,备注「RuoYi Office」
⭐如果觉得不错,请给个 Star 支持一下!