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
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())) |