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 = "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()}