tfse-app-api-v0.2/esg/esg_impl.py

248 lines
7.8 KiB
Python
Raw Normal View History

import os
import copy
import json
import random
import time
import requests
from esg.esg_db import *
from user.user_db import FIND_USER_INFO
from user.user_impl import check_verified
def get_current_year():
"""
获取当前年度
Parameters:
-
Returns:
current_year 当前年度
"""
current_year = time.strftime("%Y", time.localtime()) + ""
return current_year
def gen_new_rid():
"""
生成新的评价ID如果该ID存在则重新生成
Parameters:
-
Returns:
new_id: 生成的企业ID
"""
# 生成新ID
2022-02-23 23:21:31 +08:00
new_id = make_id(8)
# 检查新ID是否存在如果存在则继续生成新ID
case = find_rating_records({"评价ID": new_id}) is []
while case:
2022-02-23 23:21:31 +08:00
new_id = make_id(8)
# 新ID可使用返回新ID
return new_id
def make_3_report_dates():
"""
生成最近三年报告期 日期
Parameters:
-
Returns:
report_dates 三年报告期
"""
current_year = int(time.strftime("%Y", time.localtime()))-1
2022-02-23 23:21:31 +08:00
date_01 = str(current_year) + ''
date_02 = str(current_year-1) + ''
date_03 = str(current_year-2) + ''
report_dates = [date_01, date_02, date_03]
return report_dates
def make_id(num):
"""
随机生成字符串
"""
choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
salt = ''
for i in range(num):
salt += random.choice(choices)
return salt
def rating_records_by_cid(cid):
"""
查询一家企业的所有评价记录
Parameters:
cid: 企业ID
Returns:
records: 企业的评价记录
"""
report_link = '/file/get_company_report?file_id={}'
certification_link = "/file/get_certification?file_id={}"
records = find_rating_records({"企业ID": cid, "评价项目": "ESG评价"})
for record in records:
if records is not None:
record['报告'] = report_link.format(record['报告fid']) if record['报告fid'] is not None else None
record['证书'] = certification_link.format(record['证书fid']) if record['证书fid'] is not None else None
record.pop('企业ID')
record.pop('报告fid')
record.pop('证书fid')
return records
def start_esg_rating_script(cid):
"""
开始进行esg评价的数据填报
Parameters:
cid: 企业ID
Returns:
record 填报信息
"""
# 检查是否已认证
if not check_verified(cid):
return "该企业未认证", {}
# 根据企业ID和当前年度查询是否存在当年的填报记录
exist_input_form = find_rating_inputs({"企业ID": cid, "评价年度": get_current_year()})
# 若存在填报记录根据评价ID查询评价记录该评价是否完成
if exist_input_form:
# 已完成 本年度不能再填报
if find_rating_records({"评价ID": exist_input_form[0]["评价ID"]})[0]['进行状态'] == "完成":
return "本年度已评价", {}
# 未完成 返回已经填报保存的数据
else:
exist_input_form[0].pop('评价ID')
exist_input_form[0].pop('企业ID')
return "继续填报", exist_input_form[0]
# 不存在填报记录 新生成填报记录、评价记录 返回空填报记录对象
else:
# 新生成填报ID
new_rid = gen_new_rid()
# 生成报告期
report_dates = make_3_report_dates()
# 新填报记录
company_name = FIND_USER_INFO({"企业ID": cid})[0]['企业名称']
input_json = '/static/template/esg_input.json'
with open(os.path.dirname(__file__) + input_json, "r", encoding='utf-8') as f:
new_input = json.load(f)
new_input['评价ID'] = new_rid
new_input['企业ID'] = cid
new_input['企业名称'] = company_name
new_input['评价年度'] = get_current_year()
for sheets in ['环境问卷', '社会问卷', '治理问卷']:
for i in range(3):
new_input[sheets]['近三年公司数据'][i]['年份'] = report_dates[i]
# 生成新评价记录
rating_json = '/static/template/rating.json'
with open(os.path.dirname(__file__) + rating_json, "r", encoding='utf-8') as f:
rating = json.load(f)
rating['评价ID'] = new_rid
rating['企业ID'] = cid
rating['评价项目'] = "ESG评价"
rating['评价方式'] = "企业申报"
rating['进行状态'] = "进行"
# 深拷贝新填报记录不然保存后会生成_id
return_input = copy.deepcopy(new_input)
# 插入新填报记录
insert_general_input(new_input)
# 插入新评价记录
insert_rating_records(rating)
# 执行风险数据清洗程序
url = "http://139.9.249.34:51011/etl_tfse/rating/esg_risk_data"
token = "dmfd7FshT!5Wng9^gcCcQV7T6FBnVgl4"
headers = {'token': token, 'Content-Type': 'application/json; charset=UTF-8'}
data = json.dumps({"company_id": cid, "company_name": company_name, "evaluation_id": new_rid})
requests.post(url, headers=headers, data=data)
return "开始填报", return_input
def save_general_input_form(cid, input_form):
"""
保存综合信用评价填报
Parameters:
cid: 企业ID
input_form: 填报表单
Returns:
res: desc
"""
rid = find_rating_records({"企业ID": cid, "进行状态": "进行"})[0]['评价ID']
update_general_input(rid, input_form)
def exec_esg_rating_scripts(cid):
"""
开始esg评价流程
Parameters:
cid: 企业ID
Returns:
res: desc
"""
# prepar
record = find_rating_records({"企业ID": cid, "进行状态": "进行"})
if not record:
return False, "没有正在进行的评价"
# Parameters
rid = record[0]["评价ID"]
inputs = find_rating_inputs({"评价ID": rid})[0]
risks = {"风险数据": find_risk_data(rid)[0]}
risks["风险数据"].pop('企业ID')
risks["风险数据"].pop('评价ID')
risks["风险数据"].pop('更新日期')
rating_inputs = {**inputs, **risks}
# 打分模型
def esg_model():
2022-02-23 23:21:31 +08:00
url = "http://139.9.249.34:51012/esg_rating/rating/esg_model"
token = "X0gSlC!YE8jmr2jJr&ilcjS83j!tsoh5"
headers = {'token': token, "Content-Type": "application/json;charset=UTF-8"}
data = json.dumps({"input_data": rating_inputs})
res = requests.post(url, headers=headers, data=data)
if res.status_code == 200:
update_data = {
"评价结果": json.loads(res.text)['result'],
"评价时间": time.strftime("%Y-%m-%d", time.localtime())
}
update_rating_records({"评价ID": rid}, update_data)
return True
else:
return False
# 生成报告
def gen_report():
url = "http://139.9.249.34:51012/tfse_rating/report/generate_esg_report"
token = "X0gSlC!YE8jmr2jJr&ilcjS83j!tsoh5"
headers = {'token': token, "Content-Type": "application/json;charset=UTF-8"}
data = {
"company": rating_inputs['企业名称'],
"cid": rating_inputs['企业ID'],
"rid": rating_inputs['评价ID']
}
res = requests.post(url, headers=headers, data=json.dumps(data))
if res.status_code == 200:
update_data = {
"报告fid": json.loads(res.text)['result']['FileID']
}
update_rating_records({"评价ID": rid}, update_data)
return True
else:
return False
if not esg_model():
return False, "打分失败"
if not gen_report():
return False, "生成报告失败"
update_rating_records({"评价ID": rid}, {"进行状态": "完成"})
return True, "执行成功"