2a430194 by 周伟奇

add auto settlement

1 parent 50de32a9
...@@ -1477,6 +1477,9 @@ SE_HIL_CON_1_MAP = { ...@@ -1477,6 +1477,9 @@ SE_HIL_CON_1_MAP = {
1477 '融资成本总额': (5, 4, 7, '融资成本总额', None), 1477 '融资成本总额': (5, 4, 7, '融资成本总额', None),
1478 '租期': (5, 4, 7, '租期', None), 1478 '租期': (5, 4, 7, '租期', None),
1479 '还款计划表': (5, 5, 7, '付款计划表', None), 1479 '还款计划表': (5, 5, 7, '付款计划表', None),
1480 '还款账号': (5, 5, 7, '银行账户-银行账号', None),
1481 '户名': (5, 5, 7, '银行账户-户名', None),
1482 '开户行': (5, 5, 7, '银行账户-开户行', None),
1480 'ASP项目详情': (5, 4, 7, '车辆附加产品明细表', None), 1483 'ASP项目详情': (5, 4, 7, '车辆附加产品明细表', None),
1481 '承租人法定代表人或授权代表': (1, 1, 7, '承租人-法定代表人或授权代表', None), 1484 '承租人法定代表人或授权代表': (1, 1, 7, '承租人-法定代表人或授权代表', None),
1482 1485
...@@ -1532,11 +1535,11 @@ SE_AFC_CON_FIELD = ['-瘥△', '韐剛膠颲遠-撠- ...@@ -1532,11 +1535,11 @@ SE_AFC_CON_FIELD = ['-瘥△', '韐剛膠颲遠-撠-
1532 '车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商', 1535 '车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商',
1533 '贷款本金金额', '车辆贷款本金金额', '附加产品融资贷款本金总额', '贷款期限', '还款账号', '户名', '开户行', 1536 '贷款本金金额', '车辆贷款本金金额', '附加产品融资贷款本金总额', '贷款期限', '还款账号', '户名', '开户行',
1534 '还款计划表', '见证人签字', '见证人日期', 'ASP项目详情-重要条款', '购置税校验', 'ASP项目详情'] 1537 '还款计划表', '见证人签字', '见证人日期', 'ASP项目详情-重要条款', '购置税校验', 'ASP项目详情']
1535 AFC_CON_BANK_FIELD = ['还款账号', '户名', '开户行'] 1538 CON_BANK_FIELD = ['还款账号', '户名', '开户行']
1536 1539
1537 # '承租人姓名', '承租人证件号码', '承租人法定代表人或授权代表' 1540 # '承租人姓名', '承租人证件号码', '承租人法定代表人或授权代表'
1538 SE_HIL_CON_1_FIELD = ['合同编号-每页', '合同编号-正文', '车辆识别代码', '车辆卖方', '车辆原始销售价格', '融资成本总额', '租期', 1541 SE_HIL_CON_1_FIELD = ['合同编号-每页', '合同编号-正文', '车辆识别代码', '车辆卖方', '车辆原始销售价格', '融资成本总额', '租期',
1539 '还款计划表', 'ASP项目详情', '购置税校验', '承租人法定代表人或授权代表'] 1542 '还款计划表', 'ASP项目详情', '购置税校验', '承租人法定代表人或授权代表', '还款账号', '户名', '开户行']
1540 SE_HIL_CON_2_FIELD = ['合同编号', '合同编号-正文', '车辆识别代码', '租金总额', '融资租赁期限'] 1543 SE_HIL_CON_2_FIELD = ['合同编号', '合同编号-正文', '车辆识别代码', '租金总额', '融资租赁期限']
1541 SE_HIL_CON_3_FIELD = ['合同编号-每页', '承租人姓名', '承租人证件号码', '销售经销商', '合同编号-正文', '姓名/名称', 1544 SE_HIL_CON_3_FIELD = ['合同编号-每页', '承租人姓名', '承租人证件号码', '销售经销商', '合同编号-正文', '姓名/名称',
1542 '自然人身份证件号码/法人执照号码', '承租人签字'] 1545 '自然人身份证件号码/法人执照号码', '承租人签字']
...@@ -1820,6 +1823,9 @@ HIL_CONTRACT_1_COMPARE_LOGIC = { ...@@ -1820,6 +1823,9 @@ HIL_CONTRACT_1_COMPARE_LOGIC = {
1820 '还款计划表': ('还款计划表', 'se_schedule_compare', {"value_idx": 1}, '售后回租合同还款计划表与系统不一致'), 1823 '还款计划表': ('还款计划表', 'se_schedule_compare', {"value_idx": 1}, '售后回租合同还款计划表与系统不一致'),
1821 'ASP项目详情': ('ASP项目详情', 'se_asp_compare', {}, '售后回租合同ASP名称或者金额与系统不一致'), 1824 'ASP项目详情': ('ASP项目详情', 'se_asp_compare', {}, '售后回租合同ASP名称或者金额与系统不一致'),
1822 '承租人法定代表人或授权代表': ('承租人法定代表人或授权代表', 'se_name_compare', {}, '售后回租合同承租人法定代表人或授权代表与系统不一致'), 1825 '承租人法定代表人或授权代表': ('承租人法定代表人或授权代表', 'se_name_compare', {}, '售后回租合同承租人法定代表人或授权代表与系统不一致'),
1826 '还款账号': ('还款账号', 'se_common_compare', {'remove_space': True}, '售后回租合同还款账号与系统不一致'),
1827 '户名': ('户名', 'se_common_compare', {}, '售后回租合同户名与系统不一致'),
1828 '开户行': ('开户行', 'se_both_contain_compare', {}, '售后回租合同开户行与系统不一致'),
1823 1829
1824 '承租人姓名': ('承租人姓名', 'se_name_compare', {}, '售后回租合同承租人姓名与系统不一致'), 1830 '承租人姓名': ('承租人姓名', 'se_name_compare', {}, '售后回租合同承租人姓名与系统不一致'),
1825 '承租人证件号': ('承租人证件号', 'se_common_compare', {}, '售后回租合同承租人证件号与系统不一致'), 1831 '承租人证件号': ('承租人证件号', 'se_common_compare', {}, '售后回租合同承租人证件号与系统不一致'),
......
...@@ -806,31 +806,69 @@ class HILCACompareResultRecord(models.Model): ...@@ -806,31 +806,69 @@ class HILCACompareResultRecord(models.Model):
806 reason10_count = models.SmallIntegerField(default=0, verbose_name="原因10数目") 806 reason10_count = models.SmallIntegerField(default=0, verbose_name="原因10数目")
807 result = models.TextField(null=True, verbose_name="比对结果") 807 result = models.TextField(null=True, verbose_name="比对结果")
808 comments = models.TextField(null=True, verbose_name="备注") 808 comments = models.TextField(null=True, verbose_name="备注")
809 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # 索引 809 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # 索引
810 810
811 class Meta: 811 class Meta:
812 managed = False 812 managed = False
813 db_table = 'hil_ca_compare_result_record' 813 db_table = 'hil_ca_compare_result_record'
814 814
815 815
816 # class HILContract(models.Model): 816 class HILAutoSettlement(models.Model):
817 # id = models.AutoField(primary_key=True, verbose_name="id") # 主键 817 id = models.AutoField(primary_key=True, verbose_name="id") # 主键
818 # application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引 818 application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引
819 # create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 819 aa_type = models.CharField(null=True, max_length=64, verbose_name="aa_type")
820
821 rpa_result = models.SmallIntegerField(null=True, verbose_name="原因10数目")
822 rpa_1st_eye_tat = models.DecimalField(null=True, verbose_name='rpa_1st_eye_tat')
823 rpa_2nd_eye_tat = models.DecimalField(null=True, verbose_name='rpa_2nd_eye_tat')
824 rpa_3rd_eye_tat = models.DecimalField(null=True, verbose_name='rpa_3rd_eye_tat')
825 rpa_total_tat = models.DecimalField(null=True, verbose_name='rpa_total_tat')
826 rpa_activated_time = models.DateTimeField(null=True, verbose_name='rpa_activated_time')
827 rpa_get_case_from_ocr_time = models.DateTimeField(null=True, verbose_name='rpa_get_case_from_ocr_time')
828 rpa_get_case_from_oc_time = models.DateTimeField(null=True, verbose_name='rpa_get_case_from_oc_time')
829 rpa_payment_authorize_time = models.DateTimeField(null=True, verbose_name='rpa_payment_authorize_time')
830 rpa_second_eye_time = models.DateTimeField(null=True, verbose_name='rpa_second_eye_time')
831
832 on_off = models.BooleanField(default=True, verbose_name="是否有效")
833 ocr_auto_result_pass = models.BooleanField(default=False, verbose_name="整体结果")
834 ocr_auto_result = models.TextField(null=True, verbose_name="auto比对结果")
835 ocr_latest_comparison_time = models.DateTimeField(auto_now=True, null=True, verbose_name='最新比对时间')
820 836
821 # class Meta: 837 update_time = models.DateTimeField(auto_now=False, verbose_name='修改时间')
822 # managed = False 838 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
823 # db_table = 'hil_contract'
824 839
840 class Meta:
841 managed = False
842 db_table = 'hil_auto_settlement'
825 843
826 # class AFCContract(models.Model):
827 # id = models.AutoField(primary_key=True, verbose_name="id") # 主键
828 # application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引
829 # create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
830 844
831 # class Meta: 845 class AFCAutoSettlement(models.Model):
832 # managed = False 846 id = models.AutoField(primary_key=True, verbose_name="id") # 主键
833 # db_table = 'afc_contract' 847 application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引
834 # situ_db_label = 'afc' 848 aa_type = models.CharField(null=True, max_length=64, verbose_name="aa_type")
849
850 rpa_result = models.SmallIntegerField(null=True, verbose_name="原因10数目")
851 rpa_1st_eye_tat = models.DecimalField(null=True, verbose_name='rpa_1st_eye_tat')
852 rpa_2nd_eye_tat = models.DecimalField(null=True, verbose_name='rpa_2nd_eye_tat')
853 rpa_3rd_eye_tat = models.DecimalField(null=True, verbose_name='rpa_3rd_eye_tat')
854 rpa_total_tat = models.DecimalField(null=True, verbose_name='rpa_total_tat')
855 rpa_activated_time = models.DateTimeField(null=True, verbose_name='rpa_activated_time')
856 rpa_get_case_from_ocr_time = models.DateTimeField(null=True, verbose_name='rpa_get_case_from_ocr_time')
857 rpa_get_case_from_oc_time = models.DateTimeField(null=True, verbose_name='rpa_get_case_from_oc_time')
858 rpa_payment_authorize_time = models.DateTimeField(null=True, verbose_name='rpa_payment_authorize_time')
859 rpa_second_eye_time = models.DateTimeField(null=True, verbose_name='rpa_second_eye_time')
860
861 on_off = models.BooleanField(default=True, verbose_name="是否有效")
862 ocr_auto_result_pass = models.BooleanField(default=False, verbose_name="整体结果")
863 ocr_auto_result = models.TextField(verbose_name="auto比对结果")
864 ocr_latest_comparison_time = models.DateTimeField(auto_now=True, null=True, verbose_name='最新比对时间')
865
866 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
867 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
868
869 class Meta:
870 managed = False
871 db_table = 'afc_auto_settlement'
872 situ_db_label = 'afc'
835 873
836 874
......
...@@ -6,7 +6,7 @@ import datetime ...@@ -6,7 +6,7 @@ import datetime
6 import fitz 6 import fitz
7 import shutil 7 import shutil
8 from django.utils import timezone 8 from django.utils import timezone
9 from django.http import HttpResponse 9 # from django.http import HttpResponse
10 from django.db.models import Q 10 from django.db.models import Q
11 from rest_framework.permissions import IsAuthenticated 11 from rest_framework.permissions import IsAuthenticated
12 from webargs import fields, validate 12 from webargs import fields, validate
...@@ -17,14 +17,15 @@ from common.mixins import GenericView ...@@ -17,14 +17,15 @@ from common.mixins import GenericView
17 from common.tools.file_tools import file_write 17 from common.tools.file_tools import file_write
18 from common.redis_cache import redis_handler as rh 18 from common.redis_cache import redis_handler as rh
19 from .models import ( 19 from .models import (
20 # UploadDocRecords,
20 DocStatus, 21 DocStatus,
21 PriorityApplication, 22 PriorityApplication,
22 GCAPRecords, 23 GCAPRecords,
23 AFCComparisonInfo, 24 AFCComparisonInfo,
24 AFCSEComparisonInfo, 25 # AFCSEComparisonInfo,
25 AFCSECMSInfo, 26 AFCSECMSInfo,
26 HILComparisonInfo, 27 HILComparisonInfo,
27 HILSEComparisonInfo, 28 # HILSEComparisonInfo,
28 HILSECMSInfo, 29 HILSECMSInfo,
29 AFCCompareOfflineReport, 30 AFCCompareOfflineReport,
30 HILCompareOfflineReport, 31 HILCompareOfflineReport,
...@@ -36,6 +37,8 @@ from .models import ( ...@@ -36,6 +37,8 @@ from .models import (
36 AFCSECompareResultRecord, 37 AFCSECompareResultRecord,
37 HILCACompareResultRecord, 38 HILCACompareResultRecord,
38 HILSECompareResultRecord, 39 HILSECompareResultRecord,
40 HILAutoSettlement,
41 AFCAutoSettlement,
39 ) 42 )
40 from .named_enum import ErrorType 43 from .named_enum import ErrorType
41 from .mixins import DocHandler 44 from .mixins import DocHandler
...@@ -213,6 +216,7 @@ se_compare_content = { ...@@ -213,6 +216,7 @@ se_compare_content = {
213 'customerType': fields.Str(required=True, validate=validate.OneOf(consts.CUSTOMER_TYPE)), 216 'customerType': fields.Str(required=True, validate=validate.OneOf(consts.CUSTOMER_TYPE)),
214 "firstSubmmisonDate": CustomDate(required=True), 217 "firstSubmmisonDate": CustomDate(required=True),
215 'propertyDocumentPolicy': fields.Str(required=False, validate=validate.Length(max=16)), 218 'propertyDocumentPolicy': fields.Str(required=False, validate=validate.Length(max=16)),
219 'isAutoSettlement': fields.Boolean(required=False),
216 220
217 'individualCusInfo': fields.List(fields.Nested(se_individual_args), 221 'individualCusInfo': fields.List(fields.Nested(se_individual_args),
218 required=True, validate=validate.Length(min=1, max=4)), 222 required=True, validate=validate.Length(min=1, max=4)),
...@@ -283,6 +287,7 @@ compare_result_args = { ...@@ -283,6 +287,7 @@ compare_result_args = {
283 'scheme': fields.Str(required=True, validate=validate.OneOf(consts.COMPARE_DOC_SCHEME_LIST)), 287 'scheme': fields.Str(required=True, validate=validate.OneOf(consts.COMPARE_DOC_SCHEME_LIST)),
284 'id': fields.Int(required=False, validate=lambda val: val >= 1), 288 'id': fields.Int(required=False, validate=lambda val: val >= 1),
285 'case_id': fields.Str(required=True, validate=validate.Length(max=64)), 289 'case_id': fields.Str(required=True, validate=validate.Length(max=64)),
290 'auto': fields.Int(required=False),
286 } 291 }
287 292
288 upload_pdf_args = { 293 upload_pdf_args = {
...@@ -500,27 +505,29 @@ class UploadDocView(GenericView, DocHandler): ...@@ -500,27 +505,29 @@ class UploadDocView(GenericView, DocHandler):
500 # co_name = self.get_name(applicant_data, 'coApplicantName', 16) 505 # co_name = self.get_name(applicant_data, 'coApplicantName', 16)
501 # g1_name = self.get_name(applicant_data, 'guarantor1Name', 16) 506 # g1_name = self.get_name(applicant_data, 'guarantor1Name', 16)
502 # g2_name = self.get_name(applicant_data, 'guarantor2Name', 16) 507 # g2_name = self.get_name(applicant_data, 'guarantor2Name', 16)
508
503 # try: 509 # try:
504 # # 1. 上传信息记录 510 # # 1. 上传信息记录
505 # UploadDocRecords.objects.create( 511 # UploadDocRecords.objects.create(
506 # metadata_version_id=document.get('metadataVersionId'), 512 # metadata_version_id=document.get('metadataVersionId'),
507 # application_id=application_id, 513 # application_id=application_id,
508 # main_applicant=main_name, 514 # main_applicant='main_name',
509 # co_applicant=co_name, 515 # co_applicant='co_name',
510 # guarantor_1=g1_name, 516 # guarantor_1='g1_name',
511 # guarantor_2=g2_name, 517 # guarantor_2='g2_name',
512 # document_name=document_name, 518 # document_name=document_name,
513 # document_scheme=document_scheme, 519 # document_scheme=document_scheme,
514 # business_type=business_type, 520 # business_type=business_type,
515 # data_source=data_source, 521 # data_source=data_source,
516 # upload_finish_time=document.get('uploadFinishTime'), 522 # upload_finish_time=document.get('uploadFinishTime'),
517 # ) 523 # )
518 # except IntegrityError as e: 524 # except Exception as e:
519 # self.running_log.info('[doc upload fail] [args={0}] [err={1}]'.format(args, e)) 525 # self.running_log.info('[doc upload success] [same file skip] [args={0}]'.format(args))
520 # self.invalid_params(msg='metadataVersionId repeat') 526 # # self.invalid_params(msg='metadataVersionId repeat')
521 # else: 527 # return response.ok()
528
522 data_source = self.fix_data_source(data_source) 529 data_source = self.fix_data_source(data_source)
523 document_scheme=self.fix_scheme(document_scheme) 530 document_scheme = self.fix_scheme(document_scheme)
524 531
525 if document_name.endswith('.zip'): 532 if document_name.endswith('.zip'):
526 self.running_log.info('[doc upload success] [zip file skip] [args={0}]'.format(args)) 533 self.running_log.info('[doc upload success] [zip file skip] [args={0}]'.format(args))
...@@ -531,6 +538,7 @@ class UploadDocView(GenericView, DocHandler): ...@@ -531,6 +538,7 @@ class UploadDocView(GenericView, DocHandler):
531 if document_name.endswith('-证书.pdf') or document_name.endswith('-证书'): 538 if document_name.endswith('-证书.pdf') or document_name.endswith('-证书'):
532 self.running_log.info('[doc upload success] [eapp license skip] [args={0}]'.format(args)) 539 self.running_log.info('[doc upload success] [eapp license skip] [args={0}]'.format(args))
533 return response.ok() 540 return response.ok()
541
534 # 2. 根据业务类型分库存储 542 # 2. 根据业务类型分库存储
535 doc_class, prefix = self.get_doc_class(business_type) 543 doc_class, prefix = self.get_doc_class(business_type)
536 doc = doc_class.objects.create( 544 doc = doc_class.objects.create(
...@@ -707,37 +715,52 @@ class SECompareView(GenericView): ...@@ -707,37 +715,52 @@ class SECompareView(GenericView):
707 def post(self, request, args): 715 def post(self, request, args):
708 # 存库 716 # 存库
709 content = args.get('content', {}) 717 content = args.get('content', {})
710 uniq_seq = content.get('uniqSeq')
711 business_type = content.get('applicationEntity') 718 business_type = content.get('applicationEntity')
712 application_id = content.get('applicationId') 719 application_id = content.get('applicationId')
720 is_auto = content.get('isAutoSettlement', False)
721 if is_auto:
722 # 加入优先级队列
723 PriorityApplication.objects.update_or_create(
724 application_id=application_id, defaults={'on_off': True})
725 # 加入auto表
726 auto_class = HILAutoSettlement if business_type in consts.HIL_SET else AFCAutoSettlement
727 is_auto = auto_class.objects.filter(application_id=application_id, on_off=True).exists()
728 if not is_auto:
729 auto_class.objects.create(
730 application_id=application_id,
731 )
732 return response.ok()
713 733
714 individual_cus_info = json.dumps(content.get('individualCusInfo')) 734 # uniq_seq = content.get('uniqSeq')
715 vehicle_info = json.dumps(content.get('vehicleInfo')) 735 # business_type = content.get('applicationEntity')
716 insurance_info = json.dumps(content.get('insuranceInfo')) 736 # application_id = content.get('applicationId')
717 bank_info = json.dumps(content.get('bankInfo')) 737 #
718 quotationt_info = json.dumps(content.get('quotationtInfo')) 738 # individual_cus_info = json.dumps(content.get('individualCusInfo'))
719 corporate_cus_info = json.dumps(content.get('corporateCusInfo')) if isinstance( 739 # vehicle_info = json.dumps(content.get('vehicleInfo'))
720 content.get('corporateCusInfo'), dict) else None 740 # insurance_info = json.dumps(content.get('insuranceInfo'))
721 741 # bank_info = json.dumps(content.get('bankInfo'))
722 comparison_class = HILSEComparisonInfo if business_type in consts.HIL_SET else AFCSEComparisonInfo 742 # quotationt_info = json.dumps(content.get('quotationtInfo'))
723 comparison_class.objects.create( 743 # corporate_cus_info = json.dumps(content.get('corporateCusInfo')) if isinstance(
724 uniq_seq=uniq_seq, 744 # content.get('corporateCusInfo'), dict) else None
725 application_id=application_id, 745
726 application_version=content.get('applicationVersion'), 746 # comparison_class = HILSEComparisonInfo if business_type in consts.HIL_SET else AFCSEComparisonInfo
727 customer_type=content.get('customerType'), 747 # comparison_class.objects.create(
728 first_submmison_date=content.get('firstSubmmisonDate'), 748 # uniq_seq=uniq_seq,
729 property_doc_policy=content.get('propertyDocumentPolicy', None), 749 # application_id=application_id,
730 individual_cus_info=individual_cus_info, 750 # application_version=content.get('applicationVersion'),
731 corporate_cus_info=corporate_cus_info, 751 # customer_type=content.get('customerType'),
732 vehicle_info=vehicle_info, 752 # first_submmison_date=content.get('firstSubmmisonDate'),
733 insurance_info=insurance_info, 753 # property_doc_policy=content.get('propertyDocumentPolicy', None),
734 bank_info=bank_info, 754 # individual_cus_info=individual_cus_info,
735 quotationt_info=quotationt_info 755 # corporate_cus_info=corporate_cus_info,
736 ) 756 # vehicle_info=vehicle_info,
757 # insurance_info=insurance_info,
758 # bank_info=bank_info,
759 # quotationt_info=quotationt_info
760 # )
737 # 触发比对 761 # 触发比对
738 # compare.apply_async((application_id, business_type, uniq_seq, None, False, False), 762 # compare.apply_async((application_id, business_type, uniq_seq, None, False, False),
739 # queue='queue_compare') 763 # queue='queue_compare')
740 return response.ok()
741 764
742 post.openapi_doc = ''' 765 post.openapi_doc = '''
743 tags: [info] 766 tags: [info]
...@@ -944,6 +967,38 @@ class CompareResultView(GenericView): ...@@ -944,6 +967,38 @@ class CompareResultView(GenericView):
944 entity = args.get('entity') 967 entity = args.get('entity')
945 scheme = args.get('scheme') 968 scheme = args.get('scheme')
946 case_id = args.get('case_id') 969 case_id = args.get('case_id')
970 is_auto = args.get('auto')
971 if is_auto == 1:
972 result_table = HILAutoSettlement if entity == consts.HIL_PREFIX else AFCAutoSettlement
973
974 if result_id is not None:
975 result_obj = result_table.objects.filter(id=result_id).first()
976 else:
977 result_obj = result_table.objects.filter(application_id=case_id).first()
978
979 if result_obj is None:
980 whole_result = ''
981 else:
982 whole_result = consts.RESULT_Y if result_obj.ocr_auto_result_pass else consts.RESULT_N
983
984 source = consts.INFO_SOURCE[1]
985 version = comments = ''
986
987 compare_result = {
988 'id': 0 if result_obj is None else result_obj.id,
989 'application_id': case_id,
990 'entity': entity,
991 'scheme': consts.DOC_SCHEME_LIST[0] if scheme == consts.COMPARE_DOC_SCHEME_LIST[0] else
992 consts.DOC_SCHEME_LIST[1],
993 'whole_result': whole_result,
994 'latest_compared_time': '' if result_obj is None else result_obj.ocr_latest_comparison_time.strftime('%Y-%m-%d %H:%M'),
995 'source': source,
996 'version': version,
997 'comments': comments,
998 'result': [] if result_obj is None else json.loads(result_obj.ocr_auto_result)
999 }
1000
1001 return response.ok(data=compare_result)
947 1002
948 if entity == consts.HIL_PREFIX: 1003 if entity == consts.HIL_PREFIX:
949 result_table = HILCACompareResult if scheme == consts.COMPARE_DOC_SCHEME_LIST[0] else HILSECompareResult 1004 result_table = HILCACompareResult if scheme == consts.COMPARE_DOC_SCHEME_LIST[0] else HILSECompareResult
...@@ -1132,7 +1187,7 @@ class SECMSView(GenericView): ...@@ -1132,7 +1187,7 @@ class SECMSView(GenericView):
1132 permission_classes = [IsAuthenticated] 1187 permission_classes = [IsAuthenticated]
1133 authentication_classes = [OAuth2AuthenticationWithUser] 1188 authentication_classes = [OAuth2AuthenticationWithUser]
1134 1189
1135 # pos上传比对信息接口 SE 1190 # CMS上传比对信息接口 SE
1136 # @use_args(se_cms_args, location='data') 1191 # @use_args(se_cms_args, location='data')
1137 def post(self, request): 1192 def post(self, request):
1138 args = request.data 1193 args = request.data
......
...@@ -27,6 +27,8 @@ from apps.doc.models import ( ...@@ -27,6 +27,8 @@ from apps.doc.models import (
27 AFCCACompareResult, 27 AFCCACompareResult,
28 HILSECompareResult, 28 HILSECompareResult,
29 HILCACompareResult, 29 HILCACompareResult,
30 HILAutoSettlement,
31 AFCAutoSettlement,
30 ) 32 )
31 from apps.doc import consts 33 from apps.doc import consts
32 from apps.doc.ocr.gcap import gcap 34 from apps.doc.ocr.gcap import gcap
...@@ -870,6 +872,481 @@ def ca_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res ...@@ -870,6 +872,481 @@ def ca_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res
870 traceback.format_exc())) 872 traceback.format_exc()))
871 873
872 874
875 def get_se_cms_compare_info_auto(last_obj, application_entity):
876 cms_info = json.loads(last_obj.content)
877
878 compare_info = {}
879
880 individual_info_dict = {}
881 main_role_info = {}
882 company_info_list = []
883
884 # 个人信息证件---------------------------------------------------------------------------------------------------------
885 # province = cms_info.get('province', '')
886 for individual_info in cms_info.get('applicantInformation', []):
887 all_id_num = []
888
889 license_dict = {}
890
891 customer_name = individual_info.get('name', '')
892 legal_name = individual_info.get('legalRepName', '')
893 # establishment_date = individual_info.get('establishmentDate', '')
894 # date_of_birth = individual_info.get('dateOfBirth', '')
895
896 for id_info in individual_info.get('IDInformation', []):
897 if id_info.get('idType') in consts.SE_CMS_FIRST_ID_FIELD_MAPPING:
898 license_en, is_prc = consts.SE_CMS_FIRST_ID_FIELD_MAPPING[id_info['idType']]
899 # ['customerName', 'idNum', 'dateOfBirth', 'idExpiryDate', 'hukouProvince']
900 id_num = decode_des(id_info.get('idNum', ''), des_key)
901 field_input = [
902 ('customerName', customer_name),
903 ('idNum', id_num),
904 # ('dateOfBirth', date_of_birth),
905 # ('idExpiryDate', id_info.get('idExpiryDate', '')),
906 ]
907 if is_prc:
908 # field_input.append(('hukouProvince', province))
909 field_input.append(('真伪', consts.IC_RES_MAPPING.get(1)))
910 field_input.append(('idExpiryDate', id_info.get('idExpiryDate', '')))
911 license_dict[license_en] = field_input
912 all_id_num.append(id_num)
913 # 营业执照 --------------------------------------------------------------------------------------------------
914 elif id_info.get('idType') in ['Unified Social Credit Code', 'Tax Number', 'Business License Number']:
915 # ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode',
916 # 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate']
917 id_num = decode_des(id_info.get('idNum', ''), des_key)
918 # bl_field_input = [
919 # ('companyName', customer_name),
920 # ('legalRepName', legal_name),
921 # ('businessLicenseNo', id_num),
922 # ('organizationCreditCode', id_num),
923 # ('taxRegistrationCertificateNo', id_num),
924 # ('establishmentDate', establishment_date),
925 # ('businessLicenseDueDate', id_info.get('idExpiryDate', '')),
926 # ]
927 # license_dict[consts.BL_EN] = bl_field_input
928 all_id_num.append(id_num)
929 if individual_info.get('customersubType', '') == 'Corporate':
930 company_info_list.append((customer_name, id_num, legal_name))
931
932 # SME营业执照---------------------------------------------------------------------------------------------------
933 # if individual_info.get('customersubType', '').startswith('Self Employed'):
934 # sep_field_input = [
935 # ('legalRepName', customer_name),
936 # ('businessLicenseDueDate', ''),
937 # ]
938 # license_dict[consts.SME_BL_EN] = sep_field_input
939
940 if len(all_id_num) > 0:
941 main_role_info.setdefault(individual_info['applicantType'], []).append(
942 (customer_name, '、'.join(all_id_num), all_id_num[0])
943 )
944
945 if len(license_dict) > 0:
946 individual_info_dict.setdefault(individual_info['applicantType'], []).append(license_dict)
947
948 compare_info['applicantInformation'] = individual_info_dict
949
950 main_name = main_num = hmh_name = hmh_id = ''
951 for applicant_type in consts.APPLICANT_TYPE_ORDER:
952 if applicant_type in main_role_info:
953 # main_name, main_num, _ = main_role_info[applicant_type][0]
954 hmh_name, _, hmh_id = main_role_info[applicant_type][0]
955 break
956
957 # dda_name_list = []
958 # dda_num_list = []
959 # for applicant_type in consts.APPLICANT_TYPE_ORDER[:2]:
960 # if applicant_type in main_role_info:
961 # for dda_name_part, _, dda_num_part in main_role_info[applicant_type]:
962 # dda_name_list.append(dda_name_part)
963 # dda_num_list.append(dda_num_part)
964 # dda_name = '、'.join(dda_name_list)
965 # dda_num = '、'.join(dda_num_list)
966 # del main_role_info
967
968 if len(company_info_list) > 0:
969 company_info = company_info_list[0]
970 else:
971 company_info = None
972
973 vehicle_info = {}
974 vehicle_field_input = []
975 vehicle_status = cms_info.get('vehicleStatus', '')
976 first_submission_date = cms_info.get('submissionDate', '')
977 vin_no = cms_info.get('vehicleInformation', {}).get('vinNo', '')
978 amount = str(cms_info.get('financialInformation', {}).get('vehiclePrice', '0.0'))
979 # 新车发票----------------------------------------------------------------------------------------------------------
980 if vehicle_status == 'New':
981 vehicle_field_input.append(('vinNo', vin_no))
982 vehicle_field_input.append(('dealer', '、'.join([cms_info.get('dealerName', ''), cms_info.get('fapiaoIssuerDealer', '')])))
983 vehicle_field_input.append(('vehicleTransactionAmount', amount))
984
985 if isinstance(company_info, tuple):
986 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[0], company_info[0]))
987 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[1], company_info[1]))
988 else:
989 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[0], hmh_name))
990 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[1], hmh_id))
991 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[2], first_submission_date))
992 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[3], consts.SE_STAMP_VALUE))
993 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[4], consts.SE_FPL_VALUE))
994 bhsj = float(amount) / 1.13
995 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[5], consts.SPLIT_STR.join([
996 format(bhsj, '.2f'),
997 format(float(amount) - bhsj, '.2f'),
998 consts.RESULT_Y
999 ])))
1000 vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[6], consts.SE_LAYOUT_VALUE))
1001 vehicle_info[consts.MVI_EN] = vehicle_field_input
1002 compare_info['vehicleInfo'] = vehicle_info
1003 # 二手车发票、交易凭证、绿本------------------------------------------------------------------------------------------
1004 # else:
1005 # gb_field_input = [
1006 # ('vinNo', vin_no),
1007 # ]
1008 # gb34_field_input = []
1009 # jypz_field_input = []
1010 # vehicle_field_input.append(('vinNo', vin_no))
1011 # vehicle_field_input.append(('vehicleTransactionAmount', amount))
1012 # if isinstance(company_info, tuple):
1013 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[0], company_info[0]))
1014 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[1], company_info[1]))
1015 # jypz_field_input.append((consts.SE_NEW_ADD_FIELD[0], company_info[0]))
1016 # jypz_field_input.append((consts.SE_NEW_ADD_FIELD[1], company_info[1]))
1017 # gb34_field_input.append((consts.SE_GB_USED_FIELD[0], company_info[0]))
1018 # gb34_field_input.append((consts.SE_GB_USED_FIELD[1], company_info[1]))
1019 # else:
1020 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[0], main_name))
1021 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[1], main_num))
1022 # jypz_field_input.append((consts.SE_NEW_ADD_FIELD[0], main_name))
1023 # jypz_field_input.append((consts.SE_NEW_ADD_FIELD[1], main_num))
1024 # gb34_field_input.append((consts.SE_GB_USED_FIELD[0], main_name))
1025 # gb34_field_input.append((consts.SE_GB_USED_FIELD[1], main_num))
1026 # gb34_field_input.append((consts.SE_GB_USED_FIELD[2], first_submission_date))
1027 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[2], first_submission_date))
1028 # vehicle_field_input.append((consts.SE_NEW_ADD_FIELD[3], consts.SE_STAMP_VALUE))
1029 # jypz_field_input.append(('vinNo', vin_no))
1030 # jypz_field_input.append(('vehicleTransactionAmount', amount))
1031 # jypz_field_input.append((consts.SE_GB_USED_FIELD[-1], first_submission_date))
1032 #
1033 # vehicle_info[consts.MVC_EN] = gb_field_input
1034 # vehicle_info[consts.MVC34_EN] = gb34_field_input
1035 # if not detect_list[0]:
1036 # vehicle_info[consts.UCI_EN] = vehicle_field_input
1037 # if not detect_list[1]:
1038 # vehicle_info[consts.JYPZ_EN] = jypz_field_input
1039 # if detect_list[0] and detect_list[1]:
1040 # vehicle_info[consts.UCI_EN] = vehicle_field_input
1041 # compare_info['vehicleInfo'] = vehicle_info
1042
1043 # 银行卡-------------------------------------------------------------------------------------------------------
1044 bank_info = {}
1045 bank_name = cms_info.get('bankAccountDetails', {}).get('bankName', '')
1046 account_no = decode_des(cms_info.get('bankAccountDetails', {}).get('accountNo', ''), des_key)
1047 is_gsyh = True if '工商' in bank_name else False
1048 bank_field_input = [
1049 ('accountNo', account_no),
1050 ('bankName', bank_name),
1051 ('type', consts.BC_TYPE_VALUE),
1052 ]
1053 bank_info[consts.BC_EN] = bank_field_input
1054
1055 # DDA------------------------------------------------------------------------------------------------------------
1056 # if is_gsyh or not detect_list[-1]:
1057 # dda_field_input = [
1058 # ('applicationId(1)', last_obj.application_id),
1059 # ('applicationId(2)', last_obj.application_id),
1060 # ('bankName', bank_name),
1061 # ('companyName', consts.HIL_COMPANY_NAME if application_entity in consts.HIL_SET else consts.AFC_COMPANY_NAME),
1062 # ('customerName', dda_name),
1063 # ('idNum', dda_num),
1064 # ('accountHolderName', cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')),
1065 # ('accountNo', account_no),
1066 # ]
1067 # bank_info[consts.DDA_EN] = dda_field_input
1068 compare_info['bankInfo'] = bank_info
1069
1070 # 银行流水 --------------------------------------------------------------------
1071 if cms_info.get('autoApprovedDetails', {}).get('aaType', '') in ['CAA1', 'CAA2']:
1072 bs_role_list = []
1073 for applicant_type in consts.APPLICANT_TYPE_ORDER[:2]:
1074 if applicant_type in main_role_info:
1075 for bs_role, _, _ in main_role_info[applicant_type]:
1076 bs_role_list.append(bs_role)
1077
1078 bs_info = dict()
1079 bs_field_input = [
1080 (consts.SE_BS_FIELD[0], bs_role_list),
1081 (consts.SE_BS_FIELD[1], first_submission_date),
1082 (consts.SE_BS_FIELD[2], '90天'),
1083 ]
1084
1085 dbr_bs_role_list = []
1086 for dbr_bs_role, _, _ in main_role_info.get(consts.APPLICANT_TYPE_ORDER[2], []):
1087 dbr_bs_role_list.append(dbr_bs_role)
1088
1089 if len(dbr_bs_role_list) >= 1:
1090 bs_field_input.extend([
1091 (consts.SE_BS_FIELD[3], dbr_bs_role_list[0]),
1092 (consts.SE_BS_FIELD[4], first_submission_date),
1093 (consts.SE_BS_FIELD[5], '90天'),
1094 ])
1095 if len(dbr_bs_role_list) >= 2:
1096 bs_field_input.extend([
1097 (consts.SE_BS_FIELD[6], dbr_bs_role_list[1]),
1098 (consts.SE_BS_FIELD[7], first_submission_date),
1099 (consts.SE_BS_FIELD[8], '90天'),
1100 ])
1101 bs_info[consts.BS_EN] = bs_field_input
1102 compare_info['Bank Statement'] = bs_info
1103
1104 # 抵押登记豁免函----------------------------------------------------------------------------------------------------
1105 other_info = {}
1106 full_no = cms_info.get('settlemnetVerification', {}).get('applicationNo', '')
1107 if cms_info.get('mortgageType', '') == 'Mortgage Free' or cms_info.get('mortgageType', '') == 'MortgageFree':
1108 hmh_field_input = [
1109 (consts.SE_HMH_FIELD[0], hmh_name),
1110 (consts.SE_HMH_FIELD[1], hmh_id),
1111 (consts.SE_HMH_FIELD[2], full_no),
1112 (consts.SE_HMH_FIELD[3], cms_info.get('financeCompany', '')),
1113 (consts.SE_HMH_FIELD[4], consts.SE_STAMP_VALUE),
1114 ]
1115 other_info[consts.HMH_EN] = hmh_field_input
1116
1117 # ASP -------------------------------------------------------------------------------------------------------
1118 asp_list = []
1119 gzs_status = consts.GZS_STATUS[1]
1120 gzs_list = [gzs_status]
1121 gzs_price = '0.00'
1122 is_asp = False
1123 # insurance_price = None
1124 if str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.00')) != '0.00':
1125 is_asp = True
1126 # for asp_info in cms_info.get('associatedServices', []):
1127 for asp_info in cms_info.get('associatedServices', {}).get('SubassociatedServices', []):
1128 tmp_asp_name = asp_info.get('associatedServices')
1129 if isinstance(tmp_asp_name, str) and len(tmp_asp_name) > 0:
1130 if gzs_status == consts.GZS_STATUS[1] and tmp_asp_name.find(consts.GZS_NAME) != -1:
1131 gzs_status = consts.GZS_STATUS[2]
1132 gzs_price = asp_info.get('price', '0.00')
1133 asp_list.append(
1134 (
1135 tmp_asp_name,
1136 asp_info.get('price', '0.00'),
1137 asp_info.get('financed', '0.00')
1138 )
1139 )
1140 # 保单费合计
1141 # if tmp_asp_name.find('机动车辆保险') != -1:
1142 # insurance_price = asp_info.get('price', '0.00')
1143
1144 # fin_total = 0
1145 fin_total_tmp = cms_info.get('associatedServices', {}).get('financed total', '0.00')
1146 fin_total = '0.00' if fin_total_tmp.strip() == '' else fin_total_tmp
1147 for asp_name, _, asp_fin in asp_list:
1148 if gzs_status == consts.GZS_STATUS[2] and asp_name.find(consts.GZS_NAME) == -1:
1149 gzs_status = consts.GZS_STATUS[0]
1150 # fin_total += float(asp_fin)
1151 asp_list.append(
1152 (
1153 consts.ASP_SUM_NAME,
1154 '',
1155 fin_total,
1156 # format(fin_total, '.2f'),
1157 )
1158 )
1159
1160 # CMS Vehicle Price / 1.13 * 10 %
1161 if gzs_status != consts.GZS_STATUS[1]:
1162 gzs_value = float(amount) * 0.1 / 1.13
1163 gzs_list.append(gzs_value)
1164 gzs_list.append(float(gzs_price))
1165
1166 # 保单 -----------------------------------------------------------------------------------------------------------
1167 # is_insurance = 0
1168 fp_campaign = cms_info.get('fpCampaign', '')
1169 # insurance_type = cms_info.get('insuranceDetails', {}).get('insuranceType', '')
1170 # if insurance_type == 'Waive Insurance' and isinstance(insurance_price, str):
1171 # is_insurance = 1
1172 # elif insurance_type == 'Comprehensive Insurance':
1173 # is_insurance = 2
1174 # if is_insurance != 0:
1175 # if fp_campaign.find('OCU') == -1:
1176 # ssx_amount = amount
1177 # else:
1178 # ssx_amount = format(float(amount) * 0.8, '.2f')
1179 # if fp_campaign.find('Joy_Plus') == -1 or fp_campaign.find('JoyPlus') == -1:
1180 # dszx_amount = '200000'
1181 # else:
1182 # dszx_amount = '500000'
1183 # bd_field_input = [
1184 # (consts.SE_BD_FIELD[0], hmh_name),
1185 # (consts.SE_BD_FIELD[1], hmh_id),
1186 # (consts.SE_BD_FIELD[2], vin_no),
1187 # (consts.SE_BD_FIELD[3], ssx_amount),
1188 # (consts.SE_BD_FIELD[4], dszx_amount),
1189 # (consts.SE_BD_FIELD[5], consts.JDMPV_VALUE),
1190 # (consts.SE_BD_FIELD[6], cms_info.get('insuranceDetails', {}).get('startDate', '')),
1191 # (consts.SE_BD_FIELD[7], cms_info.get('insuranceDetails', {}).get('endDate', '')),
1192 # (consts.SE_BD_FIELD[8], consts.SE_STAMP_VALUE),
1193 # (consts.SE_BD_FIELD[9], consts.SE_STAMP_VALUE),
1194 # ]
1195 # if is_insurance == 1:
1196 # bd_field_input.append((consts.SE_BD_FIELD[10], insurance_price))
1197 # other_info[consts.BD_EN] = bd_field_input
1198
1199 if len(other_info) > 0:
1200 compare_info['other'] = other_info
1201
1202 schedule_list = []
1203 total_amount = 0
1204 for schedule_dict in cms_info.get('paymentSchedule', []):
1205 tmp_str = "{1}{0}{2}".format(consts.SPLIT_STR, str(schedule_dict.get('no', '')),
1206 str(schedule_dict.get('grossRentalAmount', '')))
1207 schedule_list.append(tmp_str)
1208 total_amount += float(schedule_dict.get('grossRentalAmount', '0.0'))
1209 schedule_list_str = consts.SCHEDULE_SPLIT_STR.join(schedule_list)
1210
1211 online_sign = cms_info.get('contractSource', 'Online Sign') == 'Online Sign'
1212
1213 contract_info = {}
1214 if application_entity in consts.HIL_SET:
1215 # HIL合同 售后回租合同 --------------------------------------------------------------------------------------
1216 hil_contract_1_input = [
1217 (consts.SE_HIL_CON_1_FIELD[0], [full_no] if online_sign else full_no),
1218 (consts.SE_HIL_CON_1_FIELD[1], full_no),
1219 (consts.SE_HIL_CON_1_FIELD[2], vin_no),
1220 (consts.SE_HIL_CON_1_FIELD[3], cms_info.get('dealerName', '')),
1221 (consts.SE_HIL_CON_1_FIELD[4], amount),
1222 (consts.SE_HIL_CON_1_FIELD[5], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))),
1223 (consts.SE_HIL_CON_1_FIELD[6], str(cms_info.get('terms', '0'))),
1224 (consts.SE_HIL_CON_1_FIELD[7], schedule_list_str),
1225 (consts.SE_HIL_CON_1_FIELD[11], account_no),
1226 (consts.SE_HIL_CON_1_FIELD[12], cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')),
1227 (consts.SE_HIL_CON_1_FIELD[13], bank_name),
1228 ]
1229
1230 if is_asp:
1231 hil_contract_1_input.append((consts.SE_HIL_CON_1_FIELD[8], asp_list))
1232 hil_contract_1_input.append((consts.SE_HIL_CON_1_FIELD[9], gzs_list))
1233
1234 if isinstance(company_info, tuple):
1235 hil_contract_1_input.append((consts.SE_HIL_CON_1_FIELD[10], company_info[2]))
1236
1237 for key, app_type, id_idx, field_idx, is_force, e_write in consts.ROLE_LIST_1:
1238 if not e_write and not online_sign:
1239 continue
1240 is_find = False
1241 if app_type in main_role_info:
1242 if len(main_role_info[app_type]) >= id_idx+1:
1243 is_find = True
1244 if isinstance(field_idx, int):
1245 hil_contract_1_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1246 else:
1247 hil_contract_1_input.append((key, field_idx))
1248 if not is_find and is_force:
1249 hil_contract_1_input.append((key, empty_str))
1250 contract_info[consts.HIL_CONTRACT_1_EN] = hil_contract_1_input
1251
1252 # HIL合同 车辆处置协议 --------------------------------------------------------------------------------------
1253 if fp_campaign.find('Joy_Select') != -1 or fp_campaign.find('JoySelect') != -1:
1254 hil_contract_3_input = [
1255 (consts.SE_HIL_CON_3_FIELD[0], [full_no] if online_sign else full_no),
1256 (consts.SE_HIL_CON_3_FIELD[1], hmh_name),
1257 (consts.SE_HIL_CON_3_FIELD[2], hmh_id),
1258 (consts.SE_HIL_CON_3_FIELD[3], cms_info.get('dealerName', '')),
1259 (consts.SE_HIL_CON_3_FIELD[4], full_no),
1260 (consts.SE_HIL_CON_3_FIELD[5], hmh_name),
1261 (consts.SE_HIL_CON_3_FIELD[6], hmh_id),
1262 ]
1263 if online_sign:
1264 hil_contract_3_input.append((consts.SE_HIL_CON_3_FIELD[7], hmh_name))
1265 contract_info[consts.HIL_CONTRACT_3_EN] = hil_contract_3_input
1266
1267 # HIL合同 车辆租赁抵押合同 --------------------------------------------------------------------------------------
1268 hil_contract_2_input = [
1269 (consts.SE_HIL_CON_2_FIELD[0], full_no),
1270 (consts.SE_HIL_CON_2_FIELD[1], full_no),
1271 (consts.SE_HIL_CON_2_FIELD[2], vin_no),
1272 (consts.SE_HIL_CON_2_FIELD[3], format(total_amount, '.2f')),
1273 (consts.SE_HIL_CON_2_FIELD[4], str(cms_info.get('terms', '0'))),
1274 ]
1275
1276 for key, app_type, id_idx, field_idx, is_force, e_write in consts.ROLE_LIST_2:
1277 if not e_write and not online_sign:
1278 continue
1279 is_find = False
1280 if app_type in main_role_info:
1281 if len(main_role_info[app_type]) >= id_idx+1:
1282 is_find = True
1283 if isinstance(field_idx, int):
1284 hil_contract_2_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1285 else:
1286 hil_contract_2_input.append((key, field_idx))
1287 if not is_find and is_force:
1288 hil_contract_2_input.append((key, empty_str))
1289 contract_info[consts.HIL_CONTRACT_2_EN] = hil_contract_2_input
1290 compare_info['contract'] = contract_info
1291 return compare_info, cms_info.get('autoApprovedDetails', {}).get('aaType', ''), is_gsyh
1292 else:
1293 # AFC合同-----------------------------------------------------------------------------------------------------------
1294 vehicle_principal_str = str(cms_info.get('financialInformation', {}).get('vehiclePrincipal', '0.0'))
1295 afc_contract_input = [
1296 (consts.SE_AFC_CON_FIELD[0], full_no),
1297 (consts.SE_AFC_CON_FIELD[1], amount),
1298 (consts.SE_AFC_CON_FIELD[2], vin_no),
1299 (consts.SE_AFC_CON_FIELD[3], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))),
1300 (consts.SE_AFC_CON_FIELD[4], str(cms_info.get('terms', '0'))),
1301 (consts.SE_AFC_CON_FIELD[5], vehicle_principal_str),
1302 (consts.SE_AFC_CON_FIELD[6], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))),
1303 (consts.SE_AFC_CON_FIELD[7], amount),
1304 (consts.SE_AFC_CON_FIELD[8], vin_no),
1305 (consts.SE_AFC_CON_FIELD[9], cms_info.get('dealerName', '')),
1306 (consts.SE_AFC_CON_FIELD[10], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))),
1307 (consts.SE_AFC_CON_FIELD[11], vehicle_principal_str),
1308 (consts.SE_AFC_CON_FIELD[12], str(cms_info.get('financialInformation', {}).get('associatedServicePrincipal', '0.0'))),
1309 (consts.SE_AFC_CON_FIELD[13], str(cms_info.get('terms', '0'))),
1310 (consts.SE_AFC_CON_FIELD[14], account_no),
1311 (consts.SE_AFC_CON_FIELD[15], cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')),
1312 (consts.SE_AFC_CON_FIELD[16], bank_name),
1313 (consts.SE_AFC_CON_FIELD[17], schedule_list_str),
1314 ]
1315
1316 if is_asp:
1317 afc_contract_input.append((consts.SE_AFC_CON_FIELD[20], asp_list))
1318 afc_contract_input.append((consts.SE_AFC_CON_FIELD[22], asp_list))
1319 afc_contract_input.append((consts.SE_AFC_CON_FIELD[21], gzs_list))
1320 else:
1321 afc_contract_input.pop(5)
1322 afc_contract_input.pop(5)
1323 afc_contract_input.pop(9)
1324 afc_contract_input.pop(9)
1325
1326 # '借款人签字及时间', 'Borrower', 0, 0, True
1327 for key, app_type, id_idx, field_idx, is_force, e_write in consts.ROLE_LIST:
1328 if not e_write and not online_sign:
1329 continue
1330 is_find = False
1331 if app_type in main_role_info:
1332 if len(main_role_info[app_type]) >= id_idx+1:
1333 is_find = True
1334 if isinstance(field_idx, int):
1335 afc_contract_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1336 else:
1337 afc_contract_input.append((key, field_idx))
1338 if not is_find and is_force:
1339 afc_contract_input.append((key, empty_str))
1340
1341 if online_sign:
1342 afc_contract_input.append((consts.SE_AFC_CON_FIELD[18], consts.SE_STAMP_VALUE))
1343 afc_contract_input.append((consts.SE_AFC_CON_FIELD[19], empty_str))
1344
1345 contract_info[consts.AFC_CONTRACT_EN] = afc_contract_input
1346 compare_info['contract'] = contract_info
1347 return compare_info, cms_info.get('autoApprovedDetails', {}).get('aaType', ''), is_gsyh
1348
1349
873 def get_se_cms_compare_info(last_obj, application_entity, detect_list): 1350 def get_se_cms_compare_info(last_obj, application_entity, detect_list):
874 cms_info = json.loads(last_obj.content) 1351 cms_info = json.loads(last_obj.content)
875 1352
...@@ -1173,7 +1650,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list): ...@@ -1173,7 +1650,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
1173 ssx_amount = amount 1650 ssx_amount = amount
1174 else: 1651 else:
1175 ssx_amount = format(float(amount) * 0.8, '.2f') 1652 ssx_amount = format(float(amount) * 0.8, '.2f')
1176 if fp_campaign.find('Joy_Plus') == -1: 1653 if fp_campaign.find('Joy_Plus') == -1 or fp_campaign.find('JoyPlus') == -1:
1177 dszx_amount = '200000' 1654 dszx_amount = '200000'
1178 else: 1655 else:
1179 dszx_amount = '500000' 1656 dszx_amount = '500000'
...@@ -1219,6 +1696,9 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list): ...@@ -1219,6 +1696,9 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
1219 (consts.SE_HIL_CON_1_FIELD[5], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))), 1696 (consts.SE_HIL_CON_1_FIELD[5], str(cms_info.get('financialInformation', {}).get('originationPrincipal', '0.0'))),
1220 (consts.SE_HIL_CON_1_FIELD[6], str(cms_info.get('terms', '0'))), 1697 (consts.SE_HIL_CON_1_FIELD[6], str(cms_info.get('terms', '0'))),
1221 (consts.SE_HIL_CON_1_FIELD[7], schedule_list_str), 1698 (consts.SE_HIL_CON_1_FIELD[7], schedule_list_str),
1699 (consts.SE_HIL_CON_1_FIELD[11], account_no),
1700 (consts.SE_HIL_CON_1_FIELD[12], cms_info.get('bankAccountDetails', {}).get('accountHolderName', '')),
1701 (consts.SE_HIL_CON_1_FIELD[13], bank_name),
1222 ] 1702 ]
1223 1703
1224 if is_asp: 1704 if is_asp:
...@@ -1244,7 +1724,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list): ...@@ -1244,7 +1724,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
1244 contract_info[consts.HIL_CONTRACT_1_EN] = hil_contract_1_input 1724 contract_info[consts.HIL_CONTRACT_1_EN] = hil_contract_1_input
1245 1725
1246 # HIL合同 车辆处置协议 -------------------------------------------------------------------------------------- 1726 # HIL合同 车辆处置协议 --------------------------------------------------------------------------------------
1247 if fp_campaign.find('Joy_Select') != -1: 1727 if fp_campaign.find('Joy_Select') != -1 or fp_campaign.find('JoySelect') != -1:
1248 hil_contract_3_input = [ 1728 hil_contract_3_input = [
1249 (consts.SE_HIL_CON_3_FIELD[0], [full_no] if online_sign else full_no), 1729 (consts.SE_HIL_CON_3_FIELD[0], [full_no] if online_sign else full_no),
1250 (consts.SE_HIL_CON_3_FIELD[1], hmh_name), 1730 (consts.SE_HIL_CON_3_FIELD[1], hmh_name),
...@@ -1917,12 +2397,12 @@ def se_contract_compare(license_en, ocr_res_dict, strip_list, is_gsyh): ...@@ -1917,12 +2397,12 @@ def se_contract_compare(license_en, ocr_res_dict, strip_list, is_gsyh):
1917 else: 2397 else:
1918 ocr_str_or_list = ocr_res.get(compare_logic[name][0]) 2398 ocr_str_or_list = ocr_res.get(compare_logic[name][0])
1919 if ocr_str_or_list is None and license_en == consts.AFC_CONTRACT_EN \ 2399 if ocr_str_or_list is None and license_en == consts.AFC_CONTRACT_EN \
1920 and is_gsyh is True and name in consts.AFC_CON_BANK_FIELD: 2400 and is_gsyh is True and name in consts.CON_BANK_FIELD:
1921 result = consts.RESULT_Y 2401 result = consts.RESULT_Y
1922 ocr_str = empty_str 2402 ocr_str = empty_str
1923 reason = compare_logic[name][3] 2403 reason = compare_logic[name][3]
1924 elif isinstance(ocr_str_or_list, str) or isinstance(ocr_str_or_list, list): 2404 elif isinstance(ocr_str_or_list, str) or isinstance(ocr_str_or_list, list):
1925 if license_en == consts.AFC_CONTRACT_EN and is_gsyh is True and name in consts.AFC_CON_BANK_FIELD: 2405 if is_gsyh is True and name in consts.CON_BANK_FIELD:
1926 update_args = {'is_gsyh': is_gsyh} 2406 update_args = {'is_gsyh': is_gsyh}
1927 for k, v in compare_logic[name][2].items(): 2407 for k, v in compare_logic[name][2].items():
1928 update_args[k] = v 2408 update_args[k] = v
...@@ -2223,6 +2703,35 @@ def se_result_detect(ocr_res_dict): ...@@ -2223,6 +2703,35 @@ def se_result_detect(ocr_res_dict):
2223 return detect_list 2703 return detect_list
2224 2704
2225 2705
2706 def se_compare_auto(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, auto_obj):
2707 try:
2708 # 比对逻辑
2709 # detect_list = se_result_detect(ocr_res_dict)
2710 compare_info, aa_type, is_gsyh = get_se_cms_compare_info_auto(
2711 last_obj, application_entity)
2712 compare_result, total_fields, failed_count, successful_at_this_level, failure_reason_str, cn_failure_reason_str, bs_failure_reason_str = se_compare_process(compare_info, ocr_res_dict, is_gsyh)
2713 compare_log.info('{0} [Auto SE] [compare success] [entity={1}] [id={2}] [ocr_res_id={3}] [result={4}]'.format(
2714 log_base, application_entity, application_id, ocr_res_id, compare_result))
2715 except Exception as e:
2716 compare_log.error('{0} [Auto SE] [compare error] [entity={1}] [id={2}] [ocr_res_id={3}] '
2717 '[error={4}]'.format(log_base, application_entity, application_id, ocr_res_id,
2718 traceback.format_exc()))
2719 else:
2720 # 将比对结果写入数据库 auto settlement
2721 try:
2722 auto_obj.aa_type = aa_type
2723 auto_obj.ocr_auto_result_pass = successful_at_this_level
2724 auto_obj.ocr_auto_result = json.dumps(compare_result)
2725 auto_obj.ocr_latest_comparison_time = datetime.now()
2726 auto_obj.save()
2727 compare_log.info('{0} [Auto SE] [result save success] [entity={1}] [id={2}] [ocr_res_id={3}]'.format(
2728 log_base, application_entity, application_id, ocr_res_id))
2729 except Exception as e:
2730 compare_log.error('{0} [Auto SE] [result save error] [entity={1}] [id={2}] [ocr_res_id={3}] '
2731 '[error={4}]'.format(log_base, application_entity, application_id, ocr_res_id,
2732 traceback.format_exc()))
2733
2734
2226 def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, is_cms): 2735 def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, is_cms):
2227 try: 2736 try:
2228 # 比对逻辑 2737 # 比对逻辑
...@@ -2317,6 +2826,7 @@ def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res ...@@ -2317,6 +2826,7 @@ def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res
2317 compare_log.info('{0} [SE] [cms success] [entity={1}] [id={2}] [ocr_res_id={3}] [response={4}]'.format( 2826 compare_log.info('{0} [SE] [cms success] [entity={1}] [id={2}] [ocr_res_id={3}] [response={4}]'.format(
2318 log_base, application_entity, application_id, ocr_res_id, response)) 2827 log_base, application_entity, application_id, ocr_res_id, response))
2319 2828
2829
2320 @app.task 2830 @app.task
2321 def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True, is_cms=False): 2831 def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True, is_cms=False):
2322 # POS: application_id, application_entity, uniq_seq, None 2832 # POS: application_id, application_entity, uniq_seq, None
...@@ -2348,12 +2858,12 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True ...@@ -2348,12 +2858,12 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True
2348 else: 2858 else:
2349 result_class = HILSEOCRResult if application_entity == consts.HIL_PREFIX else AFCSEOCRResult 2859 result_class = HILSEOCRResult if application_entity == consts.HIL_PREFIX else AFCSEOCRResult
2350 ca_result_class = HILOCRResult if application_entity == consts.HIL_PREFIX else AFCOCRResult 2860 ca_result_class = HILOCRResult if application_entity == consts.HIL_PREFIX else AFCOCRResult
2351 if ocr_res_id is None: 2861 # if ocr_res_id is None:
2352 ca_ocr_res_dict = ca_result_class.objects.filter(application_id=application_id).values( 2862 ca_ocr_res_dict = ca_result_class.objects.filter(application_id=application_id).values(
2353 *consts.CA_ADD_COMPARE_FIELDS).first() 2863 *consts.CA_ADD_COMPARE_FIELDS).first()
2354 else: 2864 # else:
2355 ca_ocr_res_dict = ca_result_class.objects.filter(id=ocr_res_id).values( 2865 # ca_ocr_res_dict = ca_result_class.objects.filter(id=ocr_res_id).values(
2356 *consts.CA_ADD_COMPARE_FIELDS).first() 2866 # *consts.CA_ADD_COMPARE_FIELDS).first()
2357 if ocr_res_id is None: 2867 if ocr_res_id is None:
2358 ocr_res_dict = result_class.objects.filter(application_id=application_id).values(*consts.COMPARE_FIELDS).first() 2868 ocr_res_dict = result_class.objects.filter(application_id=application_id).values(*consts.COMPARE_FIELDS).first()
2359 else: 2869 else:
...@@ -2374,4 +2884,10 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True ...@@ -2374,4 +2884,10 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True
2374 tmp_se_result = json.loads(ocr_res_dict.get(field_name)) 2884 tmp_se_result = json.loads(ocr_res_dict.get(field_name))
2375 tmp_ca_result.extend(tmp_se_result) 2885 tmp_ca_result.extend(tmp_se_result)
2376 ocr_res_dict[field_name] = json.dumps(tmp_ca_result) 2886 ocr_res_dict[field_name] = json.dumps(tmp_ca_result)
2887 # auto settlement
2888 auto_class = HILAutoSettlement if application_entity == consts.HIL_PREFIX else AFCAutoSettlement
2889 auto_obj = auto_class.objects.filter(application_id=application_id, on_off=True).first()
2890 if auto_obj is not None:
2891 se_compare_auto(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, auto_obj)
2377 se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, is_cms) 2892 se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res_dict, is_cms)
2893
......
1 import pyodbc
2
3 hil_sql = """
4 create table hil_auto_settlement
5 (
6 id bigint identity primary key,
7 application_id nvarchar(64) not null,
8 aa_type nvarchar(64),
9
10 rpa_result smallint,
11 rpa_1st_eye_tat decimal(18,0),
12 rpa_2nd_eye_tat decimal(18,0),
13 rpa_3rd_eye_tat decimal(18,0),
14 rpa_total_tat decimal(18,0),
15 rpa_activated_time datetime,
16 rpa_get_case_from_ocr_time datetime,
17 rpa_get_case_from_oc_time datetime,
18 rpa_payment_authorize_time datetime,
19 rpa_second_eye_time datetime,
20
21 on_off bit default 1 not null,
22 ocr_auto_result_pass bit default 0 not null,
23 ocr_auto_result nvarchar(max),
24 ocr_latest_comparison_time datetime,
25
26 update_time datetime not null,
27 create_time datetime not null
28 );
29
30 create index hil_auto_settlement_application_id_index
31 on hil_auto_settlement (application_id);
32 """
33
34 afc_sql = """
35 create table afc_auto_settlement
36 (
37 id bigint identity primary key,
38 application_id nvarchar(64) not null,
39 aa_type nvarchar(64),
40
41 rpa_result smallint,
42 rpa_1st_eye_tat decimal(18,0),
43 rpa_2nd_eye_tat decimal(18,0),
44 rpa_3rd_eye_tat decimal(18,0),
45 rpa_total_tat decimal(18,0),
46 rpa_activated_time datetime,
47 rpa_get_case_from_ocr_time datetime,
48 rpa_get_case_from_oc_time datetime,
49 rpa_payment_authorize_time datetime,
50 rpa_second_eye_time datetime,
51
52 on_off bit default 1 not null,
53 ocr_auto_result_pass bit default 0 not null,
54 ocr_auto_result nvarchar(max),
55 ocr_latest_comparison_time datetime,
56
57 update_time datetime not null,
58 create_time datetime not null
59 );
60
61 create index afc_auto_settlement_application_id_index
62 on afc_auto_settlement (application_id);
63 """
64
65 hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
66
67 hil_cursor = hil_cnxn.cursor()
68 hil_cursor.execute(hil_sql)
69
70 hil_cursor.close()
71 hil_cnxn.close()
72
73 afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
74
75 afc_cursor = afc_cnxn.cursor()
76 afc_cursor.execute(afc_sql)
77
78 afc_cursor.close()
79 afc_cnxn.close()
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!