Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
周伟奇
/
bmw-ocr
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
50de32a9
authored
2021-12-17 14:32:38 +0800
by
周伟奇
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
fix bs compare
1 parent
b2cb841e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
126 additions
and
37 deletions
src/apps/doc/consts.py
src/apps/doc/ocr/wb.py
src/celery_compare/tasks.py
src/apps/doc/consts.py
View file @
50de32a
...
...
@@ -1410,7 +1410,7 @@ SE_STAMP_VALUE = '有'
SE_LAYOUT_VALUE
=
'旧版-旧打印、新版-新打印'
SE_GB_NEW_FIELD
=
[
'vinNo'
]
SE_GB_USED_FIELD
=
[
'customerName'
,
'idNum'
,
'date'
]
SE_BS_FIELD
=
[
'户名'
,
'打印日期'
,
'流水日期'
,
'(担保人
)户名'
,
'(担保人)打印日期'
,
'(担保人
)流水日期'
]
SE_BS_FIELD
=
[
'户名'
,
'打印日期'
,
'流水日期'
,
'(担保人
1)户名'
,
'(担保人1)打印日期'
,
'(担保人1)流水日期'
,
'(担保人2)户名'
,
'(担保人2)打印日期'
,
'(担保人2
)流水日期'
]
SE_HMH_FIELD
=
[
'借款人/承租人姓名'
,
'借款人/承租人证件号'
,
'申请号'
,
'渠道'
,
'签字'
]
SE_BD_FIELD
=
[
'被保险人姓名'
,
'被保险人证件号码'
,
'车架号'
,
'机动车损失保险金额'
,
'第三者责任保险金额'
,
'绝对免赔率'
,
'保险起始日期'
,
'保险截止日期'
,
'保单章'
,
'第一受益人'
,
'保险费合计'
]
JDMPV_VALUE
=
[
'-'
,
'--'
,
'0
%
'
,
'0.00'
,
'/'
,
'0'
]
...
...
@@ -1781,11 +1781,14 @@ BD_COMPARE_LOGIC = {
BS_COMPARE_LOGIC
=
{
'户名'
:
(
'role'
,
'se_one_compare'
,
{},
'主共借人未提供银行流水'
),
'(担保人)户名'
:
(
'role'
,
'se_one_compare'
,
{},
'担保人未提供银行流水'
),
'(担保人1)户名'
:
(
'role'
,
'se_name_compare'
,
{},
'担保人1未提供银行流水'
),
'(担保人2)户名'
:
(
'role'
,
'se_name_compare'
,
{},
'担保人2未提供银行流水'
),
'打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'主共借人银行流水打印日期超过15天'
),
'(担保人)打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'担保人银行流水打印日期超过15天'
),
'(担保人1)打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'担保人1银行流水打印日期超过15天'
),
'(担保人2)打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'担保人2银行流水打印日期超过15天'
),
'流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'主共借人银行流水日期不满足3个月'
),
'(担保人)流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'担保人银行流水日期不满足3个月'
),
'(担保人1)流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'担保人1银行流水日期不满足3个月'
),
'(担保人2)流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'担保人2银行流水日期不满足3个月'
),
}
SPECIAL_REASON
=
'主共借人未提供银行流水,含担保人需人工查看直系亲属关系'
...
...
src/apps/doc/ocr/wb.py
View file @
50de32a
...
...
@@ -312,21 +312,21 @@ class BSWorkbook(Workbook):
(
ws
.
title
,
idx_list
[
i
]
+
min_row
,
idx_list
[
i
+
1
]
+
min_row
-
1
,
day_mean
))
def
build_metadata_rows
(
self
,
confidence
,
code
,
verify_list
,
print_time
,
start_date
,
end_date
,
res_count_tuple
,
is_verify_classify
):
metadata_rows
=
[
(
'流水识别置信度'
,
confidence
),
(
'图片总数'
,
res_count_tuple
[
0
]),
(
'识别成功'
,
res_count_tuple
[
1
]),
self
.
blank_row
,
]
verify_highlight_row
=
[]
metadata_rows
=
[(
'流水识别置信度'
,
confidence
)]
if
is_verify_classify
:
verify_res
=
'疑似伪造'
if
len
(
verify_list
)
>
0
else
'正常'
metadata_rows
.
append
((
'流水检测结果'
,
verify_res
))
if
len
(
verify_list
)
>
0
:
metadata_rows
.
append
(
self
.
verify_header
)
metadata_rows
.
extend
(
verify_list
)
for
r
in
range
(
5
,
len
(
metadata_rows
)
+
1
):
else
:
verify_res
=
''
metadata_rows
.
append
((
'流水检测结果'
,
verify_res
))
metadata_rows
.
append
((
'图片总数'
,
res_count_tuple
[
0
]))
metadata_rows
.
append
((
'识别成功'
,
res_count_tuple
[
1
]))
metadata_rows
.
append
(
self
.
blank_row
)
verify_highlight_row
=
[]
if
is_verify_classify
and
len
(
verify_list
)
>
0
:
metadata_rows
.
append
(
self
.
verify_header
)
metadata_rows
.
extend
(
verify_list
)
for
r
in
range
(
6
,
len
(
metadata_rows
)
+
1
):
verify_highlight_row
.
append
(
r
)
metadata_rows
.
append
(
self
.
blank_row
)
...
...
@@ -355,14 +355,18 @@ class BSWorkbook(Workbook):
ms
=
self
.
create_sheet
(
'{0}{1}({2})'
.
format
(
self
.
meta_sheet_title
,
role_name
,
card
))
for
row
in
metadata_rows
:
ms
.
append
(
row
)
if
len
(
verify_highlight_row
)
>
0
:
for
cell
in
ms
[
2
]:
cell
.
fill
=
self
.
amount_fill
for
row
in
verify_highlight_row
:
for
cell
in
ms
[
row
]:
cell
.
fill
=
self
.
amount_fill
if
res_count_tuple
[
0
]
!=
res_count_tuple
[
1
]:
for
cell
in
ms
[
2
]:
cell
.
fill
=
self
.
amount_fill
for
cell
in
ms
[
3
]:
cell
.
fill
=
self
.
amount_fill
for
cell
in
ms
[
4
]:
cell
.
fill
=
self
.
amount_fill
return
ms
@staticmethod
...
...
src/celery_compare/tasks.py
View file @
50de32a
...
...
@@ -880,7 +880,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
company_info_list
=
[]
# 个人信息证件---------------------------------------------------------------------------------------------------------
province
=
cms_info
.
get
(
'province'
,
''
)
#
province = cms_info.get('province', '')
for
individual_info
in
cms_info
.
get
(
'applicantInformation'
,
[]):
all_id_num
=
[]
...
...
@@ -1082,12 +1082,19 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
dbr_bs_role_list
=
[]
for
dbr_bs_role
,
_
,
_
in
main_role_info
.
get
(
consts
.
APPLICANT_TYPE_ORDER
[
2
],
[]):
dbr_bs_role_list
.
append
(
dbr_bs_role
)
if
len
(
dbr_bs_role_list
)
>
0
:
if
len
(
dbr_bs_role_list
)
>=
1
:
bs_field_input
.
extend
([
(
consts
.
SE_BS_FIELD
[
3
],
dbr_bs_role_list
),
(
consts
.
SE_BS_FIELD
[
3
],
dbr_bs_role_list
[
0
]
),
(
consts
.
SE_BS_FIELD
[
4
],
first_submission_date
),
(
consts
.
SE_BS_FIELD
[
5
],
'90天'
),
])
if
len
(
dbr_bs_role_list
)
>=
2
:
bs_field_input
.
extend
([
(
consts
.
SE_BS_FIELD
[
6
],
dbr_bs_role_list
[
1
]),
(
consts
.
SE_BS_FIELD
[
7
],
first_submission_date
),
(
consts
.
SE_BS_FIELD
[
8
],
'90天'
),
])
bs_info
[
consts
.
BS_EN
]
=
bs_field_input
compare_info
[
'Bank Statement'
]
=
bs_info
...
...
@@ -1522,7 +1529,8 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
if
ocr_res_str
is
not
None
:
pre_field_list
=
strip_list
[:
3
]
suf_field_list
=
strip_list
[
3
:]
dbr1_field_list
=
strip_list
[
3
:
6
]
dbr2_field_list
=
strip_list
[
6
:]
ocr_res_list
=
json
.
loads
(
ocr_res_str
)
# length = len(ocr_res_list)
...
...
@@ -1558,14 +1566,14 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
max_correct_count
=
correct_count
pre_best_res
=
pre_tmp_res_part
# 担保人
suf
_best_res
=
{}
if
len
(
suf
_field_list
)
>
0
:
# 担保人
1
dbr1
_best_res
=
{}
if
len
(
dbr1
_field_list
)
>
0
:
max_correct_count
=
0
for
ocr_res
in
ocr_res_list
:
correct_count
=
0
suf
_tmp_res_part
=
{}
for
idx
,
(
name
,
value
)
in
enumerate
(
suf
_field_list
):
dbr1
_tmp_res_part
=
{}
for
idx
,
(
name
,
value
)
in
enumerate
(
dbr1
_field_list
):
ocr_str_or_list
=
ocr_res
.
get
(
compare_logic
[
name
][
0
])
if
isinstance
(
ocr_str_or_list
,
str
)
or
isinstance
(
ocr_str_or_list
,
list
):
result
=
getattr
(
cp
,
compare_logic
[
name
][
1
])(
value
,
ocr_str_or_list
,
**
compare_logic
[
name
][
2
])
...
...
@@ -1584,11 +1592,62 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
if
result
==
consts
.
RESULT_Y
:
correct_count
+=
1
suf
_tmp_res_part
[
name
]
=
(
result
,
ocr_str
,
reason
)
dbr1
_tmp_res_part
[
name
]
=
(
result
,
ocr_str
,
reason
)
if
correct_count
>
0
and
correct_count
>=
max_correct_count
:
max_correct_count
=
correct_count
suf_best_res
=
suf_tmp_res_part
dbr1_best_res
=
dbr1_tmp_res_part
# 担保人2
dbr2_best_res
=
{}
if
len
(
dbr1_field_list
)
>
0
:
max_correct_count
=
0
for
ocr_res
in
ocr_res_list
:
correct_count
=
0
dbr2_tmp_res_part
=
{}
for
idx
,
(
name
,
value
)
in
enumerate
(
dbr2_field_list
):
ocr_str_or_list
=
ocr_res
.
get
(
compare_logic
[
name
][
0
])
if
isinstance
(
ocr_str_or_list
,
str
)
or
isinstance
(
ocr_str_or_list
,
list
):
result
=
getattr
(
cp
,
compare_logic
[
name
][
1
])(
value
,
ocr_str_or_list
,
**
compare_logic
[
name
][
2
])
if
isinstance
(
ocr_str_or_list
,
list
):
ocr_str
=
json
.
dumps
(
ocr_str_or_list
,
ensure_ascii
=
False
)
else
:
ocr_str
=
ocr_str_or_list
reason
=
compare_logic
[
name
][
3
]
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
reason
=
compare_logic
[
name
][
3
]
if
idx
==
0
and
result
==
consts
.
RESULT_N
:
break
if
result
==
consts
.
RESULT_Y
:
correct_count
+=
1
dbr2_tmp_res_part
[
name
]
=
(
result
,
ocr_str
,
reason
)
if
correct_count
>
0
and
correct_count
>=
max_correct_count
:
max_correct_count
=
correct_count
dbr2_best_res
=
dbr2_tmp_res_part
dbr_ok
=
False
# 有担保人
if
len
(
dbr1_field_list
)
>
0
:
# 有担保人12
if
len
(
dbr2_field_list
)
>
0
:
if
len
(
dbr1_best_res
)
>
0
and
len
(
dbr2_best_res
)
>
0
:
dbr_ok
=
True
# 有担保人1
else
:
if
len
(
dbr1_best_res
)
>
0
:
dbr_ok
=
True
# 无担保人
# else:
# pass
best_res_empty
=
False
if
len
(
pre_best_res
)
==
0
and
len
(
dbr1_best_res
)
==
0
and
len
(
dbr2_best_res
)
==
0
:
best_res_empty
=
True
for
name
,
value
in
pre_field_list
:
if
len
(
pre_best_res
)
>
0
:
...
...
@@ -1596,7 +1655,9 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
if
len
(
suf_field_list
)
>
0
and
len
(
suf_best_res
)
>
0
:
if
best_res_empty
:
reason
=
consts
.
SPECIAL_REASON_3
elif
dbr_ok
:
# 有担保人且担保人都提供了流水
reason
=
consts
.
SPECIAL_REASON
else
:
reason
=
compare_logic
[
pre_field_list
[
0
][
0
]][
3
]
...
...
@@ -1606,17 +1667,38 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
value
=
json
.
dumps
(
value
,
ensure_ascii
=
False
)
result_field_list
.
append
((
name
,
value
,
result
,
ocr_str
,
img_path
,
error_type
,
reason
))
if
len
(
suf_field_list
)
>
0
:
for
name
,
value
in
suf_field_list
:
if
len
(
suf_best_res
)
>
0
:
result
,
ocr_str
,
reason
=
suf_best_res
[
name
]
if
len
(
dbr1_field_list
)
>
0
:
for
name
,
value
in
dbr1_field_list
:
if
len
(
dbr1_best_res
)
>
0
:
result
,
ocr_str
,
reason
=
dbr1_best_res
[
name
]
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
if
best_res_empty
:
reason
=
consts
.
SPECIAL_REASON_3
elif
len
(
pre_best_res
)
>
0
:
reason
=
consts
.
SPECIAL_REASON_2
else
:
reason
=
compare_logic
[
dbr1_field_list
[
0
][
0
]][
3
]
img_path
=
empty_str
error_type
=
empty_error_type
if
result
==
consts
.
RESULT_Y
else
ErrorType
.
OCR
.
value
if
isinstance
(
value
,
list
):
value
=
json
.
dumps
(
value
,
ensure_ascii
=
False
)
result_field_list
.
append
((
name
,
value
,
result
,
ocr_str
,
img_path
,
error_type
,
reason
))
if
len
(
dbr2_field_list
)
>
0
:
for
name
,
value
in
dbr2_field_list
:
if
len
(
dbr2_best_res
)
>
0
:
result
,
ocr_str
,
reason
=
dbr2_best_res
[
name
]
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
if
len
(
pre_best_res
)
>
0
:
if
best_res_empty
:
reason
=
consts
.
SPECIAL_REASON_3
elif
len
(
pre_best_res
)
>
0
:
reason
=
consts
.
SPECIAL_REASON_2
else
:
reason
=
compare_logic
[
suf
_field_list
[
0
][
0
]][
3
]
reason
=
compare_logic
[
dbr2
_field_list
[
0
][
0
]][
3
]
img_path
=
empty_str
error_type
=
empty_error_type
if
result
==
consts
.
RESULT_Y
else
ErrorType
.
OCR
.
value
if
isinstance
(
value
,
list
):
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment