214 lines
7.1 KiB
Python
214 lines
7.1 KiB
Python
import datetime
|
|
import json
|
|
import sys
|
|
from fastapi import HTTPException
|
|
from sqlalchemy.orm import Session
|
|
|
|
from context.common import tianyancha_api
|
|
from utils.data_utils import JsDict
|
|
from utils.print_utils import print_error
|
|
from utils.rate_utils import parse_file_data_interface, bj_rate_interface
|
|
from . import schemas
|
|
from .models import CompanyRate
|
|
from ..form_file import crud as FormFileCrud
|
|
from .pytypes.BjRateRes import BjRateRes
|
|
from .utils import excel_data_to_model_data_bj, cal_tiaozhengxiang
|
|
from .rate_utils.utils import load_api_data
|
|
|
|
bj_model_dict = {}
|
|
man_data_dict = {}
|
|
|
|
|
|
def load_bj_model_dict():
|
|
data = json.load(open('static/bj_model.json', 'rb'))
|
|
for item in data['model']['columns']:
|
|
bj_model_dict[item['key']] = None
|
|
for item in data['尽调核实数据']['定性指标']['columns']:
|
|
man_data_dict[item['key']] = None
|
|
bj_model_dict[item['key']] = None
|
|
|
|
|
|
load_bj_model_dict()
|
|
|
|
|
|
def company_rate_add(db: Session, data: schemas.CompanyRateAddInfo):
|
|
file_info = FormFileCrud.file_get(db, data.file_md)
|
|
file_data = None
|
|
wj_data = None
|
|
try:
|
|
file_path = file_info.file_url
|
|
file_data = parse_file_data_interface(file_path[1:])
|
|
wj_data = json.dumps(excel_data_to_model_data_bj(file_data))
|
|
file_data = json.dumps(file_data)
|
|
except Exception as e:
|
|
print_error(e)
|
|
sys.stderr.write(str(e))
|
|
raise HTTPException(detail='文件解析错误,请重新上传', status_code=301)
|
|
item = CompanyRate(**data.dict())
|
|
item.file_data = file_data
|
|
item.wj_data = wj_data
|
|
item.man_data = json.dumps(man_data_dict)
|
|
item.rate_state = '未评级'
|
|
item.publish_state = '未披露'
|
|
db.add(item)
|
|
db.commit()
|
|
db.refresh(item)
|
|
marge_data_to_db(db, item.id)
|
|
db.refresh(item)
|
|
return item
|
|
|
|
|
|
def company_rate_delete(db: Session, item_id: int):
|
|
db.query(CompanyRate).filter_by(id=item_id).delete()
|
|
db.commit()
|
|
|
|
|
|
def company_rate_update(db: Session, data: schemas.CompanyRateUpdateInfo):
|
|
db.query(CompanyRate).filter_by(id=data.id).update({key: v for key, v in data.dict().items() if v is not None})
|
|
db.commit()
|
|
item = db.query(CompanyRate).filter_by(id=data.id).first()
|
|
marge_data_by_item(db, item)
|
|
db.commit()
|
|
db.refresh(item)
|
|
return item
|
|
|
|
|
|
def company_rate_get(db: Session, item_id: int):
|
|
item = db.query(CompanyRate).filter_by(id=item_id).first()
|
|
return item
|
|
|
|
|
|
def company_rate_query(db: Session, params: schemas.CompanyRateQuery):
|
|
params_dict = params.dict()
|
|
query = db.query(CompanyRate)
|
|
db_model = CompanyRate
|
|
for key, value in params_dict.items():
|
|
if key not in ['page', 'page_size'] and value is not None:
|
|
if key == 'rate_level':
|
|
query = query.filter(getattr(db_model, key) == value)
|
|
continue
|
|
if type(value) == str:
|
|
query = query.filter(getattr(db_model, key).like(f'%{value}%'))
|
|
elif type(value) in [int, float, bool]:
|
|
query = query.filter_by(**{key: value})
|
|
else:
|
|
query = query.filter(getattr(db_model, key) == value)
|
|
count = query.count()
|
|
page = None
|
|
page_size = None
|
|
if 'page' in params_dict:
|
|
page = params_dict['page']
|
|
if 'page_size' in params_dict:
|
|
page_size = params_dict['page_size']
|
|
# 页数不超过100
|
|
if page is not None and page_size is not None:
|
|
page_size = min(page_size, 100)
|
|
query = query.offset((page - 1) * page_size).limit(page_size).all()
|
|
return count, query
|
|
|
|
|
|
def json_parse(data):
|
|
parse_data = {}
|
|
try:
|
|
if data:
|
|
parse_data = json.loads(data)
|
|
except Exception as e:
|
|
print(e)
|
|
raise HTTPException(detail="数据解析错误", status_code=301)
|
|
finally:
|
|
return parse_data
|
|
|
|
|
|
def parse_file_data_to_db(db: Session, item_id):
|
|
item = company_rate_get(db, item_id)
|
|
if item and item.file_md:
|
|
file_info = FormFileCrud.file_get(db, item.file_md)
|
|
if file_info:
|
|
file_path = file_info.file_url
|
|
file_data = parse_file_data_interface(file_path)
|
|
item.file_data = json.dumps(file_data)
|
|
item.wj_data = json.dumps(excel_data_to_model_data_bj(file_data))
|
|
db.commit()
|
|
|
|
|
|
def load_api_data_to_db(db: Session, item_id):
|
|
item = company_rate_get(db, item_id)
|
|
if item:
|
|
# item.api_data = json.dumps(load_api_data(item.company_name, json.loads(item.wj_data) if item.wj_data else {}))
|
|
item.api_data = json.dumps(load_api_data(item.company_name))
|
|
marge_data_by_item(db, item)
|
|
db.commit()
|
|
db.refresh(item)
|
|
return item
|
|
|
|
|
|
def marge_data_to_db(db: Session, item_id):
|
|
"""
|
|
合并数据
|
|
"""
|
|
item = company_rate_get(db, item_id)
|
|
if item:
|
|
marge_data_by_item(db, item)
|
|
|
|
|
|
def marge_data_by_item(db: Session, item):
|
|
wj_data = json_parse(item.wj_data)
|
|
api_data = json_parse(item.api_data)
|
|
man_data = json_parse(item.man_data)
|
|
mgr_data = {**bj_model_dict, **wj_data, **api_data, **{k: v for k, v in man_data.items() if v is not None}}
|
|
item.mgr_data = json.dumps(mgr_data)
|
|
mgr_data_state = '已就绪'
|
|
for key, v in mgr_data.items():
|
|
if v in [None]:
|
|
mgr_data_state = '未就绪'
|
|
break
|
|
item.mgr_data_state = mgr_data_state
|
|
db.commit()
|
|
|
|
|
|
def company_rate(db: Session, item_id):
|
|
item = company_rate_get(db, item_id)
|
|
if item.mgr_data_state == '已就绪':
|
|
data = bj_rate_interface(json.loads(item.mgr_data))
|
|
data: BjRateRes = JsDict(data)
|
|
if data:
|
|
mgr_data = json.loads(item.mgr_data)
|
|
tzx_dic = cal_tiaozhengxiang(mgr_data)
|
|
data.content['调整项'] = tzx_dic
|
|
final_scope = data.content.total_score
|
|
for key in tzx_dic:
|
|
final_scope += tzx_dic[key]['scope']
|
|
data.content['final_scope'] = final_scope
|
|
if final_scope >= 90:
|
|
level = "AAAʀ"
|
|
elif 80 <= final_scope < 90:
|
|
level = "AAʀ"
|
|
elif 65 <= final_scope < 80:
|
|
level = "Aʀ"
|
|
elif 50 <= final_scope < 65:
|
|
level = "Bʀ"
|
|
else:
|
|
level = "CR"
|
|
data.content['final_level'] = level
|
|
item.rate_data = json.dumps(data)
|
|
item.rate_level = level
|
|
item.rate_time = datetime.datetime.now()
|
|
item.rate_state = '已评级'
|
|
db.commit()
|
|
else:
|
|
raise HTTPException(detail='数据不完整,无法评分', status_code=301)
|
|
################
|
|
|
|
|
|
def get_full_info(db: Session, item_id: int):
|
|
item = company_rate_get(db, item_id)
|
|
if not item:
|
|
return {}
|
|
data = json.loads(item.rate_data)
|
|
radar_data = data['content']['radar_data']
|
|
radar_data_new = []
|
|
for key in radar_data['数值']:
|
|
radar_data_new.append({'label': key, 'value': radar_data['数值'][key] / radar_data['阈值'][key] * 100})
|
|
baseinfo, _ = tianyancha_api.get('企业基本信息', {'keyword': item.company_name})
|
|
return {'baseinfo': baseinfo, 'radar_data': radar_data_new, 'rate_full_data': item.to_dict()}
|