tfse-app-api-v0.2/input/input_impl.py

399 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 copy
import json
import random
import time
import requests
from input.input_db import *
from user.user_db import FIND_USER_INFO
from user.user_impl import check_verified
def call_interface(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)
def get_current_year():
"""
获取当前年度
Parameters:
-
Returns:
current_year 当前年度
"""
current_year = time.strftime("%Y", time.localtime()) + ""
return current_year
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
def gen_new_rid(param):
"""
生成新的评价ID如果该ID存在则重新生成
Parameters:
param: 生成长度
Returns:
new_id: 生成的企业ID
"""
# 生成新ID
new_id = make_id(param)
# 检查新ID是否存在如果存在则继续生成新ID
case = find_rating_records({"评价ID": new_id}) is []
while case:
new_id = make_id(param)
# 新ID可使用返回新ID
return new_id
def get_company_type(cid):
"""
获取企业填报的企业类型
Parameters:
cid: 企业ID
Returns:
industry
若没有查询到行业 返回空值
"""
# 根据企业ID获取企业当年填报的企业类型
choose_industry = find_rating_inputs({"企业ID": cid, "评价年度": get_current_year()})[0]['行业选择']
if not len(choose_industry) > 1:
return None
else:
return choose_industry[0]
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={}"
esg_report_link = '/file/get_company_esg_report?file_id={}'
esg_certification_link = "/file/get_esg_certification?file_id={}"
records = find_rating_records({"企业ID": cid})
for record in records:
if records is not None:
if record['评价项目'] == '综合信用评价':
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')
else:
record['报告'] = esg_report_link.format(record['报告fid']) if record['报告fid'] is not None else None
record['证书'] = esg_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_general_rating_script(cid):
"""
开始进行综合评价的数据填报
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(8)
# 生成报告期
report_dates = make_3_report_dates()
# 新填报记录
company_name = FIND_USER_INFO({"企业ID": cid})[0]['企业名称']
input_json = '/static/template/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['评价项目'] = "综合信用评价"
rating['评价方式'] = "企业申报"
rating['进行状态'] = "进行"
# 生成新的流程记录
process_json = '/static/template/process.json'
with open(os.path.dirname(__file__)+process_json, "r", encoding='utf-8') as f:
process = json.load(f)
process['评价ID'] = new_rid
process['企业ID'] = cid
# 深拷贝新填报记录不然保存后会生成_id
return_input = copy.deepcopy(new_input)
# 插入新填报记录``
insert_general_input(new_input)
# 插入新评价记录
insert_rating_records(rating)
# 插入新评价流程
insert_process_records(process)
# 执行风险数据清洗程序
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": cid, "company_name": company_name, "evaluation_id": new_rid})
requests.post(url, headers=headers, data=data)
# 风险数据清洗完成后更新流程状态
call_interface(new_rid, {"评价流程.清洗风险数据": 1})
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)
# 查询评价流程
records = find_process_records('综合评价流程', {"评价ID": rid})
if records:
record = records[0]
if not record['评价流程']['问卷填报']:
renew_data = {"评价流程.问卷填报": 1}
call_interface(rid, renew_data)
elif not record['评价流程']['财务数据填报']:
renew_data = {"评价流程.财务数据填报": 1}
call_interface(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)
call_interface(rid, {"评价流程.模型打分": 1})
call_interface(rid, {"评价流程.分析指标明细主页": 1})
return True
else:
call_interface(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)
call_interface(rid, {"评价流程.报告生成": 1})
return True
else:
call_interface(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)
call_interface(rid, {"评价流程.证书生成": 1})
return True
else:
call_interface(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:
call_interface(rid, {"评价流程.综合信用评价主页": 1})
call_interface(rid, {"评价流程.财务要素评价主页": 1})
call_interface(rid, {"评价流程.公司风险分析主页": 1})
return True
else:
call_interface(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, "执行成功"
def make_id(num):
"""
随机生成字符串
"""
choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
salt = ''
for i in range(num):
salt += random.choice(choices)
return salt