dongguoliang před 2 měsíci
rodič
revize
8f3ee711c8

binární
__pycache__/abc_parser.cpython-312.pyc


binární
__pycache__/gui.cpython-312.pyc


binární
__pycache__/parser_factory.cpython-312.pyc


+ 68 - 0
abc_parser.py

@@ -0,0 +1,68 @@
+import pandas as pd
+from tkinter import messagebox
+from flow_parser_base import FlowParserBase
+
+
+class ABCFlowParser(FlowParserBase):
+    """农业银行流水解析器"""
+    
+    def parse(self, flow_file_path):
+        """解析农行流水文件,返回标准化的流水数据"""
+        try:
+            flow_df = pd.read_excel(flow_file_path, dtype=str, header=2)
+            
+            flow_df.columns = flow_df.columns.str.strip()
+            
+            required_columns = ["交易时间", "收入金额", "支出金额", "账户余额", "对方账号", "对方户名", "对方开户行", "摘要"]
+            
+            missing_fields = [k for k in required_columns if k not in flow_df.columns]
+            if missing_fields:
+                messagebox.showerror("错误", f"农行流水缺少必要列:{missing_fields}")
+                return None
+            
+            filtered_df = flow_df.copy()
+            filtered_df = filtered_df[filtered_df["交易时间"].str.contains(r"\d{4}-\d{2}-\d{2}", na=False)]
+            
+            filtered_df["交易时间"] = pd.to_datetime(filtered_df["交易时间"], errors='coerce')
+            filtered_df = filtered_df.sort_values("交易时间", ascending=True)
+            
+            standard_flow = []
+            for _, row in filtered_df.iterrows():
+                transaction_time = row["交易时间"]
+                income_amount = pd.to_numeric(row["收入金额"], errors='coerce')
+                expense_amount = pd.to_numeric(row["支出金额"], errors='coerce')
+                balance = str(row["账户余额"]).strip()
+                opponent_account = str(row["对方账号"]).strip()
+                opponent_name = str(row["对方户名"]).strip()
+                opponent_bank = str(row["对方开户行"]).strip()
+                summary = str(row["摘要"]).strip()
+                
+                income = income_amount if pd.notna(income_amount) and income_amount > 0 else 0
+                expense = expense_amount if pd.notna(expense_amount) and expense_amount > 0 else 0
+                
+                if summary == "费用外收":
+                    summary = "手续费"
+                    opponent_name = "手续费"
+                    opponent_bank = "手续费"
+                
+                transaction_time_str = transaction_time.strftime("%Y-%m-%d %H:%M:%S") if pd.notna(transaction_time) else ""
+                
+                standard_flow.append({
+                    "交易时间": transaction_time_str,
+                    "对方户名": opponent_name,
+                    "摘要": summary,
+                    "收入": income,
+                    "支出": expense,
+                    "对方开户机构": opponent_bank,
+                    "备注": opponent_bank,
+                    "余额": balance
+                })
+            
+            return pd.DataFrame(standard_flow)
+        except Exception as e:
+            messagebox.showerror("错误", f"解析农行流水失败:{str(e)}")
+            return None
+    
+    def get_bank_name(self):
+        """返回银行名称"""
+        return "农业银行"

+ 1 - 1
gui.py

@@ -34,7 +34,7 @@ class JournalGeneratorGUI:
         frame_bank.pack(fill=tk.X)
         ttk.Label(frame_bank, text="开户银行:").pack(side=tk.LEFT)
         bank_combo = ttk.Combobox(frame_bank, textvariable=self.bank_var, state="readonly")
-        bank_combo["values"] = ["建设银行", "中国银行"]
+        bank_combo["values"] = ["建设银行", "中国银行", "农业银行"]
         bank_combo.pack(side=tk.LEFT, padx=5)
         
         frame_param = ttk.Frame(self.root, padding="10")

+ 3 - 1
parser_factory.py

@@ -1,5 +1,6 @@
 from ccb_parser import CCBFlowParser
 from boc_parser import BOCFlowParser
+from abc_parser import ABCFlowParser
 
 
 class ParserFactory:
@@ -8,7 +9,8 @@ class ParserFactory:
     def __init__(self):
         self.parsers = {
             "建设银行": CCBFlowParser(),
-            "中国银行": BOCFlowParser()
+            "中国银行": BOCFlowParser(),
+            "农业银行": ABCFlowParser()
         }
     
     def get_parser(self, bank_name):