tfse-app-api-v0.2/Rating/Credit/CreditImpl.py

640 lines
28 KiB
Python
Raw Normal View History

2022-04-13 17:06:01 +08:00
import time
import json
import random
import requests
from DBHelper.MongoHelper import MongoHelper
from Rating.Credit.CreditObj import RatingRecord, CreditInputData, FinancialReport, BusinessQuestionnaire, BalanceSheet, \
IncomeSheet, AppendixDataSheet
from Rating.Process.ProcessObj import CreditProcess
2022-04-18 16:52:54 +08:00
from Rating.Questionnaire.QuestionObj import SingleChoiceQuestion, MultipleChoiceQuestion, FillInTheBlank
from Utils.ErrorUtil import ReturnConditionCheckFailed, ReturnConditionCheckFailed
2022-04-13 17:06:01 +08:00
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
2022-04-14 17:02:47 +08:00
def update_process_status(rid, update_data):
2022-04-13 17:06:01 +08:00
"""
调用更新流程接口
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 CreditRating(CreditInputData, CreditUtils):
"""综合信用评价"""
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, "评价年度": 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: 填报数据模板
"""
self.rid = new_rid
self.cid = self.cid
self.company = company_name['企业名称']
self.year = self.get_current_year()
2022-04-14 17:02:47 +08:00
self.industry = list()
def balance():
"""资产负债表"""
balance_sheet = BalanceSheet()
balance_sheet.report_date = None
balance_sheet.accounts_receivable = None
balance_sheet.stock = None
balance_sheet.total_current_assets = None
balance_sheet.total_assets = None
balance_sheet.short_loan = None
balance_sheet.one_year_liabilities = None
balance_sheet.total_current_liabilities = None
balance_sheet.long_term_loan = None
balance_sheet.total_liabilities = None
balance_sheet.total_owners_equity = None
return balance_sheet.dict_to_save()
def income():
"""利润表"""
income_sheet = IncomeSheet()
income_sheet.report_date = None
income_sheet.operating_income = None
income_sheet.operating_cost = None
income_sheet.total_profit = None
income_sheet.net_profit = None
return income_sheet.dict_to_save()
def appendix():
"""补充数据表"""
appendix_sheet = AppendixDataSheet()
appendix_sheet.report_date = None
appendix_sheet.rd_expenses = None
appendix_sheet.interest_disbursement = None
appendix_sheet.interest_expense = None
return appendix_sheet.dict_to_save()
def financial():
"""财务填报"""
financial_report = FinancialReport()
financial_report.balance_sheet_list = list()
financial_report.income_sheet_list = list()
financial_report.appendix_data_sheet_list = list()
for n in range(3):
b = balance()
b['报告期'] = report_dates[n]
i = income()
i['报告期'] = report_dates[n]
a = appendix()
a['报告期'] = report_dates[n]
financial_report.balance_sheet_list.append(b)
financial_report.income_sheet_list.append(i)
financial_report.appendix_data_sheet_list.append(a)
return financial_report
self.financial_report = financial()
2022-04-13 17:06:01 +08:00
self.business_questionnaire = list()
2022-04-14 17:02:47 +08:00
input_template = self.dict_to_save()
2022-04-13 17:06:01 +08:00
# 插入新的填报记录
self.db.insert_single_data(
'综信评价数据',
'填报数据',
input_template
)
def prepare_rating_record_template():
"""根据模板生成新的评价记录"""
rating_record = RatingRecord()
rating_record.rid = new_rid
2022-04-14 17:02:47 +08:00
rating_record.cid = self.cid
2022-04-13 17:06:01 +08:00
rating_record.company = company_name['企业名称']
rating_record.project = '综合信用评价'
rating_record.methods = '企业申报'
rating_record.status = '进行'
2022-04-14 17:02:47 +08:00
rating_record.result = None
rating_record.report_fid = None
rating_record.certificate_fid = None
2022-04-13 17:06:01 +08:00
rating_record.begin_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
2022-04-14 17:02:47 +08:00
rating_record.submit_time = None
rating_record.finish_time = None
rating_record.finish_date = None
2022-04-13 17:06:01 +08:00
rating_record_template = rating_record.dict_to_save()
self.db.insert_single_data(
'企业数据',
'评价记录',
rating_record_template
)
def prepare_process_template():
"""根据数据模板生成新的评价流程数据"""
credit_process = CreditProcess()
credit_process.fill_in_questionnaire = 0
credit_process.fill_in_financial_data = 0
credit_process.clean_risk_data = 0
credit_process.model_scoring = 0
credit_process.report_generation = 0
credit_process.certificate_generation = 0
credit_process.cc_evaluation_homepage = 0
credit_process.fe_evaluation_homepage = 0
credit_process.cr_analysis_homepage = 0
credit_process.am_details_homepage = 0
process_template = dict()
process_template['评价ID'] = new_rid
process_template['企业ID'] = self.cid
2022-04-14 17:02:47 +08:00
process_template['评价流程'] = credit_process.dict_to_save()
2022-04-13 17:06:01 +08:00
self.db.insert_single_data(
'综信评价数据',
'评价流程',
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()
2022-04-14 17:02:47 +08:00
def save_cc_rating_input(self, input_form):
"""保存综合填报信息"""
# 根据cid查询评价记录得到rid
find = {"企业ID": self.cid, "评价项目": "综合信用评价", "进行状态": "进行"}
rid = self.db.find_single_data("企业数据", "评价记录", find, ['评价ID'])
if not rid:
return "没有正在进行的评价", 200
def handle_input_form():
"""处理表单数据"""
2022-04-14 17:02:47 +08:00
def questionnarie():
"""经营问卷"""
questionnarie_data = input_form['经营问卷']
new_questionnaire = list()
for item in questionnarie_data:
if isinstance(item, float) or isinstance(item, int) or item == 0:
item = float(item)
new_questionnaire.append(item)
else:
new_questionnaire.append(item)
input_form['经营问卷'] = new_questionnaire
def financial():
"""财务填报"""
financial_data = input_form['财务填报']
for sheet in ['资产负债表', '利润表', '补充数据表']:
for item in financial_data[sheet]:
for key, value in item.items():
if isinstance(value, float) or isinstance(value, int) or value == 0:
item[key] = float(value)
questionnarie()
financial()
2022-04-14 17:02:47 +08:00
def business_questionnaire_script():
"""经营问卷"""
2022-04-18 22:51:22 +08:00
if input_form['行业选择'] and input_form['经营问卷']:
2022-04-18 16:52:54 +08:00
industry = input_form['行业选择'][0]
questionnarie = self.db.find_single_data(
'模型端',
'综信评价问卷',
{'行业': industry},
['问卷内容']
)
answers = input_form['经营问卷']
new_questionnaire = list()
new_answers = list()
# 整合问卷对象
for index in range(len(questionnarie['问卷内容'])):
new_questionnaire.extend(questionnarie['问卷内容'][index]['children'])
# 遍历问卷对象
for _index in range(len(new_questionnaire)):
item = new_questionnaire[_index]
if item['type'] == '单选题':
scq = SingleChoiceQuestion()
# 答案范围
for option in item['option']:
scq.in_list.append(option['index'])
scq.question = answers[_index]
new_answers.append(scq.dict_to_save()['问卷答案'])
elif item['type'] == '多选题':
mcq = MultipleChoiceQuestion()
# 答案范围
for option in item['option']:
mcq.in_list.append(option['index'])
mcq.question = answers[_index]
new_answers.append(mcq.dict_to_save()['问卷答案'])
else:
ftb = FillInTheBlank()
ftb.question = answers[_index]
new_answers.append(ftb.dict_to_save()['问卷答案'])
return new_answers
else:
business = input_form['经营问卷']
return business
2022-04-14 17:02:47 +08:00
def financial_report_script():
"""财务填报"""
financial = input_form['财务填报']
def balance_sheet_script():
"""资产负债表"""
balance_sheet = BalanceSheet()
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['所有者权益合计']
financial_report.balance_sheet_list.append(balance_sheet.dict_to_save())
2022-04-14 17:02:47 +08:00
def income_sheet_script():
"""利润表"""
income_sheet = IncomeSheet()
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['净利润']
financial_report.income_sheet_list.append(income_sheet.dict_to_save())
2022-04-14 17:02:47 +08:00
def appendix_sheet_script():
"""补充数据表"""
appendix_sheet = AppendixDataSheet()
for sheet in financial['补充数据表']:
appendix_sheet.report_date = sheet['报告期']
appendix_sheet.rd_expenses = sheet['研发费用']
appendix_sheet.interest_disbursement = sheet['计入财务费的利息支出']
appendix_sheet.interest_expense = sheet['资本化利息支出']
financial_report.appendix_data_sheet_list.append(appendix_sheet.dict_to_save())
2022-04-14 17:02:47 +08:00
financial_report = FinancialReport()
financial_report.balance_sheet_list = list()
financial_report.income_sheet_list = list()
financial_report.appendix_data_sheet_list = list()
balance_sheet_script()
income_sheet_script()
appendix_sheet_script()
2022-04-14 17:02:47 +08:00
return financial_report
def rating_input():
"""校验填报数据"""
self.rid = rid['评价ID']
self.cid = self.cid
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.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:
self.update_process_status(rid['评价ID'], {"评价流程.问卷填报": 1})
if process['评价流程']['财务数据填报'] == 0:
self.update_process_status(rid['评价ID'], {"评价流程.财务数据填报": 1})
2022-04-13 17:06:01 +08:00
2022-04-14 17:02:47 +08:00
handle_input_form()
rating_input()
rating_process()
return '保存成功'
def exec_cc_rating(self):
"""提交填报数据,开始评价"""
# 根据cid查询评价记录得到rid
find = {"企业ID": self.cid, "评价项目": "综合信用评价", "进行状态": "进行"}
rid = self.db.find_single_data("企业数据", "评价记录", find, ['评价ID'])
if not rid:
return "没有正在进行的评价", 200
self.db.update_single_data(
'企业数据', '评价记录', rid,
{"提交填报时间": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())})
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)
self.update_process_status(rid['评价ID'], {"评价流程.模型打分": 1})
else:
self.update_process_status(rid['评价ID'], {"评价流程.模型打分": -1})
raise ReturnConditionCheckFailed("模型"
"打分失败", 200)
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)
self.update_process_status(rid['评价ID'], {"评价流程.报告生成": 1})
else:
self.update_process_status(rid['评价ID'], {"评价流程.报告生成": -1})
raise ReturnConditionCheckFailed("生成报告失败", 200)
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)
self.update_process_status(rid['评价ID'], {"评价流程.证书生成": 1})
else:
self.update_process_status(rid['评价ID'], {"评价流程.证书生成": -1})
raise ReturnConditionCheckFailed("生成证书失败", 200)
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:
self.update_process_status(rid['评价ID'], {"评价流程.综合信用评价主页": 1})
self.update_process_status(rid['评价ID'], {"评价流程.财务要素评价主页": 1})
self.update_process_status(rid['评价ID'], {"评价流程.公司风险分析主页": 1})
else:
self.update_process_status(rid['评价ID'], {"评价流程.综合信用评价主页": -1})
raise ReturnConditionCheckFailed("生成主页数据失败", 200)
def update_rating_records():
"""更新完成时间和进行状态"""
finish_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
finish_date = time.strftime("%Y-%m-%d", time.localtime())
update_data = {"进行状态": "完成", "评价完成时间": finish_time, "评价完成日期": finish_date}
self.db.update_single_data('企业数据', '评价记录', rid, update_data)
def __main__():
general_model()
gen_report()
gen_certified()
company_index()
update_rating_records()
__main__()
2022-04-24 10:09:31 +08:00
return '执行成功', 200
2022-04-18 16:52:54 +08:00
def choose_industry(self):
"""选择行业"""
2022-04-22 15:09:59 +08:00
name = self.db.find_single_data('企业数据', '企业数据_更新汇总', {"企业ID": self.cid}, ['一级行业'])['一级行业']
2022-04-18 16:52:54 +08:00
industry = self.db.find_single_data('模型端', '综信评价行业分类', {}, ['行业'])
new_industry = list()
2022-04-22 15:09:59 +08:00
insert_dict = dict()
insert_dict['value'] = name
insert_dict['children'] = list()
for item in industry['行业'][name]:
_dict = dict()
_dict['value'] = item
insert_dict['children'].append(_dict)
new_industry.append(insert_dict)
2022-04-18 16:52:54 +08:00
return new_industry
def questionnaire_obj(self):
"""问卷选择"""
industry = self.db.find_single_data(
'综信评价数据',
'填报数据',
{'企业ID': self.cid, '评价年度': self.get_current_year()},
['行业选择']
)
if not len(industry['行业选择']) > 1:
return {"info": "未查询到此行业相关问卷", "result": []}
else:
questionnaire = self.db.find_single_data(
'模型端',
'综信评价问卷',
{'行业': industry['行业选择'][0]},
['问卷内容']
)
return {"info": "行业问卷", "result": questionnaire['问卷内容']}