From de4bb6934bb73f4dfea1e57b88f999679b95606e Mon Sep 17 00:00:00 2001 From: xiaoxue_admin <9283713@qq.com> Date: Mon, 22 Jun 2026 22:39:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=A1=BA=E5=BA=8F=E5=88=86=E9=85=8D+?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E9=87=91=E9=A2=9D=E5=90=88=E5=B9=B6=20-=20?= =?UTF-8?q?=E5=8E=BB=E6=8E=896=E4=B8=AA=E7=AD=96=E7=95=A5=E7=9A=84=20if-el?= =?UTF-8?q?se=EF=BC=88=E5=90=AB=E5=B9=B3=E5=9D=87=E5=88=86=E9=85=8D?= =?UTF-8?q?=EF=BC=89=20-=20=E7=BB=9F=E4=B8=80=E4=B8=BA=EF=BC=9A=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E5=88=86=E9=85=8D=20+=20=E5=A4=9A=E4=BD=99=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E7=B4=AF=E5=8A=A0=E5=88=B0=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=A7=91=E7=9B=AE=20-=20=E4=B8=8D=E5=86=8D=E4=BA=A7?= =?UTF-8?q?=E7=94=9F=E5=8E=9F=E5=A7=8B=E5=87=AD=E8=AF=81=E4=B8=8A=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E9=87=91=E9=A2=9D=20-=20=E5=80=9F?= =?UTF-8?q?=E8=B4=B7=E5=B9=B3=E8=A1=A1=E4=B8=8D=E5=86=8D=E5=9B=A0=E5=B9=B3?= =?UTF-8?q?=E5=9D=87=E5=88=86=E9=85=8D=E8=A2=AB=E7=A0=B4=E5=9D=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 32 ++++++++---------------- core/parser.py | 68 ++++++++++++++++++-------------------------------- 2 files changed, 35 insertions(+), 65 deletions(-) diff --git a/config.yaml b/config.yaml index e8cbcac..64eea92 100644 --- a/config.yaml +++ b/config.yaml @@ -1,30 +1,20 @@ -# ============================================================ -# KOCR v4 — 配置中心 -# 简化版:原图直出 PaddleOCR,无预处理 -# ============================================================ - -# OCR 参数(PaddleOCR 原生参数) ocr: - use_gpu: false - lang: ch - show_log: false - use_angle_cls: true - det_db_thresh: 0.3 det_db_box_thresh: 0.5 - det_db_unclip_ratio: 1.5 - max_side_len: 1600 det_db_score_mode: fast + det_db_thresh: 0.3 + det_db_unclip_ratio: 1.5 + lang: ch + max_side_len: 1600 min_size: 8 rec_drop_score: 0.5 - -# 后处理参数 -postprocessing: - amount_balance_tolerance: 0.01 - -# 输出路径 + show_log: false + use_angle_cls: true + use_gpu: true paths: - input_dir: input - output_dir: output done_dir: input/done index_file: .kocr_index.json + input_dir: input + output_dir: output template: /home/muc/mc/会计工具/kocr-v4/凭证模板.xls +postprocessing: + amount_balance_tolerance: 0.01 diff --git a/core/parser.py b/core/parser.py index 2de5183..318a08e 100644 --- a/core/parser.py +++ b/core/parser.py @@ -374,59 +374,39 @@ class K3VoucherParser: return '' def _match_entries(self, result, codes, debit_amts, credit_amts, summary, bounds): - """将金额按匹配到科目,构建分录""" + """将金额匹配到科目,构建分录 + + 顺序分配 + 多余金额合并到最后一个科目: + - 第1个借方金额 → 第1个科目,第2个借方 → 第2个科目…… + - 借方金额多于科目数 → 多余金额合并到最后一个科目 + - 贷方同理 + - 不做平均分配(平均分配会产生不存在于原始凭证的金额) + """ if not codes: result['entries'] = [] return n_codes = len(codes) - n_debit = len(debit_amts) - n_credit = len(credit_amts) - # 策略 1:等额借贷 - if n_codes == n_debit == n_credit: - for i, code in enumerate(codes): - code['debit'] = debit_amts[i]['val'] - code['credit'] = credit_amts[i]['val'] + # 初始化 + for code in codes: + code['debit'] = 0.0 + code['credit'] = 0.0 - # 策略 2:单行分录 - elif n_codes == 1 and (n_debit > 0 or n_credit > 0): - codes[0]['debit'] = sum(a['val'] for a in debit_amts) - codes[0]['credit'] = sum(a['val'] for a in credit_amts) + # 借方顺序分配:多余的累加到最后一个科目 + for i, amt in enumerate(debit_amts): + idx = min(i, n_codes - 1) + codes[idx]['debit'] += amt['val'] - # 策略 3:借贷均足量,按顺序匹配 - elif n_debit >= n_codes and n_credit >= n_codes: - for i, code in enumerate(codes): - if i < n_debit: - code['debit'] = debit_amts[i]['val'] - if i < n_credit: - code['credit'] = credit_amts[i]['val'] + # 贷方顺序分配:多余的累加到最后一个科目 + for i, amt in enumerate(credit_amts): + idx = min(i, n_codes - 1) + codes[idx]['credit'] += amt['val'] - # 策略 4:借方多,贷方平均分配 - elif n_debit >= n_codes: - for i, code in enumerate(codes): - code['debit'] = debit_amts[i]['val'] - if n_credit > 0: - per_code = sum(a['val'] for a in credit_amts) / n_codes - for code in codes: - code['credit'] = round(per_code, 2) - - # 策略 5:贷方多,借方平均分配 - elif n_credit >= n_codes: - for i, code in enumerate(codes): - code['credit'] = credit_amts[i]['val'] - if n_debit > 0: - per_code = sum(a['val'] for a in debit_amts) / n_codes - for code in codes: - code['debit'] = round(per_code, 2) - - # 策略 6:都不够 - else: - for i, code in enumerate(codes): - if i < n_debit: - code['debit'] = debit_amts[i]['val'] - if i < n_credit: - code['credit'] = credit_amts[i]['val'] + # 四舍五入 + for code in codes: + code['debit'] = round(code['debit'], 2) + code['credit'] = round(code['credit'], 2) # 设置摘要 for code in codes: