This commit is contained in:
王思川 2022-12-30 11:04:47 +08:00
commit e4f319cf4f
1 changed files with 82 additions and 2 deletions

View File

@ -1,7 +1,9 @@
import datetime
import math
import re
import pandas as pd
from fastapi import APIRouter, Depends, HTTPException, Header
from fastapi import APIRouter, Depends, HTTPException, Header, UploadFile, File
from sqlalchemy.orm import Session
from App.Crud import RatingFlowCrud as Crud
@ -13,6 +15,7 @@ from App.Schemas.RatingFlowSchema import Participant
from Utils.AccessControl.AccessUtil import rbac
from Utils.Authentication.TokenUtil import decode_token
from Utils.Common.RegisterUtils import request_to_get, request_to_post
from Utils.Common.Utils import CommonUtils
from Utils.DataBase.MongoHelperUtils import get_mongodb, MongoHelper
from Utils.DataBase.SqlAlchemyUtils import get_db
@ -287,6 +290,83 @@ def func(rating_flow_id: str, year: int, db: Session = Depends(get_db), mongodb:
return input_data
@router.post("/import/excel_data", summary='导入excel数据', tags=["评级节点"])
async def func(rating_flow_id: str, year: int, excel: UploadFile = File(...), db: Session = Depends(get_db),
mongodb: MongoHelper = Depends(get_mongodb)):
rf_item = Crud.get_rating_flow(db=db, rating_flow_id=rating_flow_id)
if not rf_item:
raise HTTPException(status_code=404, detail="评级流程不存在")
# 获取打分卡; scorecard: 打分卡
scorecard = request_to_get(
url='http://test.fecribd.com/api/model_store/scorecard/view?_id={}'.format(rf_item.scorecard_id)
)
if not scorecard:
raise HTTPException(status_code=404, detail="打分卡不存在")
# 获取数据表; data_table: 数据表
data_table = scorecard.get('data_table')
if not data_table:
raise HTTPException(status_code=404, detail="数据表不存在")
# 填报数据格式; 注: 只有结构没有数据; input_data: 填报数据
input_data = dict()
fmt_years = ['{}00'.format(int(rf_item.report_date.__str__()[:4]) - i) for i in range(year)]
for sheet_name, columns in data_table.items():
input_data.update({sheet_name: {}})
for fmt_year in fmt_years:
input_data[sheet_name].update({fmt_year: {}})
for column in columns:
input_data[sheet_name][fmt_year].update({column: None})
# 读取excel数据
contents = await excel.read()
data = pd.read_excel(contents, skiprows=2)
sheet = data.iloc[0, 0]
data = pd.read_excel(contents, skiprows=3)
# 行数
row = data.shape[0]
# 列数
col = data.shape[1]
finance_list = list()
# 财报数据
for num in range(1, col):
finance_dict = dict()
for row_num in range(row):
try:
if isinstance(data.iloc[row_num, 0], float):
finance_dict['截止日期'] = data.iloc[row_num, num].strftime("%Y-%m-%d")
continue
if isinstance(data.iloc[row_num, num], datetime.datetime):
finance_dict[data.iloc[row_num, 0].strip()] = data.iloc[row_num, num].strftime("%Y-%m-%d")
else:
finance_dict[data.iloc[row_num, 0].strip()] = data.iloc[row_num, num]
except AttributeError:
if isinstance(data.iloc[row_num, num], datetime.datetime):
try:
finance_dict[data.iloc[row_num, 0].strip()] = data.iloc[row_num, num].strftime("%Y-%m-%d")
except AttributeError:
finance_dict[data.iloc[row_num, 0]] = data.iloc[row_num, num].strftime("%Y-%m-%d")
else:
finance_dict[data.iloc[row_num, 0]] = data.iloc[row_num, num]
for name, info in input_data.items():
if name in sheet:
for date, content in info.items():
year = CommonUtils.date_conversion(finance_dict['截止日期'])
if date == year:
for key, value in content.items():
try:
if math.isnan(finance_dict[key]):
content[key] = None
else:
content[key] = finance_dict[key]
except KeyError:
content[key] = None
return input_data
@router.get("/import/index_data", summary="导入定性定量指标", tags=["评级节点"])
def func(rating_flow_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
# 获取流程信息; 检查流程是否存在; rf_item: 流程对象
@ -703,7 +783,7 @@ def func(rating_flow_id: str, db: Session = Depends(get_db), mongodb: MongoHelpe
if not rank_table:
raise HTTPException(status_code=404, detail="评级表不存在")
external_support = rank_table.get('外部支持')
if not rank_table:
if not external_support:
raise HTTPException(status_code=404, detail="外部支持数据不存在")
support_type = external_support.get('类型')
if not support_type: