diff --git a/CompanyObject/CompanyImpl.py b/CompanyObject/CompanyImpl.py index 19df89e..2e421b0 100644 --- a/CompanyObject/CompanyImpl.py +++ b/CompanyObject/CompanyImpl.py @@ -158,3 +158,35 @@ class CompanyImpl(Company): esg_rating.factors_score = self.instance_list_to_set(instance=ESGRating.FactorsScore, data=result['维度得分情况']) self.esg_rating_result = esg_rating + + def get_financial_analysis(self): + """财务要素分析""" + + result = self.db.find_single_data_with_single_sort( + "企业数据", + "财务要素分析", + {"企业ID": self.cid}, + ["评价ID", '更新日期', "财报期", "财务得分年度比较", "财务得分同行比较", "财务得分较去年变化", "财务得分较同行差异", "指标详情"], + {"更新日期": -1} + ) + + if result: + financial_analysis = FinancialAnalysis() + + financial_analysis.rid = result['评价ID'] + financial_analysis.report_date = result['财报期'] + financial_analysis.update_time = result['更新日期'] + + for item in result['财务得分年度比较']: + item["指标"] = self.dict_to_set(instance=FinancialAnalysis.CompareToYears.FinancialIndex, data=item['指标']) + financial_analysis.compare_to_years = self.instance_list_to_set(instance=FinancialAnalysis.CompareToYears, data=result['财务得分年度比较']) + + result['财务得分同行比较']['公司水平'] = self.dict_to_set(instance=FinancialAnalysis.CompareToIndustry.FinancialIndex, data=result['财务得分同行比较']['公司水平']) + result['财务得分同行比较']['平均水平'] = self.dict_to_set(instance=FinancialAnalysis.CompareToIndustry.FinancialIndex, data=result['财务得分同行比较']['平均水平']) + financial_analysis.compare_to_industry = self.dict_to_set(instance=FinancialAnalysis.CompareToIndustry, data=result['财务得分同行比较']) + + financial_analysis.delta_to_years = self.dict_to_set(instance=FinancialAnalysis.CompareToYears.FinancialIndex, data=result['财务得分较去年变化']) + financial_analysis.delta_to_industry = self.dict_to_set(instance=FinancialAnalysis.CompareToIndustry.FinancialIndex, data=result['财务得分较同行差异']) + financial_analysis.index_details = self.instance_list_to_set(instance=FinancialAnalysis.CompareToIndustry.FinancialAnalysisDetails, data=result['指标详情']) + + self.financial_analysis = financial_analysis \ No newline at end of file diff --git a/CompanyObject/CompanyObj.py b/CompanyObject/CompanyObj.py index 9e86fa1..b2ec723 100644 --- a/CompanyObject/CompanyObj.py +++ b/CompanyObject/CompanyObj.py @@ -315,6 +315,106 @@ class ESGRating(SpecObject): } +class FinancialAnalysis(SpecObject): + """财务分析""" + + class CompareToYears(SpecObject): + """财务得分年度比较""" + + class FinancialIndex(SpecObject): + """财务指标""" + profit_ability = ValidateAttr(field='profit_ability', type=[int, float, str]) + asset_quality = ValidateAttr(field='asset_quality', type=[int, float, str]) + debt_risk = ValidateAttr(field='debt_risk', type=[int, float, str]) + business_growth = ValidateAttr(field='business_growth', type=[int, float, str]) + + fields_map = { + "profit_ability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + year = ValidateAttr(field='year', type=str, func=Validate.date_format) + index = ValidateAttr(field='index', type=FinancialIndex) + + fields_map = { + "year": "年度", + "index": "指标" + } + + class CompareToIndustry(SpecObject): + """财务得分同行比较""" + + class FinancialIndex(SpecObject): + """财务指标""" + profit_ability = ValidateAttr(field='profit_ability', type=[int, float, str]) + asset_quality = ValidateAttr(field='asset_quality', type=[int, float, str]) + debt_risk = ValidateAttr(field='debt_risk', type=[int, float, str]) + business_growth = ValidateAttr(field='business_growth', type=[int, float, str]) + + fields_map = { + "profit_ability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + class FinancialAnalysisDetails(SpecObject): + """指标详情""" + name = ValidateAttr(field='name', type=str) + value = ValidateAttr(field='value', type=[str, float, type(None)]) + quality = ValidateAttr(field='quality', type=str) + + fields_map = { + "name": "指标", + "value": "数值", + "quality": "水平" + } + + company_score = ValidateAttr(field='company_score', type=FinancialIndex) + average_score = ValidateAttr(field='average_score', type=FinancialIndex) + + fields_map = { + "company_score": "公司水平", + "average_score": "平均水平" + } + + cid = ValidateAttr(field='cid', type=str, length=8, default=None) + update_time = ValidateAttr(field='update_time', func=Validate.time_format) + rid = ValidateAttr(field='rid', type=str, length=8, default='') + report_date = ValidateAttr(field='report_date', type=str, func=Validate.date_format, default='') + compare_to_years = ValidateAttr(field='compare_to_years', length=2, instance_list=CompareToYears, default=[{}, {}]) + compare_to_industry = ValidateAttr(field='compare_to_industry', type=CompareToIndustry, default={}) + delta_to_years = ValidateAttr(field='delta_to_years', type=CompareToYears.FinancialIndex, default={}) + delta_to_industry = ValidateAttr(field='delta_to_industry', type=CompareToIndustry.FinancialIndex, default={}) + index_details = ValidateAttr(field='index_details', instance_list=CompareToIndustry.FinancialAnalysisDetails, default=[{}]*11) + + fields_map = { + "cid": "企业ID", + "update_time": "更新时间", + "rid": "评价ID", + "report_date": "财报期", + "compare_to_years": "财务得分年度比较", + "compare_to_industry": "财务得分同行比较", + "delta_to_years": "财务得分较去年变化", + "delta_to_industry": "财务得分较同行差异", + "index_details": "指标详情" + } + + def dict_to_return(self, **kwargs): + _dict_ = self.dict_to_show(columns=["更新时间", "财报期", "财务得分年度比较", "财务得分同行比较", "财务得分较去年变化", "财务得分较同行差异", "指标详情"]) + _dict_['财务得分年度比较'] = [{list(item.values())[0]: list(item.values())[1]} for item in _dict_['财务得分年度比较']] + _dict_['财务得分年度比较'] = {**_dict_['财务得分年度比较'][0], **_dict_['财务得分年度比较'][1]} + _dict_['指标详情'] = [list(item.values()) for item in _dict_['指标详情']] + _dict_["同行对比图"] = _dict_.pop('财务得分同行比较') + _dict_["去年对比图"] = _dict_.pop('财务得分年度比较') + _dict_["去年对比表"] = _dict_.pop('财务得分较去年变化') + _dict_["同行对比表"] = _dict_.pop('财务得分较同行差异') + _dict_['更新日期'] = _dict_.pop('更新时间') + return _dict_ + + class Company(SpecObject): """企业""" @@ -327,6 +427,7 @@ class Company(SpecObject): main_members = ValidateAttr(field="main_members", instance_list=MainMember) cc_rating_result = ValidateAttr(field='cc_rating_result', type=CCRating) esg_rating_result = ValidateAttr(field='esg_rating_result', type=ESGRating) + financial_analysis = ValidateAttr(field="financial_analysis", type=FinancialAnalysis) update_time = ValidateAttr(field='update_time', type=dict) fields_map = { @@ -339,6 +440,7 @@ class Company(SpecObject): "main_members": "主要成员", "cc_rating_result": "综信评价结果", "esg_rating_result": "ESG评价结果", + "financial_analysis": "财务要素分析", "update_time": "更新时间" } @@ -356,3 +458,6 @@ class Company(SpecObject): def get_esg_rating_result(self): """ESG评价分析""" + + def get_financial_analysis(self): + """财务要素分析""" diff --git a/CompanyObject/CompanyRoutes.py b/CompanyObject/CompanyRoutes.py index 19104c0..858a5fb 100644 --- a/CompanyObject/CompanyRoutes.py +++ b/CompanyObject/CompanyRoutes.py @@ -86,14 +86,28 @@ def esg_rating_route(**kwargs): except ReturnConditionCheckFailed as e: e.log_error() return {"info": e.failed_info}, e.status_code - # except KeyError: - # return {"info": "参数异常"}, 400 + except KeyError: + return {"info": "参数异常"}, 400 @company_route.route('/financial_elements', methods=['GET']) @verify_token def financial_elements_route(**kwargs): - return {"info": "查询结果", "result": {}}, 200 + """财务要素分析""" + try: + impl = CompanyImpl() + impl.cid = kwargs['cid'] + impl.get_financial_analysis() + if impl.financial_analysis: + result = impl.financial_analysis.dict_to_return() + return {"info": "查询结果", "result": result}, 200 + else: + return {"info": "查询结果", "result": {}}, 200 + except ReturnConditionCheckFailed as e: + e.log_error() + return {"info": e.failed_info}, e.status_code + except KeyError: + return {"info": "参数异常"}, 400 @company_route.route('/operating_risk', methods=['GET'])