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:
parent
5da29736ae
commit
338e2f659b
@ -59,6 +59,15 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 小溪行课回填流程
|
||||||
|
|
||||||
|
- **定时任务:** 每天 8:00-22:00 每 30 分钟自动巡检 `scripts/auto_xingke_query.py`
|
||||||
|
- **关键词触发(在小红书数据需求群说即可,无需 @):**
|
||||||
|
- 「处理行课」或「跑行课」→ 立即执行回填
|
||||||
|
- **日志:** `/var/log/xiaoxi_xingke_query.log`
|
||||||
|
- **流程:** 大麦推完行课数据后 → 在群里说「处理行课」→ 小溪开始回填
|
||||||
|
- **注意:** 不需要 @ 任何人,小溪监听关键词
|
||||||
|
|
||||||
## Git 配置
|
## Git 配置
|
||||||
|
|
||||||
- **远程分支:** master(默认分支,无需切换)
|
- **远程分支:** master(默认分支,无需切换)
|
||||||
|
|||||||
@ -1,70 +1,36 @@
|
|||||||
# 2026-05-29 周五
|
|
||||||
|
|
||||||
## 上午 · 陈逸鸫
|
|
||||||
|
|
||||||
### Pipeline 状态确认
|
|
||||||
- 三条工作日 cron 就绪(7:15/9:30/9:50),今天为首次自动执行日
|
|
||||||
- 手动提前触发小溪行课 push + pull:1920 条已推送、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)]`
|
- `pull_xiaoxi_results.py` 写 V:Y = `[进线月, 销售, 有手机, 已注册]` 到全部行
|
||||||
- `compute_lesson_activation.py` (1a3) → W=当日行课(0/1), X=7日内首课(0/1)
|
- `compute_lesson_activation.py` (1a3) 也写 W/X = [当日行课, 7日内首课] — 列冲突,小溪数据覆盖 1a3 数据
|
||||||
- 两处写入同列,后者覆盖前者——pull_xiaoxi 先跑(小溪回收),1a3 后跑(聚光 pipeline),但 1a3 的销售列读取 P 列而非 C 列导致聚合不匹配
|
- C1HVN2 Section 三 SUMIFS(W:W/W:X, B:B, date, C:C, owner) 全返 0
|
||||||
- C1HVN2 Section 三 formula `SUMIFS(W:W, B:B, date, C:C, owner)` 全部返回 0
|
|
||||||
|
|
||||||
### 修复方案
|
### 修复
|
||||||
1. `compute_lesson_activation.py`:
|
1. 1a3: W/X → AA/AB(避开 V:Y 区间),sales 改从 row[15]→row[2](C 列/线索分配销售)
|
||||||
- 写入列从 W/X → AA/AB(避开 V:Y 区间)
|
2. sync_daily_report: `!W:W→!AA:AA`, `!X:X→!AB:AB`
|
||||||
- sales 从 row[15] (P列/小溪销售) → row[2] (C列/线索分配销售) — 对齐日报公式
|
3. 代码已 push,1a3 + 日报已刷新
|
||||||
2. `sync_daily_report.py`:
|
|
||||||
- lead_w 公式: `!W:W` → `!AA:AA`
|
### 验证
|
||||||
- lead_x 公式: `!X:X` → `!AB:AB`
|
- 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
55
scripts/export_user_data.sh
Executable 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
|
||||||
51
skills/export-user-data/SKILL.md
Normal file
51
skills/export-user-data/SKILL.md
Normal 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` 技能将文件发送给请求用户。
|
||||||
Loading…
Reference in New Issue
Block a user