guarantee-admin-api-v0.2/Modules/Company/CompanyImpl.py

341 lines
16 KiB
Python

import json
import requests
import xlrd
import cpca
from DBHelper.MongoHelperInstance import DB_GUA, DB_TYC
from Modules.Company.CompanyObject import BasicBusinessInfo, FinancialData, CustomerInfo, RegionalDistribution, \
IndustryDistribution, GuaranteedBalanceDistribution, GuaranteeInfo
from Modules.Company.CompanyUtils import CompanyUtils, ExcelSheetParser
from Utils.ObjUtil import SpecObject
class BasicBusinessInfoImpl(object):
@staticmethod
def parse_excel_and_create_company(file):
"""解析excel模板数据 创建公司信息"""
new_cid = CompanyUtils.make_new_cid()
work_book = xlrd.open_workbook(file_contents=file.read())
basic_business_info = BasicBusinessInfo()
financial_data_list = list()
customer_info_list = list()
guarantee_info_list = list()
records_dict = dict()
region_distribution_list = list()
industry_distribution_list = list()
guarantee_distribution_list = list()
for sheet in work_book.sheets():
if sheet.name == '企业信息':
def get_basic(name):
# 获取tyc工商信息
def basic_info_api():
"""工商信息接口"""
url = "http://api.fecribd.com/api/tyc/basic_info"
headers = {'token': 'uzdq51N4!I0%HY4sCaQ!aeCSIDIVIdAM'}
parameter = {"企业名称": name}
res = requests.post(url=url, headers=headers, data=json.dumps(parameter))
return res
record = DB_TYC.find_single_data(
'公司背景',
'基本信息',
{"企业名称": name},
['企业名称', '基本信息']
)
if not record:
res = basic_info_api()
if res.status_code == 200:
record = DB_TYC.find_single_data(
'公司背景',
'基本信息',
{"企业名称": name},
['企业名称', '基本信息']
)
return record
data = ExcelSheetParser(sheet=sheet).parse_sheet1()
basic_data = get_basic(data['企业名称'])
basic_business_info.cid = new_cid
basic_business_info.set_instance(data=data)
elif sheet.name == '高管股东信息':
executives, shareholders = ExcelSheetParser(sheet=sheet).parse_sheet2()
basic_business_info.shareholder_information = list()
basic_business_info.executive_information = list()
for item in executives:
executive = SpecObject.set_specify_instance(
instance=BasicBusinessInfo.ExecutiveInformation,
data=item
)
basic_business_info.executive_information.append(executive)
for item in shareholders:
shareholder = SpecObject.set_specify_instance(
instance=BasicBusinessInfo.ShareholderInformation,
data=item
)
basic_business_info.shareholder_information.append(shareholder)
elif sheet.name == '客户信息':
# 企业信息
data = ExcelSheetParser(sheet=work_book.sheet_by_name('企业信息')).parse_sheet1()
# 客户信息
client_info = ExcelSheetParser(sheet=work_book.sheet_by_name('客户信息')).parse_sheet4()
# 区域分布
area_info = ExcelSheetParser(sheet=work_book.sheet_by_name('区域分布')).parse_sheet5()
# 行业分布
industry_info = ExcelSheetParser(sheet=work_book.sheet_by_name('行业分布')).parse_sheet5()
# 担保金额分布
guarantee_amount = ExcelSheetParser(sheet=work_book.sheet_by_name('担保金额分布')).parse_sheet6()
def tyc_basic_info():
"""调用天眼查api保存工商信息"""
def tyc_api(name):
"""天眼查接口调用"""
url = "http://api.fecribd.com/api/tyc/basic_info"
headers = {'token': 'uzdq51N4!I0%HY4sCaQ!aeCSIDIVIdAM'}
parameter = {"企业名称": name}
res = requests.post(url=url, headers=headers, data=json.dumps(parameter))
return res
for client in client_info:
company = client['客户名称']
# 查询数据是否存在
record_ = DB_TYC.find_single_data(
'公司背景',
'基本信息',
{"企业名称": company},
['企业名称', '基本信息']
)
if not record_:
# 不存在则调用接口抓取
result = tyc_api(company)
if result.status_code == 200:
record = DB_TYC.find_single_data(
'公司背景',
'基本信息',
{"企业名称": company},
['企业名称', '基本信息']
)
records_dict[record['企业名称']] = record['基本信息']
else:
records_dict[record_['企业名称']] = record_['基本信息']
def history_data():
"""历史数据"""
# 客户信息
for client in client_info:
customer_info = CustomerInfo()
customer_info.cid = new_cid
customer_info.company_name = basic_business_info.company_name
customer_info.set_instance(data=client)
customer_info_list.append(customer_info)
# 区域分布
for area in area_info:
region_distribution = RegionalDistribution()
region_distribution.cid = new_cid
region_distribution.company_name = basic_business_info.company_name
region_distribution.set_instance(data=area)
region_distribution_list.append(region_distribution)
# 行业分布
for industry in industry_info:
industry_distribution = IndustryDistribution()
industry_distribution.cid = new_cid
industry_distribution.company_name = basic_business_info.company_name
industry_distribution.set_instance(data=industry)
industry_distribution_list.append(industry_distribution)
# 担保金额分布
for amount in guarantee_amount:
guarantee_distribution = GuaranteedBalanceDistribution()
guarantee_distribution.cid = new_cid
guarantee_distribution.company_name = basic_business_info.company_name
guarantee_distribution.report_period = amount["报告期"]
guarantee_distribution.guarantee_account = SpecObject.set_specify_instance(
instance=GuaranteedBalanceDistribution.GuaranteeBalance,
data=amount["担保户数"]
)
guarantee_distribution.guarantee_number = SpecObject.set_specify_instance(
instance=GuaranteedBalanceDistribution.GuaranteeBalance,
data=amount["担保笔数"]
)
guarantee_distribution.guarantee_liability_balance = SpecObject.set_specify_instance(
instance=GuaranteedBalanceDistribution.GuaranteeBalance,
data=amount["担保责任余额"]
)
guarantee_distribution_list.append(guarantee_distribution)
def guarantee_data():
"""担保信息"""
for info in client_info:
guarantee_info = GuaranteeInfo()
guarantee_info.guarantee_id = CompanyUtils.make_new_cid()
guarantee_info.warrantee = info['客户名称']
guarantee_info.guarantee_type = '融资担保'
guarantee_info.project_name = records_dict[info['客户名称']]['alias']+(info['担保起始日'].replace('-', ''))
guarantee_info.guarantee_method = '银行借款担保'
guarantee_info.guarantee_balance = info['在保余额']
guarantee_info.release_amount = 0
guarantee_info.liability_guarantee_balance = info['融资担保责任余额']
guarantee_info.guarantee_start_date = info['担保起始日']
guarantee_info.guarantee_end_date = info['担保截止日']
if '公司' in info['客户名称']:
loc_list = list()
loc_list.append(info['客户名称'])
df = cpca.transform(loc_list)
guarantee_info.province = df.loc[0, '']
city = df.loc[0, ''] if df.loc[0, ''] is not None else records_dict[info['客户名称']]['city']
guarantee_info.city = city
else:
guarantee_info.province = data['所在省份']
guarantee_info.city = data['所在城市']
guarantee_info.industry = records_dict[info['客户名称']]['industry']
guarantee_info.remark = None
guarantee_info_list.append(guarantee_info)
def __main__():
tyc_basic_info()
history_data()
guarantee_data()
__main__()
elif sheet.name == '资产负债表':
# 数据源
balance = ExcelSheetParser(sheet=work_book.sheet_by_name('资产负债表')).parse_sheet7()
income = ExcelSheetParser(sheet=work_book.sheet_by_name('利润表')).parse_sheet8()
appendix = ExcelSheetParser(sheet=work_book.sheet_by_name('补充数据表')).parse_sheet3()
length = len(balance)
def balance_script(sheet_data):
"""资产负债表"""
# 各类对象key
bs_obj = financial_data.BalanceSheet()
current_assets_dict = [_item for _item in bs_obj.CurrentAssets.fields_map.values()]
non_current_assets_dict = [_item for _item in bs_obj.NonCurrentAssets.fields_map.values()]
current_liabilities_dict = [_item for _item in bs_obj.CurrentLiabilities.fields_map.values()]
non_current_liabilities_dict = [_item for _item in bs_obj.NonCurrentLiabilities.fields_map.values()]
owner_equity_dict = [_item for _item in bs_obj.OwnerEquity.fields_map.values()]
# 资产负债表分组
current_assets_dict_ = dict()
non_current_assets_dict_ = dict()
current_liabilities_dict_ = dict()
non_current_liabilities_dict_ = dict()
owner_equity_dict_ = dict()
for key, value in sheet_data.items():
if key in current_assets_dict:
current_assets_dict_[key] = value
elif key in non_current_assets_dict:
non_current_assets_dict_[key] = value
elif key in current_liabilities_dict:
current_liabilities_dict_[key] = value
elif key in non_current_liabilities_dict:
non_current_liabilities_dict_[key] = value
elif key in owner_equity_dict:
owner_equity_dict_[key] = value
bs_obj.current_assets = SpecObject.set_specify_instance(
instance=bs_obj.CurrentAssets,
data=current_assets_dict_
)
bs_obj.non_current_assets = SpecObject.set_specify_instance(
instance=bs_obj.NonCurrentAssets,
data=non_current_assets_dict_
)
bs_obj.total_assets = sheet_data['资产总计']
bs_obj.current_liabilities = SpecObject.set_specify_instance(
instance=bs_obj.CurrentLiabilities,
data=current_liabilities_dict_
)
bs_obj.non_current_liabilities = SpecObject.set_specify_instance(
instance=bs_obj.NonCurrentLiabilities,
data=non_current_liabilities_dict_
)
bs_obj.total_liabilities = sheet_data['负债合计']
bs_obj.owner_equity = SpecObject.set_specify_instance(
instance=bs_obj.OwnerEquity,
data=owner_equity_dict_
)
return bs_obj
def income_script(sheet_data):
"""利润表"""
sheet_data.pop('报告期')
ic_obj = SpecObject.set_specify_instance(
instance=financial_data.IncomeSheet,
data=sheet_data
)
return ic_obj
def appendix_script(sheet_data):
"""补充数据表"""
sheet_data.pop('报告期')
ap_obj = SpecObject.set_specify_instance(
instance=financial_data.AppendixSheet,
data=sheet_data
)
return ap_obj
for num in range(length):
# 财务数据obj
financial_data = FinancialData()
financial_data.cid = new_cid
financial_data.company_name = basic_business_info.company_name
financial_data.report_period = balance[num]['报告期']
financial_data.balance_sheet = balance_script(balance[num])
financial_data.income_sheet = income_script(income[num])
financial_data.appendix_sheet = appendix_script(appendix[num])
financial_data_list.append(financial_data)
DB_GUA.insert_single_data(
"企业数据",
"工商信息",
basic_business_info.fields_toggle()
)
DB_GUA.insert_many_data(
"企业数据",
"财务数据",
[item.fields_toggle() for item in financial_data_list]
)
DB_GUA.insert_many_data(
"历史数据",
"客户信息",
[item.fields_toggle() for item in customer_info_list]
)
DB_GUA.insert_many_data(
"历史数据",
"担保区域分布",
[item.fields_toggle() for item in region_distribution_list]
)
DB_GUA.insert_many_data(
"历史数据",
"担保行业分布",
[item.fields_toggle() for item in industry_distribution_list]
)
DB_GUA.insert_many_data(
"历史数据",
"担保金额分布",
[item.fields_toggle() for item in guarantee_distribution_list]
)
DB_GUA.insert_many_data(
"企业数据",
"担保数据",
[item.fields_toggle() for item in guarantee_info_list]
)