fix: 匹配逻辑改为顺序分配+多余金额合并

- 去掉6个策略的 if-else(含平均分配)
- 统一为:顺序分配 + 多余金额累加到最后一个科目
- 不再产生原始凭证上不存在的金额
- 借贷平衡不再因平均分配被破坏
This commit is contained in:
xiaoxue_admin 2026-06-22 22:39:56 +08:00
parent b5107016b0
commit de4bb6934b
2 changed files with 35 additions and 65 deletions

View File

@ -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

View File

@ -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: