#!/usr/bin/env python3 # -*- coding: utf-8 -*- """导入王芳邮储卡外部真实消费(排除支付宝/微信渠道重复、内部自转、家庭内部)""" import csv, re, json, pymysql from datetime import datetime cfg = json.load(open('db_config.json')) conn = pymysql.connect(host=cfg['host'], port=cfg['port'], user=cfg['user'], password=cfg.get('password'), database=cfg['database'], charset='utf8mb4') cur = conn.cursor() MEMBER = 3 rows = [] with open('/tmp/psbc_records.csv', encoding='utf-8') as f: for row in csv.reader(f): if not row or len(row) < 3: continue try: float(row[1]) except: continue rows.append(row) PROP_CARDS = {'621775831', '621778830', '622203130', '567156987', '208860212'} alipay_pat = re.compile('2088\\d{11}') def is_external_expense(r): amt = float(r[1]); s = r[3] if amt >= 0: return False if '退货' in s: return False if alipay_pat.search(s): return False if '财付通' in s or '微信' in s: return False for c in PROP_CARDS: if c in s: return False if '杨轩' in s or '汪礼平' in s or '汪和平' in s: return False if '还款' in s: return False return True def cat_of(s): if any(k in s for k in ['超市','生鲜','便利店','水果','餐饮','烧烤','龙虾','包子','蜜雪','瑞幸','金拱门','餐厅','食堂','食品','桃酥','米糕','药材','调料']): return '餐饮/食品' if any(k in s for k in ['铁路','12306','滴滴','停车','地铁','交通','火车','顺风','轨道']): return '交通' if any(k in s for k in ['药','医院','诊所','健康']): return '医疗' if any(k in s for k in ['母婴','奶粉','尿不湿']): return '母婴' if any(k in s for k in ['童装','服装','女装','百货','鞋','服饰']): return '购物' if any(k in s for k in ['美发','美容']): return '美容美发' if any(k in s for k in ['缴费','水电','话费','燃气']): return '生活缴费' if any(k in s for k in ['游泳','健身','运动']): return '运动' if any(k in s for k in ['快团团','拼多多']): return '购物' if any(k in s for k in ['美团','饿了么','拉扎斯','三快','外卖']): return '餐饮/食品' return '其他' ext_count = 0; ext_sum = 0.0; cat_tot = {} for r in rows: if is_external_expense(r): amt = abs(float(r[1])); s = r[3] dt = datetime.strptime(r[0], '%Y-%m-%d %H:%M:%S') c = cat_of(s) note = f"[邮储卡] 外部消费|{s.strip()}" cur.execute("INSERT INTO variable_expenses (member_id,category,amount,recorded_date,note) VALUES (%s,%s,%s,%s,%s)", (MEMBER, c, amt, dt.date(), note)) ext_count += 1; ext_sum += amt; cat_tot[c] = cat_tot.get(c, 0) + amt conn.commit() print(f"外部消费导入: {ext_count}笔 ¥{ext_sum:.2f}") for k, v in sorted(cat_tot.items(), key=lambda x: -x[1]): print(f" {k:10s} ¥{v:.2f}") conn.close()