CCFlow 异表单分合流需求列表
依据代码整理:
CCFlow/Components/BP.WF、Vue3/src/WF/WorkOpt、Vue3/src/WF/Admin/AttrNode、Vue3/src/WF/MyFLDealThread.vue、Vue3/src/WF/ToolBar.vue说明:本文档聚焦 异表单子线程(RunModel=5 / SubThreadUnSameWorkID) 及其与 分流(FL)/分合流(FHL)/合流(HL) 节点的协同能力;与同表单分流(RunModel=4)共用的机制在对应章节会标注。
一、总体架构
异表单分河流采用「干流程(FID=0)+ 子线程(FID=干流程 WorkID) 」双层实例结构。与同表单的核心差异在于:每个异表单子线程节点可绑定独立表单(FrmNode / NodeFrmID) ,物理表通常为 ND{NodeID},子线程之间数据相互隔离。
| 层级 | 节点类型(RunModel) | 数据特征 | 典型作用 |
|---|---|---|---|
| 干流程 | 0 线形 / 2 分流 / 3 分合流 / 1 合流 | WorkID 为主键,FID=0 |
发起、分流、合流汇总 |
| 子线程 | 5 异表单 | 独立 WorkID(规则可配置),FID=干流程 WorkID,独立表单表 |
并行处理不同业务表单,如多专业并行填报 |
典型拓扑:普通节点 → 分流/分合流节点 → 一个或多个异表单子线程节点(可并行多表单)→ 合流节点 → 后续节点。
核心后端入口:WorkNode.NodeSend_24_UnSameSheet(分流到异表单)、WorkNode.NodeSend_53_UnSameSheet_To_HeLiu(异表单子线程到合流)。
二、功能需求明细表
(一)设计配置 --- 节点运行模式
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 节点类型 | 异表单子线程节点 | RunModel=5(SubThreadUnSameWorkID),节点工作类型为 SubThreadWork;与同表单(4)区分 |
不同部门/专业使用不同表单并行处理,如财务表、法务表、技术表同时流转 |
| 节点类型 | 分流节点 | RunModel=2(FL),向下可连接一个或多个异表单子线程节点 |
将干流程拆分为多条并行子线程,每条可对应不同表单 |
| 节点类型 | 分合流节点 | RunModel=3(FHL),兼具分流下发与合流汇总 |
单节点完成分流与合流,简化流程图 |
| 节点类型 | 合流节点 | RunModel=1(HL),等待子线程按通过率到达后激活干流程待办 |
汇总各异表单分支结果后继续主流程 |
| 流程约束 | 分流可连多个异表单路径 | 分流节点后续有多个节点时,若均为异表单子线程,调用 NodeSend_24_UnSameSheet(toNDs) 同时启动 |
一次分流同时发起财务、人事、行政等多张表单 |
| 流程约束 | 分流仅连一条异表单路径 | 分流后续仅一个异表单子线程节点时,同样走 NodeSend_24_UnSameSheet |
标准单表单异分支场景 |
| 流程约束 | 禁止同异表单混发 | 分流同时启动同表单(4)与异表单(5)子线程时报错 workflow_error_4 |
保证分支类型一致,避免数据模型冲突 |
| 流程约束 | 禁止多同表单并行 | 分流同时启动多个同表单子线程时报错 workflow_error_5(异表单不受此限,可多异表单并行) |
同表单仅允许单路径;异表单允许多路径 |
| 流程约束 | 普通节点不可直连子线程 | 线形节点直接连接异表单子线程节点报错 workflow_error_3 |
子线程必须由分流/分合流节点发起 |
| 流程约束 | 合流节点不可下连子线程 | 合流节点下连接子线程节点报错 workflow_error_6 |
子线程只能在合流之前运行 |
| WorkID 规则 | USSWorkIDRole=0 仅生成一个 WorkID | 同一异表单子线程节点下所有接收人共享一个 WorkID;多人协作处理同一份表单实例 |
同一表单需多人会签、但只维护一份数据 |
| WorkID 规则 | USSWorkIDRole=1 按接收人生成 WorkID | 每个接收人独立生成 WorkID,各自拥有独立表单实例 |
每人填写各自负责的异表单内容 |
| WorkID 规则 | 合流后再异表单有效说明 | USSWorkIDRole 配置说明:对「上一节点是合流、当前是异表单子线程」场景有效 |
合流后再次分流到异表单时的实例生成策略 |
| 表单权限 | WhoIsPK 主键规则 | USSWorkIDRole=1 时,WhoIsPK 必须为 WorkID(OID),不能为 FID;设计期 FlowCheckError 自动修正并告警 |
保证每人独立读写自己的表单实例 |
| 表单校验 | 物理表独立性 | 异表单子线程 MapData.PTable 设为 ND{NodeID},与流程主表 Flow.PTable 分离 |
各子线程表单物理隔离 |
| 表单绑定 | FrmNode 多表单绑定 | 子线程节点通过 FrmNodes 绑定表单库表单;FrmEnableRole=Allways 的表单在分流时复制干流程数据 |
子线程可使用与干流程不同的业务表单 |
| 表单绑定 | WhoIsPK=FID 特殊处理 | 单表单绑定且 WhoIsPK=FID 时,子线程 wk.OID 使用干流程 WorkID |
以干流程 ID 为主键的表单继承场景 |
| 完成通过率 | PassRate | 合流节点 PassRate(默认 100),按「已到达合流子线程数 / 总子线程数 × 100」判断是否激活干流程待办 |
允许部分异表单分支完成即可合流 |
| 子线程删除方式 | ThreadKillRole | 合流节点:0 不能删除(须全部完成)、1 手工删除、2 自动删除未完成子线程 |
合流前仍有子线程未完成时的处理策略 |
| 增加子线程 | ThreadIsCanAdd | 分流/分合流节点:已发出子线程后是否允许追加;后端要求分流后续仅一条子线程路径(HisToNodes.Count==1)才显示增加按钮 |
单路径异表单流程运行中补发人员 |
| 增加子线程(合流) | ThreadIsCanAddOfHL | 合流节点是否允许增加子线程;ThreadDtl.vue 在 FID==0 且该参数为真时显示「增加子线程」 |
合流阶段补录遗漏的异表单分支 |
| 删除子线程 | ThreadIsCanDel | 分流/分合流节点:子线程退回后是否允许删除/撤销整体发送 | 部分子线程退回后由分流人清理 |
| 移交子线程 | ThreadIsCanShift | 是否允许移交已发出的子线程(默认关闭) | 子线程处理人变更 |
| 退回联动 | IsKillEtcThread | 子线程退回规则:0 不删除其它子线程、1 删除其它子线程、2 由退回人决定 |
一个异表单分支退回分流点时,其余分支是否一并取消 |
| 按钮权限 | 子线程按钮 | ThreadEnable 控制工具栏「子线程」按钮;ThreadLab 自定义标签 |
分流人/合流人查看子线程明细入口 |
| 按钮权限 | 预置处理人 | PreplaceWokerEnable:0 不启用、1 单独启用、2 发送前打开、3 发送且单独启用;PreplaceWoker.vue 组织树选人 |
分流前预先指定各异表单分支接收人 |
| 方向条件 | 发送后手工选择 | GPE_CondModel 说明:异表单合流节点可配置「发送后手工选择到达节点与接受人」 |
合流后操作员灵活选择下一节点与接收人 |
| 合流接收人 | 禁止由上一步指定 | FlowCheckError:合流/分合流节点接收人规则不能为「由上一步指定」,必须为自动计算 |
合流节点待办人由系统计算,非人工逐条指定 |
(二)设计配置 --- 子线程接收人规则(DeliveryWay)
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 接收人 | 按明细表确定子线程接收人 | ByDtlAsSubThreadEmps(13):读取分流节点表单明细表,须含 UserNo 或 DeliveryParas 指定字段;仅子线程节点可用 |
分流表单明细每行指定一个异表单处理人 |
| 接收人 | 按 SQL 确定接收人与数据 | BySQLAsSubThreadEmpsAndData(12):执行节点 SQL,结果集同时提供人员与行数据 |
外部数据源驱动多人并行,每人携带不同业务字段到各自异表单 |
| 接收人 | 按绑定部门(子线程) | BySetDeptAsSubthread(16):绑定部门中一人完成即该部门子线程结束;返回 GroupMark |
按部门维度并行处理异表单 |
| 接收人 | 按数据源确定子线程接收人 | SubThreadByGenerDBSrc(81) |
与流程数据源组件联动计算异表单分支处理人 |
| 接收人 | 由上一步发送人选择 | BySelected(4)/ BySelectedFix 等:发送时弹出人员选择器 |
分流人手动指定各异表单分支处理人 |
| 接收人 | 预置海选 | PreplaceWokerFree(710):自由选择预置处理人 |
发送前在组织树中预选异表单接收人 |
| 接收人 | 预置固定范围 | PreplaceWokerFix(711):在固定人员范围内预选 |
限定组织范围内指定异表单处理人 |
| 接收人 | 按表单字段 / 部门负责人等 | ByPreviousNodeFormEmpsField、ByFieldAsDeptNo 等常规规则 |
根据主表字段自动计算异表单分支处理人 |
| 明细表配置 | 子线程处理人字段 | MapDtl.SubThreadWorker:从表字段下拉(Frm_SubThreadWorker)指定子线程处理人来源字段 |
从表明细驱动异表单人员分配 |
| 明细表配置 | 子线程分组标记 | MapDtl.SubThreadGroupMark:同组多人共享子线程实例(与同表单 GroupMark 机制共用) |
按组分派异表单任务 |
| 校验 | 非子线程误配 | 明细表/SQL/部门子线程方式配置在非子线程节点时抛异常 | 设计期防止接收人规则与节点类型不匹配 |
| 校验 | 找不到接收人 | WhenNoWorker 与跳转规则联动;异表单分流找不到人时可跳转或报错 |
人员缺失时的容错策略 |
(三)运行期 --- 分流下发与节点选择(干流程 → 异表单子线程)
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 分流发送 | 异表单分流核心逻辑 | NodeSend_24_UnSameSheet(toNDs):分流/分合流节点向一个或多个异表单子线程节点发送 |
一次发送产生一条或多条异表单分支 |
| 历史数据复用 | 子线程退回/撤销后重发 | 发送前查询 GenerWorkFlow(FID=干流程WorkID),同节点历史实例可复用 WorkID 与表单数据 |
子线程退回后再次下发不丢失已填数据 |
| 数据初始化 | 主表数据复制(USSWorkIDRole=0) | 复制 rptGe 到子线程 Work;wk.FID=干流程WorkID;按 WhoIsPK 决定 wk.OID |
异表单继承干流程基础数据 |
| 数据初始化 | 绑定表单数据复制 | 遍历 FrmNodes,FrmEnableRole=Allways 的表单从干流程复制到子线程 GEEntityOID |
子线程异表单获得干流程已填数据 |
| 数据初始化 | 按接收人生成(USSWorkIDRole=1) | 每个 GenerWorkerList 接收人独立 GenerOID、独立 wk.OID、独立 GenerWorkFlow |
每人一份独立异表单实例 |
| 数据初始化 | 共享 WorkID(USSWorkIDRole=0) | 多人共享一个 workIDSubThread,更新各 GenerWorkerList.WorkID 指向同一实例 |
多人协作填写同一份异表单 |
| 待办生成 | GenerWorkerList 生成 | Func_GenerWorkerLists_Thread / Func_GenerWorkerLists 计算各异表单节点处理人 |
按接收人规则产生待办 |
| 待办生成 | 分流节点发送副本 | 为子线程产生分流节点 GenerWorkerList 副本(PassInt=-2,IsRead=true) |
分流人可观察各分支发送状态 |
| 待办生成 | 找不到人跳转 | WhenNoWorker=true 时记录 Skip 轨迹并尝试跳转下一节点 |
人员缺失时自动跳过 |
| 实例维护 | GenerWorkFlow 子线程实例 | 每条异表单分支创建/更新 GenerWorkFlow:FID=干流程WorkID,继承标题、业务字段、父流程关联等 |
子线程在待办列表独立展示 |
| 状态维护 | ThreadCount 归零 | 分流时 HisGenerWorkFlow.SetPara("ThreadCount", 0) |
为合流通过率计算准备计数 |
| 状态维护 | 节点名称追加 | 分流时 NodeName 追加异表单子线程节点名(多节点逗号拼接) |
干流程列表展示当前分支概况 |
| 轨迹记录 | 分流前进 | 非开始节点记录 ActionType.Forward(含异表单分流提示信息 FenLiuUnSameSheet) |
轨迹图/时间轴标识分流动作 |
| 系统变量 | 发送结果变量 | 写入 VarTreadWorkIDs、VarAcceptersID、VarAcceptersName、VarToNodeIDs |
供发送后事件/自定义开发使用 |
| 节点选择 | ToNodes 初始化 | ToNodes_Init → WorkOpt_GetToNodes:线性/同表单节点单选,异表单节点多选 |
分流发送前选择要启动的异表单分支 |
| 节点选择 | 「可以分发启动的异表单」 | 后端插入 NodeID=0 虚拟节点,前端 ToNodes.vue 展示为「可以分发启动的异表单」;选此项时 radioSelected=0,通过复选框多选异表单节点 |
一次分流同时启动多张异表单 |
| 节点选择 | 异表单全选 | ToNodes.vue 提供「全选节点」复选框,支持半选状态 |
快速选择所有可达异表单分支 |
| 节点选择 | 接收人选择与校验 | 异表单节点 DeliveryWay 为 4/21/43/60 时需「选择接收人」;发送前校验每个选中节点已指定人员 |
手动选人场景的发送前校验 |
| 节点选择 | 发送执行 | ToNodes_Send 将选中节点 ID(逗号分隔)写入 Paras_ToNodes 并执行发送 |
完成多异表单分支并行下发 |
| 节点选择 | 记忆上次选择 | WorkOpt_ToNodes_GetLasterSelectNodeID 从轨迹表读取上次选择节点 |
改善用户重复操作体验 |
| 接收人维护 | 增加预选接收人 | AccepterOfGener_AddEmps:选择器确认后将人员写入 WF_SelectAccper |
发送前维护各异表单节点接收人 |
| 接收人维护 | 移除预选接收人 | ToNodes.vue 中 RemoveEmp 删除 SelectAccper 记录 |
调整已选异表单分支处理人 |
(四)运行期 --- 子线程处理与向下发送
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 待办打开 | 子线程独立待办 | 子线程处理人待办 WorkID 为子线程 ID,FID 指向干流程;打开对应异表单(NodeFrmID) |
处理人仅看到自己的异表单任务 |
| 表单访问 | 查看子线程表单 | ThreadDtl.OpenFrm 打开 MyView,传入 WorkID/FID/FK_Node/FK_Flow |
分流人从管理界面查看任意异表单分支 |
| 表单访问 | MyFLDealThread 查看表单 | OpenFrm 通过 BaseComponent.openDrawerByUrl 抽屉打开子线程表单 |
分流退回处理页内查看异表单 |
| 子线程发送 | 子线程向下运行 | 异表单子线程节点内正常审批发送,动作类型 ActionType.SubThreadForward |
异表单分支内部多节点流转 |
| 子线程发送 | 子线程到合流 | NodeSend_53_UnSameSheet_To_HeLiu:异表单完成后向合流节点汇聚 |
并行异表单分支汇入主流程 |
| 数据汇总 | 合流主表数据合并 | 将子线程 HisWork 复制到合流点 heLiuWK(OID=干流程WorkID);若绑定相同 NodeFrmID 则 isCopyData=false 跳过重拷 |
合流后主表单体现各异表单填写结果 |
| 数据汇总 | 合流报表同步 | rptGe.Copy(HisWork) 同步到干流程报表 |
合流后干流程数据一致 |
| 数据汇总 | 合流汇总从表 | 删除子线程时 ThreadDtl_DelSubThread 清理 ItIsHLDtl=true 的合流汇总从表数据 |
终止分支后清除合流汇总脏数据 |
| 通过率 | 合流到达计数 | ThreadCount 自增,计算 passRate = ThreadCount / 总子线程数 × 100 |
判断合流条件 |
| 通过率 | 达到通过率激活待办 | passRate >= PassRate 时激活合流节点待办 |
满足比例后推进主流程 |
| 通过率 | 未达通过率隐藏待办 | 未达标时合流节点待办不可见(IsPass=3) |
等待更多异表单分支完成 |
| 轨迹记录 | 子线程前进 | ActionType.SubThreadForward,前端展示绿色「子线程前进」 |
时间轴区分子线程与普通审批 |
| 轨迹记录 | 合流前进 | ActionType.ForwardHL,前端展示绿色「合流前进」 |
标识合流节点激活 |
| 轨迹记录 | 子线程向合流发送 | 合流时记录「子线程向合流节点发送」 | 审计异表单分支到达合流 |
(五)运行期 --- 子线程退回与分流人处理
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 子线程退回 | 退回到分流节点 | 异表单子线程节点可退回到上游分流/分合流节点;WFState=ReturnSta(5) |
异表单处理人认为需发起人修改后重办 |
| 退回规则 | 全部子线程退回选项 | IsKillEtcThread=1 时退回并删除其它子线程;ReturnWork.vue 展示「全部子线程退回」复选框 |
一人退回即终止其余异表单并行任务 |
| 退回规则 | 由退回人决定 | IsKillEtcThread=2 时退回人勾选是否删除其它子线程 |
灵活处理部分退回 |
| 分流人界面 | 子线程退回处理页 | MyFLDealThread.vue:分流人打开后展示退回子线程、可发起节点、运行中子线程 |
分流人集中处理退回后的异表单分支 |
| 分流人界面 | 退回子线程列表 | WF_ReturnWork 表:退回节点、退回人、日期、退回原因;支持「发送」「终止」 |
逐条处理已退回异表单分支 |
| 分流人界面 | 可发起子线程节点 | WF_ThreadNode 列表;isSameThread=false 且 ThreadIsCanAdd=1 时展示「增加子线程」 |
存在多条异表单路径时可补发新分支 |
| 分流人界面 | 运行中子线程 | 按 GenerWorkFlow 卡片展示(WFState!=5);嵌套 GenerWorkerList 节点/人员/状态/日期 |
总览所有在途异表单分支 |
| 分流人工具栏 | 分流退回专用工具栏 | Flow_IsCanToFLTread 为真时 InitToolBar_ForFenLiu:查看表单、撤销整体发送、增加子线程、轨迹 |
子线程退回后分流人操作集合 |
| 单条重发 | 发送退回子线程 | ThreadDtl_SendSubThread → Node_SendSubTread:恢复子线程为运行态;支持小纸条 ScripMsg |
分流人修改后重新下发该异表单分支 |
| 单条重发 | 小纸条传达 | SendThread 弹窗输入传达信息,写入 GenerWorkFlow.ScripMsg / ScripNodeID |
重发时向处理人附带说明 |
| 单条重发 | 末条子线程重发联动 | 所有退回子线程处理完毕后,自动恢复干流程运行态并跳转 | 全部分支恢复后回到主流程 |
| 子线程退回 | ThreadDtl 单条退回 | ReturnThread 打开 ReturnWork,FromPage=ThreadDtl,预选退回目标与处理人 |
分流人从子线程管理界面代为退回 |
| 子线程退回 | ThreadDtl 退回条件 | IsPass==1(已完成)时显示「退回」;IsPass==0 且 WFState==5 时显示「撤销」 |
按子线程状态控制可操作项 |
| 撤销退回 | 撤销子线程退回 | UnReturnThread 调用 MyView_UnReturn,传入 UnReturnToNode |
误退回后恢复异表单分支 |
| 分流人判断 | 是否分流退回态 | Flow_IsCanToFLTread:FID!=0 且 WFState=ReturnSta 且当前在 FL/FHL 节点 |
决定是否进入分流处理模式 |
| 合流驳回 | 合流点驳回子线程 | Node_FHL_DoReject:合流人将指定异表单子线程驳回 |
合流阶段发现某分支有问题需打回 |
(六)运行期 --- 子线程增删与管理
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 子线程管理弹窗 | ThreadDtl 组件 | ToolBar 点击「子线程」打开 ThreadDtl 弹窗(宽 70%);发送前自动 SaveExt |
分流人/合流人查看异表单分支明细 |
| 子线程列表 | 按 GenerWorkFlow 分组 | 每张卡片:标题、待办人员(TodoEmps)、发起时间(RDT) |
一览各异表单分支概况 |
| 子线程列表 | 节点处理明细表 | 列:节点、处理人、状态(已完成/未读/已读未处理)、应完成日期、实际完成日期 | 掌握异表单分支内部进度 |
| 子线程列表 | 空状态 | 无子线程时展示「当前暂时没有子线程」占位图与禁用按钮 | 尚未下发或已全部结束 |
| 子线程列表 | 过滤已删除待办 | GetGwlsData 过滤 IsPass=-2 的记录 |
不展示分流人观察态副本 |
| 增加子线程 | 合流节点增加 | ThreadIsCanAddOfHL 且 FID==0:输入人员账号(逗号分隔),调用 DoSubFlowAddEmps |
合流阶段补录遗漏异表单人员 |
| 增加子线程 | 分流节点增加 | ThreadIsCanAdd 且后续仅一条子线程路径;Node_FHL_AddSubThread |
单路径异表单流程补发新人员 |
| 增加子线程 | 新增从下一节点执行 | 提示「新增加的人员,从分流节点的下一个节点开始执行」 | 补发人员不重复走子线程入口 |
| 增加子线程 | 人员校验 | 校验账号存在性;支持中英文逗号/分号分隔 | 防止无效人员 |
| 增加子线程 | 合流节点定位分流 | 当前在合流节点时,自动向上查找分流节点 RunModel=FL |
正确确定增线程起点 |
| 增加子线程 | 指定目标子线程节点 | toNodeID 参数指定异表单子线程节点;默认取分流下第一个子线程节点 |
多异表单路径时指定补发到哪张表单 |
| 终止子线程 | 手工终止 | ThreadDtl_DelSubThread → Flow_DeleteSubThread → DoDeleteWorkFlowByReal |
分流人终止异常/多余异表单分支 |
| 终止子线程 | 终止权限 | ThreadKillRole=1(手工删除)时显示「终止」 |
按节点配置控制是否可删 |
| 终止子线程 | 终止后合流重算 | 删除后按剩余子线程重算合流 PassRate;清理合流汇总从表 |
终止分支后自动调整主流程状态 |
| 终止子线程 | 全部终止后恢复分流 | 所有子线程删除后,恢复分流节点处理人待办并跳转 MyFlow |
所有异表单分支取消后回到分流人 |
| 终止子线程 | 写终止轨迹 | WriteTrackInfo 记录「分流点手工删除」 |
审计人为终止原因 |
| 撤销整体发送 | UnSendAllThread | 删除 FID 下全部子线程,分流节点待办恢复 | 分流人整体收回所有异表单分支 |
| 撤销整体发送 | 权限控制 | 仅 ThreadIsCanDel=true 且当前用户为分流发送人 |
防止非发起人误操作 |
| MyFLDealThread 终止 | 分流退回页终止 | DoDelThread 确认后调用 ThreadDtl_DelSubThread;若返回 PageName 则跳转 MyView |
退回处理页内终止单条分支 |
(七)运行期 --- 撤销发送与合流控制
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 撤销发送 | 合流节点撤销 | 撤销前删除 FID 下所有子线程实例(Flow_DeleteSubThread) |
合流后发现异常需回到分流 |
| 撤销发送 | 分合流撤销 | DoUnSendInFeiLiuHeiliu:恢复分流节点待办,删除合流及子线程待办 |
分合流节点专用撤销 |
| 撤销发送 | 子线程撤销发送 | DoThreadUnSend:撤销到分流/分合流时,联动处理 Span 范围内子线程节点待办 |
子线程内撤销不影响其它分支 |
| 合流前检查 | 未完成子线程阻断 | DealHeLiuState:ThreadKillRole=None 时存在未完成子线程则禁止合流节点向下发送 |
强制全部异表单分支完成再推进 |
| 合流前检查 | 手工删除提示 | ThreadKillRole=ByHand 时提示通知完成或强制删除 |
允许人工干预未完成分支 |
| 合流前检查 | 自动删除 | ThreadKillRole=ByAuto 时自动删除未完成子线程后继续 |
超时或不再等待的场景 |
| 撤销范围 | SpanSubThreadNodeIds | 递归计算合流点与上游分流点之间所有子线程节点 ID | 精确定义异表单分支节点范围 |
| 合流查询 | 异表单合流点子线程 | DB_GenerHLSubFlowDtl_YB:查询 FID=workid 且 IsPass=0 的在途子线程 |
合流节点展示各异表单分支状态 |
(八)运行期 --- 轨迹、审核与时间轴
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 流程轨迹 | OneWork 多页签 | OneWork_GetTabs 返回轨迹图(Truck)、时间轴(TimeBase)、时间表(Table) |
查看整单(含异表单子线程)运转情况 |
| 流程轨迹 | OneWork 页签切换 | OneWork.vue 固定 Tab 导航,支持 currTab 参数指定默认页签 |
从工具栏轨迹按钮直达指定视图 |
| 时间轴 | 子线程待办展示 | TimeBase.vue:分流/合流/分合流节点下按 gwl.FID 过滤展示子线程待办 |
干流程处理人看到各异表单分支当前处理人 |
| 时间轴 | 分流前进着色 | ActionType.ForwardFL 绿色标识「分流前进」 |
区分分流与普通发送 |
| 时间轴 | 子线程前进着色 | ActionType.SubThreadForward 绿色标识「子线程前进」;StepForwardOutlined 图标 |
区分子线程与普通过件 |
| 时间轴 | 合流前进着色 | ActionType.ForwardHL 绿色标识「合流前进」;FastForwardOutlined 图标 |
标识合流动作 |
| 轨迹图 | 分流节点到达判断 | Track.vue 对 ForwardFL 做特殊到达判断 |
流程图正确展示分流状态 |
| 审核组件 | 干/子 WorkID 切换 | WorkCheck.vue 使用 `RealWorkID |
|
| 审核组件 | 三种显示模式 | FWCShowModel:0 普通(WorkCheckParse)、1 轨迹(WorkCheckParseTrack)、2 时间轴(WorkCheckParseTrackTime) |
按节点审核组件配置展示 |
| 审核组件 | 普通模式 | WorkCheck_Init / WorkCheck_Init2019 按轨迹逐条渲染;IsDoc=true 的可编辑 |
常规节点审核意见录入与历史展示 |
| 审核组件 | 轨迹模式 | WorkTrack_Init + 时间线;自动插入「流程结束」节点;过滤跳转与发送重复项 |
以时间线方式查看含异表单动作的审批历程 |
| 审核组件 | 时间轴模式 | 表格式表头(环节/审批人/信息/节点/完成时间);同节点多人合并为 NodeArr;退回节点单独分组 |
领导查看结构化审批时间轴 |
| 审核组件 | 停留时间计算 | FWCTimeModel:0 倒序(当前-下一节点)、1 正序(当前-上一节点);排除节点 ID 末位 01 |
展示各审批环节耗时 |
| 审核组件 | 审核意见编辑 | 支持文本录入(≤2000字)、失焦自动保存(SaveWorkCheck(true)) |
异表单节点处理人填写审批意见 |
| 审核组件 | 审核立场 | FWCView 配置立场选项;提交时校验必选(FWCView 参数) |
同意/不同意/附条件等立场选择 |
| 审核组件 | 签名模式 | SigantureEnabel:0 不签名、1 图片签名、2 写字板手写签名 |
按配置展示/采集签名 |
| 审核组件 | 审核时间修改 | IsChangeFWCTime=1 时可编辑 DatePicker 修改审批时间 |
补录或修正审批时间 |
| 审核组件 | 审核附件 | FWCAth=1 时支持上传/下载/删除;WorkCheck_GetNewUploadedAths 获取列表 |
审批过程附带材料 |
| 审核组件 | 常用短语 | CommonConfig.IsShowWorkCheckUsefulExpres 时展示标签快选与 GL_WorkcheckWorks 管理 |
快速录入常见审批语 |
| 审核组件 | 审核标准 | NodeCheckStandard 配置:1 外链打开、2 弹窗展示 MapExt.Doc |
处理人查看审批依据 |
| 审核组件 | 仅显示自己意见 | FWCMsgShow=1 时过滤只显示当前用户审核内容与附件 |
协作节点隐私展示 |
| 审核组件 | 会签节点名称 | 节点名 (会签) 替换为灰色 HTML 标注 |
区分会签与普通节点 |
| 审核组件 | 退回原因前缀 | ActionType=Return/ReturnAndBackWay 时消息前缀「退回原因:」 |
轨迹中明确退回信息 |
| 审核组件 | 传阅信息展示 | 抄送节点展示 cclist 人员及状态;计算传阅耗时 |
时间轴完整展示抄送链 |
| 审核组件 | 子线程动作标签 | 轨迹/时间轴分别展示「分流前进」「子线程前进」「合流前进」 | 审核轨迹中读懂异表单分支动作 |
| 审核组件 | 待办中间态 | 展示「处理中」「未开始」「审批中」等 | 当前异表单节点尚未完成时 |
| 审核组件 | 外部保存暴露 | WorkCheck.vue 暴露 WorkCheckSave;根据模式调用子组件 SaveWorkCheck |
工具栏发送前统一保存审核意见 |
| 审核组件 | InitWorkCheck 事件 | 监听 Event.on('InitWorkCheck') 外部注入审核内容 |
与其他组件联动填充意见 |
(九)运行期 --- 预置处理人与辅助能力
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| 预置处理人 | 组织树懒加载 | PreplaceWoker.vue 调用 SelectEmps_Init,按部门展开加载人员与下级部门 |
发送前按组织架构指定异表单接收人 |
| 预置处理人 | 上一级导航 | toPrevDept 返回上级机构;到根节点时提示「已到第一机构」 |
大型组织树中快速定位 |
| 预置处理人 | 单选/多选 | isMultiSelect 控制树节点 checkable;支持 selectedKeys 与 checkedKeys |
按场景选择单个或多个预置人员 |
| 预置处理人 | 确定/取消 | BtnOK 校验已选人后 emit('AddEmps');Cancel 返回空数组 |
与发送流程集成 |
| 预置处理人 | 发送前强制打开 | PreplaceWokerEnable=2 时发送前自动弹出;ToolBar 检测未点击则拦截发送 |
确保异表单分流前人员已确定 |
| 预置处理人 | 单独按钮打开 | PreplaceWokerEnable=1/3 时工具栏显示「预置处理人」按钮 |
随时维护后续节点处理人 |
| 预置处理人 | 自由节点预置 | GetPreplaceWokerFreeNodes 获取需预置的节点列表 |
多异表单分支批量预置处理人 |
| 催办 | 子流程催办 | Flow_DoPress(workID, msg, isPressSubFlow=true) 支持催办子线程待办 |
分流人催促异表单分支处理人 |
| 待办过滤 | 异表单待办识别 | 待办列表对 RunModel=5 且 FID!=0 做特殊处理 |
待办列表正确显示异表单分支任务 |
| 权限 | 轨迹查看权限 | 子线程节点类型参与 Flow_IsCanViewTruck 判断 |
异表单分支参与人可查看轨迹 |
| 退回初始化 | ThreadDtl 专用退回 | ReturnWork 在 FromPage=ThreadDtl 时跳过后端 Return_Init,直接使用传入节点与处理人 |
简化分流人代退回操作 |
| 项目文件 | 审核区项目文件卡片 | WorkCheck.vue 嵌入 CCPrjFileReviewCard |
异表单审批时关联项目文件查阅 |
(十)后端 API 与数据实体
| 功能类别 | 功能名称 | 功能说明 | 需求场景概述 |
|---|---|---|---|
| HTTP 接口 | ThreadDtl_Init | WF_MyFlow:加载节点信息、可发起子线程节点、退回子线程、GenerWorkFlow/GenerWorkerList |
MyFLDealThread 页面初始化 |
| HTTP 接口 | ThreadDtl_SendSubThread | 发送单条退回子线程 → Node_SendSubTread |
分流人重发异表单分支 |
| HTTP 接口 | ThreadDtl_DelSubThread | WF_MyFlow / WF_WorkOpt:删除子线程,含合流通过率联动与合流从表清理 |
子线程管理终止 |
| HTTP 接口 | ToNodes_Init | 获取可达节点列表,含异表单多选虚拟节点 | ToNodes.vue 初始化 |
| HTTP 接口 | ToNodes_Send | 按选中节点 ID 执行分流发送 | 多异表单分支并行下发 |
| HTTP 接口 | AccepterOfGener_AddEmps | 为指定节点增加预选接收人 | 发送前人员维护 |
| HTTP 接口 | Return_DoReturn | 支持 IsKillEtcThread 参数 |
异表单子线程退回时联动删除其它分支 |
| HTTP 接口 | MyView_UnReturn | 撤销子线程退回 | 恢复误操作 |
| HTTP 接口 | UnSendAllTread | 撤销整体发送 | 分流人收回全部异表单分支 |
| HTTP 接口 | InitToolBar / InitToolBar_ForFenLiu | 常规定义与分流退回专用工具栏 | 前端 ToolBar 按钮渲染 |
| HTTP 接口 | WorkCheck_Init / WorkTrack_Init | 审核组件数据,含异表单子线程轨迹 | 表单审核区 |
| HTTP 接口 | WorkCheck_Save | 保存审核意见、立场、签名、时间 | 发送前/失焦保存 |
| HTTP 接口 | WorkCheck_GetNewUploadedAths | 获取节点审核附件列表 | 附件展示与下载 |
| HTTP 接口 | OneWork_GetTabs | 流程运转页签 | OneWork.vue |
| HTTP 接口 | SelectEmps_Init | 部门人员树数据 | PreplaceWoker.vue / ToNodes 选人 |
| 实体方法 | GenerWorkFlow.DoSubFlowAddEmps | 干流程实例上增加子线程人员 → Node_FHL_AddSubThread |
合流/分流补人 |
| 实体方法 | Dev2Interface.Node_FHL_AddSubThread | 核心增线程逻辑:校验人员、定位分流节点、创建 GWF/GWL/Work | 后端统一入口 |
| 实体方法 | Dev2Interface.Flow_DeleteSubThread | 删除子线程并写轨迹 | 终止/撤销统一入口 |
| 实体方法 | Dev2Interface.Node_FHL_DoReject | 合流点驳回子线程 | 合流人打回异表单分支 |
| 实体方法 | Dev2Interface.Node_SendSubTread | 单条子线程重发 | 退回后重办 |
| 实体方法 | Dev2Interface.WorkOpt_GetToNodes | 计算可达节点,插入异表单多选虚拟节点 | 分流/合流发送选人 |
| 实体方法 | Dev2Interface.DB_GenerHLSubFlowDtl_YB | 获取异表单合流点上的在途子线程 | 合流节点状态查询 |
| 数据表 | WF_GenerWorkFlow.FID | 子线程记录关联干流程 WorkID | 主从实例关联 |
| 数据表 | WF_GenerWorkerList.FID/IsPass | 子线程待办;IsPass=-2 分流人观察态;IsPass=3 合流在途 |
待办状态机 |
| 数据表 | ND{FlowNo}Track | 记录 Forward / SubThreadForward / ForwardHL / DeleteSubThread 等 | 全链路审计 |
| 数据表 | WF_SelectAccper | 存储发送前预选的各节点接收人 | 异表单多分支人员预选 |
三、关键动作类型(ActionType)对照
| 动作值 | 名称 | 含义 | 前端展示 |
|---|---|---|---|
| 6 | ForwardFL | 分流前进 | 绿色「分流前进」 |
| 7 | ForwardHL | 合流前进 | 绿色「合流前进」 |
| 11 | SubThreadForward | 子线程前进 | 绿色「子线程前进」 |
| 23 | DeleteSubThread | 删除子线程 | 轨迹记录删除原因 |
四、异表单与同表单分流差异对照
| 对比项 | 异表单(RunModel=5) | 同表单(RunModel=4) |
|---|---|---|
| 表单物理表 | 各子线程节点独立 ND{NodeID} |
共用流程主表 Flow.PTable |
| 分流多路径 | 允许同时启动多个异表单子线程节点 | 仅允许一条同表单路径 |
| 节点选择 UI | ToNodes.vue 复选框多选异表单 |
单选同表单节点 |
| WorkID 规则 | USSWorkIDRole:共享或按人独立 |
默认每人独立 WorkID |
| 合流数据汇总 | NodeSend_53_UnSameSheet_To_HeLiu;绑定相同表单时跳过重拷 |
NodeSend_53_SameSheet_To_HeLiu;明细/附件复制 |
| 合流查询 API | DB_GenerHLSubFlowDtl_YB |
DB_GenerHLSubFlowDtl_TB |
| 混发限制 | 不可与同表单混发 | 不可与异表单混发 |
五、典型业务场景串联
场景 1:多异表单并行分流
- 发起人填写主表单 → 提交至 分流节点
- 分流人发送 → 弹出
ToNodes选择「可以分发启动的异表单」,勾选财务表、法务表、技术表 - 系统调用
NodeSend_24_UnSameSheet同时创建三条 异表单子线程 - 各专业人员在各自异表单中并行审批 → 记录 SubThreadForward
- 各分支完成 → 合流节点 按
PassRate判断是否激活干流程待办 - 合流人处理后 → 流程继续向下
场景 2:异表单子线程退回后分流人重发
- 某异表单分支处理人 退回到分流节点(可选「全部子线程退回」)
- 分流人进入 MyFLDealThread 专用页面
- 对退回分支点击 发送(可填写小纸条传达修改要求)
- 该异表单分支恢复运行 → 全部处理完成后干流程回到 运行态
场景 3:合流阶段补发与终止
- 合流人打开 ThreadDtl 发现遗漏人员 → 增加子线程 输入账号
- 某异表单分支异常 → 在 ThreadDtl 中 终止 该分支
- 系统重算合流通过率 → 满足条件则自动推进合流
场景 4:发送前预置异表单处理人
- 分流节点配置
PreplaceWokerEnable=2 - 分流人点击发送 → 自动弹出 PreplaceWoker 组织树
- 为各异表单分支预选处理人 → 确认后执行分流发送
六、代码索引(便于对照)
| 模块 | 关键文件 |
|---|---|
| 异表单分流发送核心 | CCFlow/Components/BP.WF/WF/WorkNode.cs(NodeSend_24_UnSameSheet、NodeSend_53_UnSameSheet_To_HeLiu) |
| 分流多选节点 | CCFlow/Components/BP.WF/Dev2Interface.cs(WorkOpt_GetToNodes) |
| 增删子线程 API | CCFlow/Components/BP.WF/Dev2Interface.cs(Node_FHL_AddSubThread、Flow_DeleteSubThread) |
| 分流人页面 API | CCFlow/Components/BP.WF/HttpHandler/WF_MyFlow.cs(ThreadDtl_*) |
| 子线程管理弹窗 | Vue3/src/WF/WorkOpt/ThreadDtl.vue |
| 分流目标选择 | Vue3/src/WF/WorkOpt/ToNodes.vue |
| 分流退回处理页 | Vue3/src/WF/MyFLDealThread.vue |
| 预置处理人 | Vue3/src/WF/WorkOpt/PreplaceWoker.vue |
| 退回联动 | Vue3/src/WF/WorkOpt/ReturnWork.vue |
| 审核组件 | Vue3/src/WF/WorkOpt/WorkCheck.vue、WorkCheckParse.vue、WorkCheckParseTrack.vue、WorkCheckParseTrackTime.vue |
| 流程轨迹 | Vue3/src/WF/WorkOpt/OneWork.vue、OneWork/TimeBase.vue |
| 节点设计配置 | Vue3/src/WF/Admin/AttrNode/NodeExt.ts、BtnLab.ts |
| 接收人规则 | Vue3/src/WF/Admin/AttrNode/AccepterRole/GPE_AccepterRole.ts |
| 枚举定义 | CCFlow/Components/BP.WF/EnumLib.cs(RunModel、ThreadKillRole、DeliveryWay) |
文档版本:依据当前工作区代码静态分析生成。