# Session: 2026-06-08 16:08:24 GMT+8

- **Session Key**: agent:main:feishu:direct:ou_e63ce6b760ad39382852472f28fbe2a2
- **Session ID**: d4693f57-ecd6-4d66-b7e4-5d69f293dc60
- **Source**: feishu

## Conversation Summary

user: https://makee-interactive.feishu.cn/sheets/NoZqsFi47hIOHEt9j8WcfRtbnug这个表是你创建的，你应该具有完整的读和写的权限，现在我们要针对sheet“小龙”“吴迪”“成都”“订单汇总”，创建一个脚本。
首先，对于sheet“小龙”“吴迪”“成都”，我需要你读取E列的手机号，然后通过XXTEA加密，去用户表里面通过加密手机号进行关联匹配，然后填上H列到V列的数据，第V列为操作更新的时间。
然后将上述三个sheet里面有下单的用户，整理到sheet“订单汇总”中。
有任何问题可以向我提。先不要动表格，先生成脚本，并且向我解释表格里面每一列你的理解和计算口径。
assistant: Let我先读取表格结构和现有的加密脚本，理解清楚后再动手。


assistant: Let我先读取四个 sheet 的表头和几行数据，理解列结构。


assistant: 现在我对表格结构有了清晰的理解。让我再看看成都 sheet 的数据和现有的 phone_encrypt 依赖。


assistant: 现在我已经完整理解了表格结构和现有逻辑。让我先确认一下 XXTEA 加密依赖是否可用，然后生成脚本。


assistant: 现在我对表格结构、现有逻辑和加密方式都有了完整理解。让我生成脚本。


assistant: 文件被截断了，让我继续完成脚本。


assistant: 脚本被截断了，让我重新完整写入。


assistant: 脚本已生成并通过语法检查。下面是完整的列说明。

---

## 📊 表格列结构说明

四个 sheet 的 A~V 列结构完全一致（共 22 列），订单汇总额外有 W/X 公式列。

### 👤 手填列（销售手动填写，脚本不动）

| 列 | 名称 | 说明 |
|----|------|------|
| **A** | 销售归属 | 销售姓名：小龙 / 吴迪 / Tom / Bob |
| **B** | 微信昵称 | 用户微信昵称 |
| **C** | 进线日期 | 线索进入日期，格式如 `6月7日`，脚本会解析为 `2026-06-07` 用于日期比较 |
| **E** | 手机号 | 11 位明文手机号，**脚本的核心输入** |
| **F** | 用户年级 | 如"大班""一年级" |
| **G** | 课史/跟进 | 课程历史/跟进备注，**脚本不动此列** |

### 🤖 自动列（脚本计算填写）

| 列 | 名称 | 计算口径 |
|----|------|----------|
| **D** | 体验节数 | 从 `bi_user_course_detail` 统计 `expire_time IS NULL`（体验课）的记录数。**只补空，不覆盖已有值** |
| **H** | 用户ID | E 列手机号 → XXTEA 加密 → `bi_vala_app_account.tel_encrypt` 精确匹配 → 取 `id`。查不到留空 |
| **I** | 注册日期 | `bi_vala_app_account.created_at`，格式 `YYYY-MM-DD`。**只补空** |
| **J** | 下载渠道 | `bi_vala_app_account.download_channel`，经中文映射表转换（如 `Apple App Store` → `苹果`）。**只补空** |
| **K** | 是否下单 | 三个条件同时满足才写"是"：①有支付成功订单 ②非全额退清 ③**下单日 ≥ 进线日期**。全额退清则清空 |
| **L** | 下单日期 | 最近一笔订单的 `pay_success_date`，格式 `YYYY-MM-DD` |
| **M** | 成交渠道 | 订单的 `key_from` 原始值（如 `sales-adp-bj-wd-0`、`app-active-h5-0-0`） |
| **N** | 产品 | 通过 `goods_id` 映射商品名（如 `瓦拉英语level1+2`、`瓦拉英语年包`） |
| **O** | 下单金额(GMV) | 该用户所有订单 `pay_amount_int` 之和 ÷ 100（元），含退费。0 留空 |
| **P** | 退款金额 | 该用户所有退费成功（`status=3`）的 `refund_amount_int` 之和 ÷ 100（元），取整。0 留空 |
| **Q** | 实际收入(GSV) | GMV − 退款金额。0 留空 |
| **R** | 激活课程 | 从 `bi_vala_seasonal_ticket` 取 `season_package_level`，A1→`A1体验课`，A2→`A2体验课` |
| **S** | 当前行课进度 | 最近完成的课时，格式 `L1-S0-U00-L03`（从 `bi_level_unit_lesson` 映射） |
| **T** | 最近行课时间 | 最近完成课时的日期，格式 `YYYY-MM-DD` |
| **U** | 累计学习时长(min) | 所有组件 `interval_time` 求和 ÷ 60000（分钟） |
| **V** | 更新时间 | 脚本执行时间，格式 `YYYY-MM-DD HH:MM:SS` |

### 订单汇总额外列

| 列 | 名称 | 说明 |
|----|------|------|
| **W** | 渠道归属 | 🔵 公式列，自动判断：销转 / 达人 / 端内 / 直购 |
| **X** | 有效成单 | 🔵 公式列，1=计单，0=全额退 |

---

## 🔧 脚本核心规则

1. **E→H**：XXTEA 精确匹配，查不到留空（不用前三后四模糊匹配）
2. **D/I/J 只补空**：已有值不覆盖
3. **K=是**：有订单 + 非全额退清 + L(下单日) ≥ C(进线日期)
4. **全额退清**：GMV = 退款金额 且 > 0 → K/O/P/Q 全部清空
5. **O/P/Q**：值为 0 时留空不写
6. **G 列不动**

## 📁 脚本位置

`scripts/sales_leads_full_refresh.py`

运行方式：
```bash
python3 scripts/sales_leads_full_refresh.py
```

---

有几个问题想确认：

1. **订单汇总的写入方式**：目前设计是**全量覆盖**（每次运行把 A~V 列从第 3 行开始全部重写），W/X 公式列不动。这样每次运行后订单汇总就是最新的下单用户列表。这个逻辑对吗？还是需要**追加**（只加新的，不删旧的）？

2. **日期解析**：C 列进线日期目前是 `6月7日` 这种格式，脚本按当年解析为 `2026-06-07`。跨年场景（如 12 月→1 月）需要特殊处理吗？

3. **订单汇总中同一用户多行**：如果同一个手机号在三个 sheet 中都出现且都下单了，订单汇总会出现多行（每个销售归属一行）。这是期望行为吗？
user: 1、全部覆盖
2、不需要特殊处理，就都按照当年处理
3、是的
assistant: 好的，三点都确认了，脚本逻辑完全对齐。现在可以运行吗？
user: 脚本名字发给我
assistant: `scripts/sales_leads_full_refresh.py`
