Merge branch 'feature/slice6' into feature/1119
Showing
6 changed files
with
256 additions
and
118 deletions
... | @@ -1176,6 +1176,7 @@ UCI_OCR_FIELD = 'uci_ocr' | ... | @@ -1176,6 +1176,7 @@ UCI_OCR_FIELD = 'uci_ocr' |
1176 | DDA_OCR_FIELD = 'bs_ocr' | 1176 | DDA_OCR_FIELD = 'bs_ocr' |
1177 | HMH_OCR_FIELD = 'hmh_ocr' | 1177 | HMH_OCR_FIELD = 'hmh_ocr' |
1178 | JYPZ_OCR_FIELD = 'jypz_ocr' | 1178 | JYPZ_OCR_FIELD = 'jypz_ocr' |
1179 | HT_FIELD = 'ht_ocr' | ||
1179 | 1180 | ||
1180 | RESULT_MAPPING = { | 1181 | RESULT_MAPPING = { |
1181 | MVI_CLASSIFY: MVI_OCR_FIELD, | 1182 | MVI_CLASSIFY: MVI_OCR_FIELD, |
... | @@ -1191,7 +1192,8 @@ RESULT_MAPPING = { | ... | @@ -1191,7 +1192,8 @@ RESULT_MAPPING = { |
1191 | DDA_CLASSIFY: DDA_OCR_FIELD, | 1192 | DDA_CLASSIFY: DDA_OCR_FIELD, |
1192 | # VAT_CLASSIFY: 'vat_ocr', | 1193 | # VAT_CLASSIFY: 'vat_ocr', |
1193 | HMH_CLASSIFY: HMH_OCR_FIELD, | 1194 | HMH_CLASSIFY: HMH_OCR_FIELD, |
1194 | JYPZ_CLASSIFY: JYPZ_OCR_FIELD | 1195 | JYPZ_CLASSIFY: JYPZ_OCR_FIELD, |
1196 | CONTRACT_CLASSIFY: HT_FIELD, | ||
1195 | } | 1197 | } |
1196 | 1198 | ||
1197 | COMPARE_FIELDS = (MVI_OCR_FIELD, | 1199 | COMPARE_FIELDS = (MVI_OCR_FIELD, |
... | @@ -1391,6 +1393,26 @@ SE_HMH_FIELD = ['借款人/承租人姓名', '借款人/承租人证件号', ' | ... | @@ -1391,6 +1393,26 @@ SE_HMH_FIELD = ['借款人/承租人姓名', '借款人/承租人证件号', ' |
1391 | SE_BANK_FIELD = ['accountNo', 'bankName'] | 1393 | SE_BANK_FIELD = ['accountNo', 'bankName'] |
1392 | SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo'] | 1394 | SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo'] |
1393 | 1395 | ||
1396 | SE_AFC_CON_MAP = { | ||
1397 | '合同编号-每页': (None, '合同编号', None), | ||
1398 | '所购车辆价格-小写-重要条款': (1, '所购车辆价格', None), | ||
1399 | '车架号-重要条款': (1, '车架号', None), | ||
1400 | '贷款本金金额-重要条款': (1, '贷款本金金额', '小写'), | ||
1401 | '贷款期限-重要条款': (1, '贷款期限', None), | ||
1402 | '车辆贷款本金金额-重要条款': (1, '车辆贷款本金金额', None), | ||
1403 | '附加产品融资贷款本金总额-重要条款': (1, '附加产品融资贷款本金总金额', None), | ||
1404 | '所购车辆价格': (2, '所购车辆价格', None), | ||
1405 | '车架号': (2, '车架号', None), | ||
1406 | '经销商': (2, '经销商', None), | ||
1407 | '贷款本金金额': (2, '贷款本金金额', '小写'), | ||
1408 | '车辆贷款本金金额': (2, '车辆贷款本金金额', None), | ||
1409 | '附加产品融资贷款本金总额': (2, '附加产品融资贷款本金总额', None), | ||
1410 | '贷款期限': (2, '贷款期限', None), | ||
1411 | '还款账号': (2, '还款账号', '账号'), | ||
1412 | '户名': (2, '还款账号', '户名'), | ||
1413 | '开户行': (2, '还款账号', '开户行'), | ||
1414 | } | ||
1415 | |||
1394 | SE_AFC_CON_FIELD = ['合同编号-每页', '所购车辆价格-小写-重要条款', '车架号-重要条款', '贷款本金金额-重要条款', '贷款期限-重要条款', | 1416 | SE_AFC_CON_FIELD = ['合同编号-每页', '所购车辆价格-小写-重要条款', '车架号-重要条款', '贷款本金金额-重要条款', '贷款期限-重要条款', |
1395 | '车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商', | 1417 | '车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商', |
1396 | '贷款本金金额', '车辆贷款本金金额', '附加产品融资贷款本金总额', '贷款期限', '还款账号', '户名', '开户行', | 1418 | '贷款本金金额', '车辆贷款本金金额', '附加产品融资贷款本金总额', '贷款期限', '还款账号', '户名', '开户行', |
... | @@ -1576,6 +1598,31 @@ HMH_COMPARE_LOGIC = { | ... | @@ -1576,6 +1598,31 @@ HMH_COMPARE_LOGIC = { |
1576 | '签字': ('借款人签字/盖章', 'se_common_compare', {}, '抵押登记豁免函签字需人工核查'), | 1598 | '签字': ('借款人签字/盖章', 'se_common_compare', {}, '抵押登记豁免函签字需人工核查'), |
1577 | } | 1599 | } |
1578 | 1600 | ||
1601 | SE_AFC_CON_FIELD = ['合同编号-每页', '所购车辆价格-小写-重要条款', '车架号-重要条款', '贷款本金金额-重要条款', '贷款期限-重要条款', | ||
1602 | '车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商', | ||
1603 | '贷款本金金额', '车辆贷款本金金额', '附加产品融资贷款本金总额', '贷款期限', '还款账号', '户名', '开户行', | ||
1604 | '还款计划表', '项目1', '用途总金额', '贷款本金', '附加产品融资贷款本金总金额', '购置税校验'] | ||
1605 | |||
1606 | HT_COMPARE_LOGIC = { | ||
1607 | '合同编号-每页': ('合同编号-每页', 'se_list_compare', {}, '合同编号与系统不一致'), | ||
1608 | '所购车辆价格-小写-重要条款': ('所购车辆价格-小写-重要条款', 'se_amount_str_compare', {}, '合同首页中车辆价格与系统不一致'), | ||
1609 | '车架号-重要条款': ('车架号-重要条款', 'se_common_compare', {}, '合同首页中车架号与系统不一致'), | ||
1610 | '贷款本金金额-重要条款': ('贷款本金金额-重要条款', 'se_amount_str_compare', {}, '合同首页中贷款本金与系统不一致'), | ||
1611 | '贷款期限-重要条款': ('贷款期限-重要条款', 'se_common_compare', {}, '合同首页中贷款期限与系统不一致'), | ||
1612 | '车辆贷款本金金额-重要条款': ('车辆贷款本金金额-重要条款', 'se_amount_str_compare', {}, '车辆贷款本金金额-重要条款'), | ||
1613 | '附加产品融资贷款本金总额-重要条款': ('附加产品融资贷款本金总额-重要条款', 'se_amount_str_compare', {}, '合同首页中附加产品融资金额与系统不一致'), | ||
1614 | '所购车辆价格': ('所购车辆价格', 'se_amount_str_compare', {}, '主合同页中车辆价格与系统不一致'), | ||
1615 | '车架号': ('车架号', 'se_common_compare', {}, '主合同页中车架号与系统不一致'), | ||
1616 | '经销商': ('经销商', 'se_common_compare', {}, '主合同页中经销商与系统不一致'), | ||
1617 | '贷款本金金额': ('贷款本金金额', 'se_amount_str_compare', {}, '主合同页中贷款本金金额与系统不一致'), | ||
1618 | '车辆贷款本金金额': ('车辆贷款本金金额', 'se_amount_str_compare', {}, '主合同页中车辆贷款本金金额与系统不一致'), | ||
1619 | '附加产品融资贷款本金总额': ('附加产品融资贷款本金总额', 'se_amount_str_compare', {}, '主合同页中附加产品融资贷款本金总额与系统不一致'), | ||
1620 | '贷款期限': ('贷款期限', 'se_common_compare', {}, '主合同页中贷款期限与系统不一致'), | ||
1621 | '还款账号': ('还款账号', 'se_common_compare', {}, '主合同页中还款账号与系统不一致'), | ||
1622 | '户名': ('户名', 'se_common_compare', {}, '主合同页中户名与系统不一致'), | ||
1623 | '开户行': ('开户行', 'se_both_contain_compare', {}, '主合同页中开户行与系统不一致'), | ||
1624 | } | ||
1625 | |||
1579 | # MVC_OCR_FIELD = 'mvc_ocr' | 1626 | # MVC_OCR_FIELD = 'mvc_ocr' |
1580 | 1627 | ||
1581 | SE_DETECT_CARD = [UCI_EN, JYPZ_EN, HMH_EN, DDA_EN] | 1628 | SE_DETECT_CARD = [UCI_EN, JYPZ_EN, HMH_EN, DDA_EN] |
... | @@ -1594,6 +1641,7 @@ SE_COMPARE_FIELD = { | ... | @@ -1594,6 +1641,7 @@ SE_COMPARE_FIELD = { |
1594 | DDA_EN: (DDA_OCR_FIELD, DDA_COMPARE_LOGIC, False), | 1641 | DDA_EN: (DDA_OCR_FIELD, DDA_COMPARE_LOGIC, False), |
1595 | HMH_EN: (HMH_OCR_FIELD, HMH_COMPARE_LOGIC, False), | 1642 | HMH_EN: (HMH_OCR_FIELD, HMH_COMPARE_LOGIC, False), |
1596 | JYPZ_EN: (JYPZ_OCR_FIELD, JYPZ_COMPARE_LOGIC, False), | 1643 | JYPZ_EN: (JYPZ_OCR_FIELD, JYPZ_COMPARE_LOGIC, False), |
1644 | AFC_CONTRACT_EN: (HT_FIELD, HT_COMPARE_LOGIC, False) | ||
1597 | } | 1645 | } |
1598 | 1646 | ||
1599 | 1647 | ... | ... |
... | @@ -220,7 +220,8 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -220,7 +220,8 @@ class Command(BaseCommand, LoggerMixin): |
220 | else: | 220 | else: |
221 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) | 221 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) |
222 | 222 | ||
223 | def contract_process(self, classify, ocr_data, contract_result, res_list, pno, ino, part_idx, img_path): | 223 | def contract_process(self, classify, ocr_data, contract_result, res_list, pno, ino, part_idx, |
224 | img_path, contract_result_compare): | ||
224 | contract_dict = ocr_data.get('data') | 225 | contract_dict = ocr_data.get('data') |
225 | if not contract_dict or contract_dict.get('page_num') is None or contract_dict.get('page_info') is None: | 226 | if not contract_dict or contract_dict.get('page_num') is None or contract_dict.get('page_info') is None: |
226 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) | 227 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) |
... | @@ -260,9 +261,30 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -260,9 +261,30 @@ class Command(BaseCommand, LoggerMixin): |
260 | for row_list in sub_value[text_key]: | 261 | for row_list in sub_value[text_key]: |
261 | rebuild_page_info.append(row_list) | 262 | rebuild_page_info.append(row_list) |
262 | 263 | ||
263 | # contract_result.setdefault(page_num_only, []).append(rebuild_page_info) | ||
264 | contract_result.setdefault(classify, dict()).setdefault(page_num_only, []).append(rebuild_page_info) | 264 | contract_result.setdefault(classify, dict()).setdefault(page_num_only, []).append(rebuild_page_info) |
265 | 265 | ||
266 | page_compare_dict = {} | ||
267 | for key, value in contract_dict.get('page_info', {}).items(): | ||
268 | if not isinstance(value, dict): | ||
269 | continue | ||
270 | elif text_key in value: | ||
271 | if value[text_key] is None: | ||
272 | page_compare_dict[key] = '' | ||
273 | elif isinstance(value[text_key], str): | ||
274 | page_compare_dict[key] = value[text_key] | ||
275 | elif isinstance(value[text_key], list): | ||
276 | page_compare_dict[key] = value[text_key] | ||
277 | else: | ||
278 | page_compare_dict[key] = {} | ||
279 | for sub_key, sub_value in value.items(): | ||
280 | if sub_value[text_key] is None: | ||
281 | page_compare_dict[key][sub_key] = '' | ||
282 | elif isinstance(sub_value[text_key], str): | ||
283 | page_compare_dict[key][sub_key] = sub_value[text_key] | ||
284 | |||
285 | contract_result_compare.setdefault(classify, dict())[page_num_only] = page_compare_dict | ||
286 | |||
287 | |||
266 | # def rebuild_result(self, ocr_data, classify, img_path): | 288 | # def rebuild_result(self, ocr_data, classify, img_path): |
267 | # license_data = ocr_data.get('data') | 289 | # license_data = ocr_data.get('data') |
268 | # if not license_data: | 290 | # if not license_data: |
... | @@ -831,6 +853,22 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -831,6 +853,22 @@ class Command(BaseCommand, LoggerMixin): |
831 | summary['role'] = self.get_most(summary['role']) | 853 | summary['role'] = self.get_most(summary['role']) |
832 | return bs_summary | 854 | return bs_summary |
833 | 855 | ||
856 | def rebuild_contract(self, contract_result_compare): | ||
857 | res_list = [] | ||
858 | for classify, page_info_dict in contract_result_compare.items(): | ||
859 | res = {} | ||
860 | if classify == consts.CONTRACT_CLASSIFY: | ||
861 | for key, (pno, key1, key2) in consts.SE_AFC_CON_MAP.items(): | ||
862 | if pno is None: | ||
863 | for i in range(1, 9): | ||
864 | res.setdefault(key, list()).append(page_info_dict.get(str(i), {}).get(key1, '')) | ||
865 | elif key2 is None: | ||
866 | res[key] = page_info_dict.get(str(pno), {}).get(key1, '') | ||
867 | else: | ||
868 | res[key] = page_info_dict.get(str(pno), {}).get(key1, {}).get(key2, '') | ||
869 | res_list.append(res) | ||
870 | return res_list | ||
871 | |||
834 | def rebuild_bs_summary(self, bs_summary, unknown_summary): | 872 | def rebuild_bs_summary(self, bs_summary, unknown_summary): |
835 | # bs_summary = { | 873 | # bs_summary = { |
836 | # '卡号': { | 874 | # '卡号': { |
... | @@ -1248,7 +1286,7 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -1248,7 +1286,7 @@ class Command(BaseCommand, LoggerMixin): |
1248 | self.online_log.error('{0} [process error (store ocr res)] [img_path={1}] [error={2}]'.format( | 1286 | self.online_log.error('{0} [process error (store ocr res)] [img_path={1}] [error={2}]'.format( |
1249 | self.log_base, img_path, traceback.format_exc())) | 1287 | self.log_base, img_path, traceback.format_exc())) |
1250 | 1288 | ||
1251 | def res_2_wb(self, res_dict, img_queue, finish_queue, lock, error_list): | 1289 | def res_2_wb(self, res_dict, img_queue, finish_queue, error_list): |
1252 | while len(error_list) == 0 or not img_queue.empty() or not finish_queue.empty(): | 1290 | while len(error_list) == 0 or not img_queue.empty() or not finish_queue.empty(): |
1253 | try: | 1291 | try: |
1254 | task_str = finish_queue.get(block=False) | 1292 | task_str = finish_queue.get(block=False) |
... | @@ -1289,6 +1327,7 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -1289,6 +1327,7 @@ class Command(BaseCommand, LoggerMixin): |
1289 | unknown_summary = {} | 1327 | unknown_summary = {} |
1290 | license_summary = {} | 1328 | license_summary = {} |
1291 | contract_result = {} | 1329 | contract_result = {} |
1330 | contract_result_compare = {} | ||
1292 | res_list = [] | 1331 | res_list = [] |
1293 | interest_keyword = Keywords.objects.filter( | 1332 | interest_keyword = Keywords.objects.filter( |
1294 | type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True) | 1333 | type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True) |
... | @@ -1441,7 +1480,7 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -1441,7 +1480,7 @@ class Command(BaseCommand, LoggerMixin): |
1441 | '{0} [ocr_2 failed] [img_path={1}]'.format(self.log_base, img_path)) | 1480 | '{0} [ocr_2 failed] [img_path={1}]'.format(self.log_base, img_path)) |
1442 | elif classify in consts.CONTRACT_SET: | 1481 | elif classify in consts.CONTRACT_SET: |
1443 | self.contract_process(classify, ocr_data, contract_result, res_list, pno, | 1482 | self.contract_process(classify, ocr_data, contract_result, res_list, pno, |
1444 | ino, part_idx, img_path) | 1483 | ino, part_idx, img_path, contract_result_compare) |
1445 | else: # 流水处理 | 1484 | else: # 流水处理 |
1446 | bs_classify_set.add(classify) | 1485 | bs_classify_set.add(classify) |
1447 | self.bs_process(wb, ocr_data, bs_summary, unknown_summary, classify, res_list, pno, ino, part_idx) | 1486 | self.bs_process(wb, ocr_data, bs_summary, unknown_summary, classify, res_list, pno, ino, part_idx) |
... | @@ -1554,6 +1593,10 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -1554,6 +1593,10 @@ class Command(BaseCommand, LoggerMixin): |
1554 | finally: | 1593 | finally: |
1555 | # TODO 识别结果存一张表,方便跑报表 | 1594 | # TODO 识别结果存一张表,方便跑报表 |
1556 | 1595 | ||
1596 | contract_result_compare_rebuild = self.rebuild_contract(contract_result_compare) | ||
1597 | if len(contract_result_compare_rebuild) > 0: | ||
1598 | license_summary[consts.CONTRACT_CLASSIFY] = contract_result_compare_rebuild | ||
1599 | |||
1557 | # 比对 | 1600 | # 比对 |
1558 | if len(license_summary) > 0 and doc.document_scheme != consts.DOC_SCHEME_LIST[2]: | 1601 | if len(license_summary) > 0 and doc.document_scheme != consts.DOC_SCHEME_LIST[2]: |
1559 | try: | 1602 | try: |
... | @@ -1929,7 +1972,7 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -1929,7 +1972,7 @@ class Command(BaseCommand, LoggerMixin): |
1929 | img_queue, todo_count_dict, res_dict, finish_queue, lock, url, error_list)) | 1972 | img_queue, todo_count_dict, res_dict, finish_queue, lock, url, error_list)) |
1930 | process_list.append(ocr_1_process) | 1973 | process_list.append(ocr_1_process) |
1931 | 1974 | ||
1932 | wb_process = Process(target=self.res_2_wb, args=(res_dict, img_queue, finish_queue, lock, error_list)) | 1975 | wb_process = Process(target=self.res_2_wb, args=(res_dict, img_queue, finish_queue, error_list)) |
1933 | process_list.append(wb_process) | 1976 | process_list.append(wb_process) |
1934 | 1977 | ||
1935 | for p in process_list: | 1978 | for p in process_list: | ... | ... |
... | @@ -313,6 +313,7 @@ class AFCOCRResult(models.Model): | ... | @@ -313,6 +313,7 @@ class AFCOCRResult(models.Model): |
313 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") | 313 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") |
314 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") | 314 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") |
315 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") | 315 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") |
316 | ht_ocr = models.TextField(null=True, verbose_name="AFC合同") | ||
316 | 317 | ||
317 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') | 318 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') |
318 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | 319 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') |
... | @@ -342,6 +343,7 @@ class HILOCRResult(models.Model): | ... | @@ -342,6 +343,7 @@ class HILOCRResult(models.Model): |
342 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") | 343 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") |
343 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") | 344 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") |
344 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") | 345 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") |
346 | ht_ocr = models.TextField(null=True, verbose_name="AFC合同") | ||
345 | 347 | ||
346 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') | 348 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') |
347 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | 349 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') |
... | @@ -370,6 +372,7 @@ class AFCSEOCRResult(models.Model): | ... | @@ -370,6 +372,7 @@ class AFCSEOCRResult(models.Model): |
370 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") | 372 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") |
371 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") | 373 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") |
372 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") | 374 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") |
375 | ht_ocr = models.TextField(null=True, verbose_name="AFC合同") | ||
373 | 376 | ||
374 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') | 377 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') |
375 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | 378 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') |
... | @@ -399,6 +402,7 @@ class HILSEOCRResult(models.Model): | ... | @@ -399,6 +402,7 @@ class HILSEOCRResult(models.Model): |
399 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") | 402 | vat_ocr = models.TextField(null=True, verbose_name="增值税发票") |
400 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") | 403 | hmh_ocr = models.TextField(null=True, verbose_name="豁免函") |
401 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") | 404 | jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") |
405 | ht_ocr = models.TextField(null=True, verbose_name="AFC合同") | ||
402 | 406 | ||
403 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') | 407 | update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') |
404 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | 408 | create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') | ... | ... |
... | @@ -1088,77 +1088,80 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list): | ... | @@ -1088,77 +1088,80 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list): |
1088 | other_info[consts.HMH_EN] = hmh_field_input | 1088 | other_info[consts.HMH_EN] = hmh_field_input |
1089 | compare_info['other'] = other_info | 1089 | compare_info['other'] = other_info |
1090 | 1090 | ||
1091 | # contract_info = {} | 1091 | if application_entity in consts.HIL_SET: |
1092 | # | 1092 | return compare_info, cms_info.get('applicationVersion', 1) |
1093 | # schedule_list = [] | 1093 | |
1094 | # for schedule_dict in cms_info.get('paymentSchedule', []): | 1094 | contract_info = {} |
1095 | # tmp_str = "{1}{0}{2}".format(consts.SPLIT_STR, str(schedule_dict.get('no', '')), | 1095 | |
1096 | # str(schedule_dict.get('grossRentalAmount', ''))) | 1096 | schedule_list = [] |
1097 | # schedule_list.append(tmp_str) | 1097 | for schedule_dict in cms_info.get('paymentSchedule', []): |
1098 | # schedule_list_str = consts.SCHEDULE_SPLIT_STR.join(schedule_list) | 1098 | tmp_str = "{1}{0}{2}".format(consts.SPLIT_STR, str(schedule_dict.get('no', '')), |
1099 | # | 1099 | str(schedule_dict.get('grossRentalAmount', ''))) |
1100 | # afc_contract_input = [ | 1100 | schedule_list.append(tmp_str) |
1101 | # (consts.SE_AFC_CON_FIELD[0], full_no), | 1101 | schedule_list_str = consts.SCHEDULE_SPLIT_STR.join(schedule_list) |
1102 | # (consts.SE_AFC_CON_FIELD[1], amount), | 1102 | |
1103 | # (consts.SE_AFC_CON_FIELD[2], vin_no), | 1103 | afc_contract_input = [ |
1104 | # (consts.SE_AFC_CON_FIELD[3], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))), | 1104 | (consts.SE_AFC_CON_FIELD[0], full_no), |
1105 | # (consts.SE_AFC_CON_FIELD[4], str(cms_info.get('terms', '0'))), | 1105 | (consts.SE_AFC_CON_FIELD[1], amount), |
1106 | # (consts.SE_AFC_CON_FIELD[5], str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', '0.0'))), | 1106 | (consts.SE_AFC_CON_FIELD[2], vin_no), |
1107 | # (consts.SE_AFC_CON_FIELD[6], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))), | 1107 | (consts.SE_AFC_CON_FIELD[3], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))), |
1108 | # (consts.SE_AFC_CON_FIELD[7], amount), | 1108 | (consts.SE_AFC_CON_FIELD[4], str(cms_info.get('terms', '0'))), |
1109 | # (consts.SE_AFC_CON_FIELD[8], vin_no), | 1109 | (consts.SE_AFC_CON_FIELD[5], str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', '0.0'))), |
1110 | # (consts.SE_AFC_CON_FIELD[9], cms_info.get('dealerName', '')), | 1110 | (consts.SE_AFC_CON_FIELD[6], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))), |
1111 | # (consts.SE_AFC_CON_FIELD[10], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))), | 1111 | (consts.SE_AFC_CON_FIELD[7], amount), |
1112 | # (consts.SE_AFC_CON_FIELD[11], str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', '0.0'))), | 1112 | (consts.SE_AFC_CON_FIELD[8], vin_no), |
1113 | # (consts.SE_AFC_CON_FIELD[12], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))), | 1113 | (consts.SE_AFC_CON_FIELD[9], cms_info.get('dealerName', '')), |
1114 | # (consts.SE_AFC_CON_FIELD[13], str(cms_info.get('terms', '0'))), | 1114 | (consts.SE_AFC_CON_FIELD[10], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))), |
1115 | # (consts.SE_AFC_CON_FIELD[14], account_no), | 1115 | (consts.SE_AFC_CON_FIELD[11], str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', '0.0'))), |
1116 | # (consts.SE_AFC_CON_FIELD[15], cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')), | 1116 | (consts.SE_AFC_CON_FIELD[12], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))), |
1117 | # (consts.SE_AFC_CON_FIELD[16], bank_name), | 1117 | (consts.SE_AFC_CON_FIELD[13], str(cms_info.get('terms', '0'))), |
1118 | # (consts.SE_AFC_CON_FIELD[17], schedule_list_str), | 1118 | (consts.SE_AFC_CON_FIELD[14], account_no), |
1119 | # ] | 1119 | (consts.SE_AFC_CON_FIELD[15], cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')), |
1120 | # | 1120 | (consts.SE_AFC_CON_FIELD[16], bank_name), |
1121 | # asp_list = [] | 1121 | (consts.SE_AFC_CON_FIELD[17], schedule_list_str), |
1122 | # for asp_info in cms_info.get('associatedServices', []): | 1122 | ] |
1123 | # asp_list.append( | 1123 | |
1124 | # ( | 1124 | asp_list = [] |
1125 | # asp_info.get('associatedServices', ''), | 1125 | for asp_info in cms_info.get('associatedServices', []): |
1126 | # asp_info.get('price', 0.0), | 1126 | asp_list.append( |
1127 | # asp_info.get('financed', 0.0) | 1127 | ( |
1128 | # ) | 1128 | asp_info.get('associatedServices', ''), |
1129 | # ) | 1129 | asp_info.get('price', 0.0), |
1130 | # | 1130 | asp_info.get('financed', 0.0) |
1131 | # if len(asp_list) > 0: | 1131 | ) |
1132 | # fin_total = 0 | 1132 | ) |
1133 | # gzs_status = consts.GZS_STATUS[1] | 1133 | |
1134 | # for asp_name, asp_price, asp_fin in asp_list: | 1134 | if len(asp_list) > 0: |
1135 | # if gzs_status == consts.GZS_STATUS[1]: | 1135 | fin_total = 0 |
1136 | # if consts.GZS_NAME in asp_name: | 1136 | gzs_status = consts.GZS_STATUS[1] |
1137 | # gzs_status = consts.GZS_STATUS[0] | 1137 | for asp_name, asp_price, asp_fin in asp_list: |
1138 | # if gzs_status == consts.GZS_STATUS[0]: | 1138 | if gzs_status == consts.GZS_STATUS[1]: |
1139 | # if consts.GZS_NAME not in asp_name: | 1139 | if consts.GZS_NAME in asp_name: |
1140 | # gzs_status = consts.GZS_STATUS[2] | 1140 | gzs_status = consts.GZS_STATUS[0] |
1141 | # afc_contract_input.extend( | 1141 | if gzs_status == consts.GZS_STATUS[0]: |
1142 | # [ | 1142 | if consts.GZS_NAME not in asp_name: |
1143 | # (consts.SE_AFC_CON_FIELD[18], asp_name), | 1143 | gzs_status = consts.GZS_STATUS[2] |
1144 | # (consts.SE_AFC_CON_FIELD[19], str(asp_price)), | 1144 | afc_contract_input.extend( |
1145 | # (consts.SE_AFC_CON_FIELD[20], str(asp_fin)), | 1145 | [ |
1146 | # ] | 1146 | (consts.SE_AFC_CON_FIELD[18], asp_name), |
1147 | # ) | 1147 | (consts.SE_AFC_CON_FIELD[19], str(asp_price)), |
1148 | # fin_total += asp_fin | 1148 | (consts.SE_AFC_CON_FIELD[20], str(asp_fin)), |
1149 | # afc_contract_input.append((consts.SE_AFC_CON_FIELD[21], str(fin_total))) | 1149 | ] |
1150 | # | 1150 | ) |
1151 | # # CMS Vehicle Price / 1.13 * 10 % | 1151 | fin_total += asp_fin |
1152 | # gzs_list = [gzs_status] | 1152 | afc_contract_input.append((consts.SE_AFC_CON_FIELD[21], str(fin_total))) |
1153 | # if gzs_status != consts.GZS_STATUS[1]: | 1153 | |
1154 | # gzs_value = str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', 0.0) * 0.1 / 1.13) | 1154 | # CMS Vehicle Price / 1.13 * 10 % |
1155 | # gzs_list.append(gzs_value) | 1155 | gzs_list = [gzs_status] |
1156 | # afc_contract_input.append((consts.SE_AFC_CON_FIELD[22], consts.SPLIT_STR.join(gzs_list))) | 1156 | if gzs_status != consts.GZS_STATUS[1]: |
1157 | # | 1157 | gzs_value = str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', 0.0) * 0.1 / 1.13) |
1158 | # # role_name, _, role_id = main_role_info[applicant_type][0] | 1158 | gzs_list.append(gzs_value) |
1159 | # | 1159 | afc_contract_input.append((consts.SE_AFC_CON_FIELD[22], consts.SPLIT_STR.join(gzs_list))) |
1160 | # contract_info[consts.AFC_CONTRACT_EN] = afc_contract_input | 1160 | |
1161 | # compare_info['contract'] = contract_info | 1161 | # role_name, _, role_id = main_role_info[applicant_type][0] |
1162 | |||
1163 | contract_info[consts.AFC_CONTRACT_EN] = afc_contract_input | ||
1164 | compare_info['contract'] = contract_info | ||
1162 | return compare_info, cms_info.get('applicationVersion', 1) | 1165 | return compare_info, cms_info.get('applicationVersion', 1) |
1163 | 1166 | ||
1164 | 1167 | ||
... | @@ -1669,6 +1672,41 @@ def se_compare_license(license_en, ocr_res_dict, field_list): | ... | @@ -1669,6 +1672,41 @@ def se_compare_license(license_en, ocr_res_dict, field_list): |
1669 | return result_field_list, no_ocr_result, field_img_path_dict | 1672 | return result_field_list, no_ocr_result, field_img_path_dict |
1670 | 1673 | ||
1671 | 1674 | ||
1675 | def se_afc_contract_compare(license_en, ocr_res_dict, strip_list): | ||
1676 | ocr_field, compare_logic, _ = consts.SE_COMPARE_FIELD[license_en] | ||
1677 | ocr_res_str = ocr_res_dict.get(ocr_field) | ||
1678 | |||
1679 | result_field_list = [] | ||
1680 | field_img_path_dict = dict() | ||
1681 | |||
1682 | if ocr_res_str is not None: | ||
1683 | ocr_res_list = json.loads(ocr_res_str) | ||
1684 | ocr_res = ocr_res_list.pop() | ||
1685 | |||
1686 | for name, value in strip_list: | ||
1687 | ocr_str_or_list = ocr_res.get(compare_logic[name][0]) | ||
1688 | |||
1689 | if isinstance(ocr_str_or_list, str) or isinstance(ocr_str_or_list, list): | ||
1690 | result = getattr(cp, compare_logic[name][1])(value, ocr_str_or_list, **compare_logic[name][2]) | ||
1691 | if isinstance(ocr_str_or_list, list): | ||
1692 | ocr_str = '、'.join(ocr_str_or_list) | ||
1693 | else: | ||
1694 | ocr_str = ocr_str_or_list | ||
1695 | else: | ||
1696 | result = consts.RESULT_N | ||
1697 | ocr_str = empty_str | ||
1698 | |||
1699 | img_path = empty_str | ||
1700 | error_type = empty_error_type if result == consts.RESULT_Y else ErrorType.OCR.value | ||
1701 | result_field_list.append((name, value, result, ocr_str, img_path, error_type, compare_logic[name][3])) | ||
1702 | else: | ||
1703 | for name, value in strip_list: | ||
1704 | result_field_list.append((name, value, consts.RESULT_N, empty_str, empty_str, ErrorType.NF.value, | ||
1705 | '{0}未找到'.format(license_en))) | ||
1706 | |||
1707 | return result_field_list, field_img_path_dict | ||
1708 | |||
1709 | |||
1672 | def se_mvc34_compare(license_en, ocr_res_dict, field_list): | 1710 | def se_mvc34_compare(license_en, ocr_res_dict, field_list): |
1673 | ocr_field, compare_logic, _ = consts.SE_COMPARE_FIELD[license_en] | 1711 | ocr_field, compare_logic, _ = consts.SE_COMPARE_FIELD[license_en] |
1674 | ocr_res_str = ocr_res_dict.get(ocr_field) | 1712 | ocr_res_str = ocr_res_dict.get(ocr_field) |
... | @@ -1847,6 +1885,8 @@ def se_compare_process(compare_info, ocr_res_dict): | ... | @@ -1847,6 +1885,8 @@ def se_compare_process(compare_info, ocr_res_dict): |
1847 | failure_field = [] | 1885 | failure_field = [] |
1848 | if license_en == consts.MVC34_EN: | 1886 | if license_en == consts.MVC34_EN: |
1849 | result_field_list, field_img_path_dict = se_mvc34_compare(license_en, ocr_res_dict, strip_list) | 1887 | result_field_list, field_img_path_dict = se_mvc34_compare(license_en, ocr_res_dict, strip_list) |
1888 | elif license_en == consts.AFC_CONTRACT_EN: | ||
1889 | result_field_list, field_img_path_dict = se_afc_contract_compare(license_en, ocr_res_dict, strip_list) | ||
1850 | else: | 1890 | else: |
1851 | result_field_list, _, field_img_path_dict = se_compare_license(license_en, ocr_res_dict, strip_list) | 1891 | result_field_list, _, field_img_path_dict = se_compare_license(license_en, ocr_res_dict, strip_list) |
1852 | for name, value, result, ocr_str, img_path, error_type, cn_reason in result_field_list: | 1892 | for name, value, result, ocr_str, img_path, error_type, cn_reason in result_field_list: | ... | ... |
... | @@ -158,6 +158,15 @@ class Comparison: | ... | @@ -158,6 +158,15 @@ class Comparison: |
158 | 158 | ||
159 | return self.build_res(input_str == compare_str), compare_str | 159 | return self.build_res(input_str == compare_str), compare_str |
160 | 160 | ||
161 | def se_list_compare(self, input_str, ocr_str_or_list, **kwargs): | ||
162 | if isinstance(ocr_str_or_list, list): | ||
163 | for item in ocr_str_or_list: | ||
164 | if item != input_str: | ||
165 | return self.RESULT_N | ||
166 | return self.RESULT_Y | ||
167 | else: | ||
168 | return self.RESULT_N | ||
169 | |||
161 | def se_name_compare(self, input_str, ocr_str, **kwargs): | 170 | def se_name_compare(self, input_str, ocr_str, **kwargs): |
162 | if kwargs.get('is_passport'): | 171 | if kwargs.get('is_passport'): |
163 | input_tmp = input_str.upper().replace(' ', '') | 172 | input_tmp = input_str.upper().replace(' ', '') |
... | @@ -285,6 +294,14 @@ class Comparison: | ... | @@ -285,6 +294,14 @@ class Comparison: |
285 | else: | 294 | else: |
286 | return self.RESULT_Y | 295 | return self.RESULT_Y |
287 | 296 | ||
297 | def se_amount_str_compare(self, input_str, ocr_str, **kwargs): | ||
298 | if input_str == ocr_str: | ||
299 | return self.RESULT_Y | ||
300 | else: | ||
301 | ocr_tmp = ocr_str.replace('元', '').replace(',', '') | ||
302 | input_tmp = input_str.replace('元', '').replace(',', '') | ||
303 | return self.build_res(ocr_tmp == input_tmp) | ||
304 | |||
288 | def se_amount_compare(self, input_str, ocr_str, **kwargs): | 305 | def se_amount_compare(self, input_str, ocr_str, **kwargs): |
289 | if input_str == ocr_str: | 306 | if input_str == ocr_str: |
290 | return self.RESULT_Y | 307 | return self.RESULT_Y | ... | ... |
1 | # import pyodbc | 1 | import pyodbc |
2 | 2 | ||
3 | # afc_sql = """ | 3 | hil_sql = """ |
4 | # create table afc_contract | 4 | ALTER TABLE hil_ocr_result ADD ht_ocr nvarchar(max); |
5 | # ( | 5 | ALTER TABLE hil_se_ocr_result ADD ht_ocr nvarchar(max); |
6 | # id bigint identity primary key, | 6 | """ |
7 | # application_id nvarchar(64) not null, | 7 | |
8 | # create_time datetime not null | 8 | afc_sql = """ |
9 | # ); | 9 | ALTER TABLE afc_ocr_result ADD ht_ocr nvarchar(max); |
10 | 10 | ALTER TABLE afc_se_ocr_result ADD ht_ocr nvarchar(max); | |
11 | # create index afc_contract_application_id_index | 11 | """ |
12 | # on afc_contract (application_id); | 12 | |
13 | # """ | 13 | hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True) |
14 | 14 | ||
15 | # hil_sql = """ | 15 | hil_cursor = hil_cnxn.cursor() |
16 | # create table hil_contract | 16 | hil_cursor.execute(hil_sql) |
17 | # ( | 17 | |
18 | # id bigint identity primary key, | 18 | hil_cursor.close() |
19 | # application_id nvarchar(64) not null, | 19 | hil_cnxn.close() |
20 | # create_time datetime not null | 20 | |
21 | # ); | 21 | afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True) |
22 | 22 | ||
23 | # create index hil_contract_application_id_index | 23 | afc_cursor = afc_cnxn.cursor() |
24 | # on hil_contract (application_id); | 24 | afc_cursor.execute(afc_sql) |
25 | # """ | 25 | |
26 | 26 | afc_cursor.close() | |
27 | # hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True) | 27 | afc_cnxn.close() |
28 | |||
29 | # hil_cursor = hil_cnxn.cursor() | ||
30 | # hil_cursor.execute(hil_sql) | ||
31 | |||
32 | # hil_cursor.close() | ||
33 | # hil_cnxn.close() | ||
34 | |||
35 | # afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True) | ||
36 | |||
37 | # afc_cursor = afc_cnxn.cursor() | ||
38 | # afc_cursor.execute(afc_sql) | ||
39 | |||
40 | # afc_cursor.close() | ||
41 | # afc_cnxn.close() | ... | ... |
-
Please register or sign in to post a comment