From 1f97cf33b9b37793a592b5d69bb4c5b5e10d8bf4 Mon Sep 17 00:00:00 2001 From: P3ngSaM <61768364+P3ngSaM@users.noreply.github.com> Date: Wed, 23 Feb 2022 16:48:30 +0800 Subject: [PATCH] =?UTF-8?q?update=20ESG=E6=89=93=E5=88=86=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Esg/EsgModel.py | 17 +- Esg/db.py | 13 + Esg/routes.py | 20 +- Report/PdfReport.py | 13 +- Report/db.py | 16 + Report/routes.py | 79 +++- Report/scripts/PdfStyle.py | 2 + Report/scripts/esg_contents.py | 469 +++++++++++++++++++++ Report/static/ReportTemplates/ESG报告.json | 41 +- app.py | 2 + 10 files changed, 635 insertions(+), 37 deletions(-) create mode 100644 Report/scripts/esg_contents.py diff --git a/Esg/EsgModel.py b/Esg/EsgModel.py index 064f366..77b3a5e 100644 --- a/Esg/EsgModel.py +++ b/Esg/EsgModel.py @@ -1,5 +1,6 @@ import copy +from Esg.db import update_data from Esg.scripts.environmental import environmental_rating from Esg.scripts.governance import governance_rating from Esg.scripts.social import social_rating @@ -26,6 +27,7 @@ class EsgModel: self.cid = None self.period = None self.esg_score = None + self.rating_result = None def prepare_params(self, param): """ @@ -40,6 +42,7 @@ class EsgModel: self.company = param['企业名称'] self.period = param['评价年度'] self.esg_score = self.esg_rating_scripts(param) + self.rating_result = self.esg_rating_result() @staticmethod def esg_rating_scripts(param): @@ -73,13 +76,19 @@ class EsgModel: result['评价年度'] = self.period result['评价等级'] = self.score_rank(score['合计']) result['环境得分'] = score['环境得分'] - result['环境得分'] = score['环境得分'] - result['社会得分'] = score['环境得分'] - result['公司治理得分'] = score['环境得分'] - result['合计'] = score['合计'] + result['社会得分'] = score['社会得分'] + result['公司治理得分'] = score['公司治理得分'] + result['ESG得分'] = score['合计'] return result + def save_result(self): + """ + 保存评价结果 + """ + rating_result = self.rating_result + update_data('评价', 'ESG评价结果', {"企业ID": self.cid, "评价年度": self.period}, rating_result) + @staticmethod def score_rank(param): """ diff --git a/Esg/db.py b/Esg/db.py index 1179e09..0dbbb4a 100644 --- a/Esg/db.py +++ b/Esg/db.py @@ -12,3 +12,16 @@ DB_PORT = 27018 client = pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT)) +def update_data(db, table, find, data): + """ + 保存数据 + Parameters: + db: str 数据库 + table: str 表 + find: dict 查询条件 + data: dict 更新数据 + Returns: + - + """ + collection = client[db][table] + collection.update_one(find, {"$set": data}, upsert=True) \ No newline at end of file diff --git a/Esg/routes.py b/Esg/routes.py index d0b8b70..fd6e20b 100644 --- a/Esg/routes.py +++ b/Esg/routes.py @@ -1,18 +1,20 @@ from flask import Blueprint, request + +from Esg.EsgModel import EsgModel from common.scripts import verify_token esg_route = Blueprint('esg', __name__) -@esg_route.route('/questionnaire_data_fill', methods=['POST']) +@esg_route.route('/esg_model', methods=['POST']) @verify_token def data_fill(): - """ - ESG问卷填报数据保存 - Parameters: - cid str 企业ID - Returns: - result: 保存结构 - """ - pass + input_data = request.json['input_data'] + try: + model = EsgModel() + model.prepare_params(input_data) + model.save_result() + return {"info": "模型执行成功", "result": model.rating_result['评价等级']}, 200 + except Exception: + return {"info": "模型执行失败"}, 210 diff --git a/Report/PdfReport.py b/Report/PdfReport.py index 694eabd..45abdf0 100644 --- a/Report/PdfReport.py +++ b/Report/PdfReport.py @@ -11,7 +11,7 @@ from Report.scripts.PdfStyle import cover_space, cover_company_style, cover_repo chapter_style, \ section_style, adjust_line_width, para_style_single, para_style_bold, table_name, table_unit, table_mark, \ adjust_table_widths, adjust_table_style, Seashell4, toc_style_1, table_content_style, toc_style_2, darkGolden, \ - adjust_table_data, para_bold_style, para_style_esg + adjust_table_data, para_bold_style, para_style_esg, para_style_special from Report.scripts.path_tool import gen_pdf_path, get_pic_path from common.scripts import read_json_file # 页码起始设置 @@ -183,7 +183,16 @@ class ReportGenerator: for section in chapter['章节内容']: # 段落 if list(section.keys())[0] == '段落': - self.story.append(Paragraph(adjust_line_width(section['段落'], 8), para_style_single)) + factor_01 = True if '绿色业务收入占比(%)' in section['段落'] else False + factor_02 = True if '公司在近三年因环境问题受到监管处罚' in section['段落'] else False + factor_03 = True if '这影响了公司的社会得分' in section['段落'] else False + factor_04 = True if '公司在近三年有过扶贫、捐赠行为' in section['段落'] else False + factor_05 = True if '经查,公司存在1项或多项的法律诉讼' in section['段落'] else False + factor_06 = True if '这影响了公司在治理方面的得分' in section['段落'] else False + if factor_01 or factor_02 or factor_03 or factor_04 or factor_05 or factor_06: + self.story.append(Paragraph(adjust_line_width(section['段落'], 8), para_style_special)) + else: + self.story.append(Paragraph(adjust_line_width(section['段落'], 8), para_style_single)) if __name__ == '__main__': diff --git a/Report/db.py b/Report/db.py index ca4fa03..00ec3be 100644 --- a/Report/db.py +++ b/Report/db.py @@ -32,6 +32,22 @@ def upload_pdf(name): return False +def upload_esg_pdf(name): + """ + 根据名称保存该企业esg报告 + """ + try: + path = get_gen_report_path(name=name) + database = '评价' + collection = 'esg报告' + fs = GridFS(client[database], collection) + content = open(path, 'rb').read() + pdf_id = fs.put(content, content_type='application/pdf', filename=name) + return str(pdf_id) + except Exception: + return False + + def download_pdf(pdf_id): """ 根据pdf_id查询pdf文件 diff --git a/Report/routes.py b/Report/routes.py index f518f40..2b912c0 100644 --- a/Report/routes.py +++ b/Report/routes.py @@ -7,7 +7,8 @@ from flask import Blueprint, request from Report.PdfReport import ReportGenerator from Report.ReportModel import ReportModel -from Report.db import upload_pdf, update_data +from Report.db import upload_pdf, update_data, upload_esg_pdf +from Report.scripts.esg_contents import handle_esg_report_data from Report.scripts.path_tool import get_gen_report_path from common.scripts import verify_token, read_json_file @@ -91,6 +92,82 @@ def report_pdf(): return {"info": "生成报告失败"}, 210 +@report_route.route('/generate_esg_report', methods=['POST']) +@verify_token +def esg_report_pdf(): + """ + 生成ESG报告PDF + Parameters: + company str 企业名称 + cid str 企业ID + rid str 评价ID + Returns: + res str 报告FileID + """ + def get_report_prepare_data(param): + """ + 获取报告准备数据 + Parameters: + param: dict 接口接收的请求数据 + Returns: + res: 请求成功返回报告准备数据;请求失败返回False + """ + url = 'http://139.9.249.34:51011/etl_tfse/rating/esg_report_data' + token = 'dmfd7FshT!5Wng9^gcCcQV7T6FBnVgl4' + headers = {'token': token, 'Content-Type': 'application/json;charset=UTF-8'} + result = requests.post(url, headers=headers, data=json.dumps(param)) + return json.loads(result.text) if result.status_code == 200 else False + + def save_report_data(param1, param2, param3): + """ + 保存处理好的报告数据 + Parameters: + param1: dict 查询条件 + param2: dict 报告数据 + param3: str 企业名称 + Returns: + res: 处理成功返回报告FileID;处理失败返回False + """ + # 保存报告数据 + report_data_result = update_data('评价', 'ESG报告数据', param1, param2) + # 保存报告数据失败,返回False + if not report_data_result: + return False + else: + # 生成PDF报告文件,以时间戳命名,临时存储 + report_file_name = '{}_{}.pdf'.format(param3, int(time.time())) + pdf_report = ReportGenerator(name=report_file_name, text_model=param2) + pdf_report.gen_report() + + # 保存PDF报告文件,删除临时存储的报告 + file_id = upload_esg_pdf(report_file_name) + report_path = get_gen_report_path(name=report_file_name) + os.remove(report_path) + + # 保存PDF报告成功,返回FileID;保存PDF报告文件失败,返回False + return file_id if file_id else False + + # Parameters + req_body = request.json # 接收的json格式请求体 + prepare_report_data = get_report_prepare_data(req_body) + + # 判断报告准备数据生成情况,若为None则返回错误信息 + if prepare_report_data is False: + return {"info": "报告准备数据生成错误"}, 210 + + # 获取报告准备数据 + report_template = read_json_file('/Report/static/ReportTemplates/{}.json'.format('ESG报告')) + + # 生成报告数据,保存报告数据 + text_model = handle_esg_report_data(prepare_report_data['data'], report_template) + save_report_result = save_report_data({"评价ID": text_model['评价ID']}, text_model, text_model['企业名称']) + + if save_report_result is not False: + return {"info": "生成报告成功", "result": {"FileID": save_report_result}}, 200 + else: + return {"info": "生成报告失败"}, 210 + + @report_route.route('/generate_pdf_report', methods=['POST']) @verify_token def gen_pdf(): diff --git a/Report/scripts/PdfStyle.py b/Report/scripts/PdfStyle.py index b3d07df..734b2ce 100644 --- a/Report/scripts/PdfStyle.py +++ b/Report/scripts/PdfStyle.py @@ -65,6 +65,8 @@ table_style.add( # para para_style_single = PS(name="para_style_single", fontName="SimHei", fontSize=8, leading=18, alignment=TA_LEFT, spaceBefore=6) +para_style_special = PS(name="para_style_single", fontName="SimHei", fontSize=8, leading=18, alignment=TA_LEFT, + spaceBefore=6, textColor='red') para_style_normal = PS(name="para_style_normal", fontName="SimHei", fontSize=8, leading=18, alignment=TA_LEFT, spaceBefore=6, firstLineIndent=16) para_style_esg = PS(name="para_style_esg", fontName="SimHei", fontSize=10, leading=18, alignment=TA_LEFT, diff --git a/Report/scripts/esg_contents.py b/Report/scripts/esg_contents.py new file mode 100644 index 0000000..23dab8b --- /dev/null +++ b/Report/scripts/esg_contents.py @@ -0,0 +1,469 @@ +from datetime import datetime + + +def handle_esg_report_data(param1, param2): + """ + 处理ESG报告模板 + Parameters: + param1 dict 报告数据 + param2 dict 报告模板 + Returns: + result dict 报告数据 + """ + + def handle_paragraph_01(param): + """ + 远东资信 + Parameters: + param dict 远东资信段落模板 + Returns: + result dict 处理好的报告模板 + """ + param[2]['段落'] = param[2]['段落'].format(param1['报告模板']['远东资信']['联系电话']) + param[3]['段落'] = param[3]['段落'].format(param1['报告模板']['远东资信']['联系人']) + return param + + def handle_paragraph_02(param): + """ + 基本信息 + Parameters: + param dict 基本信息段落模板 + Returns: + result dict 处理好的报告模板 + """ + param[0]['段落'] = param[0]['段落'].format(param1['报告模板']['基本信息']['公司名称']) + param[1]['段落'] = param[1]['段落'].format(param1['报告模板']['基本信息']['所属行业']) + return param + + def handle_paragraph_03(param): + """ + 公司ESG等级 + Parameters: + param dict 公司ESG等级段落模板 + Returns: + result dict 处理好的报告模板 + """ + param[0]['段落'] = param[0]['段落'].format(param1['报告模板']['公司ESG等级']['评价等级']) + return param + + def handle_paragraph_04(param): + """ + 环境部分 + Parameters: + param dict 环境部分段落模板 + Returns: + result dict 处理好的报告模板 + """ + + def handle_part_03(): + """ + 段落3 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落3'] + param[2]['段落'] = param[2]['段落'].format(date_range=data['date_range'], co2_emissions=data['co2_emissions']) + + def handle_part_04(): + """ + 段落4 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落4'] + param[3]['段落'] = param[3]['段落'].format(date_range=data['date_range'], co2_emissions=data['co2_emissions'], + year_02=data['year_02'], year_03=data['year_03'], + year01_on_year02=data['year01_on_year02'], + year02_on_year03=data['year02_on_year03'], + industry_indicators=data['industry_indicators'], + industry_indicators_average=data['industry_indicators_average'], + industry_indicators_median=data['industry_indicators_median'], + median_comparison=data['median_comparison']) + + def handle_part_06(): + """ + 段落4 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落6'] + param[5]['段落'] = param[5]['段落'].format(date_range=data['date_range'], + energy_consumption=data['energy_consumption']) + + def handle_part_07(): + """ + 段落7 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落7'] + param[6]['段落'] = param[6]['段落'].format(date_range=data['date_range'], + energy_consumption=data['energy_consumption'], + year_02=data['year_02'], year_03=data['year_03'], + year01_on_year02=data['year01_on_year02'], + year02_on_year03=data['year02_on_year03'], + industry_indicators=data['industry_indicators'], + industry_indicators_average=data['industry_indicators_average'], + industry_indicators_median=data['industry_indicators_median'], + median_comparison=data['median_comparison']) + + def handle_part_08(): + """ + 段落8 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落8'] + param[7]['段落'] = param[7]['段落'].format(date_range=data['date_range'], + energy_consumption=data['energy_consumption']) + + def handle_part_09(): + """ + 段落9 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落9'] + param[8]['段落'] = param[8]['段落'].format(date_range=data['date_range'], + energy_consumption=data['energy_consumption']) + + def handle_part_10(): + """ + 段落10 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落10'] + param[9]['段落'] = param[9]['段落'].format(date_range=data['date_range'], + consume_water=data['consume_water']) + + def handle_part_11(): + """ + 段落11 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落11'] + param[10]['段落'] = param[10]['段落'].format(date_range=data['date_range'], + consume_water=data['consume_water'], + year_02=data['year_02'], year_03=data['year_03'], + year01_on_year02=data['year01_on_year02'], + year02_on_year03=data['year02_on_year03'], + industry_indicators=data['industry_indicators'], + industry_indicators_average=data['industry_indicators_average'], + industry_indicators_median=data['industry_indicators_median'], + median_comparison=data['median_comparison']) + + def handle_part_12(): + """ + 段落12 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落12'] + param[11]['段落'] = param[11]['段落'].format(describe=data['describe']) + + def hanlde_part_13(): + """ + 段落13 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['环境部分']['段落13'] + param[12]['段落'] = param[12]['段落'].format(describe=data['describe']) + + def judge_false(): + """ + 判断语句描述中是否有false,有则删除 + Parameters: + param type 参数名 + Returns: + result type 返回数据 + """ + new_list = list() + for item in param: + if item['段落'] != 'False': + new_list.append(item) + return new_list + + # 调用子方法 + handle_part_03() + handle_part_04() + handle_part_06() + handle_part_07() + handle_part_08() + handle_part_09() + handle_part_10() + handle_part_11() + handle_part_12() + hanlde_part_13() + result = judge_false() + return result + + def handle_paragraph_05(param): + """ + 社会部分 + Parameters: + param dict 社会部分段落模板 + Returns: + result dict 处理好的报告模板 + """ + + def handle_part_02(): + """ + 段落2 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落2'] + param[1]['段落'] = param[1]['段落'].format(date_range=data['date_range'], turnover_ratio=data['turnover_ratio'], + year_03=data['year_03'], + industry_indicators=data['industry_indicators'], + industry_indicators_average=data['industry_indicators_average'], + industry_indicators_median=data['industry_indicators_median'], + median_comparison=data['median_comparison']) + + def handle_part_03(): + """ + 段落3 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落3'] + param[2]['段落'] = param[2]['段落'].format(date_range=data['date_range'], salary_level=data['salary_level'], + year_02=data['year_02'], year_03=data['year_03'], + year01_on_year02=data['year01_on_year02'], + year02_on_year03=data['year02_on_year03'], + industry_indicators=data['industry_indicators'], + industry_indicators_average=data['industry_indicators_average'], + industry_indicators_median=data['industry_indicators_median'], + median_comparison=data['median_comparison']) + + def handle_part_04(): + """ + 段落4 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落4'] + param[3]['段落'] = param[3]['段落'].format(describe=data['describe']) + + def handle_part_05(): + """ + 段落5 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落5'] + param[4]['段落'] = param[4]['段落'].format(describe=data['describe']) + + def handle_part_06(): + """ + 段落6 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落6'] + param[5]['段落'] = param[5]['段落'].format(date_range=data['date_range'], + training_number=data['training_number'], year_03=data['year_03'], + industry_indicators=data['industry_indicators']) + + def handle_part_07(): + """ + 段落7 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落7'] + param[6]['段落'] = param[6]['段落'].format(date_range=data['date_range'], + salary_level=data['salary_level'], year_03=data['year_03'], + industry_indicators=data['industry_indicators']) + + def handle_part_08(): + """ + 段落8 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落8'] + param[7]['段落'] = param[7]['段落'].format(describe=data['describe']) + + def handle_part_09(): + """ + 段落9 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['社会部分']['段落9'] + param[8]['段落'] = param[8]['段落'].format(describe=data['describe']) + + def judge_false(): + """ + 判断语句描述中是否有false,有则删除 + Parameters: + param type 参数名 + Returns: + result type 返回数据 + """ + new_list = list() + for item in param: + if item['段落'] != 'False': + new_list.append(item) + return new_list + + # 调用子方法 + handle_part_02() + handle_part_03() + handle_part_04() + handle_part_05() + handle_part_06() + handle_part_07() + handle_part_08() + handle_part_09() + result = judge_false() + return result + + def handle_paragraph_06(param): + """ + 公司治理部分 + Parameters: + param dict 社会部分段落模板 + Returns: + result dict 处理好的报告模板 + """ + + def handle_part_02(): + """ + 段落2 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['公司治理部分']['段落2'] + param[1]['段落'] = param[1]['段落'].format(describe=data['describe']) + + def handle_part_03(): + """ + 段落3 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['公司治理部分']['段落3'] + param[2]['段落'] = param[2]['段落'].format(describe=data['describe']) + + def handle_part_04(): + """ + 段落4 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['公司治理部分']['段落4'] + param[3]['段落'] = param[3]['段落'].format(experience_year=data['experience_year'], + industry_indicators_average=data['industry_indicators_average']) + + def handle_part_05(): + """ + 段落5 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['公司治理部分']['段落5'] + param[4]['段落'] = param[4]['段落'].format(describe=data['describe']) + + def handle_part_06(): + """ + 段落6 + Parameters: + - + Returns: + result dict 处理好的报告段落模板 + """ + data = param1['报告模板']['公司治理部分']['段落6'] + param[5]['段落'] = param[5]['段落'].format(board_meetings_number=data['board_meetings_number'], + industry_indicators_average=data['industry_indicators_average']) + + def judge_false(): + """ + 判断语句描述中是否有false,有则删除 + Parameters: + param type 参数名 + Returns: + result type 返回数据 + """ + new_list = list() + for item in param: + if item['段落'] != 'False': + new_list.append(item) + return new_list + + # 调用子方法 + handle_part_02() + handle_part_03() + handle_part_04() + handle_part_05() + handle_part_06() + result = judge_false() + return result + + param2['评价ID'] = param1['评价ID'] + param2['企业ID'] = param1['企业ID'] + param2['评价年度'] = param1['评价年度'] + param2['生成日期'] = datetime.now().strftime("%Y-%m-%d") + for index in range(len(param2['报告内容'])): + if param2['报告内容'][index]['章节'] == '远东资信': + param2['报告内容'][index]['章节内容'] = handle_paragraph_01(param2['报告内容'][index]['章节内容']) + elif param2['报告内容'][index]['章节'] == '基本信息': + param2['报告内容'][index]['章节内容'] = handle_paragraph_02(param2['报告内容'][index]['章节内容']) + elif param2['报告内容'][index]['章节'] == '公司ESG等级': + param2['报告内容'][index]['章节内容'] = handle_paragraph_03(param2['报告内容'][index]['章节内容']) + elif param2['报告内容'][index]['章节'] == '环境部分': + param2['报告内容'][index]['章节内容'] = handle_paragraph_04(param2['报告内容'][index]['章节内容']) + elif param2['报告内容'][index]['章节'] == '社会部分': + param2['报告内容'][index]['章节内容'] = handle_paragraph_05(param2['报告内容'][index]['章节内容']) + elif param2['报告内容'][index]['章节'] == '公司治理部分': + param2['报告内容'][index]['章节内容'] = handle_paragraph_06(param2['报告内容'][index]['章节内容']) + + return param2 diff --git a/Report/static/ReportTemplates/ESG报告.json b/Report/static/ReportTemplates/ESG报告.json index bfb3c44..9ddcf3f 100644 --- a/Report/static/ReportTemplates/ESG报告.json +++ b/Report/static/ReportTemplates/ESG报告.json @@ -1,6 +1,5 @@ { "企业名称": "远东资信评估有限公司", - "生成日期": "2022-02-14", "报告类型": "ESG", "报告内容": [ { @@ -100,28 +99,28 @@ "段落": "二氧化碳排放——{date_range}年,公司总的二氧化碳排放(单位:千克){co2_emissions}。" }, { - "段落": "单位二氧化碳排放——{date_range}年,公司每万元收入二氧化碳排放(单位:千克){CO2_year_01}、{CO2_year_02}、{CO2_year_03}。{year_02}年、{year_03}年同比分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_ indicators},该指标均值为{industry_ indicators_average},该指标中位数为{industry_ indicators_median},公司较之行业中位数{median_comparison}。" + "段落": "单位二氧化碳排放——{date_range}年,公司每万元收入二氧化碳排放(单位:千克){co2_emissions}。{year_02}年、{year_03}年同比分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_indicators},该指标均值为{industry_indicators_average},该指标中位数为{industry_indicators_median},公司较之行业中位数{median_comparison}。" }, { "段落": "能耗——能耗包括企业消耗的电量、汽柴油等。为表述方便,我们将不同能源消耗均转为以兆焦耳做单位。" }, { - "段落": "能耗——{date_range}年,公司总的能耗(单位:兆焦耳){energy_consumption_year_01}、{energy_consumption_year_02}、{energy_consumption_year_03}。" + "段落": "能耗——{date_range}年,公司总的能耗(单位:兆焦耳){energy_consumption}。" }, { - "段落": "单位能耗——{date_range}年,公司每万元收入能耗(单位:兆焦耳){sec_year_01}、{sec_year_02}、{sec_year_03}。{year_02}年、{year_03}年同比增长分别为{}、{}。{year_03}年,同行业公司该指标区间为{industry_ indicators},该指标均值为{industry_ indicators_average},该指标中位数为{industry_ indicators_median},公司较之行业中位数{median_comparison}。" + "段落": "单位能耗——{date_range}年,公司每万元收入能耗(单位:兆焦耳){energy_consumption}。{year_02}年、{year_03}年同比增长分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_indicators},该指标均值为{industry_indicators_average},该指标中位数为{industry_indicators_median},公司较之行业中位数{median_comparison}。" }, { - "段落": "能耗折算标准煤——{date_range}年,公司总的能耗折算为标准煤(单位:千克){standard_coal_year_01}、{standard_coal_year_02}、{standard_coal_year_03}。。" + "段落": "能耗折算标准煤——{date_range}年,公司总的能耗折算为标准煤(单位:千克){energy_consumption}。" }, { - "段落": "单位能耗折算标准煤——{date_range}年,公司每万元收入能耗折算为标准煤(单位:千克){standard_coal_year_01}、{standard_coal_year_02}、{standard_coal_year_03}。。" + "段落": "单位能耗折算标准煤——{date_range}年,公司每万元收入能耗折算为标准煤(单位:千克){energy_consumption}。" }, { - "段落": "耗水——{date_range}年,公司总耗水(单位:吨){consume water_year_01}、{consume water_year_02}、{consume water_year_03}。" + "段落": "耗水——{date_range}年,公司总耗水(单位:吨){consume_water}。" }, { - "段落": "单位耗水——{date_range}年,公司每万元收入耗水(单位:吨){iwc_year_01}、{iwc_year_01}、{iwc_year_01}。{year_02}年、{year_03}年同比增长分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_ indicators},该指标均值为{industry_ indicators_average},该指标中位数为{industry_ indicators_median},公司较之行业中位数{median_comparison}。" + "段落": "单位耗水——{date_range}年,公司每万元收入耗水(单位:吨){consume_water}。{year_02}年、{year_03}年同比增长分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_indicators},该指标均值为{industry_indicators_average},该指标中位数为{industry_indicators_median},公司较之行业中位数{median_comparison}。" }, { "段落": "{describe}" @@ -138,28 +137,28 @@ "段落": "我们重点关注的社会因素包括雇佣、供应链、产品、社会贡献等。" }, { - "段落": "离职率——{date_range}年,公司离职比例为{turnover_ratio_year_01}、{turnover_ratio_year_02}、{turnover_ratio_year_03}。{year_03}年,同行业公司该指标区间为{industry_ indicators},该指标均值为{industry_ indicators_average},该指标中位数为{industry_ indicators_median},公司较之行业中位数{median_comparison}。" + "段落": "离职率——{date_range}年,公司离职比例为{turnover_ratio}。{year_03}年,同行业公司该指标区间为{industry_indicators},该指标均值为{industry_indicators_average},该指标中位数为{industry_indicators_median},公司较之行业中位数{median_comparison}。" }, { - "段落": "人均薪酬水平——{date_range}年,公司人均薪酬水平为{salary_level_year_01}、{salary_level_year_02}、{salary_level_year_03}。{}年、{}年同比增长分别为{}、{}。{}年,同行业公司该指标区间为{},该指标均值为{},该指标中位数为{},公司较之行业中位数{}。" + "段落": "人均薪酬水平——{date_range}年,公司人均薪酬水平为{salary_level}。{year_02}年、{year_03}年同比增长分别为{year01_on_year02}、{year02_on_year03}。{year_03}年,同行业公司该指标区间为{industry_indicators},该指标均值为{industry_indicators_average},该指标中位数为{industry_indicators_median},公司较之行业中位数{median_comparison}。" }, { - "段落": "劳动纠纷——公司在近三年出现了劳动纠纷,这影响了公司的社会得分。" + "段落": "{describe}" }, { - "段落": "安全事故——公司在近三年出现了安全事故,这影响了公司的社会得分。" + "段落": "{describe}" }, { - "段落": "提供培训——{date_range}年,公司培训次数为{}、{}、{}。{year_03}年,同行业公司该指标均值为{}。" + "段落": "提供培训——{date_range}年,公司培训次数为{training_number}。{year_03}年,同行业公司该指标均值为{industry_indicators}。" }, { - "段落": "产品返修、退回、投诉——{date_range}年,公司返修、退回、投诉产品比例(%){rrc_year_01}、{rrc_year_02}、{rrc_year_03}。{year_03}年,同行业公司该指标均值为{industry_ indicators_average}。" + "段落": "产品返修、退回、投诉——{date_range}年,公司返修、退回、投诉产品比例(%){salary_level}。{year_03}年,同行业公司该指标均值为{industry_indicators}。" }, { - "段落": "扶贫和捐赠——公司在近三年有过扶贫、捐赠行为,这提高了公司社会得分。" + "段落": "{describe}" }, { - "段落": "法律诉讼(作为被告)、被执行人、失信人、行政处罚、税收违法、严重违法、经营异常——经查,公司存在1项或多项的法律诉讼(作为被告)、被执行人、失信人、行政处罚、税收违法、严重违法、经营异常情况,这影响了公司社会分数。" + "段落": "{describe}" } ] @@ -171,19 +170,19 @@ "段落": "我们重点关注的公司治理因素包括企业性质、董监高、专业能力、信息披露等。" }, { - "段落": "董事会——公司未设立董事会,这影响了公司在治理方面的得分。" + "段落": "{describe}" }, { - "段落": "监事会——公司未设立监事会,这影响了公司在治理方面的得分。" + "段落": "{describe}" }, { - "段落": "董监高专业性——公司董监高平均拥有的行业经验年数{experience_year},同行业公司该指标均值为{industry_ indicators_average}。" + "段落": "董监高专业性——公司董监高平均拥有的行业经验年数{experience_year},同行业公司该指标均值为{industry_indicators_average}。" }, { - "段落": "董监高稳定性——公司董监高近3年离职率较高,这影响了公司在治理方面的得分。" + "段落": "{describe}" }, { - "段落": "董事会——公司董事会近三年年均开会次数{},同行业公司该指标均值为{industry_ indicators_average}。" + "段落": "董事会——公司董事会近三年年均开会次数{board_meetings_number},同行业公司该指标均值为{industry_indicators_average}。" } ] }, diff --git a/app.py b/app.py index 4d94cb8..c241ece 100644 --- a/app.py +++ b/app.py @@ -3,6 +3,7 @@ from flask_cors import * from Rating.routes import rating_route from Report.routes import report_route +from Esg.routes import esg_route from Certificate.routes import certificate_route app = Flask(__name__) @@ -12,6 +13,7 @@ CORS(app, supports_credentials=True) app.register_blueprint(report_route, url_prefix='/tfse_rating/report') app.register_blueprint(rating_route, url_prefix='/tfse_rating/rating') +app.register_blueprint(esg_route, url_prefix='/esg_rating/rating') app.register_blueprint(certificate_route, url_prefix='/tfse_rating/certificate')