驰骋BPM-流程运行时效相关表结构说明

流程运行过程表结构说明(侧重时效考核)

本文结合 Vue3/src/WF/WorkOpt/OneWork(时间轴/轨迹页面)、后端实体定义(BP.WF)及运行逻辑,描述 CCFlow 流程运行期核心表结构,重点说明时效考核相关字段及其数据流转关系

源码参考:

  • CCFlow/Components/BP.WF/WF/GenerWorkFlow.cs
  • CCFlow/Components/BP.WF/WF/GenerWorkerList.cs
  • CCFlow/Components/BP.WF/WF/Track.cs
  • CCFlow/Components/BP.WF/Data/CH.cs
  • CCFlow/Components/BP.WF/Glo.csInitCH 考核写入)
  • Vue3/src/WF/WorkOpt/OneWork/TimeBase.vue

1. 总体架构

CCFlow 将流程运行数据分为多张职责明确的表,通过 WorkID 关联。与时效直接相关的层次如下:

层次表名职责(时效视角)
流程实例WF_GenerWorkFlow记录流程级应完成时间、预警时间、整体待办状态
工作人员WF_GenerWorkerList记录每人每节点的接收时间、应完成时间、实际完成时间(运行期时效数据源)
流程轨迹ND{FlowNo}Track记录每次动作的发生时间、耗时,为考核提供历史时间点
时效考核WF_CH节点处理完成后写入的考核结果表(绩效考核/统计的核心)
节点计划WF_CHNode流转自定义/项目计划场景下的节点计划起止时间

考核结果

运行期

计划EndDT

发送完成 InitCH

上一节点RDT

SDTOfNode

WF_GenerWorkFlow
流程级时限

WF_GenerWorkerList
人员级时限

NDxxTrack
动作时间线

WF_CH
时效考核

WF_CHNode
节点计划

节点/流程模板配置
TimeLimit / DeadLineRole


2. 时效数据生命周期

2.1 时限计算(工作下达时)

节点发送(WorkNode.cs)时,根据节点考核方式 CHWay 计算应完成时间:

  1. 按节点限期TimeLimit(天)+ TimeLimitHH(小时)+ TimeLimitMM(分钟),经 Glo.AddDayHoursSpan 计算,可含节假日规则 TWay
  2. 按表单字段:读取节点表单指定日期字段作为 SDT
  3. 按流转自定义计划:优先读取 WF_CHNode.EndDT 作为应完成时间。
  4. 不考核SDT 可写为 "无"

计算结果写入:

  • WF_GenerWorkerList.SDT / DTOfWarning(人员级)
  • WF_GenerWorkFlow.SDTOfNode(当前节点级)
  • 流程级 SDTOfFlow / SDTOfFlowWarning(由流程 DeadLineRole 配置)

2.2 运行期展示(OneWork 时间轴)

TimeBase_InitWF_WorkOpt_OneWork.cs)聚合返回:

数据集来源表时效用途
Track 轨迹ND{FlowNo}Track已完成节点的 RDT、动作耗时
流程实例WF_GenerWorkFlow流程当前状态、节点应完成时间
待办人员WF_GenerWorkerList当前处理人的 RDTSDT、超时/剩余时间

前端 TimeBase.vue 对进行中待办实时计算:

  • 耗时 PassTime = 当前时间 − RDT
  • 还剩余 / 已超时 = 当前时间与 SDT 比较

2.3 考核落库(节点发送成功后)

Glo.InitCH 在节点处理完成、流程发送时触发(WorkNode.cs 多处调用),将本次节点时效写入 WF_CH

输入来源对应字段
GenerWorkerList.RDTDTFrom(任务下达时间)
当前时间DTTo(任务处理时间)
GenerWorkerList.SDTSDT(应完成日期)
上一轨迹 NDxxTrack.RDT推算发送人、上一节点时间
节点配置 TimeLimitTimeLimit(规定限期)

考核结论:

  • 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 标识与关联

字段类型说明
MyPKstring主键,格式一般为 节点ID_WorkID_FID_人员编号
WorkIDint流程工作 ID,关联实例
FIDint父流程 ID(子线程/分流场景,无则为 0)
Titlestring流程标题
FlowNostring流程编号
FlowNoTstring流程名称
NodeIDint被考核节点 ID
NodeIDTstring被考核节点名称
OrgNostring组织编号(集团/多组织模式)

3.2 人员与部门

字段类型说明
EmpNostring当事人(实际处理人)编号
EmpNoTstring当事人名称
Senderstring上一节点发送人编号
SenderTstring上一节点发送人名称
GroupEmpsstring相关当事人 ID 集合,格式 ,emp1,emp2,
GroupEmpsNamesstring相关当事人名称集合,格式 编号,姓名;
GroupEmpsNumint相关当事人数量
DeptNostring当事人隶属部门编号
DeptNoTstring部门名称

3.3 时间字段(考核核心)

字段类型说明
DTFromstring任务下达时间,取自 WF_GenerWorkerList.RDT
DTTostring任务处理完成时间,写入考核时的当前时间
SDTstring应完成日期,取自 WF_GenerWorkerList.SDT;无时限时为 "无"
TimeLimitstring节点配置的规定限期(天),来自节点 TimeLimit
FK_NYstring隶属月份,格式 yyyy-MM,用于月度统计
WeekNumint任务完成所在周次(周一为一周起始)

3.4 考核计算结果

字段类型说明
DTSWayint考核方式:0=不考核,1=按时效考核,2=按工作量考核
UseDaysfloat实际使用天数(DTTo − DTFrom 的天数部分)
UseMinutesfloat实际使用分钟数(时间差分钟部分)
OverDaysfloat逾期天数(DTTo 超出 SDT 的天数)
OverMinutesfloat逾期分钟数
CHStaint考核状态:0=按期完成(AnQi),1=逾期完成(YuQi
Pointsfloat逾期扣分,按期为 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 全表字段

字段类型说明
WorkIDint主键,流程实例唯一标识
FIDint父流程实例 ID(子流程/分流)
FK_FlowSortstring流程类别编号
SysTypestring系统类别
FK_Flowstring流程编号
FlowNamestring流程名称
SortPathstring目录路径
Titlestring流程标题
WFStaint概要状态
WFStateint详细状态:0空白 1草稿 2运行中 3已完成 4挂起 5退回
Starterstring发起人编号
StarterNamestring发起人名称
Senderstring最后发送人
RDTdatetime流程发起/记录日期
HungupTimestring挂起日期
SendDTdatetime流程最后活动时间
FK_Nodeint当前停留节点 ID
NodeNamestring当前节点名称
FK_Deptstring发起人部门编号
DeptNamestring发起人部门名称
PRIint优先级
SDTOfNodedatetime当前节点应完成时间(时效关键)
SDTOfFlowdatetime流程整体应完成时间(时效关键)
SDTOfFlowWarningdatetime流程预警时间(时效关键)
PFlowNostring父流程编号
PWorkIDint父流程 WorkID
PNodeIDint父流程调用节点
PFIDint父流程 FID
PEmpstring子流程调用人
GuestNostring外部客户编号
GuestNamestring外部客户名称
BillNostring单据编号
TodoEmpsstring当前待办人员,格式 编号,姓名;
TodoEmpsNumint待办人员数量
TaskStaint任务池共享状态
AtParastring扩展参数(键值对)
Empsstring参与人列表
GUIDstring全局唯一标识
FK_NYstring年月
WeekNumint周次
TSpanint时间间隔标记
TodoStaint待办时效状态(时效关键)
DomainExtstring域/系统编号
PrjNostring项目编号
PrjNamestring项目名称
OrgNostring组织编号
FlowNotestring流程备注/签批意见

4.2 时效相关字段详解

字段枚举/规则说明
SDTOfNode当前节点所有待办人员的应完成时间上限;节点发送时按节点限期计算并更新
SDTOfFlow流程级完成时限,由流程属性 DeadLineRole 配置(可不计算/不计算节假日/计算节假日)
SDTOfFlowWarning流程预警时间点,用于催办/预警提醒
TodoSta0 待办中当前时间未达预警线
TodoSta1 预警中进入预警区间
TodoSta2 逾期中已超过应完成时间且未完成
TodoSta3 按期完成流程在时限内结束
TodoSta4 逾期完成流程超时后结束
HungupTime挂起期间通常不计入工作时(挂起逻辑单独处理)

5. WF_GenerWorkerList — 工作人员表

表名WF_GenerWorkerList(注意大小写:WorkerList
复合主键WorkID + FK_Emp + FK_Node
定位:待办/已办/会签的任务明细,是运行期时效计算与 WF_CH 写入的直接数据源

5.1 全表字段

字段类型说明
WorkIDint主键之一,流程实例 ID
FK_Empstring主键之一,处理人编号
FK_Nodeint主键之一,节点 ID
FIDint父流程 ID
EmpNamestring处理人名称
NodeNamestring节点名称
FK_Flowstring流程编号
StaNostring岗位编号
FK_Deptstring处理人部门编号
SDTdatetime应完成日期(时效核心)
DTOfWarningdatetime预警日期
RDTdatetime记录时间/接受工作日期(时效起点)
CDTdatetime实际完成时间
IsEnableint是否有效:1 有效,0 撤回/跳转后失效
IsReadint是否已读:0 未读,1 已读
IsPassint是否已处理:0 待办,1 已办,其他值表示特殊状态
WhoExeItint执行方式:0 人工,1 机器,2 混合
Senderstring发送人(格式 编号,姓名
PRIint优先级
DTOfHungupdatetime挂起时间
DTOfUnHungupdatetime预计解除挂起时间
GuestNostring外部用户编号
GuestNamestring外部用户名称
Idxint顺序号(队列/会签排序)
AtParastring扩展参数(含 IsHuiQianPressTimes 催办次数等)

5.2 时效字段关系

RDT(接收) ──────────────────────────────► CDT(完成)
  │                                              │
  │         ┌── DTOfWarning(预警线)             │
  │         │                                    │
  └─────────┼── SDT(应完成) ──► 对比 ──► 是否逾期
            │                                    │
            └────────────────────────────────────┘
                         ↓ 节点发送成功后
                    WF_CH 记录考核结果
场景判断逻辑
进行中(OneWork 时间轴)now > SDT → 已超时;否则 → 还剩余
已完成(写入 WF_CH)DTTo > SDTCHSta=1 逾期;否则 → CHSta=0 按期
无时限SDT = '无',前端显示剩余时间为"无",考核默认按期

6. ND{FlowNo}Track — 流程轨迹表

表名规则ND + 流程编号 + Track,例如流程 001 对应 ND1Track,流程 036 对应 ND36Track
创建方式Track.CreateOrRepairTrackTable(flowNo) 由模板表 WF_Track 复制重命名。
主键MyPK(雪花 ID / bigint)

6.1 全表字段

字段类型说明
MyPKbigint主键
ActionTypeint动作类型(发起、发送、退回、移交等,见 ActionType 枚举)
ActionTypeTextstring动作类型名称
FIDint父流程 ID
WorkIDint工作 ID
NDFromint发送节点 ID
NDFromTstring发送节点名称
NDToint到达节点 ID
NDToTstring到达节点名称
EmpFromstring发送人编号
EmpFromTstring发送人名称
EmpTostring接收人编号(多人逗号分隔)
EmpToTstring接收人名称
RDTstring记录时间/动作发生时间(时效关键)
ToDTstring到达时间
WorkTimeSpanfloat本步处理时长(小时)
Msgtext处理意见/消息
NodeDatatext节点数据日志
Tagstring扩展参数(子流程、父流程关联信息等)
Exerstring实际执行人(含授权人信息)
FrmDBtext表单快照(部分动作写入)
WriteDBtext审核组件数据(部分动作写入)

6.2 时效相关用途

用途说明
历史时间线OneWork TimeBase.vue / Track.vue 展示已完成节点及 RDT
考核辅助InitCH 通过 Flow_GetPreviousNodeTrack 获取上一节点 RDTEmpFrom 作为 DTFrom 推算依据
耗时统计WorkTimeSpan 记录该步动作耗时(小时),可用于轨迹级分析
流程总耗时结合首条 Start 轨迹 RDT 与结束时间,写入报表 FlowDaySpan

6.3 常用 ActionType(时效展示相关)

含义时效说明
0Start流程起点,RDT 为流程开始时间
1Forward正常发送,触发下一节点 SDT 计算
2Return退回,可能影响计划时间重算
5Shift移交,工作人员变更但 WorkID 不变
8Hungup挂起,暂停计时
9UnHungup解除挂起

7. WF_CHNode — 节点时限计划表(辅助)

表名WF_CHNode
用途:流转自定义、项目计划等场景,为节点预设计划起止时间;发送时若存在记录,优先用 EndDT 作为应完成时间。

字段类型说明
MyPKstring主键,规则 {WorkID}_{FK_Node}
WorkIDint流程实例 ID
FK_Nodeint节点 ID
NodeNamestring节点名称
EmpNostring处理人编号
EmpNoTstring处理人名称
StartDTstring计划开始时间
EndDTstring计划结束时间(优先作为 SDT 来源)
GTint工天
Scalefloat阶段占比
TotalScalefloat总进度
ChanZhifloat产值
AtParastring扩展参数

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}TrackRDT, WorkTimeSpan
WF_GenerWorkFlowWF_GenerWorkFlowSDTOfNode, SDTOfFlow, TodoSta
WF_GenerWorkerListWF_GenerWorkerListRDT, SDT, CDT, DTOfWarning
WF_NodeWF_Node节点配置(TimeLimit 等)

8.3 前端时效展示映射(TimeBase.vue)

界面展示数据来源计算方式
接收时间GWL.RDT直接显示
应完成时间GWL.SDT直接显示; 表示不限时
耗时now - RDT,格式化为天/时/分/秒
还剩余 / 已超时GWL.SDTnowSDT 比较
已办节点时间Track.RDT轨迹记录时间

9. 配置项与表字段对照

9.1 节点级(WF_Node 模板参数)

配置项存储位置影响表字段
考核方式 CHWay节点属性WF_CH.DTSWayNone 时不写考核
限期 TimeLimit / TimeLimitHH / TimeLimitMM节点 ParaWF_GenerWorkerList.SDTWF_CH.TimeLimit
节假日规则 TWay节点属性SDT 计算方式
预警天数 WarningDay节点属性WF_GenerWorkerList.DTOfWarning
逾期扣分 TCent节点属性WF_CH.Points
按表单字段限期节点 ParaSDT 取自业务表单字段

9.2 流程级(WF_Flow 模板属性)

配置项说明影响表字段
DeadLineRole流程完成时限规则WF_GenerWorkFlow.SDTOfFlow
DeadLineRole 预警流程预警设置WF_GenerWorkFlow.SDTOfFlowWarning

10. 附录:枚举速查

CHSta(WF_CH.CHSta)

名称说明
0AnQi按期完成
1YuQi逾期完成

CHWay(节点考核方式 / WF_CH.DTSWay)

名称说明
0None不考核
1ByTime按时效考核(写入 WF_CH)
2ByWorkNum按工作量考核
3IsQuality质量考核(数据在 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_GenerWorkerListWF_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 开发路径选型

查统计/出报表

实时监控待办超时

改计划完成时间

改扣分算法

考核与 BPM 解耦

需求是什么?

直接查 WF_CH
或关联 GWF

查 WF_GenerWorkerList
SDT + IsPass=0

WF_CHNode + CH_Save
或 Flow_SetSDTOfFlow

扩展 InitCH
或 SendSuccess 后处理

节点事件写自建表


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.AtParaPressTimes 中,便于二次统计。

12.4.4 前端实时计算参考

OneWork 时间轴(TimeBase.vue)的超时展示逻辑可直接复用到自定义看板:

变量计算
PassTimenow - RDT
OverTimeLabSDT 为空或 "无" → 不限时;否则 now > SDT → 已超时
OverTimeSDT 的时间差,格式化为天/时/分

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.RDTDTTo = 当前时间
取限期SDT = GWL.SDT
算逾期OverDays = (DTToSDT) 天数;OverMinutes 同理
定期/逾期DTTo <= SDTCHSta=0;否则 CHSta=1
算扣分Points = OverDays × Node.TCent(节点模板"扣分"配置)
12.6.2 扩展方式一:修改 Glo.InitCH(引擎层)

CCFlow/Components/BP.WF/Glo.csInitCH2017 方法中,#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 表字段
  1. 数据库 ALTER TABLE WF_CH ADD MyScore FLOAT
  2. CH.cs / CH.tsEnMapmap.AddTBFloat(...) 注册字段;
  3. InitCH 或 SendSuccess 事件中写入自定义分值。

索引建议(CreateIndex.cs 已有):WorkIDWorkID+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_InitWF_WorkOpt.cs加载时限调整页数据(GWL/GWF/CHNode)
CH_SaveWF_WorkOpt.cs保存 WF_CHNodeSDTOfFlow
Flow_SetSDTOfFlowDev2Interface.cs设置流程应完成时间
DB_GenerTrackTableDev2Interface.cs获取 NDxxTrack 数据
TimeBase_InitWF_WorkOpt_OneWork.csOneWork 时间轴数据聚合
Flow_DoPressDev2Interface.cs催办
GenerCHDTS/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.tsWF_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流程完成时限配置

自定义考核报表页推荐做法:

  1. 新建 Vue 页面,通过 CHs 实体或自定义 HttpHandler 查询 WF_CH
  2. 筛选条件:FK_NYFlowNoDeptNoEmpNoCHSta
  3. 图表:按 NodeIDT 分组统计 OverDays / Points

12.10 节点/流程配置清单(实施前检查)

二次开发前,需在设计期正确配置模板,否则 WF_CH 无数据或 SDT 为"无":

配置位置配置项影响
节点属性CHWay = 按时效考核是否写入 WF_CH、是否计算 SDT
节点属性TimeLimit / TimeLimitHH / TimeLimitMMGWL.SDTWF_CH.TimeLimit
节点属性TWay(节假日规则)SDT 计算是否跳过节假日
节点属性WarningDayGWL.DTOfWarning
节点属性TCent(扣分)WF_CH.Points
节点属性CHWayOfTimeRole按天限时 / 按表单字段限时
流程属性DeadLineRoleGWF.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 可传入指定 GenerWorkerListGroupEmps 记录同节点其他当事人
开始节点ItIsStartNode 不考核,InitCH 直接 return
子流程FID 非 0 时注意用 WorkIDFID 关联查询
组织隔离集团版 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 / DTToGWLTrack 时间一致
  • 逾期场景 CHSta=1Points 符合预期
  • 运行中待办超时列表 SQL 结果正确
  • 退回/撤回后考核数据符合业务规则
  • 统计报表 FK_NY 月份筛选正确
  • 集团版 OrgNo 隔离有效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

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

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

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

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

打赏作者

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

抵扣说明:

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

余额充值