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