跳转到主要内容

泛微流程效率相关报表与操作统计

为什么要统计操作次数?
操作次数是衡量流程顺畅度更敏感的指标。

当统计【产生过特定操作的流程数量】

是为了衡量问题的影响广度。这个维度可以反映 “有多少流程出现了异常?” ,识别出流程体系中共性问题。 例如,如果发现超过30%的流程都存在“退回”操作,说明流程填写规范或制度培训可能存在问题。

当统计【特定操作行为的发生总次数】

是为了衡量问题的严重深度与发生频率。这个维度可以反映  “流程异常发生的频率有多高?问题的复杂程度如何?” 例如:同一流程多次退回,可能是不同环节或不同性质的问题,如第一次退回是“信息填写不全”,第二次是“附件缺失”。

表结构解析

  • 操作记录是记录在workflow_requestoperatelog【流程操作记录日志主表】
  • 流程删除后,会同时在实例表workflow_requestbase【工作流请求基本信息表】和workflow_requestlog【工作流请求签字日志表】删除对应requestid的记录。而workflow_requestoperatelog【流程操作记录日志主表】里的不会被删除。因此统计次数时使用workflow_requestoperatelog会更加精准。
  • 因此针对先对审批流产生操作(退回、干预等)再删除的场景,导出流程退回/转发等操作清单时,行数量是可能少于报表统计的操作记录数的。

一、流程操作统计

从宏观层面了解各类流程的操作情况。以下SQL统计了按流程分类和流程类型分组的所有关键操作次数,包括提交、退回、干预等,提供整体视角。
此查询展示各类操作的发生频次,可以协助分析人员快速识别操作密集的流程类型。

mssql写法,未测试

--统计OA流程在固定日期内的操作记录次数(近一年) 
WITH 
active_workflow AS (
  SELECT
    id AS workflowid,
    COALESCE(activeVersionID, id) AS activeVersionID
  FROM workflow_base
  ),
  operation_stats AS (
    SELECT
      COALESCE(NULLIF(d.typename, ''), '已删除的流程') as typename,
      COALESCE(NULLIF(c.workflowname, ''), '已删除的流程') as workflowname,
      COUNT(DISTINCT a.requestid) as '涉及流程数', 
      SUM(CASE WHEN a.operatetype = 'submit' THEN 1 ELSE 0 END) as '提交次数', 
      SUM(CASE WHEN a.operatetype = 'reject' THEN 1 ELSE 0 END) as '退回次数', 
      SUM(CASE WHEN a.operatetype = 'intervenor' THEN 1 ELSE 0 END) as '干预次数', 
      SUM(CASE WHEN a.operatetype = 'forceover' THEN 1 ELSE 0 END) as '强制归档次数', 
      SUM(CASE WHEN a.operatetype = 'forward' THEN 1 ELSE 0 END) as '转发次数',
      SUM(CASE WHEN a.operatetype = 'trans' THEN 1 ELSE 0 END) as '转办次数', 
      SUM(CASE WHEN a.operatetype = 'take' THEN 1 ELSE 0 END) as '意见征询次数'
    FROM workflow_requestoperatelog a
    LEFT JOIN workflow_requestbase b ON a.requestid = b.requestid
    LEFT JOIN active_workflow aw ON b.workflowid = aw.workflowid 
    LEFT JOIN workflow_base c ON aw.activeVersionID = c.id
    LEFT JOIN workflow_type d ON c.workflowtype = d.id 
    WHERE a.operatedate >= DATEADD(YEAR, -1, GETDATE())
    GROUP BY 
      COALESCE(NULLIF(d.typename, ''), '已删除的流程'), 
      COALESCE(NULLIF(c.workflowname, ''), '已删除的流程')
)SELECT
  CAST(YEAR(DATEADD(YEAR, -1, GETDATE())) AS VARCHAR) + '-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS 年份,
  CASE
    WHEN os.typename = '已删除的流程' THEN '已删除的流程'
    ELSE COALESCE(NULLIF(dbo.convToCN(os.typename), ''), os.typename)    END as '流程分类',
  CASE
    WHEN os.workflowname = '已删除的流程' THEN '已删除的流程'
    ELSE COALESCE(NULLIF(dbo.convToCN(os.workflowname), ''), os.workflowname)
  END as '流程类型名称', 
  os.涉及流程数,
  os.提交次数,
  os.退回次数,
  os.干预次数,
  os.强制归档次数,
  os.转发次数,
  os.转办次数,
  os.意见征询次数
FROM operation_stats os
ORDER BY typename asc, workflowname asc

oracle 11g 测试完成的写法

WITH active_workflow AS (
  SELECT
    id AS workflowid,
    NVL(activeVersionID, id) AS activeVersionID
  FROM workflow_base
),
operate_stat AS(
	SELECT
			COALESCE(nullif(d.TYPENAME, ''), '已删除的流程') as TYPENAME,
			COALESCE(NULLIF(c.WORKFLOWNAME, ''), '已删除的流程') as workflowname,
			COUNT(DISTINCT a.requestid) AS 涉及流程数,
			SUM(CASE WHEN a.OPERATETYPE = 'submit' THEN 1 ELSE 0 END) as 提交次数,
			SUM(CASE WHEN a.operatetype = 'reject' THEN 1 ELSE 0 END) AS 退回次数,
			SUM(CASE WHEN a.operatetype = 'intervenor' THEN 1 ELSE 0 END) AS 干预次数,
			SUM(CASE WHEN a.operatetype = 'forceover' THEN 1 ELSE 0 END) AS 强制归档次数,
			SUM(CASE WHEN a.operatetype = 'forward' THEN 1 ELSE 0 END) AS 转发次数,
			SUM(CASE WHEN a.operatetype = 'trans' THEN 1 ELSE 0 END) AS 转办次数,
			SUM(CASE WHEN a.operatetype = 'take' THEN 1 ELSE 0 END) AS 意见征询次数
	FROM workflow_requestoperatelog a
	LEFT JOIN workflow_requestbase b ON a.requestid = b.requestid
	left join active_workflow aw on b.WORKFLOWID = aw.WORKFLOWID
	left join workflow_base c on aw.ACTIVEVERSIONID = c.id
	left join workflow_type d on c.WORKFLOWTYPE = d.id
	WHERE a.operatedate >= '2025-01-01'
	GROUP BY
		COALESCE(nullif(d.TYPENAME, ''), '已删除的流程'),
		COALESCE(NULLIF(c.WORKFLOWNAME, ''), '已删除的流程')
)
SELECT
-- 	TO_CHAR(EXTRACT(YEAR FROM SYSDATE) - 1) || '-' || TO_CHAR(EXTRACT(YEAR FROM SYSDATE)) AS 年份,
	CASE
		WHEN os.typename = '已删除的流程' THEN '已删除的流程' ELSE NVL(NULLIF(convToCN(os.typename), ''), os.typename) END AS 流程分类,

	CASE
		WHEN os.workflowname = '已删除的流程' THEN '已删除的流程' ELSE NVL(NULLIF(convToCN(os.workflowname), ''), os.workflowname) END AS 流程类型名称,
  os.涉及流程数,
  os.提交次数,
  os.退回次数,
  os.干预次数,
  os.强制归档次数,
  os.转发次数,
  os.转办次数,
  os.意见征询次数
from operate_stat os
ORDER BY os.TYPENAME asc, os.WORKFLOWNAME asc

二、操作明细分析

MSSQL的写法,未验证

--查询产生过退回操作的流程清单及次数
SELECT
  COALESCE(NULLIF(b.requestname,''),'已删除的流程') as '审批流名称',
  b.requestid '流程id', 
  COUNT(a.requestid) as '退回次数',
  COALESCE(NULLIF(d.typename, ''), '已删除的流程') as '所属流程分类', 
  COALESCE(NULLIF(c.workflowname, ''), '已删除的流程') as '所属流程类型名称'
FROM workflow_requestoperatelog a
LEFT JOIN workflow_requestbase b ON a.requestid = b.requestid
LEFT JOIN workflow_base c ON b.workflowid = c.id
LEFT JOIN workflow_type d ON c.workflowtype = d.id 
WHERE a.operatetype = 'reject'
AND a.operatedate >= DATEADD(YEAR, -1, GETDATE())
GROUP BY d.typename, c.workflowname, b.requestname, b.requestid,c.workflowtype,c.id
ORDER BY c.workflowtype ASC,c.id ASC,b.requestid ASC

Oracle 11g的写法,已验证

SELECT 
	COALESCE(NULLIF(b.REQUESTNAME, ''), '已删除的流程') as 审批洲名称,
	b.REQUESTID 流程id,
	COUNT(a.REQUESTID) as 退回次数,
	COALESCE(NULLIF(d.TYPENAME, ''), '已删除的流程') as 所属流程分类,
	COALESCE(NULLIF(c.WORKFLOWNAME, ''), '已删除的流程') as 所属流程类型名称
FROM WORKFLOW_REQUESTOPERATELOG a
LEFT JOIN workflow_requestbase b on a.requestid = b.requestid
LEFT JOIN WORKFLOW_BASE c on b.workflowid = c.id
LEFT JOIN WORKFLOW_TYPE d on c.WORKFLOWTYPE = d.id
WHERE a.OPERATETYPE = 'reject' 
AND EXTRACT(YEAR FROM TO_DATE(a.OPERATEDATE, 'YYYY-MM-DD')) = 2025
GROUP BY d.TYPENAME, c.WORKFLOWNAME, b.REQUESTNAME, b.REQUESTID, c.WORKFLOWTYPE, c.id

其中,您可以替换【WHERE a.operatetype = 'reject'】中的reject来查询其它操作的清单。

提交 submit
退回 reject
干预 intervenor
转办 trans
意见征询 tak
转发 forward
强制归档 forceover

三、节点级退回分析

识别出高频退回的流程后,我们需要进一步定位具体在哪个环节容易出现问题。以下查询展示每条流程的退回操作发生在哪些审批节点,协助精准定位流程瓶颈:

SELECT 
    c.typename, a.workflowid, b.workflowname, d.requestid, d.requestname,
    d.createdate, e.nodename, h.lastname, a.remark
FROM 
    workflow_requestlog a, workflow_base b, workflow_type c,
    workflow_requestbase d, workflow_nodebase e, hrmresource h
WHERE 
    a.logtype = '3' 
    AND a.workflowid = b.id 
    AND a.requestid = d.requestid 
    AND a.nodeid = e.id 
    AND a.operator = h.id 
    AND b.workflowtype = c.id 
    AND d.createdate >= DATEADD(YEAR, -1, GETDATE())

其中,您可以替换【WHERE a.logtype = '3' 】中的reject来查询其它操作的清单。

0:批准
1:保存
2:提交
3:退回
7:转发
9:批注
a:意见征询
e:强制归档
h:转办
i:干预
t:抄送