流程运行过程表结构说明(侧重时效考核)
本文结合
Vue3/src/WF/WorkOpt/OneWork(时间轴/轨迹页面)、后端实体定义(BP.WF)及运行逻辑,描述 CCFlow 流程运行期核心表结构,重点说明时效考核相关字段及其数据流转关系。源码参考:
CCFlow/Components/BP.WF/WF/GenerWorkFlow.csCCFlow/Components/BP.WF/WF/GenerWorkerList.csCCFlow/Components/BP.WF/WF/Track.csCCFlow/Components/BP.WF/Data/CH.csCCFlow/Components/BP.WF/Glo.cs(InitCH考核写入)Vue3/src/WF/WorkOpt/OneWork/TimeBase.vue
1. 总体架构
CCFlow 将流程运行数据分为多张职责明确的表,通过 WorkID 关联。与时效直接相关的层次如下:
| 层次 | 表名 | 职责(时效视角) |
|---|---|---|
| 流程实例 | WF_GenerWorkFlow | 记录流程级应完成时间、预警时间、整体待办状态 |
| 工作人员 | WF_GenerWorkerList | 记录每人每节点的接收时间、应完成时间、实际完成时间(运行期时效数据源) |
| 流程轨迹 | ND{FlowNo}Track | 记录每次动作的发生时间、耗时,为考核提供历史时间点 |
| 时效考核 | WF_CH | 节点处理完成后写入的考核结果表(绩效考核/统计的核心) |
| 节点计划 | WF_CHNode | 流转自定义/项目计划场景下的节点计划起止时间 |
2. 时效数据生命周期
2.1 时限计算(工作下达时)
节点发送(WorkNode.cs)时,根据节点考核方式 CHWay 计算应完成时间:
- 按节点限期:
TimeLimit(天)+TimeLimitHH(小时)+TimeLimitMM(分钟),经Glo.AddDayHoursSpan计算,可含节假日规则TWay。 - 按表单字段:读取节点表单指定日期字段作为
SDT。 - 按流转自定义计划:优先读取
WF_CHNode.EndDT作为应完成时间。 - 不考核:
SDT可写为"无"。
计算结果写入:
WF_GenerWorkerList.SDT/DTOfWarning(人员级)WF_GenerWorkFlow.SDTOfNode(当前节点级)- 流程级
SDTOfFlow/SDTOfFlowWarning(由流程DeadLineRole配置)
2.2 运行期展示(OneWork 时间轴)
TimeBase_Init(WF_WorkOpt_OneWork.cs)聚合返回:
| 数据集 | 来源表 | 时效用途 |
|---|---|---|
| Track 轨迹 | ND{FlowNo}Track | 已完成节点的 RDT、动作耗时 |
| 流程实例 | WF_GenerWorkFlow | 流程当前状态、节点应完成时间 |
| 待办人员 | WF_GenerWorkerList | 当前处理人的 RDT、SDT、超时/剩余时间 |
前端 TimeBase.vue 对进行中待办实时计算:
- 耗时
PassTime= 当前时间 −RDT - 还剩余 / 已超时 = 当前时间与
SDT比较
2.3 考核落库(节点发送成功后)
Glo.InitCH 在节点处理完成、流程发送时触发(WorkNode.cs 多处调用),将本次节点时效写入 WF_CH:
| 输入来源 | 对应字段 |
|---|---|
GenerWorkerList.RDT | DTFrom(任务下达时间) |
| 当前时间 | DTTo(任务处理时间) |
GenerWorkerList.SDT | SDT(应完成日期) |
上一轨迹 NDxxTrack.RDT | 推算发送人、上一节点时间 |
节点配置 TimeLimit | TimeLimit(规定限期) |
考核结论:
CHSta = 0(按期)或1(逾期)OverDays/OverMinutes:逾期量Points:逾期扣分(OverDays × 节点TCent)
3. WF_CH — 时效考核表(核心)
表名:WF_CH
实体类:BP.WF.Data.CH / Vue3/src/WF/WorkOpt/CH.ts
主键:MyPK,默认规则 {NodeID}_{WorkID}_{FID}_{EmpNo}
3.1 标识与关联
| 字段 | 类型 | 说明 |
|---|---|---|
| MyPK | string | 主键,格式一般为 节点ID_WorkID_FID_人员编号 |
| WorkID | int | 流程工作 ID,关联实例 |
| FID | int | 父流程 ID(子线程/分流场景,无则为 0) |
| Title | string | 流程标题 |
| FlowNo | string | 流程编号 |
| FlowNoT | string | 流程名称 |
| NodeID | int | 被考核节点 ID |
| NodeIDT | string | 被考核节点名称 |
| OrgNo | string | 组织编号(集团/多组织模式) |
3.2 人员与部门
| 字段 | 类型 | 说明 |
|---|---|---|
| EmpNo | string | 当事人(实际处理人)编号 |
| EmpNoT | string | 当事人名称 |
| Sender | string | 上一节点发送人编号 |
| SenderT | string | 上一节点发送人名称 |
| GroupEmps | string | 相关当事人 ID 集合,格式 ,emp1,emp2, |
| GroupEmpsNames | string | 相关当事人名称集合,格式 编号,姓名; |
| GroupEmpsNum | int | 相关当事人数量 |
| DeptNo | string | 当事人隶属部门编号 |
| DeptNoT | string | 部门名称 |
3.3 时间字段(考核核心)
| 字段 | 类型 | 说明 |
|---|---|---|
| DTFrom | string | 任务下达时间,取自 WF_GenerWorkerList.RDT |
| DTTo | string | 任务处理完成时间,写入考核时的当前时间 |
| SDT | string | 应完成日期,取自 WF_GenerWorkerList.SDT;无时限时为 "无" |
| TimeLimit | string | 节点配置的规定限期(天),来自节点 TimeLimit |
| FK_NY | string | 隶属月份,格式 yyyy-MM,用于月度统计 |
| WeekNum | int | 任务完成所在周次(周一为一周起始) |
3.4 考核计算结果
| 字段 | 类型 | 说明 |
|---|---|---|
| DTSWay | int | 考核方式:0=不考核,1=按时效考核,2=按工作量考核 |
| UseDays | float | 实际使用天数(DTTo − DTFrom 的天数部分) |
| UseMinutes | float | 实际使用分钟数(时间差分钟部分) |
| OverDays | float | 逾期天数(DTTo 超出 SDT 的天数) |
| OverMinutes | float | 逾期分钟数 |
| CHSta | int | 考核状态:0=按期完成(AnQi),1=逾期完成(YuQi) |
| Points | float | 逾期扣分,按期为 0;逾期为 OverDays × 节点TCent |
3.5 典型查询示例
-- 某员工某月逾期节点统计
SELECT NodeIDT, COUNT(*) AS cnt, SUM(OverDays) AS total_over_days
FROM WF_CH
WHERE EmpNo = 'zhangsan' AND FK_NY = '2026-06' AND CHSta = 1
GROUP BY NodeIDT;
-- 某流程实例全节点考核明细
SELECT NodeIDT, EmpNoT, DTFrom, SDT, DTTo, CHSta, OverDays, Points
FROM WF_CH
WHERE WorkID = 123456
ORDER BY DTFrom;
4. WF_GenerWorkFlow — 流程实例表
表名:WF_GenerWorkFlow
主键:WorkID
定位:一条记录 = 一个流程实例的运行摘要。
4.1 全表字段
| 字段 | 类型 | 说明 |
|---|---|---|
| WorkID | int | 主键,流程实例唯一标识 |
| FID | int | 父流程实例 ID(子流程/分流) |
| FK_FlowSort | string | 流程类别编号 |
| SysType | string | 系统类别 |
| FK_Flow | string | 流程编号 |
| FlowName | string | 流程名称 |
| SortPath | string | 目录路径 |
| Title | string | 流程标题 |
| WFSta | int | 概要状态 |
| WFState | int | 详细状态:0空白 1草稿 2运行中 3已完成 4挂起 5退回 |
| Starter | string | 发起人编号 |
| StarterName | string | 发起人名称 |
| Sender | string | 最后发送人 |
| RDT | datetime | 流程发起/记录日期 |
| HungupTime | string | 挂起日期 |
| SendDT | datetime | 流程最后活动时间 |
| FK_Node | int | 当前停留节点 ID |
| NodeName | string | 当前节点名称 |
| FK_Dept | string | 发起人部门编号 |
| DeptName | string | 发起人部门名称 |
| PRI | int | 优先级 |
| SDTOfNode | datetime | 当前节点应完成时间(时效关键) |
| SDTOfFlow | datetime | 流程整体应完成时间(时效关键) |
| SDTOfFlowWarning | datetime | 流程预警时间(时效关键) |
| PFlowNo | string | 父流程编号 |
| PWorkID | int | 父流程 WorkID |
| PNodeID | int | 父流程调用节点 |
| PFID | int | 父流程 FID |
| PEmp | string | 子流程调用人 |
| GuestNo | string | 外部客户编号 |
| GuestName | string | 外部客户名称 |
| BillNo | string | 单据编号 |
| TodoEmps | string | 当前待办人员,格式 编号,姓名; |
| TodoEmpsNum | int | 待办人员数量 |
| TaskSta | int | 任务池共享状态 |
| AtPara | string | 扩展参数(键值对) |
| Emps | string | 参与人列表 |
| GUID | string | 全局唯一标识 |
| FK_NY | string | 年月 |
| WeekNum | int | 周次 |
| TSpan | int | 时间间隔标记 |
| TodoSta | int | 待办时效状态(时效关键) |
| DomainExt | string | 域/系统编号 |
| PrjNo | string | 项目编号 |
| PrjName | string | 项目名称 |
| OrgNo | string | 组织编号 |
| FlowNote | string | 流程备注/签批意见 |
4.2 时效相关字段详解
| 字段 | 枚举/规则 | 说明 |
|---|---|---|
| SDTOfNode | — | 当前节点所有待办人员的应完成时间上限;节点发送时按节点限期计算并更新 |
| SDTOfFlow | — | 流程级完成时限,由流程属性 DeadLineRole 配置(可不计算/不计算节假日/计算节假日) |
| SDTOfFlowWarning | — | 流程预警时间点,用于催办/预警提醒 |
| TodoSta | 0 待办中 | 当前时间未达预警线 |
| TodoSta | 1 预警中 | 进入预警区间 |
| TodoSta | 2 逾期中 | 已超过应完成时间且未完成 |
| TodoSta | 3 按期完成 | 流程在时限内结束 |
| TodoSta | 4 逾期完成 | 流程超时后结束 |
| HungupTime | — | 挂起期间通常不计入工作时(挂起逻辑单独处理) |
5. WF_GenerWorkerList — 工作人员表
表名:WF_GenerWorkerList(注意大小写:WorkerList)
复合主键:WorkID + FK_Emp + FK_Node
定位:待办/已办/会签的任务明细,是运行期时效计算与 WF_CH 写入的直接数据源。
5.1 全表字段
| 字段 | 类型 | 说明 |
|---|---|---|
| WorkID | int | 主键之一,流程实例 ID |
| FK_Emp | string | 主键之一,处理人编号 |
| FK_Node | int | 主键之一,节点 ID |
| FID | int | 父流程 ID |
| EmpName | string | 处理人名称 |
| NodeName | string | 节点名称 |
| FK_Flow | string | 流程编号 |
| StaNo | string | 岗位编号 |
| FK_Dept | string | 处理人部门编号 |
| SDT | datetime | 应完成日期(时效核心) |
| DTOfWarning | datetime | 预警日期 |
| RDT | datetime | 记录时间/接受工作日期(时效起点) |
| CDT | datetime | 实际完成时间 |
| IsEnable | int | 是否有效:1 有效,0 撤回/跳转后失效 |
| IsRead | int | 是否已读:0 未读,1 已读 |
| IsPass | int | 是否已处理:0 待办,1 已办,其他值表示特殊状态 |
| WhoExeIt | int | 执行方式:0 人工,1 机器,2 混合 |
| Sender | string | 发送人(格式 编号,姓名) |
| PRI | int | 优先级 |
| DTOfHungup | datetime | 挂起时间 |
| DTOfUnHungup | datetime | 预计解除挂起时间 |
| GuestNo | string | 外部用户编号 |
| GuestName | string | 外部用户名称 |
| Idx | int | 顺序号(队列/会签排序) |
| AtPara | string | 扩展参数(含 IsHuiQian、PressTimes 催办次数等) |
5.2 时效字段关系
RDT(接收) ──────────────────────────────► CDT(完成)
│ │
│ ┌── DTOfWarning(预警线) │
│ │ │
└─────────┼── SDT(应完成) ──► 对比 ──► 是否逾期
│ │
└────────────────────────────────────┘
↓ 节点发送成功后
WF_CH 记录考核结果
| 场景 | 判断逻辑 |
|---|---|
| 进行中(OneWork 时间轴) | now > SDT → 已超时;否则 → 还剩余 |
| 已完成(写入 WF_CH) | DTTo > SDT → CHSta=1 逾期;否则 → CHSta=0 按期 |
| 无时限 | SDT = '无',前端显示剩余时间为"无",考核默认按期 |
6. ND{FlowNo}Track — 流程轨迹表
表名规则:ND + 流程编号 + Track,例如流程 001 对应 ND1Track,流程 036 对应 ND36Track。
创建方式:Track.CreateOrRepairTrackTable(flowNo) 由模板表 WF_Track 复制重命名。
主键:MyPK(雪花 ID / bigint)
6.1 全表字段
| 字段 | 类型 | 说明 |
|---|---|---|
| MyPK | bigint | 主键 |
| ActionType | int | 动作类型(发起、发送、退回、移交等,见 ActionType 枚举) |
| ActionTypeText | string | 动作类型名称 |
| FID | int | 父流程 ID |
| WorkID | int | 工作 ID |
| NDFrom | int | 发送节点 ID |
| NDFromT | string | 发送节点名称 |
| NDTo | int | 到达节点 ID |
| NDToT | string | 到达节点名称 |
| EmpFrom | string | 发送人编号 |
| EmpFromT | string | 发送人名称 |
| EmpTo | string | 接收人编号(多人逗号分隔) |
| EmpToT | string | 接收人名称 |
| RDT | string | 记录时间/动作发生时间(时效关键) |
| ToDT | string | 到达时间 |
| WorkTimeSpan | float | 本步处理时长(小时) |
| Msg | text | 处理意见/消息 |
| NodeData | text | 节点数据日志 |
| Tag | string | 扩展参数(子流程、父流程关联信息等) |
| Exer | string | 实际执行人(含授权人信息) |
| FrmDB | text | 表单快照(部分动作写入) |
| WriteDB | text | 审核组件数据(部分动作写入) |
6.2 时效相关用途
| 用途 | 说明 |
|---|---|
| 历史时间线 | OneWork TimeBase.vue / Track.vue 展示已完成节点及 RDT |
| 考核辅助 | InitCH 通过 Flow_GetPreviousNodeTrack 获取上一节点 RDT、EmpFrom 作为 DTFrom 推算依据 |
| 耗时统计 | WorkTimeSpan 记录该步动作耗时(小时),可用于轨迹级分析 |
| 流程总耗时 | 结合首条 Start 轨迹 RDT 与结束时间,写入报表 FlowDaySpan |
6.3 常用 ActionType(时效展示相关)
| 值 | 含义 | 时效说明 |
|---|---|---|
| 0 | Start | 流程起点,RDT 为流程开始时间 |
| 1 | Forward | 正常发送,触发下一节点 SDT 计算 |
| 2 | Return | 退回,可能影响计划时间重算 |
| 5 | Shift | 移交,工作人员变更但 WorkID 不变 |
| 8 | Hungup | 挂起,暂停计时 |
| 9 | UnHungup | 解除挂起 |
7. WF_CHNode — 节点时限计划表(辅助)
表名:WF_CHNode
用途:流转自定义、项目计划等场景,为节点预设计划起止时间;发送时若存在记录,优先用 EndDT 作为应完成时间。
| 字段 | 类型 | 说明 |
|---|---|---|
| MyPK | string | 主键,规则 {WorkID}_{FK_Node} |
| WorkID | int | 流程实例 ID |
| FK_Node | int | 节点 ID |
| NodeName | string | 节点名称 |
| EmpNo | string | 处理人编号 |
| EmpNoT | string | 处理人名称 |
| StartDT | string | 计划开始时间 |
| EndDT | string | 计划结束时间(优先作为 SDT 来源) |
| GT | int | 工天 |
| Scale | float | 阶段占比 |
| TotalScale | float | 总进度 |
| ChanZhi | float | 产值 |
| AtPara | string | 扩展参数 |
8. 表间关联与 OneWork 数据流
8.1 关联键
| 关联 | 条件 |
|---|---|
| 实例 ↔ 待办 | WF_GenerWorkFlow.WorkID = WF_GenerWorkerList.WorkID |
| 实例 ↔ 轨迹 | WF_GenerWorkFlow.WorkID = NDxxTrack.WorkID |
| 实例 ↔ 考核 | WF_GenerWorkFlow.WorkID = WF_CH.WorkID |
| 待办 ↔ 考核 | WorkID + FK_Node/NodeID + FK_Emp/EmpNo |
8.2 TimeBase_Init 返回结构
| DataSet 表名 | 物理表 | 时效字段 |
|---|---|---|
| (默认表名) | ND{FlowNo}Track | RDT, WorkTimeSpan |
| WF_GenerWorkFlow | WF_GenerWorkFlow | SDTOfNode, SDTOfFlow, TodoSta |
| WF_GenerWorkerList | WF_GenerWorkerList | RDT, SDT, CDT, DTOfWarning |
| WF_Node | WF_Node | 节点配置(TimeLimit 等) |
8.3 前端时效展示映射(TimeBase.vue)
| 界面展示 | 数据来源 | 计算方式 |
|---|---|---|
| 接收时间 | GWL.RDT | 直接显示 |
| 应完成时间 | GWL.SDT | 直接显示;无 表示不限时 |
| 耗时 | — | now - RDT,格式化为天/时/分/秒 |
| 还剩余 / 已超时 | GWL.SDT | now 与 SDT 比较 |
| 已办节点时间 | Track.RDT | 轨迹记录时间 |
9. 配置项与表字段对照
9.1 节点级(WF_Node 模板参数)
| 配置项 | 存储位置 | 影响表字段 |
|---|---|---|
| 考核方式 CHWay | 节点属性 | WF_CH.DTSWay;None 时不写考核 |
| 限期 TimeLimit / TimeLimitHH / TimeLimitMM | 节点 Para | WF_GenerWorkerList.SDT,WF_CH.TimeLimit |
| 节假日规则 TWay | 节点属性 | SDT 计算方式 |
| 预警天数 WarningDay | 节点属性 | WF_GenerWorkerList.DTOfWarning |
| 逾期扣分 TCent | 节点属性 | WF_CH.Points |
| 按表单字段限期 | 节点 Para | SDT 取自业务表单字段 |
9.2 流程级(WF_Flow 模板属性)
| 配置项 | 说明 | 影响表字段 |
|---|---|---|
| DeadLineRole | 流程完成时限规则 | WF_GenerWorkFlow.SDTOfFlow |
| DeadLineRole 预警 | 流程预警设置 | WF_GenerWorkFlow.SDTOfFlowWarning |
10. 附录:枚举速查
CHSta(WF_CH.CHSta)
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | AnQi | 按期完成 |
| 1 | YuQi | 逾期完成 |
CHWay(节点考核方式 / WF_CH.DTSWay)
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | None | 不考核 |
| 1 | ByTime | 按时效考核(写入 WF_CH) |
| 2 | ByWorkNum | 按工作量考核 |
| 3 | IsQuality | 质量考核(数据在 WF_CHEval,非本文范围) |
TodoSta(WF_GenerWorkFlow.TodoSta)
| 值 | 说明 |
|---|---|
| 0 | 待办中 |
| 1 | 预警中 |
| 2 | 逾期中 |
| 3 | 按期完成 |
| 4 | 逾期完成 |
GenerWorkerList.IsPass
| 值 | 说明 |
|---|---|
| 0 | 待办 |
| 1 | 已办 |
| 90 | 会签中间状态(特殊场景) |
11. 总结
| 需求场景 | 推荐查表 |
|---|---|
| 当前谁超时、还剩多久 | WF_GenerWorkerList(SDT/RDT)+ OneWork 时间轴 |
| 流程是否整体逾期 | WF_GenerWorkFlow(SDTOfFlow、TodoSta) |
| 历史处理了多久 | NDxxTrack(RDT、WorkTimeSpan) |
| 绩效考核、月度统计、扣分 | WF_CH(核心考核结果表) |
| 项目计划节点排期 | WF_CHNode(StartDT/EndDT) |
关键结论:运行期时效的"源头"在 WF_GenerWorkerList 与 WF_GenerWorkFlow;轨迹表 NDxxTrack 提供审计时间线;节点处理完成后,Glo.InitCH 将时效结果固化到 WF_CH,这是时效考核统计与绩效分析的标准数据源。
12. 时效考核二次开发指南
本章说明如何基于上述表结构,在不改动引擎核心逻辑或适度扩展引擎的前提下,实现企业自定义的时效监控、统计、扣分与报表。
12.1 二次开发场景分类
| 场景类型 | 典型需求 | 主要数据源 | 开发难度 |
|---|---|---|---|
| A. 只读统计 | 部门/人员月度逾期率、节点平均耗时大屏 | WF_CH | 低(SQL/报表) |
| B. 运行期监控 | 待办超时预警、领导看板、催办触发 | WF_GenerWorkerList + WF_GenerWorkFlow | 低~中 |
| C. 时限调整 | 运行中修改节点/流程计划完成时间 | WF_CHNode + CH_Save 接口 | 中 |
| D. 扣分规则定制 | 按职级/节点类型/节假日差异化扣分 | 扩展 Glo.InitCH 或后处理 WF_CH | 中~高 |
| E. 完全自定义考核 | 跨系统汇总、复杂工时算法 | 自建考核表 + 事件钩子写数 | 高 |
原则:运行中看 GWL/GWF,历史考核看 WF_CH;不要混用——WF_CH 仅在节点发送成功后写入,不能代替实时待办查询。
12.2 开发路径选型
12.3 场景 A:考核统计与报表(推荐首选)
WF_CH 是已固化的考核结果,适合做 BI、大屏、Excel 导出,无需重复计算时限。
12.3.1 常用统计 SQL
-- ① 按部门统计当月逾期率
SELECT DeptNoT,
COUNT(*) AS total_cnt,
SUM(CASE WHEN CHSta = 1 THEN 1 ELSE 0 END) AS overdue_cnt,
ROUND(SUM(CASE WHEN CHSta = 1 THEN 1.0 ELSE 0 END) / COUNT(*) * 100, 2) AS overdue_rate
FROM WF_CH
WHERE FK_NY = '2026-06'
GROUP BY DeptNoT;
-- ② 按人员统计扣分汇总
SELECT EmpNo, EmpNoT,
SUM(Points) AS total_points,
SUM(OverDays) AS total_over_days
FROM WF_CH
WHERE FK_NY = '2026-06' AND CHSta = 1
GROUP BY EmpNo, EmpNoT
ORDER BY total_points DESC;
-- ③ 节点平均处理时长(天)
SELECT NodeIDT,
AVG(UseDays) AS avg_use_days,
AVG(OverDays) AS avg_over_days,
COUNT(*) AS cnt
FROM WF_CH
WHERE FlowNo = '001' AND DTSWay = 1
GROUP BY NodeIDT;
-- ④ 关联流程实例,查逾期流程明细
SELECT ch.WorkID, ch.Title, ch.NodeIDT, ch.EmpNoT,
ch.DTFrom, ch.SDT, ch.DTTo, ch.OverDays, ch.Points,
gwf.WFState, gwf.TodoSta
FROM WF_CH ch
INNER JOIN WF_GenerWorkFlow gwf ON ch.WorkID = gwf.WorkID
WHERE ch.CHSta = 1 AND ch.FK_NY = '2026-06';
12.3.2 平台内置扩展点
系统已在数据大屏 SQL 工厂中预留 WF_CH 查询标记(SQLFlow.cs):
| Mark | 用途 |
|---|---|
Flow_DataV_OneFlowAdmin_Average | 按节点统计 WF_CH 记录数 |
二次开发做法:在 BP.WF.Data.DA.SQLFlow 中仿照上述 case 新增 Mark,供 DataV 大屏或自定义页面绑定。
12.3.3 前端实体查询
Vue3 已封装 CH 实体(Vue3/src/WF/WorkOpt/CH.ts),可通过低代码/实体列表直接配置查询页:
import { CH, CHs } from '/@/WF/WorkOpt/CH';
// 按月份检索某员工考核记录
const chs = new CHs();
await chs.Retrieve('FK_NY', '2026-06', 'EmpNo', 'zhangsan');
12.4 场景 B:运行期超时监控与预警
进行中的流程尚未写入 WF_CH,需查运行表。
12.4.1 查询当前超时待办
-- 已超时且未处理的待办(人员级)
SELECT gwl.WorkID, gwl.FK_Flow, gwl.FK_Node, gwl.NodeName,
gwl.FK_Emp, gwl.EmpName, gwl.RDT, gwl.SDT,
gwf.Title, gwf.StarterName
FROM WF_GenerWorkerList gwl
INNER JOIN WF_GenerWorkFlow gwf ON gwl.WorkID = gwf.WorkID
WHERE gwl.IsPass = 0
AND gwl.IsEnable = 1
AND gwl.SDT IS NOT NULL
AND gwl.SDT <> '无'
AND gwl.SDT < GETDATE(); -- MySQL 用 NOW(),Oracle 用 SYSDATE
-- 流程级逾期(整体时限)
SELECT WorkID, Title, FK_Flow, NodeName, TodoEmps, SDTOfFlow, TodoSta
FROM WF_GenerWorkFlow
WHERE WFState IN (2, 4, 5) -- 运行中/挂起/退回
AND TodoSta = 2; -- 逾期中
12.4.2 预警区间(未超时但进入预警)
SELECT gwl.*, gwf.Title
FROM WF_GenerWorkerList gwl
INNER JOIN WF_GenerWorkFlow gwf ON gwl.WorkID = gwf.WorkID
WHERE gwl.IsPass = 0
AND gwl.DTOfWarning IS NOT NULL
AND gwl.DTOfWarning <= GETDATE()
AND gwl.SDT > GETDATE();
12.4.3 定时任务触发催办/通知
可编写 DTS 定时任务(参考 BP.WF.DTS 包),轮询上述 SQL,对超时记录调用:
// 催办 API
BP.WF.Dev2Interface.Flow_DoPress(workID, "系统自动催办:已超时", true);
催办次数记录在 GenerWorkerList.AtPara 的 PressTimes 中,便于二次统计。
12.4.4 前端实时计算参考
OneWork 时间轴(TimeBase.vue)的超时展示逻辑可直接复用到自定义看板:
| 变量 | 计算 |
|---|---|
PassTime | now - RDT |
OverTimeLab | SDT 为空或 "无" → 不限时;否则 now > SDT → 已超时 |
OverTime | 与 SDT 的时间差,格式化为天/时/分 |
12.5 场景 C:运行中调整计划时限
12.5.1 流程级:修改整体完成时间
接口:
BP.WF.Dev2Interface.Flow_SetSDTOfFlow(workid, "2026-07-01 18:00:00");
等效 SQL:UPDATE WF_GenerWorkFlow SET SDTOfFlow=... WHERE WorkID=...
前端入口:Vue3/src/WF/WorkOpt/CH.vue(节点时限/流程时限页面),调用 WF_WorkOpt.CH_Init / CH_Save。
12.5.2 节点级:流转自定义计划
| 步骤 | 说明 |
|---|---|
| 1 | 用户打开 CH.vue,加载 CH_Init 返回的 WF_CHNode |
| 2 | 编辑各节点 StartDT / EndDT / GT(工天) |
| 3 | 调用 CH_Save 写入 WF_CHNode |
| 4 | 下次节点发送时,WorkNode.cs 优先读取 CHNode.EndDT 作为 SDT |
注意:已发送过的节点,CH_Init 会用 GenerWorkerList 的实际 RDT/CDT 回填,未来节点才允许编辑计划时间。
12.5.3 直接修改待办人员 SDT(慎用)
UPDATE WF_GenerWorkerList
SET SDT = '2026-06-30 17:00:00'
WHERE WorkID = 123456 AND FK_Node = 502 AND FK_Emp = 'zhangsan';
同时建议更新 WF_GenerWorkFlow.SDTOfNode,保持实例级与人员级一致。此方式绕过界面,适合接口集成,但需自行保证业务合规。
12.6 场景 D:自定义扣分与考核算法
12.6.1 引擎默认算法(Glo.InitCH2017)
| 步骤 | 逻辑 |
|---|---|
| 取时段 | DTFrom = GWL.RDT,DTTo = 当前时间 |
| 取限期 | SDT = GWL.SDT |
| 算逾期 | OverDays = (DTTo − SDT) 天数;OverMinutes 同理 |
| 定期/逾期 | DTTo <= SDT → CHSta=0;否则 CHSta=1 |
| 算扣分 | Points = OverDays × Node.TCent(节点模板"扣分"配置) |
12.6.2 扩展方式一:修改 Glo.InitCH(引擎层)
在 CCFlow/Components/BP.WF/Glo.cs 的 InitCH2017 方法中,#region 求计算属性 之后、ch.DirectInsert() 之前插入自定义逻辑,例如:
// 示例:逾期不足 0.5 天不算逾期
if (ch.OverDays < 0.5f) {
ch.CHSta = CHSta.AnQi;
ch.Points = 0;
}
// 示例:按职级倍率扣分(需自行查 Port_Emp 扩展字段)
// ch.Points = ch.OverDays * nd.TCent * GetEmpRate(WebUser.No);
优点:与发送同步,数据一致。
缺点:升级引擎时需合并代码。
12.6.3 扩展方式二:SendSuccess 事件后处理(推荐)
在节点属性中配置 发送成功事件(EventListNode.SendSuccess),编写业务类:
// 伪代码:发送成功后修正 WF_CH
public string SendSuccess(Node nd, Work wk) {
string mypk = nd.NodeID + "_" + wk.OID + "_0_" + BP.Web.WebUser.No;
CH ch = new CH(mypk);
if (ch.RetrieveFromDBSources() == 0) return "";
// 自定义扣分
if (ch.CHSta == CHSta.YuQi) {
ch.Points = CalcCustomPoints(ch);
ch.Update();
}
return "";
}
优点:不修改引擎核心,便于项目级维护。
注意:InitCH 先执行,事件在其后触发,适合做修正而非替代。
12.6.4 扩展方式三:扩展 WF_CH 表字段
- 数据库
ALTER TABLE WF_CH ADD MyScore FLOAT; - 在
CH.cs/CH.ts的EnMap中map.AddTBFloat(...)注册字段; - 在
InitCH或 SendSuccess 事件中写入自定义分值。
索引建议(CreateIndex.cs 已有):WorkID、WorkID+EmpNo;按月统计可加 FK_NY 组合索引。
12.6.5 扩展方式四:自建考核汇总表
适合与 HR/绩效系统对接:
CREATE TABLE My_CH_Summary (
MyPK VARCHAR(50) PRIMARY KEY,
EmpNo VARCHAR(50),
FK_NY VARCHAR(10),
TotalPoints FLOAT,
OverdueCnt INT,
RDT DATETIME
);
在 SendSuccess 或定时 DTS 中,从 WF_CH 聚合写入。保留 WF_CH 明细,汇总表供外部系统读取。
12.7 场景 E:与轨迹表联合分析
当需要分析每一步动作耗时(不仅是节点考核),关联 NDxxTrack:
-- 流程 001 某实例各步骤耗时
SELECT NDFromT, ActionTypeText, EmpFromT, RDT, WorkTimeSpan, Msg
FROM ND1Track
WHERE WorkID = 123456
ORDER BY RDT;
-- 从轨迹重建考核(管理员工具,见 GenerCH DTS)
-- 遍历 NDxxTrack 中 Forward 类动作,逐条调用 Glo.InitCH
-- 入口:管理工具 → 考核数据 → GenerCH
适用:修改节点考核配置后,对历史数据批量重算。
警告:GenerCH.Do() 会先 DELETE FROM WF_CH,生产环境务必先备份。
12.8 后端 API 速查
| 接口/方法 | 位置 | 用途 |
|---|---|---|
Glo.InitCH(...) | Glo.cs | 写入/更新 WF_CH(引擎内部调用) |
CH_Init | WF_WorkOpt.cs | 加载时限调整页数据(GWL/GWF/CHNode) |
CH_Save | WF_WorkOpt.cs | 保存 WF_CHNode 与 SDTOfFlow |
Flow_SetSDTOfFlow | Dev2Interface.cs | 设置流程应完成时间 |
DB_GenerTrackTable | Dev2Interface.cs | 获取 NDxxTrack 数据 |
TimeBase_Init | WF_WorkOpt_OneWork.cs | OneWork 时间轴数据聚合 |
Flow_DoPress | Dev2Interface.cs | 催办 |
GenerCH | DTS/GenerCH.cs | 历史考核数据重建(管理员) |
HttpHandler 调用示例(前端):
import HttpHandler from '/@/utils/gener/HttpHandler';
const handler = new HttpHandler('BP.WF.HttpHandler.WF_WorkOpt');
handler.AddPara('WorkID', workID);
handler.AddPara('FK_Flow', flowNo);
const data = await handler.DoMethodReturnString('CH_Init');
12.9 前端二次开发入口
| 文件 | 扩展方向 |
|---|---|
Vue3/src/WF/WorkOpt/CH.vue | 节点/流程时限调整 UI,可增列、校验规则 |
Vue3/src/WF/WorkOpt/CH.ts | WF_CH 实体,低代码列表/查询页 |
Vue3/src/WF/WorkOpt/OneWork/TimeBase.vue | 时间轴超时展示样式、额外统计卡片 |
Vue3/src/WF/Admin/AttrNode/GPE_NodeCheckStandard.ts | 节点考核标准配置说明 |
Vue3/src/WF/Admin/AttrFlow/DeadLineRole/GPE_DeadLineRole.ts | 流程完成时限配置 |
自定义考核报表页推荐做法:
- 新建 Vue 页面,通过
CHs实体或自定义 HttpHandler 查询WF_CH; - 筛选条件:
FK_NY、FlowNo、DeptNo、EmpNo、CHSta; - 图表:按
NodeIDT分组统计OverDays/Points。
12.10 节点/流程配置清单(实施前检查)
二次开发前,需在设计期正确配置模板,否则 WF_CH 无数据或 SDT 为"无":
| 配置位置 | 配置项 | 影响 |
|---|---|---|
| 节点属性 | CHWay = 按时效考核 | 是否写入 WF_CH、是否计算 SDT |
| 节点属性 | TimeLimit / TimeLimitHH / TimeLimitMM | GWL.SDT、WF_CH.TimeLimit |
| 节点属性 | TWay(节假日规则) | SDT 计算是否跳过节假日 |
| 节点属性 | WarningDay | GWL.DTOfWarning |
| 节点属性 | TCent(扣分) | WF_CH.Points |
| 节点属性 | CHWayOfTimeRole | 按天限时 / 按表单字段限时 |
| 流程属性 | DeadLineRole | GWF.SDTOfFlow / TodoSta |
| 运行期 | CH.vue 调整 WF_CHNode | 自定义节点计划 EndDT |
12.11 注意事项与最佳实践
| topic | 说明 |
|---|---|
| 退回 | 退回时 WorkReturn.cs 也会调用 InitCH,可能产生退回考核记录;撤回会删除部分考核数据,统计时需过滤 |
| 主键冲突 | WF_CH.MyPK 默认 {NodeID}_{WorkID}_{FID}_{EmpNo};退回重发时引擎会 GenerGUID() 兜底,统计按 WorkID 去重需注意 |
| 挂起 | 挂起期间 HungupTime / DTOfHungup 有记录,但默认 InitCH 未扣除挂起时长;若需扣除,须在 InitCH 或事件中自定义 |
| 多人处理 | 会签/协作时 InitCH 可传入指定 GenerWorkerList;GroupEmps 记录同节点其他当事人 |
| 开始节点 | ItIsStartNode 不考核,InitCH 直接 return |
| 子流程 | FID 非 0 时注意用 WorkID 或 FID 关联查询 |
| 组织隔离 | 集团版 OrgNo 字段需加入 WHERE 条件 |
| 历史重算 | 用 GenerCH DTS,先备份 WF_CH |
| 性能 | 大数据量统计走 FK_NY 分区查询;避免对 WF_GenerWorkerList 全表扫描,应加 IsPass=0 条件 |
12.12 完整二次开发示例:部门月度绩效接口
以下示例展示如何从 WF_CH 读出 → 自定义加权 → 写入自建表,供 HR 系统拉取。
Step 1:建汇总表(略,见 12.6.5)
Step 2:DTS 月度任务 MyCHMonthlyDTS.cs
public override object Do() {
string ny = DateTime.Now.AddMonths(-1).ToString("yyyy-MM");
string sql = @"SELECT EmpNo, EmpNoT, DeptNoT,
COUNT(*) Cnt,
SUM(CASE WHEN CHSta=1 THEN 1 ELSE 0 END) OverCnt,
SUM(Points) TotalPoints
FROM WF_CH WHERE FK_NY='" + ny + @"'
GROUP BY EmpNo, EmpNoT, DeptNoT";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow dr in dt.Rows) {
// 自定义:逾期一次额外扣 5 分
float score = float.Parse(dr["TotalPoints"].ToString())
+ int.Parse(dr["OverCnt"].ToString()) * 5;
// INSERT INTO My_CH_Summary ...
}
return "汇总完成:" + dt.Rows.Count + " 人";
}
Step 3:前端管理页
用实体 @My_CH_Summary 配置查询列表,或 REST API 暴露给 HR。
12.13 二次开发检查表
实施完成后,可按此清单验收:
- 节点
CHWay已设为按时效考核 - 发送一条测试流程后,
WF_CH有对应记录 -
DTFrom/SDT/DTTo与GWL、Track时间一致 - 逾期场景
CHSta=1且Points符合预期 - 运行中待办超时列表 SQL 结果正确
- 退回/撤回后考核数据符合业务规则
- 统计报表
FK_NY月份筛选正确 - 集团版
OrgNo隔离有效


418

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



