流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎

流程时效考核的表结构:从待办时限到 WF_CH 考核结果


1. 总体架构

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

层次 表名 职责(时效视角)
流程实例 WF_GenerWorkFlow 记录流程级应完成时间、预警时间、整体待办状态
工作人员 WF_GenerWorkerList 记录每人每节点的接收时间、应完成时间、实际完成时间(运行期时效数据源)
流程轨迹 ND{FlowNo}Track 记录每次动作的发生时间、耗时,为考核提供历史时间点
时效考核 WF_CH 节点处理完成后写入的考核结果表(绩效考核/统计的核心)
节点计划 WF_CHNode 流转自定义/项目计划场景下的节点计划起止时间
来源 目标 关系说明
节点/流程模板配置(TimeLimit、DeadLineRole) WF_GenerWorkerList 下达待办时计算人员级应完成时间
节点/流程模板配置(TimeLimit、DeadLineRole) WF_GenerWorkFlow 计算当前节点与流程级时限
WF_CHNode(计划 EndDT) WF_GenerWorkerList 流转自定义场景优先采用计划时间
WF_GenerWorkerList WF_CH 节点发送完成后由 InitCH 写入考核结果
NDxxTrack(上一节点 RDT) WF_CH 提供上一节点时间与发送人推算依据
WF_GenerWorkFlow(SDTOfNode) WF_CH 提供节点应完成时间

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_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 典型查询示例

sql 复制代码
-- 某员工某月逾期节点统计
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 开发路径选型

需求类型 推荐开发路径
查统计/出报表 直接查 WF_CH 或关联 WF_GenerWorkFlow
实时监控待办超时 查 WF_GenerWorkerList(SDT + IsPass=0)
改计划完成时间 WF_CHNode + CH_Save 或 Flow_SetSDTOfFlow
改扣分算法 扩展 InitCH 或 SendSuccess 后处理
考核与 BPM 解耦 节点事件写自建表

12.3 场景 A:考核统计与报表(推荐首选)

WF_CH 是已固化的考核结果,适合做 BI、大屏、Excel 导出,无需重复计算时限。

12.3.1 常用统计 SQL
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),可通过低代码/实体列表直接配置查询页:

typescript 复制代码
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 查询当前超时待办
sql 复制代码
-- 已超时且未处理的待办(人员级)
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 预警区间(未超时但进入预警)
sql 复制代码
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,对超时记录调用:

csharp 复制代码
// 催办 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 流程级:修改整体完成时间

接口:

csharp 复制代码
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(慎用)
sql 复制代码
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() 之前插入自定义逻辑,例如:

csharp 复制代码
// 示例:逾期不足 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),编写业务类:

csharp 复制代码
// 伪代码:发送成功后修正 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.ts 的 EnMap 中 map.AddTBFloat(...) 注册字段;
  3. 在 InitCH 或 SendSuccess 事件中写入自定义分值。

索引建议(CreateIndex.cs 已有):WorkID、WorkID+EmpNo;按月统计可加 FK_NY 组合索引。

12.6.5 扩展方式四:自建考核汇总表

适合与 HR/绩效系统对接:

sql 复制代码
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:

sql 复制代码
-- 流程 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 调用示例(前端):

typescript 复制代码
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 流程完成时限配置

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

  1. 新建 Vue 页面,通过 CHs 实体或自定义 HttpHandler 查询 WF_CH;
  2. 筛选条件:FK_NY、FlowNo、DeptNo、EmpNo、CHSta;
  3. 图表:按 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

csharp 复制代码
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 隔离有效
相关推荐
传奇开心果编程3 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽6 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_563371477 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
三号路口10 小时前
组件库的版本锁定:升级前先冻住
低代码
AIsoft_868910 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui10 小时前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行10 小时前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技10 小时前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben11 小时前
Weex开发踩坑记录
android·前端·ios