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.

101 lines
3.5 KiB

#!/usr/bin/env python
# encoding: utf-8
"""
@author: tx
@file: warehouse.py
@time: 2023/5/8 17:53
@desc:
"""
from datetime import datetime, timedelta
from fastapi import APIRouter, Depends, Request
from pydantic import BaseModel
from helper import login_required, respond_to
from helper.drug import gram_to_milligram
from helper.logger import logger
from helper.utils import timezone_now
from models import Template
from models.archive import Archive
from models.dictionary import Dictionary
from models.drug import Drug
from models.storage_form_item import StorageFormItem
router = APIRouter(dependencies=[Depends(login_required)])
class StorageFormItemEdit(BaseModel):
fill_json_content: dict | None
@router.put('/{id}', summary='用户药剂模板条目更改')
async def update(id: str, model: StorageFormItemEdit):
"""
药剂模板条目更改
:param id: 用户药剂模板条目id
:param model: fill_json_content
:return:
"""
storage_form_item_obj = await StorageFormItem.get(id=id)
if not model.fill_json_content:
return respond_to(500, desc="传入参数有误")
storage_form_item_obj.fill_json_content = model.fill_json_content
await storage_form_item_obj.save(update_fields=['fill_json_content'])
return respond_to()
@router.post('/warehousing/binding/{archive_id}', summary="入库绑定上传")
async def binding_warehousing_drug(request: Request, archive_id: str, drug_list: list[dict]):
"""
绑定入库上传
:param request: Request
:param archive_id: str
:param drug_list: [{"storage_item_id", str, "rfid": str, "gross_weight": float}]
:return: {"abnormal_drugs": List[Dict], "normal_drugs": List[Dict]}
"""
if not drug_list:
return respond_to(code=400, desc="绑定药剂为空,上传数据有误")
current_user = request.state.current_user
_storage_item_dict = dict()
normal_drugs, abnormal_drugs = list(), list()
drug_data = list()
template_obj = await Template.get(archive_id=archive_id).prefetch_related('archive')
print(drug_list)
for drug in drug_list:
if not drug.get("rfid") or not drug.get("fill_json_content"):
abnormal_drugs.append(drug)
continue
fill_json_content = drug["fill_json_content"]
print(fill_json_content)
k_args = {f'k{i}': fill_json_content.get(f'k{i}').strip() for i in range(1, 7) if fill_json_content.get(f'k{i}')}
dictionary_obj = await Dictionary.get_or_none(**k_args)
if not dictionary_obj:
k_args["archive"] = template_obj.archive
k_args["params"] = {"lack_stock_count": 0, "expiration_alert": 0}
dictionary_obj = await Dictionary.create(**k_args)
rfid = drug.get("rfid").upper()
drug_dict = {
"dictionary_id": dictionary_obj.id,
"rfid": rfid,
"fill_json_content": fill_json_content,
"bind_id": current_user.id,
"bind_at": timezone_now(),
"template": template_obj,
}
drug_data.append(drug_dict)
# 药剂批量保存
for data in drug_data:
try:
print(data)
await Drug.create(**data)
normal_drugs.append(data)
except Exception as e:
logger.error("药剂导入绑定异常:{0}".format(e))
abnormal_drugs.append(data)
desc = "药剂部分保存成功" if abnormal_drugs else "药剂保存成功"
return respond_to(code=200, desc=desc, data={"abnormal_drugs": abnormal_drugs, "normal_drugs": drug_data})