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}, {"公司标签"} )