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.

178 lines
5.7 KiB

import os
from datetime import datetime
from fastapi import APIRouter, Request, Depends
from pydantic import BaseModel
from helper import respond_to
from helper import usb, login_required
from models import Template, StorageForm, Dictionary
from models.drug import Drug
router = APIRouter(prefix='/uploads', dependencies=[Depends(login_required)])
class TemplateUploadModel(BaseModel):
path_file: str
class TemplateUploadItemModel(BaseModel):
fill_json_content: dict
@router.get('/history/{archive_id}/list', summary='获取用户导入历史模板')
async def index(request: Request, archive_id: str):
"""
获取用户导入模板
:param request: 请求
:param archive_id: str
:return:
"""
current_user = request.state.current_user
template_obj = await Template.get_or_none(archive=archive_id)
if not template_obj:
return respond_to(code=400, desc='未查到该大类')
storage_form_objs = await StorageForm.filter(user_id=current_user.id, template=template_obj.id).order_by(
'-created_at').values('id', 'name')
return respond_to(200, data=storage_form_objs)
@router.get('/history/{storage_form_id}', summary='获取历史入库模板内容')
async def index(storage_form_id: str):
"""
用户入库模板条目
:param storage_form_id: 导入模板id
:return:
"""
storage_form = await StorageForm.get_or_none(id=storage_form_id).prefetch_related('template')
template = await Template.get(id=storage_form.template.id)
if not storage_form:
return respond_to(404, desc="导入目标条目未查询到")
if not template.xlsx:
result = {
"template_xlsx": {},
"data": [],
}
return result
template_xlsx = template.parse_xlsx_transfer()
data = {
"id": storage_form.id,
"fill_json_content": storage_form.fill_json_content,
# "expired_at": await storage_form.calculate_expire_date(template)
}
result = {
"template_xlsx": template_xlsx,
"data": data,
}
return respond_to(data=result)
@router.get('', summary='获取U盘中模板')
async def index():
try:
return respond_to(data=usb.fetch())
except usb.DeviceNotFound:
return respond_to(code=404, desc='请先插入U盘')
@router.post('/{archive_id}', summary='导入入库模板')
async def create(request: Request, archive_id: str, body: TemplateUploadModel):
"""
入库模板导入上传
:param request: 请求
:param archive_id: 药剂模板ID
:param body: 路径文件
"""
path_file = body.path_file
if not os.path.exists(path_file):
return respond_to(code=404, desc="文件不存在")
with open(path_file, "rb") as f:
filename = os.path.basename(f.name)
file_contents = f.read()
current_user = request.state.current_user
template = await Template.get(archive_id=archive_id)
try:
data = await StorageForm.upload(user=current_user, template=template, file_contents=file_contents,
filename=filename)
except Exception as e:
print("导入有误e", e)
return respond_to(code=400, desc='导入模版有误')
return respond_to(data=data)
@router.get('/{archive_id}', summary='单品入库检索')
async def seek(archive_id: str, drug_name: str):
"""
单品入库检索,单品入库
:param archive_id: str
:param drug_name: str
:return:
"""
dic = []
if drug_name:
dic = await Dictionary.filter(archive_id=archive_id, k1__icontains=drug_name).values('id', 'k1')
return respond_to(data=dic)
@router.get('/info/{drug_id}', summary='获取药剂字段')
async def get_drug(drug_id:str):
drug_obj = await Drug.filter(dictionary=drug_id).first()
if not drug_obj:
return respond_to(code=404, desc="Drug not found")
return respond_to(data=drug_obj.fill_json_content)
@router.get('/item/{archive_id}', summary='获取单品入库条目')
async def index(request: Request, archive_id: str):
"""
药剂模板条目新增,单品入库
:param request: Request
:param archive_id: str
:return:
"""
template_obj = await Template.get(archive_id=archive_id)
xlsx_content = template_obj.get_checked_xlsx()
template_xlsx = template_obj.parse_xlsx_transfer()
return respond_to(200, data=dict(xlsx_content=xlsx_content, template_xlsx=template_xlsx))
@router.post('/item/{archive_id}', summary='单品入库')
async def create(request: Request, archive_id: str, body: TemplateUploadItemModel):
"""
药剂模板条目新增,单品入库
:param request: Request
:param archive_id: str
:param body: fill_json_content {"k1": xx, "k2": xx}
:return:
"""
current_user = request.state.current_user
template_obj = await Template.get(archive_id=archive_id)
fill_json_content = body.fill_json_content
if "status" in fill_json_content:
fill_json_content.pop("status")
fill_json_content = {'fill_json_content': body.fill_json_content}
now = datetime.now()
name = f"{now.strftime('%Y-%m-%d')}单品入库模板"
storage_form_obj = await StorageForm.get_or_none(user=current_user, template=template_obj, name=name)
if not storage_form_obj:
await StorageForm.create(
user=current_user,
template=template_obj,
name=f"{now.strftime('%Y-%m-%d')}单品入库模板",
fill_json_content=[fill_json_content]
)
return respond_to(200, desc="单品入库成功")
storage_form_content = storage_form_obj.fill_json_content
storage_form_content.append(fill_json_content)
storage_form_obj.fill_json_content = storage_form_content
await storage_form_obj.save()
return respond_to(200, desc="单品入库成功")