356 lines
12 KiB
Python
356 lines
12 KiB
Python
import sys
|
|
|
|
from fastapi import FastAPI,File, UploadFile,Form
|
|
from fastapi.staticfiles import StaticFiles
|
|
import sys
|
|
import os
|
|
import shutil
|
|
from pydantic import BaseModel, validator
|
|
from typing import List
|
|
from fastapi import FastAPI, HTTPException
|
|
import asyncio
|
|
import pandas as pd
|
|
import numpy as np
|
|
from PIL import Image
|
|
# 获取当前脚本所在目录
|
|
print("Current working directory:", os.getcwd())
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
# 添加环境变量路径
|
|
sys.path.append(os.path.join(current_dir))
|
|
print("Current sys.path:", sys.path)
|
|
import torch
|
|
from dimaoshibie import segformer
|
|
from wudingpv.taihuyuan_roof.manet.model.resunet import resUnetpamcarb as roof_resUnetpamcarb
|
|
from wudingpv.predictandeval_util import segmentation
|
|
from guangfufadian import model_base as guangfufadian_model_base
|
|
from fenglifadian import model_base as fenglifadian_model_base
|
|
from work_util import prepare_data,model_deal,params,data_util,post_model
|
|
from work_util.logger import logger
|
|
import joblib
|
|
import mysql.connector
|
|
import uuid
|
|
|
|
version = f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
# 将 /root/app 目录挂载为静态文件
|
|
app.mount("/files", StaticFiles(directory="/root/app"), name="files")
|
|
|
|
@app.get("/")
|
|
async def read_root():
|
|
message = f"Hello world! From FastAPI running on Uvicorn with Gunicorn. Using Python {version}"
|
|
return {"message": message}
|
|
|
|
|
|
|
|
# 获取数据界面资源信息
|
|
@app.get("/api/data_source/show")
|
|
async def get_data_source_info():
|
|
sql = "SELECT id,application_name, task_type, sample_name, img_url, time, download_url FROM data_samples"
|
|
data = data_util.fetch_data(sql)
|
|
data = data_util.generate_json_data_source(data)
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
# 获取应用界面资源信息
|
|
@app.get("/api/app_source/show")
|
|
async def get_app_source_info():
|
|
sql = "SELECT id,application_name, task_type, sample_name, img_url, time FROM app_samples"
|
|
data = data_util.fetch_data(sql)
|
|
data = data_util.generate_json_app_source(data)
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
|
|
# 获取煤基碳材料界面资源信息
|
|
@app.get("/api/mjtcl_source/show")
|
|
async def get_mjtcl_source_info():
|
|
sql = "SELECT id,application_name, task_type, sample_name, img_url, time FROM meijitancailiao_samples"
|
|
data = data_util.fetch_data(sql)
|
|
data = data_util.generate_json_meijitancailiao_source(data)
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
# 获取煤热解界面资源信息
|
|
@app.get("/api/mrj_source/show")
|
|
async def get_mrj_source_info():
|
|
sql = "SELECT id,application_name, task_type, sample_name, img_url, time FROM meirejie_samples"
|
|
data = data_util.fetch_data(sql)
|
|
data = data_util.generate_json_meirejie_source(data)
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
"""煤基碳材料输入特征说明接口列表
|
|
type = {zongkongtiji,zongbiaomianji,tancailiao,meiliqing,moniqi}
|
|
"""
|
|
@app.get("/api/mjt_feature/show")
|
|
async def get_mjt_feature_info(type:str = None):
|
|
# if type in ["tancailiao","meiliqing"]:
|
|
# sql = "SELECT type, chinese_name, col_name, data_type, unit FROM meijitancailiao_features where use_type = %s;"
|
|
# else:
|
|
sql = "SELECT type, chinese_name, col_name, data_type, unit, data_scale FROM meijitancailiao_features where use_type = %s;"
|
|
data = data_util.fetch_data_with_param(sql,(type,))
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
|
|
"""煤热解材料输入特征说明接口列表
|
|
type = {tar,char,gas,water}
|
|
"""
|
|
@app.get("/api/mrj_feature/show")
|
|
async def get_mrj_feature_info(type:str = None):
|
|
sql = "SELECT type, chinese_name, col_name, data_type, unit, data_scale FROM meirejie_features where use_type = %s;"
|
|
data = data_util.fetch_data_with_param(sql,(type,))
|
|
if data is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
#==========================煤基碳材料-总表面积细节接口==================================
|
|
"""
|
|
模型综合分析
|
|
"""
|
|
@app.post("/api/mjt_models_ssa/predict")
|
|
async def mjt_models_predict_ssa(content: post_model.Zongbiaomianji):
|
|
# 处理接收到的字典数据
|
|
meijiegou_test_content = pd.DataFrame([content.model_dump()])
|
|
meijiegou_test_content= meijiegou_test_content.rename(columns={"K_C":"K/C"})
|
|
new_order = ["A", "VM", "K/C", "MM", "AT", "At", "Rt"]
|
|
meijiegou_test_content = meijiegou_test_content.reindex(columns=new_order)
|
|
ssa_result = model_deal.pred_single_ssa(meijiegou_test_content)
|
|
logger.info("Root endpoint was accessed")
|
|
if ssa_result is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":ssa_result}
|
|
|
|
|
|
"""
|
|
上传文件
|
|
"""
|
|
@app.post("/api/document/upload")
|
|
async def upload_file(file: UploadFile = File(...),type: str = Form(...), ):
|
|
if not file.filename.endswith('.csv'):
|
|
raise HTTPException(status_code=400, detail="文件类型有误,必须是 CSV 文件")
|
|
upload_dir = os.path.join(current_dir,'tmp',type, str(uuid.uuid4()))
|
|
if not os.path.exists(upload_dir ):
|
|
os.makedirs(upload_dir )
|
|
# 将文件保存到指定目录
|
|
file_location = os.path.join(upload_dir , file.filename)
|
|
with open(file_location, "wb") as buffer:
|
|
shutil.copyfileobj(file.file, buffer)
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":{"location": file_location}}
|
|
|
|
|
|
"""
|
|
批量预测接口
|
|
"""
|
|
@app.get("/api/mjt_multi_ssa/predict")
|
|
async def mjt_multi_ssa_pred(model:str = None, path:str = None):
|
|
data = model_deal.get_excel_ssa(model, path)
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
|
|
#==========================煤基碳材料-总孔体积细节接口==================================
|
|
"""
|
|
模型综合分析
|
|
"""
|
|
@app.post("/api/mjt_models_tpv/predict")
|
|
async def mjt_models_predict_tpv(content: post_model.Zongbiaomianji):
|
|
# 处理接收到的字典数据
|
|
meijiegou_test_content = pd.DataFrame([content.model_dump()])
|
|
meijiegou_test_content= meijiegou_test_content.rename(columns={"K_C":"K/C"})
|
|
new_order = ["A", "VM", "K/C", "MM", "AT", "At", "Rt"]
|
|
meijiegou_test_content = meijiegou_test_content.reindex(columns=new_order)
|
|
tpv_result = model_deal.pred_single_tpv(meijiegou_test_content)
|
|
if tpv_result is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":tpv_result}
|
|
|
|
"""
|
|
批量预测接口
|
|
"""
|
|
@app.get("/api/mjt_multi_tpv/predict")
|
|
async def mjt_multi_tpv_pred(model:str = None, path:str = None):
|
|
data = model_deal.get_excel_tpv(model, path)
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
#==========================煤基碳材料-煤炭材料应用细节接口==================================
|
|
@app.post("/api/mjt_models_meitan/predict")
|
|
async def mjt_models_predict_meitan(content: post_model.Meitan):
|
|
# 处理接收到的字典数据
|
|
meijiegou_test_content = pd.DataFrame([content.model_dump()])
|
|
meijiegou_test_content= meijiegou_test_content.rename(columns={"ID_IG":"ID/IG"})
|
|
new_order = ["SSA", "TPV", "N", "O", "ID/IG", "J"]
|
|
meijiegou_test_content = meijiegou_test_content.reindex(columns=new_order)
|
|
meitan_result = model_deal.pred_single_meitan(meijiegou_test_content)
|
|
if meitan_result is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":meitan_result}
|
|
|
|
|
|
"""
|
|
批量预测接口
|
|
"""
|
|
@app.get("/api/mjt_multi_meitan/predict")
|
|
async def mjt_multi_meitan_pred(model:str = None, path:str = None):
|
|
data = model_deal.get_excel_meitan(model, path)
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
#==========================煤基碳材料-煤沥青应用细节接口==================================
|
|
@app.post("/api/mjt_models_meiliqing/predict")
|
|
async def mjt_models_predict_meiliqing(content: post_model.Meitan):
|
|
# 处理接收到的字典数据
|
|
meijiegou_test_content = pd.DataFrame([content.model_dump()])
|
|
meijiegou_test_content= meijiegou_test_content.rename(columns={"ID_IG":"ID/IG"})
|
|
new_order = ["SSA", "TPV", "N", "O", "ID/IG", "J"]
|
|
meijiegou_test_content = meijiegou_test_content.reindex(columns=new_order)
|
|
meitan_result = model_deal.pred_single_meiliqing(meijiegou_test_content)
|
|
if meitan_result is None:
|
|
return {
|
|
"success":False,
|
|
"msg":"获取信息列表失败",
|
|
"data":None
|
|
}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":meitan_result}
|
|
|
|
|
|
"""
|
|
批量预测接口
|
|
"""
|
|
@app.get("/api/mjt_multi_meiliqing/predict")
|
|
async def mjt_multi_meiliqing_pred(model:str = None, path:str = None):
|
|
data = model_deal.get_excel_meiliqing(model, path)
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":data}
|
|
|
|
|
|
|
|
|
|
#=============================煤基炭材料-制备模拟器================================================
|
|
@app.post("/api/mnq_model/analysis")
|
|
async def mnq_model_predict(return_count: int, # 返回条数
|
|
model_choice: str, # 模型选择标记
|
|
form_data: post_model.FormData # 表单数据
|
|
):
|
|
form_data = form_data.model_dump()
|
|
params = prepare_data.get_params(form_data)
|
|
pred_data = prepare_data.create_pred_data(params)
|
|
result = model_deal.pred_func(model_choice,pred_data)
|
|
sorted_result = result.sort_values(by=['SSA', 'TPV'], ascending=[False, False])
|
|
# 保留条数
|
|
if return_count is None:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":{"result": sorted_result.to_json(orient='index')}}
|
|
else:
|
|
return {"success":True,
|
|
"msg":"获取信息成功",
|
|
"data":{"result": sorted_result.head(return_count).to_json(orient='index')}}
|
|
|
|
|
|
#===================================================================================================
|
|
|
|
|
|
# @app.post("/api/items/")
|
|
# async def create_item(item: post_model.Zongbiaomianji):
|
|
# try:
|
|
# data = {
|
|
# "type": type(item).__name__, # 返回类型名称
|
|
# "received_data": item.model_dump() # 使用 model_dump() 方法
|
|
# }
|
|
# print(pd.DataFrame([item.model_dump()]))
|
|
# # 返回接收到的数据
|
|
# return data
|
|
# except Exception as e:
|
|
# # 记录错误信息
|
|
# logger.error(f"Error occurred: {e}")
|