OA 流程耗时/超时分析大屏(通用)
用户必须提供(开工前问清)
| 项 | 说明 | 示例 |
|---|---|---|
| workflowid | 路径(流程模板)ID | 525 |
| 路径名称 | 大屏标题/数据目录名 | 采购需求 |
| 时间范围 | 创建时间起止 | 2026-06-16 ~ 2026-08-16 |
| Cookie | 登录态字符串(贴 curl 的 -b, randcode 每次变) | oauth2_access_token=...; __randcode__=... |
| 超时规则(可选) | 节点名+时限+条件(截图提供) | 采购审核/5分钟/需求类型=其他劳务服务且公司不在MOROCCO |
Cookie 存 ~/.workbuddy/ecology_cookies_techstorm.json(最新覆盖)。过期特征=接口返回空/错误对象/401 → 向用户要新的。
数据目录
{工作区}/data/{路径名}/
├── {月份}/flows.json / node_logs.json / node_logs_clean.json / form_details.json
├── people_dict.json / manifest.json / field_dict.json / overtime_rules.json
├── duration_analysis.json / overtime_analysis.json / 流程分析大屏.html
刷新规则: 相同 路径+日期 重拉=覆盖最新; 人员字典增量(已有 userid 跳过)。
工作流
- 列表:
fetch_flows.py --workflowid {id} --from {起} --to {止} --out {data/{路径名}} --cookie-file ~/.workbuddy/ecology_cookies_techstorm.json - 节点明细(loadForm 拿签名 → wfstatusnew 拿节点):
fetch_node_logs.py --data-dir {data/{路径名}} --cookie-file ... - 表单详情(超时分析用):
fetch_form_details.py --data-dir ... --cookie-file ... - 字段字典(单独文件):
fetch_field_dict.py --data-dir ... --cookie-file ... - 人员(增量):
fetch_people.py --data-dir ... --cookie-file ... - 清洗:
clean_node_logs.py --data-dir ... - 耗时分析:
analyze_duration.py --data-dir ... - 超时分析(先写 overtime_rules.json):
analyze_overtime.py --data-dir ... - 大屏:
build_dashboard.py --data-dir ... --path-name {名称}→流程分析大屏.html - 刷新服务(可选):
serve_dashboard.py --data-dir ... --port 8000→ 打开http://localhost:8000/, 右上角"刷新数据"重跑全流水线后 reload
超时规则文件 overtime_rules.json
{"rule": {"node": "采购审核", "timeout_minutes": 5, "pending_counts_as_timeout": true,
"conditions": [{"field": "field10878", "op": "eq", "value": "0", "label": "需求类型=其他劳务服务"},
{"field": "field11569", "op": "not_contains", "value": "公司名"}]}}
- op: eq / contains / not_contains(AND 叠加); 目标节点耗时>时限=超时, 停留中超过也算(可关)
- 规则一律从用户截图/提示词获取, 不自动从数据推断(用户约定)
- 名称按原文照抄不纠错(即使与数据不一致), 并提醒用户后果
- 字段编号从 loadForm 标签字典匹配(field_dict.json), 与用户确认值映射
关键接口(techstorm OA, 基址 https://oa.techstorm.com:7443)
| 用途 | 接口 |
|---|---|
| sessionkey | POST /api/workflow/monitor/getSessionkey(body 带条件) |
| 列表 | POST /api/ec/dev/table/datas(dataKey=¤t=&pageSize=1000&sortParams=%5B%5D&; 上限1000超量提示缩小范围; 返回条数<pageSize=全量) |
| 表单+签名 | POST /api/workflow/reqform/loadForm(ismonitor=1&requestid=&; 返回 maindata 字段值 + params.authSignatureStr 按 rid 动态生成不可复用 + 字段标签) |
| 节点 | POST /api/workflow/reqform/wfstatusnew(requestid=&...&authStr=&authSignatureStr=; datas 按节点; key0/key1 顺序不代表流程顺序) |
| 人员 | GET /api/hrm/simpleinfo/getHrmSimpleInfo?userid=&random= |
authStr: urllib.parse.quote(base64(f"viewChain={rid}|ismonitor=1|mainid={rid}|"))
清洗规则
- 只保留节点操作者(op == 下一节点 recv); 转发/抄送/传阅剔除
- 节点顺序按时间戳链排序(起点=statuscode3且op==recv), 不信 key0/key1
- 旁路节点剔除; 归档只留 recv 最早一条; 申请发起只留第一个(先完整链过滤再跳过)
大屏功能
- 视图切换: 耗时分析 / 超时分析
- 耗时: KPI + 4统计卡(TOP5流程/节点/人员/占比) + 列表(分页 + 搜索级联分部→部门→人员 + 节点独立筛选 + 展开明细 + 状态Tab未归档扩展列)
- 节点筛选: 列表加列(最小接收/最大操作/耗时/操作人逗号), 展开显每操作人明细
- 超时: 规则条 + KPI + 统计卡(TOP5流程单行带⏰/⏳图标, 人员图, 各50%) + 列表(停留中/已处理Tab, 停留中加列当前操作人/接收时间/已超时时长, 展开超时节点操作人明细, nowrap单行)
- 刷新按钮(需 serve_dashboard.py 服务)
- 分部/部门总耗时 TOP N(5/10/20 下拉切换, 动态高度)
- 时长条形图为"左图右表"(renderSplitBar): 左侧单色横条(长度=总耗时) + 右侧固定宽度类表格(表头 年/月/日/时/分/秒, 每行直接填数字, 0 灰色显示); 图表与表格同高行对齐, 表格行 hover 高亮对应 bar
- 主题: 按当前时间自动深浅(7:00-19:00 浅色, 其余深色), 右上角按钮手动切换; ECharts 文本色随主题(curTheme())
坑
- 数据量>1000 提示缩小范围; 无 total 字段
- 分页按钮勿用内联 onclick 访问 let 变量(ReferenceError), 用 addEventListener
- 超时规则条显示用 conditions(数组), 兼容旧 condition(字符串)
- 原始行大量
*span冗余, 清洗见脚本
Scan to join WeChat group