# 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`