# -*- coding:utf-8 -*- """ @Created on : 2023/6/30 14:29 @Author: hxl @Des: """ from datetime import datetime, timedelta from fastapi import APIRouter, Depends, Request from fastapi.encoders import jsonable_encoder from pydantic import BaseModel from tortoise.queryset import QuerySet from helper import login_required, respond_to from models import Log, DrugUseLog, User from models.drug_use_log import DrugUseStateEnum from helper.drug import milligram_to_gram from models.cabinet import Cabinet router = APIRouter(prefix='/logs', dependencies=[Depends(login_required)]) class DrugUseLogSearch(BaseModel): user_id: str | None state: int | None stime: str | None etime: str | None drug_id: str | None cabinet_id: str | None page_no: int = 1 page_size: int = 20 @router.get('', summary='平台日志列表') async def index(page_no: int = 1, page_size: int = 20, begin_date: str = '', end_date: str = '', keyword: str = None): """ 获取平台日志列表 :return: """ kwargs = {} if keyword: kwargs = {"comment__contains": keyword.strip()} query = Log.filter(**kwargs) if begin_date: query = query.filter(created_at__gte=f"{begin_date} 00:00:00") if end_date: temp_time = datetime.strptime(end_date, "%Y-%m-%d").replace(hour=0, minute=0, second=0) end_time = temp_time + timedelta(days=1) query = query.filter(created_at__lt=end_time) offset = (page_no - 1) * page_size count = await query.count() log_objs = await query.limit(page_size).offset(offset).order_by('-created_at') return respond_to(data=dict(count=count, logs=log_objs)) # 流转日志 async def parse_archive_cabinet_ids(archive_id: str, client_ids: list): """ 根据大类ID获取柜体 如果传递客户端ids参数,则返回用户有权限的大类柜体列表 :param archive_id: :param client_ids: 用户有权限的柜体id,如果不传则代表全部柜体 :return: """ query = QuerySet(Cabinet).filter() if archive_id: query = query.filter(archive_id=archive_id) if client_ids: query = query.filter(id__in=client_ids) # 用户有权限的柜体 cabinets_ids = await query.values_list("id", flat=True) return cabinets_ids @router.post('/drug', summary='流转日志列表') async def index(request: Request, keyword: DrugUseLogSearch): """ 获取平台流转日志列表 :return: """ page_no = keyword.page_no page_size = keyword.page_size offset = (page_no - 1) * page_size query = QuerySet(DrugUseLog) if keyword.user_id: query = query.filter(user_id=keyword.user_id) else: user = await User.filter(id=request.state.current_user.id).get_or_none() if user.role_id != 1 and user.role_id != 100: query = query.filter(user_id=request.state.current_user.id) if keyword.state in [0, 1, 2, 3, 4]: query = query.filter(state=keyword.state) if keyword.stime: query = query.filter(created_at__gte=f"{keyword.stime} 00:00:00") if keyword.etime: query = query.filter(created_at__lte=f"{keyword.etime} 23:59:59") if keyword.drug_id: query = query.filter(drug_id=keyword.drug_id) archive_id = request.state.archive_id if keyword.cabinet_id: query = query.filter(cabinet_id=keyword.cabinet_id) else: if archive_id: cabinets_ids = await parse_archive_cabinet_ids(archive_id, []) if cabinets_ids: query = query.filter(cabinet_id__in=cabinets_ids) count = await query.count() logs = await query.prefetch_related('drug').limit(page_size).offset(offset).order_by('-created_at') result = list() for log in logs: if not log.drug: continue if log.state in [1, 3]: use_weight = log.use_weight use_weight = use_weight finally_use_weight = "" if not use_weight and log.state != DrugUseStateEnum.PUT else use_weight else: finally_use_weight = '' # weight > 1000 转换为g 保留一位小数否则返回mg weight = float(log.weight) if log.weight else 0 if weight > 1000: weight_str = f"{milligram_to_gram(log.weight)}g" else: weight_str = f"{log.weight}mg" if log.weight is not None else "-" finally_use_weight_str = log.parse_use_weight(finally_use_weight) print("finally_use_weight_str", finally_use_weight_str) result.append({ **jsonable_encoder(log), "drug_info": await log.drug.attribute_drug_info(), "weight": weight_str, "use_weight": finally_use_weight_str, "created_at": log.created_at.strftime("%Y-%m-%d %H:%M:%S"), }) return respond_to(data=dict(count=count, data=result))