表单引擎在应用系统中的位置与作用
一、概述:同一套引擎,四种社会身份
表单的本质是展示数据与采集数据。 这两件事决定了底层逻辑(控件、落库、校验、扩展),却不决定它挂在哪套应用上。
真正拉开差距的是:如何与应用挂在一起。
就像同一个人——在女儿面前是爸爸,在父亲面前是儿子,在妻子面前是丈夫,在岳父面前是女婿——驰骋表单引擎在不同宿主里扮演不同角色:
| 宿主应用 | 表单角色 | EntityType(代码) | 一句话 |
|---|---|---|---|
| 流程 | 流程表单 | SingleFrm = 0(库表单)+ 节点绑定 | 流程实例 ≈ 表单数据实例 |
| 实体 | 实体表单 | FrmEntityNoName = 5(主),FrmDict = 2 遗留 | 主数据对象的增删改查壳 |
| 单据 | 单据表单 | FrmBill = 1 | 流水业务单(报销、请假…) |
| 活动 | 活动表单 | FrmAsk = 4 / AskExam = 6 | 调查、问卷、投票、活动流程 |
权威枚举在 EnumLib.cs:
public enum EntityType
{
SingleFrm = 0, // 独立表单(流程库)
FrmBill = 1, // 单据
FrmDict = 2, // 实体(旧)
EntityTree = 3, // 实体树
FrmAsk = 4, // 调查问卷 / 活动
FrmEntityNoName = 5,// No+Name 实体
AskExam = 6, // 考卷量表
// ...
}
注意:
EntityType说的是业务宿主角色;FrmType(经典/开发者/章节/VSTO)说的是设计器形态。两者正交——请假单可以是「单据 + 经典设计器」,也可以是「流程节点表单 + 经典设计器」。
| 引擎能力 | 派生角色 | 绑定方式 |
|---|---|---|
| 展示 · 采集 | 流程表单 | 绑节点 · WorkID |
| 展示 · 采集 | 实体表单 | 菜单 · No/Name |
| 展示 · 采集 | 单据表单 | OID · GenerBill |
| 展示 · 采集 | 活动表单 | AskFrm · 分享采集 |
下文按四种场景,统一用「定义 / 描述 / 权限」三节展开。
二、与流程结合 — 流程表单
2.1 定义
表单与流程结合,成为流程表单:一个流程实例对应一套(或一棵)表单数据实例。 数据主键通常对齐 WorkID(也可按节点配置改用 FID / PWorkID 等,见 WF_FrmNode.WhoIsPK)。
库中的独立表单一般是 EntityType = SingleFrm (0),编号常以 Frm_ 开头;节点也可使用系统生成的 ND{NodeID} 节点表单。
2.2 描述:绑到节点上才参与运行
与流程一起工作 = 绑定到节点。
| 绑法 | 含义 | 配置落点 |
|---|---|---|
| 单表单节点 | 一个节点绑一张表单 | Node.FormType → 如 RefOneFrmTree;WF_FrmNode 一行 |
| 多表单 / 表单树 | 一个节点绑多张表单 | SheetTree 等;多行 WF_FrmNode |
| 节点缺省表单 | 用节点自带 Fool 表单 | FoolForm + ND{NodeID} |
| 嵌入 / 高代码 | SDK、自定义页、实体 TS | SelfForm / SDKForm / EntityTS |
关系表是 WF_FrmNode(FK_Node + FK_Frm + FrmSln + 启用规则…)。 设计入口:流程设计器 → 节点 → 表单方案(GPE_FrmSln.ts)。 运行入口:/#/WF/MyFlow、MyFlowGener、MyFlowTree、MyView 等。
产品里常用「车厢」比喻:表单是车厢,节点是车头——车厢可以先在库里造好,挂上节点才上路。
2.3 权限控制
节点与表单的读写方案,代码枚举 FrmSln(FrmNode.cs)对应大纲三种模式:
FrmSln | 产品说法 | 行为 |
|---|---|---|
0 Default | 默认可编辑 | 按节点/表单默认编辑逻辑 |
1 Readonly | 只读 | 整表只读;发送校验可跳过只读绑定 |
2 Self | 自定义权限 | 按节点+表单+字段覆盖(FrmField 等) |
此外还有:
FrmEnableRole:这张表单在本节点是否启用(始终 / 有数据 / 表达式 / 按组织角色…)。- 字段级方案:节点「表单权限」细配必填、可见、可写。
WhoExeIt:节点由谁执行(人/机器/过程)——与字段 ACL 不是同一层,不要混谈。
三、与实体结合 — 实体表单
3.1 定义
实体表单挂在主数据对象上:固定资产、合同台账、人员、项目…… 当前主类型是 EntityType = FrmEntityNoName (5)(No + Name 主键);旧版 FrmDict (2) 仍可见,产品正迁向 NoName。另有 EntityTree (3) 树形实体。
向导原文要点(GPN_NewFrm.FrmEntityNoName):
实体是管理对象……基础管理就是增、删、改、查;还包括流程管理、相关功能、方法管理。
3.2 描述:进菜单,不进节点
| 要点 | 代码/产品事实 |
|---|---|
| 不能绑到流程节点 | 向导明确:实体不能绑节点;单据与独立表单可以 |
| 宿主是菜单 / URL | SearchEntityNoName、MyEntityNoName、MyDictFrameWork 等 |
| 物理主键 | No(可配生成规则)、Name |
| 状态 | EntityState:-1 删除 / 0 初始化 / 1 草稿 / 2 编辑 / 3 归档 |
| 与流程的另一种关系 | 流程属性 GPE_FlowEntity(独立/多实例/单实例…)描述的是业务实体表与流程实例关系,不是把实体表单挂到 WF_FrmNode |
高代码轨道上,任意 EntityNoName + Search / EnOnly / Group,扮演的是同一社会角色(主数据表单),只是配置面在 EnMap 而非 EntityType=5。
创建:GPN_NewFrm → 实体 → 常见前缀 Entity_ → EntityType=5。
3.3 权限控制
| 层 | 机制 |
|---|---|
| 数据权限 | Frm_DBRole(列表、新建、删除、保存、归档、导入导出、字段可见…),入口在实体设计器的 DBRole 明细 |
| 记录状态 | EntityState 约束可操作动作(归档后通常只读) |
| 设计期 UAC | 实体类 HisUAC 管谁能进设计菜单 |
运行时以 DBRole + 记录状态 为主,没有流程节点那套 FrmSln。
四、与单据结合 — 单据表单
4.1 定义
单据表单挂在流水业务上:报销单、请假单、出差申请、出库单…… 类型 EntityType = FrmBill (1),主键 OID(语义接近流程的 WorkID)。 实例头登记在 Frm_GenerBill(单号 BillNo、标题 Title、状态 BillState、发起人 Starter…)。
4.2 描述:菜单为主,流程为选配
| 要点 | 说明 |
|---|---|
| 日常入口 | 菜单 → SearchBill / MyBill(FrmID=Bill_*) |
| 可绑流程节点 | 与实体相反;审核可走 BillCheckModel=ByFlowNo |
| 可从实体发起 | 实体方法/集合里批量或单笔拉起单据 |
| 系统字段 | BillNo、Title、BillState、Starter、RDT,以及父单冗余 PWorkID / PFrmID |
创建:GPN_NewFrm → 单据 → 前缀 Bill_ → EntityType=1。 Demo 常见如 Bill_JiaoFeiBill。
单据与流程表单的差别,不在「能不能画字段」,而在宿主与生命周期:单据先是一张可独立管理的流水单;需要审批链时,再挂流程或启用单据审核模式。
4.3 权限控制
Frm_DBRole:列表/记录级(相对实体,单据侧常见多一项 提交审核SubmitCheck)。BillCheckModel:不审核 / 固定审批人 / 自由·抢办·协作·队列 / SQL·API / 绑定流程(GPE_BillCheckModel.ts)。- 一旦绑了流程节点:该节点上仍可用
WF_FrmNode.FrmSln控制只读与自定义字段权限;流程引擎管流转,表单引擎管车厢读写。 - 事件钩子:
FrmBill_CheckStart/CheckOver等(OverrideFile/ExecEvent)。
五、与活动结合 — 活动表单
5.1 定义(先消歧)
这里的「活动」不是 BPMN 里的 Activity,也不是轨迹表里的 ActionType,而是 CCBill 产品线里的 AskFrm 活动子系统:调查、问卷、投票、活动申报、考卷,以及「流程活动」(AskFlow)。
| 子类 | EntityType | 典型用途 |
|---|---|---|
| 调查 / 问卷(AskBill) | FrmAsk = 4 | 信息采集、投票、报名 |
| 考卷量表(AskExam) | AskExam = 6 | 考试、测评 |
| 流程活动(AskFlow) | 极简流程 + 节点表单 | 订单/审批类活动;菜单 MenuModel=AskFrm |
向导标题即「新建活动(调查、问卷、流程活动)」(GPN_NewFrm.FrmAskDesc)。
5.2 描述:流水采集 + 可分享
与单据同构之处:
- 流水增删改查,实例进
Frm_GenerBill; - 字段同样有
BillNo/Title/BillState/Starter; - 可以被流程节点绑定,也可从实体侧发起。
与单据不同之处:
- 面向对外/对内采集(二维码、分享链接、
AskFrmUserType/AskFrmDBTime控制用户类型与可填次数); - 菜单与路由走 AskFrm 系:
SearchAskFrm、MyAskFrm、FrmAskQRCode、GenerList?EnName=GL_AskBill|…; - AskFlow 会生成专用极简流程(常设
IsCanStart=0,不当普通流程目录里的可发起项)。
创建:向导前缀 Ask_,或菜单创建 AskFrm_ → EntityType=4。
5.3 权限控制
| 层 | 机制 |
|---|---|
| DBRole | 与实体/单据同一套数据权限框架 |
| 填写人约束 | 如列表场景下非创建人只读;单次/多次填写策略 |
| 分享边界 | 内外用户、二维码入口、打开记录 OpenFrmAskRec / NewFrmAskRec |
| 绑流程后 | 节点 FrmSln + 流程权限;发送成功可回写活动明细状态(AskFrm 事件) |
六、四角色对照(选型速查)
| 流程表单 | 实体表单 | 单据表单 | 活动表单 | |
|---|---|---|---|---|
| EntityType | 0(库) | 5(主) | 1 | 4 / 6 |
| 实例键 | WorkID 等 | No | OID | OID |
| 实例登记 | 流程引擎 | 业务表自身 | Frm_GenerBill | Frm_GenerBill |
绑 WF_FrmNode | 是 | 否 | 是 | 是 |
| 主入口 | MyFlow / MyView | SearchEntityNoName | SearchBill / MyBill | SearchAskFrm / 分享 |
| 权限主轴 | FrmSln + 字段方案 | DBRole + EntityState | DBRole + BillCheckModel(+ 可选 FrmSln) | DBRole + 采集策略(+ 可选 FrmSln) |
| 典型例子 | 请假流程各节点页 | 车辆台账、合同台账 | 报销单、缴费单 | 满意度调查、活动报名 |
口诀:
- 要走审批链、跟 WorkID 一一对应 → 流程表单(或单据绑流程)。
- 要管一个长期存在的业务对象 → 实体表单。
- 要一张可独立列表的流水单 → 单据表单。
- 要对外采集、问卷考卷、活动申报 → 活动表单。
设计器(经典/开发者/章节/VSTO)在四种角色上都可以用——先定社会身份,再选造车厢的车间。
七、小结
- 表单引擎的底层只有两件事:展示与采集;换宿主,就换角色。
Sys_MapData.EntityType是角色身份证;FrmType是皮肤与车间。- 流程靠
WF_FrmNode+FrmSln;实体/单据/活动靠 菜单 + DBRole,单据与活动再叠加审核/采集策略。 - 实体不能绑节点;单据、活动、独立表单可以——这是代码里写死的产品边界,不是文案偏好。
附录:代码与文档索引
| 主题 | 路径 |
|---|---|
EntityType | CCFlow/Components/BP.En30/Sys/EnumLib.cs |
FrmSln / FrmNode | CCFlow/Components/BP.WF/Template/FrmNode.cs |
| 新建向导(四类说明) | Vue3/src/WF/Admin/FrmLogic/GPN_NewFrm.ts |
| 节点表单方案 | Vue3/src/WF/Admin/AttrNode/FrmSln/GPE_FrmSln.ts |
| 单据 / 实体 / 活动 | Vue3/src/CCFast/CCBill/FrmBill.ts、FrmEntityNoName/、AskFrm/ |
| 单据审核模式 | Vue3/src/CCFast/CCBill/GPE_BillCheckModel.ts |
| 数据权限 | Vue3/src/CCFast/CCBill/DBRole/GPN_DBRole.ts |
| 活动菜单 | Vue3/src/CCFast/GPM/CCMenu/GPN_Menu.ts(AskBill / AskExam / AskFlow) |
延伸阅读
- 《表单三要素:控件、数据与业务逻辑》:车厢里面装什么。
- 《驰骋五大表单设计器》:用哪种车间造车厢。
- 《表单引擎三大范式与驰骋双轨实现》:规则写在文件、库表还是实体上。
本文依据当前仓库枚举、FrmNode 与 CCBill 向导静态整理;菜单文案与路由以你部署的版本为准。
487



被折叠的 条评论
为什么被折叠?



