Files
openclaw-config/workspace-finances/import_wangfang_h1.py
T

52 lines
2.5 KiB
Python

#!/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()