From f39592fcd39e3ab79083866dd2ba38345cb417bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=BA=AA?= Date: Sat, 13 Jun 2026 08:00:01 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20=E6=AF=8F=E6=97=A5=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=A4=87=E4=BB=BD=20-=202026-06-13=2008:00:01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- memory/2026-06-12.md | 72 ++++++++++ scripts/refresh_direct_sheet.py | 218 +++++++++++++++++++++++++++++++ scripts/refresh_order_summary.py | 43 +++++- 3 files changed, 331 insertions(+), 2 deletions(-) create mode 100644 memory/2026-06-12.md create mode 100644 scripts/refresh_direct_sheet.py diff --git a/memory/2026-06-12.md b/memory/2026-06-12.md new file mode 100644 index 0000000..8427a93 --- /dev/null +++ b/memory/2026-06-12.md @@ -0,0 +1,72 @@ +# 2026-06-12 工作日志 + +## 陈逸鸫 - 3月拿单 UID/手机清单核对 + +收到陈逸鸫从Cursor发来的3月ROI被拿掉订单清单,分A/B/C三组共20笔,需要DB核对。 + +### 小龙表读取 +- 小龙表(qJF4I)共250行,但目标用户均不在该表中(通过昵称、UID、手机号搜索均未命中) + +### Group A (有UID,10笔) - DB核对结果 +| # | 昵称 | UID | 手机(解密) | C日期 | DB L日期 | L≥C | GMV | GSV | 状态 | +|---|------|-----|-----------|-------|---------|-----|-----|-----|------| +| 1 | 卢彩苗 | 23814 | 13702058482 | 3/1 | 4/17 | ✓ | 1999 | 1999 | order_status=3, sales-adp-bj-jxl-0 | +| 2 | 万万紫 | 17783 | 13702771124 | 3/8 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 3 | 哼哼&哈哈 | 16144 | 13327951305 | 3/1 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 4 | 毅毅 | 16078 | 19091764172 | 3/1 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 5 | 雪珂💗 | 7319 | 13672785535 | 3/6 | 3/6 | ✓ | 1999 | 1999 | 万物店铺, 另有2025-11-14已退单 | +| 6 | 小乖大人 | 16158 | 13944890221 | 3/1 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 7 | 潘潘 | 16150 | 18610935696 | 3/1 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 8 | 张滢ya | 17894 | 13799768340 | 3/7 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 9 | sallywu | 17816 | 15998103065 | 3/7 | 无订单 | - | 0 | 0 | DB无任何订单 | +| 10 | 🦁萨摩 | 21858 | 13685553716 | 3/8 | 4/8 | ✓ | 1999 | 1999 | 达人-学霸三人行 | + +### Group B (有手机,4笔) - phone_encrypt查UID +| # | 昵称 | 手机 | 加密结果 | DB匹配 | +|---|------|------|---------|--------| +| 11 | 潘提提 | 13427741613 | IiShdIaiY1oy7B_Xn4EH3g.. | 无匹配 | +| 12 | 狸小路 | 18622850293 | YPAQ-740vKwxroqZGkeGyQ.. | 无匹配 | +| 13 | 希小希 | 18086665321 | c8zfpqBrN1nikMkwAj64aQ.. | 无匹配 | +| 14 | 曼 | 13520255515 | NBVtGuxEge7f7hdkyK3y7Q.. | 无匹配 | + +### Group C (无手机/UID,6笔) - DB反查 +| # | 昵称 | C日期 | 匹配UID | 手机 | DB L | L≥C | 备注 | +|---|------|-------|---------|------|------|-----|------| +| 15 | Rachel | 3/5 | 10994 | 13510564547 | 3/7 | ✓ | sales-adp-bj-jxl-0, GMV=1999 | +| 16 | soul | 3/2 | 17387 | 15640464255 | 3/12 | ✓ | sales-adp-bj-jxl-0, GMV=1999 | +| 17 | 红 | 3/7 | 17025 | 13533955004 | 3/14 | ✓ | sales-adp-bj-jxl-0, GMV=1999 | +| 18 | 一笑轩渠 | 3/8 | 17425 | 15017528458 | 3/11 | ✓ | sales-adp-bj-jxl-0, GMV=1999 | +| 19 | 蜗牛 | 3/2 | ❓ | ❓ | ❓ | - | 晚柠5/15订单数百笔,无手机/UID无法定位 | +| 20 | c_瑶 | 3/6 | ❓ | ❓ | ❓ | - | "直购"渠道DB不存在,3/14无3998/1999匹配 | + +### 关键发现 +1. Group A 中 7/10 用户 DB 中无任何订单(pre汇总有GMV但DB不存在) +2. Group B 4个手机号全部未注册(H=未注册 确认正确) +3. Group C #15-#18 4笔 jxl-0 均 L≥C,pre怀疑#18 L0 · P 0 and refund >= amount: + continue + + exp = exp_map.get(uid, 0) + course = course_map.get(uid, "") + study = study_map.get(uid, "") + last_study = study_time_map.get(uid, "") + total_min = round(time_map.get(uid, 0) / 60000, 1) if time_map.get(uid, 0) else "" + gsv = amount - refund + + row = [ + "直购", name, "", exp, tel, "", "", uid, reg, dl, + "是", l_date, key_from, goods, amount, + refund if refund > 0 else "", gsv, course, study, + last_study, total_min, now_str, "直购", 1, + ] + new_rows.append(row) + + # 按下单日期降序 + new_rows.sort(key=lambda r: r[11], reverse=True) + + print(f"有效直购订单: {len(new_rows)}") + + # ── Step 3: 写入飞书 ── + token = get_token() + + # 写表头 + put_values(token, DIRECT_SHEET, "A1:X1", [HEADER]) + + # 写数据 + for batch_start in range(0, len(new_rows), 20): + batch = new_rows[batch_start:batch_start + 20] + sr = 2 + batch_start + er = sr + len(batch) - 1 + put_values(token, DIRECT_SHEET, f"A{sr}:X{er}", batch) + time.sleep(0.3) + + # 清除多余旧行 + total = len(new_rows) + clear_start = 2 + total + empty = [[""] * 24 for _ in range(50)] + put_values(token, DIRECT_SHEET, f"A{clear_start}:X{clear_start + 49}", empty) + + print(f"[{datetime.now():%Y-%m-%d %H:%M:%S}] ✅ 直购表刷新完成 ({total} 行)") + + +if __name__ == "__main__": + main() diff --git a/scripts/refresh_order_summary.py b/scripts/refresh_order_summary.py index 505d593..bab53ba 100644 --- a/scripts/refresh_order_summary.py +++ b/scripts/refresh_order_summary.py @@ -18,6 +18,7 @@ APP_ID = "cli_a929ae22e0b8dcc8" APP_SECRET = "OtFjMy7p3qE3VvLbMdcWidwgHOnGD4FJ" SPREADSHEET_TOKEN = "NoZqsFi47hIOHEt9j8WcfRtbnug" SALES_SHEETS = {"f975f0": "吴迪", "qJF4I": "小龙", "qJF4J": "成都"} +DIRECT_SHEET = "1sosYE" # 直购表(小红书店铺+stream-xhs,不依赖手机号匹配) SUMMARY_SHEET = "2smjwA" def _get_pg_password(): @@ -186,6 +187,24 @@ def main(): print(f"Total rows: {len(all_rows)}") + # ── Step 1.5: 读取直购表 ── + print(f"Reading 直购...") + direct_vals = read_sheet(token, DIRECT_SHEET, "A2:V10000") + direct_rows = [] + for i, row in enumerate(direct_vals): + while len(row) < 22: + row.append("") + b = str(row[1]).strip() if row[1] else "" + h = str(row[7]).strip() if row[7] else "" + if b or h: + direct_rows.append({ + "sid": DIRECT_SHEET, "name": "直购", "row": i + 2, + "raw": row[:22], + }) + print(f" {len(direct_rows)} non-empty rows") + all_rows.extend(direct_rows) + print(f"Total rows (with 直购): {len(all_rows)}") + # ── Step 2: 筛选进订单汇总的行 ── # 条件:K=是 · O>0 · 非全额退(P空或P 2 and raw[2] else "" l_str = str(raw[11]).strip() if len(raw) > 11 and raw[11] else "" c_date = parse_date(c_str) l_date = parse_date(l_str) - if not date_le(c_date, l_date): + if c_date is not None and not date_le(c_date, l_date): continue # 通过所有条件 @@ -225,6 +244,26 @@ def main(): print(f"Order rows after filter: {len(order_rows)}") + # ── Step 2.5: 去重(同一人可能在三表+直购中出现多次)── + # 按 (A销售归属, B微信昵称, O下单金额, P退款金额, L下单日期) 去重 + seen = set() + deduped = [] + for r in order_rows: + raw = r["raw"] + a = str(raw[0]).strip() if raw[0] else "" + b = str(raw[1]).strip() if len(raw) > 1 and raw[1] else "" + o = str(raw[14]).strip() if len(raw) > 14 and raw[14] else "" + p = str(raw[15]).strip() if len(raw) > 15 and raw[15] else "" + l = str(raw[11]).strip() if len(raw) > 11 and raw[11] else "" + key = (a, b, o, p, l) + if key not in seen: + seen.add(key) + deduped.append(r) + dup_count = len(order_rows) - len(deduped) + if dup_count > 0: + print(f" Removed {dup_count} duplicate rows") + order_rows = deduped + # ── Step 3: 按 L 下单日降序 ── order_rows.sort(key=lambda r: str(r["raw"][11]) if len(r["raw"]) > 11 and r["raw"][11] else "", reverse=True)