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
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="单品入库成功")
|