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
e34beaaf
authored
2021-12-13 12:26:33 +0800
by
周伟奇
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
Merge branch 'feature/se' into feature/1223
2 parents
c3e66f31
8b3fd09a
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
432 additions
and
50 deletions
src/apps/doc/consts.py
src/apps/doc/management/commands/ocr_process.py
src/apps/doc/models.py
src/celery_compare/tasks.py
src/common/tools/comparison.py
src/common/tools/mssql_script11.py
src/apps/doc/consts.py
View file @
e34beaa
...
...
@@ -1178,6 +1178,9 @@ DDA_OCR_FIELD = 'bs_ocr'
HMH_OCR_FIELD
=
'hmh_ocr'
JYPZ_OCR_FIELD
=
'jypz_ocr'
HT_FIELD
=
'ht_ocr'
BD_FIELD
=
'bd_ocr'
BS_FIELD
=
'bss_ocr'
BS_CLASSIFY
=
10087
RESULT_MAPPING
=
{
MVI_CLASSIFY
:
MVI_OCR_FIELD
,
...
...
@@ -1195,9 +1198,11 @@ RESULT_MAPPING = {
HMH_CLASSIFY
:
HMH_OCR_FIELD
,
JYPZ_CLASSIFY
:
JYPZ_OCR_FIELD
,
CONTRACT_CLASSIFY
:
HT_FIELD
,
INSURANCE_CLASSIFY
:
BD_FIELD
,
BS_CLASSIFY
:
BS_FIELD
,
}
CA_ADD_COMPARE_FIELDS
=
(
IC_OCR_FIELD
,
BL_OCR_FIELD
)
CA_ADD_COMPARE_FIELDS
=
(
IC_OCR_FIELD
,
BL_OCR_FIELD
,
BS_FIELD
)
COMPARE_FIELDS
=
(
MVI_OCR_FIELD
,
IC_OCR_FIELD
,
...
...
@@ -1213,6 +1218,8 @@ COMPARE_FIELDS = (MVI_OCR_FIELD,
HMH_OCR_FIELD
,
JYPZ_OCR_FIELD
,
HT_FIELD
,
BD_FIELD
,
BS_FIELD
,
)
# 身份证
...
...
@@ -1393,7 +1400,10 @@ SE_STAMP_VALUE = '有'
SE_LAYOUT_VALUE
=
'旧版-旧打印、新版-新打印'
SE_GB_NEW_FIELD
=
[
'vinNo'
]
SE_GB_USED_FIELD
=
[
'customerName'
,
'idNum'
,
'date'
]
SE_BS_FIELD
=
[
'户名'
,
'打印日期'
,
'流水日期'
,
'(担保人)户名'
,
'(担保人)打印日期'
,
'(担保人)流水日期'
]
SE_HMH_FIELD
=
[
'借款人/承租人姓名'
,
'借款人/承租人证件号'
,
'申请号'
,
'渠道'
,
'签字'
]
SE_BD_FIELD
=
[
'被保险人姓名'
,
'被保险人证件号码'
,
'车架号'
,
'机动车损失保险金额'
,
'第三者责任保险金额'
,
'绝对免赔率'
,
'保险起始日期'
,
'保险截止日期'
,
'保单章'
,
'第一受益人'
,
'保险费合计'
]
JDMPV_VALUE
=
[
'-'
,
'--'
,
'0
%
'
,
'0.00'
,
'/'
,
'0'
]
SE_BANK_FIELD
=
[
'accountNo'
,
'bankName'
]
SE_DDA_FIELD
=
[
'applicationId(1)'
,
'applicationId(2)'
,
'bankName'
,
'companyName'
,
'customerName'
,
'idNum'
,
'accountHolderName'
,
'accountNo'
]
...
...
@@ -1502,6 +1512,8 @@ DDA_EN = 'DDA'
HMH_EN
=
'Mortgage Waiver Letter'
JYPZ_EN
=
'Used Car Document'
AFC_CONTRACT_EN
=
'AFC Contract'
BD_EN
=
'Insurance'
BS_EN
=
'Bank Statement'
SKIP_CARD
=
{
SME_BL_EN
}
...
...
@@ -1643,6 +1655,31 @@ HMH_COMPARE_LOGIC = {
'签字'
:
(
'借款人签字/盖章'
,
'se_common_compare'
,
{},
'抵押登记豁免函签字需人工核查'
),
}
BD_COMPARE_LOGIC
=
{
'被保险人姓名'
:
(
'被保险人姓名'
,
'se_name_compare'
,
{},
'保单被保险人姓名与系统不一致'
),
'被保险人证件号码'
:
(
'被保险人证件号码'
,
'se_common_compare'
,
{},
'保单被保险人证件号码与系统不一致'
),
'车架号'
:
(
'车架号'
,
'se_common_compare'
,
{},
'保单车架号与系统不一致'
),
'机动车损失保险金额'
:
(
'机动车损失保险金额'
,
'se_amount_lte_compare'
,
{},
'保单车损险异常'
),
'第三者责任保险金额'
:
(
'机动车第三者责任保险金额'
,
'se_amount_lte_compare'
,
{},
'保单三者险异常'
),
'绝对免赔率'
:
(
'机动车损失保险绝对免赔率/绝对免赔额'
,
'se_one_compare'
,
{},
'保单无绝对免赔项'
),
'保险起始日期'
:
(
'保险起始日期'
,
'se_bd_date_compare'
,
{
'start'
:
True
},
'保单起始时间有误'
),
'保险截止日期'
:
(
'保险截止日期'
,
'se_bd_date_compare'
,
{},
'保单截止时间有误'
),
'保单章'
:
(
'保单章'
,
'se_common_compare'
,
{},
'保单无保单章'
),
'第一受益人'
:
(
'特别约定第一受益人'
,
'se_common_compare'
,
{},
'保单第一受益人有误,需人工核查'
),
'保险费合计'
:
(
'保险费合计'
,
'se_amount_compare'
,
{},
'保单保费疑似无法覆盖ASP保险融资'
),
}
BS_COMPARE_LOGIC
=
{
'户名'
:
(
'role'
,
'se_one_compare'
,
{},
'主共借人未提供银行流水'
),
'(担保人)户名'
:
(
'role'
,
'se_one_compare'
,
{},
'担保人未提供银行流水,需人工查看直系亲属关系'
),
'打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'主共借人银行流水打印日期异常'
),
'(担保人)打印日期'
:
(
'print_time'
,
'se_bs_print_date_compare'
,
{},
'担保人银行流水打印日期异常'
),
'流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'主共借人银行流水日期异常'
),
'(担保人)流水日期'
:
(
'date'
,
'se_bs_date_compare'
,
{},
'担保人银行流水日期异常'
),
}
SPECIAL_REASON
=
'主共借人未提供银行流水,含担保人需人工查看直系亲属关系'
HT_COMPARE_LOGIC
=
{
'合同编号-每页'
:
(
'合同编号-每页'
,
'se_list_compare'
,
{},
'合同编号与系统不一致'
),
'所购车辆价格-小写-重要条款'
:
(
'所购车辆价格-小写-重要条款'
,
'se_amount_str_compare'
,
{},
'合同首页中车辆价格与系统不一致'
),
...
...
@@ -1710,7 +1747,9 @@ SE_COMPARE_FIELD = {
DDA_EN
:
(
DDA_OCR_FIELD
,
DDA_COMPARE_LOGIC
,
False
),
HMH_EN
:
(
HMH_OCR_FIELD
,
HMH_COMPARE_LOGIC
,
False
),
JYPZ_EN
:
(
JYPZ_OCR_FIELD
,
JYPZ_COMPARE_LOGIC
,
False
),
AFC_CONTRACT_EN
:
(
HT_FIELD
,
HT_COMPARE_LOGIC
,
False
)
AFC_CONTRACT_EN
:
(
HT_FIELD
,
HT_COMPARE_LOGIC
,
False
),
BD_EN
:
(
BD_FIELD
,
BD_COMPARE_LOGIC
,
False
),
BS_EN
:
(
BS_FIELD
,
BS_COMPARE_LOGIC
,
False
),
}
...
...
src/apps/doc/management/commands/ocr_process.py
View file @
e34beaa
...
...
@@ -872,6 +872,43 @@ class Command(BaseCommand, LoggerMixin):
summary
[
'role'
]
=
self
.
get_most
(
summary
[
'role'
])
return
bs_summary
def
rebuild_bs
(
self
,
bs_summary
):
# bs_summary = {
# '卡号': {
# 'classify': 0,
# 'confidence': 0.9,
# 'role': '柳雪',
# 'code': [('page', 'code'), ],
# 'verify': [(pno, ino, reason_str), ]
# 'print_time': 'datetime',
# 'start_date': 'datetime',
# 'end_date': 'datetime',
# 'sheet': ['sheet_name']
# }
# }
res
=
[]
for
bs_info
in
bs_summary
.
values
():
try
:
print_date
=
bs_info
.
get
(
'print_time'
,
''
)
.
strftime
(
"
%
Y-
%
m-
%
d"
)
except
Exception
as
e
:
print_date
=
''
try
:
start_date
=
bs_info
.
get
(
'start_date'
,
''
)
.
strftime
(
"
%
Y-
%
m-
%
d"
)
except
Exception
as
e
:
start_date
=
''
try
:
end_date
=
bs_info
.
get
(
'end_date'
,
''
)
.
strftime
(
"
%
Y-
%
m-
%
d"
)
except
Exception
as
e
:
end_date
=
''
res
.
append
(
{
'role'
:
bs_info
.
get
(
'role'
,
''
),
'print_time'
:
print_date
,
'date'
:
[
start_date
,
end_date
],
}
)
return
res
def
rebuild_contract
(
self
,
contract_result_compare
):
res_list
=
[]
for
classify
,
page_info_dict
in
contract_result_compare
.
items
():
...
...
@@ -1626,6 +1663,10 @@ class Command(BaseCommand, LoggerMixin):
if
len
(
contract_result_compare_rebuild
)
>
0
:
license_summary
[
consts
.
CONTRACT_CLASSIFY
]
=
contract_result_compare_rebuild
bs_rebuild
=
self
.
rebuild_bs
(
merged_bs_summary
)
if
len
(
bs_rebuild
)
>
0
:
license_summary
[
consts
.
BS_CLASSIFY
]
=
bs_rebuild
# 比对
if
len
(
license_summary
)
>
0
and
doc
.
document_scheme
!=
consts
.
DOC_SCHEME_LIST
[
2
]:
try
:
...
...
src/apps/doc/models.py
View file @
e34beaa
...
...
@@ -314,6 +314,8 @@ class AFCOCRResult(models.Model):
hmh_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"豁免函"
)
jypz_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"二手车交易凭证"
)
ht_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"AFC合同"
)
bd_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"保单"
)
bss_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"银行流水"
)
update_time
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'修改时间'
)
create_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'创建时间'
)
...
...
@@ -344,6 +346,8 @@ class HILOCRResult(models.Model):
hmh_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"豁免函"
)
jypz_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"二手车交易凭证"
)
ht_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"AFC合同"
)
bd_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"保单"
)
bss_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"银行流水"
)
update_time
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'修改时间'
)
create_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'创建时间'
)
...
...
@@ -373,6 +377,8 @@ class AFCSEOCRResult(models.Model):
hmh_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"豁免函"
)
jypz_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"二手车交易凭证"
)
ht_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"AFC合同"
)
bd_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"保单"
)
bss_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"银行流水"
)
update_time
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'修改时间'
)
create_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'创建时间'
)
...
...
@@ -403,6 +409,8 @@ class HILSEOCRResult(models.Model):
hmh_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"豁免函"
)
jypz_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"二手车交易凭证"
)
ht_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"AFC合同"
)
bd_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"保单"
)
bss_ocr
=
models
.
TextField
(
null
=
True
,
verbose_name
=
"银行流水"
)
update_time
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'修改时间'
)
create_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'创建时间'
)
...
...
src/celery_compare/tasks.py
View file @
e34beaa
...
...
@@ -879,8 +879,8 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
main_role_info
=
{}
company_info_list
=
[]
# 个人信息证件---------------------------------------------------------------------------------------------------------
province
=
cms_info
.
get
(
'province'
,
''
)
for
individual_info
in
cms_info
.
get
(
'applicantInformation'
,
[]):
all_id_num
=
[]
...
...
@@ -908,6 +908,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
field_input
.
append
((
'idExpiryDate'
,
id_info
.
get
(
'idExpiryDate'
,
''
)))
license_dict
[
license_en
]
=
field_input
all_id_num
.
append
(
id_num
)
# 营业执照 --------------------------------------------------------------------------------------------------
elif
id_info
.
get
(
'idType'
)
in
[
'Unified Social Credit Code'
,
'Tax Number'
,
'Business License Number'
]:
# ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode',
# 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate']
...
...
@@ -926,6 +927,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
if
individual_info
.
get
(
'customersubType'
,
''
)
==
'Corporate'
:
company_info_list
.
append
((
customer_name
,
id_num
))
# SME营业执照---------------------------------------------------------------------------------------------------
if
individual_info
.
get
(
'customersubType'
,
''
)
.
startswith
(
'Self Employed'
):
sep_field_input
=
[
(
'legalRepName'
,
customer_name
),
...
...
@@ -969,9 +971,10 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
vehicle_info
=
{}
vehicle_field_input
=
[]
vehicle_status
=
cms_info
.
get
(
'vehicleStatus'
,
''
)
first_subm
mis
on_date
=
cms_info
.
get
(
'submissionDate'
,
''
)
first_subm
issi
on_date
=
cms_info
.
get
(
'submissionDate'
,
''
)
vin_no
=
cms_info
.
get
(
'vehicleInformation'
,
{})
.
get
(
'vinNo'
,
''
)
amount
=
str
(
cms_info
.
get
(
'financialInformation'
,
{})
.
get
(
'vehiclePrice'
,
'0.0'
))
# 新车发票----------------------------------------------------------------------------------------------------------
if
vehicle_status
==
'New'
:
vehicle_field_input
.
append
((
'vinNo'
,
vin_no
))
vehicle_field_input
.
append
((
'dealer'
,
'、'
.
join
([
cms_info
.
get
(
'dealerName'
,
''
),
cms_info
.
get
(
'fapiaoIssuerDealer'
,
''
)])))
...
...
@@ -983,7 +986,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
else
:
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
0
],
hmh_name
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
1
],
hmh_id
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
2
],
first_subm
mis
on_date
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
2
],
first_subm
issi
on_date
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
3
],
consts
.
SE_STAMP_VALUE
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
4
],
consts
.
SE_FPL_VALUE
))
bhsj
=
float
(
amount
)
/
1.13
...
...
@@ -994,6 +997,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
])))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
6
],
consts
.
SE_LAYOUT_VALUE
))
vehicle_info
[
consts
.
MVI_EN
]
=
vehicle_field_input
# 二手车发票、交易凭证、绿本------------------------------------------------------------------------------------------
else
:
gb_field_input
=
[
(
'vinNo'
,
vin_no
),
...
...
@@ -1016,12 +1020,12 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
jypz_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
1
],
main_num
))
gb34_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
0
],
main_name
))
gb34_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
1
],
main_num
))
gb34_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
2
],
first_subm
mis
on_date
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
2
],
first_subm
mis
on_date
))
gb34_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
2
],
first_subm
issi
on_date
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
2
],
first_subm
issi
on_date
))
vehicle_field_input
.
append
((
consts
.
SE_NEW_ADD_FIELD
[
3
],
consts
.
SE_STAMP_VALUE
))
jypz_field_input
.
append
((
'vinNo'
,
vin_no
))
jypz_field_input
.
append
((
'vehicleTransactionAmount'
,
amount
))
jypz_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
-
1
],
first_subm
mis
on_date
))
jypz_field_input
.
append
((
consts
.
SE_GB_USED_FIELD
[
-
1
],
first_subm
issi
on_date
))
vehicle_info
[
consts
.
MVC_EN
]
=
gb_field_input
vehicle_info
[
consts
.
MVC34_EN
]
=
gb34_field_input
...
...
@@ -1033,6 +1037,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
vehicle_info
[
consts
.
UCI_EN
]
=
vehicle_field_input
compare_info
[
'vehicleInfo'
]
=
vehicle_info
# 银行卡-------------------------------------------------------------------------------------------------------
bank_info
=
{}
bank_name
=
cms_info
.
get
(
'bankAccountDetails'
,
{})
.
get
(
'bankName'
,
''
)
account_no
=
decode_des
(
cms_info
.
get
(
'bankAccountDetails'
,
{})
.
get
(
'accountNo'
,
''
),
des_key
)
...
...
@@ -1044,6 +1049,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
]
bank_info
[
consts
.
BC_EN
]
=
bank_field_input
# DDA------------------------------------------------------------------------------------------------------------
if
is_gsyh
or
not
detect_list
[
-
1
]:
dda_field_input
=
[
(
'applicationId(1)'
,
last_obj
.
application_id
),
...
...
@@ -1058,9 +1064,38 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
bank_info
[
consts
.
DDA_EN
]
=
dda_field_input
compare_info
[
'bankInfo'
]
=
bank_info
# 银行流水 --------------------------------------------------------------------
if
cms_info
.
get
(
'autoApprovedDetails'
,
{})
.
get
(
'aaType'
,
''
)
in
[
'CAA1'
,
'CAA2'
]:
bs_role_list
=
[]
for
applicant_type
in
consts
.
APPLICANT_TYPE_ORDER
[:
2
]:
if
applicant_type
in
main_role_info
:
for
bs_role
,
_
,
_
in
main_role_info
[
applicant_type
]:
bs_role_list
.
append
(
bs_role
)
bs_info
=
dict
()
bs_field_input
=
[
(
consts
.
SE_BS_FIELD
[
0
],
bs_role_list
),
(
consts
.
SE_BS_FIELD
[
1
],
first_submission_date
),
(
consts
.
SE_BS_FIELD
[
2
],
'90天'
),
]
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
:
bs_field_input
.
extend
([
(
consts
.
SE_BS_FIELD
[
3
],
dbr_bs_role_list
),
(
consts
.
SE_BS_FIELD
[
4
],
first_submission_date
),
(
consts
.
SE_BS_FIELD
[
5
],
'90天'
),
])
bs_info
[
consts
.
BS_EN
]
=
bs_field_input
compare_info
[
'Bank Statement'
]
=
bs_info
# 抵押登记豁免函----------------------------------------------------------------------------------------------------
other_info
=
{}
full_no
=
cms_info
.
get
(
'settlemnetVerification'
,
{})
.
get
(
'applicationNo'
,
''
)
if
cms_info
.
get
(
'mortgageType'
,
''
)
==
'Mortgage Free'
or
cms_info
.
get
(
'mortgageType'
,
''
)
==
'MortgageFree'
:
other_info
=
{}
hmh_field_input
=
[
(
consts
.
SE_HMH_FIELD
[
0
],
hmh_name
),
(
consts
.
SE_HMH_FIELD
[
1
],
hmh_id
),
...
...
@@ -1069,11 +1104,96 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
(
consts
.
SE_HMH_FIELD
[
4
],
consts
.
SE_STAMP_VALUE
),
]
other_info
[
consts
.
HMH_EN
]
=
hmh_field_input
# ASP -------------------------------------------------------------------------------------------------------
asp_list
=
[]
gzs_status
=
consts
.
GZS_STATUS
[
1
]
gzs_list
=
[
gzs_status
]
gzs_price
=
'0.00'
is_asp
=
False
insurance_price
=
None
if
str
(
cms_info
.
get
(
'financialInformation'
,
{})
.
get
(
'associatedServicePrincipal'
,
'0.00'
))
!=
'0.00'
:
is_asp
=
True
# for asp_info in cms_info.get('associatedServices', []):
for
asp_info
in
cms_info
.
get
(
'associatedServices'
,
{})
.
get
(
'SubassociatedServices'
,
[]):
tmp_asp_name
=
asp_info
.
get
(
'associatedServices'
)
if
isinstance
(
tmp_asp_name
,
str
)
and
len
(
tmp_asp_name
)
>
0
:
if
gzs_status
==
consts
.
GZS_STATUS
[
1
]
and
tmp_asp_name
.
find
(
consts
.
GZS_NAME
)
!=
-
1
:
gzs_status
=
consts
.
GZS_STATUS
[
2
]
gzs_price
=
asp_info
.
get
(
'price'
,
'0.00'
)
asp_list
.
append
(
(
tmp_asp_name
,
asp_info
.
get
(
'price'
,
'0.00'
),
asp_info
.
get
(
'financed'
,
'0.00'
)
)
)
# 保单费合计
if
tmp_asp_name
.
find
(
'机动车辆保险'
)
!=
-
1
:
insurance_price
=
asp_info
.
get
(
'price'
,
'0.00'
)
# fin_total = 0
fin_total_tmp
=
cms_info
.
get
(
'associatedServices'
,
{})
.
get
(
'financed total'
,
'0.00'
)
fin_total
=
'0.00'
if
fin_total_tmp
.
strip
()
==
''
else
fin_total_tmp
for
asp_name
,
_
,
asp_fin
in
asp_list
:
if
gzs_status
==
consts
.
GZS_STATUS
[
2
]
and
asp_name
.
find
(
consts
.
GZS_NAME
)
==
-
1
:
gzs_status
=
consts
.
GZS_STATUS
[
0
]
# fin_total += float(asp_fin)
asp_list
.
append
(
(
consts
.
ASP_SUM_NAME
,
''
,
fin_total
,
# format(fin_total, '.2f'),
)
)
# CMS Vehicle Price / 1.13 * 10 %
if
gzs_status
!=
consts
.
GZS_STATUS
[
1
]:
gzs_value
=
float
(
amount
)
*
0.1
/
1.13
gzs_list
.
append
(
gzs_value
)
gzs_list
.
append
(
float
(
gzs_price
))
# 保单 -----------------------------------------------------------------------------------------------------------
is_insurance
=
0
insurance_type
=
cms_info
.
get
(
'insuranceDetails'
,
{})
.
get
(
'insuranceType'
,
''
)
if
insurance_type
==
'Waive Insurance'
and
isinstance
(
insurance_price
,
str
):
is_insurance
=
1
elif
insurance_type
==
'Comprehensive Insurance'
:
is_insurance
=
2
if
is_insurance
!=
0
:
fp_campaign
=
cms_info
.
get
(
'fpCampaign'
,
''
)
if
fp_campaign
.
find
(
'OCU'
)
==
-
1
:
ssx_amount
=
amount
else
:
ssx_amount
=
format
(
float
(
amount
)
*
0.8
,
'.2f'
)
if
fp_campaign
.
find
(
'Joy_Plus'
)
==
-
1
:
dszx_amount
=
'200000'
else
:
dszx_amount
=
'500000'
bd_field_input
=
[
(
consts
.
SE_BD_FIELD
[
0
],
hmh_name
),
(
consts
.
SE_BD_FIELD
[
1
],
hmh_id
),
(
consts
.
SE_BD_FIELD
[
2
],
vin_no
),
(
consts
.
SE_BD_FIELD
[
3
],
ssx_amount
),
(
consts
.
SE_BD_FIELD
[
4
],
dszx_amount
),
(
consts
.
SE_BD_FIELD
[
5
],
consts
.
JDMPV_VALUE
),
(
consts
.
SE_BD_FIELD
[
6
],
cms_info
.
get
(
'insuranceDetails'
,
{})
.
get
(
'startDate'
,
''
)),
(
consts
.
SE_BD_FIELD
[
7
],
cms_info
.
get
(
'insuranceDetails'
,
{})
.
get
(
'endDate'
,
''
)),
(
consts
.
SE_BD_FIELD
[
8
],
consts
.
SE_STAMP_VALUE
),
(
consts
.
SE_BD_FIELD
[
9
],
consts
.
SE_STAMP_VALUE
),
]
if
is_insurance
==
1
:
bd_field_input
.
append
((
consts
.
SE_BD_FIELD
[
10
],
insurance_price
))
other_info
[
consts
.
BD_EN
]
=
bd_field_input
if
len
(
other_info
)
>
0
:
compare_info
[
'other'
]
=
other_info
if
application_entity
in
consts
.
HIL_SET
:
return
compare_info
,
cms_info
.
get
(
'applicationVersion'
,
1
)
# AFC合同-----------------------------------------------------------------------------------------------------------
contract_info
=
{}
schedule_list
=
[]
...
...
@@ -1105,51 +1225,15 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
(
consts
.
SE_AFC_CON_FIELD
[
17
],
schedule_list_str
),
]
if
str
(
cms_info
.
get
(
'financialInformation'
,
{})
.
get
(
'associatedServicePrincipal'
,
'0.00'
))
==
'0.00'
:
if
is_asp
:
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
20
],
asp_list
))
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
22
],
asp_list
))
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
21
],
gzs_list
))
else
:
afc_contract_input
.
pop
(
5
)
afc_contract_input
.
pop
(
5
)
afc_contract_input
.
pop
(
9
)
afc_contract_input
.
pop
(
9
)
else
:
asp_list
=
[]
gzs_status
=
consts
.
GZS_STATUS
[
1
]
gzs_price
=
'0.00'
for
asp_info
in
cms_info
.
get
(
'associatedServices'
,
{})
.
get
(
'SubassociatedServices'
,
[]):
tmp_asp_name
=
asp_info
.
get
(
'associatedServices'
)
if
isinstance
(
tmp_asp_name
,
str
)
and
len
(
tmp_asp_name
)
>
0
:
if
gzs_status
==
consts
.
GZS_STATUS
[
1
]
and
tmp_asp_name
.
find
(
consts
.
GZS_NAME
)
!=
-
1
:
gzs_status
=
consts
.
GZS_STATUS
[
2
]
gzs_price
=
asp_info
.
get
(
'price'
,
'0.00'
)
asp_list
.
append
(
(
tmp_asp_name
,
asp_info
.
get
(
'price'
,
'0.00'
),
asp_info
.
get
(
'financed'
,
'0.00'
)
)
)
fin_total_tmp
=
cms_info
.
get
(
'associatedServices'
,
{})
.
get
(
'financed total'
,
'0.00'
)
fin_total
=
'0.00'
if
fin_total_tmp
.
strip
()
==
''
else
fin_total_tmp
for
asp_name
,
_
,
asp_fin
in
asp_list
:
if
gzs_status
==
consts
.
GZS_STATUS
[
2
]
and
asp_name
.
find
(
consts
.
GZS_NAME
)
==
-
1
:
gzs_status
=
consts
.
GZS_STATUS
[
0
]
asp_list
.
append
(
(
consts
.
ASP_SUM_NAME
,
''
,
fin_total
,
)
)
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
20
],
asp_list
))
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
22
],
asp_list
))
# CMS Vehicle Price / 1.13 * 10 %
gzs_list
=
[
gzs_status
]
if
gzs_status
!=
consts
.
GZS_STATUS
[
1
]:
gzs_value
=
float
(
amount
)
*
0.1
/
1.13
gzs_list
.
append
(
gzs_value
)
gzs_list
.
append
(
float
(
gzs_price
))
afc_contract_input
.
append
((
consts
.
SE_AFC_CON_FIELD
[
21
],
gzs_list
))
# '借款人签字及时间', 'Borrower', 0, 0, True
online_sign
=
cms_info
.
get
(
'contractSource'
,
'Online Sign'
)
==
'Online Sign'
...
...
@@ -1352,6 +1436,124 @@ def get_se_compare_info(last_obj, application_entity, detect_list):
return
compare_info
def
se_bs_compare
(
license_en
,
ocr_res_dict
,
strip_list
):
# 主共借至少提供一个
# 有担保人,担保人必须提供。主共借没有时,修改comment:人工查看担保人亲属关系
ocr_field
,
compare_logic
,
_
=
consts
.
SE_COMPARE_FIELD
[
license_en
]
ocr_res_str
=
ocr_res_dict
.
get
(
ocr_field
)
result_field_list
=
[]
field_img_path_dict
=
dict
()
if
ocr_res_str
is
not
None
:
pre_field_list
=
strip_list
[:
3
]
suf_field_list
=
strip_list
[
3
:]
ocr_res_list
=
json
.
loads
(
ocr_res_str
)
# length = len(ocr_res_list)
# 主共借人
pre_best_res
=
{}
max_correct_count
=
0
for
ocr_res
in
ocr_res_list
:
correct_count
=
0
pre_tmp_res_part
=
{}
for
idx
,
(
name
,
value
)
in
enumerate
(
pre_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
pre_tmp_res_part
[
name
]
=
(
result
,
ocr_str
,
reason
)
if
correct_count
>
0
and
correct_count
>=
max_correct_count
:
max_correct_count
=
correct_count
pre_best_res
=
pre_tmp_res_part
for
name
,
value
in
pre_field_list
:
if
len
(
pre_best_res
)
>
0
:
result
,
ocr_str
,
reason
=
pre_best_res
[
name
]
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
if
len
(
suf_field_list
)
>
0
:
reason
=
consts
.
SPECIAL_REASON
else
:
reason
=
compare_logic
[
pre_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
(
suf_field_list
)
>
0
:
suf_best_res
=
{}
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
):
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
suf_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
for
name
,
value
in
suf_field_list
:
if
len
(
suf_best_res
)
>
0
:
result
,
ocr_str
,
reason
=
suf_best_res
[
name
]
else
:
result
=
consts
.
RESULT_N
ocr_str
=
empty_str
reason
=
compare_logic
[
suf_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
))
else
:
for
name
,
value
in
strip_list
:
if
isinstance
(
value
,
list
):
value
=
json
.
dumps
(
value
,
ensure_ascii
=
False
)
result_field_list
.
append
((
name
,
value
,
consts
.
RESULT_N
,
empty_str
,
empty_str
,
ErrorType
.
NF
.
value
,
'未提供银行流水'
))
return
result_field_list
,
field_img_path_dict
def
se_compare_license
(
license_en
,
ocr_res_dict
,
field_list
):
ocr_field
,
compare_logic
,
special_expiry_date
=
consts
.
SE_COMPARE_FIELD
[
license_en
]
...
...
@@ -1441,6 +1643,8 @@ def se_compare_license(license_en, ocr_res_dict, field_list):
special_expiry_date_slice
=
True
else
:
img_path
=
ocr_res_list
[
res_idx
]
.
get
(
consts
.
IMG_PATH_KEY
,
''
)
if
result
==
consts
.
RESULT_N
else
empty_str
if
isinstance
(
value
,
list
):
value
=
json
.
dumps
(
value
,
ensure_ascii
=
False
)
error_type
=
empty_error_type
if
result
==
consts
.
RESULT_Y
else
ErrorType
.
OCR
.
value
result_field_list
.
append
((
name
,
value
,
result
,
ocr_str
,
img_path
,
error_type
,
compare_logic
[
name
][
3
]))
else
:
...
...
@@ -1448,6 +1652,8 @@ def se_compare_license(license_en, ocr_res_dict, field_list):
if
not
is_find
:
for
name
,
value
in
field_list
:
if
isinstance
(
value
,
list
):
value
=
json
.
dumps
(
value
,
ensure_ascii
=
False
)
result_field_list
.
append
((
name
,
value
,
consts
.
RESULT_N
,
empty_str
,
empty_str
,
ErrorType
.
NF
.
value
,
'{0}未找到'
.
format
(
license_en
)))
if
is_find
:
...
...
@@ -1756,6 +1962,8 @@ def se_compare_process(compare_info, ocr_res_dict):
result_field_list
,
field_img_path_dict
=
se_mvc34_compare
(
license_en
,
ocr_res_dict
,
strip_list
)
elif
license_en
==
consts
.
AFC_CONTRACT_EN
:
result_field_list
,
field_img_path_dict
=
se_afc_contract_compare
(
license_en
,
ocr_res_dict
,
strip_list
)
elif
license_en
==
consts
.
BS_EN
:
result_field_list
,
field_img_path_dict
=
se_bs_compare
(
license_en
,
ocr_res_dict
,
strip_list
)
else
:
result_field_list
,
_
,
field_img_path_dict
=
se_compare_license
(
license_en
,
ocr_res_dict
,
strip_list
)
for
name
,
value
,
result
,
ocr_str
,
img_path
,
error_type
,
cn_reason
in
result_field_list
:
...
...
src/common/tools/comparison.py
View file @
e34beaa
...
...
@@ -363,6 +363,15 @@ class Comparison:
input_tmp
=
input_str
.
replace
(
'元'
,
''
)
.
replace
(
','
,
''
)
return
self
.
build_res
(
ocr_tmp
==
input_tmp
)
def
se_amount_lte_compare
(
self
,
input_str
,
ocr_str
,
**
kwargs
):
try
:
float_input
=
float
(
input_str
)
float_ocr
=
float
(
ocr_str
)
except
Exception
as
e
:
return
self
.
RESULT_N
else
:
return
self
.
build_res
(
float_ocr
>=
float_input
)
def
se_amount_compare
(
self
,
input_str
,
ocr_str
,
**
kwargs
):
if
input_str
==
ocr_str
:
return
self
.
RESULT_Y
...
...
@@ -375,6 +384,12 @@ class Comparison:
else
:
return
self
.
build_res
(
float_ocr
==
float_input
)
def
se_one_compare
(
self
,
input_list
,
ocr_str
,
**
kwargs
):
if
isinstance
(
input_list
,
list
):
if
ocr_str
in
input_list
:
return
self
.
RESULT_Y
return
self
.
RESULT_N
def
se_company_compare
(
self
,
input_str
,
ocr_str
,
**
kwargs
):
input_tmp
=
re
.
sub
(
self
.
re_obj
,
''
,
input_str
)
.
strip
()
ocr_tmp
=
re
.
sub
(
self
.
re_obj
,
''
,
ocr_str
)
.
strip
()
...
...
@@ -439,6 +454,46 @@ class Comparison:
else
:
return
self
.
build_res
(
compare_date
<=
ocr_date
)
def
se_bd_date_compare
(
self
,
input_str
,
ocr_str
,
**
kwargs
):
try
:
input_date
=
datetime
.
strptime
(
input_str
,
"
%
Y-
%
m-
%
d"
)
.
date
()
ocr_date
=
datetime
.
strptime
(
ocr_str
,
"
%
Y-
%
m-
%
d"
)
.
date
()
if
kwargs
.
get
(
'start'
,
False
):
if
input_date
!=
ocr_date
:
return
self
.
RESULT_N
six_month_date
=
(
datetime
.
today
()
-
relativedelta
(
months
=
6
))
.
date
()
today_date
=
datetime
.
today
()
.
date
()
return
self
.
build_res
(
six_month_date
<=
ocr_date
<=
today_date
)
else
:
if
input_date
==
ocr_date
or
ocr_date
==
input_date
+
relativedelta
(
days
=
1
):
return
self
.
RESULT_Y
return
self
.
RESULT_N
except
Exception
as
e
:
return
self
.
RESULT_N
def
se_bs_print_date_compare
(
self
,
input_str
,
ocr_str
,
**
kwargs
):
try
:
input_date
=
datetime
.
strptime
(
input_str
,
"
%
Y-
%
m-
%
d"
)
ocr_date
=
datetime
.
strptime
(
ocr_str
,
"
%
Y-
%
m-
%
d"
)
if
ocr_date
>=
input_date
-
relativedelta
(
days
=
15
):
return
self
.
RESULT_Y
return
self
.
RESULT_N
except
Exception
as
e
:
return
self
.
RESULT_N
def
se_bs_date_compare
(
self
,
input_str
,
ocr_str_list
,
**
kwargs
):
if
isinstance
(
ocr_str_list
,
list
)
and
len
(
ocr_str_list
)
==
2
:
try
:
start_date
=
datetime
.
strptime
(
ocr_str_list
[
0
],
"
%
Y-
%
m-
%
d"
)
end_date
=
datetime
.
strptime
(
ocr_str_list
[
1
],
"
%
Y-
%
m-
%
d"
)
if
end_date
>=
start_date
+
relativedelta
(
months
=
3
):
return
self
.
RESULT_Y
return
self
.
RESULT_N
except
Exception
as
e
:
return
self
.
RESULT_N
return
self
.
RESULT_N
cp
=
Comparison
()
...
...
src/common/tools/mssql_script11.py
0 → 100644
View file @
e34beaa
import
pyodbc
hil_sql
=
"""
ALTER TABLE hil_ocr_result ADD bd_ocr nvarchar(max);
ALTER TABLE hil_ocr_result ADD bss_ocr nvarchar(max);
ALTER TABLE hil_se_ocr_result ADD bd_ocr nvarchar(max);
ALTER TABLE hil_se_ocr_result ADD bss_ocr nvarchar(max);
"""
afc_sql
=
"""
ALTER TABLE afc_ocr_result ADD bd_ocr nvarchar(max);
ALTER TABLE afc_ocr_result ADD bss_ocr nvarchar(max);
ALTER TABLE afc_se_ocr_result ADD bss_ocr nvarchar(max);
ALTER TABLE afc_se_ocr_result ADD bd_ocr nvarchar(max);
"""
hil_cnxn
=
pyodbc
.
connect
(
'DRIVER={ODBC Driver 17 for SQL Server};'
,
autocommit
=
True
)
hil_cursor
=
hil_cnxn
.
cursor
()
hil_cursor
.
execute
(
hil_sql
)
hil_cursor
.
close
()
hil_cnxn
.
close
()
afc_cnxn
=
pyodbc
.
connect
(
'DRIVER={ODBC Driver 17 for SQL Server};'
,
autocommit
=
True
)
afc_cursor
=
afc_cnxn
.
cursor
()
afc_cursor
.
execute
(
afc_sql
)
afc_cursor
.
close
()
afc_cnxn
.
close
()
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