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: