ai_member_xiaoban/skills/full-data-refresh/SKILL.md
xiaoban 36853594c5 fix: GSV聚合修复 — 订单汇总改用aggregate_valid_orders累加多笔有效订单
- 新增 aggregate_valid_orders() 函数:同一账户多笔有效订单 GSV/GMV/退款累加
- 订单号取未退款那笔(多笔未退款取最新)
- 产品列多单用+拼接
- Step 4 线索绑单仍用 pick_valid_order() 不变
- 修复 13 个账户漏 GSV ¥23,185 的问题
2026-06-17 22:16:00 +08:00

8.9 KiB
Raw Blame History

name description metadata
full-data-refresh 细水入海 — 销售数据全量刷新技能。 从飞书销售三表(小龙/吴迪/成都)读取手机号 → XXTEA 加密匹配 PG 数据库 UID → 查询订单/退费/行课数据 → 回填销售表各列 → 汇总写入订单汇总。 触发词细水入海、全量刷新、跑全量、full refresh、刷新销售数据
openclaw
requires categories
tools
exec
data
sales
feishu

细水入海 — 销售数据全量刷新

版本: v2.12026-06-17 · GSV 聚合修复) 协作契约: xhs-ark-dashboard/docs/bot-full-refresh-v2.md 大麦侧主文档: xhs-ark-dashboard/docs/damai-full-refresh-skill.md

v2.1 变更2026-06-17

  • GSV 聚合修复: 订单汇总 Step 5 改用 aggregate_valid_orders() 替代 pick_valid_order()
    • 同一账户多笔有效订单 → GSV/GMV/退款 全部累加(不再只取最新一笔)
    • 订单号取未退款那笔(多笔未退款取最新)
    • 产品列多单用 + 拼接
    • 线索绑单Step 4仍用 pick_valid_order() 不变

核心架构规则(写死,不可漂移)

1. Step 4 + Step 5 同一 run · 共用数据源

  • 三表写入Step 4和订单汇总重建Step 5同一个 sales_leads_full_refresh.py 执行中完成
  • 共用 pick_valid_order() 函数 + 同一份 db_info 数据
  • 禁止分两次 run 或使用不同数据源

2. 汇总 W = 三表 Xgate 同源)

  • 订单汇总 W 列取的是 valid_order["trade_no"],与三表 X 列写入的值完全一致
  • 不是 merge 时再查 DB 写 W
  • 唯一真源 = 三表 Y=1 gate 的 unique X

3. 2smjwAclear → gate 全量覆盖

  • clear_summary_sheet() 清空旧数据区
  • 再 gate 全量重建:从三表 Y=1 行收集 unique X → 每 X 一行
  • 不保留旧 W,不 append
  • 同 X 多进线 → 只保留行号最小的 1 行

4. 「保留 X/Y」只三表 mirror不含汇总

  • 三表 D/I/J 只补空、G 列不动 → 这些是 mirror 规则
  • 汇总 2smjwA 永远全量清空重写,不保留任何旧行

5. 线索 1进线=1行 · 只绑有效单

  • 三表永远 1 次进线 = 1 行,不因多单拆行
  • Y=1 时 K/L/X/N/O/P/Z 全写有效主单真实值
  • 已退单不写旧 X/Lpick_valid_order 自动跳过全额退 + K<C 的订单)
  • 无有效单 → Y=0K/L/X 留空

6. 完成后群回「full_refresh 完成」

  • 在数据更新群(oc_4687e8f9f38e4f5c819238c78f97ae44)回复
  • 附带验证结果gate X 数 = 汇总 W 数

验收标准

Cursor 侧跑(大麦可自测):

  • audit_xishui_orders.py --strict
  • audit_lead_primary_order_bind.py

PASS 条件:

  • unique X 三表 = 汇总(当前 406=406
  • 绑单审计 E1E9 全部 0
  • 孤儿 X有 X 但 Y≠1= 0

脚本位置

所有脚本位于大麦 workspace/root/.openclaw/workspace-xiaoban/scripts/

脚本 功能 覆盖范围
bot_sales_step2_refresh.py S2 刷新手机号→UID→数据回填 销售三表 D/H/I/J + K-U + X/Y/Z 列
sales_leads_full_refresh.py 全量刷新S2 + 订单汇总gate 全量覆盖) 销售三表 + 订单汇总 sheet
refresh_order_summary.py 仅订单汇总镜像刷新 订单汇总 sheet A-W 列
audit_lead_primary_order_bind.py 线索绑单审计 交叉验证用

依赖脚本:phone_encrypt.pyfeishu_sheet_utils.py

飞书表格配置

  • Spreadsheet Token: NoZqsFi47hIOHEt9j8WcfRtbnug
  • 销售三表:
    • qJF4I — 小龙 (A1:Z1200)
    • f975f0 — 吴迪 (A1:Z700)
    • qJF4J — 成都 (A1:Z2500)
  • 订单汇总: 2smjwA
  • 过程数据: 3aOvV6
  • 凭据目录: /root/.openclaw/credentials/xiaoxi

销售表列结构 (A-Z)

字段 说明
A 销售归属 小龙/吴迪/Tom/Bob
B 微信昵称
C 进线日期 格式: M月D日 或 M月D日 HH:MM:SS
D 体验节数 只补空,不覆盖已有值
E 手机号 11位明文
F 用户年级
G 课史/跟进 不动
H 用户ID (UID) XXTEA 精确匹配
I 注册日期 只补空
J 下载渠道 只补空
K 下单日期 有效主单的下单时间
L 成交渠道 有效主单的 key_from
M 产品
N GMV 有效主单的实付金额
O 退款金额 有效主单的退款
P GSV 有效主单的 GSV
Q 激活课程
R 行课进度
S 最近行课时间
T 学习时长(分钟)
U 更新时间
V 微伴 Cursor 维护,勿覆盖
W 时序公式 Cursor 维护,勿覆盖
X 订单号 仅 Y=1 时写入有效主单号
Y 有效订单 1=是, 空=否
Z 渠道归属 端内/销转/达人/直购

数据规则

匹配规则

  1. E→H: 11位手机号 → XXTEA 加密 → bi_vala_app_account.tel_encrypt 精确匹配,查不到留空
  2. H→D/I/J: 只补空,不覆盖已有值
  3. G 列: 不动
  4. V/W 列: 不覆盖Cursor 维护)

有效订单判定 (Y=1)

  • pick_valid_order(): GSV>0 · 非全额退 · K≥C
  • 一手机多单 → 取最新一笔满足门禁的有效单
  • 已退单不出现在线索行

全额退清处理

  • 所有订单都退费 (GMV == 退款) → 该单不参与有效单选取

订单汇总进表条件

  • Y=1已在三表筛选汇总默认全是有效单
  • GSV>0 · 非全额退 · K≥C
  • 同一账户多笔有效订单 → GSV/GMV/退款 累加,订单号取未退款那笔v2.1 修复)
  • 同 X 多进线 → 汇总只保留 1 行

渠道归属分类 (Z列) [王虹茗确认 2026-06-15]

基于 key_fromL列成交渠道精确分类

分类 匹配规则
端内 精确匹配 app-active-h5-0-0 / app-sales-bj-qhm-0 / app-sales-bj-wd-0
销转 sales-adp- 开头
达人 newmedia-daren- 开头,或精确匹配 newmedia-dianpu-wwxx-0-0
直购 其余全部dianpu不含wwxx / partner / stream / miniprogram / jingxuan / 空 / shuadan 等)

此规则同时适用于线索表 Z 列和订单汇总 V 列(渠道归属)。

执行流程

模式一:仅 S2 刷新(推荐日常使用)

cd /root/.openclaw/workspace-xiaoban && python3 scripts/bot_sales_step2_refresh.py
  • 刷新销售三表的 D/H/I/J + K-U + X/Y/Z 列
  • 不写订单汇总(订单汇总由后续步骤处理)
  • 日志: /var/log/xiaoxi_step2_refresh.log

模式二全量刷新S2 + 订单汇总)← 推荐

cd /root/.openclaw/workspace-xiaoban && python3 scripts/sales_leads_full_refresh.py
  • Step 4: 刷新销售三表(同 S2
  • Step 5: gate 全量覆盖订单汇总
  • 日志: /var/log/xiaoxi_full_refresh.log

模式三:仅订单汇总刷新

cd /root/.openclaw/workspace-xiaoban && python3 scripts/refresh_order_summary.py
  • 从销售三表筛选有效订单 → 全量覆盖订单汇总 sheet
  • 日志输出到 stdout

执行规范

  1. 执行前确认: 告知用户将执行的操作范围S2刷新 / 全量 / 仅汇总)
  2. 执行中监控: 关注脚本输出,检查各步骤的行数和匹配率
  3. 执行后验证:
    • 检查日志末尾确认 完成标记
    • audit_lead_primary_order_bind.py 确认 E1E9 全 0
    • 确认 gate X = 汇总 W当前 406=406
  4. 执行后通知: 群回「full_refresh 完成
  5. 权限遵守: 仅执行业务负责人(陈逸鸫、刘庆逊、李应瑛、刘彦江)的刷新请求

订单汇总列结构 (A-W, 23列)

字段 说明
A-U 镜像三表 与销售三表 A-U 列一致
V 渠道归属 端内/销转/达人/直购
W 订单号 = 三表 Xgate 同源)

2026-06-16 新契约:去掉原 W「有效成单」列订单号从 X 左移到 W。汇总唯一真源 = 三表 Y=1 gate 的 unique X。全量清空重写不保留旧行。

常见问题

问题 原因 处理
手机号匹配率低 手机号未注册或格式不对 检查 E 列是否为 11 位纯数字
写入失败 code≠0 API 限流或权限问题 脚本自带重试,检查飞书应用权限
汇总多 X merge 未全量覆盖 确认 Step 5 走 gate 全量重建,非 DB 扩行
孤儿 X有 X 但 Y≠1 旧数据残留 full_refresh 后自动清零
体验节数为空 bi_user_course_detail 无记录 正常,该用户未激活体验课

注意事项

  • 脚本使用小溪 (xiaoxi) 的飞书应用凭据,不要修改 CRED_DIR
  • 数据库连接使用 ai_member 只读账号,安全
  • 飞书 API 单次写入上限 5000 格,feishu_sheet_utils.py 已自动分批处理
  • 执行时间约 2-5 分钟,取决于数据量
  • secrets.env 需要软链接:ln -sf /root/.openclaw/workspace/secrets.env /root/.openclaw/workspace-xiaoban/secrets.env