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
a883d3ea
authored
2024-06-11 12:27:13 +0800
by
chenyao
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
Merge branch 'master' into feature/uat-tmp-cy
2 parents
2f1da6a1
3a4fd0b0
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
99 additions
and
13 deletions
src/apps/doc/consts.py
src/apps/doc/management/commands/ocr_process.py
src/apps/doc/models.py
src/apps/doc/views.py
src/celery_compare/tasks.py
src/common/tools/comparison.py
src/apps/doc/consts.py
View file @
a883d3e
...
...
@@ -1675,15 +1675,30 @@ SE_FSM_MSI_MAP = {
'签单日期'
:
(
2
,
'签单日期'
),
}
def
get_page_customer_sign
(
page_no
):
return
(
page_no
,
'客户签名'
)
def
get_page_sign_date
(
page_no
):
return
(
page_no
,
'签单日期'
)
SE_FSM_SC_MAP
=
{
'姓名'
:
(
1
,
'姓名'
),
'证件类型'
:
(
1
,
'证件类型'
),
'证件号码'
:
(
1
,
'证件号码'
),
'总价'
:
(
1
,
'总价'
),
'客户签名'
:
(
12
,
'客户签名'
)
,
'签单日期'
:
(
12
,
'签单日期'
)
,
'客户签名'
:
get_page_customer_sign
,
'签单日期'
:
get_page_sign_date
,
}
# SE_FSM_SC_MAP = {
# '姓名': (1, '姓名'),
# '证件类型': (1, '证件类型'),
# '证件号码': (1, '证件号码'),
# '总价': (1, '总价'),
# '客户签名': (12, '客户签名'),
# '签单日期': (12, '签单日期'),
# }
SE_FSM_SC2_MAP
=
{
'姓名'
:
(
1
,
'姓名'
),
'证件类型'
:
(
1
,
'证件类型'
),
...
...
@@ -1885,7 +1900,7 @@ ZZSSE_FIELD = '增值税税额'
MVI_COMPARE_LOGIC
=
{
'vinNo'
:
(
'车辆识别代码'
,
'se_common_compare'
,
{},
'发票车架号与系统不一致'
),
'dealer'
:
(
'销方名称'
,
'se_
common
_compare'
,
{
'brackets_replace'
:
True
},
'发票销货单位名称与系统不一致'
),
'dealer'
:
(
'销方名称'
,
'se_
input_list
_compare'
,
{
'brackets_replace'
:
True
},
'发票销货单位名称与系统不一致'
),
'vehicleTransactionAmount'
:
(
'价税合计小写'
,
'se_amount_compare'
,
{},
'发票车辆价格与系统不一致'
),
'customerName'
:
(
'购方名称'
,
'se_name_compare'
,
{
'is_passport'
:
True
,
'replace_kuohao'
:
True
},
'发票购买方姓名与系统不一致'
),
'idNum'
:
(
'购买方身份证号或组织机构代码'
,
'se_common_compare'
,
{},
'发票购买方证件号码与系统不一致'
),
...
...
src/apps/doc/management/commands/ocr_process.py
View file @
a883d3e
...
...
@@ -1030,10 +1030,23 @@ class Command(BaseCommand, LoggerMixin):
elif
classify
in
consts
.
SE_FSM_CON_MAP
:
res
=
{}
for
key
,
(
pno1
,
key1
)
in
consts
.
SE_FSM_CON_MAP
[
classify
]
.
items
():
# for key, (pno1, key1) in consts.SE_FSM_CON_MAP[classify].items():
# res[key] = page_info_dict.get(str(pno1), {}).get(key1)
# res.setdefault(consts.IMG_PATH_KEY, dict())[key] = page_info_dict.get(str(pno1), {}).get(
# consts.IMG_PATH_KEY, '')
# license_summary[classify] = [res]
for
key
,
value
in
consts
.
SE_FSM_CON_MAP
[
classify
]
.
items
():
if
callable
(
value
):
for
page_no
in
page_info_dict
.
keys
():
if
page_no
!=
'is_asp'
and
page_no
!=
'1'
:
pno1
,
key1
=
value
(
int
(
page_no
))
res
[
key
]
=
page_info_dict
.
get
(
str
(
pno1
),
{})
.
get
(
key1
)
res
.
setdefault
(
consts
.
IMG_PATH_KEY
,
dict
())[
key
]
=
page_info_dict
.
get
(
str
(
pno1
),
{})
.
get
(
consts
.
IMG_PATH_KEY
,
''
)
res
.
setdefault
(
consts
.
IMG_PATH_KEY
,
dict
())[
key
]
=
page_info_dict
.
get
(
str
(
pno1
),
{})
.
get
(
consts
.
IMG_PATH_KEY
,
''
)
else
:
pno1
,
key1
=
value
res
[
key
]
=
page_info_dict
.
get
(
str
(
pno1
),
{})
.
get
(
key1
)
res
.
setdefault
(
consts
.
IMG_PATH_KEY
,
dict
())[
key
]
=
page_info_dict
.
get
(
str
(
pno1
),
{})
.
get
(
consts
.
IMG_PATH_KEY
,
''
)
license_summary
[
classify
]
=
[
res
]
def
rebuild_bs_summary
(
self
,
bs_summary
,
unknown_summary
):
...
...
src/apps/doc/models.py
View file @
a883d3e
...
...
@@ -1109,3 +1109,13 @@ class HILCmsStatusInfo(models.Model):
class
Meta
:
managed
=
False
db_table
=
'hil_cms_status_info'
class
DealerMapping
(
models
.
Model
):
id
=
models
.
AutoField
(
primary_key
=
True
,
verbose_name
=
"id"
)
# 主键
cms_value
=
models
.
CharField
(
max_length
=
64
,
verbose_name
=
"CMS中的 dealer name"
)
mapping_value
=
models
.
CharField
(
max_length
=
64
,
verbose_name
=
"映射后的 dealer name"
)
create_time
=
models
.
DateTimeField
(
verbose_name
=
'创建时间'
)
class
Meta
:
managed
=
False
db_table
=
'dealer_mapping'
\ No newline at end of file
...
...
src/apps/doc/views.py
View file @
a883d3e
...
...
@@ -1116,7 +1116,8 @@ class DocView(DocGenericView, DocHandler):
document_scheme
=
request
.
POST
.
get
(
'document_scheme'
,
''
)
data_source
=
request
.
POST
.
get
(
'data_source'
,
''
)
document_name
=
request
.
POST
.
get
(
'document_name'
,
''
)
args
=
{
'business_type'
:
business_type
,
'document_scheme'
:
document_scheme
,
'data_source'
:
data_source
,
'document_name'
:
document_name
,
'pdf_file'
:
pdf_file
}
fsm
=
request
.
POST
.
get
(
'is_fsm'
,
'N'
)
args
=
{
'business_type'
:
business_type
,
'document_scheme'
:
document_scheme
,
'data_source'
:
data_source
,
'document_name'
:
document_name
,
'pdf_file'
:
pdf_file
,
'fsm'
:
fsm
}
# business_type = random.choice(consts.BUSINESS_TYPE_LIST)
# business_type = consts.BUSINESS_TYPE_LIST[0]
tmp_save_path
=
os
.
path
.
join
(
conf
.
DATA_DIR
,
business_type
,
'{0}.pdf'
.
format
(
metadata_version_id
))
...
...
@@ -1166,6 +1167,7 @@ class DocView(DocGenericView, DocHandler):
# co_applicant='',
# guarantor_1='',
# guarantor_2='',
is_ovp_fsm
=
1
if
fsm
==
'Y'
else
0
,
document_name
=
application_id
,
document_scheme
=
document_scheme
,
data_source
=
data_source
,
...
...
src/celery_compare/tasks.py
View file @
a883d3e
...
...
@@ -38,6 +38,7 @@ from apps.doc.models import (
HILCompareReportNew
,
AFCCompareReportNew
,
AFCDoc
,
DealerMapping
,
)
from
apps.doc
import
consts
from
apps.doc.ocr.gcap
import
gcap
...
...
@@ -900,7 +901,7 @@ def ca_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res
traceback
.
format_exc
()))
def
get_se_cms_compare_info_auto
(
last_obj
,
application_entity
,
data_source
,
auto
=
True
,
ignore_bank
=
False
):
def
get_se_cms_compare_info_auto
(
application_id
,
last_obj
,
application_entity
,
data_source
,
auto
=
True
,
ignore_bank
=
False
):
cms_info
=
json
.
loads
(
last_obj
.
content
)
compare_info
=
{}
...
...
@@ -913,6 +914,21 @@ def get_se_cms_compare_info_auto(last_obj, application_entity, data_source, auto
dealer_name
=
''
if
len
(
dealer_name_list
)
==
0
else
dealer_name_list
[
-
1
]
issuer_dealer
=
cms_info
.
get
(
'fapiaoIssuerDealer'
,
''
)
.
strip
()
#CHINARPA-4546 delaerName变为list,包含dealer_name_list[0]映射后对应的所有值 + dealer_name_list[-1],比对时,任一完全一致为Y,全部不一致为N
dealer_name_list_ex
=
[]
dealer_name_mapper_list
=
[]
if
len
(
dealer_name_list
)
!=
0
:
dealer_name_list_ex
.
append
(
dealer_name_list
[
-
1
])
# CMS的最后一个值
dealer_name_mapper_obj
=
DealerMapping
.
objects
.
filter
(
cms_value
=
dealer_name_list
[
0
])
.
first
()
if
dealer_name_mapper_obj
is
not
None
:
dealer_name_mapper_str
=
dealer_name_mapper_obj
.
mapping_value
dealer_name_mapper_list
=
dealer_name_mapper_str
.
split
(
','
)
dealer_name_list_ex
.
extend
(
dealer_name_mapper_list
)
# 映射后的所有值
issuer_dealer_list
=
[]
issuer_dealer_list
.
append
(
cms_info
.
get
(
'fapiaoIssuerDealer'
,
''
)
.
strip
())
compare_log
.
info
(
'[get_se_cms_compare_info_auto] [新车发票] [application_id {0}] [dealer_name_mapper_list {1}] [dealer_name_list_ex {2}] [issuer_dealer {3}]'
.
format
(
application_id
,
dealer_name_mapper_list
,
dealer_name_list_ex
,
issuer_dealer_list
))
# 个人信息证件------------------------------------------------------------------------------------------------------
# is_cdfl = True # 车贷分离
is_cdfl_bo
=
False
# 车贷分离,主借
...
...
@@ -1040,7 +1056,7 @@ def get_se_cms_compare_info_auto(last_obj, application_entity, data_source, auto
# 新车发票----------------------------------------------------------------------------------------------------------
if
vehicle_status
==
'New'
:
vehicle_field_input
.
append
((
'vinNo'
,
vin_no
))
vehicle_field_input
.
append
((
'dealer'
,
dealer_name
if
len
(
issuer_dealer
)
==
0
else
issuer_dealer
))
vehicle_field_input
.
append
((
'dealer'
,
dealer_name
_list_ex
if
len
(
issuer_dealer_list
[
0
])
==
0
else
issuer_dealer_list
))
vehicle_field_input
.
append
((
'vehicleTransactionAmount'
,
amount
))
if
isinstance
(
company_info
,
tuple
):
...
...
@@ -1453,7 +1469,7 @@ def get_se_cms_compare_info_auto(last_obj, application_entity, data_source, auto
return
compare_info
,
cms_info
.
get
(
'autoApprovedDetails'
,
{})
.
get
(
'aaType'
,
''
),
is_gsyh
def
get_se_cms_compare_info
(
last_obj
,
application_entity
,
detect_list
,
data_source
,
auto
=
False
,
ignore_bank
=
False
):
def
get_se_cms_compare_info
(
application_id
,
last_obj
,
application_entity
,
detect_list
,
data_source
,
auto
=
False
,
ignore_bank
=
False
):
cms_info
=
json
.
loads
(
last_obj
.
content
)
compare_info
=
{}
...
...
@@ -1466,6 +1482,21 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list, data_sour
dealer_name
=
''
if
len
(
dealer_name_list
)
==
0
else
dealer_name_list
[
-
1
]
issuer_dealer
=
cms_info
.
get
(
'fapiaoIssuerDealer'
,
''
)
.
strip
()
#CHINARPA-4546 delaerName变为list,包含dealer_name_list[0]映射后对应的所有值 + dealer_name_list[-1],比对时,任一完全一致为Y,全部不一致为N
dealer_name_list_ex
=
[]
dealer_name_mapper_list
=
[]
if
len
(
dealer_name_list
)
!=
0
:
dealer_name_list_ex
.
append
(
dealer_name_list
[
-
1
])
# CMS的最后一个值
dealer_name_mapper_obj
=
DealerMapping
.
objects
.
filter
(
cms_value
=
dealer_name_list
[
0
])
.
first
()
if
dealer_name_mapper_obj
is
not
None
:
dealer_name_mapper_str
=
dealer_name_mapper_obj
.
mapping_value
dealer_name_mapper_list
=
dealer_name_mapper_str
.
split
(
','
)
dealer_name_list_ex
.
extend
(
dealer_name_mapper_list
)
# 映射后的所有值
issuer_dealer_list
=
[]
issuer_dealer_list
.
append
(
cms_info
.
get
(
'fapiaoIssuerDealer'
,
''
)
.
strip
())
compare_log
.
info
(
'[get_se_cms_compare_info_] [新车发票] [application_id {0}] [dealer_name_mapper_list {1}] [dealer_name_list_ex {2}] [issuer_dealer {3}]'
.
format
(
application_id
,
dealer_name_mapper_list
,
dealer_name_list_ex
,
issuer_dealer_list
))
# 个人信息证件------------------------------------------------------------------------------------------------------
is_cdfl_bo
=
False
# 车贷分离,主借
is_cdfl_co
=
False
# 车贷分离,共借
...
...
@@ -1588,7 +1619,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list, data_sour
# 新车发票----------------------------------------------------------------------------------------------------------
if
vehicle_status
==
'New'
:
vehicle_field_input
.
append
((
'vinNo'
,
vin_no
))
vehicle_field_input
.
append
((
'dealer'
,
dealer_name
if
len
(
issuer_dealer
)
==
0
else
issuer_dealer
))
vehicle_field_input
.
append
((
'dealer'
,
dealer_name
_list_ex
if
len
(
issuer_dealer_list
[
0
])
==
0
else
issuer_dealer_list
))
vehicle_field_input
.
append
((
'vehicleTransactionAmount'
,
amount
))
if
isinstance
(
company_info
,
tuple
):
...
...
@@ -3126,7 +3157,7 @@ def se_compare_auto(application_id, application_entity, ocr_res_id, last_obj, oc
# 比对逻辑
# detect_list = se_result_detect(ocr_res_dict)
compare_info
,
aa_type
,
is_gsyh
=
get_se_cms_compare_info_auto
(
last_obj
,
application_entity
,
data_source
,
ignore_bank
=
ignore_bank
)
application_id
,
last_obj
,
application_entity
,
data_source
,
ignore_bank
=
ignore_bank
)
compare_result
,
total_fields
,
failed_count
,
successful_at_this_level
,
failure_reason_str
,
\
cn_failure_reason_str
,
bs_failure_reason_str
,
_
,
field_result_dict
=
se_compare_process
(
compare_info
,
ocr_res_dict
,
is_gsyh
,
True
,
id_res_list
,
aa_type
)
...
...
@@ -3193,7 +3224,7 @@ def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res
start_time
=
datetime
.
now
()
detect_list
=
se_result_detect
(
ocr_res_dict
)
compare_info
,
application_version
,
aa_type
,
is_gsyh
=
get_se_cms_compare_info
(
last_obj
,
application_entity
,
detect_list
,
data_source
,
ignore_bank
=
ignore_bank
)
application_id
,
last_obj
,
application_entity
,
detect_list
,
data_source
,
ignore_bank
=
ignore_bank
)
compare_result
,
total_fields
,
failed_count
,
successful_at_this_level
,
failure_reason_str
,
\
cn_failure_reason_str
,
bs_failure_reason_str
,
rpa_failure_reason
,
field_result_dict
=
se_compare_process
(
compare_info
,
ocr_res_dict
,
is_gsyh
,
False
,
id_res_list
,
aa_type
)
...
...
src/common/tools/comparison.py
View file @
a883d3e
...
...
@@ -8,7 +8,9 @@ from .rmb_lower import rmb_handler
from
pandas._libs
import
tslib
from
pandas._libs.tslibs.nattype
import
NaTType
from
pandas.core.indexes.datetimes
import
DatetimeIndex
import
logging
compare_log
=
logging
.
getLogger
(
'compare'
)
class
Comparison
:
...
...
@@ -187,6 +189,19 @@ class Comparison:
else
:
return
self
.
RESULT_N
def
se_input_list_compare
(
self
,
input_list
,
ocr_str
,
**
kwargs
):
if
isinstance
(
input_list
,
list
)
and
len
(
input_list
)
>
0
and
isinstance
(
ocr_str
,
str
):
ocr_str
=
ocr_str
.
translate
(
self
.
KH_TRANS
)
for
input_str
in
input_list
:
input_str
=
input_str
.
translate
(
self
.
KH_TRANS
)
compare_log
.
info
(
'[se_input_list_compare] [input_str {0}] [ocr_str {1}]'
.
format
(
input_str
,
ocr_str
))
if
input_str
==
ocr_str
:
return
self
.
RESULT_Y
return
self
.
RESULT_N
else
:
return
self
.
RESULT_N
def
super_list_compare
(
self
,
input_list
,
ocr_str
,
**
kwargs
):
for
input_str
in
input_list
:
if
kwargs
.
get
(
'method'
,
'common'
)
==
'name'
:
...
...
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