wd-smebiz/Mods/CompanyRate/Crud.py

209 lines
6.9 KiB
Python
Raw Normal View History

2023-08-02 10:18:36 +08:00
import datetime
import json
import sys
from fastapi import HTTPException
from sqlalchemy.orm import Session
from Context.common import tianyancha_api
from Utils.DataUtils import JsDict
from Utils.PrintUtils import print_error
from Utils.RateUtils import parse_file_data_interface, bj_rate_interface
from . import Schemas
from .Models import CompanyRate
from ..FormFile import Crud as FormFileCrud
from .pytypes.BjRateRes import BjRateRes
from .Utils import load_api_data, excel_data_to_model_data_bj, cal_tiaozhengxiang
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 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 {}))
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 = ""
elif 50 <= final_scope < 65:
level = ""
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()}