Merge remote-tracking branch 'origin/wsc' into wsc02

# Conflicts:
#	Modules/Company/CompanyImpl.py
#	Modules/Company/CompanyRoutes.py
This commit is contained in:
王思川 2022-06-13 09:49:07 +08:00
commit ec15628364
4 changed files with 403 additions and 15 deletions

View File

@ -8,6 +8,7 @@ import requests
import xlrd
import cpca
from DBHelper.MongoHelperInstance import DB_GUA, DB_TYC
from Modules.Company.CompanyObject import BasicBusinessInfo, FinancialData, GuaranteeInfo, BankCredit
from Modules.Company.CompanyObject import BasicBusinessInfo, FinancialData, CustomerInfo, RegionalDistribution, \
IndustryDistribution, GuaranteedBalanceDistribution, GuaranteeInfo, BankCredit
from Modules.Company.CompanyUtils import CompanyUtils, ExcelSheetParser, ExcelParserUtil
@ -189,7 +190,7 @@ class BasicBusinessInfoImpl(object):
company_info['企业类型'] = basic_info['基本信息']['companyOrgType']
company_info['统一社会信用代码'] = basic_info['基本信息']['creditCode']
company_info['组织代码'] = basic_info['基本信息']['orgNumber']
tuptime_newest = time.localtime(basic_info['基本信息']['estiblishTime']/1000)
tuptime_newest = time.localtime(basic_info['基本信息']['estiblishTime'] / 1000)
company_info['成立日期'] = time.strftime("%Y-%m-%d", tuptime_newest)
company_info['经营范围'] = basic_info['基本信息']['businessScope']
company_info['所在省份'] = [v for k, v in p_map.items() if k == basic_info['基本信息']['base']][0]
@ -227,6 +228,7 @@ class BasicBusinessInfoImpl(object):
def financial_data():
"""财务数据"""
financial = FinancialData()
period = [ExcelParserUtil.trans_date_fmt_2(item['报告期'])[:4] for item in appendix_sheet]
def balance_script(data):
"""资产负债表"""
@ -269,6 +271,214 @@ class BasicBusinessInfoImpl(object):
def appendix_script(data):
"""补充数据表"""
year = ExcelParserUtil.trans_date_fmt_2(data['报告期'])[:4]
def parameter_01():
"""当期代偿金额"""
if compensation_info:
amount = 0
for item in compensation_info:
if ExcelParserUtil.trans_date_fmt_2(item['代偿日期'])[:4] == year:
amount += item['代偿金额(万元)']
else:
amount = None
else:
amount = None
return amount
def parameter_02():
"""当期代偿回收金额"""
if compensation_info:
amount = 0
for item in compensation_info:
if ExcelParserUtil.trans_date_fmt_2(item['代偿日期'])[:4] == year:
amount += item['代偿回收金额(万元)']
else:
amount = None
else:
amount = None
return amount
def parameter_03():
"""当期解除担保责任余额"""
if guarantee_info:
amount = 0
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year:
amount += item['解除金额(万元)']
else:
amount = None
else:
amount = None
return amount
def parameter_04():
"""近三年累计代偿金额"""
if year == period[0]:
period_ = period[:3]
elif year == period[1]:
period_ = period[1:4]
else:
period_ = None
if period_ and compensation_info:
amount = 0
for _item in compensation_info:
if ExcelParserUtil.trans_date_fmt_2(_item['代偿日期'])[:4] in period_:
amount += _item['代偿金额(万元)']
else:
amount = None
return amount
def parameter_05():
"""近三年累计代偿回收金额"""
if year == period[0]:
period_ = period[:3]
elif year == period[1]:
period_ = period[1:4]
else:
period_ = None
if period_ and compensation_info:
amount = 0
for _item in compensation_info:
if ExcelParserUtil.trans_date_fmt_2(_item['代偿日期'])[:4] in period_:
amount += _item['代偿回收金额(万元)']
else:
amount = None
return amount
def parameter_06():
"""近三年累计解除担保责任金额"""
if year == period[0]:
period_ = period[:3]
elif year == period[1]:
period_ = period[1:4]
else:
period_ = None
if period_ and guarantee_info:
amount = 0
for _item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(_item['担保开始日期'])[:4] in period_:
amount += _item['解除金额(万元)']
else:
amount = None
return amount
def parameter_07():
"""最大单一行业融资担保责任余额"""
if guarantee_info:
industry = {ind['行业']: 0 for ind in guarantee_info}
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year:
industry[item['行业']] += item['责任担保余额(万元)']
amount = max(industry.values())
else:
amount = None
return amount
def parameter_08():
"""当期新增融资担保责任余额"""
if year == period[0]:
period_ = period[:2]
elif year == period[1]:
period_ = period[1:3]
elif year == period[2]:
period_ = period[2:4]
else:
period_ = None
if period_ and guarantee_info:
this_year = 0
last_year = 0
for _item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(_item['担保开始日期'])[:4] == period_[0]:
this_year += _item['责任担保余额(万元)']
elif ExcelParserUtil.trans_date_fmt_2(_item['担保开始日期'])[:4] == period_[1]:
last_year += _item['责任担保余额(万元)']
amount = this_year - last_year
else:
amount = None
return amount
def parameter_09():
"""融资担保责任余额"""
if guarantee_info:
amount = 0
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year and item['担保类型'] == '融资担保':
amount += item['责任担保余额(万元)']
else:
amount = None
else:
amount = None
return amount
def parameter_10():
"""前五大被担保企业融资担保责任余额"""
if guarantee_info:
amount_list = []
amount = 0
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year and item['担保类型'] == '融资担保':
amount_list.append(item['责任担保余额(万元)'])
else:
amount = None
if amount_list:
length = len(amount_list)
five_amount = amount_list.sort()[:length]
amount = sum(five_amount)
else:
amount = 0
return amount
def parameter_11():
"""最大被担保企业融资担保责任余额"""
if guarantee_info:
amount_list = []
amount = 0
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year and item['担保类型'] == '融资担保':
amount_list.append(item['责任担保余额(万元)'])
else:
amount = None
if amount_list:
amount = max(amount_list)
else:
amount = 0
return amount
def parameter_12():
"""担保在保余额"""
if guarantee_info:
amount = 0
for item in guarantee_info:
if ExcelParserUtil.trans_date_fmt_2(item['担保开始日期'])[:4] == year:
amount += item['担保余额(万元)']
else:
amount = None
else:
amount = None
return amount
data['当期代偿金额'] = parameter_01()
data['当期代偿回收金额'] = parameter_02()
data['当期解除担保责任余额'] = parameter_03()
data['近三年累计代偿金额'] = parameter_04()
data['近三年累计代偿回收金额'] = parameter_05()
data['近三年累计解除担保责任金额'] = parameter_06()
data['最大单一行业融资担保责任余额'] = parameter_07()
data['当期新增融资担保责任余额'] = parameter_08()
data['融资担保责任余额'] = parameter_09()
data['前五大被担保企业融资担保责任余额'] = parameter_10()
data['最大被担保企业融资担保责任余额'] = parameter_11()
data['担保在保余额'] = parameter_12()
data.pop('报告期')
fa = SpecObject.set_specify_instance(
instance=financial.AppendixSheet,
@ -333,8 +543,11 @@ class BasicBusinessInfoImpl(object):
bank_credit_info_list.append(bc)
def risk_info():
for item in balance_sheet:
data_job = RiskInfoDataJob()
data_job.company_name = get_attr(company_info, ["企业名称"])
data_job.cid = new_cid
data_job.report_date = ExcelParserUtil.trans_date_fmt_2(item['报告期'])
data_job.drag()
def _main_():
@ -342,6 +555,7 @@ class BasicBusinessInfoImpl(object):
guarantee_data()
financial_data()
bank_data()
risk_info()
_main_()

View File

@ -421,26 +421,50 @@ class FinancialData(SpecObject):
class AppendixSheet(SpecObject):
"""补充数据表"""
current_compensation_amount = ValidateAttr(field="current_compensation_amount", type=[float, int], default=None)
current_compensation_recycle_amount = ValidateAttr(field="current_compensation_recycle_amount", type=[float, int], default=None)
guarantee_liability = ValidateAttr(field="guarantee_liability", type=[float, int], default=None)
accumulated_compensation_amount = ValidateAttr(field="accumulated_compensation_amount", type=[float, int], default=None)
cumulative_compensation_recovery_amount = ValidateAttr(field="cumulative_compensation_recovery_amount", type=[float, int], default=None)
cumulative_amount = ValidateAttr(field="cumulative_amount", type=[float, int], default=None)
largest_financing = ValidateAttr(field="largest_financing", type=[float, int], default=None)
financing_guarantee_liabilities = ValidateAttr(field="financing_guarantee_liabilities", type=[float, int], default=None)
financial_guarantee_responsibility_balance = ValidateAttr(field="financial_guarantee_responsibility_balance", type=[float, int], default=None)
risk_weighted_assets = ValidateAttr(field="risk_weighted_assets", type=[float, int], default=None)
guaranteed_risk_reserve_balance = ValidateAttr(field="guaranteed_risk_reserve_balance", type=[float, int], default=None)
top_five_financing_guarantee_liabilities = ValidateAttr(field="top_five_financing_guarantee_liabilities", type=[float, int], default=None)
maximum_enterprise_financing_guarantee = ValidateAttr(field="maximum_enterprise_financing_guarantee", type=[float, int], default=None)
guarantee_compensation_reserve = ValidateAttr(field="guarantee_compensation_reserve", type=[float, int], default=None)
unexpired_liability_reserve = ValidateAttr(field="unexpired_liability_reserve", type=[float, int], default=None)
counter_guarantee_amount = ValidateAttr(field="counter_guarantee_amount", type=[float, int], default=None)
deposit_margin = ValidateAttr(field="deposit_margin", type=[float, int], default=None)
save_margin = ValidateAttr(field="save_margin", type=[float, int], default=None)
guarantee_business_income = ValidateAttr(field="guarantee_business_income", type=[float, int], default=None)
guaranteed_balance = ValidateAttr(field="guaranteed_balance", type=[float, int], default=None)
one_assets = ValidateAttr(field="one_assets", type=[float, int], default=None)
two_assets = ValidateAttr(field="two_assets", type=[float, int], default=None)
three_assets = ValidateAttr(field="three_assets", type=[float, int], default=None)
fields_map = {
"current_compensation_amount": "当期代偿金额",
"current_compensation_recycle_amount": "当期代偿回收金额",
"guarantee_liability": "当期解除担保责任余额",
"accumulated_compensation_amount": "近三年累计代偿金额",
"cumulative_compensation_recovery_amount": "近三年累计代偿回收金额",
"cumulative_amount": "近三年累计解除担保责任金额",
"largest_financing": "最大单一行业融资担保责任余额",
"financing_guarantee_liabilities": "当期新增融资担保责任余额",
"financial_guarantee_responsibility_balance": "融资担保责任余额",
"risk_weighted_assets": "风险加权资产",
"guaranteed_risk_reserve_balance": "担保风险准备金余额",
"top_five_financing_guarantee_liabilities": "前五大被担保企业融资担保责任余额",
"maximum_enterprise_financing_guarantee": "最大被担保企业融资担保责任余额",
"guarantee_compensation_reserve": "担保赔偿准备金",
"unexpired_liability_reserve": "未到期责任准备金",
"counter_guarantee_amount": "反担保金额",
"deposit_margin": "存入保证金",
"save_margin": "存出保证金",
"guaranteed_balance": "担保在保余额",
"guarantee_business_income": "担保业务收入",
"one_assets": "I类资产",
"two_assets": "II类资产",

View File

@ -1,17 +1,167 @@
import json
import time
from datetime import datetime
import requests
from DBHelper.MongoHelperInstance import DB_TYC, DB_GUA
from Modules.Company.CompanyObject import RiskInfo
from Modules.ETL.WideETL import DataProcess, DataJob
from Utils.ErrorUtil import JustThrowError
class DragRiskInfoFromTYC(DataProcess):
def extract(self):
pass
url = "http://api.fecribd.com/api/tyc/basic_info"
headers = {'token': self.target.token}
data = {"企业名称": self.target.company_name}
res = requests.post(url=url, headers=headers, data=json.dumps(data))
if res.status_code == 200:
source_dict = dict()
def dishonest_quantity():
dishonest = DB_TYC.find_single_data(
"司法风险",
"失信人",
{"企业名称": self.target.company_name},
['失信人']
)
total = 0
if dishonest['失信人']:
for item in dishonest['失信人']:
begin_date = datetime.strptime(item['publishdate'], '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
if 0 <= minus_date <= 3:
total += 1
return total
def executed_quantity():
executed = DB_TYC.find_single_data(
"司法风险",
"被执行人",
{"企业名称": self.target.company_name},
['被执行人']
)
total = 0
if executed['被执行人']:
for item in executed['被执行人']:
begin_date = datetime.strptime(item['caseCreateTime'], '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
if 0 <= minus_date <= 3:
total += 1
return total
def final_case_quantity():
final_case = DB_TYC.find_single_data(
"司法风险",
"终本案件",
{"企业名称": self.target.company_name},
['终本案件']
)
total = 0
if final_case['终本案件']:
for item in final_case['终本案件']['result']:
tuptime_newest = time.localtime(item['caseFinalTime']/1000)
begin_date = datetime.strptime(time.strftime("%Y-%m-%d", tuptime_newest), '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
if 0 <= minus_date <= 3:
total += 1
return total
def consumption_restriction_quantity():
executed = DB_TYC.find_single_data(
"司法风险",
"限制消费令",
{"企业名称": self.target.company_name},
['限制消费令']
)
total = 0
if executed['限制消费令']:
for item in executed['限制消费令']['result']:
tuptime_newest = time.localtime(item['publishDate'] / 1000)
begin_date = datetime.strptime(time.strftime("%Y-%m-%d", tuptime_newest), '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
if 0 <= minus_date <= 3:
total += 1
return total
def penalties_quantity():
penalties = DB_TYC.find_single_data(
"经营风险",
"行政处罚",
{"企业名称": self.target.company_name},
['行政处罚']
)
total = 0
if penalties['行政处罚']:
for item in penalties['行政处罚']['result']:
begin_date = datetime.strptime(item['decisionDate'], '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
if 0 <= minus_date <= 3:
total += 1
return total
def legal_action_quantity():
legal_action = DB_TYC.find_single_data(
"司法风险",
"诉讼",
{"企业名称": self.target.company_name},
['诉讼']
)
total = 0
if legal_action:
for item in legal_action['诉讼']:
try:
begin_date = datetime.strptime(item['submittime'], '%Y-%m-%d').year
curr_date = datetime.strptime(self.target.report_date, '%Y-%m-%d').year
minus_date = curr_date - begin_date
condition = self.target.company_name in item['defendants']
if 0 <= minus_date <= 3 and condition:
total += 1
except ValueError:
continue
return total
source_dict['失信被执行人'] = dishonest_quantity()
source_dict['被执行人'] = executed_quantity()
source_dict['终本案件'] = final_case_quantity()
source_dict['限制消费令'] = consumption_restriction_quantity()
source_dict['行政处罚'] = penalties_quantity()
source_dict['法律诉讼(被告)'] = legal_action_quantity()
self.source = source_dict
else:
raise JustThrowError(error_info="拉取风险信息失败")
def transform(self):
pass
source = self.source
target = self.target
target.dishonest_executor = source['失信被执行人']
target.person_to_be_executed = source['被执行人']
target.final_case = source['终本案件']
target.consumption_restriction_order = source['限制消费令']
target.administrative_penalties = source['行政处罚']
target.legal_action = source['法律诉讼(被告)']
def load(self):
pass
target = self.target
data = target.fields_toggle()
DB_GUA.upsert_single_data(
'企业数据',
'风险信息',
{"企业名称": data['企业名称'], "报告期": data['报告期']},
data
)
class RiskInfoDataJob(RiskInfo):
@ -21,10 +171,10 @@ class RiskInfoDataJob(RiskInfo):
data_job = DataJob(
instance=self,
title="",
job_type="",
status="",
detail=""
title="拉取企业风险信息",
job_type="处理准备",
status="正常",
detail="企业名称->{};".format(self.company_name)
)
data_job.processes = [

View File

@ -7,12 +7,9 @@ class SpecObject(object):
def fields_toggle(self, **kwargs):
"""字典键值切换"""
_dict_ = dict()
default_types = ['str', 'int', 'float', 'dict', 'bool', 'tuple']
if 'fields' in kwargs:
self.__dict__ = {key: self.__dict__[key] for key in kwargs['fields']}
_dict_ = dict()
for key in self.__dict__.keys():
if key in self.fields_map.keys():
@ -37,6 +34,9 @@ class SpecObject(object):
else:
_dict_[self.fields_map[key]] = self.__dict__[key].fields_toggle()
if 'fields' in kwargs:
_dict_ = {key: _dict_[key] for key in kwargs['fields']}
return _dict_
def set_instance(self, **kwargs):