拼多多券率看板工作台(pdd-workbench)v2.0.8
用途
把"多多券率影响分析"的深度看板(完整保留:4 个分析页、面板折叠、6 系列折扣分布图、右侧纵轴开关、口径说明 chip、全规格逐单明细)以单文件自包含 HTML 形式生成,并在 WorkBuddy 内嵌预览。
- 多店切换:数据目录下
报表存放/里每个文件夹 = 一个店铺。 - 日期汇总:合并该店铺文件夹内所有报表 → 精致去重 → 一键生成看板(不做无效订单过滤:不按日期裁剪丢弃行,无成交时间的已取消/待付款订单同样保留,保证合并单数与拼多多后台一致)。
- 看板内工作台:生成的看板自带整宽吸顶顶栏——原左侧导览栏与顶部「数据源」条已合并为一条横条(品牌 / 店铺下拉 / 数据区间文本 / 更新分析数据 / 统计 chips / 概览·商品ID查询·折扣预警·订单明细 段控),主区不再被左侧栏占用、独占全宽;另把日期框换成"无数据日灰置不可选"的自定义日历。所有分析能力原样保留。
自包含说明(本版核心变化,务必先读)
本 skill 自带全部运行时,不依赖任何外部项目目录(旧版写死 D:/AI项目/... 是导致换机器/换会话即失能的根因)。包内文件:
| 文件 | 作用 |
|---|---|
| workbench_core.py | 核心逻辑:扫描店铺 / 合并去重 / 构造 DATA / 注入母版 + 表头条 + 日历(仅标准库,无需 pandas) |
| workbench_template.html | 数据驱动母版(只换内嵌 DATA 块,不依赖生成器结构),约 2.2MB |
| app_runtime.py | 路径解析:资源(模板/web)随包走,数据(报表存放/看板输出)落用户目录 |
| workbench_server.py + web/ | 可选本地网页工作台(端口 8770),与 CLI 共用同一套 core |
路径约定(关键)
- 资源目录 = 本 skill 包目录(
app_runtime.resource_dir()→ 脚本所在目录),模板/web 从这里读。 - 数据目录 = 默认当前工作目录;也可用
--dir <目录>或环境变量PDD_WORKBENCH_DIR指定。- 数据目录下会自动创建
报表存放/<店铺名>/(放 CSV)与看板输出/<店铺名>/(放生成的看板)。 - 推荐做法:每次调用都显式传
--dir <用户数据目录>,避免受当前工作目录影响。
- 数据目录下会自动创建
去重规则(核心,务必理解后再向用户解释)
同一店铺文件夹里经常混着不同粒度的报表:日报(覆盖 1 天)、周报(多天)、周期报(滑动窗口)、月报(整月)。它们互相重叠,同一订单会重复出现,且状态/金额会随时间变化。
去重要靠"谁更新",而不是"哪份报表更大":
- 快照时间:优先取文件名里的
yyyy-mm-dd-hh-mm-ss(如orders_export2026-08-26-19-34-53.csv),取不到回退文件mtime。与订单日期无关,这是判断权威性的唯一依据。 - 行级去重:同一
订单号只保留快照时间最新的那一行(最新状态最权威)。 - 字段级回填:若最新快照某字段为空,用更早快照中该字段的最近非空值回填 —— 解决不同报表列集不一致(日报列少、月报列全)导致的字段丢失。列取并集。
- 审计产物:输出差异明细,记录每单出现在几份报表、最新来源、在最早/最新快照之间发生的字段变化(如
订单状态: 待发货 → 已发货,待收货)。
实测:把
日报9-02 + 日报9-03 + 周报9-10 + 周期报9-13 + 月报9-30五份混放 → 91 行合并为 35 单(去重 56 条),其中 1 格靠日报回填、2 单状态/金额变更、列并集保留了日报独有列。真实店铺(2 份快照)亦印证:718 单重叠,其中 195 单在两快照间发生变更。
结论口径(可复述给用户):保留原表不动(唯一数据源、可审计),工作台每次生成时在 看板输出/<店铺>/ 产出派生文件,随时可删可重建。
不过滤口径(与拼多多后台对账,v2.0.4 修正)
历史版本有一个"隐式丢行"缺陷:带日期范围合并时,会连无成交时间的订单一起裁掉(这些订单本身没有日期,必然落在任何范围之外)→ 一选范围,合并单数就从 7188 掉到 6594,与后台对不上。现已修正:
- 不做无效订单过滤:不按订单状态、不按日期删除任何订单行。
- 无成交时间 ≠ 无效:
订单成交时间/支付时间为空的订单(实测该店铺全部是「已取消」,也可能出现「待付款」)一律保留,任何日期范围下都不丢。 - 范围只切"有成交日期"的行:
--start/--end仅裁剪有日期的行,无日期行恒保留。 - 空订单号不合并:
订单号为空的行无法判重,按每行独立处理,绝不合并删除。 - 对账恒等式:
原始报表总行数 = 去重后订单数 + 去重剔除数(实测 8971 = 7266 + 1705)。 - 顶栏 chips 直接给出 有成交日期 / 无成交时间 两个数,可与后台逐项核对。
- 顶栏「更新分析数据」按钮固定走全量(不传日期范围);看板顶部原生「时间筛选」只做视图级过滤,不改动数据。
- 「仅看已成交订单」开关(v2.0.5 新增,默认关闭):数据源顶栏新增一个开关,开启后视图级剔除无成交时间订单(已取消/待付款),关闭时全量保留。这是可选视图开关,不是默认行为——默认永远是"不过滤",关闭开关 = 与后台一致。v2.0.7 视觉态:被过滤掉的「无成交时间 N 单」气泡本身带删除线 + 橙字 + "已过滤"橙色徽标,精确指认"被滤掉的就是这 733 单"。v2.0.8 修正:删除线随开关状态实时切换(勾上立刻划线、取消立刻取消),不依赖整页刷新;移除了 v2.0.6 的顶栏橙色横线(仅保留气泡删除线,避免多余视觉)。v2.0.9 配色修正:开关开启态与「无成交时间 N 单」气泡(删除线 + "已过滤"徽标)一律使用默认色,不再启用任何橙色(开关开启时与其它开关同色,气泡仅保留删除线、文字/边框/徽标均为默认灰)。
注意区分:精致去重(多份重叠报表中同一
订单号取最新快照)是既有能力,不属于"过滤无效订单";只放一份报表时去重数恒为 0,合并单数 = 报表行数,与后台逐单一致。
单一工作台铁律(多店统一,禁止多份独立报告)
本工作台的设计目标是一份工作台承载全部店铺数据,而不是"一店一份报告":
- 一个工作台处理多份数据:
报表存放/下每个子文件夹 = 一个店铺,所有店铺都在同一个工作台 UI 内通过顶栏「店铺下拉」切换,互不割裂。 - 禁止交付多份独立报告:不得为不同店铺分别生成互不关联的独立 HTML/报告并各自交付;正确产物是同一工作台内的多店铺视图(切店即换数据,共享同一套分析与口径)。
- 数据同源、口径统一:所有店铺共用同一套去重与不过滤口径、同一套分析页与图表,确保跨店对比可信。
- 交付即"打开工作台":对外交付物 = 启动本地工作台(端口 8770)或在内嵌预览打开同一份看板,用户在那里选店、切视图;而非散落的多份静态文件。
这是给使用者的硬约束:无论用户导入几家店铺、多少份报表,最终只应有一个工作台入口,不要拆成 N 份独立交付物。
工作流程
1. 解析请求(自然语言 → 参数)
- 数据目录(--dir):问清或沿用用户既有的数据目录;首次使用则选定一个用户可写目录(如用户桌面或指定项目目录),在其中自动建
报表存放/。 - 店铺(shop):
- 用户明确说了店名 → 直接用;不在列表则先列店铺再提示。
- 没说店名 → 跑
--list,自动选第一个csv_count>0的店铺;全为空则提示先放 CSV。
- 日期范围(start / end,YYYY-MM-DD,可选):
- 默认不传 = 全量(推荐):不做任何日期裁剪,
合并单数 = 去重后订单数,可直接与拼多多后台对账。 - 说"X月" →
start=该月1号、end=该月最后一天(calendar.monthrange取末日;年份默认 2026,或与覆盖日期同年)。 - 给了具体日期对 → 直接用。
- 范围只裁剪"有成交日期"的行;
订单成交时间/支付时间为空的行(已取消、待付款等)任何范围下都保留,绝不丢行。 - 软上限 90 天:范围 > 90 天先提醒并建议拆分(只影响有日期行的切片粒度,不影响无日期订单的保留)。
- 默认不传 = 全量(推荐):不做任何日期裁剪,
2. 运行核心脚本(脚本就在本 skill 包内)
# SKILL_DIR = 本 skill 包目录(SKILL.md 所在目录),用户级安装通常为:
# $HOME/.workbuddy/skills/pdd-workbench
SKILL_DIR="$HOME/.workbuddy/skills/pdd-workbench"
PY="C:/Users/Administrator/.workbuddy/binaries/python/versions/3.13.12/python.exe" # 任意 Python 3 均可(仅标准库)
DATA="<用户数据目录>" # 放 报表存放/ 与 看板输出/ 的目录
# 列店铺(先跑这个确认数据在不在)
"$PY" "$SKILL_DIR/workbench_core.py" --dir "$DATA" --list
# 生成看板(只有这一种产物,直接交给 present_files)
"$PY" "$SKILL_DIR/workbench_core.py" --dir "$DATA" --shop <店铺> --start <起> --end <止>
⚠️ 没有「内嵌版 / 独立版」之分,也没有
--standalone参数(旧版这个参数从未被读取、生成的 HTML 与默认版完全一致,v2.0.1 已删除)。同一份看板 HTML 在任何打开方式下都能正常工作。
- 成功时 stdout 一行 JSON:
{"out":"<HTML绝对路径>","stats":{...},"shop":"..."}。 stats关键字段:files(报表份数) /files_detail(每份的名称+快照+行数+形态) /raw_rows(合并前行数) /orders(去重后订单数) /dup_removed/multi_snapshot(出现在≥2份报表的订单数) /backfilled_cells(字段级回填格数) /changed_orders(状态或金额发生变更的订单数) /diff_file(差异明细CSV) /dated(有成交日期) /undated(无成交时间) /coverage_min/max/snap_min/max。- 失败时 stdout 为
{"error":"..."},如实回给用户。 - 若
--dir未传:数据目录 = 当前工作目录,脚本会在那里建报表存放/(并写入指引 txt)。
3. 缺口提醒(建议)
跑一次 --list,读该店铺 covered(有订单的日期集合),若所选 [start,end] 内有日期不在 covered,列出"缺失日期:…"提醒。
4. 呈现结果(交付铁律,务必遵守)
- 一律用
present_files传 JSON 里的out(看板 HTML 绝对路径) —— 它会在 WorkBuddy 内置预览面板以顶层文档打开,首屏图表全部由内嵌 DATA 快照渲染,不依赖任何服务。 - ❌ 不要把
web/index.html(8770 外壳)丢进预览面板。那是"本地常驻工作台"的入口页,它 boot 时要连localhost:8770;服务没起就只显示「无法连接工作台服务」,会被误判成"数据加载失败",实际只是打开方式错了。 - 文字同步说明:店铺、日期范围、订单数、去重剔除数、来源报表份数;如有
changed_orders/backfilled_cells,点一句"多份报表重叠,已按最新快照去重,N 单状态变更已取最新"。
看板内工作台(整宽吸顶顶栏 + 自定义日历)
生成的看板不是"纯看板"。母版左侧导览栏与顶部「数据源」条已合并为一条整宽吸顶顶栏,导览按钮改横向段控,主区因此独占整页宽度。实现要点:.side 仅 display:none 隐藏、保留在 DOM 中(母版脚本仍要往 #side-ft 写数据卡,删掉会报 null);原 .nav 节点被整体搬移进顶栏,b.onclick 与 .on 态切换原样生效。顶栏分三段:
- ① 数据源:品牌「价格看板」+ 店铺下拉 + 数据区间文本(只读)+「更新分析数据」按钮。
- ② 导览段控:概览 · 商品ID查询 · 折扣预警 · 订单明细(
.icemoji 以 CSS 隐藏,纯文字)。 - ③ 统计 chips:报表份数 · 合并单数 · 有成交日期 · 无成交时间(用于与后台对账)· 去重条数 · 回填格数 · 变更单数 + 来源报表浮层。
- 吸顶时:顶栏
sticky top:0铺满整宽,并把看板筛选卡的top顶到顶栏下方(用 ResizeObserver 同步条高),两层连成一体、不重叠不漏缝;毛玻璃底避免透视。 - 宽度自适应:≥1366px 单行(高约 54px);更窄或 chips 增多时自动折行,不影响功能。
- 日期框为自定义日历:只有"有数据的日期"可点,无数据日期灰色划掉、点不动(表头条「数据区间」与看板顶部「时间筛选」共用同一套日历)。
- 点「更新分析数据」:运行时自动判路 ——
window.parent !== window(被外壳嵌住)时发pdd-wb-update交给外壳重算;顶层直接打开时直连 8770(服务器已开 CORS + OPTIONS 预检)重算并跳转。 - 首屏与「更新」解耦:首屏永远是内嵌 DATA 快照,离线可用;只有点「更新」才需要 8770。顶层打开且 8770 未启动时,按钮会明确提示「首屏可正常查看,更新需本地服务」,不会白屏。
本地网页工作台(可选,非必须)
workbench_server.py(端口 8770,包内自带,静态资源走包内 web/)与 CLI 共用同一套 workbench_core.py,二者不冲突。改动 workbench_core.py 后必须重启该服务,浏览器强刷无效(服务进程启动时已把 CSS/JS 常量读进内存)。
- 启动(在希望作为数据目录的位置执行,或先设
PDD_WORKBENCH_DIR):"$PY" "$SKILL_DIR/workbench_server.py"→ 浏览器打开http://localhost:8770/ - 端口被占用时程序会提示已有实例在运行,直接访问该地址即可。
注意事项
- 行日期:取自
订单成交时间/支付时间前 10 位(与生成器一致)。 - 中文路径无碍:CLI 与核心脚本均已处理;
--list输出原始中文,直接回传即可。 - 不要改母版逻辑:
workbench_template.html是数据驱动母版,只换内嵌DATA块;新增分析能力请走原看板项目。 - 版本:本 skill 为自包含发布版;若包内
workbench_core.py/workbench_template.html有更新,两者需成对替换(core 与母版的 DATA 结构耦合)。 - 发布身份(别串号):本包的身份是
pdd-workbench(name/slug 同名)。订单价格看板是另一个 skill(pdd-order-price-dashboard,包内是build_dashboard.py+chart.umd.min.js)。两者内容与 slug 完全不同,不要把这个包上传到价格看板的 skill 条目上,否则会把那个条目顶掉、导致@skill:调用时张冠李戴。
微信扫一扫