feat: 导出行课数据封装为 skill + CLI 参数支持

- scripts/export_user_data.sh: 便捷 wrapper,内置数据库凭证
- skills/export-user-data/SKILL.md: 技能定义
- git_repos/llm_offline_production/export_user_id_data.py: main() 加 argparse,支持 --user-id/--user-ids/--account-ids/--output-dir,保持向后兼容
This commit is contained in:
xiaoban 2026-05-29 17:07:54 +08:00
parent 5da29736ae
commit 338e2f659b
4 changed files with 147 additions and 66 deletions

View File

@ -59,6 +59,15 @@
---
## 小溪行课回填流程
- **定时任务:** 每天 8:00-22:00 每 30 分钟自动巡检 `scripts/auto_xingke_query.py`
- **关键词触发(在小红书数据需求群说即可,无需 @**
- 「处理行课」或「跑行课」→ 立即执行回填
- **日志:** `/var/log/xiaoxi_xingke_query.log`
- **流程:** 大麦推完行课数据后 → 在群里说「处理行课」→ 小溪开始回填
- **注意:** 不需要 @ 任何人,小溪监听关键词
## Git 配置
- **远程分支:** master默认分支无需切换

View File

@ -1,70 +1,36 @@
# 2026-05-29 周五
## 上午 · 陈逸鸫
### Pipeline 状态确认
- 三条工作日 cron 就绪7:15/9:30/9:50今天为首次自动执行日
- 手动提前触发小溪行课 push + pull1920 条已推送、782 条 ID 查询、30 条待小溪处理
### 成都 UID→销售修复
- 修改 `pull_xiaoxi_results.py``load_chengdu_uid_owner()` 增加 phone→sales 兜底映射
- 成都跳过从 38 降到 34找回 4 条),仍有 34 条待排查
### ERCFsFo 403 写权限
- `sync_master_xiaoxi.py` 写销转客户主表 `ERCFsFo4MhnF0ytGeCrc0Bb8n5f` 的"小溪学情"子表时报 403
- CYFTsu生产表读写正常ERCFsFo 能读不能写user/bot 均 403
- 陈逸鸫说"之前都开了权限",需进一步确认飞书 UI 中该表的协作权限
### 微伴今日更新
- 收到微伴 xlsx执行 `run_morning_weiban_from_dm.sh` 完成
- 1a(43.5s) → 1a2(20.6s) → 2b(73.6s) → 4a(11.8s) 全部 OK
- 日报 C1HVN2 一/三/四已刷新,二跳过(等聚光)
- 聚光 1b+1c 等 9:30 cron
### 其他待办
- xhs-tech-dashboard 需 clone URL当前为 tar 解压,非 git 仓库)
- Base 字段手动添加bot 权限不足)
- C1HVN2 Row 18 企微新增 TEXT 格式清除
- funnel-daily 看板 snapshot 3 个 bug
- L1-S1-U1《秘密基地》5 张投放底图
- 漏斗看板发布方案bot 不支持妙搭 html-publish
## 上午追加 · 陈逸鸫
### 小溪行课提醒
- push 后 5250 条待处理(含 6005 条 ID 查询)+ 30 条其他状态
- 已通过 bot 在行课群 @小溪 提醒chat: oc_1b01b6f076d39f17be75ca52e585125f
### 日报 C1HVN2 格式修复
- 问题指标列A18:A22和销售列A26:A29无 hAlign依赖旧格式残留导致对齐不一致
- 修复A列统一左对齐新增 `label` 样式),数据区统一居中;`num`/`pct`/`money`/`roi` hAlign 2→1
- 已推送 commit重新应用样式块全部 OK
### lark-cli OAuth 凭证修复
- 陈逸鸫推送了 `scripts/check_lark_cli.sh`damai-runbook §3.1
- PATH 已切到 npm lark-cli: `/root/.nvm/versions/node/v24.14.0/bin/lark-cli`
- **阻塞**`auth login` 无法在 OpenClaw exec 上下文中跑——npm lark-cli 检测到 OpenClaw 环境直接拒绝;且服务器 keychain 已损坏导致 `config bind`/`config init` 均失败
- **结论**OAuth 流程需陈逸鸫 SSH 手动执行(不在 OpenClaw 下)
1. `lark-cli auth login --domain sheets,drive --no-wait --json`
2. verification_url → 浏览器授权
3. `lark-cli auth login --device-code <code>`
4. `lark-cli auth status` 确认 user tokenStatus=valid
5. `lark-cli sheets +write ... --as user` 探针测试
- 替代方案:陈逸鸫 Mac 上 user token 已有sync_master_xiaoxi 在 Mac 跑(今天已补 1893 条)
## 上午追加 · 陈逸鸫 — 日报 Section 三修复
## 上午 · 陈逸鸫 — 日报 Section 三修复(完成)
### 根因V:Y 列冲突
- `pull_xiaoxi_results.py` → V2:Y{end} = `[进线月(主表), 销售, 有手机(1), 已注册(1)]`
- `compute_lesson_activation.py` (1a3) → W=当日行课(0/1), X=7日内首课(0/1)
- 两处写入同列后者覆盖前者——pull_xiaoxi 先跑小溪回收1a3 后跑(聚光 pipeline但 1a3 的销售列读取 P 列而非 C 列导致聚合不匹配
- C1HVN2 Section 三 formula `SUMIFS(W:W, B:B, date, C:C, owner)` 全部返回 0
### 根因
- `pull_xiaoxi_results.py` 写 V:Y = `[进线月, 销售, 有手机, 已注册]` 到全部行
- `compute_lesson_activation.py` (1a3) 也写 W/X = [当日行课, 7日内首课] — 列冲突,小溪数据覆盖 1a3 数据
- C1HVN2 Section 三 SUMIFS(W:W/W:X, B:B, date, C:C, owner) 全返 0
### 修复方案
1. `compute_lesson_activation.py`
- 写入列从 W/X → AA/AB避开 V:Y 区间)
- sales 从 row[15] (P列/小溪销售) → row[2] (C列/线索分配销售) — 对齐日报公式
2. `sync_daily_report.py`
- lead_w 公式: `!W:W``!AA:AA`
- lead_x 公式: `!X:X``!AB:AB`
### 修复
1. 1a3: W/X → AA/AB避开 V:Y 区间sales 改从 row[15]→row[2]C 列/线索分配销售)
2. sync_daily_report: `!W:W→!AA:AA`, `!X:X→!AB:AB`
3. 代码已 push1a3 + 日报已刷新
### 验证
- 5/28 当日行课=0正确当天 31 条线索没有同日行课(全局 445 条仅 4 条,分布在 4/24, 5/5, 5/20, 5/21
- 5/20 Tom当日行课=1 ✓,链路验证通过
- 7日内首课公式 5/20 显示 0 但 AB=1飞书公式缓存需手动重算
### 注意7日内首课 PG 查询只查同日
- `query_pg_activity` 的 pairs 只含 (uid, lead_date),未包含 lead_date+1~+7
- `same_day_set` 因此只有同日数据 → W ≡ X
- 这是遗留 bug需要单独修扩展 pairs + PG 查询范围)
## 上午 · 陈逸鸫 — 死循环教训
**现象**:修改代码时反复 read 同一文件行(十几次)不执行 exec陷入验证死循环。
**根因**:每次 read 返回内容 → 认为"还需确认" → 再 read → 循环。
**对策/规则**
- 同一文件 read 超过 3 次仍未 exec → 必须停止验证,直接执行
- 用户如果看到连续 2+ 轮雷同输出无进展 → 直接打断说"别读了,跑代码"
## 聚光 cron
- 已从 9:30 改为 9:00工作日

55
scripts/export_user_data.sh Executable file
View File

@ -0,0 +1,55 @@
#!/bin/bash
# 导出行课数据 wrapper 脚本
# 用法: ./scripts/export_user_data.sh --user-id 33123
# ./scripts/export_user_data.sh --user-ids 33123,33124
# ./scripts/export_user_data.sh --account-ids 2148
# ./scripts/export_user_data.sh --user-id 33123 --output-dir ./my_output/
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORKSPACE="$(dirname "$SCRIPT_DIR")"
# 数据库凭证(从 secrets.md
export MYSQL_HOST="${MYSQL_HOST:-bj-cdb-8frbdwju.sql.tencentcdb.com}"
export MYSQL_USERNAME="${MYSQL_USERNAME:-read_only}"
export MYSQL_PASSWORD='fdsfiidier^$*hjfdijjd232'
export MYSQL_PORT="${MYSQL_PORT:-25413}"
export MYSQL_HOST_online="${MYSQL_HOST_online:-bj-cdb-dh2fkqa0.sql.tencentcdb.com}"
export MYSQL_USERNAME_online="${MYSQL_USERNAME_online:-read_only}"
export MYSQL_PASSWORD_online='fsdo45ijfmfmuu77$%^&'
export MYSQL_PORT_online="${MYSQL_PORT_online:-27751}"
export PG_DB_HOST="${PG_DB_HOST:-bj-postgres-16pob4sg.sql.tencentcdb.com}"
export PG_DB_PORT="${PG_DB_PORT:-28591}"
export PG_DB_USER="${PG_DB_USER:-ai_member}"
export PG_DB_PASSWORD='LdfjdjL83h3h3^$&**YGG*'
export PG_DB_DATABASE="${PG_DB_DATABASE:-vala}"
export ES_HOST="${ES_HOST:-es-7vd7jcu9.public.tencentelasticsearch.com}"
export ES_PORT="${ES_PORT:-9200}"
export ES_SCHEME="${ES_SCHEME:-https}"
export ES_USER="${ES_USER:-elastic}"
export ES_PASSWORD='F%?QDcWes7N2WTuiYD11'
# 默认输出目录
DEFAULT_OUTPUT="${WORKSPACE}/output"
mkdir -p "$DEFAULT_OUTPUT"
# 如果未指定 --output-dir自动加默认值
HAS_OUTPUT=false
for arg in "$@"; do
if [[ "$arg" == "--output-dir" ]]; then
HAS_OUTPUT=true
break
fi
done
PYTHON_SCRIPT="${WORKSPACE}/git_repos/llm_offline_production/config_user_data_extract_and_analyze/export_user_id_data.py"
if [ "$HAS_OUTPUT" = false ]; then
exec python3 "$PYTHON_SCRIPT" --output-dir "$DEFAULT_OUTPUT" "$@"
else
exec python3 "$PYTHON_SCRIPT" "$@"
fi

View File

@ -0,0 +1,51 @@
---
name: export-user-data
description: |
导出一个或多个角色的全量行课数据(音频、互动组件、课程巩固、单元挑战、单元总结、汇总统计)。
支持角色ID或账户ID批量导出输出多 sheet Excel 文件。
触发词:导出角色/行课数据、导出用户数据、export user data。
---
# 导出角色行课数据
## 前置条件
- wrapper 脚本已配置数据库凭证(`scripts/export_user_data.sh`
- 依赖:`python3`, `pymysql`, `psycopg2`, `pandas`, `requests`
## 执行方式
```bash
cd /root/.openclaw/workspace-xiaoban
./scripts/export_user_data.sh <参数>
```
## 参数
| 参数 | 说明 | 示例 |
|------|------|------|
| `--user-id <id>` | 单个角色ID | `--user-id 33123` |
| `--user-ids <id1,id2>` | 多个角色ID逗号分隔 | `--user-ids 33123,33124` |
| `--account-ids <id1,id2>` | 多个账户ID逗号分隔 | `--account-ids 2148,2149` |
| `--output-dir <dir>` | 输出目录(默认 `output/` | `--output-dir /tmp/` |
三种模式互斥,只能传一种 ID 参数。
## 输出
- 默认输出到 `output/` 目录
- 单角色:`角色id_{ID}_导出时间_{YYYYMMDD}.xlsx`
- 账户模式:`账户id_{AID}_角色id_{UID}_导出时间_{YYYYMMDD}.xlsx`
## Excel 包含的 Sheet
1. 全部音频数据ES `user-audio` 索引)
2. 互动组件学习记录PG 8张分表 + MySQL 组件配置)
3. 课程巩固记录PG `user_unit_review_question_result`
4. 单元挑战记录PG `user_unit_challenge_question_result`
5. 单元总结记录PG
6. 汇总统计(组件类型统计 / 知识点统计 / 单元时长统计)
## 完成后
如果是从飞书对话触发的导出,导出完成后通过 `lark-send-message-as-bot` 技能将文件发送给请求用户。