You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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