import math from fastapi import APIRouter, UploadFile, File, Depends, HTTPException import pandas as pd from sqlalchemy.orm import Session from Crud import ProjectCrud from Schemas import ProjectSchemas from Utils.SqlAlchemyUtils import get_db router = APIRouter( tags=["项目数据"], prefix="/api/project", ) @router.post("/upload", summary='项目录入', description='录入项目数据') async def func(file: UploadFile = File(...), db: Session = Depends(get_db)): # 使用 Pandas 读取 Excel 文件 df = pd.read_csv(file.file) for index, row in df.iterrows(): insert = { "project": row[0], "client": row[1], "client_labels": row[2].strip("[]").replace("'", ""), "project_type": row[3].strip("[]").replace("'", ""), "project_labels": row[4].strip("[]").replace("'", ""), "project_status": row[5], "start_date": row[6], "finish_date": row[7], "amount": row[8], "master": row[9], "participants": row[10].strip("[]").replace("'", ""), "departments": row[11].strip("[]").replace("'", ""), "remarks": None } for key, val in insert.items(): if isinstance(insert.get(key), str): continue elif insert.get(key) is None: continue elif math.isnan(insert.get(key)): insert[key] = None ProjectCrud.insert_data(db, insert) return { "code": 200, "message": "录入成功", "content": {} } @router.put("/edit", summary='项目编辑', description='编辑项目数据') def func(project_id: int, project_info: ProjectSchemas.EditProjectInfo, db: Session = Depends(get_db)): result = ProjectCrud.edit_data(db, project_id, project_info) if not result: raise HTTPException(status_code=404, detail="id不存在") return { "code": 200, "message": "编辑成功", "content": result } @router.post("/query_by_department", summary='部门项目查询', description='查询项目数据') def func(schema: ProjectSchemas.QueryProjectByDepartment, db: Session = Depends(get_db)): result = ProjectCrud.query_data_by_department(db, schema) if not result: raise HTTPException(status_code=404, detail="部门不存在") return { "code": 200, "message": "查询成功", "content": result } @router.post("/query_by_id", summary='id查询项目', description='查询项目数据') def func(project_id: int, db: Session = Depends(get_db)): result = ProjectCrud.query_data_by_id(db, project_id) if not result: raise HTTPException(status_code=404, detail="id不存在") return { "code": 200, "message": "查询成功", "content": result } @router.post("/query_by_pie", summary='累计收入业务数量查询', description='查询项目数据') def func(schema: ProjectSchemas.QueryProjectByType, db: Session = Depends(get_db)): result = ProjectCrud.query_data_for_pie(db, schema) if not result: raise HTTPException(status_code=404, detail="类别不存在") return { "code": 200, "message": "查询成功", "content": result } @router.post("/query_by_bar", summary='收入同比业务分类查询', description='查询项目数据') def func(schema: ProjectSchemas.QueryProjectByType, db: Session = Depends(get_db)): result = ProjectCrud.query_data_for_bar(db, schema) if not result: raise HTTPException(status_code=404, detail="类别不存在") return { "code": 200, "message": "查询成功", "content": result }