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

613 lines
27 KiB
Python

import json
import os
import re
import time
import pandas as pd
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
from Modules.Company.static.province_map import p_map
from Modules.ETL.GuaranteeDataJob import RiskInfoDataJob
from Utils.CommonUtil import get_attr
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()
guarantee_info_list = list()
bank_credit_info_list = list()
company_info = ExcelSheetParser(sheet=work_book.sheet_by_name('企业信息')).parse_sheet1()
balance_sheet = ExcelSheetParser(sheet=work_book.sheet_by_name('资产负债表')).parse_sheet2()
income_sheet = ExcelSheetParser(sheet=work_book.sheet_by_name('利润表')).parse_sheet3()
appendix_sheet = ExcelSheetParser(sheet=work_book.sheet_by_name('补充数据表')).parse_sheet4()
guarantee_info = ExcelSheetParser(sheet=work_book.sheet_by_name('担保信息')).parse_sheet5()
compensation_info = ExcelSheetParser(sheet=work_book.sheet_by_name('代偿信息')).parse_sheet6()
bank_credit = ExcelSheetParser(sheet=work_book.sheet_by_name('银行授信')).parse_sheet7()
def basic_data():
"""工商信息"""
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
def get_shareholders(name):
# 获取tyc股东信息
def basic_info_api():
"""工商信息接口"""
url = "http://api.fecribd.com/api/tyc/shareholders_info"
headers = {'token': 'uzdq51N4!I0%HY4sCaQ!aeCSIDIVIdAM'}
parameter = {"企业名称": name}
res = requests.post(url=url, headers=headers, data=json.dumps(parameter))
return res
share_list = list()
if '上市' in basic_info['基本信息']['companyOrgType']:
shareholder_info = DB_TYC.find_single_data(
'公司背景',
'十大股东',
{"企业名称": name},
['十大股东']
)
if not shareholder_info:
res_ = basic_info_api()
if res_.status_code == 200:
shareholder_info = DB_TYC.find_single_data(
'公司背景',
'十大股东',
{"企业名称": name},
['十大股东']
)
# 遍历数据修改格式
if shareholder_info['十大股东']:
for share in shareholder_info['十大股东']['holderList']:
share_dict = dict()
share_dict['股东名称'] = share['name']
share_dict['持股比例'] = share['proportion']
share_dict['股东性质'] = '-'
share_dict['持股数量(股)'] = share['holdingNum']
share_list.append(share_dict)
else:
shareholder_info = DB_TYC.find_single_data(
'公司背景',
'企业股东',
{"企业名称": name},
['企业股东']
)
if not shareholder_info:
res_ = basic_info_api()
if res_.status_code == 200:
shareholder_info = DB_TYC.find_single_data(
'公司背景',
'企业股东',
{"企业名称": name},
['企业股东']
)
# 遍历数据修改格式
for share in shareholder_info['企业股东']['result']:
share_dict = dict()
share_dict['股东名称'] = share['name']
share_dict['持股比例'] = share['capital'][0]['percent']
share_dict['股东性质'] = '-'
share_dict['持股数量(股)'] = share['capital'][0]['amomon']
share_list.append(share_dict)
return share_list
def get_main_staff(name):
# 获取tyc主要人员
def main_staff_api():
"""工商信息接口"""
url = "http://api.fecribd.com/api/tyc/main_staff"
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_ = main_staff_api()
if res_.status_code == 200:
record = DB_TYC.find_single_data(
'公司背景',
'主要人员',
{"企业名称": name},
['企业名称', '主要人员']
)
return_list = list()
for r in record['主要人员']['result']:
return_dict = dict()
return_dict['姓名'] = r['name']
return_dict['职务'] = r['typeJoin'][0]
return_dict['学历'] = None
return_dict['出生日期'] = None
return_dict['政治面貌'] = None
return_dict['行业经验'] = None
return_list.append(return_dict)
return return_list
def get_education(data):
"""学历信息"""
return_dict = dict()
return_dict['研究生'] = int(data['研究生'])
return_dict['本科'] = int(data['本科'])
return_dict['大专及以下'] = int(data['大专及以下'])
return return_dict
basic_info = get_basic(company_info['企业名称'])
tyc_shareholders = get_shareholders(company_info['企业名称'])
tyc_staff = get_main_staff(company_info['企业名称'])
employee_education = get_education(company_info)
basic_business_info.cid = new_cid
basic_business_info.shareholder_information = list()
basic_business_info.executive_information = list()
company_info['企业简称'] = basic_info['基本信息']['alias']
company_info['企业类型'] = basic_info['基本信息']['companyOrgType']
company_info['统一社会信用代码'] = basic_info['基本信息']['creditCode']
company_info['组织代码'] = basic_info['基本信息']['orgNumber']
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]
company_info['所在城市'] = basic_info['基本信息']['city']
company_info['注册地址'] = basic_info['基本信息']['regLocation']
company_info['通信地址'] = basic_info['基本信息']['regLocation']
company_info['法定代表人'] = basic_info['基本信息']['legalPersonName']
company_info['企业性质'] = '国有企业' if '国企' in basic_info['基本信息']['tags'] else '民营企业'
company_info['从业人员总数'] = sum(employee_education.values())
company_info['参保人数'] = int(company_info['参保人数'])
for item in tyc_shareholders:
shareholder = SpecObject.set_specify_instance(
instance=BasicBusinessInfo.ShareholderInformation,
data=item
)
basic_business_info.shareholder_information.append(shareholder)
for item in tyc_staff:
executive = SpecObject.set_specify_instance(
instance=BasicBusinessInfo.ExecutiveInformation,
data=item
)
basic_business_info.executive_information.append(executive)
basic_business_info.employee_education = SpecObject.set_specify_instance(
instance=BasicBusinessInfo.EmployeeEducation,
data=employee_education
)
company_info.pop('研究生')
company_info.pop('本科')
company_info.pop('大专及以下')
basic_business_info.set_instance(data=company_info)
def financial_data():
"""财务数据"""
financial = FinancialData()
period = [ExcelParserUtil.trans_date_fmt_2(item['报告期'])[:4] for item in appendix_sheet]
def balance_script(data):
"""资产负债表"""
fb = financial.BalanceSheet()
data.pop('报告期')
fb.current_assets = SpecObject.set_specify_instance(
instance=fb.CurrentAssets,
data=data['流动资产']
)
fb.total_assets = data['非流动资产']['资产总计']
data['非流动资产'].pop('资产总计')
fb.non_current_assets = SpecObject.set_specify_instance(
instance=fb.NonCurrentAssets,
data=data['非流动资产']
)
fb.current_liabilities = SpecObject.set_specify_instance(
instance=fb.CurrentLiabilities,
data=data['流动负债']
)
fb.total_assets = data['非流动负债']['负债合计']
data['非流动负债'].pop('负债合计')
fb.non_current_liabilities = SpecObject.set_specify_instance(
instance=fb.NonCurrentLiabilities,
data=data['非流动负债']
)
fb.owner_equity = SpecObject.set_specify_instance(
instance=fb.OwnerEquity,
data=data['所有者权益']
)
return fb
def income_script(data):
"""利润表"""
data.pop('报告期')
fi = SpecObject.set_specify_instance(
instance=financial.IncomeSheet,
data=data
)
return fi
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,
data=data
)
return fa
for num in range(len(balance_sheet)):
financial.cid = new_cid
financial.company_name = company_info['企业名称']
financial.report_period = ExcelParserUtil.trans_date_fmt_2(balance_sheet[num]['报告期'])
financial.balance_sheet = balance_script(balance_sheet[num])
financial.income_sheet = income_script(income_sheet[num])
financial.appendix_sheet = appendix_script(appendix_sheet[num])
financial_data_list.append(financial)
def guarantee_data():
"""担保数据"""
for info in guarantee_info:
gid = CompanyUtils.make_new_cid()
gua_info = GuaranteeInfo()
gua_info.cid = new_cid
gua_info.guarantee_id = gid
gua_info.project_name = info['项目名称']
gua_info.warrantee = info['被担保人']
gua_info.guarantee_type = info['担保类型']
gua_info.guarantee_method = info['担保方式']
gua_info.guarantee_balance = info['担保余额(万元)']
gua_info.release_amount = info['解除金额(万元)']
gua_info.liability_guarantee_balance = info['责任担保余额(万元)']
gua_info.guarantee_start_date = ExcelParserUtil.trans_date_fmt_2(info['担保开始日期'])
gua_info.guarantee_end_date = ExcelParserUtil.trans_date_fmt_2(info['担保结束日期'])
gua_info.province = info['省份']
gua_info.city = info['地级市']
gua_info.industry = info['行业']
gua_info.remark = info['备注']
gua_info.compensation_info = list()
for compensation in compensation_info:
if compensation['项目名称'] == info['项目名称']:
ci = gua_info.CompensationInfo()
ci.compensation_id = gid
ci.project_name = compensation['项目名称']
ci.compensation_amount = compensation['代偿金额(万元)']
ci.compensation_recovery_amount = compensation['代偿回收金额(万元)']
ci.compensation_date = ExcelParserUtil.trans_date_fmt_2(compensation['代偿日期'])
gua_info.compensation_info.append(ci)
guarantee_info_list.append(gua_info)
def bank_data():
"""银行授信"""
for item in bank_credit:
bc = BankCredit()
bc.cid = new_cid
bc.company_name = company_info['企业名称']
bc.bank_name = item['银行名称']
bc.report_period = ExcelParserUtil.trans_date_fmt_2(item['报告期'])
bc.credit_line = item['授信额度']
bc.usage_quota = item['使用额度']
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_():
basic_data()
guarantee_data()
financial_data()
bank_data()
risk_info()
_main_()
DB_GUA.insert_single_data(
"企业数据",
"工商信息",
basic_business_info.fields_toggle()
)
if financial_data_list:
DB_GUA.insert_many_data(
"企业数据",
"财务数据",
[item.fields_toggle() for item in financial_data_list]
)
if guarantee_info_list:
DB_GUA.insert_many_data(
"企业数据",
"担保数据",
[item.fields_toggle() for item in guarantee_info_list]
)
if bank_credit_info_list:
DB_GUA.insert_many_data(
"企业数据",
"银行授信",
[item.fields_toggle() for item in bank_credit_info_list]
)
if __name__ == '__main__':
names = DB_GUA.find_all_data(
"企业数据",
"工商信息",
{},
["企业名称"]
)
for name in names:
tags = DB_TYC.find_single_data(
"公司背景",
"基本信息",
{"企业名称": name},
["基本信息.tags"]
)
DB_GUA.update_single_data(
"企业数据",
"公司概览",
{"企业名称": name},
{"公司标签"}
)