驰骋CCFlow-同表单分合流-功能列表

CCFlow 同表单分流需求列表

依据代码整理:CCFlow/Components/BP.WFVue3/src/WF/WorkOptVue3/src/WF/Admin/AttrNodeVue3/src/WF/MyFLDealThread.vueVue3/src/WF/ToolBar.vue

说明:本文档聚焦 同表单子线程(RunModel=4 / SubThreadSameWorkID) 及其与 分流(FL)/分合流(FHL)/合流(HL) 节点的协同能力;异表单分流(RunModel=5)仅在对比或共用机制处提及。


一、总体架构

同表单分流采用「干流程(FID=0)+ 子线程(FID=干流程WorkID) 」双层实例结构,子线程与干流程 共用同一张物理表单表(Flow.PTable) ,通过 FID 字段关联。

层级 节点类型(RunModel) 数据特征 典型作用
干流程 0 线形 / 2 分流 / 3 分合流 / 1 合流 WorkID 为主键,FID=0 发起、分流、合流汇总
子线程 4 同表单 独立 WorkIDFID=干流程WorkID 并行处理同一表单的不同人员任务

典型拓扑:普通节点 → 分流/分合流节点 → 同表单子线程节点(可多个处理人)→ 合流节点 → 后续节点

核心后端入口:WorkNode.NodeSend_24_SameSheet(分流到同表单)、WorkNode.NodeSend_53_SameSheet_To_HeLiu(子线程到合流)。


二、功能需求明细表

(一)设计配置 --- 节点运行模式

功能类别 功能名称 功能说明 需求场景概述
节点类型 同表单子线程节点 RunModel=4SubThreadSameWorkID),节点工作类型为 SubThreadWork;与异表单(5)区分 多人并行处理同一份主表数据,如多部门会签、多专业并行审批
节点类型 分流节点 RunModel=2(FL),向下可连接同表单子线程 将干流程拆分为多条并行子线程
节点类型 分合流节点 RunModel=3(FHL),兼具分流与合流能力 一个节点完成分流下发与合流汇总,简化流程图
节点类型 合流节点 RunModel=1(HL),等待子线程按通过率到达后激活干流程待办 汇总各子线程结果后继续主流程
流程约束 分流仅连一条同表单路径 分流节点若仅有一个后续节点且为同表单,调用 NodeSend_24_SameSheet 标准同表单分流场景
流程约束 禁止多同表单并行分支 分流同时启动多个同表单子线程节点时报错 workflow_error_5 避免同一分流点产生多套同表单分支
流程约束 禁止同异表单混发 分流同时启动同表单与异表单子线程时报错 workflow_error_4 保证分支类型一致
流程约束 普通节点不可直连子线程 线形节点直接连接同表单/异表单子线程节点报错 workflow_error_3 子线程必须由分流/分合流节点发起
流程约束 合流节点不可下连子线程 合流节点下连接子线程节点报错 workflow_error_6 子线程只能在合流之前运行
表单权限 同表单主键规则 同表单子线程(及按接收人生成 WorkID 的异表单)表单权限 WhoIsPK 必须为 WorkID(OID),不能为 FID 保证每个子线程独立读写自己的表单实例
表单校验 物理表一致性 FlowCheckError.CheckMode_SpecTable 强制同表单子线程 PTable 与流程主表一致 设计期自动修复/告警,防止表单映射错误
完成通过率 PassRate 合流节点 PassRate(默认 100),按「已到达合流子线程数 / 总子线程数 × 100」判断是否激活干流程待办 允许部分子线程完成即可合流(如 3 人中 2 人完成)
子线程删除方式 ThreadKillRole 合流节点:0 不能删除(须全部完成)、1 手工删除、2 自动删除未完成子线程 合流前仍有子线程未完成时的处理策略(WorkNodePlus.DealHeLiuState
增加子线程 ThreadIsCanAdd 分流/分合流节点:当前节点已发出子线程后,是否允许追加子线程;要求后续仅一条子线程路径 流程运行中补发遗漏处理人
增加子线程(合流) ThreadIsCanAddOfHL 合流节点是否允许增加子线程(ThreadDtl.vueFID==0 时判断) 合流阶段补录子线程
删除子线程 ThreadIsCanDel 分流/分合流节点:子线程退回后,是否允许删除/撤销整体发送 部分子线程退回后由分流人清理
移交子线程 ThreadIsCanShift 是否允许移交已发出的子线程(配置项,默认关闭) 子线程处理人变更
退回联动 IsKillEtcThread 子线程节点退回规则:0 不删除其它子线程、1 删除其它子线程、2 由退回人决定(ReturnWork.vue 复选框) 一个子线程退回分流点时,其余子线程是否一并取消
按钮权限 子线程按钮 ThreadEnable 控制工具栏「子线程」按钮;ThreadLab 自定义标签 分流人/合流人查看子线程明细入口
按钮权限 预置处理人 PreplaceWokerEnable:发送前/单独维护子线程接收人(PreplaceWoker.vue 组织树选人) 分流前预先指定各子线程处理人

(二)设计配置 --- 子线程接收人规则(DeliveryWay)

功能类别 功能名称 功能说明 需求场景概述
接收人 按明细表确定子线程接收人 ByDtlAsSubThreadEmps:读取分流节点表单明细表,须含 UserNoDeliveryParas 指定字段;仅子线程节点可用 报销明细每行指定一个审批人,自动按行发起子线程
接收人 按 SQL 确定接收人与数据 BySQLAsSubThreadEmpsAndData:执行节点 SQL,结果集同时提供人员与行数据;按索引复制到各子线程主表 外部数据源驱动多人并行,且每人携带不同业务字段
接收人 按绑定部门(子线程) BySetDeptAsSubthread:绑定部门中一人完成即该部门子线程结束;返回 GroupMark 按部门维度并行,部门内任一人员处理即可
接收人 按绑定人员 ByBindEmp 等常规规则 固定人员列表发起子线程
接收人 子线程通用数据源 SubThreadByGenerDBSrc 等扩展方式 与流程数据源组件联动
校验 非子线程误配 明细表/SQL/部门子线程方式配置在非子线程节点时抛异常 设计期防止接收人规则与节点类型不匹配
校验 明细表无数据 明细表方式找不到 UserNo 字段或无数据时报错并提示检查分流节点明细表 发起前数据完整性校验

(三)运行期 --- 分流下发(干流程 → 同表单子线程)

功能类别 功能名称 功能说明 需求场景概述
分流发送 同表单分流核心逻辑 NodeSend_24_SameSheet:由分流/分合流节点向同表单子线程节点发送 一次发送产生 N 条子线程待办
数据复制 主表数据复制 复制干流程 rptGe、当前 HisWork 到各子线程 Work;设置 mywk.FID = 干流程WorkIDRec = 接收人 各处理人看到相同基础表单内容
数据复制 明细表数据复制 从分流节点明细表(MapDtls)复制到子线程;支持多明细表 子线程继承分流节点填写的明细
数据复制 SQL/明细行级复制 BySQLAsSubThreadEmpsAndData / ByDtlAsSubThreadEmps 时按 idxDataRow 复制到对应子线程主表 每人处理不同明细行数据
数据复制 附件复制 SendToSameSheet_CopyData 复制 FrmAttachmentDB,重映射 FrmIDRefPKVal;单附件/多附件主键规则分别处理 子线程可查看分流节点上传的附件
数据复制 签名/电子签章复制 复制 FrmEleDB(非图片类),重映射节点表单 ID 继承分流节点表单签章
实例标识 子线程 WorkID 生成 默认 DBAccess.GenerOID("WorkID") 或 GUID 模式;每个接收人一条子线程实例 独立跟踪每条子线程
实例标识 分合流再次分流复用 若曾走过分合流,按「同节点+同FID+同人员」查找历史 WorkID 并复用数据 子线程退回后再次下发不丢历史
分组批次 GroupMark 分组 ItIsHaveSubThreadGroupMark=true 时,同 GroupMark 仅生成一个 WorkID,多人共享子线程实例 按部门/批次分组,组内一人完成即可
分组批次 重复人员去重 启用 GroupMark 时对 EmpNo+GroupMark 去重,删除重复 GenerWorkerList 避免同组重复待办
状态维护 ThreadCount 归零 分流时 HisGenerWorkFlow.SetPara("ThreadCount", 0) 为合流通过率计算准备计数
状态维护 节点名称追加 分流时 NodeName 追加子线程节点名 干流程列表展示当前所在分支
轨迹记录 分流前进 记录 ActionType.ForwardFL(分流前进) 轨迹图/时间轴标识分流动作
异常防护 同表单重复发送 分流点下同表单已发送后再次发送会检测并报错(#region 如果是分流点下同表单发送失败再次发送就出现错误 防止重复拆分子线程
发送失败 发送失败回滚 分流发送异常时回滚机制,避免干流程与子线程状态不一致 保证数据一致性

(四)运行期 --- 子线程处理与向下发送

功能类别 功能名称 功能说明 需求场景概述
待办打开 子线程独立待办 子线程处理人待办 WorkID 为子线程 ID,FID 指向干流程;MyFlowTree 等同表单节点特殊处理 处理人仅看到自己的子任务
表单访问 查看子线程表单 ThreadDtl.OpenFrm / MyFLDealThread.OpenFrm 打开 MyView,传入 WorkID/FID/FK_Node 分流人从管理界面查看任意子线程表单
子线程发送 子线程向下运行 RunModel.SubThreadSameWorkID 节点向下发送,动作类型 ActionType.SubThreadForward 子线程内各节点正常审批
子线程发送 子线程到合流 NodeSend_53_SameSheet_To_HeLiu:子线程完成后向合流节点汇聚 并行分支汇入主流程
数据汇总 合流主表数据合并 将子线程报表数据写回合流点干流程主表(排除系统字段) 合流后主表单体现各子线程填写结果
数据汇总 合流明细汇总 GenerHieLiuHuiZhongDtlData_2013 生成合流汇总从表数据 多子线程明细合并展示
数据汇总 同表单绑定不重复拷贝 合流节点与子线程绑定相同 NodeFrmIDisCopyData=false 避免重复覆盖已合并数据
通过率 合流到达计数 记录 ThreadCount,计算 passRate = ThreadCount / 总子线程数 × 100 判断合流条件
通过率 达到通过率激活待办 passRate >= PassRate 时,合流节点 GenerWorkerList.IsPass 置 0,干流程处理人可见待办 满足比例后推进主流程
通过率 未达通过率隐藏待办 未达标时合流节点 IsPass=3(在途不可见状态) 等待更多子线程完成
轨迹记录 子线程前进 ActionType.SubThreadForward,前端 WorkCheckParseTrack/TimeBase 绿色展示 时间轴区分子线程与普通过件
轨迹记录 合流前进 ActionType.ForwardHL 标识合流节点激活
提示信息 到达合流提示 提示「流程已运行到合流节点」「您是第 N 个到达的处理人」 处理人了解合流进度

(五)运行期 --- 子线程退回与分流人处理

功能类别 功能名称 功能说明 需求场景概述
子线程退回 退回到分流节点 子线程节点可退回到上游分流/分合流节点;WFState=ReturnSta 子线程处理人认为需发起人修改后重办
退回规则 全部子线程退回选项 IsKillEtcThread=1 时退回并删除其它子线程;ReturnWork.vue 展示「全部子线程退回」复选框 一人退回即终止其余并行任务
退回规则 由退回人决定 IsKillEtcThread=2 时退回人勾选是否删除其它子线程 灵活处理部分退回
分流人界面 子线程退回处理页 MyFLDealThread.vue:分流人打开后展示退回子线程、可发起节点、运行中子线程 分流人集中处理退回后的子线程
分流人界面 退回子线程列表 展示退回节点、退回人、日期、退回原因;支持「发送」「终止」 逐条处理已退回子线程
分流人界面 可发起子线程节点 WF_ThreadNode 列表,展示可追加子线程的节点(ThreadIsCanAdd=1 且非同表单多路径) 补发新的子线程
分流人界面 运行中子线程 GenerWorkFlow 卡片展示标题、待办人、发起时间;嵌套 GenerWorkerList 节点/人员/状态 总览所有在途子线程
分流人工具栏 分流退回专用工具栏 Flow_IsCanToFLTread 为真时加载 InitToolBar_ForFenLiu:查看表单、撤销整体发送、增加子线程、轨迹 子线程退回后分流人操作集合
单条重发 发送退回子线程 ThreadDtl_SendSubThreadNode_SendSubTread:恢复子线程为运行态,更新待办,支持小纸条 ScripMsg 分流人修改后重新下发该子线程
单条重发 末条子线程重发联动 若所有退回子线程已处理,自动将干流程置为运行态并跳转 MyView 全部分支恢复后回到主流程
子线程退回 ThreadDtl 单条退回 ThreadDtl.ReturnThread 打开 ReturnWorkFromPage=ThreadDtl,预选退回目标 分流人从子线程管理界面代为退回
撤销退回 撤销子线程退回 UnReturnThread 调用 MyView_UnReturn 误退回后恢复
分流人判断 是否分流退回态 Flow_IsCanToFLTreadFID!=0WFState=ReturnSta 且当前在 FL/FHL 节点 决定是否进入分流处理模式

(六)运行期 --- 子线程增删与管理

功能类别 功能名称 功能说明 需求场景概述
子线程管理弹窗 ThreadDtl 组件 ToolBar 点击「子线程」打开 ThreadDtl 弹窗(宽 70%);合流节点干流程人查看 查看所有子线程运行明细
子线程列表 按 GenerWorkFlow 分组 每张卡片对应一条子线程实例:标题、待办人员、发起时间 一览子线程概况
子线程列表 节点处理明细表 列:节点、处理人、状态(已完成/未读/已读未处理)、应完成日期、实际完成日期 掌握子线程内部进度
子线程列表 空状态 无子线程时展示「当前暂时没有子线程」占位 合流节点尚未下发或已全部结束
增加子线程 合流节点增加 ThreadIsCanAddOfHLFID==0 时显示「增加子线程」;输入人员账号(逗号分隔) 合流阶段补录漏发人员
增加子线程 分流节点增加 ThreadIsCanAdd 且后续仅一条子线程路径;DoSubFlowAddEmpsNode_FHL_AddSubThread 分流后补发新人员
增加子线程 新增从下一节点执行 提示「新增加的人员,从分流节点的下一个节点开始执行」 补发人员不重复走子线程入口
增加子线程 人员校验 校验账号存在性,支持中英文逗号/分号分隔 防止无效人员
增加子线程 数据复制 新建 GenerWorkFlowGenerWorkerListwkSub.Copy(wk) 复制干流程表单 新子线程继承当前主表数据
终止子线程 手工终止 ThreadDtl_DelSubThreadFlow_DeleteSubThreadDoDeleteWorkFlowByReal 分流人终止异常/多余子线程
终止子线程 终止权限 ThreadKillRole=1(手工删除)时 ThreadDtl 显示「终止」链接 按节点配置控制是否可删
终止子线程 终止后合流重算 删除后按剩余子线程重算合流 PassRate,可能自动激活合流待办或恢复分流待办 终止子线程后自动调整主流程状态
终止子线程 全部终止后恢复分流 若所有子线程已删除,恢复分流节点处理人待办并跳转 MyFlow 所有分支取消后回到分流人
撤销整体发送 UnSendAllThread 删除 FID 下全部子线程,分流节点待办恢复,WFState=Running,记录 DeleteSubThread 轨迹 分流人整体收回所有子线程
撤销整体发送 权限控制 ThreadIsCanDel=true 且当前用户为分流发送人 防止非发起人误操作
单条删除 KillSubThread 分流节点删除单条已退回子线程(WF_MyFlow 清理退回后不再需要的子线程
轨迹记录 删除子线程 ActionType.DeleteSubThread,记录删除原因(手工删除/自动删除/分流点手工删除等) 审计子线程被终止的原因

(七)运行期 --- 撤销发送与合流控制

功能类别 功能名称 功能说明 需求场景概述
撤销发送 合流节点撤销 撤销前删除 FID 下所有子线程实例(Flow_DeleteSubThread 合流后发现异常需回到分流
撤销发送 分合流撤销 DoUnSendInFeiLiuHeiliu:恢复分流节点待办,删除合流及子线程待办 分合流节点专用撤销
合流前检查 未完成子线程阻断 DealHeLiuStateThreadKillRole=None 时存在未完成子线程则禁止合流节点向下发送,并列出人员与节点 强制全部完成再推进
合流前检查 手工删除提示 ThreadKillRole=ByHand 时提示「请通知处理完成或强制删除子流程」 允许人工干预未完成分支
合流前检查 自动删除 ThreadKillRole=ByAuto 时自动 Flow_DeleteSubThread 删除未完成子线程后继续 超时或不再等待的场景
撤销范围 SpanSubTheadNodes 递归计算合流点与上游分流点之间所有子线程节点 ID,用于统计与撤销 精确定义子线程节点范围

(八)运行期 --- 轨迹、审核与时间轴

功能类别 功能名称 功能说明 需求场景概述
流程轨迹 OneWork 多页签 OneWork_GetTabs 返回轨迹图(Truck)、时间轴(TimeBase)、时间表(Table) 查看整单(含子线程)运转情况
时间轴 子线程待办展示 TimeBase.vue:分流/合流/分合流节点下,按 gwl.FID === WorkID 过滤展示子线程待办 干流程处理人看到各子线程当前处理人
时间轴 分流前进着色 ActionType.ForwardFL 绿色标识 区分分流与普通发送
时间轴 子线程前进着色 ActionType.SubThreadForward 绿色标识 区分子线程内部流转
时间轴 合流前进着色 ActionType.ForwardHL 绿色标识 标识合流动作
轨迹图 分流节点到达判断 Track.vueForwardFL 做特殊到达判断 流程图正确展示分流状态
审核组件 干/子 WorkID 切换 WorkCheck.vue 使用 `RealWorkID
审核轨迹 普通/轨迹/时间模式 WorkCheckParse / WorkCheckParseTrack / WorkCheckParseTrackTime 三套展现 按节点审核组件配置展示
审核轨迹 分流/子线程动作标签 分别展示「分流前进」「子线程前进」「合流前进」 审核轨迹中读懂分支动作
审核轨迹 待办状态 展示「处理中」「未开始」等中间态 当前节点尚未完成时

(九)运行期 --- 催办、预置处理人与辅助能力

功能类别 功能名称 功能说明 需求场景概述
催办 子流程催办 Flow_DoPress(workID, msg, isPressSubFlow=true) 支持催办子线程待办 分流人催促子线程处理人
预置处理人 组织树选人 PreplaceWoker.vue 调用 SelectEmps_Init 按部门懒加载人员树 发送前指定各子线程接收人
预置处理人 发送前强制打开 PreplaceWokerEnable=2 发送前自动弹出预置界面 确保分流前人员已确定
待办过滤 同表单待办识别 GL_MyPressWork 等列表对 RunModel=4/5FID!=0 做特殊处理 待办列表正确显示子线程任务
合流查询 合流点子线程查询 DB_GenerHLSubFlowDtl_TB 获取同表单合流点上的子线程 GenerWorkerList 合流节点展示各分支状态
权限 轨迹查看权限 Flow_IsCanViewTruck 对子线程节点类型直接返回 true 子线程参与人可查看轨迹
退回初始化 ThreadDtl 专用退回 ReturnWorkFromPage=ThreadDtl 时跳过后端 Return_Init,直接使用传入节点与处理人 简化分流人代退回操作

(十)后端 API 与数据实体

功能类别 功能名称 功能说明 需求场景概述
HTTP 接口 ThreadDtl_Init WF_MyFlow:加载节点信息、可发起子线程节点、退回子线程、GenerWorkFlow/GenerWorkerList MyFLDealThread 页面初始化
HTTP 接口 ThreadDtl_SendSubThread 发送单条退回子线程 分流人重发
HTTP 接口 ThreadDtl_DelSubThread 删除/终止子线程,含合流通过率联动 子线程管理终止
HTTP 接口 ThreadDtl_DelSubThread WF_WorkOpt:合流节点弹窗内删除子线程 ThreadDtl.vue 终止
HTTP 接口 Return_DoReturn 支持 IsKillEtcThread 参数 子线程退回时联动删除其它分支
HTTP 接口 MyView_UnReturn 撤销子线程退回 恢复误操作
HTTP 接口 UnSendAllTread 撤销整体发送 分流人收回全部分支
HTTP 接口 InitToolBar / InitToolBar_ForFenLiu 常规定义与分流退回专用工具栏 前端 ToolBar 按钮渲染
HTTP 接口 WorkCheck_Init / WorkTrack_Init 审核组件数据,含子线程轨迹 表单审核区
HTTP 接口 OneWork_GetTabs 流程运转页签 OneWork.vue
实体方法 GenerWorkFlow.DoSubFlowAddEmps 干流程实例上增加子线程人员 合流/分流补人
实体方法 Dev2Interface.Node_FHL_AddSubThread 核心增线程逻辑 后端统一入口
实体方法 Dev2Interface.Flow_DeleteSubThread 删除子线程并写轨迹 终止/撤销统一入口
实体方法 Dev2Interface.Node_FHL_DoReject 合流点驳回子线程 合流人打回分支
实体方法 Dev2Interface.Node_SendSubTread 单条子线程重发 退回后重办
数据表 WF_GenerWorkFlow.FID 子线程记录关联干流程 WorkID 主从实例关联
数据表 WF_GenerWorkerList.FID/IsPass 子线程待办;IsPass=-2 表示分流人观察态;IsPass=3 合流在途 待办状态机
数据表 ND{FlowNo}Track 记录 ForwardFL / SubThreadForward / ForwardHL / DeleteSubThread 等 全链路审计

三、关键动作类型(ActionType)对照

动作值 名称 含义 前端展示
6 ForwardFL 分流前进 绿色「分流前进」
7 ForwardHL 合流前进 绿色「合流前进」
11 SubThreadForward 子线程前进 绿色「子线程前进」
23 DeleteSubThread 删除子线程 轨迹记录删除原因

四、典型业务场景串联

场景 1:标准同表单分流会签

  1. 发起人填写表单 → 提交至 分流节点
  2. 分流人发送 → 系统按接收人规则创建 N 条 同表单子线程(复制主表/明细/附件)
  3. 各处理人并行审批 → 子线程内记录 SubThreadForward
  4. 子线程完成 → 合流节点PassRate 判断是否激活干流程待办
  5. 合流人处理后 → 流程继续向下

场景 2:子线程退回后分流人重发

  1. 某子线程处理人 退回到分流节点(可选「全部子线程退回」)
  2. 分流人进入 MyFLDealThread 或专用工具栏模式
  3. 修改表单后对退回子线程点击 发送(可填写小纸条)
  4. 子线程恢复运行 → 全部处理完成后干流程回到 运行态

场景 3:运行中补发与终止

  1. 分流后发现漏人 → 增加子线程 输入账号补发
  2. 某分支异常 → 分流人在 ThreadDtl终止 该子线程
  3. 系统重算合流通过率 → 满足条件则自动推进合流

五、代码索引(便于对照)

模块 关键文件
分流发送核心 CCFlow/Components/BP.WF/WF/WorkNode.csNodeSend_24_SameSheetNodeSend_53_SameSheet_To_HeLiu
合流状态检查 CCFlow/Components/BP.WF/WF/WorkNodePlus.csDealHeLiuState
增删子线程 API CCFlow/Components/BP.WF/Dev2Interface.csNode_FHL_AddSubThreadFlow_DeleteSubThread
分流人页面 API CCFlow/Components/BP.WF/HttpHandler/WF_MyFlow.csThreadDtl_*UnSendAllTread
子线程管理弹窗 Vue3/src/WF/WorkOpt/ThreadDtl.vue
分流退回处理页 Vue3/src/WF/MyFLDealThread.vue
退回联动 Vue3/src/WF/WorkOpt/ReturnWork.vue
节点设计配置 Vue3/src/WF/Admin/AttrNode/NodeExt.tsBtnLab.ts
时间轴/轨迹 Vue3/src/WF/WorkOpt/OneWork/TimeBase.vueWorkCheckParseTrack.vue
枚举定义 CCFlow/Components/BP.WF/EnumLib.csRunModelThreadKillRoleDeliveryWay

文档版本:依据当前工作区代码静态分析生成。