50de32a9 by 周伟奇

fix bs compare

1 parent b2cb841e
......@@ -1410,7 +1410,7 @@ SE_STAMP_VALUE = '有'
SE_LAYOUT_VALUE = '旧版-旧打印、新版-新打印'
SE_GB_NEW_FIELD = ['vinNo']
SE_GB_USED_FIELD = ['customerName', 'idNum', 'date']
SE_BS_FIELD = ['户名', '打印日期', '流水日期', '(担保人)户名', '(担保人)打印日期', '(担保人)流水日期']
SE_BS_FIELD = ['户名', '打印日期', '流水日期', '(担保人1)户名', '(担保人1)打印日期', '(担保人1)流水日期', '(担保人2)户名', '(担保人2)打印日期', '(担保人2)流水日期']
SE_HMH_FIELD = ['借款人/承租人姓名', '借款人/承租人证件号', '申请号', '渠道', '签字']
SE_BD_FIELD = ['被保险人姓名', '被保险人证件号码', '车架号', '机动车损失保险金额', '第三者责任保险金额', '绝对免赔率', '保险起始日期', '保险截止日期', '保单章', '第一受益人', '保险费合计']
JDMPV_VALUE = ['-', '--', '0%', '0.00', '/', '0']
......@@ -1781,11 +1781,14 @@ BD_COMPARE_LOGIC = {
BS_COMPARE_LOGIC = {
'户名': ('role', 'se_one_compare', {}, '主共借人未提供银行流水'),
'(担保人)户名': ('role', 'se_one_compare', {}, '担保人未提供银行流水'),
'(担保人1)户名': ('role', 'se_name_compare', {}, '担保人1未提供银行流水'),
'(担保人2)户名': ('role', 'se_name_compare', {}, '担保人2未提供银行流水'),
'打印日期': ('print_time', 'se_bs_print_date_compare', {}, '主共借人银行流水打印日期超过15天'),
'(担保人)打印日期': ('print_time', 'se_bs_print_date_compare', {}, '担保人银行流水打印日期超过15天'),
'(担保人1)打印日期': ('print_time', 'se_bs_print_date_compare', {}, '担保人1银行流水打印日期超过15天'),
'(担保人2)打印日期': ('print_time', 'se_bs_print_date_compare', {}, '担保人2银行流水打印日期超过15天'),
'流水日期': ('date', 'se_bs_date_compare', {}, '主共借人银行流水日期不满足3个月'),
'(担保人)流水日期': ('date', 'se_bs_date_compare', {}, '担保人银行流水日期不满足3个月'),
'(担保人1)流水日期': ('date', 'se_bs_date_compare', {}, '担保人1银行流水日期不满足3个月'),
'(担保人2)流水日期': ('date', 'se_bs_date_compare', {}, '担保人2银行流水日期不满足3个月'),
}
SPECIAL_REASON = '主共借人未提供银行流水,含担保人需人工查看直系亲属关系'
......
......@@ -312,21 +312,21 @@ class BSWorkbook(Workbook):
(ws.title, idx_list[i] + min_row, idx_list[i + 1] + min_row - 1, day_mean))
def build_metadata_rows(self, confidence, code, verify_list, print_time, start_date, end_date, res_count_tuple, is_verify_classify):
metadata_rows = [
('流水识别置信度', confidence),
('图片总数', res_count_tuple[0]),
('识别成功', res_count_tuple[1]),
self.blank_row,
]
verify_highlight_row = []
metadata_rows = [('流水识别置信度', confidence)]
if is_verify_classify:
verify_res = '疑似伪造' if len(verify_list) > 0 else '正常'
metadata_rows.append(('流水检测结果', verify_res))
if len(verify_list) > 0:
metadata_rows.append(self.verify_header)
metadata_rows.extend(verify_list)
for r in range(5, len(metadata_rows)+1):
else:
verify_res = ''
metadata_rows.append(('流水检测结果', verify_res))
metadata_rows.append(('图片总数', res_count_tuple[0]))
metadata_rows.append(('识别成功', res_count_tuple[1]))
metadata_rows.append(self.blank_row)
verify_highlight_row = []
if is_verify_classify and len(verify_list) > 0:
metadata_rows.append(self.verify_header)
metadata_rows.extend(verify_list)
for r in range(6, len(metadata_rows)+1):
verify_highlight_row.append(r)
metadata_rows.append(self.blank_row)
......@@ -355,14 +355,18 @@ class BSWorkbook(Workbook):
ms = self.create_sheet('{0}{1}({2})'.format(self.meta_sheet_title, role_name, card))
for row in metadata_rows:
ms.append(row)
if len(verify_highlight_row) > 0:
for cell in ms[2]:
cell.fill = self.amount_fill
for row in verify_highlight_row:
for cell in ms[row]:
cell.fill = self.amount_fill
if res_count_tuple[0] != res_count_tuple[1]:
for cell in ms[2]:
cell.fill = self.amount_fill
for cell in ms[3]:
cell.fill = self.amount_fill
for cell in ms[4]:
cell.fill = self.amount_fill
return ms
@staticmethod
......
......@@ -880,7 +880,7 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
company_info_list = []
# 个人信息证件---------------------------------------------------------------------------------------------------------
province = cms_info.get('province', '')
# province = cms_info.get('province', '')
for individual_info in cms_info.get('applicantInformation', []):
all_id_num = []
......@@ -1082,12 +1082,19 @@ def get_se_cms_compare_info(last_obj, application_entity, detect_list):
dbr_bs_role_list = []
for dbr_bs_role, _, _ in main_role_info.get(consts.APPLICANT_TYPE_ORDER[2], []):
dbr_bs_role_list.append(dbr_bs_role)
if len(dbr_bs_role_list) > 0:
if len(dbr_bs_role_list) >= 1:
bs_field_input.extend([
(consts.SE_BS_FIELD[3], dbr_bs_role_list),
(consts.SE_BS_FIELD[3], dbr_bs_role_list[0]),
(consts.SE_BS_FIELD[4], first_submission_date),
(consts.SE_BS_FIELD[5], '90天'),
])
if len(dbr_bs_role_list) >= 2:
bs_field_input.extend([
(consts.SE_BS_FIELD[6], dbr_bs_role_list[1]),
(consts.SE_BS_FIELD[7], first_submission_date),
(consts.SE_BS_FIELD[8], '90天'),
])
bs_info[consts.BS_EN] = bs_field_input
compare_info['Bank Statement'] = bs_info
......@@ -1522,7 +1529,8 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
if ocr_res_str is not None:
pre_field_list = strip_list[:3]
suf_field_list = strip_list[3:]
dbr1_field_list = strip_list[3:6]
dbr2_field_list = strip_list[6:]
ocr_res_list = json.loads(ocr_res_str)
# length = len(ocr_res_list)
......@@ -1558,14 +1566,14 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
max_correct_count = correct_count
pre_best_res = pre_tmp_res_part
# 担保人
suf_best_res = {}
if len(suf_field_list) > 0:
# 担保人1
dbr1_best_res = {}
if len(dbr1_field_list) > 0:
max_correct_count = 0
for ocr_res in ocr_res_list:
correct_count = 0
suf_tmp_res_part = {}
for idx, (name, value) in enumerate(suf_field_list):
dbr1_tmp_res_part = {}
for idx, (name, value) in enumerate(dbr1_field_list):
ocr_str_or_list = ocr_res.get(compare_logic[name][0])
if isinstance(ocr_str_or_list, str) or isinstance(ocr_str_or_list, list):
result = getattr(cp, compare_logic[name][1])(value, ocr_str_or_list, **compare_logic[name][2])
......@@ -1584,11 +1592,62 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
if result == consts.RESULT_Y:
correct_count += 1
suf_tmp_res_part[name] = (result, ocr_str, reason)
dbr1_tmp_res_part[name] = (result, ocr_str, reason)
if correct_count > 0 and correct_count >= max_correct_count:
max_correct_count = correct_count
suf_best_res = suf_tmp_res_part
dbr1_best_res = dbr1_tmp_res_part
# 担保人2
dbr2_best_res = {}
if len(dbr1_field_list) > 0:
max_correct_count = 0
for ocr_res in ocr_res_list:
correct_count = 0
dbr2_tmp_res_part = {}
for idx, (name, value) in enumerate(dbr2_field_list):
ocr_str_or_list = ocr_res.get(compare_logic[name][0])
if isinstance(ocr_str_or_list, str) or isinstance(ocr_str_or_list, list):
result = getattr(cp, compare_logic[name][1])(value, ocr_str_or_list, **compare_logic[name][2])
if isinstance(ocr_str_or_list, list):
ocr_str = json.dumps(ocr_str_or_list, ensure_ascii=False)
else:
ocr_str = ocr_str_or_list
reason = compare_logic[name][3]
else:
result = consts.RESULT_N
ocr_str = empty_str
reason = compare_logic[name][3]
if idx == 0 and result == consts.RESULT_N:
break
if result == consts.RESULT_Y:
correct_count += 1
dbr2_tmp_res_part[name] = (result, ocr_str, reason)
if correct_count > 0 and correct_count >= max_correct_count:
max_correct_count = correct_count
dbr2_best_res = dbr2_tmp_res_part
dbr_ok = False
# 有担保人
if len(dbr1_field_list) > 0:
# 有担保人12
if len(dbr2_field_list) > 0:
if len(dbr1_best_res) > 0 and len(dbr2_best_res) > 0:
dbr_ok = True
# 有担保人1
else:
if len(dbr1_best_res) > 0:
dbr_ok = True
# 无担保人
# else:
# pass
best_res_empty = False
if len(pre_best_res) == 0 and len(dbr1_best_res) == 0 and len(dbr2_best_res) == 0:
best_res_empty = True
for name, value in pre_field_list:
if len(pre_best_res) > 0:
......@@ -1596,7 +1655,9 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
else:
result = consts.RESULT_N
ocr_str = empty_str
if len(suf_field_list) > 0 and len(suf_best_res) > 0:
if best_res_empty:
reason = consts.SPECIAL_REASON_3
elif dbr_ok: # 有担保人且担保人都提供了流水
reason = consts.SPECIAL_REASON
else:
reason = compare_logic[pre_field_list[0][0]][3]
......@@ -1606,17 +1667,38 @@ def se_bs_compare(license_en, ocr_res_dict, strip_list):
value = json.dumps(value, ensure_ascii=False)
result_field_list.append((name, value, result, ocr_str, img_path, error_type, reason))
if len(suf_field_list) > 0:
for name, value in suf_field_list:
if len(suf_best_res) > 0:
result, ocr_str, reason = suf_best_res[name]
if len(dbr1_field_list) > 0:
for name, value in dbr1_field_list:
if len(dbr1_best_res) > 0:
result, ocr_str, reason = dbr1_best_res[name]
else:
result = consts.RESULT_N
ocr_str = empty_str
if best_res_empty:
reason = consts.SPECIAL_REASON_3
elif len(pre_best_res) > 0:
reason = consts.SPECIAL_REASON_2
else:
reason = compare_logic[dbr1_field_list[0][0]][3]
img_path = empty_str
error_type = empty_error_type if result == consts.RESULT_Y else ErrorType.OCR.value
if isinstance(value, list):
value = json.dumps(value, ensure_ascii=False)
result_field_list.append((name, value, result, ocr_str, img_path, error_type, reason))
if len(dbr2_field_list) > 0:
for name, value in dbr2_field_list:
if len(dbr2_best_res) > 0:
result, ocr_str, reason = dbr2_best_res[name]
else:
result = consts.RESULT_N
ocr_str = empty_str
if len(pre_best_res) > 0:
if best_res_empty:
reason = consts.SPECIAL_REASON_3
elif len(pre_best_res) > 0:
reason = consts.SPECIAL_REASON_2
else:
reason = compare_logic[suf_field_list[0][0]][3]
reason = compare_logic[dbr2_field_list[0][0]][3]
img_path = empty_str
error_type = empty_error_type if result == consts.RESULT_Y else ErrorType.OCR.value
if isinstance(value, list):
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!