#!/usr/bin/env python3 # -*- coding: utf-8 -*- """重新导入王芳2026H1支付宝:只算真实支出(交易成功/支付成功),排除交易关闭(退款)""" import 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_ID = 3 data = json.load(open('/tmp/wangfang_records.json')) ali2cat = { '餐饮美食': '餐饮/食品', '日用百货': '购物', '服饰装扮': '购物', '交通出行': '交通', '医疗健康': '医疗', '家居家装': '家居', '美容美发': '美容美发', '保险': '保险', '爱车养车': '交通', '文化休闲': '娱乐', '生活服务': '生活服务', '数码电器': '数码', '商业服务': '商业服务', '母婴亲子': '母婴', '转账红包': '转账/红包', '酒店旅游': '旅游', '充值缴费': '生活缴费', '运动户外': '运动', '教育培训': '教育培训', '其他': '其他', } EXCLUDE_STATUS = ('交易关闭',) # 退款/取消订单 inc=exp=skip=0; inc_sum=exp_sum=0.0; cat_tot={} closed_list=[] for rec in data['records']: ts=rec['交易时间'].strip(); dt=datetime.strptime(ts,'%Y-%m-%d %H:%M:%S') direction=rec['收/支'].strip(); amount=float(rec['金额']) ali_cat=rec['交易分类'].strip(); status=rec['交易状态'].strip() peer=rec['交易对方']; goods=rec['商品说明']; pay=rec['收/付款方式'] note=f"[支付宝] {ali_cat}|{peer}|{goods or '/'}|{pay}" if direction=='支出': if status in EXCLUDE_STATUS: skip+=1; continue cat=ali2cat.get(ali_cat,'其他') cur.execute("INSERT INTO variable_expenses (member_id,category,amount,recorded_date,note) VALUES (%s,%s,%s,%s,%s)", (MEMBER_ID,cat,amount,dt.date(),note)) exp+=1; exp_sum+=amount; cat_tot[cat]=cat_tot.get(cat,0)+amount elif direction=='收入': cur.execute("INSERT INTO income_records (member_id,source,amount,frequency,recorded_date,note) VALUES (%s,%s,%s,%s,%s,%s)", (MEMBER_ID,peer,amount,'一次性',dt.date(),note)) inc+=1; inc_sum+=amount else: skip+=1 conn.commit() print(f"支出 {exp}笔 ¥{exp_sum:.2f} (排除交易关闭 {skip}笔)") print(f"收入 {inc}笔 ¥{inc_sum:.2f}") print("支出分类:", {k:round(v,2) for k,v in sorted(cat_tot.items(),key=lambda x:-x[1])}) conn.close()