tfse-app-api-v0.2/Rating/Esg/EsgImpl.py

305 lines
12 KiB
Python
Raw Normal View History

import json
import time
import random
import requests
from DBHelper.MongoHelper import MongoHelper
from Rating.Esg.EsgObj import RatingRecord, EnvironmentQuestionnaire, ThreeYearDataByE, OtherTypeDataByE, \
ThreeYearDataByS, SocietyQuestionnaire, OtherTypeDataByS, ThreeYearDataByG, GovernanceQuestionnaire
from Rating.Process.ProcessObj import EsgProcess
from Utils.ErrorUtil import LogConditionCheckFailed
class CreditUtils:
"""综合信用评价相关方法"""
db = MongoHelper('tfse_v0.21')
@staticmethod
def get_current_year():
"""获取当前年度"""
current_year = time.strftime("%Y", time.localtime()) + ""
return current_year
@staticmethod
def gen_new_rid():
"""生成新的评价ID如果该ID存在则重新生成"""
db = MongoHelper('tfse_v0.21')
def make_id(num):
"""
随机生成字符串
"""
choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
salt = ''
for i in range(num):
salt += random.choice(choices)
return salt
# 生成新ID
new_id = make_id(8)
# 检查新ID是否存在如果存在则继续生成新ID
case = db.find_all_data_with_count(
'企业数据',
'评价记录',
{'评价ID': new_id}
)
while case > 0:
new_id = make_id(8)
# 新ID可使用返回新ID
return new_id
@staticmethod
def make_3_report_dates():
"""
生成最近三年报告期 日期
Parameters:
-
Returns:
report_dates 三年报告期
"""
current_year = int(time.strftime("%Y", time.localtime())) - 1
date_01 = str(current_year) + '-12-31'
date_02 = str(current_year - 1) + '-12-31'
date_03 = str(current_year - 2) + '-12-31'
report_dates = [date_01, date_02, date_03]
return report_dates
@staticmethod
def update_process_status(rid, update_data):
"""
调用更新流程接口
Parameters:
update_data dict 需要更新的数据
Returns:
result str 更新结果
"""
url = "http://api.fecribd.com/etl_tfse/company/update_process_data"
token = "dmfd7FshT!5Wng9^gcCcQV7T6FBnVgl4"
headers = {'token': token, 'Content-Type': 'application/json; charset=UTF-8'}
data = json.dumps({"rid": rid, "types": "综合评价流程", "renew_data": update_data})
requests.post(url, headers=headers, data=data)
class EsgRating(RatingRecord, CreditUtils):
"""企业ESG评价"""
db = MongoHelper('tfse_v0.21')
def start_esg_rating_obj(self):
"""开始ESG评价"""
def check_input_data():
"""
input_data: 已存在的填报数据
根据企业ID+当前年度,查询是否存在填报数据
若存在填报数据则返回填报数据
若不存在填报数据则返回False
"""
input_data = self.db.find_single_data(
"ESG评价数据",
"填报数据",
{"企业ID": self.cid, "评价年度": self.get_current_year()},
["评价ID", "企业名称", "评价年度", "行业选择", "经营问卷", "财务填报"]
)
return input_data if input_data else False
def case_input_exist(param):
"""
param: dict 填报数据
根据评价ID查询评价进行状态
若评价已完成返回本年度已评价的提示且返回空对象
若评价进行中返回继续填报的提示且返回填报数据
"""
# rating_status: 评价服务状态
rating_status = self.db.find_single_data(
"企业数据",
"评价记录",
{"评价ID": param["评价ID"]},
["进行状态"]
)
# 把不需要返回的字段删掉
param.pop('评价ID')
# 方法返回结果
return ("本年度已评价", {}) if rating_status['进行状态'] == "完成" else ("继续填报", param)
def case_input_not_exist():
"""不存在填报数据"""
# new_rid: 新生成填报ID
new_rid = self.gen_new_rid()
# report_dates: 生成报告期
report_dates = self.make_3_report_dates()
# company_name: 企业名称
company_name = self.db.find_single_data(
"应用端",
"企业用户",
{"企业ID": self.cid},
["企业名称"]
)
def prepare_input_template():
"""
根据模板生成新的填报数据
input_template: 填报数据模板
"""
def environment():
"""环境问卷"""
def three_year_data(i):
"""近三年数据"""
e = ThreeYearDataByE()
e.year = report_dates[i]
e.raw_coal = None
e.coke = None
e.crude = None
e.fuel_oil = None
e.gasoline = None
e.kerosene = None
e.diesel_fuel = None
e.liquefied_petroleum_gas = None
e.natural_gas = None
e.gas = None
e.electricity = None
e.water = None
e.green_income = None
return e.dict_to_save()
environment_questionnaire = EnvironmentQuestionnaire()
environment_questionnaire.e_three_year_data = list()
for num in range(3):
environment_questionnaire.e_three_year_data.append(three_year_data(num))
environment_questionnaire.e_other_type_data = OtherTypeDataByE().list_to_save()
return environment_questionnaire.dict_to_save()
def society():
"""社会问卷"""
def three_year_data(i):
s = ThreeYearDataByS()
s.year = None
s.employee_total = None
s.leaving_total = None
s.salary_level = None
s.work_length = None
s.labor_dispute = None
s.security_incident = None
s.training_times = None
s.supplier = None
s.sales = None
s.return_sales = None
s.donate = None
return s.dict_to_save()
society_questionnaire = SocietyQuestionnaire()
society_questionnaire.s_three_year_data = list()
for num in range(3):
society_questionnaire.s_three_year_data.append(three_year_data(num))
society_questionnaire.s_other_type_data = OtherTypeDataByS().list_to_save()
return society_questionnaire.dict_to_save()
def governance():
"""治理问卷"""
def three_year_data(i):
g = ThreeYearDataByG()
g.year = None
g.audit_report = None
g.net_assets = None
g.net_profit = None
return g.dict_to_save()
governance_questionnaire = GovernanceQuestionnaire()
governance_questionnaire.g_three_year_data = list()
for num in range(3):
governance_questionnaire.g_three_year_data.append(three_year_data(num))
governance_questionnaire.g_other_type_data = OtherTypeDataByS().list_to_save()
return governance_questionnaire.dict_to_save()
self.rid = new_rid
self.cid = self.cid
self.company = company_name['企业名称']
self.year = self.get_current_year()
self.industry = list()
self.current_year_income = dict()
self.current_year_income[report_dates[0]] = None
self.current_year_income[report_dates[1]] = None
self.current_year_income[report_dates[2]] = None
self.environment = environment()
self.society = society()
self.governance = governance()
input_template = self.dict_to_save()
# 插入新的填报记录
self.db.insert_single_data(
'综信评价数据',
'填报数据',
input_template
)
def prepare_rating_record_template():
"""根据模板生成新的评价记录"""
rating_record = RatingRecord()
rating_record.rid = new_rid
rating_record.cid = self.cid
rating_record.company = company_name['企业名称']
rating_record.project = '综合信用评价'
rating_record.methods = '企业申报'
rating_record.status = '进行'
rating_record.result = None
rating_record.report_fid = None
rating_record.certificate_fid = None
rating_record.begin_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
rating_record.submit_time = None
rating_record.finish_time = None
rating_record.finish_date = None
rating_record_template = rating_record.dict_to_save()
self.db.insert_single_data(
'企业数据',
'评价记录',
rating_record_template
)
def prepare_process_template():
"""根据数据模板生成新的评价流程数据"""
credit_process = EsgProcess()
credit_process.data_filling = 0
credit_process.clean_risk_data = 0
credit_process.model_scoring = 0
credit_process.report_generation = 0
credit_process.certificate_generation = 0
credit_process.esg_data_homepage = 0
process_template = dict()
process_template['评价ID'] = new_rid
process_template['企业ID'] = self.cid
process_template['评价流程'] = credit_process.dict_to_save()
self.db.insert_single_data(
'ESG评价数据',
'评价流程',
process_template
)
def prepare_risk_data():
# 调用清洗数据接口,执行风险数据清洗程序
url = "http://api.fecribd.com/etl_tfse/rating/risk_data"
token = "dmfd7FshT!5Wng9^gcCcQV7T6FBnVgl4"
headers = {'token': token, 'Content-Type': 'application/json; charset=UTF-8'}
data = json.dumps({"company_id": self.cid, "company_name": company_name, "evaluation_id": new_rid})
requests.post(url, headers=headers, data=data)
# 风险数据清洗完成后更新流程状态
self.update_process_status(new_rid, {"评价流程.清洗风险数据": 1})
def __main__():
prepare_input_template()
prepare_rating_record_template()
prepare_process_template()
prepare_risk_data()
__main__()
return "开始填报", check_input_data()
def execute_func():
"""判断是否有填报记录"""
input_data = check_input_data()
if input_data is not False:
return case_input_exist(input_data)
else:
return case_input_not_exist()
return execute_func()