#!/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–X 行 ── summary_rows = [] for r in order_rows: raw = r["raw"] # A–V 原样镜像 new_row = list(raw[:22]) # W: 渠道归属(基于 M 成交渠道) m_channel = str(raw[12]).strip() if len(raw) > 12 and raw[12] else "" sales_name = str(raw[0]).strip() if len(raw) > 0 and raw[0] else "" w = classify_w_channel(m_channel, sales_name) new_row.append(w) # X: 有效成单 = 1 new_row.append(1) summary_rows.append(new_row) print(f"Summary rows: {len(summary_rows)}") # ── Step 5: 写入订单汇总 ── print("Writing to 订单汇总...") total = len(summary_rows) for batch_start in range(0, total, 20): batch = summary_rows[batch_start:batch_start + 20] sr = 3 + batch_start er = sr + len(batch) - 1 put_values(token, SUMMARY_SHEET, f"A{sr}:X{er}", batch) time.sleep(0.3) # ── 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: clear_start = 3 + total clear_end = 3 + old_count - 1 empty_rows = [[""] * 24 for _ in range(clear_end - clear_start + 1)] put_values(token, SUMMARY_SHEET, f"A{clear_start}:X{clear_end}", empty_rows) print(f" Cleared rows A{clear_start}:X{clear_end}") print(f"[{datetime.now():%Y-%m-%d %H:%M:%S}] ✅ 订单汇总刷新完成") if __name__ == "__main__": main()