本大屏使用本地 SQLite 作为页面数据源,主同步直连 Process 列表和详情接口增量更新本地库。历史 Notion process数据库 数据源 ID:
37cbac6d-4c23-8033-808c-000b3dbb63e5
- 后端:Python 3 标准库
http.server,提供本地静态资源服务、主大屏 API 和工时大屏 API。 - Process 接入:Python 标准库
urllib.request直连 Process 列表、详情、评论和筛选项接口。 - TAPD 接入:工时同步优先直连 TAPD 任务列表页抓取任务标题和
effort,再按 Process 工单标题做归一化/模糊匹配;未配置 TAPD Cookie 时自动回退到团队日程本地服务http://10.5.11.59:8888/api/tapd/taskList。 - 本地数据源:SQLite,数据库文件默认位于
data/process_dashboard.db。 - 前端:原生 HTML、CSS、JavaScript,无构建步骤。
- 图表:ECharts CDN,用于处理人排行、产品分布、状态分布、月度趋势和工时趋势。
- 数据刷新:页面“刷新最新数据”按钮调用本地
/api/dashboard,只从 SQLite 读取并聚合返回。 - 反馈同步:页面“同步最近50条”按钮调用本地
/api/sync-feedback/start,读取 SQLite 中的大屏同步配置,直连 Process 列表接口只拉取最近 50 条数据写入 SQLite,并刷新 AI 字段后读取 SQLite 聚合返回。 - 工时大屏:页面
/work-hours调用本地/api/work-hours-dashboard,展示每月中位数工时、每月耗时最长工单、本月耗时 Top 工单;“同步本月工时”调用/api/sync-work-hours/start,按当前月 SQLite 工单标题匹配 TAPD 任务并写入工时。 - 同步配置:页面
/config调用本地/api/filter-config读取和保存筛选配置,配置持久化到 SQLite。 - 反馈导入:
scripts/import_team_feedback_to_sqlite.py复用本机 Hermes 反馈接口抓取脚本,分页读取团队日程反馈页数据并写入 SQLite。 - 测试:Python 标准库
unittest,覆盖 Notion 字段解析、SQLite upsert、月度查询、处理人/产品/SLA/子系统/未完成聚合逻辑。
cd "F:/myclaw/process-dashboard"
python "server.py" 8765打开:
http://127.0.0.1:8765
如需通过本机指定网卡 IP 访问:
python "server.py" 8765 10.20.32.1打开:
http://10.20.32.1:8765
- 月度范围:按
process创建时间过滤自然月。 - 处理人:读取
处理人,展示时只保留人名,去掉账号后缀。 - 产品分布:优先读取
产品模块,为空时读取产品模式。 - 子系统:读取
子系统,为空时归为未分类。 - SLA 预警:按反馈页同口径计算。优先读取接口直出
sla/hsfx_text;为空时读取 Process 返回的分配、响应、解决 3 个 SLA 哈希字段,组合出“分配倒计时 / 响应倒计时 / 解决倒计时 / 已超时”。 - 月度工单趋势:直接从 SQLite 全量数据按
YYYY-MM聚合最近月份,不受页面当前月份筛选影响;包含总量以及成本、采招、售楼、工程、计划、费用 6 条业务维度曲线。 - 当前未完成:
状态不属于完成、已完成、已关闭、关闭的单据。 - 工单标题:读取
名称。 - 状态:读取
状态。 - 刷新最新数据:重新调用本地
/api/dashboard接口,只读取 SQLite 聚合。 - 同步最近50条:调用本地
/api/sync-feedback/start接口,将 SQLite 中的大屏同步配置转换为 Processquery_fields,触发 Process 列表接口最近 50 条 → SQLite 增量更新 → 逐条刷新 AI 字段 → 再读取 SQLite 聚合。 - 同步配置:访问
/config可通过多选下拉维护处理人、状态、类型、子系统、产品模式、创建人、关键词等筛选条件;保存后写入 SQLite,下一次同步最近50条生效。 - 去重规则:SQLite 以
process_id作为工单唯一业务键;同一个process_id再次导入时只更新原行,不新增重复行。 - 工时口径:只统计 SQLite 中
work_hours > 0的工单;work_hours来自匹配到的 TAPD 任务effort字段。同步后同时保存tapd_id、tapd_link、tapd_title、work_hours_match_status和work_hours_synced_at,后续 Process 同步不会覆盖已写入的工时字段。 - TAPD 匹配:先精确匹配标题,再去掉空格、标点、
【P】等常见前缀后匹配,最后用标题相似度做模糊匹配;多个候选相似度过近时写入ambiguous且不写工时,避免误把别的 TAPD 工时挂到当前工单。
从团队日程反馈页接口导入到本地 SQLite:
cd "F:/myclaw/process-dashboard"
$env:PYTHONPATH="F:/myclaw/process-dashboard"
python "scripts/import_team_feedback_to_sqlite.py" --page-size 500脚本默认读取:
- 数据库:
data/process_dashboard.db - 反馈抓取脚本:
C:/Users/xus66/AppData/Local/hermes/scripts/fetch_team_feedback_all.py - 当前反馈页筛选条件:
C:/Users/xus66/AppData/Local/hermes/state/app_feedback_filter_current.json
导入完成后可验证 process_id 是否重复:
python -c "import sqlite3; conn=sqlite3.connect('data/process_dashboard.db'); print(conn.execute(\"select count(*), count(distinct process_id) from process_tickets where process_id <> ''\").fetchone()); print(conn.execute(\"select process_id,count(*) from process_tickets where process_id<>'' group by process_id having count(*)>1 limit 10\").fetchall()); conn.close()"刷新最新数据按钮
-> GET /api/dashboard?month=YYYY-MM
-> 从 SQLite 查询当前月份工单
-> 聚合处理人、产品模块、状态、月度趋势和明细
-> 返回前端渲染
同步最近50条按钮
-> GET /api/sync-feedback/start?month=YYYY-MM
-> 读取 SQLite 同步配置并转换为 Process query_fields
-> 直连 Process 列表接口拉取筛选后的最近 50 条数据
-> 按 process_id 写入或更新 SQLite process_tickets
-> 调 Process 详情和评论接口刷新 AI 字段
-> 从 SQLite 查询当前月份工单
-> 聚合处理人、产品模块、状态和明细
-> 返回前端渲染
同步本月工时按钮
-> GET /api/sync-work-hours/start?month=YYYY-MM
-> 读取 SQLite 当前月份工单
-> 优先直连 TAPD 任务列表页读取任务;未配置 Cookie 时回退团队日程 taskList
-> 按标题精确/归一化/模糊匹配 TAPD 任务
-> 读取 TAPD effort 写入 SQLite work_hours,歧义候选标记 ambiguous
-> 从 SQLite 全量工单聚合月度中位数和每月最长耗时工单
-> 返回 /work-hours 前端渲染
直连 TAPD 页面需要登录 Cookie,可任选一种方式配置:
$env:TAPD_COOKIE="从浏览器复制的 TAPD Cookie"或写入默认文件:
C:/Users/xus66/AppData/Local/hermes/scripts/tapd_cookie.txt
可选环境变量:
TAPD_WORKSPACE_ID:默认66070363。TAPD_TASK_CONF_ID:默认1166070363001770450。TAPD_TASK_FILTER_TOKEN:可选,TAPD 任务页保存筛选后的filter_token,用于复用页面筛选条件。TAPD_TASK_OWNERS:直连 TAPD 时的处理人筛选,默认李宝,徐爽产品,沈顺和,方建桥。TAPD_DIRECT_TASK_PAGE_SIZE:直连 TAPD 每页数量,默认100。TAPD_DIRECT_TASK_MAX_PAGES:直连 TAPD 最大页数,默认20。
$env:PYTHONPATH="F:/myclaw/process-dashboard"
python -m unittest discover -s "tests"