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