1f9e272b by 王聪

pre settlement pos 接口更新

1 parent d0d6db09
1 ID_EN = 'PRC ID'
2 PP_EN = 'Passport'
3 EEP_EN = 'Resident Permit to Mainland'
4 RP_EN = 'Resident ID'
5 BL_EN = 'Business permit'
6 SME_BL_EN = 'SME Business permit'
7 MVI_EN = 'newCar Invoice'
8 UCI_EN = 'usedCar Invoice'
9 MVC_EN = 'Green Book(1/2)'
10 MVC34_EN = 'Green Book(3/4)'
11 BC_EN = 'Bank Card'
12 DDA_EN = 'DDA'
13 HMH_EN = 'Mortgage Waiver Letter'
14 JYPZ_EN = 'Used Car Document'
15 AFC_CONTRACT_EN = 'AFC Contract'
16 BD_EN = 'Insurance'
17 BS_EN = 'Bank Statement'
18 HIL_CONTRACT_1_EN = '售后回租合同'
19 HIL_CONTRACT_2_EN = '车辆租赁抵押合同'
20 HIL_CONTRACT_3_EN = '车辆处置协议'
21
22 OCR_COMPARE_COMMENT = {
23 ID_EN: {
24 'idExpiryDate': '身份证疑似过期',
25 'customerName': '身份证姓名与系统不一致',
26 'idNum': '身份证号码与系统不一致',
27 'other': '请确认是否提供身份证件'
28 },
29 MVI_EN: {
30 'firstSubmmisonDate': '请确认发票开票日期,若发票开票日期早于首次提交审批日期则无法受理放款申请',
31 'customerName': '发票购买方姓名与系统不一致',
32 'idNum': '发票购买方证件号码与系统不一致',
33 'vinNo': '发票车架号与系统不一致',
34 'vehicleTransactionAmount': '发票车辆价格与系统不一致',
35 'productGroupName': '请确认是否提供发票'
36 },
37 BC_EN: {
38 'bankName': '银行卡开户行与系统不一致',
39 'accountNo': '银行卡卡号与系统不一致',
40 'bankVerificationStatus': '请确认是否提供银行卡'
41 },
42 AFC_CONTRACT_EN: {
43 'applicationId & applicationVersion': '',
44 'service': '',
45 'amount': '',
46 'financedAmount': '',
47 'associatedServicePrincipal': '',
48 'vinNo': '',
49 'accountNo': '',
50 'accountHolderName': '',
51 'bankName': '',
52 'term': '',
53 'applicationEntity': ''
54 },
55 HIL_CONTRACT_1_EN: {
56
57 },
58 HIL_CONTRACT_2_EN: {
59
60 },
61 BD_EN: {
62 '': ''
63 }
64 }
...@@ -781,19 +781,20 @@ class SECompareView(GenericView): ...@@ -781,19 +781,20 @@ class SECompareView(GenericView):
781 bank_obj.on_off = False 781 bank_obj.on_off = False
782 bank_obj.save() 782 bank_obj.save()
783 783
784 # compare_result = pos_compare() 784 compare_result = pos_compare(content)
785 compare_result = { 785
786 "is_pass": True, 786 # compare_result = {
787 "particulars": [{ 787 # "is_pass": True,
788 "object_name": "PRC ID", 788 # "particulars": [{
789 "fields": [{ 789 # "object_name": "PRC ID",
790 "input": "张三", 790 # "fields": [{
791 "ocr": "张三", 791 # "input": "张三",
792 "field_is_pass": True, 792 # "ocr": "张三",
793 "comments": "身份证姓名与系统不一致" 793 # "field_is_pass": True,
794 }] 794 # "comments": "身份证姓名与系统不一致"
795 }] 795 # }]
796 } 796 # }]
797 # }
797 798
798 return response.ok(data=compare_result) 799 return response.ok(data=compare_result)
799 800
......
...@@ -9,6 +9,7 @@ from datetime import datetime, timedelta ...@@ -9,6 +9,7 @@ from datetime import datetime, timedelta
9 from collections import OrderedDict 9 from collections import OrderedDict
10 from . import app 10 from . import app
11 from settings import conf 11 from settings import conf
12 from pos import pos
12 from apps.doc.models import ( 13 from apps.doc.models import (
13 AFCOCRResult, 14 AFCOCRResult,
14 AFCSEOCRResult, 15 AFCSEOCRResult,
...@@ -39,7 +40,7 @@ from apps.doc.exceptions import GCAPException ...@@ -39,7 +40,7 @@ from apps.doc.exceptions import GCAPException
39 from apps.doc.named_enum import RequestTeam, RequestTrigger, ProcessName, ErrorType 40 from apps.doc.named_enum import RequestTeam, RequestTrigger, ProcessName, ErrorType
40 from common.tools.comparison import cp 41 from common.tools.comparison import cp
41 from common.tools.des import decode_des 42 from common.tools.des import decode_des
42 from apps.doc.comments import OCR_COMPARE_COMMENT 43 from pos.pos_consts import OCR_COMPARE_COMMENT
43 44
44 compare_log = logging.getLogger('compare') 45 compare_log = logging.getLogger('compare')
45 log_base = '[Compare]' 46 log_base = '[Compare]'
...@@ -3182,28 +3183,28 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True ...@@ -3182,28 +3183,28 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True
3182 traceback.format_exc())) 3183 traceback.format_exc()))
3183 3184
3184 3185
3185 def pos_compare(application_id, application_entity, uniq_seq, ocr_res_id=None, is_ca=True, is_cms=False): 3186 # pos接口
3187 def pos_compare(pos_content, application_id, application_entity, uniq_seq, ocr_res_id=None, is_ca=True, is_cms=False):
3186 # POS: application_id, application_entity, uniq_seq, None 3188 # POS: application_id, application_entity, uniq_seq, None
3187 # OCR: application_id, business_type(application_entity), None, ocr_res_id 3189 # OCR: application_id, business_type(application_entity), None, ocr_res_id
3188
3189 compare_log.info('{0} [pos_compare] [entity={1}] [id={2}] [uniq_seq={3}] [is_ca={4}] ' 3190 compare_log.info('{0} [pos_compare] [entity={1}] [id={2}] [uniq_seq={3}] [is_ca={4}] '
3190 '[is_cms={5}]'.format(log_base, application_entity, application_id, uniq_seq, 3191 '[is_cms={5}]'.format(log_base, application_entity, application_id, uniq_seq,
3191 is_ca, is_cms)) 3192 is_ca, is_cms))
3192 3193
3193 # 根据application_id查找最新的比对信息,如果没有,结束 3194 # 根据application_id查找最新的比对信息,如果没有,结束
3194 if is_ca: 3195 # if is_ca:
3195 comparison_class = HILComparisonInfo if application_entity == consts.HIL_PREFIX else AFCComparisonInfo 3196 # comparison_class = HILComparisonInfo if application_entity == consts.HIL_PREFIX else AFCComparisonInfo
3196 else: 3197 # else:
3197 if application_entity == consts.HIL_PREFIX: 3198 # if application_entity == consts.HIL_PREFIX:
3198 comparison_class = HILSECMSInfo if is_cms else HILSEComparisonInfo 3199 # comparison_class = HILSECMSInfo if is_cms else HILSEComparisonInfo
3199 else: 3200 # else:
3200 comparison_class = AFCSECMSInfo if is_cms else AFCSEComparisonInfo 3201 # comparison_class = AFCSECMSInfo if is_cms else AFCSEComparisonInfo
3201 last_obj = comparison_class.objects.filter(application_id=application_id).last() 3202 # last_obj = comparison_class.objects.filter(application_id=application_id).last()
3202 if last_obj is None: 3203 # if last_obj is None:
3203 compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] ' 3204 # compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] '
3204 '[is_ca={4}] [is_cms]={5}'.format(log_base, application_entity, application_id, uniq_seq, 3205 # '[is_ca={4}] [is_cms]={5}'.format(log_base, application_entity, application_id, uniq_seq,
3205 is_ca, is_cms)) 3206 # is_ca, is_cms))
3206 return 3207 # return
3207 3208
3208 # 根据application_id查找OCR累计结果指定license字段,如果没有,结束 3209 # 根据application_id查找OCR累计结果指定license字段,如果没有,结束
3209 if is_ca: 3210 if is_ca:
...@@ -3225,8 +3226,15 @@ def pos_compare(application_id, application_entity, uniq_seq, ocr_res_id=None, i ...@@ -3225,8 +3226,15 @@ def pos_compare(application_id, application_entity, uniq_seq, ocr_res_id=None, i
3225 uniq_seq, ocr_res_id, is_ca, is_cms)) 3226 uniq_seq, ocr_res_id, is_ca, is_cms))
3226 return 3227 return
3227 3228
3229 pos_content_obj = json.loads(pos_content)
3228 if is_ca: 3230 if is_ca:
3229 ca_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict) 3231 # 比对逻辑
3232 # compare_info = get_ca_compare_info(pos_content_obj)
3233 # compare_result, total_fields, failed_count = ca_compare_process(compare_info, ocr_res_dict)
3234 # compare_log.info('{0} [CA] [compare success] [entity={1}] [id={2}] [ocr_res_id={3}] [result={4}]'.format(
3235 # log_base, application_entity, application_id, ocr_res_id, compare_result))
3236 # ca_compare(application_id, application_entity, ocr_res_id, pos_content_obj, ocr_res_dict)
3237 compare_result = pos.PosCompare.ca_compare(pos_content_obj, ocr_res_dict)
3230 else: 3238 else:
3231 id_res_list = [] 3239 id_res_list = []
3232 for field_name in consts.CA_ADD_COMPARE_FIELDS: 3240 for field_name in consts.CA_ADD_COMPARE_FIELDS:
...@@ -3241,31 +3249,32 @@ def pos_compare(application_id, application_entity, uniq_seq, ocr_res_id=None, i ...@@ -3241,31 +3249,32 @@ def pos_compare(application_id, application_entity, uniq_seq, ocr_res_id=None, i
3241 tmp_ca_result.extend(tmp_se_result) 3249 tmp_ca_result.extend(tmp_se_result)
3242 ocr_res_dict[field_name] = json.dumps(tmp_ca_result) 3250 ocr_res_dict[field_name] = json.dumps(tmp_ca_result)
3243 # auto settlement 3251 # auto settlement
3244 auto_class = HILAutoSettlement if application_entity == consts.HIL_PREFIX else AFCAutoSettlement 3252 # auto_class = HILAutoSettlement if application_entity == consts.HIL_PREFIX else AFCAutoSettlement
3245 auto_obj = auto_class.objects.filter(application_id=application_id, on_off=True).first() 3253 # auto_obj = auto_class.objects.filter(application_id=application_id, on_off=True).first()
3246 bank_class = HILbankVerification if application_entity == consts.HIL_PREFIX else AFCbankVerification 3254 # bank_class = HILbankVerification if application_entity == consts.HIL_PREFIX else AFCbankVerification
3247 ignore_bank = bank_class.objects.filter(application_id=application_id, on_off=True).exists() 3255 # ignore_bank = bank_class.objects.filter(application_id=application_id, on_off=True).exists()
3248 if auto_obj is not None: 3256 # if auto_obj is not None:
3249 auto_result = se_compare_auto(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, auto_obj, ignore_bank, id_res_list) 3257 # auto_result = se_compare_auto(application_id, application_entity, ocr_res_id, pos_content_obj, ocr_res_dict, auto_obj, ignore_bank, id_res_list)
3250 else: 3258 # else:
3251 auto_result = None 3259 # auto_result = None
3252 3260 #
3253 full_result = se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, is_cms, auto_result, ignore_bank, id_res_list) 3261 # full_result = se_compare(application_id, application_entity, ocr_res_id, pos_content_obj, ocr_res_dict, is_cms, auto_result, ignore_bank, id_res_list)
3254 3262 #
3255 if auto_obj is not None: 3263 # if auto_obj is not None:
3256 try: 3264 # try:
3257 auto_obj.ocr_whole_result_pass = full_result 3265 # auto_obj.ocr_whole_result_pass = full_result
3258 auto_obj.save() 3266 # auto_obj.save()
3259 compare_log.info('{0} [Auto SE] [result save success] [entity={1}] [id={2}] [ocr_res_id={3}]'.format( 3267 # compare_log.info('{0} [Auto SE] [result save success] [entity={1}] [id={2}] [ocr_res_id={3}]'.format(
3260 log_base, application_entity, application_id, ocr_res_id)) 3268 # log_base, application_entity, application_id, ocr_res_id))
3261 except Exception as e: 3269 # except Exception as e:
3262 compare_log.error('{0} [Auto SE] [result save error] [entity={1}] [id={2}] [ocr_res_id={3}] ' 3270 # compare_log.error('{0} [Auto SE] [result save error] [entity={1}] [id={2}] [ocr_res_id={3}] '
3263 '[error={4}]'.format(log_base, application_entity, application_id, ocr_res_id, 3271 # '[error={4}]'.format(log_base, application_entity, application_id, ocr_res_id,
3264 traceback.format_exc())) 3272 # traceback.format_exc()))
3265 3273
3266 result_table = HILCACompareResult if application_entity == consts.HIL_PREFIX else AFCCACompareResult 3274 # result_table = HILCACompareResult if application_entity == consts.HIL_PREFIX else AFCCACompareResult
3267 res_obj = result_table.objects.filter(application_id=application_id).first() 3275 # res_obj = result_table.objects.filter(application_id=application_id).first()
3268 return pos_result_output(res_obj.result) 3276 compare_result = pos.PosCompare.se_compare(pos_content_obj, ocr_res_dict, id_res_list=id_res_list)
3277 return pos_result_output(compare_result)
3269 3278
3270 3279
3271 # pos输出解析 3280 # pos输出解析
...@@ -3284,9 +3293,9 @@ def pos_result_output(compare_result): ...@@ -3284,9 +3293,9 @@ def pos_result_output(compare_result):
3284 particulars = [] 3293 particulars = []
3285 for license, license_items in license_map.items(): 3294 for license, license_items in license_map.items():
3286 particular = {"object_name": license} 3295 particular = {"object_name": license}
3287 license_comments = OCR_COMPARE_COMMENT.get(license) 3296 # license_comments = OCR_COMPARE_COMMENT.get(license)
3288 if not license_comments: 3297 # if not license_comments:
3289 continue 3298 # continue
3290 fields = [] 3299 fields = []
3291 particular["fields"] = fields 3300 particular["fields"] = fields
3292 for license_item in license_items: 3301 for license_item in license_items:
...@@ -3296,7 +3305,7 @@ def pos_result_output(compare_result): ...@@ -3296,7 +3305,7 @@ def pos_result_output(compare_result):
3296 field["field_is_pass"] = license_item.get("Result") == 'Y' 3305 field["field_is_pass"] = license_item.get("Result") == 'Y'
3297 if not field["field_is_pass"]: 3306 if not field["field_is_pass"]:
3298 is_pass = False 3307 is_pass = False
3299 field["comments"] = license_comments.get(license_item.get("Field"), '') 3308 field["comments"] = license_item.get('comments', '')
3300 fields.append(field) 3309 fields.append(field)
3301 particular["fields"] = fields 3310 particular["fields"] = fields
3302 particulars.append(particular) 3311 particulars.append(particular)
......
1 import re 1 import re
2 import time 2 import time
3 import numpy as np 3 import numpy as np
4 from datetime import datetime 4 from datetime import datetime, timedelta
5 from dateutil.relativedelta import relativedelta 5 from dateutil.relativedelta import relativedelta
6 from .rmb_lower import rmb_handler 6 from .rmb_lower import rmb_handler
7 # from .rmb_upper import to_rmb_upper 7 # from .rmb_upper import to_rmb_upper
...@@ -29,6 +29,8 @@ class Comparison: ...@@ -29,6 +29,8 @@ class Comparison:
29 29
30 self.RESULT_Y = 'Y' 30 self.RESULT_Y = 'Y'
31 self.RESULT_N = 'N' 31 self.RESULT_N = 'N'
32 self.RESULT_N1 = 'N1'
33 self.RESULT_N2 = 'N2'
32 self.RESULT_NA = 'NA' 34 self.RESULT_NA = 'NA'
33 35
34 self.TRANS_MAP = { 36 self.TRANS_MAP = {
...@@ -380,6 +382,20 @@ class Comparison: ...@@ -380,6 +382,20 @@ class Comparison:
380 except Exception as e: 382 except Exception as e:
381 return self.RESULT_N 383 return self.RESULT_N
382 384
385 def se_date_compare_pos(self, input_str, ocr_str, **kwargs):
386 try:
387 ocr_date = datetime.strptime(ocr_str, "%Y-%m-%d").date()
388 today = datetime.now().date()
389 if ocr_date < today:
390 return self.RESULT_N1
391 elif today <= ocr_date <= (today + timedelta(days=8)):
392 return self.RESULT_N2
393 elif ocr_date > (today + timedelta(days=8)):
394 return self.RESULT_Y
395 except Exception as e:
396 return self.RESULT_N
397 return self.RESULT_N
398
383 def ca_date_compare(self, input_str, ocr_str, **kwargs): 399 def ca_date_compare(self, input_str, ocr_str, **kwargs):
384 if kwargs.get('long', False): 400 if kwargs.get('long', False):
385 if '长期' in ocr_str or '永久' in ocr_str: 401 if '长期' in ocr_str or '永久' in ocr_str:
......
File mode changed
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!