#!/usr/bin/env python3 """ 订单汇总 A–X 全量镜像刷新 触发:Step2(Cursor Step1 完成后 @小溪) 归属:小溪 (xiaoxi) 进表条件:K=是 · O>0 · 非全额退(P空或P0 · 非全额退(P空或P 10 and raw[10] else "" if k != "是": continue # O > 0 try: o_val = float(raw[14]) if len(raw) > 14 and raw[14] not in (None, "") else 0 except (ValueError, TypeError): o_val = 0 if o_val <= 0: continue # 非全额退: P空或P 15 and raw[15] not in (None, "") else 0 except (ValueError, TypeError): p_val = 0 if p_val > 0 and p_val >= o_val: # 全额退 → 不进订单表 continue # L ≥ C (C为空时跳过此检查,如直购用户无进线日期) c_str = str(raw[2]).strip() if len(raw) > 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 c_date is not None and not date_le(c_date, l_date): continue # 通过所有条件 order_rows.append(r) 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) # ── Step 4: 构建 A–W 行(23列)── # 新契约: A-U镜像 + V=渠道归属 + W=订单号 summary_rows = [] for r in order_rows: raw = r["raw"] # A–U 原样镜像(21列) new_row = list(raw[:21]) # V: 渠道归属(基于 L 成交渠道) l_channel = str(raw[11]).strip() if len(raw) > 11 and raw[11] else "" sales_name = str(raw[0]).strip() if len(raw) > 0 and raw[0] else "" v = classify_w_channel(l_channel, sales_name) new_row.append(v) # W: 订单号(原 X 列) order_no = str(raw[23]).strip() if len(raw) > 23 and raw[23] else "" new_row.append(order_no) summary_rows.append(new_row) print(f"Summary rows: {len(summary_rows)}") # ── Step 5: 写入订单汇总(使用安全写入工具,自动遵守 5000 格上限)── print("Writing to 订单汇总...") writer = FeishuSheetWriter(SPREADSHEET_TOKEN, token) # 先清空旧数据区(23 列,自动计算批大小 ≤ 4400 格/批) writer.clear(SUMMARY_SHEET, start_row=3, end_row=2000, cols=23) time.sleep(0.5) # 写入新数据(23 列 A-W,自动分批) total = len(summary_rows) writer.write(SUMMARY_SHEET, start_row=3, rows=summary_rows, cols=23) # ── Step 6: 清除多余旧行 ── existing = read_sheet(token, SUMMARY_SHEET, "A3:A4000") old_count = len([r for r in existing if r and any(c for c in r if c)]) if old_count > total: writer.clear(SUMMARY_SHEET, start_row=3 + total, end_row=3 + old_count - 1, cols=23) print(f"[{datetime.now():%Y-%m-%d %H:%M:%S}] ✅ 订单汇总刷新完成") if __name__ == "__main__": main()