9f4b3645 by 周伟奇

Merge branch 'feature/uat-tmp' into 'master'

Feature/uat tmp

See merge request !18
2 parents 284b3e1d 66e1870b
......@@ -10,8 +10,8 @@ PAGE_SIZE_DEFAULT = 10
FIXED_APPLICATION_ID_PREFIX = 'CH-S'
DOC_SCHEME_LIST = ['ACCEPTANCE', 'SETTLEMENT', 'CONTRACTMANAGEMENT']
DATA_SOURCE_LIST = ['POS', 'EAPP', 'ECONTRACT']
DOC_SCHEME_LIST = ['ACCEPTANCE', 'SETTLEMENT', 'CONTRACTMANAGEMENT', 'INSURANCE']
DATA_SOURCE_LIST = ['POS', 'EAPP', 'ECONTRACT', 'OVP']
COMPARE_DOC_SCHEME_LIST = ['CA', 'SE']
HIL_PREFIX = 'HIL'
......@@ -1057,7 +1057,25 @@ HIL_CONTRACT_2_CLASSIFY = 44
HIL_CONTRACT_3_CN_NAME = '车辆处置协议'
HIL_CONTRACT_3_CLASSIFY = 45
CONTRACT_SET = {CONTRACT_QRS_CLASSIFY, CONTRACT_CLASSIFY, HIL_CONTRACT_1_CLASSIFY, HIL_CONTRACT_2_CLASSIFY, HIL_CONTRACT_3_CLASSIFY}
FSM_CONTRACT_WEP_CN_NAME = '延长保修合同'
FSM_CONTRACT_WEP_CLASSIFY = 51
FSM_CONTRACT_MSI_CN_NAME = '长悦保养合同'
FSM_CONTRACT_MSI_CLASSIFY = 52
FSM_CONTRACT_SC_CN_NAME = '汽车销售合同'
FSM_CONTRACT_SC_CLASSIFY = 53
CONTRACT_SET = {
CONTRACT_QRS_CLASSIFY,
CONTRACT_CLASSIFY,
HIL_CONTRACT_1_CLASSIFY,
HIL_CONTRACT_2_CLASSIFY,
HIL_CONTRACT_3_CLASSIFY,
FSM_CONTRACT_WEP_CLASSIFY,
FSM_CONTRACT_MSI_CLASSIFY,
FSM_CONTRACT_SC_CLASSIFY,
}
CONTRACT_MAP = {
HIL_CONTRACT_1_CLASSIFY: HIL_CONTRACT_1_CN_NAME,
......@@ -1065,8 +1083,13 @@ CONTRACT_MAP = {
HIL_CONTRACT_3_CLASSIFY: HIL_CONTRACT_3_CN_NAME,
CONTRACT_CLASSIFY: CONTRACT_CN_NAME,
CONTRACT_QRS_CLASSIFY: CONTRACT_QRS_CN_NAME,
FSM_CONTRACT_WEP_CLASSIFY: FSM_CONTRACT_WEP_CN_NAME,
FSM_CONTRACT_MSI_CLASSIFY: FSM_CONTRACT_MSI_CN_NAME,
FSM_CONTRACT_SC_CLASSIFY: FSM_CONTRACT_SC_CN_NAME,
}
FSM_CONTRACT_CLASSIFY_SET = {FSM_CONTRACT_WEP_CLASSIFY, FSM_CONTRACT_MSI_CLASSIFY, FSM_CONTRACT_SC_CLASSIFY}
# 保单
INSURANCE_CN_NAME = '保单'
INSURANCE_CLASSIFY = 42
......@@ -1215,6 +1238,11 @@ BS_FIELD = 'bss_ocr'
HIL_CONTRACT_1_FIELD = 'hil_contract_1_ocr'
HIL_CONTRACT_2_FIELD = 'hil_contract_2_ocr'
HIL_CONTRACT_3_FIELD = 'hil_contract_3_ocr'
FSM_CONTRACT_WEP_FIELD = 'fsm_wep_ocr'
FSM_CONTRACT_MSI_FIELD = 'fsm_msi_ocr'
FSM_CONTRACT_SC_FIELD = 'fsm_sc_ocr'
BS_CLASSIFY = 10089
RESULT_MAPPING = {
......@@ -1239,6 +1267,9 @@ RESULT_MAPPING = {
HIL_CONTRACT_1_CLASSIFY: HIL_CONTRACT_1_FIELD,
HIL_CONTRACT_2_CLASSIFY: HIL_CONTRACT_2_FIELD,
HIL_CONTRACT_3_CLASSIFY: HIL_CONTRACT_3_FIELD,
FSM_CONTRACT_WEP_CLASSIFY: FSM_CONTRACT_WEP_FIELD,
FSM_CONTRACT_MSI_CLASSIFY: FSM_CONTRACT_MSI_FIELD,
FSM_CONTRACT_SC_CLASSIFY: FSM_CONTRACT_SC_FIELD,
}
CA_ADD_COMPARE_FIELDS = (IC_OCR_FIELD, BL_OCR_FIELD, BS_FIELD)
......@@ -1511,6 +1542,9 @@ SE_AFC_CON_MAP = {
'还款账号': (2, 2, '还款账户', '账号'),
'户名': (2, 2, '还款账户', '户名'),
'开户行': (2, 2, '还款账户', '开户行'),
'收款账号': (2, 2, '借款人收款账户', '账号'),
'收款户名': (2, 2, '借款人收款账户', '户名'),
'收款开户行': (2, 2, '借款人收款账户', '开户行'),
'借款人签字及时间': (1, 1, '借款人签字及时间', None),
......@@ -1550,9 +1584,12 @@ SE_HIL_CON_1_MAP = {
'融资成本总额': (5, 4, 7, '融资成本总额', None),
'租期': (5, 4, 7, '租期', None),
'还款计划表': (5, 5, 7, '付款计划表', None),
'还款账号': (5, 5, 7, '银行账户-银行账号', None),
'户名': (5, 5, 7, '银行账户-户名', None),
'开户行': (5, 5, 7, '银行账户-开户行', None),
'还款账号': (5, 6, 7, '银行账户-银行账号', None),
'户名': (5, 6, 7, '银行账户-户名', None),
'开户行': (5, 6, 7, '银行账户-开户行', None),
'收款账号': (5, 5, 7, '收款银行账户-银行账号', None),
'收款户名': (5, 5, 7, '收款银行账户-户名', None),
'收款开户行': (5, 5, 7, '收款银行账户-开户行', None),
'ASP项目详情': (5, 4, 7, '车辆附加产品明细表', None),
'承租人法定代表人或授权代表': (1, 1, 7, '承租人-法定代表人或授权代表', None),
'共同承租人法定代表人或授权代表': (1, 1, 7, '共同承租人-法定代表人或授权代表', None),
......@@ -1608,6 +1645,39 @@ SE_HIL_CON_MAP = {
HIL_CONTRACT_3_CLASSIFY: SE_HIL_CON_3_MAP,
}
SE_FSM_WEP_MAP = {
'客户姓名': (1, '客户姓名'),
'证件类型': (1, '证件类型'),
'证件号码': (1, '证件号码'),
'合同价格(小写)': (1, '合同价格(小写)'),
'客户签名': (1, '客户签名'),
'签单日期': (1, '签单日期'),
}
SE_FSM_MSI_MAP = {
'客户姓名': (1, '客户姓名'),
'证件类型': (1, '证件类型'),
'证件号码': (1, '证件号码'),
'合同价格(小写)': (1, '合同价格(小写)'),
'客户签名': (2, '客户签名'),
'签单日期': (2, '签单日期'),
}
SE_FSM_SC_MAP = {
'姓名': (1, '姓名'),
'证件类型': (1, '证件类型'),
'证件号码': (1, '证件号码'),
'总价': (1, '总价'),
'客户签名': (12, '客户签名'),
'签单日期': (12, '签单日期'),
}
SE_FSM_CON_MAP = {
FSM_CONTRACT_WEP_CLASSIFY: SE_FSM_WEP_MAP,
FSM_CONTRACT_MSI_CLASSIFY: SE_FSM_MSI_MAP,
FSM_CONTRACT_SC_CLASSIFY: SE_FSM_SC_MAP,
}
SE_AFC_CON_QRS_FIELD = ['合同编号']
SE_AFC_CON_FIELD = ['合同编号-每页', '所购车辆价格-小写-重要条款', '车架号-重要条款', '贷款本金金额-重要条款', '贷款期限-重要条款',
'车辆贷款本金金额-重要条款', '附加产品融资贷款本金总额-重要条款', '所购车辆价格', '车架号', '经销商',
......@@ -2314,29 +2384,42 @@ APPLICANT_TYPE_MAP = {
APPLICANT_TYPE_ORDER = ['Borrower', 'Co-Borrower', 'Guarantor', 'Mortgager']
FILE_NAME_PREFIX_MAP = {
AFC_PREFIX: [
((CONTRACT_CLASSIFY, 0), '{0}_电子签署-汽车抵押贷款合同'),
((HMH_CLASSIFY, 0), '{0}_电子签署-抵押登记豁免函'),
],
HIL_PREFIX: [
((HIL_CONTRACT_1_CLASSIFY, HIL_CONTRACT_3_CLASSIFY), '{0}_电子签署-售后回租合同'),
((HIL_CONTRACT_2_CLASSIFY, 0), '{0}_电子签署-汽车租赁抵押合同'),
((HMH_CLASSIFY, 0), '{0}_电子签署-抵押登记豁免函'),
]
}
# FILE_NAME_PREFIX_MAP = {
# AFC_PREFIX: [
# ((CONTRACT_CLASSIFY, 0), '{0}_电子签署-汽车抵押贷款合同'),
# ((HMH_CLASSIFY, 0), '{0}_电子签署-抵押登记豁免函'),
# ],
# HIL_PREFIX: [
# ((HIL_CONTRACT_1_CLASSIFY, HIL_CONTRACT_3_CLASSIFY), '{0}_电子签署-售后回租合同'),
# ((HIL_CONTRACT_2_CLASSIFY, 0), '{0}_电子签署-汽车租赁抵押合同'),
# ((HMH_CLASSIFY, 0), '{0}_电子签署-抵押登记豁免函'),
# ]
# }
ECONTRACT_KEYWORDS_MAP = {
AFC_PREFIX: [
('抵押贷款合同', CONTRACT_CLASSIFY),
('送达地址确认书', CONTRACT_QRS_CLASSIFY),
# ('电子签署-抵押登记豁免函', HMH_CLASSIFY, 0),
('抵押登记豁免函', HMH_CLASSIFY),
],
HIL_PREFIX: [
('售后回租合同', HIL_CONTRACT_1_CLASSIFY),
('租赁抵押合同', HIL_CONTRACT_2_CLASSIFY),
('车辆处置协议', HIL_CONTRACT_3_CLASSIFY),
# ('电子签署-抵押登记豁免函', HMH_CLASSIFY, 0),
('抵押登记豁免函', HMH_CLASSIFY),
]
}
FSM_ECONTRACT_KEYWORDS_MAP = {
AFC_PREFIX: [
('延长保修条款与条件', FSM_CONTRACT_WEP_CLASSIFY),
('长悦保养套餐服务合约', FSM_CONTRACT_MSI_CLASSIFY),
('汽车销售合同', FSM_CONTRACT_SC_CLASSIFY),
],
HIL_PREFIX: [
('延长保修条款与条件', FSM_CONTRACT_WEP_CLASSIFY),
('长悦保养套餐服务合同', FSM_CONTRACT_MSI_CLASSIFY),
('汽车销售合同', FSM_CONTRACT_SC_CLASSIFY),
]
}
......@@ -2346,6 +2429,12 @@ HIL_CONTRACT_TYPE_MAP = {
str(HIL_CONTRACT_3_CLASSIFY): 1,
}
FSM_CONTRACT_TYPE_MAP = {
str(FSM_CONTRACT_WEP_CLASSIFY): 0,
str(FSM_CONTRACT_MSI_CLASSIFY): 1,
str(FSM_CONTRACT_SC_CLASSIFY): 2,
}
RESULT_MAP = {
0: None,
1: True,
......@@ -2379,3 +2468,26 @@ MPOS_MAP = {
}
FOLDER_WSC_CLASSIFY = 199
FSM_BEFORE_ACTIVITED_STATUS = {
"APSVD": "Saved",
"APEAE": "E-app Editing",
"APADA": "Awaiting Dealer Action",
"APAPR": "Acceptance Processing",
"APPSB": "Pre-submit Processed",
"APSBT": "Submitted",
"APAPP": "Approved",
"APHOC": "Held Offer-Docs",
"APHOD": "Held Offer-Data",
"APINI": "Initiated",
"APSEP": "Settlement Processing"
}
FSM_ACTIVITED_STATUS = {
"APADF": "Activated-Document Follow up",
"APASC": "Activated-Awaiting Settlement Check",
"APIPN": "Activated-Invoice Passed-Non PT",
"APIPP": "Activated-Invoice Passed-PT Doc Required",
"APARD": "Activated-Review done",
}
\ No newline at end of file
......
......@@ -329,6 +329,11 @@ class AFCOCRResult(models.Model):
hil_contract_2_ocr = models.TextField(null=True, verbose_name="HIL合同2")
hil_contract_3_ocr = models.TextField(null=True, verbose_name="HIL合同3")
qrs_ocr = models.TextField(null=True, verbose_name="AFC合同确认书")
fsm_wep_ocr = models.TextField(null=True, verbose_name="延长保修合同")
fsm_msi_ocr = models.TextField(null=True, verbose_name="长悦保养合同")
fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......@@ -366,6 +371,11 @@ class HILOCRResult(models.Model):
hil_contract_3_ocr = models.TextField(null=True, verbose_name="HIL合同3")
qrs_ocr = models.TextField(null=True, verbose_name="AFC合同确认书")
fsm_wep_ocr = models.TextField(null=True, verbose_name="延长保修合同")
fsm_msi_ocr = models.TextField(null=True, verbose_name="长悦保养合同")
fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......@@ -401,6 +411,11 @@ class AFCSEOCRResult(models.Model):
hil_contract_3_ocr = models.TextField(null=True, verbose_name="HIL合同3")
qrs_ocr = models.TextField(null=True, verbose_name="AFC合同确认书")
fsm_wep_ocr = models.TextField(null=True, verbose_name="延长保修合同")
fsm_msi_ocr = models.TextField(null=True, verbose_name="长悦保养合同")
fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......@@ -436,6 +451,10 @@ class HILSEOCRResult(models.Model):
hil_contract_2_ocr = models.TextField(null=True, verbose_name="HIL合同2")
hil_contract_3_ocr = models.TextField(null=True, verbose_name="HIL合同3")
qrs_ocr = models.TextField(null=True, verbose_name="AFC合同确认书")
fsm_wep_ocr = models.TextField(null=True, verbose_name="延长保修合同")
fsm_msi_ocr = models.TextField(null=True, verbose_name="长悦保养合同")
fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......@@ -1042,3 +1061,41 @@ class AFCCompareReportNew(models.Model):
managed = False
db_table = 'afc_compare_report_new'
situ_db_label = 'afc'
class NscInvoice(models.Model):
id = models.AutoField(primary_key=True, verbose_name="id") # 主键
vin = models.CharField(max_length=64, verbose_name="车架号") # 索引
content = models.TextField(null=True, verbose_name="nsc发票信息")
create_time = models.DateTimeField(verbose_name='创建时间')
class Meta:
managed = False
db_table = 'nsc_invoice'
class AFCCmsStatusInfo(models.Model):
id = models.AutoField(primary_key=True, verbose_name="id") # 主键
application_id = models.CharField(max_length=64, verbose_name="订单id") # 索引
business_type = models.CharField(max_length=64, verbose_name="业务类型")
is_fsm = models.SmallIntegerField(null=False, default=0, verbose_name="是否fsm流程 1:是")
update_time = models.DateTimeField(verbose_name='更新时间')
create_time = models.DateTimeField(verbose_name='创建时间')
class Meta:
managed = False
db_table = 'afc_cms_status_info'
situ_db_label = 'afc'
class HILCmsStatusInfo(models.Model):
id = models.AutoField(primary_key=True, verbose_name="id") # 主键
application_id = models.CharField(max_length=64, verbose_name="订单id") # 索引
business_type = models.CharField(max_length=64, verbose_name="业务类型")
is_fsm = models.SmallIntegerField(null=False, default=0, verbose_name="是否fsm流程 1:是")
update_time = models.DateTimeField(verbose_name='更新时间')
create_time = models.DateTimeField(verbose_name='创建时间')
class Meta:
managed = False
db_table = 'hil_cms_status_info'
......
......@@ -27,6 +27,7 @@ class RequestTeam(NamedEnum):
SETTLEMENT = (1, 'SETTLEMENT')
CONTRACTMANAGEMENT = (2, 'CONTRACTMANAGEMENT')
CONTROLLING = (3, 'CONTROLLING')
INSURANCE = (4, 'INSURANCE')
class RequestTrigger(NamedEnum):
......@@ -36,6 +37,7 @@ class RequestTrigger(NamedEnum):
DOCUPLOAD = (3, 'Document Upload')
SUBMITING = (4, 'Submiting')
UPLOADING = (5, 'Uploading')
OVP = (6, 'OVP')
class FailureReason(NamedEnum):
......
......@@ -34,6 +34,7 @@ class ECM:
'ACCEPTANCE': ('acceptance', conf.ECM_FOLDER_CA, conf.ECM_FOLDER_CA_HIL),
'SETTLEMENT': (self.settlement_type, conf.ECM_FOLDER_SE, conf.ECM_FOLDER_SE_HIL),
'CONTRACTMANAGEMENT': ('contract_management', conf.ECM_FOLDER_CA, conf.ECM_FOLDER_CA_HIL),
'INSURANCE': ('insurance', conf.ECM_FOLDER_SE, conf.ECM_FOLDER_SE_HIL),
}
self.doc_base_map = {
'AFC': 'SF5_CN',
......
......@@ -808,10 +808,12 @@ class BSWorkbook(Workbook):
if field_str is not None:
count_list.append((field_str, count))
def contract_rebuild(self, contract_result_dict):
def contract_rebuild(self, contract_result_dict, is_ca=False):
for classify, contract_result in contract_result_dict.items():
if len(contract_result) == 0:
continue
if is_ca and classify not in consts.FSM_CONTRACT_CLASSIFY_SET:
continue
ws = self.create_sheet(consts.CONTRACT_MAP.get(classify))
for i in range(30):
if str(i) in contract_result:
......@@ -934,6 +936,7 @@ class BSWorkbook(Workbook):
else:
self.bs_rebuild(bs_summary, res_count_tuple, metadata)
self.license_rebuild(license_summary, document_scheme, count_list)
self.contract_rebuild(contract_result, True)
self.move_res_sheet()
self.remove_base_sheet()
return count_list, self.need_follow
......
......@@ -7,6 +7,9 @@ import traceback
import numpy as np
from datetime import datetime, timedelta
from collections import OrderedDict
import requests
from . import app
from settings import conf
from apps.doc.models import (
......@@ -3266,6 +3269,33 @@ def se_compare(application_id, application_entity, ocr_res_id, last_obj, ocr_res
@app.task
def fsm_compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True, is_cms=False):
compare_log.info('{0} [receive fsm task] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] [is_ca={5}] '
'[is_cms={6}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id,
is_ca, is_cms))
# 调用java fsm 比对流程接口(http)
# 调用Java fsm 比对流程接口, fsm 是se流程, ca可以暂时忽略
url = conf.FSM_URL
body = {
'applicationId': application_id,
'businessType': application_entity,
'ocrResId': ocr_res_id,
'isCa': is_ca,
'isCms': is_cms
}
try:
compare_log.info("request java fsm api, url:{0}, body:{1}".format(url, json.dumps(body)))
headers = {
'Content-Type': 'application/json'
}
resp = requests.post(url, headers=headers, json=body)
compare_log.info("response from fsm api, resp:{0}".format(resp.text))
except Exception as e:
compare_log.error("fsm full request to java error, url:{0}, param:{1}, errorMsg:{2}".format(
url, json.dumps(body), traceback.format_exc()))
@app.task
def compare(application_id, application_entity, uniq_seq, ocr_res_id, is_ca=True, is_cms=False):
# POS: application_id, application_entity, uniq_seq, None
# OCR: application_id, business_type(application_entity), None, ocr_res_id
......
......@@ -6,6 +6,7 @@
# @Description :
from .get_char import Finder
from .get_char_fsm import Finder as FSMFinder
import numpy as np
......@@ -23,7 +24,7 @@ def extract_info(ocr_results):
return {'page_1': {'合同编号': contract_no}}
def predict(pdf_info, is_qrs=False):
def predict(pdf_info, is_qrs=False, is_fsm=False):
ocr_results = {}
for pno in pdf_info:
ocr_results[pno] = {}
......@@ -50,7 +51,10 @@ def predict(pdf_info, is_qrs=False):
results = extract_info(ocr_results)
else:
# 输入是整个 PDF 中的信息
f = Finder(pdf_info, ocr_results=ocr_results)
if is_fsm:
f = FSMFinder(pdf_info, ocr_results=ocr_results)
else:
f = Finder(pdf_info, ocr_results=ocr_results)
results = f.get_info()
return results
......
......@@ -6,9 +6,10 @@
# @Description :
from .get_char import Finder
from .get_char_fsm import Finder as FSMFinder
def predict(pdf_info, file_cls):
def predict(pdf_info, file_cls, is_fsm=False):
"""Summary
Args:
......@@ -58,7 +59,11 @@ def predict(pdf_info, file_cls):
pdf_info = dict()
for pno, page_info in enumerate(pdf_info_1):
pdf_info[str(pno)] = page_info
f = Finder(pdf_info)
if is_fsm:
f = FSMFinder(pdf_info)
else:
f = Finder(pdf_info)
if file_cls == 0:
results = f.get_info()
if file_cls == 1:
......
WEP_FIELD = {
"0": {
'keys': {
'客户姓名': [('客户姓名', (r'^姓名.?$', r'^企业名称.?$'), 'top1', {})],
'证件类型': [('证件类型', (r'^证件类型.?$', ), 'top1', {})],
'证件号码': [('证件号码', (r'^证件号码.?$', r'^统一社会信用代码.?$'), 'top1', {})],
'合同价格(小写)': [('人民币', (r'^人民币¥.?$', ), 'top1', {})],
'客户签名': [('客户签名/盖章', (r'^客户签名/盖章.*$', ), 'top1', {})],
'签单日期': [('签单日期', (r'^签单日期.*签单日期.?$', ), 'top1', {})],
},
'value': {
'客户姓名': ('text', 'right', {'offset_tuple': (-1.1, 1, 0.3, 0)}, ''),
'证件类型': ('text', 'right', {'offset_tuple': (-1, 1, 0, 0)}, ''),
'证件号码': ('text', 'right', {'offset_tuple': (-1, 2, 0.3, 0)}, ''),
'合同价格(小写)': ('text', 'right', {'offset_tuple': (-1, 1, 0.3, 0)}, ''),
'客户签名': ('img', 'under', {'offset_tuple': (0, 0, 0, 4), 'rigorous': True}, '无'),
'签单日期': ('img', 'right', {'offset_tuple': (0, 0, 1.1, 0), 'rigorous': True}, '无'),
},
}
}
MSI_FIELD = {
"0": {
'keys': {
'客户姓名': [('客户姓名', (r'^客户姓名.?$', r'^企业名称.?$'), 'top1', {})],
'证件类型': [('证件类型', (r'^证件类型.?$', ), 'top1', {})],
'证件号码': [('证件号码', (r'^证件号码.?$', r'^统一社会信用代码.?$'), 'top1', {})],
'合同价格(小写)': [('人民币', (r'^人民币¥.?$', ), 'top1', {})],
},
'value': {
'客户姓名': ('text', 'right', {'offset_tuple': (-1.2, 1, 0.3, 0)}, ''),
'证件类型': ('text', 'right', {'offset_tuple': (-1, 1, 0, 0)}, ''),
'证件号码': ('text', 'right', {'offset_tuple': (-1, 2, 0.3, 0)}, ''),
'合同价格(小写)': ('text', 'right', {'offset_tuple': (-1, 1, 0.3, 0)}, ''),
},
},
"1": {
'keys': {
'客户签名': [('客户签名/盖章', (r'^客户签名/盖章.*$', ), 'top1', {})],
'签单日期': [('签单日期', (r'^签单日期.*签单日期.?$', ), 'top1', {})],
},
'value': {
'客户签名': ('img', 'under', {'offset_tuple': (0, 0, 0, 4), 'rigorous': True}, '无'),
'签单日期': ('img', 'right', {'offset_tuple': (0, 0, 1.1, 0), 'rigorous': True}, '无'),
},
}
}
SC_FIELD = {
"0": {
'keys': {
'姓名': [('姓名', (r'^姓名.?$', r'^企业名称.?$'), 'top1', {})],
'证件类型': [('证件类型', (r'^证件类型.?$', ), 'top1', {})],
'证件号码': [('证件号码', (r'^证件号码.?$', r'^统一社会信用代码.?$'), 'top1', {})],
'总价': [('总价', (r'^总价.?$', ), 'top1', {})],
},
'value': {
'姓名': ('text', 'right', {'offset_tuple': (-2, 8, 0.5, 0)}, ''),
'证件类型': ('text', 'right', {'offset_tuple': (-2, 6, 0.5, 0)}, ''),
'证件号码': ('text', 'right', {'offset_tuple': (-2, 6, 0.5, 0)}, ''),
'总价': ('text', 'right', {'offset_tuple': (-2, 12, 0.5, 0)}, ''),
},
},
"-1": {
'keys': {
'客户签名': [('客户签名/盖章', (r'^客户签名/盖章.*$', r'^客户签名/盖章.*$'), 'top1', {})],
'签单日期': [('签单日期', (r'^签单日期.*签单日期.?$', ), 'top1', {})],
},
'value': {
'客户签名': ('img', 'under', {'offset_tuple': (1.5, 1, 0, 4), 'rigorous': True}, '无'),
'签单日期': ('img', 'right', {'offset_tuple': (0, 0, 1.1, 0), 'rigorous': True}, '无'),
},
}
}
from .retriever import Retriever
from .const import WEP_FIELD, MSI_FIELD, SC_FIELD
from .tools import pdf_info_rebuild
retriever_list = [Retriever(WEP_FIELD), Retriever(MSI_FIELD), Retriever(SC_FIELD)]
def predict(pdf_info, file_type=0):
retriever = retriever_list[file_type]
pdf_text_list, pdf_img_list = pdf_info_rebuild(pdf_info)
return retriever.get_target_fields(pdf_text_list, pdf_img_list)
from .retriever import HMHRetriever
from .tools import pdf_info_rebuild
hmh_retriever = HMHRetriever()
def predict(pdf_info):
pdf_text_list, _ = pdf_info_rebuild(pdf_info, fix_bbox=False)
return hmh_retriever.get_target_fields(pdf_text_list)
def pdf_info_rebuild(pdf_info, fix_bbox=True):
pdf_text_info = dict()
pdf_img_info = dict()
for pno_str, page_info in pdf_info.items():
text_set = set()
for block in page_info['blocks']:
if block['type'] == 0:
# text有重复的现象
text_set.clear()
for line in block['lines']:
for span in line['spans']:
bbox, text = span['bbox'], span['text'].strip()
if len(text) != 0 and text not in text_set:
text_set.add(text)
# bbox的高,不准
if fix_bbox and bbox[-1] - bbox[1] < span['size']:
bbox[-1] = bbox[-1] + span['size']
pdf_text_info.setdefault(pno_str, list()).append([bbox, text])
elif block['type'] == 1:
pdf_img_info.setdefault(pno_str, list()).append((block['bbox'], '有'))
return pdf_text_info, pdf_img_info
\ No newline at end of file
import pyodbc
hil_sql = """
ALTER TABLE hil_ocr_result ADD fsm_wep_ocr nvarchar(max);
ALTER TABLE hil_ocr_result ADD fsm_msi_ocr nvarchar(max);
ALTER TABLE hil_ocr_result ADD fsm_sc_ocr nvarchar(max);
ALTER TABLE hil_se_ocr_result ADD fsm_wep_ocr nvarchar(max);
ALTER TABLE hil_se_ocr_result ADD fsm_msi_ocr nvarchar(max);
ALTER TABLE hil_se_ocr_result ADD fsm_sc_ocr nvarchar(max);
"""
afc_sql = """
ALTER TABLE afc_ocr_result ADD fsm_wep_ocr nvarchar(max);
ALTER TABLE afc_ocr_result ADD fsm_msi_ocr nvarchar(max);
ALTER TABLE afc_ocr_result ADD fsm_sc_ocr nvarchar(max);
ALTER TABLE afc_se_ocr_result ADD fsm_wep_ocr nvarchar(max);
ALTER TABLE afc_se_ocr_result ADD fsm_msi_ocr nvarchar(max);
ALTER TABLE afc_se_ocr_result ADD fsm_sc_ocr nvarchar(max);
"""
hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
hil_cursor = hil_cnxn.cursor()
hil_cursor.execute(hil_sql)
hil_cursor.close()
hil_cnxn.close()
afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
afc_cursor = afc_cnxn.cursor()
afc_cursor.execute(afc_sql)
afc_cursor.close()
afc_cnxn.close()
......@@ -8,13 +8,16 @@ from common.tools.comparison import cp
from common.mixins import LoggerMixin
from rest_framework.permissions import IsAuthenticated
from apps.account.authentication import OAuth2AuthenticationWithUser
from apps.doc.models import NscInvoice
import json
from datetime import datetime
params = {
'invoiceCode': fields.Str(required=True, validate=validate.Length(max=128)),
'invoiceNumber': fields.Str(required=True, validate=validate.Length(max=64)),
'issueDate': CustomDate(required=True),
'buyerName': fields.Str(required=True, validate=validate.Length(max=64)),
"buyerId": fields.Int(required=True),
"buyerId": fields.Str(required=True, validate=validate.Length(max=64)),
'vin': fields.Str(required=True, validate=validate.Length(max=128)),
'dealer': fields.Str(required=False, validate=validate.Length(max=64)),
'priceWithVat': CustomDecimal(required=True),
......@@ -29,7 +32,7 @@ input_args = {
}
# poss 接口接收NSC 发票信息
# pos 接口接收NSC 发票信息
class NSCInvoiceView(GenericView):
permission_classes = [IsAuthenticated]
authentication_classes = [OAuth2AuthenticationWithUser]
......@@ -50,6 +53,7 @@ class NSCInvoiceView(GenericView):
vat = content.get('vat', 0.0)
vat_rate = content.get('vatRate', 0.0)
NscInvoice.objects.create(vin=vin, content=json.dumps(content), create_time=datetime.now())
return response.ok()
......@@ -90,11 +94,17 @@ class DeMortgageView(GenericView):
'applicationName': application_name,
'deMortgageDate': de_mortgage_date
}
de_mortgage_info = {}
de_mortgage_info = {'customer_name':'','applicationName':'','deMortgageDate':''}
# 绿本必须分开ocr
for file_obj in files:
info = PosHandler.de_mortgage_ocr_process1(file_obj)
de_mortgage_info.update(info)
if info.get('customerName') is not '':
de_mortgage_info['customerName'] = info.get('customerName')
if info.get('applicationName') is not '':
de_mortgage_info['applicationName'] = info.get('applicationName')
if info.get('deMortgageDate') is not '':
de_mortgage_info['deMortgageDate'] = info.get('deMortgageDate')
#de_mortgage_info.update(info)
request_pass = True
fields_result = []
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!