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.

94 lines
3.5 KiB

# -*- coding: utf-8 -*-
# @Time : 2023/12/6 16:06
# @Author : tx
# @File : report_box.py
# @Description : 盒装药剂报表统计
import pytz
from fastapi import Request
from fastapi.encoders import jsonable_encoder
from tortoise.queryset import QuerySet, Q, Count
from tortoise import Tortoise, fields, models
from conf import setting
from models.drug_use_log import DrugUseLog, DrugUseStateEnum
from models.drug import Drug, DrugStateEnum
from models.cabinet import Cabinet
from models.dictionary import Dictionary
from models.template import Template
from models.user import User
from models.archive import Archive
from models.log import EnvironmentLogs
from helper.drug import milligram_to_gram, gram_to_milliliter
from helper.tool import parse_datetime
from endpoints.warning import get_already_expired
async def box_report_inventory_drug(request: Request, keyword):
"""
库存明细报表
:return:
"""
page_no = keyword.get("page_no")
page_size = keyword.get("page_size")
drug_name = keyword.get("drug_name")
dictionary_id = keyword.get("dictionary_id")
offset = (page_no - 1) * page_size
query = QuerySet(Drug).filter()
order_key = "remain_gross_weight"
archive_id = request.state.archive_id
if archive_id:
cabinets_ids = await parse_archive_cabinet_ids(archive_id, [])
if cabinets_ids:
query = query.filter(cabinet_id__in=cabinets_ids)
else:
# 根据终端筛选
if setting.TERMINAL_ID:
cabinets_ids = await parse_cabinet_ids()
if cabinets_ids:
query = query.filter(cabinet_id__in=cabinets_ids)
if drug_name:
dictionary_ids = await Dictionary.filter(k1__contains=drug_name).all().values_list("id", flat=True)
query = query.filter(dictionary_id__in=dictionary_ids)
order_key = "expired_at"
if dictionary_id:
query = query.filter(dictionary_id__in=[dictionary_id])
order_key = "expired_at"
query = query.filter(state__in=[DrugStateEnum.IN, DrugStateEnum.OUT])
count = await query.count()
if page_no:
drug_objs = await query.limit(page_size).offset(offset).order_by(order_key)
else:
drug_objs = await query.order_by(order_key)
attribute_key = await drug_objs[0].attribute_drug_info() if drug_objs else {}
result = list()
archive_obj = await Archive.get_or_none(id=archive_id)
archive_name = archive_obj.name if archive_obj else ""
for drug_obj in drug_objs:
attribute_drug = await drug_obj.attribute_drug_info()
data = {
"drug_id": drug_obj.id,
"drug_info": attribute_drug,
"rfid": drug_obj.rfid,
"position": drug_obj.position,
"expired_at": drug_obj.expired_at.strftime("%Y-%m-%d") if drug_obj.expired_at else "",
"remain_gross_weight": await drug_obj.format_weight(),
"state": drug_obj.state,
"last_user": await drug_obj.attribute_last_user(),
"cas_code": drug_obj.attribute("cas_code"),
**attribute_drug
}
if archive_name == "耗材":
data.update({
"remain_count": int(drug_obj.attribute("total_count")) - drug_obj.total_use_weight if drug_obj.attribute("total_count") else "-",
"unit_code": drug_obj.attribute("unit_code"),
"manufacturer": drug_obj.attribute("cs") # 生产厂商
})
result.append(data)
return dict(count=count, data=result, attribute_key=list(attribute_key.keys()))