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

269 lines
11 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 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
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(self, 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 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()
financial_report = FinancialReport()
financial_report.balance_sheet_list = list()
financial_report.income_sheet_list = list()
financial_report.appendix_data_sheet_list = list()
balance_sheet = BalanceSheet()
income_sheet = IncomeSheet()
appendix_sheet = AppendixDataSheet()
for n in range(3):
financial_report.balance_sheet_list.append(balance_sheet.dict_to_save())
financial_report.income_sheet_list.append(income_sheet.dict_to_save())
financial_report.appendix_data_sheet_list.append(appendix_sheet.dict_to_save())
for i in range(3):
financial_report.balance_sheet_list[i]['报告期'] = report_dates[i]
financial_report.income_sheet_list[i]['报告期'] = report_dates[i]
financial_report.appendix_data_sheet_list[i]['报告期'] = report_dates[i]
self.financial_report = financial_report
input_template = self.dict_to_save()
self.business_questionnaire = list()
# 插入新的填报记录
self.db.insert_single_data(
'综信评价数据',
'填报数据',
input_template
)
def prepare_rating_record_template():
"""根据模板生成新的评价记录"""
rating_record = RatingRecord()
rating_record.rid = new_rid
rating_record.company = company_name['企业名称']
rating_record.project = '综合信用评价'
rating_record.methods = '企业申报'
rating_record.status = '进行'
rating_record.begin_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
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
process_template['企业评价流程ID'] = credit_process.dict_to_save()
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()