diff --git a/media/inbound/微信支付账单流水文件_20260701-20260731_20260808112244---594d6278-1f39-4477-bc1c-0cea784c1f7a.xlsx b/media/inbound/微信支付账单流水文件_20260701-20260731_20260808112244---594d6278-1f39-4477-bc1c-0cea784c1f7a.xlsx new file mode 100644 index 0000000..048e334 Binary files /dev/null and b/media/inbound/微信支付账单流水文件_20260701-20260731_20260808112244---594d6278-1f39-4477-bc1c-0cea784c1f7a.xlsx differ diff --git a/openclaw-weixin/accounts/e48ace9814f0-im-bot.context-tokens.json b/openclaw-weixin/accounts/e48ace9814f0-im-bot.context-tokens.json index 491a397..f29c033 100644 --- a/openclaw-weixin/accounts/e48ace9814f0-im-bot.context-tokens.json +++ b/openclaw-weixin/accounts/e48ace9814f0-im-bot.context-tokens.json @@ -1 +1 @@ -{"o9cq80w6ZnnPGItW-GGACkwd69bA@im.wechat":"AARzJWAFAAABAAAAAAAr3PqxbskjeYpnLxx1aiAAAAB+9905Q6UiugPBawU3n3cyzQX+LkN8ofRzsCZYN0mt7r8a9A/P+jazOZkC6OvTEXcIEtkOnVzYK4ml1u4NXP4xh0lm4TJa"} \ No newline at end of file +{"o9cq80w6ZnnPGItW-GGACkwd69bA@im.wechat":"AARzJWAFAAABAAAAAABDhnXp+HcBqTrwGd92aiAAAAB+9905Q6UiugPBawU3n3cyzQX+LkN8ofRzsCZYN0mt7kdOinFAoP67VCUjNL9AHsWrMsJukz0sfS1XeLn1+p0d/jUyg1h2"} \ No newline at end of file diff --git a/openclaw-weixin/accounts/e48ace9814f0-im-bot.sync.json b/openclaw-weixin/accounts/e48ace9814f0-im-bot.sync.json index 73b2af6..8c65319 100644 --- a/openclaw-weixin/accounts/e48ace9814f0-im-bot.sync.json +++ b/openclaw-weixin/accounts/e48ace9814f0-im-bot.sync.json @@ -1 +1 @@ -{"get_updates_buf":"ChAIOxDbydjL/TMYmp6chfYzEjplNDhhY2U5ODE0ZjBAaW0uYm90OjA2MDAwMGQ0ZmYwNzg5NWY2NDFlMmZjNmIzNGUzMzNkZDIwMjgx"} \ No newline at end of file +{"get_updates_buf":"ChAIQRCp+92C/jMYmp6chfYzEjplNDhhY2U5ODE0ZjBAaW0uYm90OjA2MDAwMGQ0ZmYwNzg5NWY2NDFlMmZjNmIzNGUzMzNkZDIwMjgx"} \ No newline at end of file diff --git a/workspace-attestations/bcbf8b4631832f347305c4974ee5a34a2256aed2e9a395fe20ce5316511ff7a1.attested b/workspace-attestations/bcbf8b4631832f347305c4974ee5a34a2256aed2e9a395fe20ce5316511ff7a1.attested index 051473c..1c16c47 100644 --- a/workspace-attestations/bcbf8b4631832f347305c4974ee5a34a2256aed2e9a395fe20ce5316511ff7a1.attested +++ b/workspace-attestations/bcbf8b4631832f347305c4974ee5a34a2256aed2e9a395fe20ce5316511ff7a1.attested @@ -1,4 +1,4 @@ openclaw-workspace-attestation:v1 -2026-07-30T01:34:39.891Z +2026-08-08T07:48:12.936Z generated:HEARTBEAT.md:ecce558615751a35aa173731e892ff3993f44bb4f5a1219c0a02994790c85528 generated:USER.md:e418ca9a680553b3ad8f54aecb0d403330810bb77826ab5251cc1dc13368fe16 diff --git a/workspace-finances/MEMORY.md b/workspace-finances/MEMORY.md index 9c1ef77..d7df40c 100644 --- a/workspace-finances/MEMORY.md +++ b/workspace-finances/MEMORY.md @@ -47,6 +47,15 @@ ## 2026年数据进展 +- **2026-07 汪礼平七月微信账单**(7/01–7/31,77笔) + - 支出74笔¥3,130.44 | 收入3笔¥610.00 + - 支出分类:餐饮/食品¥1,709.79 | 转账/红包¥900(杨小平400+老公200+红包给佳艳300)| 购物¥475.85(拼多多/抖音)| 其他¥40(三城寺香火5×10)| 交通¥4.8(铁塔能源) + - 单笔最大:红星扫码¥736(7/26,疑大宗采购) + - 收入:杨轩转账400、汪和平200、佳艳红包10 + - 主要支付方式:安徽农信储蓄卡(8043);零钱少量 + - 日常以菜市场/超市小摊为主(好想来、惠康、皖商、新皖韵),消费结构健康 + - 注:7/31 抖音@红星736已入餐饮分类,若属批量采购可复核 + - **2026-07-15**:导入杨轩2026上半年三张卡流水 - **工行交通卡2808**:64条流水,34笔外部支出¥3,774 - 火车票¥3,632 = 96%,滴滴¥101,共享单车¥15,停车费¥11,卡年费¥10 diff --git a/workspace-finances/import_wangliping_july.py b/workspace-finances/import_wangliping_july.py new file mode 100644 index 0000000..ef8f0c2 --- /dev/null +++ b/workspace-finances/import_wangliping_july.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""导入汪礼平2026年7月微信支付流水到 finances 数据库""" +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['password'], database=cfg['database'], charset='utf8mb4') +cur = conn.cursor() + +MEMBER_ID = 1 # 汪礼平 + +def categorize(rec): + txn_type, peer, goods, direction = rec[1], rec[2], rec[3], rec[4] + # 转账/红包 + if '转账' in txn_type or '红包' in txn_type: + return '转账/红包' + if ('拼多多' in peer or '抖音' in peer): + return '购物' + # 超市/食品/生鲜/餐饮 + food_kw = ['超市', '生鲜', '好想来', '赵一鸣', '早餐', '早点', '包子', '米粉', + '豆腐', '猪肉', '水果', '果林', '食品', '金 华', '粥饼', '小铺', '餐厅'] + for kw in food_kw: + if kw in peer or (goods and kw in goods): + return '餐饮/食品' + # 交通/出行 + if '铁塔能源' in peer or '充电' in peer or '停车' in peer: + return '交通' + # 医疗 + if '药' in peer or '诊所' in peer or '医院' in peer: + return '医疗' + # 寺/香火/宗教 + if '寺' in peer: + return '其他' + # 其余扫码付款个人商户 -> 餐饮/食品(多数为买菜/小摊) + return '餐饮/食品' + +# 内嵌完整数据(来自会话消息) +DATA = __import__('json').loads(r'''{"headers":["交易时间","交易类型","交易对方","商品","收/支","金额(元)","支付方式","当前状态","交易单号","商户单号","备注"],"records":[["2026-07-31 19:55:44","商户消费","抖音电商商家","蟑螂蚂蚁通用杀蟑饵剂...","支出",7.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-31 17:52:25","商户消费","好想来","安庆宜秀区旺园小区店","支出",3.08,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-31 09:59:20","商户消费","安庆市宜秀区三城寺","安庆市宜秀区三城寺","支出",10,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-30 19:52:18","转账","杨小平 (杨平)","微信转账","支出",400,"零钱","对方已收钱","/","/","/"],["2026-07-30 19:51:14","转账","杨轩","微信转账","收入",400,"/","已存入零钱","/","/","/"],["2026-07-28 18:07:02","商户消费","拼多多平台商户","先用后付","支出",21.89,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-28 08:35:00","扫二维码付款","天顺1","二维码收款","支出",35,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-27 16:37:50","商户消费","抖音电商商家","保鲜膜套","支出",9.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-27 10:54:36","商户消费","贺强果林","巢尔苹果等","支出",21,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-26 10:13:36","扫二维码付款","丁韩燕","二维码收款","支出",35,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-26 09:43:19","商户消费","惠康超市","付款码支付","支出",5.22,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-26 09:34:33","扫二维码付款","红星","二维码收款","支出",736,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-25 09:59:06","商户消费","宜天鲜","宜天鲜生态农场直供会员店","支出",42,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-25 09:31:32","扫二维码付款","丁韩燕","二维码收款","支出",17,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-25 08:54:09","扫二维码付款","飘雪","二维码收款","支出",6,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-25 06:33:32","商户消费","粥饼小铺","/","支出",3.2,"零钱","支付成功","/","/","/"],["2026-07-24 09:53:38","扫二维码付款","梧桐","二维码收款","支出",4.3,"零钱","已转账","/","/","/"],["2026-07-24 07:34:44","微信红包","佳艳","/","收入",10,"/","已存入零钱","/","/","/"],["2026-07-23 14:09:03","扫二维码付款","潮贵金","二维码收款","支出",19.5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-23 11:02:55","商户消费","安庆市宜秀区三城寺","安庆市宜秀区三城寺","支出",10,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-22 17:52:34","商户消费","铁塔能源有限公司安徽分公司","铁塔能源","支出",1.6,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-22 10:29:52","商户消费","皖商超市","付款码支付","支出",14.74,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-22 10:22:31","商户消费","杨爱美水果","杨爱美水果","支出",14.8,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-22 10:06:50","商户消费","赵一鸣","安庆市大观区辛增武食品经营部","支出",11.39,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-22 07:29:27","扫二维码付款","粱发兵","二维码收款","支出",3.5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-22 07:28:25","商户消费","阿龙早点","/","支出",3.5,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-21 09:48:35","扫二维码付款","唐陶信","二维码收款","支出",5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-21 08:07:24","扫二维码付款","晚星","二维码收款","支出",5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-21 07:11:47","微信红包(单发)","发给佳艳","/","支出",100,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-21 07:11:23","微信红包(单发)","发给佳艳","/","支出",200,"零钱","支付成功","/","/","/"],["2026-07-20 18:24:05","转账","汪和平","微信转账","收入",200,"/","已存入零钱","/","/","/"],["2026-07-20 13:38:07","扫二维码付款","佰利鑫百货经营部丨宜秀店","二维码收款","支出",120,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-19 13:04:11","商户消费","抖音电商商家","染发膏","支出",19.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-19 12:51:50","商户消费","抖音电商商家","女包","支出",39.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-19 12:39:47","商户消费","抖音电商商家","百福缸钥匙扣","支出",9.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-19 10:01:54","扫二维码付款","桂林米粉","二维码收款","支出",15,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-18 08:53:07","商户消费","惠康超市","付款码支付","支出",111.6,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-17 10:01:57","扫二维码付款","轩记","二维码收款","支出",6.5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-17 09:53:48","商户消费","惠康超市","付款码支付","支出",18.09,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-15 08:53:21","商户消费","惠康超市","付款码支付","支出",12.85,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-14 14:24:21","商户消费","浮生如梦","/","支出",5,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-14 08:35:53","扫二维码付款","天顺1","二维码收款","支出",35,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-13 17:37:41","商户消费","拼多多平台商户","先用后付","支出",130.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-13 17:37:24","商户消费","拼多多平台商户","先用后付","支出",108,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-13 17:21:38","扫二维码付款","老王","二维码收款","支出",25,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-13 17:15:33","商户消费","新皖韵生鲜超市","新皖韵生鲜超市","支出",32.3,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-13 11:28:13","商户消费","拼多多平台商户","先用后付","支出",3.76,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-13 10:55:45","扫二维码付款","晨曦","二维码收款","支出",35,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-13 10:41:19","商户消费","惠康超市","付款码支付","支出",19.81,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-13 08:16:16","商户消费","好想来","安庆宜秀区旺园小区店","支出",7.2,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-12 09:19:57","商户消费","安庆市宜秀区三城寺","安庆市宜秀区三城寺","支出",10,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-12 08:59:30","扫二维码付款","小高精品水果专卖","二维码收款","支出",29,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-12 07:59:09","转账","老公 (自然而然)","微信转账","支出",200,"安徽农信储蓄卡(8043)","对方已收钱","/","/","/"],["2026-07-12 07:38:12","扫二维码付款","老奶奶包子","二维码收款","支出",4.5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-10 14:09:12","商户消费","拼多多平台商户","先用后付","支出",66,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-10 07:50:04","扫二维码付款","飘雪","二维码收款","支出",7,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-10 06:15:00","商户消费","二子","/","支出",7.2,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-09 11:35:54","商户消费","拼多多平台商户","先用后付","支出",39.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-09 07:51:39","扫二维码付款","梦想成真","二维码收款","支出",12,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-08 07:44:21","商户消费","赵一鸣","安庆市大观区辛增武食品经营部","支出",26.85,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-07 12:27:56","商户消费","拼多多平台商户","先用后付","支出",17.9,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-07 09:03:54","扫二维码付款","海之星游泳馆","二维码收款","支出",52,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-07 08:42:39","商户消费","金色华联购物中心","金色华联购物中心-大发店","支出",4.08,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-07 08:11:31","扫二维码付款","韩亚红","二维码收款","支出",2,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-06 11:10:18","商户消费","铁塔能源有限公司安徽分公司","铁塔能源","支出",1.6,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-06 07:41:19","商户消费","安庆小俩口(老面包子铺)","/","支出",6,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-05 10:50:23","扫二维码付款","乐乐奶奶","二维码收款","支出",10.7,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-05 10:46:18","扫二维码付款","平","二维码收款","支出",8.5,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-05 10:44:52","扫二维码付款","枞阳手工豆腐","二维码收款","支出",6,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-05 10:43:30","扫二维码付款","平","二维码收款","支出",11,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-05 10:41:52","扫二维码付款","晨曦","二维码收款","支出",26,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-03 10:19:40","商户消费","铁塔能源有限公司安徽分公司","铁塔能源","支出",1.6,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-03 10:00:53","商户消费","安庆安广顺电子商务有限公司","皖商超市","支出",22.93,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-02 10:27:07","扫二维码付款","卖菜朱女","二维码收款","支出",20,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-02 09:10:20","商户消费","安庆市宜秀区三城寺","安庆市宜秀区三城寺","支出",10,"安徽农信储蓄卡(8043)","支付成功","/","/","/"],["2026-07-01 10:10:59","扫二维码付款","思伟(皖味粉丝煲)","二维码收款","支出",12,"安徽农信储蓄卡(8043)","已转账","/","/","/"],["2026-07-01 08:53:07","商户消费","好想来","安庆宜秀区旺园小区店","支出",13.45,"安徽农信储蓄卡(8043)","支付成功","/","/","/"]]}''') + +def parse_dt(s): + return datetime.strptime(s, '%Y-%m-%d %H:%M:%S') + +inc_count = exp_count = 0 +inc_sum = 0.0 +exp_sum = 0.0 +cat_tot = {} + +for rec in DATA['records']: + dt = parse_dt(rec[0]) + direction = rec[4] + amount = float(rec[5]) + note = f"[微信] {rec[1]}|{rec[2]}|{rec[3] or '/'}" + if direction == '收入': + source = rec[2] + cur.execute("INSERT INTO income_records (member_id, source, amount, frequency, recorded_date, note) VALUES (%s,%s,%s,%s,%s,%s)", + (MEMBER_ID, source, amount, '一次性', dt.date(), note)) + inc_count += 1; inc_sum += amount + elif direction == '支出': + cat = categorize(rec) + 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_count += 1; exp_sum += amount + cat_tot[cat] = cat_tot.get(cat, 0) + amount + +conn.commit() +print(f"收入 {inc_count} 笔, {inc_sum:.2f}") +print(f"支出 {exp_count} 笔, {exp_sum:.2f}") +print("分类:", {k: round(v,2) for k,v in sorted(cat_tot.items(), key=lambda x:-x[1])}) +conn.close() diff --git a/workspace-finances/query_wlp_2026.py b/workspace-finances/query_wlp_2026.py new file mode 100644 index 0000000..90ff7eb --- /dev/null +++ b/workspace-finances/query_wlp_2026.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""分析汪礼平2026年(1-7月)转账/红包往来""" +import json, pymysql, re +from collections import defaultdict +cfg = json.load(open('db_config.json')) +conn = pymysql.connect(host=cfg['host'], port=cfg['port'], user=cfg['user'], + password=str(cfg['password']), database=cfg['database'], charset='utf8mb4') +cur = conn.cursor() + +cur.execute(""" + SELECT recorded_date, amount, note FROM variable_expenses + WHERE member_id=1 AND recorded_date BETWEEN '2026-01-01' AND '2026-07-31' + AND (category='转账/红包' OR category LIKE '%红包%' OR note LIKE '%微信转账%' OR note LIKE '%微信红包%') + ORDER BY recorded_date +""") +rows = cur.fetchall() + +def peer_of(note): + parts = [p.strip() for p in note.replace('[微信] ', '').split('|')] + if len(parts) >= 2: + return parts[1] + return '(未知)' + +by_peer_month = defaultdict(set) +by_peer_total = defaultdict(float) +by_peer_count = defaultdict(int) +by_peer_amounts = defaultdict(list) + +for d, amt, note in rows: + p = peer_of(note) + m = d.strftime('%Y-%m') + a = float(amt) + by_peer_month[p].add(m) + by_peer_total[p] += a + by_peer_count[p] += 1 + by_peer_amounts[p].append((d.strftime('%m-%d'), a)) + +conn.close() + +print(f'2026年1-7月 转账/红包共 {len(rows)} 笔\n') +cands = [(by_peer_count[p], by_peer_total[p], p, sorted(by_peer_month[p]), by_peer_amounts[p]) + for p in by_peer_month] +cands.sort(key=lambda x: (-x[1])) +print('=== 按累计金额排序 ===') +for cnt, tot, p, months, amts in cands: + print(f'\n◆ {p} | {cnt}笔 | 累计 ¥{tot:,.0f} | {len(months)}个月 {months}') + details = '、'.join(f'{d}¥{a:.0f}' for d, a in amts) + print(f' 明细: {details}') diff --git a/workspace-finances/query_wlp_heping.py b/workspace-finances/query_wlp_heping.py new file mode 100644 index 0000000..c90f9f8 --- /dev/null +++ b/workspace-finances/query_wlp_heping.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""查询汪礼平与汪和平相关的全部转账/红包/收支记录""" +import json, pymysql +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() + +# 支出方向(微信转出给汪和平) +print('=== 汪礼平 → 汪和平(支出/转出) ===') +cur.execute(""" + SELECT recorded_date, amount, note FROM variable_expenses + WHERE member_id=1 AND note LIKE '%汪和平%' ORDER BY recorded_date +""") +for d, a, n in cur.fetchall(): + print(f' {d} ¥{float(a):>9.2f} {"支出" if "支出" in n else "转出"} {n}') + +# 收入方向(汪和平转入→汪礼平) +print() +print('=== 汪和平 → 汪礼平(收入/转入) ===') +cur.execute(""" + SELECT recorded_date, amount, source, note FROM income_records + WHERE member_id=1 AND (source LIKE '%汪和平%' OR note LIKE '%汪和平%') ORDER BY recorded_date +""") +rows = cur.fetchall() +if rows: + for d, a, s, n in rows: + print(f' {d} ¥{float(a):>9.2f} {"收入" if "收入" in n else "转入"} 来源:{s} {n}') +else: + # income_records 可能没有汪和平相关,检查所有收入 + cur.execute("SELECT recorded_date, amount, source, note FROM income_records WHERE member_id=1 ORDER BY recorded_date") + print(' (income_records 中未匹配,全部收入记录如下:)') + for d, a, s, n in cur.fetchall(): + print(f' {d} ¥{float(a):>9.2f} 来源:{s} {n or ""}') + +conn.close() diff --git a/workspace-finances/query_wlp_recurring.py b/workspace-finances/query_wlp_recurring.py new file mode 100644 index 0000000..05662cc --- /dev/null +++ b/workspace-finances/query_wlp_recurring.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""分析汪礼平跨月重复的转账/红包对象""" +import json, pymysql, re +from collections import defaultdict +cfg = json.load(open('db_config.json')) +conn = pymysql.connect(host=cfg['host'], port=cfg['port'], user=cfg['user'], + password=str(cfg['password']), database=cfg['database'], charset='utf8mb4') +cur = conn.cursor() + +cur.execute(""" + SELECT recorded_date, amount, note FROM variable_expenses + WHERE member_id=1 AND (category='转账/红包' OR category LIKE '%红包%' OR note LIKE '%微信转账%' OR note LIKE '%微信红包%') +""") +rows = cur.fetchall() + +def peer_of(note): + # note 形如 [微信] 转账|对方名|备注 或 转账 | 对方 | 备注 + parts = [p.strip() for p in note.replace('[微信] ', '').split('|')] + if len(parts) >= 2: + return parts[1] + m = re.search(r'转账\s*[:|]\s*([^|\s]+)', note) + return None + +# 按对方+月份统计 +by_peer_month = defaultdict(set) # peer -> set of 'YYYY-MM' +by_peer_total = defaultdict(float) +by_peer_count = defaultdict(int) + +for d, amt, note in rows: + p = peer_of(note) + if not p: + p = '(未知)' + month = d.strftime('%Y-%m') + by_peer_month[p].add(month) + by_peer_total[p] += float(amt) + by_peer_count[p] += 1 + +# 按月数排序,找出跨月重复的 +print('=== 转账对象出现月份数(>=2个月视为规律性) ===') +multi = [] +for p, months in by_peer_month.items(): + if len(months) >= 2: + multi.append((len(months), by_peer_count[p], by_peer_total[p], p, sorted(months))) +multi.sort(key=lambda x: (-x[0], -x[2])) +for nmon, ncnt, tot, p, months in multi: + print(f' {p:16s} 出现{nmon}个月共{ncnt}笔 累计¥{tot:.0f} 月:{months}') +conn.close() diff --git a/workspace-finances/query_wlp_transfers.py b/workspace-finances/query_wlp_transfers.py new file mode 100644 index 0000000..06029d3 --- /dev/null +++ b/workspace-finances/query_wlp_transfers.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import json, pymysql +cfg = json.load(open('db_config.json')) +conn = pymysql.connect(host=cfg['host'], port=cfg['port'], user=cfg['user'], + password=str(cfg['password']), database=cfg['database'], charset='utf8mb4') +cur = conn.cursor() + +# 汪礼平所有转账/红包类支出 +cur.execute(""" + SELECT recorded_date, amount, note FROM variable_expenses + WHERE member_id=1 AND (category='转账/红包' OR category LIKE '%红包%' OR note LIKE '%微信转账%' OR note LIKE '%微信红包%') + ORDER BY recorded_date +""") +rows = cur.fetchall() +print(f'共{len(rows)}笔转账/红包类记录:') +for r in rows: + print(f' {r[0]} {r[1]:>8.2f} {r[2]}') +print() + +cur.execute("SELECT MIN(recorded_date), MAX(recorded_date) FROM variable_expenses WHERE member_id=1") +print('汪礼平支出日期范围:', cur.fetchone()) +conn.close()