tfse-app-api-v0.2/cc_rating/cc_impl.py

340 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import json
import time
import requests
from cc_rating.cc_db import *
from cc_rating.cc_utils import get_current_year, gen_new_rid, make_3_report_dates, update_process_status, \
get_data_template, prepare_risk_data
def get_rating_records_impl(cid):
"""
查询一家企业的所有评价记录
Parameters:
cid: 企业ID
Returns:
records: 企业的评价记录
"""
cc_report = '/file/get_company_report?file_id={}'
esg_report = '/file/get_company_esg_report?file_id={}'
cc_certification = "/file/get_certification?file_id={}"
esg_certification = "/file/get_esg_certification?file_id={}"
records = FIND_ALL_DATA_BY_REQ("企业数据", "评价记录", {"企业ID": cid},
["评价ID", "评价项目", "评价方式", "进行状态", "评价结果", "报告fid", "证书fid"])
for record in records:
if records is not None:
if record['评价项目'] == '综合信用评价':
record['报告'] = cc_report.format(record['报告fid']) if record['报告fid'] is not None else None
record['证书'] = cc_certification.format(record['证书fid']) if record['证书fid'] is not None else None
record.pop('报告fid')
record.pop('证书fid')
else:
record['报告'] = esg_report.format(record['报告fid']) if record['报告fid'] is not None else None
record['证书'] = esg_certification.format(record['证书fid']) if record['证书fid'] is not None else None
record.pop('报告fid')
record.pop('证书fid')
return records
def start_cc_rating_impl(cid):
"""
开始综合信用评价的数据填报
Parameters:
cid: str 企业ID
Returns:
input_data: dict 填报信息
"""
# 检查本年度填报状态
def check_input_data():
"""
input_data: 已存在的填报数据
根据企业ID+当前年度,查询是否存在填报数据
若存在填报数据,则返回填报数据
若不存在填报数据则返回False
"""
input_data = FIND_SINGLE_DATA_BY_REQ("综信评价数据", "填报数据", {"企业ID": cid, "评价年度": get_current_year()},
["评价ID", "企业名称", "评价年度", "行业选择", "经营问卷", "财务填报"])
return input_data if input_data else False
# 存在填报数据的情况
def case_input_exist(param):
"""
param: dict 填报数据
根据评价ID查询评价进行状态
若评价已完成,返回‘本年度已评价’的提示,且返回空对象
若评价进行中,返回‘继续填报’的提示,且返回填报数据
"""
# rating_status: 评价服务状态
rating_status = FIND_SINGLE_COLUMN_BY_REQ("企业数据", "评价记录", {"评价ID": param["评价ID"]}, "进行状态")
# 把不需要返回的字段删掉
param.pop('评价ID')
# 方法返回结果
return ("本年度已评价", {}) if rating_status == "完成" else ("继续填报", param)
# 不存在填报数据的情况
def case_input_not_exist():
# new_rid: 新生成填报ID
new_rid = gen_new_rid(8)
# report_dates: 生成报告期
report_dates = make_3_report_dates()
# company_name: 企业名称
company_name = FIND_SINGLE_COLUMN_BY_REQ('应用端', '企业用户', {"企业ID": cid}, '企业名称')
def prepare_input_template():
"""
根据模板生成新的填报数据
input_template: 填报数据模板
"""
input_template = get_data_template('input')
input_template['评价ID'] = new_rid
input_template['企业ID'] = cid
input_template['企业名称'] = company_name
input_template['评价年度'] = get_current_year()
for sheets in ['资产负债表', '利润表', '补充数据表']:
for i in range(3):
input_template['财务填报'][sheets][i]['报告期'] = report_dates[i]
# 插入新填报记录
UPSERT_SINGLE_DATA('综信评价数据', '填报数据', {"评价ID": input_template['评价ID']}, input_template)
def prepare_rating_record_template():
"""
根据模板生成新的评价记录数据
rating_result_template: 评价记录模板
"""
rating_record_template = get_data_template('rating')
rating_record_template['评价ID'] = new_rid
rating_record_template['企业ID'] = cid
rating_record_template['企业名称'] = company_name
rating_record_template['评价项目'] = "综合信用评价"
rating_record_template['评价方式'] = "企业申报"
rating_record_template['进行状态'] = "进行"
rating_record_template['开始填报时间'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 插入新评价记录
UPSERT_SINGLE_DATA('企业数据', '评价记录', {"评价ID": rating_record_template['评价ID']}, rating_record_template)
def prepare_process_template():
"""
根据数据模板生成新的评价流程数据
process_template: 评价流程
"""
process_template = get_data_template('process')
process_template['评价ID'] = new_rid
process_template['企业ID'] = cid
# 插入新评价流程
UPSERT_SINGLE_DATA('综信评价数据', '评价流程', {"评价ID": process_template['评价ID']}, process_template)
# 评价记录
prepare_process_template()
# 评价流程
prepare_rating_record_template()
# 填报数据
prepare_input_template()
# 风险数据
prepare_risk_data(cid, new_rid, company_name)
return "开始填报", check_input_data()
# 执行【start_cc_rating_impl】方法
def execute_func():
input_data = check_input_data()
if input_data:
return case_input_exist(input_data)
else:
return case_input_not_exist()
return execute_func()
def save_comprehensive_credit_rating_input_form(cid, input_form):
"""
保存综合信用评价填报数据
Parameters:
cid: str 企业ID
input_form: dict 填报数据
Returns:
res: None
"""
# STEP_1
# 根据企业ID查询正在进行中的评价服务获取评价ID即rid
# 根据rid更新填报数据
rid = FIND_RATING_RECORDS({"企业ID": cid, "进行状态": "进行"})[0]['评价ID']
UPDATE_COMPREHENSIVE_CREDIT_INPUT_DATA(rid, input_form)
# STEP_2
# 查询评价流程
records = FIND_CC_RATING_PROCESS_DATA('综合评价流程', {"评价ID": rid})
if records:
record = records[0]
if not record['评价流程']['问卷填报']:
renew_data = {"评价流程.问卷填报": 1}
update_process_status(rid, renew_data)
elif not record['评价流程']['财务数据填报']:
renew_data = {"评价流程.财务数据填报": 1}
update_process_status(rid, renew_data)
def choose_industry_script():
"""
选择行业
Parameters:
-
Returns:
-
"""
industry_json = '/static/template/industry.json'
with open(os.path.dirname(__file__)+industry_json, "r", encoding='utf-8') as f:
data = json.load(f)
return data
def questionnaire_script(industry):
"""
问卷模板
Parameters:
industry: 行业
Returns:
data: 问卷内容
"""
try:
questionnaire_json = '/static/questionnaire/{}.json'.format(industry)
with open(os.path.dirname(__file__)+questionnaire_json, "r", encoding='utf-8') as f:
data = json.load(f)
return data
except FileNotFoundError:
data = [
{"label": "环境", "children": []},
{"label": "社会责任", "children": []},
{"label": "公司治理", "children": []}
]
return data
def exec_general_rating_scripts(cid):
"""
Notes
Parameters:
-
Returns:
-
"""
# pre
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')
rating_inputs = {**inputs, **risks}
# 打分模型
def general_model():
url = "http://api.fecribd.com/tfse_rating/rating/general_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)
update_process_status(rid, {"评价流程.模型打分": 1})
update_process_status(rid, {"评价流程.分析指标明细主页": 1})
return True
else:
update_process_status(rid, {"评价流程.模型打分": -1})
return False
# 生成报告
def gen_report():
url = "http://api.fecribd.com/tfse_rating/report/gen_general_rating_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)
update_process_status(rid, {"评价流程.报告生成": 1})
return True
else:
update_process_status(rid, {"评价流程.报告生成": -1})
return False
# 生成证书
def gen_certified():
url = "http://api.fecribd.com/tfse_rating/certificate/generate_certificate"
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)
update_process_status(rid, {"评价流程.证书生成": 1})
return True
else:
update_process_status(rid, {"评价流程.证书生成": -1})
return False
# 生成企业主页数据
def company_index():
url = "http://api.fecribd.com/etl_tfse/company/company_index_etl"
token = "dmfd7FshT!5Wng9^gcCcQV7T6FBnVgl4"
headers = {'token': token, "Content-Type": "application/json;charset=UTF-8"}
data = {
"rid": rating_inputs['评价ID']
}
res = requests.post(url, headers=headers, data=json.dumps(data))
if res.status_code == 200:
update_process_status(rid, {"评价流程.综合信用评价主页": 1})
update_process_status(rid, {"评价流程.财务要素评价主页": 1})
update_process_status(rid, {"评价流程.公司风险分析主页": 1})
return True
else:
update_process_status(rid, {"评价流程.综合信用评价主页": -1})
return False
if not general_model():
return False, "打分失败"
if not gen_report():
return False, "生成报告失败"
if not gen_certified():
return False, "生成证书失败"
if not company_index():
return False, "准备主页数据失败"
update_rating_records({"评价ID": rid}, {"进行状态": "完成"})
return True, "执行成功"
if __name__ == '__main__':
get_rating_records_impl("EkKaAgXZ")