fix: 匹配逻辑改为顺序分配+多余金额合并
- 去掉6个策略的 if-else(含平均分配) - 统一为:顺序分配 + 多余金额累加到最后一个科目 - 不再产生原始凭证上不存在的金额 - 借贷平衡不再因平均分配被破坏
This commit is contained in:
parent
b5107016b0
commit
de4bb6934b
32
config.yaml
32
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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue