1cfd8e70 by 周伟奇

dda part 2

1 parent 86fd122c
...@@ -1204,6 +1204,7 @@ DDA_IC_ID = 'customer_id' ...@@ -1204,6 +1204,7 @@ DDA_IC_ID = 'customer_id'
1204 DDA_BC_NAME = 'account_name' 1204 DDA_BC_NAME = 'account_name'
1205 DDA_BC_ID = 'account_id' 1205 DDA_BC_ID = 'account_id'
1206 DDA_IMG_PATH = 'img_path' 1206 DDA_IMG_PATH = 'img_path'
1207 DDA_PRO = 'pro'
1207 1208
1208 1209
1209 DDA_MAPPING = [ 1210 DDA_MAPPING = [
......
...@@ -23,7 +23,7 @@ from apps.doc.ocr.edms import EDMS, rh ...@@ -23,7 +23,7 @@ from apps.doc.ocr.edms import EDMS, rh
23 from apps.doc.named_enum import KeywordsType 23 from apps.doc.named_enum import KeywordsType
24 from apps.doc.exceptions import EDMSException, OCR1Exception, OCR2Exception, OCR4Exception 24 from apps.doc.exceptions import EDMSException, OCR1Exception, OCR2Exception, OCR4Exception
25 from apps.doc.ocr.wb import BSWorkbook 25 from apps.doc.ocr.wb import BSWorkbook
26 from apps.doc.models import DocStatus, HILDoc, AFCDoc, Keywords, HILOCRResult, AFCOCRResult 26 from apps.doc.models import DocStatus, HILDoc, AFCDoc, Keywords, HILOCRResult, AFCOCRResult, DDARecords, IDBCRecords
27 from celery_compare.tasks import compare 27 from celery_compare.tasks import compare
28 28
29 29
...@@ -43,6 +43,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -43,6 +43,10 @@ class Command(BaseCommand, LoggerMixin):
43 self.img_queue_size = int(conf.IMG_QUEUE_SIZE) 43 self.img_queue_size = int(conf.IMG_QUEUE_SIZE)
44 # 数据目录 44 # 数据目录
45 self.data_dir = conf.DATA_DIR 45 self.data_dir = conf.DATA_DIR
46 # DDA目录
47 self.dda_dir = os.path.join(self.data_dir, 'HIL', 'DDA')
48 self.dda_complete_dir = os.path.join(self.dda_dir, 'complete')
49 self.dda_wanting_dir = os.path.join(self.dda_dir, 'wanting')
46 # ocr相关 50 # ocr相关
47 self.ocr_1_urls = conf.get_namespace('OCR_URL_1_') 51 self.ocr_1_urls = conf.get_namespace('OCR_URL_1_')
48 self.ocr_url_2 = conf.OCR_URL_2 52 self.ocr_url_2 = conf.OCR_URL_2
...@@ -189,7 +193,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -189,7 +193,7 @@ class Command(BaseCommand, LoggerMixin):
189 else: 193 else:
190 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) 194 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY))
191 195
192 def license1_process(self, ocr_data, license_summary, classify, res_list, pno, ino, part_idx, img_path, is_hil, hil_id_bc_mapping): 196 def license1_process(self, ocr_data, license_summary, classify, res_list, pno, ino, part_idx, img_path, do_dda, dda_id_bc_mapping):
193 # 类别:'0'身份证, '1'居住证 197 # 类别:'0'身份证, '1'居住证
194 license_data = ocr_data.get('data') 198 license_data = ocr_data.get('data')
195 if not license_data: 199 if not license_data:
...@@ -197,12 +201,14 @@ class Command(BaseCommand, LoggerMixin): ...@@ -197,12 +201,14 @@ class Command(BaseCommand, LoggerMixin):
197 return 201 return
198 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS)) 202 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS))
199 if classify == consts.DDA_CLASSIFY: # DDA处理 203 if classify == consts.DDA_CLASSIFY: # DDA处理
204 pro = ocr_data.get('confidence')
200 dda_ocr_result = { 205 dda_ocr_result = {
201 consts.DDA_IC_NAME: license_data.get('result', {}).get(consts.DDA_IC_NAME, {}).get('words', ''), 206 consts.DDA_IC_NAME: license_data.get('result', {}).get(consts.DDA_IC_NAME, {}).get('words', ''),
202 consts.DDA_IC_ID: license_data.get('result', {}).get(consts.DDA_IC_ID, {}).get('words', ''), 207 consts.DDA_IC_ID: license_data.get('result', {}).get(consts.DDA_IC_ID, {}).get('words', ''),
203 consts.DDA_BC_NAME: license_data.get('result', {}).get(consts.DDA_BC_NAME, {}).get('words', ''), 208 consts.DDA_BC_NAME: license_data.get('result', {}).get(consts.DDA_BC_NAME, {}).get('words', ''),
204 consts.DDA_BC_ID: license_data.get('result', {}).get(consts.DDA_BC_ID, {}).get('words', ''), 209 consts.DDA_BC_ID: license_data.get('result', {}).get(consts.DDA_BC_ID, {}).get('words', ''),
205 consts.DDA_IMG_PATH: img_path 210 consts.DDA_IMG_PATH: img_path,
211 consts.DDA_PRO: pro
206 } 212 }
207 license_summary.setdefault(classify, []).append(dda_ocr_result) 213 license_summary.setdefault(classify, []).append(dda_ocr_result)
208 214
...@@ -290,17 +296,14 @@ class Command(BaseCommand, LoggerMixin): ...@@ -290,17 +296,14 @@ class Command(BaseCommand, LoggerMixin):
290 296
291 id_card_dict[consts.IC_TURE_OR_FALSE] = consts.IC_RES_MAPPING.get(card_type) 297 id_card_dict[consts.IC_TURE_OR_FALSE] = consts.IC_RES_MAPPING.get(card_type)
292 finally: 298 finally:
293 if is_hil: 299 if do_dda and isinstance(id_card_dict.get(consts.IC_KEY_FIELD[0]), str) and isinstance(id_card_dict.get(consts.IC_KEY_FIELD[1]), str):
294 for key in consts.IC_KEY_FIELD: 300 ic_name = id_card_dict[consts.IC_KEY_FIELD[0]].strip()
295 if not isinstance(id_card_dict.get(key), str): 301 ic_id = id_card_dict[consts.IC_KEY_FIELD[1]].strip()
296 break 302 if len(ic_name) > 0 and ic_id > 0:
297 value = id_card_dict[key].strip() 303 dda_id_bc_mapping.setdefault(consts.IC_FIELD, []).append((ic_name, ic_id, img_path))
298 if len(value) > 0:
299 hil_id_bc_mapping.setdefault(consts.IC_FIELD, dict()).setdefault(
300 value, set()).add(img_path)
301 license_summary.setdefault(classify, []).extend(license_data) 304 license_summary.setdefault(classify, []).extend(license_data)
302 305
303 def license2_process(self, ocr_res_2, license_summary, pid, classify, res_list, pno, ino, part_idx, img_path, is_hil, hil_id_bc_mapping): 306 def license2_process(self, ocr_res_2, license_summary, pid, classify, res_list, pno, ino, part_idx, img_path, do_dda, dda_id_bc_mapping):
304 if ocr_res_2.get('ErrorCode') in consts.SUCCESS_CODE_SET: 307 if ocr_res_2.get('ErrorCode') in consts.SUCCESS_CODE_SET:
305 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS)) 308 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS))
306 if pid == consts.BC_PID: 309 if pid == consts.BC_PID:
...@@ -309,11 +312,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -309,11 +312,10 @@ class Command(BaseCommand, LoggerMixin):
309 # for en_key, chn_key in consts.BC_FIELD: 312 # for en_key, chn_key in consts.BC_FIELD:
310 # res_dict[chn_key] = ocr_res_2.get(en_key, '') 313 # res_dict[chn_key] = ocr_res_2.get(en_key, '')
311 license_summary.setdefault(classify, []).append(ocr_res_2) 314 license_summary.setdefault(classify, []).append(ocr_res_2)
312 if is_hil and isinstance(ocr_res_2.get(consts.BC_KEY_FIELD), str): 315 if do_dda and isinstance(ocr_res_2.get(consts.BC_KEY_FIELD), str):
313 value = ocr_res_2[consts.BC_KEY_FIELD].strip() 316 bc_no = ocr_res_2[consts.BC_KEY_FIELD].strip()
314 if len(value) > 0: 317 if len(bc_no) > 0:
315 hil_id_bc_mapping.setdefault(consts.BC_FIELD, dict()).setdefault( 318 dda_id_bc_mapping.setdefault(consts.BC_FIELD, []).append((bc_no, img_path))
316 value, set()).add(img_path)
317 else: 319 else:
318 # 营业执照等 320 # 营业执照等
319 for result_dict in ocr_res_2.get('ResultList', []): 321 for result_dict in ocr_res_2.get('ResultList', []):
...@@ -723,13 +725,14 @@ class Command(BaseCommand, LoggerMixin): ...@@ -723,13 +725,14 @@ class Command(BaseCommand, LoggerMixin):
723 doc_id = int(doc_id_str) 725 doc_id = int(doc_id_str)
724 doc_class = HILDoc if business_type == consts.HIL_PREFIX else AFCDoc 726 doc_class = HILDoc if business_type == consts.HIL_PREFIX else AFCDoc
725 is_hil = True if business_type == consts.HIL_PREFIX else False 727 is_hil = True if business_type == consts.HIL_PREFIX else False
726 hil_id_bc_mapping = dict() 728 dda_id_bc_mapping = dict()
727 729
728 doc_data_path = os.path.join(self.data_dir, business_type, consts.TMP_DIR_NAME, doc_id_str) 730 doc_data_path = os.path.join(self.data_dir, business_type, consts.TMP_DIR_NAME, doc_id_str)
729 excel_path = os.path.join(doc_data_path, '{0}.xlsx'.format(doc_id_str)) 731 excel_path = os.path.join(doc_data_path, '{0}.xlsx'.format(doc_id_str))
730 732
731 try: 733 try:
732 doc = doc_class.objects.filter(id=doc_id).first() 734 doc = doc_class.objects.filter(id=doc_id).first()
735 do_dda = is_hil and doc.document_scheme == consts.DOC_SCHEME_LIST[1]
733 except Exception as e: 736 except Exception as e:
734 self.online_log.error('{0} [process error (db filter)] [task={1}] [error={2}]'.format( 737 self.online_log.error('{0} [process error (db filter)] [task={1}] [error={2}]'.format(
735 self.log_base, task_str, traceback.format_exc())) 738 self.log_base, task_str, traceback.format_exc()))
...@@ -771,7 +774,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -771,7 +774,7 @@ class Command(BaseCommand, LoggerMixin):
771 continue 774 continue
772 elif classify in consts.LICENSE_CLASSIFY_SET_1: # 证件1 775 elif classify in consts.LICENSE_CLASSIFY_SET_1: # 证件1
773 self.license1_process(ocr_data, license_summary, classify, res_list, pno, 776 self.license1_process(ocr_data, license_summary, classify, res_list, pno,
774 ino, part_idx, img_path, is_hil, hil_id_bc_mapping) 777 ino, part_idx, img_path, do_dda, dda_id_bc_mapping)
775 elif classify in consts.LICENSE_CLASSIFY_SET_2: # 证件2 778 elif classify in consts.LICENSE_CLASSIFY_SET_2: # 证件2
776 pid, _, _, _, _, _ = consts.LICENSE_CLASSIFY_MAPPING.get(classify) 779 pid, _, _, _, _, _ = consts.LICENSE_CLASSIFY_MAPPING.get(classify)
777 file_data = ocr_data.get('section_img') 780 file_data = ocr_data.get('section_img')
...@@ -818,7 +821,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -818,7 +821,7 @@ class Command(BaseCommand, LoggerMixin):
818 ocr_2_res['Name'] = name 821 ocr_2_res['Name'] = name
819 self.license2_process(ocr_2_res, license_summary, pid, classify, 822 self.license2_process(ocr_2_res, license_summary, pid, classify,
820 res_list, pno, ino, part_idx, img_path, 823 res_list, pno, ino, part_idx, img_path,
821 is_hil, hil_id_bc_mapping) 824 do_dda, dda_id_bc_mapping)
822 break 825 break
823 else: 826 else:
824 res_list.append((pno, ino, part_idx, consts.RES_FAILED_2)) 827 res_list.append((pno, ino, part_idx, consts.RES_FAILED_2))
...@@ -921,31 +924,6 @@ class Command(BaseCommand, LoggerMixin): ...@@ -921,31 +924,6 @@ class Command(BaseCommand, LoggerMixin):
921 finally: 924 finally:
922 # TODO 识别结果存一张表,方便跑报表 925 # TODO 识别结果存一张表,方便跑报表
923 926
924 # DDA处理
925 if is_hil:
926 try:
927 # 获取需要保存图片的集合
928 hil_dda_save_img_list = []
929 dda_res_list = license_summary.get(consts.DDA_CLASSIFY, [])
930 self.online_log.info('{0} [DDA process] [DDA_info={1}]'.format(self.log_base, dda_res_list))
931
932 for dda_idx, dda_res in enumerate(dda_res_list):
933 save_img_dict = {
934 consts.DDA_FIELD: dda_res.get(consts.DDA_IMG_PATH)
935 }
936 for dda_field, license_field in consts.DDA_MAPPING:
937 target_str = dda_res.get(dda_field, '')
938 save_img_dict.setdefault(license_field, set()).update(
939 hil_id_bc_mapping.get(license_field, dict()).get(target_str, set()))
940 hil_dda_save_img_list.append(save_img_dict)
941 self.online_log.info('{0} [DDA process] [ic&bc_info={1}]'.format(self.log_base, hil_id_bc_mapping))
942 self.online_log.info('{0} [DDA process] [img_path={1}]'.format(self.log_base, hil_dda_save_img_list))
943 except Exception as e:
944 pass
945 # 保存图片
946 # 数据库记录
947 # report记录
948
949 # CA比对 927 # CA比对
950 if doc.document_scheme == consts.DOC_SCHEME_LIST[0]: 928 if doc.document_scheme == consts.DOC_SCHEME_LIST[0]:
951 try: 929 try:
...@@ -995,6 +973,208 @@ class Command(BaseCommand, LoggerMixin): ...@@ -995,6 +973,208 @@ class Command(BaseCommand, LoggerMixin):
995 else: 973 else:
996 self.online_log.info('{0} [comparison info send success] [task={1}] ' 974 self.online_log.info('{0} [comparison info send success] [task={1}] '
997 '[res_id={2}]'.format(self.log_base, task_str, res_obj.id)) 975 '[res_id={2}]'.format(self.log_base, task_str, res_obj.id))
976
977 # DDA处理
978 if do_dda:
979 # 入库
980 try:
981 dda_record = DDARecords.objects.filter(
982 application_id=doc.application_id).first()
983 if dda_record is None:
984 dda_record = DDARecords(application_id=doc.application_id)
985 except Exception as e:
986 self.online_log.error('{0} [process error (dda db get)] [task={1}] '
987 '[error={2}]'.format(self.log_base, task_str,
988 traceback.format_exc()))
989 else:
990 try:
991 if not dda_record.all_found:
992 found_time = timezone.now()
993 move_img_path_dict = dict()
994 ic_res_list = dda_id_bc_mapping.get(consts.IC_FIELD, [])
995 bc_res_list = dda_id_bc_mapping.get(consts.BC_FIELD, [])
996 self.online_log.info('{0} [dda process] [task={1}] [ic={2}] '
997 '[bc={3}]'.format(self.log_base, task_str, ic_res_list,
998 bc_res_list))
999
1000 if not dda_record.is_dda_found:
1001 try:
1002 # DDA过滤,获取有效DDA
1003 best_dda_res = None
1004 dda_res_list = license_summary.get(consts.DDA_CLASSIFY, [])
1005 if len(dda_res_list) > 0:
1006 dda_res_list.sort(key=lambda x: x.get(consts.DDA_PRO, 0),
1007 reverse=True)
1008 tmp_best_dda_res = dda_res_list[0]
1009 if tmp_best_dda_res.get(consts.DDA_PRO, 0) >= 0.6:
1010 best_dda_res = tmp_best_dda_res
1011 self.online_log.info(
1012 '{0} [dda process] [task={1}] [dda={2}]'.format(
1013 self.log_base, task_str, dda_res_list))
1014 except Exception as e:
1015 best_dda_res = None
1016
1017 dda_record.is_dda_found = False if best_dda_res is None else True
1018
1019 if dda_record.is_dda_found:
1020 dda_path = best_dda_res.get(consts.DDA_IMG_PATH, '')
1021 customer_name = best_dda_res.get(consts.DDA_IC_NAME, '')
1022 customer_id = best_dda_res.get(consts.DDA_IC_ID, '')
1023 account_id = best_dda_res.get(consts.DDA_BC_ID, '')
1024 dda_record.dda_path = dda_path
1025 dda_record.dda_found_time = found_time
1026 dda_record.customer_name = customer_name
1027 dda_record.customer_id = customer_id
1028 dda_record.account_id = account_id
1029 # move
1030 move_img_path_dict.setdefault(consts.DDA_FIELD, set()).add(dda_path)
1031
1032 if dda_record.is_dda_found:
1033
1034 try:
1035 if not dda_record.is_id_found:
1036 for ic_name, ic_id, ic_img_path in ic_res_list:
1037 if ic_id == dda_record.customer_id \
1038 or ic_name == dda_record.customer_name:
1039 dda_record.is_id_found = True
1040 dda_record.id_path = ic_img_path
1041 dda_record.id_found_time = found_time
1042 move_img_path_dict.setdefault(consts.IC_FIELD, set()).add(
1043 ic_img_path)
1044 break
1045 else:
1046 id_record = IDBCRecords.objects.filter(
1047 application_id=doc.application_id,
1048 target_id=dda_record.customer_id,
1049 is_id=True).first()
1050
1051 if id_record is None:
1052 id_record = IDBCRecords.objects.filter(
1053 application_id=doc.application_id,
1054 target_name=dda_record.customer_name,
1055 is_id=True).first()
1056
1057 if id_record is not None:
1058 dda_record.is_id_found = True
1059 dda_record.id_path = id_record.file_path
1060 dda_record.id_found_time = id_record.create_time
1061 move_img_path_dict.setdefault(consts.IC_FIELD, set()).add(
1062 id_record.file_path)
1063 except Exception as e:
1064 self.online_log.error(
1065 '{0} [process error (dda id process)] [task={1}] '
1066 '[error={2}]'.format(self.log_base, task_str,
1067 traceback.format_exc()))
1068
1069 try:
1070 if not dda_record.is_bc_found:
1071 for bc_no, bc_img_path in bc_res_list:
1072 if bc_no == dda_record.account_id:
1073 dda_record.is_bc_found = True
1074 dda_record.bc_path = bc_img_path
1075 dda_record.bc_found_time = found_time
1076 move_img_path_dict.setdefault(consts.BC_FIELD, set()).add(
1077 bc_img_path)
1078 break
1079 else:
1080 bc_record = IDBCRecords.objects.filter(
1081 application_id=doc.application_id,
1082 target_id=dda_record.account_id,
1083 is_id=False).first()
1084
1085 if bc_record is not None:
1086 dda_record.is_bc_found = True
1087 dda_record.bc_path = bc_record.file_path
1088 dda_record.bc_found_time = bc_record.create_time
1089 move_img_path_dict.setdefault(consts.BC_FIELD, set()).add(
1090 bc_record.file_path)
1091 except Exception as e:
1092 self.online_log.error(
1093 '{0} [process error (dda bc process)] [task={1}] '
1094 '[error={2}]'.format(self.log_base, task_str,
1095 traceback.format_exc()))
1096
1097 if dda_record.is_dda_found and dda_record.is_id_found and dda_record.is_bc_found:
1098 dda_record.all_found = True
1099 dda_record.save()
1100
1101 # 图片移动
1102 try:
1103 if len(move_img_path_dict) > 0:
1104 self.online_log.info(
1105 '{0} [dda process] [task={1}] [move_img_path={2}]'.format(
1106 self.log_base, task_str, move_img_path_dict))
1107
1108 wanting_dir = os.path.join(self.dda_wanting_dir, doc.application_id)
1109 wanting_dir_exists = os.path.isdir(wanting_dir)
1110 if dda_record.all_found:
1111 target_dir = os.path.join(self.dda_complete_dir, doc.application_id)
1112 if wanting_dir_exists:
1113 shutil.move(wanting_dir, target_dir)
1114 else:
1115 os.makedirs(target_dir, exist_ok=True)
1116 else:
1117 target_dir = wanting_dir
1118 if not wanting_dir_exists:
1119 os.makedirs(target_dir, exist_ok=True)
1120
1121 for prefix, path_set in move_img_path_dict.items():
1122 for idx, path in enumerate(path_set):
1123 if os.path.isfile(path):
1124 file_name = '{0}_{1}{2}'.format(
1125 prefix, idx, os.path.splitext(path)[-1])
1126 target_path = os.path.join(target_dir, file_name)
1127 shutil.copyfile(path, target_path)
1128 else:
1129 self.online_log.warn(
1130 '{0} [dda process] [img path empty] [task={1}] '
1131 '[path={2}]'.format(self.log_base, task_str, path))
1132 except Exception as e:
1133 self.online_log.error(
1134 '{0} [process error (dda img move)] [task={1}] '
1135 '[error={2}]'.format(self.log_base, task_str,
1136 traceback.format_exc()))
1137
1138 # id & bc 入库
1139 try:
1140 if not dda_record.is_dda_found:
1141 ic_set = set()
1142 bc_set = set()
1143 for ic_name, ic_id, ic_img_path in ic_res_list:
1144 query_str = '{0}{1}'.format(ic_name, ic_id)
1145 if query_str in ic_set:
1146 continue
1147 ic_set.add(query_str)
1148 IDBCRecords.objects.create(
1149 application_id=doc.application_id,
1150 target_name=ic_name,
1151 target_id=ic_id,
1152 is_id=True,
1153 file_path=ic_img_path
1154 )
1155 for bc_no, bc_img_path in bc_res_list:
1156 if bc_no in bc_set:
1157 continue
1158 bc_set.add(bc_no)
1159 IDBCRecords.objects.create(
1160 application_id=doc.application_id,
1161 target_id=bc_no,
1162 is_id=False,
1163 file_path=bc_img_path
1164 )
1165 except Exception as e:
1166 self.online_log.error(
1167 '{0} [process error (dda id&bc db save)] [task={1}] '
1168 '[error={2}]'.format(self.log_base, task_str,
1169 traceback.format_exc()))
1170
1171 # TODO report
1172
1173 except Exception as e:
1174 self.online_log.error('{0} [process error (dda process)] [task={1}] '
1175 '[error={2}]'.format(self.log_base, task_str,
1176 traceback.format_exc()))
1177
998 finally: 1178 finally:
999 try: 1179 try:
1000 img_save_path = os.path.join(doc_data_path, 'img') 1180 img_save_path = os.path.join(doc_data_path, 'img')
......
...@@ -267,3 +267,52 @@ class HILOCRResult(models.Model): ...@@ -267,3 +267,52 @@ class HILOCRResult(models.Model):
267 managed = False 267 managed = False
268 db_table = 'hil_ocr_result' 268 db_table = 'hil_ocr_result'
269 269
270
271 # DDA ID & BC ----> HIL SE 专有
272 class DDARecords(models.Model):
273 id = models.AutoField(primary_key=True, verbose_name="id") # 主键
274 application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引
275
276 is_dda_found = models.BooleanField(default=False, verbose_name="DDA是否找到")
277 is_id_found = models.BooleanField(default=False, verbose_name="身份证是否找到")
278 is_bc_found = models.BooleanField(default=False, verbose_name="银行卡是否找到")
279 all_found = models.BooleanField(default=False, verbose_name="是否全找到")
280
281 dda_path = models.CharField(null=True, max_length=1024, verbose_name="DDA图片路径")
282 id_path = models.CharField(null=True, max_length=1024, verbose_name="身份证图片路径")
283 bc_path = models.CharField(null=True, max_length=1024, verbose_name="银行卡图片路径")
284
285 customer_name = models.CharField(null=True, max_length=1024, verbose_name="DDA身份证姓名")
286 customer_id = models.CharField(null=True, max_length=1024, verbose_name="DDA身份证号码")
287 account_id = models.CharField(null=True, max_length=1024, verbose_name="DDA银行卡号")
288
289 dda_found_time = models.DateTimeField(null=True, verbose_name='DDA时间')
290 id_found_time = models.DateTimeField(null=True, verbose_name='身份证时间')
291 bc_found_time = models.DateTimeField(null=True, verbose_name='银行卡时间')
292
293 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') # 索引
294 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') # 索引
295
296 class Meta:
297 managed = False
298 db_table = 'dda_records'
299
300
301 class IDBCRecords(models.Model):
302 id = models.AutoField(primary_key=True, verbose_name="id") # 主键
303 application_id = models.CharField(max_length=64, verbose_name="申请id") # 索引
304
305 target_name = models.CharField(null=True, max_length=1024, verbose_name="DDA身份证姓名") # 与申请号联合索引
306 target_id = models.CharField(max_length=1024, verbose_name="DDA身份证号码or银行卡号") # 与申请号联合索引
307
308 is_id = models.BooleanField(default=True, verbose_name="身份证or银行卡")
309
310 file_path = models.CharField(max_length=1024, verbose_name="图片路径")
311
312 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
313
314 class Meta:
315 managed = False
316 db_table = 'idbc_records'
317
318
......
1 import pyodbc
2
3 hil_sql = """
4 create table dda_records
5 (
6 id bigint identity
7 primary key,
8 application_id nvarchar(64) not null,
9 is_dda_found bit default 0 not null,
10 is_id_found bit default 0 not null,
11 is_bc_found bit default 0 not null,
12 all_found bit default 0 not null,
13 dda_path nvarchar(1024),
14 id_path nvarchar(1024),
15 bc_path nvarchar(1024),
16 customer_name nvarchar(1024),
17 customer_id nvarchar(1024),
18 account_id nvarchar(1024),
19 dda_found_time datetime,
20 id_found_time datetime,
21 bc_found_time datetime,
22 update_time datetime not null,
23 create_time datetime not null,
24 );
25
26 create index dda_records_application_id_index
27 on dda_records (application_id);
28
29 create index dda_records_update_time_index
30 on dda_records (update_time);
31
32 create index dda_records_create_time_index
33 on dda_records (create_time);
34
35 create table idbc_records
36 (
37 id bigint identity
38 primary key,
39 application_id nvarchar(64) not null,
40 target_name nvarchar(1024),
41 target_id nvarchar(1024) not null,
42 is_id bit default 1 not null,
43 file_path nvarchar(1024) not null,
44 create_time datetime not null,
45 );
46
47 create index idbc_records_application_id_index
48 on idbc_records (application_id);
49
50 create index idbc_records_application_id_target_name_index
51 on idbc_records (application_id, target_name);
52
53 create index idbc_records_application_id_target_id_index
54 on idbc_records (application_id, target_id);
55 """
56
57 hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
58 hil_cursor = hil_cnxn.cursor()
59 hil_cursor.execute(hil_sql)
60 hil_cursor.close()
61 hil_cnxn.close()
62
63 # afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
64 # afc_cursor = afc_cnxn.cursor()
65 # afc_cursor.execute(afc_sql)
66 # afc_cursor.close()
67 # afc_cnxn.close()
...\ No newline at end of file ...\ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!