驰骋流程引擎ccflow/jflow四大模式及其通用操作机制研究

流程引擎四大模式及其通用操作机制研究

——基于 CCFlow 工作流引擎的设计与实现


作者:[待填写]
单位:[待填写]
通讯作者:[待填写]
收稿日期:[2026-06-12]
基金项目:[待填写]
中图分类号:TP311
文献标识码:A
文章编号:[CC2026-06-001]


目 录

  1. 引言
  2. 相关工作
  3. 系统总体架构与汽车类比模型
  4. 模式一:线形流程
  5. 模式二:同表单分合流
  6. 模式三:异表单分合流
  7. 模式四:父子流程
  8. 四大模式的覆盖性论证
  9. 节点通用操作
  10. 流程实例级操作
  11. 节点向下运动的核心算法:5×5 发送矩阵
  12. 多人处理规则
  13. 退回规则
  14. 案例研究与实验验证
  15. 结论与展望
    参考文献
    附录 A–H
    致谢
    插图清单

摘 要

企业流程自动化系统需要同时应对串行审批、并行会签、异构表单协同以及跨流程编排等多样化业务场景。本文以开源流程引擎 CCFlow(JFlow)为研究对象,提出并论证了流程引擎的四大模式——线形流程、同表单分合流、异表单分合流、父子流程——能够覆盖流程应用环境中的主要结构需求。在此基础上,本文进一步建立了"汽车控制系统"类比模型,将流程引擎、表单引擎与业务数据分别映射为汽车控制系统、车厢与货物,将发送、退回、移交、撤销、催办、加签等通用操作映射为驾驶行为。结合 BP.WF 后端核心模块与 Vue3/src/WF 前端实现,本文系统阐述了节点向下运动的 5×5 发送算法、多人处理规则(TodolistModel)、退回规则(ReturnRole)以及流程实例级操作(调整、回滚、逻辑删除、物理删除)的设计原理与实现机制。研究表明,CCFlow 以 RunModelSubFlowModel 双维度模型、以 WorkID/FID/PWorkID 三元关联键、以统一发送引擎调度全部模式,在工程实践中具有良好的表达能力与可维护性。

关键词:工作流引擎;流程模式;分合流;父子流程;5×5 发送算法;CCFlow


Abstract

Enterprise workflow automation systems must address diverse scenarios including serial approval, parallel countersigning, heterogeneous form collaboration, and cross-process orchestration. This paper takes the open-source workflow engine CCFlow (JFlow) as the research object, proposes and demonstrates that the four major workflow patterns—linear workflow, same-form split-merge, different-form split-merge, and parent-child workflow—can cover the primary structural requirements of workflow application environments. Building on this foundation, we establish an “automobile control system” analogy model, mapping the workflow engine, form engine, and business data to the control system, carriage, and cargo respectively, and mapping common operations such as send, return, shift, undo, urge, and countersign to driving behaviors. Combined with the BP.WF backend core modules and the Vue3/src/WF frontend implementation, this paper systematically elaborates the design principles and implementation mechanisms of the 5×5 send algorithm for node downward movement, multi-person processing rules (TodolistModel), return rules (ReturnRole), and instance-level operations (adjust, rollback, logical delete, physical delete). The research shows that CCFlow, with its dual-dimensional model of RunModel and SubFlowModel, ternary association keys of WorkID/FID/PWorkID, and unified send engine scheduling all patterns, demonstrates good expressiveness and maintainability in engineering practice.

Keywords: Workflow Engine; Workflow Pattern; Split-Merge; Parent-Child Workflow; 5×5 Send Algorithm; CCFlow


1 引言

1.1 研究背景

随着企业数字化转型的深入,流程管理系统(BPM/Workflow)已从早期的 OA 审批工具,演进为连接组织、表单、数据与外部系统的业务编排中枢。一个成熟的流程引擎不仅需要支持"甲提交→乙审批→丙归档"这类简单串行场景,还必须应对以下复杂需求:

  • 并行处理:同一单据需多人或部门同时处理后再汇总;
  • 异构协同:不同岗位使用不同表单,完成后汇合到主流程;
  • 跨流程编排:主业务触发子流程,子流程结束后反填主流程并驱动其继续运行;
  • 丰富的运行时操作:发送、退回、移交、撤销、催办、加签、暂停、删除等;
  • 实例级治理:对运行中或已完成的流程进行跳转、回滚、逻辑删除与物理删除。

国际上有 BPMN 2.0、Workflow Patterns(van der Aalst 等)等成熟理论,但其元素繁多、学习曲线陡峭,不利于企业业务人员快速建模。CCFlow(及其 Java 版本 JFlow)在国内政企、制造、金融等领域有大量落地实践,其提出的流程引擎四大模式——线形流程、同表单分合流、异表单分合流、父子流程——是一种面向工程落地的模式化抽象,具有重要的理论总结与论文化价值。

1.2 研究问题

本文围绕以下问题展开研究:

  1. RQ1:四大模式各自解决哪类流程结构问题?为何可以声称"涵盖流程应用环境的各个方面"?
  2. RQ2:四种模式在数据模型与运行时语义上如何区分与关联?
  3. RQ3:节点上的通用操作(发送、退回、移交等)能否由统一引擎支撑,而非各自独立实现?
  4. RQ4:节点向下运动的核心算法是什么?多人处理与退回规则如何与核心算法协同?
  5. RQ5:设计态(流程设计器)与运行态(待办处理)如何保持一致映射?

1.3 主要贡献

  1. 系统化定义流程引擎四大模式,给出每种模式的拓扑结构、适用场景、数据关联键及代码实现锚点;
  2. 提出"汽车控制系统"类比模型,统一阐释流程引擎、表单引擎、数据与通用操作之间的关系;
  3. 揭示 CCFlow 以 WorkNode.NodeSend_Send_5_5() 为核心的 5×5 发送算法,说明其如何调度线形、分合流、子线程等全部运行模式;
  4. 系统梳理 TodolistModel 多人处理规则与 ReturnRole 退回规则,并说明其与发送、退回、移交、撤销算法的耦合方式;
  5. 结合 Vue3/src/WF 前端设计器与运行态页面,给出从设计到运行的端到端实现路径。

1.3.1 与既有理论的区别

维度Workflow Patterns / BPMN本文四大模式
受众工作流研究人员、BPM 架构师企业业务人员、实施顾问、二开工程师
粒度43 种控制流模式 + 网关组合4 种结构模式 + 统一操作集
数据视角流程与数据分离(Data Object)表单驱动,PTable/FrmNodeRunModel 绑定
实现锚点标准 XML 元素WF_Node.RunModel 字段 + NodeSend_Send_5_5()

四大模式并非对 BPMN 的替代,而是对表单驱动型流程引擎在工程实践中的认知压缩(Cognitive Compression):将 Petri 网中的顺序、并行分支、同步合并、子网调用四类结构,与"同表/异表"数据维度、跨流程编排维度正交组合,形成可直接映射到数据库字段与 UI 图元的最小模式集。

1.4 论文结构

第 2 章介绍相关工作;第 3 章给出总体架构与汽车类比模型;第 4 章至第 7 章分别论述四大模式;第 8 章论述四大模式覆盖性;第 9 章论述节点通用操作;第 10 章论述流程实例级操作;第 11 章论述节点向下运动核心算法;第 12 章论述多人处理规则;第 13 章论述退回规则;第 14 章给出案例验证;第 15 章总结与展望。


2 相关工作

2.1 工作流理论与 Workflow Patterns

Petri 网、有限状态机为工作流的形式化基础提供了严格语义。van der Aalst 等提出的 Workflow Patterns 将流程控制结构归纳为 43 种模式,其中与本文四大模式密切相关的包括:

Workflow Pattern模式编号本文四大模式对应
Sequence(顺序)WCP-1线形流程
Parallel Split(并行分支)WCP-2, WCP-4同/异表单分合流之分流节点
Synchronization(同步合并)WCP-7, WCP-33同/异表单分合流之合流节点
Sub-ProcessWCP-41父子流程

BPMN 2.0 以 Sequence Flow、Parallel Gateway、Inclusive Gateway、Call Activity 等元素表达类似语义。与 BPMN 相比,CCFlow 的四大模式是面向业务人员的认知压缩:将网关、子流程、多实例活动等概念归纳为四种可组合的模式,降低建模门槛。

2.2 开源流程引擎对比

引擎并行分支子流程特点
Activiti/CamundaParallel GatewayCall ActivityBPMN 标准,与标准元素一一对应
Flowable同上同上Activiti 分支,增强 REST 与 UI
CCFlow/JFlowRunModel.FL/HL/FHLSubFlowModel + PWorkID表单驱动,RunModel 显式标注,国内实践丰富

CCFlow 的差异化在于:将节点运行模式(RunModel)作为一等公民写入 WF_Node 表,并在发送引擎中以 5×5 矩阵统一调度,而非完全依赖 BPMN 解析器。

2.3 本文定位

本文并非提出全新的形式化工作流演算,而是对 CCFlow 工程实践中沉淀的"四大模式 + 通用操作 + 统一发送引擎"进行系统化理论总结与实现剖析,为流程引擎教学、选型与二次开发提供参考。


3 系统总体架构与汽车类比模型

3.1 分层架构

CCFlow 工作流子系统采用经典四层架构:

┌──────────────────────────────────────────────────────────────┐
│  表现层   Vue3/src/WF                                         │
│           FlowDesignerV2(设计器)/ MyFlow(运行态)            │
├──────────────────────────────────────────────────────────────┤
│  接口层   HttpHandler                                         │
│           WF_MyFlow / WF_WorkOpt / WF_Admin_CCBPMDesigner    │
├──────────────────────────────────────────────────────────────┤
│  引擎层   BP.WF                                               │
│           WorkNode / WorkReturn / WorkUnSend / ShiftWork     │
│           WorkFlow / WorkReSend / Dev2Interface              │
├──────────────────────────────────────────────────────────────┤
│  模板层   BP.WF.Template                                      │
│           Node / Direction / Cond / SFlow(子流程配置)         │
├──────────────────────────────────────────────────────────────┤
│  数据层   WF_Flow / WF_Node / WF_Direction                   │
│           WF_GenerWorkFlow / WF_GenerWorkerList / WF_Track   │
└──────────────────────────────────────────────────────────────┘

[图1:CCFlow 工作流子系统分层架构图]
建议绘制:自上而下四层矩形框,标注各层核心类名与数据表名,用箭头表示调用方向。

3.2 汽车类比模型

为帮助业务人员与开发人员建立统一心智模型,本文提出如下类比:

汽车概念流程引擎概念代码/存储对应说明
汽车控制系统流程引擎WorkNode, WorkReturn, WorkUnSend控制车辆如何启动、前进、倒车、变道、停车
汽车车厢表单引擎CCForm, MapData, FrmNode承载业务信息的容器,随流程节点切换而更换"车厢布局"
货物业务数据业务主表(PTable)、从表(MapDtl真正被运输和处理的对象
前进(踩油门)发送NodeSend(), ActionType.Forward流程向下运动
倒车退回WorkReturn.DoIt(), ActionType.Return流程向上回退
换司机移交ShiftWork.Node_Shift_ToEmp(), ActionType.Shift更换当前节点处理人
取消本次行程撤销WorkUnSend.DoUnSend(), ActionType.UnSend撤销最近一次发送
鸣笛催办催办Flow_DoPress(), ActionType.Press提醒待办人尽快处理
左拐/右拐方向条件Direction, Cond, Func_GenerNextStepNodes()根据条件选择下一节点
中途换人协助前加签/后加签Node_Askfor(), AskforHelpSta临时增加协助处理人
停车等待挂起(暂停)WorkFlow.DoHungup(), WFState.Hungup暂停流程运行
报废(标记)逻辑删除DoDeleteWorkFlowByFlag(), WFState.Delete标记删除,数据保留
报废(拆解)物理删除DoDeleteWorkFlowByReal()彻底清除全部关联数据
拖车到指定路口调整Flow_ReSend(), ActionType.Adjust将运行中流程跳到指定节点/人员
行程记录回放回滚DoRebackFlowData()已完成流程恢复到历史节点

[图2:汽车类比模型示意图]
建议绘制:一辆汽车的侧视图,标注"控制系统=流程引擎"“车厢=表单引擎”“货物=业务数据”,并用箭头引出各驾驶操作与流程操作的对应关系。

该类比的核心价值在于:流程引擎不负责"装什么货"(业务逻辑在表单与数据中),而负责"怎么运"(节点如何推进、如何回退、如何并行)。表单引擎与流程引擎解耦,使得同一流程引擎可驱动不同业务表单,同一表单也可被不同流程复用。

进一步地,方向条件对应汽车导航中的"路口选择":在 Func_GenerNextStepNodes() 中,引擎遍历当前节点的所有出边(WF_Direction),逐条评估 Cond 条件——表达式比较、SQL 查询、岗位/部门匹配等——决定"左拐"还是"右拐"。这与 BPMN 的 Exclusive Gateway / Inclusive Gateway 语义等价,但在 CCFlow 中无需额外网关节点,条件直接附着在连线上,降低了设计器图元的数量。

**阻塞模式(BlockModel)**可类比"前方施工禁行":在节点发送前,若 BlockModel ≠ None,引擎检查子线程是否全部完成(CurrNodeAll)、指定子流程是否到达某节点(SpecSubFlowNode)、或自定义 SQL/表达式是否返回阻塞信号,满足则禁止发送。这使父子流程、分合流场景下的"等待依赖"得以声明式配置。

3.3 核心数据模型

3.3.1 流程定义层
实体表/类关键字段含义
流程WF_Flow / FlowNo, Name流程模板
节点WF_Node / NodeNodeID, RunModel, TodolistModel活动单元
方向WF_Direction / DirectionNode, ToNode节点连线
条件WF_Cond / Cond表达式/SQL方向生效条件
子流程配置WF_NodeSubFlowSubFlowNo, SubFlowModel父子流程绑定
3.3.2 流程实例层
实体表/类关键字段含义
工作实例WF_GenerWorkFlowWorkID, FID, PWorkID, WFState一次流程运行
工作人员列表WF_GenerWorkerListWorkID, FK_Node, FK_Emp, IsPass待办/已办
轨迹WF_TrackActionType, NDFrom, NDTo操作审计日志
3.3.3 三种关联键
关联键适用模式含义
WorkID全部模式工作实例主键,标识一次运行
FID分合流子线程的 FID 指向干流程 WorkID
PWorkID父子流程子流程的 PWorkID 指向父流程 WorkID

重要区分FID 用于同一流程内的干/子线程关系;PWorkID 用于不同流程间的父/子调用关系。二者正交,可并存。

[图3:WorkID / FID / PWorkID 关系 ER 图]
建议绘制:三个实体框(干流程实例、子线程实例、子流程实例),标注关联键箭头。

3.4 节点运行模式枚举 RunModel

CCFlow 将节点的结构角色抽象为 RunModel 枚举(定义于 EnumLib.cs):

枚举名中文标签所属模式
0Ordinary线形模式一
1HL合流模式二/三
2FL分流模式二/三
3FHL分合流模式二/三
4SubThreadSameWorkID同表单子线程模式二
5SubThreadUnSameWorkID异表单子线程模式三

父子流程(模式四)不通过 RunModel 表达,而使用 NodeType.SubFlowNodeSubFlowModel 枚举。


4 模式一:线形流程

4.1 模式定义

线形流程是流程引擎中最基础的模式,指节点按有向图顺序(或条件分支)推进,RunModel = Ordinary(0),同一 WorkID 在节点间传递,FID = 0

典型拓扑

[开始节点] → [节点A] → [节点B] → [节点C] → [结束节点]
                  ↘ [节点D] → [节点E] ↗    (条件分支仍属线形)

4.2 适用场景

  • 请假、报销、用印等串行审批;
  • 条件路由:根据表单字段值选择不同审批路径(通过 Direction + Cond 实现,不改变 RunModel);
  • 作为其他三种模式的"骨架",复杂流程通常以线形节点为主体,嵌入分合流或子流程节点。

4.3 运行时语义

  1. 处理人完成当前节点表单后,调用 WorkNode.NodeSend()
  2. 发送引擎执行 NodeSend_11(Node toND)——普通节点到普通节点;
  3. WorkID 保持不变,业务主表 OID = WorkID
  4. Func_GenerNextStepNodes() 根据方向条件计算下一节点集合;
  5. Func_GenerWorkerLists()DeliveryWay(按部门、按角色、按表单字段等)计算接收人;
  6. WF_GenerWorkerList 中插入下一节点待办记录;
  7. 写轨迹 ActionType.Forward

4.4 方向条件(左拐/右拐)

线形流程中的分支不依赖专用网关节点,而通过方向条件实现:

  • 每条 DirectionWF_Direction)可配置一条或多条 Cond(条件);
  • 条件支持:表达式(表单字段比较)、SQL、岗位、部门等;
  • Func_GenerNextStepNodes() 遍历当前节点的所有出边,评估条件,返回满足条件的下一节点集合;
  • 若多条出边同时满足,可配置为"排他"或"并行"(后者需转入分合流模式)。

[图4:线形流程拓扑与方向条件示意图]
建议绘制:矩形节点 + 带标签的有向箭头(条件表达式标注在箭头上)。

4.5 前端实现

环节文件/组件说明
设计器形状Vue3/src/WF/Admin/FlowDesignerV2/shapes/index.tsmode=0,矩形,标签"线性"
节点属性Vue3/src/WF/Admin/AttrNode/NodeExt.ts配置 TodolistModel、退回规则等
方向条件NodeContextMenu → 方向条件配置写入 WF_Cond
运行态MyFlow.vueMyFlow_InitMyFlowGener.vue后端返回 PageName 动态加载

4.6 小结

线形流程是四大模式的基石,复杂度最低,却是理解发送引擎、多人规则、退回规则的入门路径。其 Ordinary → Ordinary 路径在 5×5 矩阵中对应 (0,0) 单元格。


5 模式二:同表单分合流

5.1 模式定义

同表单分合流指在**同一物理表(PTable)**上,由分流节点(RunModel.FL=2)启动多个子线程(RunModel.SubThreadSameWorkID=4),各子线程并行处理后,经合流节点(RunModel.HL=1)或分合流节点(RunModel.FHL=3)同步汇总,再继续主干流程。

典型拓扑

[普通] → [分流 FL] ─┬→ [同表单子线程-甲] ─┐
                    ├→ [同表单子线程-乙] ─┼→ [合流 HL] → [普通]
                    └→ [同表单子线程-丙] ─┘

5.2 适用场景

  • 采购申请明细按行分派给不同采购员并行处理;
  • 项目立项后多部门会签(共享同一申请单);
  • 同一合同需法务、财务、业务三方并行审核后汇总。

5.3 数据模型

角色WorkIDFID物理表
干流程W00PTable(主表)
子线程1W1W0PTable(同一表,OID=W1)
子线程2W2W0PTable(同一表,OID=W2)
合流后W00PTable(回到干流程 WorkID)

子线程与干流程共享同一 PTable,通过不同的 OID(= 各自 WorkID)区分数据行。子线程的 FID 字段指向干流程 WorkID,建立从属关系。

5.4 核心算法

5.4.1 分流启动子线程

方法WorkNode.NodeSend_24_SameSheet(Node toNode)
文件CCFlow/Components/BP.WF/WF/WorkNode.cs

算法步骤:

  1. 根据 DeliveryWay(如 ByDtlAsSubThreadEmps 从明细表行确定人员)计算子线程接收人列表;
  2. 为每个接收人生成独立 WorkID
  3. 设置子线程 wk.FID = 干流程 WorkID
  4. 复制分流节点表单数据到子线程(Copy(this.HisWork));
  5. WF_GenerWorkerList 中为每个子线程插入待办;
  6. 写轨迹 ActionType.ForwardFL
5.4.2 子线程到达合流

方法WorkNode.NodeSend_53_SameSheet_To_HeLiu(Node toNode)

算法步骤:

  1. 子线程处理完毕发送时,目标为合流节点;
  2. 更新当前子线程 GenerWorkerList.IsPass = 1(已办);
  3. 在干流程 GenerWorkFlow.AtPara 中维护 ThreadCount(已到达合流点的子线程数);
  4. 计算通过率:passRate = numPassed / numAll × 100
  5. passRate ≥ Node.PassRate(合流通过率,默认 100%)时:
    • 将合流节点 GenerWorkerList.IsPass 置为 0(待办可见);
    • 干流程处理人可在合流节点继续操作;
  6. 执行合流汇总:GenerHieLiuHuiZhongDtlData_2013() 将子线程从表数据汇总到主干;
  7. 写轨迹 ActionType.ForwardHL

[图5:同表单分合流时序图]
建议绘制:参与者为干流程、分流节点、子线程×N、合流节点,按时间顺序标注 WorkID/FID 变化与 ThreadCount 递增。

5.4.3 合流通过率 PassRate

Node.PassRate 属性控制合流触发条件:

  • PassRate = 100:所有子线程完成后才触发合流(默认);
  • PassRate = 50:过半子线程完成即可触发合流;
  • 适用于"多数决"类业务场景。

5.5 运行时管理

功能属性/方法说明
增加子线程ThreadIsCanAdd分流节点是否允许运行时增加子线程
删除子线程ThreadIsCanDel是否允许删除子线程
移交子线程ThreadIsCanShift是否允许移交子线程处理人
合流点补加ThreadIsCanAddOfHL合流节点是否允许补加子线程
子线程查询Dev2Interface.DB_GenerHLSubFlowDtl_TB()查询同表单合流子线程列表

5.6 前端实现

环节文件说明
设计器shapes/index.ts分流(2)、合流(1)、分合流(3)、同表单(4) 各有独立多边形
运行态MyFLDealThread.vue分合流专用处理页
子线程管理ThreadDtl.vue工具栏"子线程"弹窗
轨迹ActionType.ForwardFL(6) / ForwardHL(7)显示"分流前进"“合流前进”

5.7 撤销与退回

  • 撤销WorkUnSend.UnSend_FHL() 针对分合流节点的专用撤销逻辑;
  • 退回WorkReturn 中的分合流退回矩阵(如子线程退分流、合流退子线程等),详见第 13 章。

5.8 小结

同表单分合流解决了"同一单据、多人并行、数据共享"的核心需求,是政企会签类场景的主力模式。其关键在于 FID 关联与 PassRate 合流控制。


6 模式三:异表单分合流

6.1 模式定义

异表单分合流与同表单分合流共享分流(FL)、合流(HL)、分合流(FHL)节点类型,差异在于子线程节点使用 RunModel.SubThreadUnSameWorkID=5,每个子线程可绑定独立表单/物理表

典型拓扑

[普通] → [分流 FL] ─┬→ [异表单子线程-法务表单] ─┐
                    ├→ [异表单子线程-财务表单] ─┼→ [合流 HL] → [普通]
                    └→ [异表单子线程-技术表单] ─┘

6.2 适用场景

  • 项目立项后主流程表单不变,子线程分别走法务审查、财务评估、技术评审等独立表单;
  • 采购主单不变,子线程分别填写供应商资质表、价格对比表、质量验收表;
  • 任何需要"并行处理、异构表单、最终汇总"的场景。

6.3 与同表单的核心差异

维度同表单 (RunModel=4)异表单 (RunModel=5)
物理表与干流程相同 PTable独立表单/表(FrmNodes, RefOneFrmTree
WorkID 规则每接收人一个 WorkIDUSSWorkIDRole 控制
数据复制Copy(HisWork) 同表复制GEEntityOID 独立插入
分流方法NodeSend_24_SameSheet()NodeSend_24_UnSameSheet()
合流方法NodeSend_53_SameSheet_To_HeLiu()NodeSend_53_UnSameSheet_To_HeLiu()
查询 APIDB_GenerHLSubFlowDtl_TB()DB_GenerHLSubFlowDtl_YB()
退回特性标准退回可启用 IsKillEtcThread(退回时终止其他子线程)

[图6:同表单 vs 异表单分合流对比图]
建议绘制:左右两列对比图,标注数据表、WorkID、表单绑定差异。

6.4 USSWorkIDRole:异表单 WorkID 生成规则

NodeExt.cs 中定义:

含义场景
0仅生成一个 WorkID多人共享同一子线程实例(协作模式)
1按接收人生成 WorkID每人独立子线程实例(默认)

6.5 核心算法

6.5.1 分流启动

方法WorkNode.NodeSend_24_UnSameSheet(Nodes toNDs)

  1. 遍历目标子线程节点集合;
  2. USSWorkIDRole 决定 WorkID 生成策略;
  3. 为每个子线程绑定独立表单,通过 FrmNodes 配置表单与节点的关联;
  4. 独立插入业务数据(GEEntityOID);
  5. 设置 wk.FID = 干流程 WorkID
6.5.2 合流汇总

方法WorkNode.NodeSend_53_UnSameSheet_To_HeLiu(Node nd)

  1. 合流逻辑与同表单类似(ThreadCount + PassRate);
  2. 额外执行字段级汇总:将各子线程表单字段值写入主干表单的合流汇总从表(MapDtl.IsHLDtl = true)。

6.6 设计约束

代码中明确规定(WorkNode.cs):

  • 分流节点不能同时启动同表单与异表单子线程;
  • 分流节点不能同时启动多个同表单子线程(仅允许一个同表单子线程节点)。

这些约束保证了 5×5 发送矩阵的确定性。

6.7 前端实现

环节文件说明
设计器shapes/index.tsmode=5/16,标签"异表单",梯形多边形
属性NodeExt.tsUSSWorkIDRole 配置
退回ReturnWork.vueRunModel=4/5 时启用 IsKillEtcThread
运行态MyFLDealThread.vue与同表单共用

6.8 小结

异表单分合流将流程引擎的表达能力从"同构并行"扩展到"异构并行",是复杂协同场景的关键模式。其与同表单的统一合流控制(PassRate + ThreadCount)体现了 5×5 算法的复用性。


7 模式四:父子流程

7.1 模式定义

父子流程实现跨流程实例的编排:父流程在某个节点触发子流程,子流程独立运行,结束后可反填父流程字段并驱动父流程继续。与分合流的本质区别在于:

维度分合流父子流程
关联键FID(同一 FlowNo 内)PWorkID(不同 FlowNo 间)
节点标识RunModel.FL/HL/SubThread*NodeType.SubFlowNode
配置表无额外配置WF_NodeSubFlow
生命周期子线程随干流程结束而结束子流程可独立运行、独立结束

7.2 子流程类型

FrmSubFlow.cs 定义:

类型枚举值触发方式典型场景
手动子流程HandSubFlow = 0用户在父流程表单点击启动按需发起子审批
自动子流程AutoSubFlow = 1节点发送时 CallAutoSubFlow()到达某节点自动创建
延续子流程YanXuFlow = 2子流程结束后延续父流程阶段性子任务

7.3 子流程模式

模式枚举含义
下级子流程SubLevel子流程挂到当前父 WorkID
同级子流程SameLevel子流程挂到父流程的父级

7.4 典型拓扑

[父流程-节点A] → [父流程-节点B(含子流程配置)]
                        ↓ 自动/手动启动
                  [子流程-开始] → [子流程-审批] → [子流程-结束]
                        ↓ 子流程结束
                  反填父流程字段 → 驱动父流程到下一节点

[图7:父子流程生命周期状态图]
建议绘制:父流程状态机 + 子流程状态机,用虚线标注 PWorkID 关联与反填事件。

7.5 核心算法

7.5.1 建立父子关系

方法Dev2Interface.SetParentInfo(subFlowNo, subFlowWorkID, parentWorkID, ...)

UPDATE WF_GenerWorkFlow 
SET PFlowNo=..., PWorkID=..., PNodeID=..., PEmp=... 
WHERE WorkID=子流程WorkID
7.5.2 手动启动

入口WF_WorkOpt.SendSingleSubFlow()

  • SubLevelNode_CreateBlankWork(subFlowNo, ..., parentWorkID, ...) + SetParentInfo()
  • SameLevel:挂到 gwf.PWorkID
7.5.3 自动启动

方法WorkNode.CallAutoSubFlow()

  • InvokeTime(节点发送前/后)、条件表达式、SQL 数据源批量创建子流程实例;
  • SubFlowHidTodolist 可隐藏父流程待办(IsPass=100)。
7.5.4 子流程全部结束后的父流程处理

方法WorkNodePlus.SubFlowOver_* 系列
规则 AllSubFlowOverRole

规则行为
None不驱动父流程
SendParentFlowToNextStep自动发送父流程到下一步
OverParentFlow结束父流程

字段反填BackCopyRole 控制子流程字段向父流程的映射。

7.6 前端实现

环节文件说明
设计器subFlowNodes[0]六边形,NodeType.SubFlowNode=3
创建useVueFlowNode.tsCreateSubFlowNode
配置向导GPN_NewSubFlow.ts手工/自动/延续/导航
实体SubFlowHand.ts, SubFlowAuto.ts, SubFlowYanXu.ts
运行态SubFlow.vue嵌入父流程表单
轨迹Track.vue聚合子流程实例卡片
动作ActionType.CallChildenFlow(9), StartChildenFlow(10)

7.7 小结

父子流程解决了跨业务域流程编排问题,是四大模式中唯一涉及多个 FlowNo 的模式。PWorkID 关联键使其与分合流的 FID 完全正交。


8 四大模式的覆盖性论证

8.1 正交性与可组合性

四大模式并非互斥,一个完整企业流程通常是它们的组合

[线形] → [分流] → [同表单子线程×3] → [合流] → [线形]
                                              ↓
                                    [自动启动父子流程]
                                              ↓
                                    [子流程:线形审批]
                                              ↓
                                    [反填父流程] → [线形] → [结束]

8.2 需求覆盖表

企业需求对应模式说明
串行审批、条件分支线形流程通过方向条件实现分支
同一单据多人并行、会签同表单分合流共享 PTable
并行子任务、异构表单异表单分合流独立表单绑定
跨业务域编排、主从单据父子流程PWorkID 关联
复杂监管(并行+子流程+汇总)多模式组合四大模式正交组合

8.3 "涵盖流程应用环境各个方面"的论证

从结构维度看,任意流程图均可分解为以下基本元素:

  1. 顺序执行 → 线形流程;
  2. 并行分支与同步合并(同构数据) → 同表单分合流;
  3. 并行分支与同步合并(异构数据) → 异表单分合流;
  4. 流程间调用 → 父子流程。

从操作维度看,第 9–13 章论述的通用操作(发送、退回、移交等)在所有模式下均可用统一引擎调度。因此,四大模式 + 通用操作构成了流程应用环境的最小完备集

8.4 局限性

  1. 分流节点不能混启同表单与异表单子线程;
  2. 极端复杂编排(事件子流程、循环子流程)需结合脚本/服务任务扩展;
  3. 与 BPMN 完整语义并非一一对应,偏向表单驱动型场景。

[图8:四大模式组合示例图]
建议绘制:一个完整企业流程图,用不同颜色标注四种模式所在区段。


9 节点通用操作

流程引擎在每个节点上提供一组通用操作,类比汽车驾驶行为(见 3.2 节)。本节结合 BP.WF 源码,逐一阐述各操作的触发条件、算法与轨迹记录。

9.1 操作总览

操作汽车类比核心类/方法ActionTypeWFState 变化
发送(前进)踩油门WorkNode.NodeSend()Forward(1)Runing
退回(后退)倒车WorkReturn.DoIt()Return(2)ReturnSta(5)
移交(换司机)换司机ShiftWork.Node_Shift_ToEmp()Shift(3)Shift(6)
撤销(取消任务)取消行程WorkUnSend.DoUnSend()UnSend(5)恢复上一状态
催办(鸣笛)鸣笛Dev2Interface.Flow_DoPress()Press(18)不变
前加签临时乘客Dev2Interface.Node_Askfor()AskforHelp(24)Askfor(8)
后加签临时乘客Node_Askfor() + AskforHelpStaForwardAskfor(25)AskForReplay(10)
会签(前加签扩展)多位乘客Node_HuiQian_AddEmps()HuiQian(30)HuiQianing
删除报废WorkFlow.DoDeleteWorkFlowByFlag/Real()DeleteFlowByFlag(19)Delete(7)
挂起(暂停)停车WorkFlow.DoHungup()Hungup(15)Hungup(4)

[图9:节点通用操作与汽车类比对照图]
建议绘制:汽车仪表盘图标,每个图标旁标注对应操作名称与 ActionType。

9.2 发送(前进)

9.2.1 入口与调用链
前端 MyFlowGener.vue 
  → HttpHandler WF_WorkOpt 
  → Dev2Interface.Node_SendWork() 
  → WorkNode.NodeSend() 
  → NodeSend_Send_5_5()
9.2.2 三阶段处理

NodeSend() 方法体分为三大部分(WorkNode.cs 代码注释明确,约第 7613 行):

  1. 发送前检查(第 1 部分):

    • 流程是否已结束(IsOver)或逻辑删除(WFState.Delete);
    • 当前用户是否有处理权限(Flow_IsCanDoCurrentWork);
    • Guest 节点身份校验;
    • 会签状态检查(会签中是否允许发送);
    • 合流子线程是否全部完成;
    • 阻塞模式(BlockModel)检查;
    • 必填项校验;
    • 触发 EventListNode.SendWhen 事件。
  2. 5×5 核心算法(第 2 部分):详见第 11 章。

  3. 发送后处理(第 3 部分):

    • 更新 GenerWorkFlow 状态;
    • WF_Track 轨迹;
    • 多人规则处理(队列/协作/抢办);
    • 会签完成判断;
    • 抄送(CC);
    • 子流程自动启动(CallAutoSubFlow);
    • DTS 数据同步;
    • 消息推送;
    • 触发 EventListNode.SendSuccess 事件。

9.3 退回(后退)

9.3.1 入口
前端 ReturnWork.vue 
  → WF_WorkOpt.DoReturnWork() 
  → Dev2Interface.Node_ReturnWork() 
  → WorkReturn.DoIt()
9.3.2 算法概要
  1. returnToNodeID == 0,调用 DB_GenerWillReturnNodes(workid)ReturnRole 计算可退节点列表;
  2. DoIt() 分支:
    • 跨流程退回 → ReturnToParentFlow()
    • 同节点队列模式 → DoOrderReturn()
    • 目标为协作/组长且 TeamReturnRole==1DoOrderReturn()
    • 否则按 当前 RunModel × 目标 RunModel 矩阵调用 ExeReturn1_1()ExeReturn2_4() 等;
  3. 清理中间节点 GenerWorkerList、审核轨迹;
  4. IsBackTrack 控制是否保留中间节点业务数据;
  5. 更新 WFState = ReturnSta,写 ActionType.ReturnReturnAndBackWay(201)

详见第 13 章退回规则。

9.4 移交(换司机)

9.4.1 入口
前端 Shift.vue 
  → WF_WorkOpt.Shift_Save() 
  → Dev2Interface.Node_Shift() 
  → ShiftWork.Node_Shift_ToEmp()
9.4.2 算法
  1. 校验:流程未完成、被移交人不在当前待办;
  2. TodolistModel 分支:
    • 协作/队列/组长模式:删除移交人 GenerWorkerList,插入被移交人记录,重算 SDT(应完成时间);
    • 抢办模式:直接 UPDATE 或重建 GenerWorkerList
  3. 设置 gwf.WFState = WFState.Shift
  4. 更新 TodoEmps 字段;
  5. ActionType.Shift,触发 EventListNode.ShitAfter 与消息推送。

撤销移交ShiftWork.DoUnShift()ActionType.UnShift(4)

9.5 撤销(取消任务)

9.5.1 入口
前端在途列表 
  → WF.Runing_UnSend() 
  → Dev2Interface.Flow_DoUnSend() 
  → WorkUnSend.DoUnSend()
9.5.2 算法
  1. 校验 CancelRole:若为 None 则禁止撤销;
  2. 开始节点禁止撤销;
  3. 对方已读/已办时禁止(受 CancelDisWhenRead 控制);
  4. 会签状态:默认禁止(IsEnableUnSendWhenHuiQian 可放开);
  5. GenerWorkerListIsPass=1 的记录确定 cancelToNodeID
  6. 按节点类型(普通/分流/合流/子流程/游离态)分别调用 DoUnSendIt()DoUnSendFeiLiu()DoUnSendHeiLiu_Main() 等;
  7. 恢复上一节点待办,删除后续节点数据;
  8. ActionType.UnSend
  9. 若 Track 存在 Return/ReturnAndBackWay,撤销后恢复 WFState.ReturnSta
9.5.3 撤销规则 CancelRole
含义
OnlyNextStep仅允许撤销到下一步
None禁止撤销
NextStepAndStartNode可撤销到下一步和开始节点
SpecNodes可撤销到指定节点

9.6 催办(鸣笛)

9.6.1 入口
前端 Press.vue 
  → WF_WorkOpt.Press() 
  → Dev2Interface.Flow_DoPress()
9.6.2 算法
  1. 校验流程未完成且非开始节点;
  2. 查当前节点 GenerWorkerListIsPass=0)获取待办人;
  3. 按日写入 PressWork 催办记录表(防重复:WorkID_UserNo_ToEmp_Date);
  4. Port_SendMsg(..., SMSMsgType.DoPress) 发送消息(站内信/短信/微信等);
  5. ActionType.Press
  6. 可选递归催办子流程待办人。

会签主持人催办:HuiQian_Press() 专门催办会签中的待办人。

9.7 前加签与后加签

CCFlow 将"加签"与"会签"分为两套机制:

9.7.1 加签(Askfor)——单人请求协助
概念说明
前加签处理人先请他人协助,协助完成后由自己继续发送
后加签处理人先发送,加签人协助后流程才到下一步

入口WF_WorkOpt.Askfor()Dev2Interface.Node_Askfor()

算法

  1. WFState.Askfor
  2. GenerWorkerList 为被加签人插入待办,PassInt 存储加签模式;
  3. 被加签人处理完毕后 DealAskForState() 根据 AskforHelpSta
    • AfterDealSend(5)加签后直接发送 → 继续 NodeSend 到下一步(后加签语义);
    • AfterDealSendByWorker(6)加签后由发起人发送WFState.AskForReplay,待办回到发起人(前加签语义);
  4. Node_AskforReply():加签人回复后触发发送或返回。
9.7.2 会签(HuiQian)——多人同节点会签
方法功能
Node_HuiQian_Init()初始化会签界面数据
Node_HuiQian_AddEmps()增加会签人(IsPass=-1
Node_HuiQian_AddLeader()激活组长(IsPass=-1→0
Node_HuiQianDone()发起会签,通知会签人
Node_HuiQian_Delete()删除会签人

会签完成判断在 NodeSend 发送后处理中,依据 HuiQianRoleHuiQianLeaderRoleTeamLeaderConfirmRole 决定是否全员完成。

[图10:前加签与后加签流程对比图]
建议绘制:两种加签模式的泳道图,标注 AskforHelpSta 分支。

9.8 删除

9.8.1 逻辑删除

方法WorkFlow.DoDeleteWorkFlowByFlag()

  • WFState = Delete
  • 删除 GenerWorkerList(待办不可见);
  • 保留 WF_Track 轨迹和业务主表数据;
  • 可恢复:DoUnDeleteWorkFlowByFlag()
9.8.2 物理删除

方法WorkFlow.DoDeleteWorkFlowByReal()

  • 删除 WF_TrackGERptMapDtl、各节点表单数据;
  • 删除 WF_GenerWorkFlowWF_GenerWorkerListWF_CCList
  • 不可恢复
9.8.3 写日志删除

方法WorkFlow.DoDeleteWorkFlowByWriteLog()

  • 先插入 WorkFlowDeleteLog
  • 再调用 DoDeleteWorkFlowByReal()
9.8.4 删除权限 DelWorkFlowRole
含义
None禁止删除
DeleteByFlag仅逻辑删除
DeleteAndWriteToLog写日志后物理删除
DeleteReal直接物理删除
ByUser由用户选择删除方式

9.9 挂起(暂停)

CCFlow 中"暂停"对应 挂起(Hungup)

方法WorkFlow.DoHungup()

  1. WFState = Hungup
  2. AtPara 记录挂起人、方式(HungupWay:永久/指定日期)、审批人;
  3. 通知除开始节点外的当前待办人;
  4. 审批人 HungupWorkAgree() 解除挂起,或 HungupWorkReject() 拒绝;
  5. ActionType.Hungup(15) / UnHungup(16)

入口WF_WorkOpt.Hungup_Save()Dev2Interface.Node_HungupWork()


10 流程实例级操作

节点通用操作作用于当前节点,而流程实例级操作作用于整个流程实例,通常由管理员执行。

10.1 调整(ReSend)

定义:将运行中的流程实例跳转到指定节点、指定人员,使其在该节点产生待办。

入口Dev2Interface.Flow_ReSend(workid, toNodeID, toEmps, note, model)

算法

  1. 校验:流程未完成、非子线程节点、非"退回并原路返回"状态;
  2. type=1(向前跳过):Flow_ReSendBySkip()——当前待办转已办、强制结束子流程、重建目标节点待办;
  3. 否则:WorkReSend.DoIt() 按 RunModel 矩阵调整(类似退回的逆操作);
  4. ActionType.Adjust(31)

应用场景:流程发错节点、需要管理员干预跳转、跳过某些审批环节。

[图11:流程调整前后状态对比图]
建议绘制:调整前节点高亮 vs 调整后节点高亮的流程图。

10.2 回滚(Rollback)

定义:将已完成的流程实例恢复到指定历史节点,使其重新进入运行状态。

入口WF_WorkOpt.Rollback_Done()FlowExt.DoRebackFlowData()

算法

  1. WF_Track 轨迹重建 GenerWorkFlowGenerWorkerList
  2. 恢复到指定节点,WFState = ReturnSta
  3. 清理完成后的冗余数据;
  4. 逻辑删除恢复(DoUnDeleteWorkFlowByFlag)也调用此接口。

与退回的区别

维度退回回滚
执行人当前节点处理人管理员
流程状态运行中已完成
权限节点 ReturnRole流程 RollbackPower

回滚权限 RollbackPowerFlow.cs):

含义
0管理员
1流程参与人
2指定节点处理人
3指定角色
4指定人员

10.3 逻辑删除与物理删除

已在 9.8 节论述。实例级删除通过 WF_WorkOpt.DeleteFlowInstance_DoDelete() 入口,按 DelWorkFlowRole 分支调用不同删除方法。

10.4 小结

操作适用状态核心方法可逆性
调整运行中Flow_ReSend()可再次调整
回滚已完成DoRebackFlowData()可再次回滚
逻辑删除任意DoDeleteWorkFlowByFlag()可恢复
物理删除任意DoDeleteWorkFlowByReal()不可恢复

11 节点向下运动的核心算法:5×5 发送矩阵

11.1 算法背景

CCFlow 的发送引擎经历了多次演进。2012 年升级的 NodeSend_Send_5_5() 方法将发送逻辑统一为 5×5 矩阵:当前节点 RunModel(行)× 目标节点 RunModel(列),每个单元格对应一个专用发送方法。这一设计避免了为每种模式编写独立引擎,保证了撤销、退回、轨迹的一致性。

11.2 矩阵结构

CCFlow 源码注释将发送逻辑称为"5×5 算法"(WorkNode.NodeSend(),2012-11-11 厦门升级),意指当前节点 5 类运行角色 × 目标节点 5 类运行角色的笛卡尔调度。其中子线程的"同表单/异表单"是同一行内的分支,而非独立行。RunModel 枚举共 6 个值(0–5),在 NodeSend_Send_5_5()switch 中合并为 5 个 case 分支。

                    目标节点 RunModel
                 Ord(0)  HL(1)  FL(2)  FHL(3)  Same(4)  UnSame(5)
当前  Ordinary(0)  [11]   [11]   [11]   [11]    禁止     禁止
节点  HL(1)        [31]   [31]   [31]   [31]    禁止     禁止
RunM  FL(2)        [11]   [11]   [11]   [11]    [24_S]   [24_U]
odel  FHL(3)       [11]   [11]   禁止   [11]    [24_S]   [24_U]
      Same(4)      禁止   [53_S] 禁止   [53_S]   [11]     禁止
      UnSame(5)    禁止   [53_U] 禁止   [53_U]   禁止     [11]

注:[11] = NodeSend_11()[24_S] = NodeSend_24_SameSheet()[24_U] = NodeSend_24_UnSameSheet()[31] = NodeSend_31()[53_S/U] = 合流方法。空白/禁止格在代码中 throw Exception 提示流程设计错误。

核心源码结构WorkNode.NodeSend_Send_5_5()CCFlow/Components/BP.WF/WF/WorkNode.cs):

switch (this.HisNode.HisRunModel)
{
    case RunModel.Ordinary:       // 行1:普通节点
        switch (toND.HisRunModel) {
            case RunModel.Ordinary: this.NodeSend_11(toND); break;
            case RunModel.SubThreadSameWorkID:
            case RunModel.SubThreadUnSameWorkID:
                throw new Exception("普通节点不能连接子线程节点");
        }
        break;
    case RunModel.FL:             // 行2:分流节点
        switch (toND2.HisRunModel) {
            case RunModel.SubThreadSameWorkID:
                NodeSend_24_SameSheet(toND2); break;
            case RunModel.SubThreadUnSameWorkID:
                NodeSend_24_UnSameSheet(toNDs); break;
        }
        break;
    case RunModel.HL:             // 行3:合流节点
        this.NodeSend_31(toND3); break;
    case RunModel.SubThreadSameWorkID:  // 行4/5:子线程
    case RunModel.SubThreadUnSameWorkID:
        if (toND5.HisRunModel == RunModel.HL)
            NodeSend_53_SameSheet_To_HeLiu(toND5);  // 或 UnSameSheet 版本
        break;
}

设计约束(源码强制校验,保证矩阵确定性):

  • 分流节点不能同时启动同表单与异表单子线程(workflow_error_4);
  • 分流节点不能同时启动多个同表单子线程(workflow_error_5);
  • 普通节点不能直接连接子线程节点(须经分流节点);
  • 合流节点不能连接子线程节点。

[图12:5×5 发送矩阵示意图]
建议绘制:6×6 矩阵表格,有效单元格绿色高亮、禁止单元格灰色标注 Exception,并在图旁附上述 switch 伪代码。

11.3 关键单元格详解

单元格方法场景
(0,0)NodeSend_11()线形 → 线形(最常用)
(0,4)NodeSend_24_SameSheet()线形 → 同表单子线程(经分流)
(2,4)NodeSend_24_SameSheet()分流 → 同表单子线程
(2,5)NodeSend_24_UnSameSheet()分流 → 异表单子线程
(4,1)NodeSend_53_SameSheet_To_HeLiu()同表单子线程 → 合流
(5,1)NodeSend_53_UnSameSheet_To_HeLiu()异表单子线程 → 合流
(1,0)NodeSend_31()合流 → 线形(合流后继续)
(3,*)分合流行分合流节点可再次分流

11.4 算法执行流程

NodeSend(jumpToNode, jumpToEmp)
│
├─ 第1部分:发送前检查
│   ├─ 权限校验
│   ├─ 状态校验(已结束/已删除/会签中)
│   ├─ 阻塞模式检查
│   └─ SendWhen 事件
│
├─ 第2部分:5×5 核心算法
│   ├─ Func_GenerNextStepNodes()  // 计算下一节点
│   ├─ 遍历下一节点集合
│   │   └─ switch(当前RunModel)
│   │       └─ switch(目标RunModel)
│   │           └─ 调用对应 NodeSend_XY() 方法
│   └─ 子流程自动启动 CallAutoSubFlow()
│
└─ 第3部分:发送后处理
    ├─ 更新 GenerWorkFlow
    ├─ 写 Track
    ├─ 多人规则(队列/协作/抢办)
    ├─ 会签完成判断
    ├─ 抄送 CC
    ├─ DTS 同步
    ├─ 消息推送
    └─ SendSuccess 事件

11.5 下一节点计算

方法Func_GenerNextStepNodes()

  1. 查询当前节点的所有出边(WF_Direction);
  2. 对每条出边评估条件(Cond):
    • 表达式条件:解析表单字段值,执行比较;
    • SQL 条件:执行 SQL 查询,返回行数 > 0 则满足;
    • 岗位/部门条件:判断当前处理人是否匹配;
  3. 返回满足条件的下一节点集合;
  4. 若仅一个下一节点,直接发送;若多个,根据配置决定排他或并行。

11.6 接收人计算

方法Func_GenerWorkerLists(Node toNode)

  1. 读取目标节点的 DeliveryWay(接收人规则);
  2. 按规则计算人员集合(ByStationByDeptBySQLBySelectedByDtlAsSubThreadEmps 等 20+ 种);
  3. 过滤无效人员;
  4. 返回 (EmpNo, EmpName) 列表。

11.7 算法优势

  1. 统一性:全部模式走同一入口,撤销/退回/轨迹逻辑一致;
  2. 可扩展性:新增 RunModel 只需扩展矩阵行列;
  3. 可测试性:每个单元格可独立单元测试;
  4. 可维护性:避免 if-else 堆叠,逻辑清晰。

12 多人处理规则

12.1 TodolistModel 枚举

当同一节点有多个接收人时,TodolistModel 决定他们如何协作:

枚举名中文行为汽车类比
0QiangBan抢办谁先处理谁生效,其他人待办自动消除多人抢开一辆车
1Teamup协作所有人都要处理,最后一人发送到下一步多人轮流驾驶
2Order队列按顺序处理,最后一人发送到下一步排队驾驶
3Sharing共享需申请后才能处理需拿钥匙才能开
4TeamupGroupLeader协作组长组员协作 + 组长确认车队队长最后验收

定义位置EnumLib.cs 第 640 行;节点属性 Node.TodolistModelWF/Node.cs 第 2633 行)。

[图13:多人处理规则示意图]
建议绘制:五种模式的泳道图,标注待办生成与消除时机。

12.2 抢办模式(QiangBan)

行为

  1. 为所有接收人各插入一条 GenerWorkerListIsPass=0);
  2. 任一人发送时,将其余人 IsPass 置为 1(自动已办);
  3. 流程向下运动。

适用场景:值班审批、客服处理——谁有空谁处理。

12.3 协作模式(Teamup)

行为

  1. 为所有接收人各插入一条 GenerWorkerListIsPass=0);
  2. 每人发送时仅将自己的 IsPass 置为 1;
  3. 最后一人发送时,流程才向下运动;
  4. 发送后处理中判断 IsAllPassed()

适用场景:多部门会签、联合审批——所有人都必须发表意见。

12.4 队列模式(Order)

行为

  1. 为所有接收人按顺序插入 GenerWorkerList,仅第一人 IsPass=0,其余 IsPass=-1(未到);
  2. 当前人发送后,下一人 IsPass 从 -1 变为 0;
  3. DealOradeNode() 方法管理队列推进;
  4. 最后一人发送时流程向下运动。

适用场景:逐级审批——必须按职级顺序处理。

12.5 共享模式(Sharing)

行为

  1. 所有接收人可见待办,但需先"申请"才能获得处理权;
  2. 申请后其他人待办消除;
  3. 处理完毕发送。

适用场景:任务池、工单抢单。

12.6 协作组长模式(TeamupGroupLeader)

行为

  1. 组员按协作模式处理;
  2. 组长通过 TeamLeaderConfirmRole 计算;
  3. 组长最后确认后流程向下运动。

12.7 会签机制(HuiQian)

会签是协作模式的扩展,通过 HuiQianRole 控制:

HuiQianRole含义
Teamup(1)协作会签
TeamupGroupLeader(4)组长会签

组长会签规则 HuiQianLeaderRole

含义
OnlyOne仅一个组长
LastOneMain最后一个组长为主持人
EveryOneMain每人都可以是主持人

12.8 多人规则在操作中的体现

操作抢办协作队列
发送一人发送即可最后一人发送按序发送
退回标准退回TeamReturnRole 控制DoOrderReturn()
移交UPDATE 单人替换 GenerWorkerList替换当前队列项
撤销标准撤销协作节点特殊处理恢复队列状态

13 退回规则

13.1 ReturnRole 枚举

每个节点可配置 ReturnRole,决定处理人可以退回到哪些历史节点:

枚举名中文行为
0CanNotReturn不能退回该节点禁止退回操作
1ReturnPreviousNode仅上一节点只能退回到直接前驱节点
2ReturnAnyNodes任意历史节点可退回到任何已处理过的节点(默认)
3ReturnSpecifiedNodes指定节点仅可退回到配置的节点列表
4ReturnStartNode退到开始节点只能退回到流程开始节点
5ByReturnLine按退回线由流程图上标注的退回方向决定

定义位置EnumLib.cs 第 1250 行;计算可退节点:Dev2Interface.DB_GenerWillReturnNodes(workid)

13.2 可退节点计算

方法DB_GenerWillReturnNodes(workid)

  1. 读取当前节点的 ReturnRole
  2. 按规则查询 WF_GenerWorkerList 历史记录;
  3. 分流/合流节点特殊处理:直接查 GenerWorkerList 而非按 ReturnRole
  4. 返回可退节点列表供前端展示。

[图14:退回规则与可退节点计算流程图]
建议绘制:ReturnRole 分支判断的流程图。

13.3 退回执行矩阵

WorkReturn.DoIt()当前 RunModel × 目标 RunModel 矩阵调用执行方法:

方法场景
ExeReturn1_1()线形 → 线形
ExeReturn2_4()分流 → 同表单子线程
ExeReturn3_2()合流 → 分流
ExeReturn3_4()合流 → 同表单子线程
ExeReturn5_2()同表单子线程 → 分流
DoItOfKillEtcThread()子线程退分流且杀死其他子线程
ReturnToParentFlow()跨流程退回到父流程
DoOrderReturn()队列/协作模式专用退回

13.4 退回并原路返回

ActionTypeReturnAndBackWay(201)

行为

  1. 退回到目标节点后,处理人重新处理;
  2. 处理完毕后,流程自动按原路径返回到退回前的节点;
  3. GenerWorkFlow.AtPara 中记录返回路径;
  4. 适用于"退回到发起人修改后直接回到当前审批人"的场景。

13.5 分合流退回特殊规则

场景规则
子线程退分流可选 IsKillEtcThread:是否终止其他子线程
合流退子线程需清理 ThreadCount
分流节点不按 ReturnRole 算,直接查 GenerWorkerList
协作节点TeamReturnRole==1 时走 DoOrderReturn()

13.6 退回与撤销的协同

  • 若流程经退回后发送,再撤销:撤销会恢复到 WFState.ReturnSta
  • 若 Track 存在 ReturnAndBackWay,撤销后保留原路返回标记;
  • 退回后的业务数据处理受 IsBackTrack 控制。

13.7 前端实现

环节文件说明
退回页面ReturnWork.vue展示可退节点列表
初始化WF_WorkOpt.Return_Init()调用 DB_GenerWillReturnNodes
执行WF_WorkOpt.DoReturnWork()调用 Node_ReturnWork
异表单ReturnWork.vueRunModel=4/5 时显示 IsKillEtcThread 选项

14 案例研究与实验验证

14.1 案例一:采购申请(同表单分合流)

业务描述:采购员提交采购申请,系统按明细表行自动分派给各采购专员并行询价,全部完成后汇总到采购主管处合流审批。

配置要点

节点RunModel关键属性
开始Ordinary
采购员提交Ordinary
分流FL(2)DeliveryWay=ByDtlAsSubThreadEmps
专员询价×NSubThreadSameWorkID(4)共享主表
主管合流HL(1)PassRate=100
结束Ordinary

验证步骤

  1. 提交含 3 行明细的采购申请;
  2. 验证生成 3 个子线程,各专员待办正确;
  3. 专员 1、2 完成,合流未触发;
  4. 专员 3 完成,合流触发,主管待办出现;
  5. WF_Track 轨迹含 ForwardFLForwardHL

[图15:采购申请案例流程图]
建议绘制:案例流程图 + 运行截图(待办列表、轨迹)。

14.2 案例二:项目立项(异表单分合流)

业务描述:项目经理提交立项申请(主表单),系统自动分流到法务、财务、技术三方,各方填写独立评审表单,完成后合流汇总到总经理审批。

配置要点

节点RunModel关键属性
开始Ordinary
项目经理提交Ordinary主表单 Frm_Project
分流FL(2)出边 3 条,分别连向 3 个子线程
法务评审SubThreadUnSameWorkID(5)绑定 Frm_LegalReview
财务评审SubThreadUnSameWorkID(5)绑定 Frm_FinanceReview
技术评审SubThreadUnSameWorkID(5)绑定 Frm_TechReview
总经理合流HL(1)PassRate=100,合流从表 IsHLDtl=true
结束Ordinary

数据流

  1. 干流程 WorkID=W0FID=0,主表 Frm_ProjectOID=W0
  2. 分流后生成 3 个子线程:W1(FID=W0)W2(FID=W0)W3(FID=W0),各自绑定不同物理表;
  3. 法务填写 Frm_LegalReview,财务填写 Frm_FinanceReview,互不干扰;
  4. 三方完成后 ThreadCount 递增至 3,触发合流;
  5. NodeSend_53_UnSameSheet_To_HeLiu() 将各子表单关键字段汇总到主表合流从表;
  6. 总经理在主表单看到三方评审摘要后审批。

验证步骤

  1. 提交立项申请,验证 3 个子线程待办分别出现在法务/财务/技术人员待办列表;
  2. 验证各子线程打开的是不同表单(非同一 PTable);
  3. 仅完成 2 个子线程时,总经理无待办;
  4. 第 3 个子线程完成后,总经理待办出现;
  5. WF_Track 含 3 条 SubThreadForward 与 1 条 ForwardHL
  6. 测试退回:子线程退分流时勾选 IsKillEtcThread,验证其余子线程被终止。

[图16:项目立项异表单分合流案例图]
建议绘制:主表单 + 三个独立子表单 + 合流汇总从表的 ER 关系图,并附运行态截图。

14.3 案例三:合同审批调用法务子流程(父子流程)

业务描述:合同审批流程到达"法务审核"节点时自动启动法务子流程;子流程独立走完法务审批链后,反填合同审批单字段并自动驱动父流程到下一节点。

配置要点

配置项说明
父流程节点NodeType.SubFlowNode六边形子流程节点
子流程类型AutoSubFlow(1)节点发送时自动触发
子流程模式SubLevelPWorkID 指向父 WorkID
启动时机InvokeTime = 发送后CallAutoSubFlow()
全部结束规则SendParentFlowToNextStep子流程全结束后自动发送父流程
字段反填BackCopyRole子流程"法务意见"→父流程"法务审核意见"
待办隐藏SubFlowHidTodolist=true父节点 IsPass=80,待办不可见

生命周期

  1. 业务员在父流程"合同审批"节点点击发送;
  2. NodeSend_Send_5_5() 正常发送后,触发 CallAutoSubFlow()
  3. 创建子流程实例 W_subPWorkID=W_parentPFlowNo=合同审批PNodeID=法务审核节点
  4. 父流程当前处理人待办设为不可见(IsPass=80);
  5. 法务人员在子流程中完成多级审批;
  6. SubFlowOver_SendParentFlowToNextStep() 检测全部子流程结束;
  7. 执行字段反填,恢复父流程待办,自动 NodeSend 到下一节点;
  8. 轨迹记录 ActionType.StartChildenFlow(10)CallChildenFlow(9)

验证步骤

  1. 父流程发送到法务节点,验证子流程自动创建且 PWorkID 正确;
  2. 验证父流程发起人在此期间待办不可见(在途可查进度);
  3. 子流程完成后,验证父流程字段被反填;
  4. 验证父流程自动流转到下一节点(如"总经理审批");
  5. 测试催办:Flow_DoPress(workID, msg, isPressSubFlow=true) 可递归催办子流程待办人。

[图17:合同审批父子流程案例图]
建议绘制:父流程 + 子流程双泳道图,标注 PWorkID、IsPass=80 隐藏区间、反填箭头。

14.4 案例四:请假审批(线形流程 + 多人规则组合)

业务描述:员工提交请假申请,部门经理与 HR 按队列模式逐级审批,最后由分管领导协作会签后归档。全程为线形流程,无分合流。

配置要点

节点RunModelTodolistModel说明
开始Ordinary员工填写
部门经理OrdinaryOrder(2)若多人则按职级队列
HR 审批OrdinaryQiangBan(0)多人抢办,谁先处理谁生效
分管领导OrdinaryTeamup(1)协作会签,全员完成后发送
结束Ordinary归档

验证要点

  1. 队列节点验证 IsPass=-1(未到)与顺序激活;
  2. 抢办节点验证一人发送后他人待办自动消除;
  3. 协作节点验证最后一人发送才触发 NodeSend_11()
  4. 退回测试:ReturnRole=ReturnPreviousNode,部门经理退回后员工修改再提交。

[图18:请假审批线形流程案例图]
建议绘制:简单线性流程图,标注各节点 TodolistModel 图标。

14.5 通用操作验证矩阵

操作线形同表单分合流异表单分合流父子流程
发送
退回
移交
撤销
催办
加签
挂起
调整
回滚

15 结论与展望

15.1 主要结论

  1. 四大模式构成最小完备集:线形流程、同表单分合流、异表单分合流、父子流程分别从顺序执行、同构并行、异构并行、跨流程编排四个维度覆盖了流程应用环境的主要结构需求,且可正交组合。

  2. 统一发送引擎保证一致性:CCFlow 以 RunModel 枚举和 5×5 发送矩阵统一调度全部模式,使得发送、退回、撤销、轨迹、待办查询共用一套基础设施。

  3. 三元关联键语义清晰WorkID 标识实例,FID 承载分合流关系,PWorkID 承载父子流程关系,三者正交。

  4. 汽车类比模型降低认知门槛:将流程引擎、表单引擎、业务数据分别类比为控制系统、车厢、货物,将通用操作类比为驾驶行为。

  5. 通用操作与多人/退回规则协同:发送、退回、移交等操作均考虑 TodolistModelReturnRole,保证复杂场景下行为一致。

  6. 前后端一致映射:Vue3 设计器通过 RunModel 形状模板实现设计态可视化,运行态由后端 PageName 动态路由。

15.2 未来工作

  1. 模式自动识别与流程检查增强;
  2. BPMN 2.0 导入导出映射;
  3. 基于 AI 的流程模式推荐;
  4. 5×5 发送矩阵的形式化验证;
  5. 微服务架构下的分布式扩展。

致 谢

[待填写:感谢导师、项目组、CCFlow 开源社区及资助单位等。]


参考文献

[1] van der Aalst W M P, ter Hofstede A H M, Kiepuszewski B, et al. Workflow Patterns[J]. Distributed and Parallel Databases, 2003, 14(1): 5-51.

[2] OMG. BPMN 2.0 Specification[S]. Object Management Group, 2011.

[3] 柴晓伟, 周朋. CCFlow/JFlow 工作流引擎技术白皮书[R]. 济南驰骋信息技术有限公司, 2020.

[4] Ellis C A, Maltzahn C. The ε-Challenges on the Workflow Way[J]. Concurrency: Practice and Experience, 1997, 9(10): 859-872.

[5] Reichert M, Weber B. Enabling Flexibility in Process-Aware Information Systems[J]. Data & Knowledge Engineering, 2012, 76: 13-47.

[6] 范玉顺, 王刚, 高展. 工作流管理技术基础[M]. 北京: 清华大学出版社, 2001.

[7] Russell N, ter Hofstede A H M, Edmond D, et al. Workflow Resource Patterns[J]. BETA Working Paper Series, 2004.

[8] 周朋. BP.WF 工作流引擎核心源码解析[M]. 济南: 驰骋技术, 2019.

[9] Dumas M, La Rosa M, Mendling J, et al. Fundamentals of Business Process Management[M]. 2nd ed. Berlin: Springer, 2018.

[10] ISO/IEC 19510:2013. Information technology — Object Management Group Business Process Model and Notation[S]. 2013.


附录 A RunModel 完整枚举

枚举名中文标签所属模式
0Ordinary线形模式一
1HL合流模式二/三
2FL分流模式二/三
3FHL分合流模式二/三
4SubThreadSameWorkID同表单子线程模式二
5SubThreadUnSameWorkID异表单子线程模式三

附录 B 5×5 发送矩阵方法对照表

当前\目标Ordinary(0)HL(1)FL(2)FHL(3)Same(4)UnSame(5)
Ordinary(0)NodeSend_11NodeSend_11NodeSend_11NodeSend_11禁止禁止
HL(1)NodeSend_31NodeSend_31NodeSend_31NodeSend_31禁止禁止
FL(2)NodeSend_11NodeSend_11NodeSend_11NodeSend_11NodeSend_24_SameSheetNodeSend_24_UnSameSheet
FHL(3)NodeSend_11NodeSend_11禁止NodeSend_11NodeSend_24_SameSheetNodeSend_24_UnSameSheet
Same(4)禁止NodeSend_53_SameSheet_To_HeLiu禁止NodeSend_53_SameSheet_To_HeLiuNodeSend_11禁止
UnSame(5)禁止NodeSend_53_UnSameSheet_To_HeLiu禁止NodeSend_53_UnSameSheet_To_HeLiu禁止NodeSend_11

附录 C ActionType 轨迹类型一览

枚举名中文所属操作
0Start发起启动
1Forward前进发送
2Return退回退回
3Shift移交移交
4UnShift撤销移交移交
5UnSend撤销发送撤销
6ForwardFL分流前进发送
7ForwardHL合流前进发送
8FlowOver流程结束发送
9CallChildenFlow调用子流程父子流程
10StartChildenFlow启动子流程父子流程
11SubThreadForward子线程前进发送
15Hungup挂起挂起
16UnHungup解除挂起挂起
18Press催办催办
19DeleteFlowByFlag逻辑删除删除
20UnDeleteFlowByFlag恢复删除删除
24AskforHelp加签加签
25ForwardAskfor加签转发加签
30HuiQian会签会签
31Adjust调整实例操作
201ReturnAndBackWay退回并原路返回退回

附录 D 关键数据表字段说明

WF_GenerWorkFlow

字段含义
WorkID主键,工作实例 ID
FID干流程 WorkID(分合流)
FK_Flow流程编号
FK_Node当前节点 ID
WFState流程状态
TodoEmps当前待办人员
PWorkID父流程 WorkID(父子流程)
PFlowNo父流程编号
AtPara扩展参数(ThreadCount 等)

WF_GenerWorkerList

字段含义
WorkID工作实例 ID
FID干流程 WorkID
FK_Node节点 ID
FK_Emp处理人工号
IsPass0=待办, 1=已办, -1=未到, 80=不可见

附录 E 前端设计器节点形状与 RunModel 映射表

RunModel形状 ID标签多边形类型
0userNodes[0]线性矩形
1userNodes[12]合流倒梯形
2userNodes[13]分流正梯形
3userNodes[14]分合流六角形
4userNodes[15]同表单平行四边形
5userNodes[16]异表单梯形
SubFlowNode(3)subFlowNodes[0]子流程六边形

附录 F 核心源码文件索引

分类文件路径核心类/方法
发送引擎CCFlow/Components/BP.WF/WF/WorkNode.csNodeSend(), NodeSend_Send_5_5()
退回引擎CCFlow/Components/BP.WF/WF/WorkReturn.csDoIt(), ExeReturn*()
撤销引擎CCFlow/Components/BP.WF/WF/WorkUnSend.csDoUnSend()
移交CCFlow/Components/BP.WF/WF/ShiftWork.csNode_Shift_ToEmp()
流程操作CCFlow/Components/BP.WF/WF/WorkFlow.csDoHungup(), DoDelete*
调整CCFlow/Components/BP.WF/WF/WorkReSend.csDoIt()
子流程CCFlow/Components/BP.WF/Template/SFlow/FrmSubFlow, SubFlowAuto
枚举CCFlow/Components/BP.WF/EnumLib.csRunModel, TodolistModel, ReturnRole
API 门面CCFlow/Components/BP.WF/Dev2Interface.cs全部对外 API
HTTP 入口CCFlow/Components/BP.WF/HttpHandler/WF_WorkOpt.cs全部操作 HTTP 接口
设计器Vue3/src/WF/Admin/FlowDesignerV2/index.vue, shapes/index.ts
运行态Vue3/src/WF/MyFlow.vue, MyFLDealThread.vue

附录 G 接收人规则 DeliveryWay 摘要

FindWorker.cs 根据节点 DeliveryWay 计算下一节点接收人,常用规则如下:

枚举名含义典型场景
0ByStation按角色部门经理审批
1ByDept按部门本部门全员
2BySQL按 SQL动态计算
4BySelected发送人选择自由选人
5ByPreviousNodeFormEmpsField表单字段主表人员字段
6ByPreviousNodeEmp与上一步相同退回重审
7ByStarter与发起人相同退回修改
ByDtlAsSubThreadEmps明细表行同表单分流按行分派

完整枚举见 EnumLib.cs 第 959 行起,共 30+ 种规则。

附录 H 阻塞模式 BlockModel 摘要

枚举名含义
0None不阻塞
1CurrNodeAll当前节点子线程未全部完成则阻塞
2SpecSubFlow按约定格式阻塞
3BySQLSQL 返回值 ≥1 则阻塞
4ByExp表达式阻塞
5SpecSubFlowNode指定子流程未到某节点则阻塞
6SameLevelSubFlow平级子流程未到某节点则阻塞

全文完


插图清单提醒(共 18 处,需作者自行绘制或截图):

图号位置内容建议素材
图1第 3.1 节CCFlow 工作流子系统分层架构图Visio / draw.io 四层框图
图2第 3.2 节汽车类比模型示意图汽车侧视图 + 标注箭头
图3第 3.3.3 节WorkID / FID / PWorkID 关系 ER 图ER 工具绘制
图4第 4.4 节线形流程拓扑与方向条件示意图FlowDesignerV2 截图
图5第 5.4.2 节同表单分合流时序图UML 时序图
图6第 6.3 节同表单 vs 异表单分合流对比图左右对比表 + 数据表示意
图7第 7.4 节父子流程生命周期状态图双状态机图
图8第 8.4 节四大模式组合示例图完整流程设计器截图
图9第 9.1 节节点通用操作与汽车类比对照图图标 + 操作名
图10第 9.7 节前加签与后加签流程对比图泳道图
图11第 10.1 节流程调整前后状态对比图调整前后节点高亮
图12第 11.2 节5×5 发送矩阵示意图矩阵表 + switch 伪代码
图13第 12.1 节多人处理规则示意图五种模式泳道图
图14第 13.2 节退回规则与可退节点计算流程图流程图
图15第 14.1 节采购申请案例流程图设计器 + 待办截图
图16第 14.2 节项目立项异表单分合流案例图ER 图 + 三表单截图
图17第 14.3 节合同审批父子流程案例图双泳道 + PWorkID 标注
图18第 14.4 节请假审批线形流程案例图线性图 + TodolistModel 标注

表清单提醒(文中已含 40+ 张表,投稿时可按期刊要求将核心表(表1 四大模式对比、表2 汽车类比、表3 5×5 矩阵、表4 通用操作总览)编号为正式表1–表4。)

代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制与早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
代码转载自:https://pan.quark.cn/s/46fd08fb879c 网管教程 从入门到精通软件篇 ★一。★详尽的xp修复控制台指令及其应用!!! 放入xp(2000)的光盘,安装时选择R,执行修复! Windows XP(涵盖 Windows 2000)的控制台指令是在系统遭遇某些意外状况时的一种极具效用的诊断、检测以及恢复系统功能的工具。笔者确实一直期望能够将这方面的指令进行归纳,此次由老范辛苦整理了这份极具价值的秘籍。 Bootcfg bootcfg 命令用于启动配置与故障恢复(对大多数计算机而言,即 boot.ini 文件)。 带有特定参数的 bootcfg 命令仅在运用故障恢复控制台时方可使用。能够在命令行界面下运用带有不同参数的 bootcfg 命令。 用法: bootcfg /default 设定默认引导选项。 bootcfg /add 向引导清单中增添 Windows 安装。 bootcfg /rebuild 重复整个 Windows 安装流程并让用户选择需添加的项目。 注意:运用 bootcfg /rebuild 之前,应先借助 bootcfg /copy 命令备份 boot.ini 文件。 bootcfg /scan 探查用于 Windows 安装的全部磁盘并展示结果。 注意:这些结果被静态存储,并用于当前会话。若在当前会话期间磁盘配置发生变动,为获取更新的探查结果,必须先重启计算机,然后再次探查磁盘。 bootcfg /list 列示引导清单中已有的项目。 bootcfg /disableredirect 在启动引导程序中禁用重定向。 bootcfg /redirect [ PortBaudRrate] |[ useBio...
代码下载链接: https://pan.quark.cn/s/fc524f791b68 AA制程,即Active Alignment,被理解为主动对准,是一种用于确定零部件装配中相对位置的方法。在摄像头封装阶段,涉及图像传感器、镜座、马达、镜头、线路板等多个部件的重复组装,而传统的封装设备如CSP及COB等,均是依据设备设定的参数进行零部件的移动装配,因而零部件的叠加误差会逐渐增大,最终在摄像头上表现为拍照最清晰的位置可能偏离画面中心、四边清晰度不均等现象。伴随智能手机和其他高端电子产品的普及,摄像头模组的性能正日益受到重视。高分辨率、卓越的低光表现以及稳定视频输出是现代用户所期望的。在摄像头模组的制造环节,各部件的精准定位对成像质量具有决定性作用。因此,一种名为“AA制程”(Active Alignment)的前沿技术被开发出来,成为摄像头精密对准的核心技术。 AA制程,即Active Alignment,是一种在摄像头封装过程中应用的主动对准方法。该方法在多个组件装配阶段发挥作用,涵盖图像传感器、镜座、马达、镜头和线路板等部件。传统的封装方式,例如CSP(Chip Scale Package)和COB(Chip On Board),依赖于设备预设的参数进行组装,但随着组件数量的增加,误差也会累积,最终影响摄像头的表现。例如在成像质量上可能出现中心位置偏移、四角清晰度不一致等问题。 AA制程技术的核心在于实时监测与主动调整。在组装过程中,它借助先进的检测设备持续监控半成品的状态,并根据实时信息对组装部件进行精确修正,从而显著降低装配误差。通过这种技术,能够确保摄像头模组中各组件的相对位置准确无误,从而使得最终的成像效果更加稳定,特别是在中心区域和四角的清晰度上...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驰骋低代码、工作流、表单引擎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值