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