450 lines
20 KiB
Python
450 lines
20 KiB
Python
from DBHelper.MongoHelper import MongoHelper
|
||
from cc_rating.CCRatingObj import RatingInfo, CreditRatingInput, FinancialReport, BusinessQuestionnaire
|
||
from cc_rating.CCRatingUtils import *
|
||
|
||
|
||
class RatingImpl(CreditRatingInput, RatingInfo, BusinessQuestionnaire, FinancialReport):
|
||
"""企业综合信用评价"""
|
||
|
||
db = MongoHelper('tfse_v0.21')
|
||
|
||
def records(self):
|
||
"""评价记录"""
|
||
cc_report = '/file/pdf?file_id={}'
|
||
esg_report = '/file/pdf?file_id={}'
|
||
cc_certification = "/file/pdf?file_id={}"
|
||
esg_certification = "/file/pdf?file_id={}"
|
||
|
||
rating_recprds = self.db.find_all_data(
|
||
"企业数据",
|
||
"评价记录",
|
||
{"企业ID": self.cid},
|
||
["评价ID", "评价项目", "评价方式", "进行状态", "评价结果", "报告fid", "证书fid"]
|
||
)
|
||
|
||
for record in rating_recprds:
|
||
if rating_recprds 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 rating_recprds
|
||
|
||
def start_cc_rating(self):
|
||
"""开始综合评价"""
|
||
|
||
def check_input_data():
|
||
"""
|
||
input_data: 已存在的填报数据
|
||
根据企业ID+当前年度,查询是否存在填报数据
|
||
若存在填报数据,则返回填报数据
|
||
若不存在填报数据,则返回False
|
||
"""
|
||
input_data = self.db.find_single_data(
|
||
"综信评价数据",
|
||
"填报数据",
|
||
{"企业ID": self.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 = 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 = gen_new_rid(8)
|
||
# report_dates: 生成报告期
|
||
report_dates = make_3_report_dates()
|
||
# company_name: 企业名称
|
||
company_name = self.db.find_single_data(
|
||
"应用端",
|
||
"企业用户",
|
||
{"企业ID": self.cid},
|
||
["企业名称"]
|
||
)
|
||
|
||
def prepare_input_template():
|
||
"""
|
||
根据模板生成新的填报数据
|
||
input_template: 填报数据模板
|
||
"""
|
||
input_template = self.credit_rating_dict_to_save()
|
||
input_template['评价ID'] = new_rid
|
||
input_template['企业ID'] = self.cid
|
||
input_template['企业名称'] = company_name['企业名称']
|
||
input_template['评价年度'] = get_current_year()
|
||
input_template['经营问卷'] = self.business_questionnaire_dict_to_save()
|
||
input_template['财务填报'] = self.financial_dict_to_save()
|
||
balance_sheet = list()
|
||
income_sheet = list()
|
||
appendix_sheet = list()
|
||
for n in range(3):
|
||
balance_sheet.append(self.BalanceSheet().dict_to_save())
|
||
income_sheet.append(self.IncomeSheet().dict_to_save())
|
||
appendix_sheet.append(self.AppendixDataSheet().dict_to_save())
|
||
input_template['财务填报']['资产负债表'] = balance_sheet
|
||
input_template['财务填报']['利润表'] = income_sheet
|
||
input_template['财务填报']['补充数据表'] = appendix_sheet
|
||
for sheets in ['资产负债表', '利润表', '补充数据表']:
|
||
for i in range(3):
|
||
input_template['财务填报'][sheets][i]['报告期'] = report_dates[i]
|
||
# 插入新的填报记录
|
||
self.db.insert_single_data(
|
||
'综信评价数据',
|
||
'填报数据',
|
||
input_template
|
||
)
|
||
|
||
def prepare_rating_record_template():
|
||
"""根据模板生成新的评价记录"""
|
||
self.rid = new_rid
|
||
self.company = company_name['企业名称']
|
||
self.project = '综合信用评价'
|
||
self.methods = '企业申报'
|
||
self.status = '进行'
|
||
self.begin_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||
rating_record_template = self.rating_info_dict_to_save()
|
||
self.db.insert_single_data(
|
||
'企业数据',
|
||
'评价记录',
|
||
rating_record_template
|
||
)
|
||
|
||
def prepare_process_template():
|
||
"""根据数据模板生成新的评价流程数据"""
|
||
process_template = get_data_template('process')
|
||
process_template['评价ID'] = new_rid
|
||
process_template['企业ID'] = self.cid
|
||
self.db.insert_single_data(
|
||
'综信评价数据',
|
||
'评价流程',
|
||
process_template
|
||
)
|
||
|
||
# 评价流程
|
||
prepare_process_template()
|
||
# 评价记录
|
||
prepare_rating_record_template()
|
||
# 填报数据
|
||
prepare_input_template()
|
||
# 风险数据
|
||
prepare_risk_data(self.cid, new_rid, company_name)
|
||
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()
|
||
|
||
def save_cc_rating_input(self, input_form):
|
||
"""保存综合填报信息"""
|
||
self.cid = self.cid
|
||
self.project = "综合信用评价"
|
||
self.status = "进行"
|
||
# 根据cid查询评价记录得到rid
|
||
find = self.rating_info_dict_to_save(columns=["企业ID", "评价项目", "进行状态"])
|
||
rid = self.db.find_single_data("企业数据", "评价记录", find, ['评价ID'])
|
||
|
||
def business_questionnaire_script():
|
||
"""财务问卷"""
|
||
business = input_form['经营问卷']
|
||
index = get_data_template('index')
|
||
for k, v in index.items():
|
||
self.__setattr__(k, business[v])
|
||
return self.business_questionnaire_dict_to_save()
|
||
|
||
def financial_report_script():
|
||
"""财务填报"""
|
||
financial = input_form['财务填报']
|
||
|
||
def balance_sheet_script():
|
||
"""资产负债表"""
|
||
balance_sheet = self.BalanceSheet()
|
||
new_balance_sheet = list()
|
||
for sheet in financial['资产负债表']:
|
||
balance_sheet.report_date = sheet['报告期']
|
||
balance_sheet.accounts_receivable = sheet['应收账款']
|
||
balance_sheet.stock = sheet['存货']
|
||
balance_sheet.total_current_assets = sheet['流动资产合计']
|
||
balance_sheet.total_assets = sheet['资产总计']
|
||
balance_sheet.short_loan = sheet['短期借款']
|
||
balance_sheet.one_year_liabilities = sheet['一年内到期非流动负债']
|
||
balance_sheet.total_current_liabilities = sheet['流动负债合计']
|
||
balance_sheet.long_term_loan = sheet['长期借款']
|
||
balance_sheet.total_liabilities = sheet['负债合计']
|
||
balance_sheet.total_owners_equity = sheet['所有者权益合计']
|
||
new_balance_sheet.append(balance_sheet.dict_to_save())
|
||
return new_balance_sheet
|
||
|
||
def income_sheet_script():
|
||
"""利润表"""
|
||
income_sheet = self.IncomeSheet()
|
||
new_income_sheet = list()
|
||
for sheet in financial['利润表']:
|
||
income_sheet.report_date = sheet['报告期']
|
||
income_sheet.operating_income = sheet['营业收入']
|
||
income_sheet.operating_cost = sheet['营业成本']
|
||
income_sheet.total_profit = sheet['利润总额']
|
||
income_sheet.net_profit = sheet['净利润']
|
||
new_income_sheet.append(income_sheet.dict_to_save())
|
||
return new_income_sheet
|
||
|
||
def appendix_sheet_script():
|
||
"""补充数据表"""
|
||
appendix_sheet = self.AppendixDataSheet()
|
||
new_appendix_sheet = list()
|
||
for sheet in financial['补充数据表']:
|
||
appendix_sheet.report_date = sheet['报告期']
|
||
appendix_sheet.rd_expenses = sheet['研发费用']
|
||
appendix_sheet.interest_disbursement = sheet['计入财务费的利息支出']
|
||
appendix_sheet.interest_expense = sheet['资本化利息支出']
|
||
new_appendix_sheet.append(appendix_sheet.dict_to_save())
|
||
return new_appendix_sheet
|
||
|
||
self.balance_sheet_list = balance_sheet_script()
|
||
self.income_sheet_list = income_sheet_script()
|
||
self.appendix_data_sheet_list = appendix_sheet_script()
|
||
return self.financial_dict_to_save()
|
||
|
||
def rating_input():
|
||
"""校验填报数据"""
|
||
self.rid = rid['评价ID']
|
||
self.cid = input_form['企业ID']
|
||
self.company = input_form['企业名称']
|
||
self.year = input_form['评价年度']
|
||
self.industry = input_form['行业选择']
|
||
self.business_questionnaire = business_questionnaire_script()
|
||
self.financial_report = financial_report_script()
|
||
input_data = self.credit_rating_dict_to_save()
|
||
self.db.update_single_data(
|
||
'综信评价数据',
|
||
'填报数据',
|
||
rid,
|
||
input_data
|
||
)
|
||
|
||
def rating_process():
|
||
"""更新评价流程"""
|
||
process = self.db.find_single_data(
|
||
'综信评价数据',
|
||
'评价流程',
|
||
rid,
|
||
['评价流程']
|
||
)
|
||
if process:
|
||
if process['评价流程']['问卷填报'] == 0:
|
||
update_process_status(rid['评价ID'], {"评价流程.问卷填报": 1})
|
||
if process['评价流程']['财务数据填报'] == 0:
|
||
update_process_status(rid['评价ID'], {"评价流程.财务数据填报": 1})
|
||
|
||
rating_input()
|
||
rating_process()
|
||
return '保存成功'
|
||
|
||
def exec_cc_rating(self):
|
||
"""提交填报数据,开始评价"""
|
||
|
||
def check_rating_record():
|
||
"""校验评价记录"""
|
||
self.project = '综合信用评价'
|
||
self.status = '进行'
|
||
find = self.rating_info_dict_to_save(columns=['企业ID', '评价项目', '进行状态'])
|
||
record = self.db.find_single_data(
|
||
'企业数据',
|
||
'评价记录',
|
||
find,
|
||
['评价ID']
|
||
)
|
||
return record
|
||
|
||
rid = check_rating_record()
|
||
self.submit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||
update_time = self.rating_info_dict_to_save(columns=['提交填报时间'])
|
||
self.db.update_single_data('企业数据', '评价记录', rid, update_time)
|
||
if not rid:
|
||
return "没有正在进行的评价", 200
|
||
|
||
def get_rating_data():
|
||
"""获取打分需要的数据"""
|
||
input_data = self.db.find_single_data(
|
||
'综信评价数据',
|
||
'填报数据',
|
||
rid,
|
||
["评价ID", "企业ID", "企业名称", "评价年度", "行业选择", "经营问卷", "财务填报"]
|
||
)
|
||
risk_data = self.db.find_single_data(
|
||
'综信评价数据',
|
||
'风险数据',
|
||
rid,
|
||
["经营风险", "合规风险", "关联风险"]
|
||
)
|
||
return {**input_data, **{"风险数据": risk_data}}
|
||
|
||
rating_input = get_rating_data()
|
||
|
||
def general_model():
|
||
"""打分模型"""
|
||
url = "https://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_input})
|
||
res = requests.post(url, headers=headers, data=data)
|
||
if res.status_code == 200:
|
||
update_data = {
|
||
"评价结果": json.loads(res.text)['result'],
|
||
}
|
||
self.db.update_single_data("企业数据", "评价记录", rid, update_data)
|
||
update_process_status(rid['评价ID'], {"评价流程.模型打分": 1})
|
||
return True
|
||
else:
|
||
update_process_status(rid['评价ID'], {"评价流程.模型打分": -1})
|
||
return False
|
||
|
||
def gen_report():
|
||
"""生成报告"""
|
||
url = "https://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_input['企业名称'],
|
||
"cid": rating_input['企业ID'],
|
||
"rid": rating_input['评价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']
|
||
}
|
||
self.db.update_single_data("企业数据", "评价记录", rid, update_data)
|
||
update_process_status(rid['评价ID'], {"评价流程.报告生成": 1})
|
||
return True
|
||
else:
|
||
update_process_status(rid['评价ID'], {"评价流程.报告生成": -1})
|
||
return False
|
||
|
||
def gen_certified():
|
||
"""生成证书"""
|
||
url = "https://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_input['企业名称'],
|
||
"cid": rating_input['企业ID'],
|
||
"rid": rating_input['评价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']
|
||
}
|
||
self.db.update_single_data("企业数据", "评价记录", rid, update_data)
|
||
update_process_status(rid['评价ID'], {"评价流程.证书生成": 1})
|
||
return True
|
||
else:
|
||
update_process_status(rid['评价ID'], {"评价流程.证书生成": -1})
|
||
return False
|
||
|
||
def company_index():
|
||
url = "https://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_input['评价ID']
|
||
}
|
||
res = requests.post(url, headers=headers, data=json.dumps(data))
|
||
if res.status_code == 200:
|
||
update_process_status(rid['评价ID'], {"评价流程.综合信用评价主页": 1})
|
||
update_process_status(rid['评价ID'], {"评价流程.财务要素评价主页": 1})
|
||
update_process_status(rid['评价ID'], {"评价流程.公司风险分析主页": 1})
|
||
return True
|
||
else:
|
||
update_process_status(rid['评价ID'], {"评价流程.综合信用评价主页": -1})
|
||
return False
|
||
|
||
if not general_model():
|
||
return "打分失败", 210
|
||
|
||
if not gen_report():
|
||
return "生成报告失败", 210
|
||
|
||
if not gen_certified():
|
||
return "生成证书失败", 210
|
||
|
||
if not company_index():
|
||
return "准备主页数据失败", 210
|
||
|
||
# 更新完成时间和进行状态
|
||
self.finish_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||
self.finish_date = time.strftime("%Y-%m-%d", time.localtime())
|
||
update_time = self.rating_info_dict_to_save(columns=['评价完成时间', '评价完成日期'])
|
||
self.db.update_single_data('企业数据', '评价记录', rid, update_time)
|
||
self.db.update_single_data("企业数据", "评价记录", rid, {"进行状态": "完成"})
|
||
|
||
return "执行成功", 200
|
||
|
||
def questionnaire_obj(self):
|
||
"""问卷选择"""
|
||
def company_type():
|
||
"""获取企业类型"""
|
||
industrys = self.db.find_single_data(
|
||
'综信评价数据',
|
||
'填报数据',
|
||
{'企业ID': self.cid, '评价年度': get_current_year()},
|
||
['行业选择']
|
||
)
|
||
if not len(industrys['行业选择']) > 1:
|
||
return None
|
||
else:
|
||
return industrys['行业选择'][0]
|
||
|
||
industry = company_type()
|
||
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
|
||
|
||
@staticmethod
|
||
def choose_industry():
|
||
"""行业选择接口"""
|
||
industry_json = get_data_template('industry')
|
||
return industry_json
|
||
|
||
|