tasks.py
9.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
import json
import logging
import traceback
from . import app
from apps.doc.models import AFCOCRResult, HILOCRResult, AFCComparisonInfo, HILComparisonInfo
from apps.doc import consts
from apps.doc.ocr.gcap import gcap
from apps.doc.exceptions import GCAPException
from common.tools.comparison import cp
compare_log = logging.getLogger('compare')
log_base = '[CA Compare]'
@app.task
def compare(application_id, application_entity, uniq_seq, ocr_res_id):
# POS: application_id, application_entity, uniq_seq, None
# OCR: application_id, business_type(application_entity), None, ocr_res_id
compare_log.info('{0} [receive task] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
log_base, application_entity, application_id, uniq_seq, ocr_res_id))
# 根据application_id查找最新的比对信息,如果没有,结束
comparison_class = HILComparisonInfo if application_entity == consts.HIL_PREFIX else AFCComparisonInfo
last_obj = comparison_class.objects.filter(application_id=application_id).last()
if last_obj is None:
compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
log_base, application_entity, application_id, uniq_seq, ocr_res_id
))
return
# 根据application_id查找OCR累计结果指定license字段,如果没有,结束
result_class = HILOCRResult if application_entity == consts.HIL_PREFIX else AFCOCRResult
if ocr_res_id is None:
ocr_res_dict = result_class.objects.filter(application_id=application_id).values(*consts.COMPARE_FIELDS).first()
else:
ocr_res_dict = result_class.objects.filter(id=ocr_res_id).values(*consts.COMPARE_FIELDS).first()
if ocr_res_dict is None:
compare_log.info('{0} [ocr info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
log_base, application_entity, application_id, uniq_seq, ocr_res_id
))
return
# 比对信息
comparison_res = {
'OCR_Input': {
'uniqSeq': last_obj.uniq_seq,
'applicationId': application_id,
'applicationEntity': application_entity,
'applicationVersion': last_obj.application_version,
'vehicleStatus': last_obj.vehicle_status,
# 'wholeResult': 'Y',
'wholeResultMessage': '',
'applicationLink': '',
}
}
res_set = set()
is_sep = True if last_obj.customer_type == consts.CUSTOMER_TYPE[5] else False
individual_cus_info_list = json.loads(last_obj.individual_cus_info)
for individual_cus_info in individual_cus_info_list:
individual_cus_info['customerType'] = last_obj.customer_type
# sep营业执照
if is_sep and individual_cus_info.get('companyName') is not None:
sep_is_find = False
sep_ocr_res_str = ocr_res_dict.get('bl_ocr')
if sep_ocr_res_str is not None:
sep_ocr_list = json.loads(sep_ocr_res_str)
for sep_ocr in sep_ocr_list:
company_name = sep_ocr.get(consts.TCSEP.get('companyName')[0])
if company_name is None or company_name != individual_cus_info.get('companyName'):
continue
sep_is_find = True
for sep_field, sep_tuple in consts.TCSEP.items():
sep_res = getattr(cp, sep_tuple[1])(
individual_cus_info.get(sep_field), sep_ocr.get(sep_tuple[0]), sep_tuple[2])
individual_cus_info[sep_field + 'Result'] = sep_res
res_set.add(sep_res)
break
if not sep_is_find:
res_set.add(consts.RESULT_N)
for field in consts.TCSEP.keys():
individual_cus_info[field + 'Result'] = consts.RESULT_N
# 个人信息证件
id_type = individual_cus_info.get('idType')
compare_target = consts.ID_TYPE_COMPARE.get(id_type)
if compare_target is None:
continue
is_find = False
ocr_res_str = ocr_res_dict.get(compare_target.get('model_field'))
if ocr_res_str is not None:
ocr_res_list = json.loads(ocr_res_str)
compare_target_dict = compare_target.get('compare_field')
for ocr_res in ocr_res_list:
base_name = ocr_res.get(compare_target_dict.get('customerChineseName')[0])
if base_name is None or base_name != individual_cus_info.get('customerChineseName'): # TODO 特殊姓名比对
continue
is_find = True
for compare_field, compare_tuple in compare_target.get('compare_field').items():
compare_res = getattr(cp, compare_tuple[1])(
individual_cus_info.get(compare_field), ocr_res.get(compare_tuple[0]), compare_tuple[2])
individual_cus_info[compare_field + 'Result'] = compare_res
res_set.add(compare_res)
break
if not is_find:
res_set.add(consts.RESULT_N)
for field in compare_target.get('compare_field').keys():
individual_cus_info[field + 'Result'] = consts.RESULT_N
comparison_res['individualCusInfo'] = individual_cus_info_list
if last_obj.corporate_cus_info is not None:
corporate_cus_info = json.loads(last_obj.corporate_cus_info)
corporate_cus_info['customerType'] = last_obj.customer_type
is_bl_find = False
bl_ocr_res_str = ocr_res_dict.get('bl_ocr')
if bl_ocr_res_str is not None:
bl_ocr_list = json.loads(bl_ocr_res_str)
for bl_ocr in bl_ocr_list:
company_name = bl_ocr.get(consts.TCCOR.get('customerChineseName')[0])
if company_name is None or company_name != corporate_cus_info.get('customerChineseName'):
continue
is_bl_find = True
for bl_field, bl_tuple in consts.TCCOR.items():
bl_res = getattr(cp, bl_tuple[1])(
corporate_cus_info.get(bl_field), bl_ocr.get(bl_tuple[0]), bl_tuple[2])
corporate_cus_info[bl_field + 'Result'] = bl_res
res_set.add(bl_res)
break
if not is_bl_find:
res_set.add(consts.RESULT_N)
for field in consts.TCCOR.keys():
corporate_cus_info[field + 'Result'] = consts.RESULT_N
comparison_res['corporateCusInfo'] = corporate_cus_info
if last_obj.vehicle_status == consts.VEHICLE_STATUS[0] and last_obj.usedcar_info is not None:
usedcar_info = json.loads(last_obj.usedcar_info)
is_usedcar_find = False
mvc_ocr_res_str = ocr_res_dict.get('mvc_ocr')
if mvc_ocr_res_str is not None:
mvc_ocr_list = json.loads(mvc_ocr_res_str)
for mvc_ocr in mvc_ocr_list:
vin_no = mvc_ocr.get(consts.PCUSD_MVC.get('vinNo')[0])
if vin_no is None or vin_no != usedcar_info.get('vinNo'):
continue
is_usedcar_find = True
for mvc_field, mvc_tuple in consts.PCUSD_MVC.items():
mvc_res = getattr(cp, mvc_tuple[1])(
usedcar_info.get(mvc_field), mvc_ocr.get(mvc_tuple[0]), mvc_tuple[2])
usedcar_info[mvc_field + 'Result'] = mvc_res
res_set.add(mvc_res)
dl_find = False
dl_ocr_res_str = ocr_res_dict.get('dl_ocr')
if dl_ocr_res_str is not None:
dl_ocr_list = json.loads(dl_ocr_res_str)
for dl_ocr in dl_ocr_list:
dl_vin_no = dl_ocr.get(consts.PCUSD_DL.get('vinNo')[0])
if dl_vin_no is None or dl_vin_no != usedcar_info.get('vinNo'):
continue
dl_find = True
break
if not dl_find:
res_set.add(consts.RESULT_N)
usedcar_info['vinNo' + 'Result'] = consts.RESULT_N
break
if not is_usedcar_find:
res_set.add(consts.RESULT_N)
for field in consts.PCUSD_MVC.keys():
usedcar_info[field + 'Result'] = consts.RESULT_N
comparison_res['usedCarInfo'] = usedcar_info
comparison_res['wholeResult'] = consts.RESULT_N if consts.RESULT_N in res_set else consts.RESULT_Y
print(comparison_res)
# 将比对结果发送GCAP
# try:
# data = gcap.dict_to_xml(comparison_res)
# except Exception as e:
# compare_log.error('{0} [dict to xml failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] '
# '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id,
# traceback.format_exc()))
# else:
# try:
# for times in range(consts.RETRY_TIMES):
# try:
# gcap.send(data)
# except Exception as e:
# gcap_exc = str(e)
# else:
# break
# else:
# raise GCAPException(gcap_exc)
# except Exception as e:
# compare_log.error('{0} [gcap failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] '
# '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq,
# ocr_res_id, traceback.format_exc()))
# else:
# compare_log.info('{0} [task success] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
# log_base, application_entity, application_id, uniq_seq, ocr_res_id))