# -*- coding: utf-8 -*- # @Time : 2023/8/8 16:40 # @Author : tx # @File : msds.py # @Description : import datetime import os import subprocess from fastapi import APIRouter, Depends, File, Request, UploadFile from starlette.responses import FileResponse from tortoise.queryset import QuerySet, Q from fastapi.encoders import jsonable_encoder from helper import login_required, respond_to from models import Msds router = APIRouter(prefix='/msds', dependencies=[Depends(login_required)]) @router.get('', summary='msds数据库') async def index(keyword: str = '', page_no: int = 1, page_size: int = 10): """ 获取msds数据库 :param keyword: 按药剂信息搜索 :param page_no: 分页页码,默认为1 :param page_size: 分页大小,默认为10 :return: """ offset = (page_no - 1) * page_size query = QuerySet(Msds) if keyword: query = query.filter(Q(name__contains=keyword) | Q(english_name__contains=keyword)) count = await query.count() msds_objs = await query.limit(page_size).offset(offset) result_list = jsonable_encoder(msds_objs) return respond_to(data={'data': result_list, 'count': count}) @router.post('/import', summary='新增msds/上传msds附件') async def create(request: Request, drug_name: str, cas_number: str, file: UploadFile = File(...)): """ :param request: 请求 :param id: 药剂模板ID :param file: 模板文件 """ if not (file.filename and file.filename.rsplit('.', 1)[1].lower() in ['pdf']): return respond_to(code=400, desc='请上传正确的文件格式') current_user = request.state.current_user try: current_month = datetime.datetime.now().strftime("%Y-%m") save_folder = os.path.join("/static/msds_file", current_month) os.makedirs(save_folder, exist_ok=True) save_path = os.path.join(save_folder, file.filename) if os.path.exists(save_path): return respond_to(code=400, desc='同名附件已存在,上传失败') with open(save_path, "wb") as buffer: buffer.write(await file.read()) except Exception as e: print("附件上传有误e", e) return respond_to(code=400, desc='附件上传有误') msds = { "upload_user_id": current_user.id, "upload_at": datetime.datetime.now(), "path": os.path.abspath(save_folder), "file_name": file.filename, "name": drug_name, "cas_number": cas_number } data = await Msds.create(**msds) return respond_to(data=data) @router.get("/pdf/{filename:path}", summary='附件查看') async def read_pdf(filename: str): # 调用函数获取并删除数据 file_path = os.getcwd()+f"/static/{filename}" try: if os.name == 'posix': # Linux系统 os.system(f"xdg-open {file_path}") elif os.name == 'nt': # Windows系统 os.startfile(file_path) else: print("不支持的操作系统") except Exception as e: print(f"打开文件失败: {e}")