# -*- coding:utf-8 -*- """ @Created on : 2023/10/09 9:00 @Author: cxw @Des: 大屏 """ from fastapi import APIRouter from starlette.requests import Request from starlette.templating import Jinja2Templates from tortoise.queryset import Q from tortoise.queryset import QuerySet from datetime import timedelta,datetime from conf import setting from helper.utils import timezone_now from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse from helper.tool import parse_datetime from helper.drug import drug_near_already_expired from models.archive import Archive from models.drug import Drug, DrugStateEnum from models.cabinet import Cabinet from models.log import EnvironmentLogs from models import Archive,DrugUseLog,Dictionary,User,DrugUseStateEnum router = APIRouter(prefix='/tvshow') templates = Jinja2Templates(directory="templates") @router.get("/index") async def read_item(request: Request): return templates.TemplateResponse("index2.html",{"request": request}) #获取领用未归还预警 @router.get('/warningListJson', summary="领用未归还预警信息") async def index(): """ 逾期未归还 使用期限在终端管理中配置,按照当日固定归还时间或每试剂使用时长 状态为出库状态药剂 最后领用时间与逾期时间比较,超过的为逾期未归还药剂 :return: """ # 逾期未归还需要根据大类来获取值 result = list() drugs = await Drug.filter(state=DrugStateEnum.OUT).all() for drug_obj in drugs: cabinet = await Cabinet.filter(id =drug_obj.cabinet_id).first() if not cabinet: continue archive_obj = await Archive.get(id=cabinet.archive_id) return_fixed_at = archive_obj.params.get("return_fixed_at") # 每日几点归还 receive_use_duration = archive_obj.params.get("receive_use_duration") # 领用几小时后归还 if return_fixed_at: today_end_time = datetime.now().strftime(f"%Y-%m-%d {return_fixed_at}") now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(now_time,today_end_time) if drug_obj.last_receive_at.replace(tzinfo=None) > today_end_time: continue elif receive_use_duration: sub_time = datetime.now() - timedelta(hours=int(receive_use_duration)) if not drug_obj.last_receive_at or drug_obj.last_receive_at.replace(tzinfo=None) > sub_time: continue drug_info = await drug_obj.attribute_drug_info() result.append({ "warning_date":datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "object_name":list(map(lambda x:str(x), drug_info.values()))[0], "warning_content": await drug_obj.attribute_last_user()+'领用('+list(map(lambda x:str(x), drug_info.values()))[0]+':'+drug_obj.rfid+')未按时归还!', "last_receive_at":parse_datetime(str(drug_obj.last_receive_at), "%Y-%m-%d %H:%M:%S"), "user_name": await drug_obj.attribute_last_user() }) return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)}) async def get_already_expired(): drug_objs = await Drug.filter(state__in=[DrugStateEnum.IN, DrugStateEnum.OUT]).prefetch_related( 'dictionary','template').all() result = await drug_near_already_expired(drug_objs, "already") return result # 获取过期信息 @router.get('/expireListJson', summary="过期信息提醒") async def index(): """ 过期信息提醒 :return: """ result=list() drugs = await get_already_expired() for drug_obj in drugs: drug_info =drug_obj['drug_info'] result.append({ "warning_date":datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "object_name":list(map(lambda x:str(x), drug_info.values()))[0], "warning_content": list(map(lambda x:str(x), drug_info.values()))[0]+'('+drug_obj["rfid"]+')位置:'+drug_obj["position"] }) return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)}) # 获取常用试剂前6种 @router.get('/get_use_top', summary="获取常用试剂") async def index(): """ 获取常用试剂 :return: """ result=list() dictionaries = await Dictionary.all().values() for dictionary in dictionaries: drug_use_count = await DrugUseLog.filter(drug__dictionary=dictionary['id'], state=2).count() drug_info = ",".join([value for key, value in dictionary.items() if key.startswith('k') and value is not None]) result.append({'drug_info': drug_info, 'drug_use_count': drug_use_count}) return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)}) # 种类统计 @router.get('/getAllStockCount', summary="种类统计") async def index(): """ 种类统计 :return: """ data = { 'allCount':0, 'drugMarterialCount': 0, 'standardsCount': 0, 'dangerousCount': 0 } archives = await Archive.all() query = QuerySet(Drug).filter(state__in=[DrugStateEnum.IN]) for archive in archives: cabinets_ids =await Cabinet.filter(archive_id =archive.id).values_list("id", flat=True) count =await query.filter(cabinet_id__in=cabinets_ids).count() if archive.name =='普通试剂': data["drugMarterialCount"] =count if archive.name =='危化品': data["dangerousCount"] =count if archive.name =='标准品': data["standardsCount"] =count data["allCount"] += count return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(data)}) # 最近领用记录 @router.get('/getUseList', summary="最近领用记录") async def index(): """ 获取最近领用记录 :return: """ result=list() query = QuerySet(Drug).filter(state__in=[DrugStateEnum.OUT],last_receive_at__lt=timezone_now().strftime('%Y-%m-%d %H:%M:%S')).order_by('-last_receive_at') drugs =await query.all() for drug_obj in drugs: receive_user_obj = await User.get_or_none(id=drug_obj.last_receive_id) drug_info =await drug_obj.attribute_drug_info() result.append({ "by_user_date":drug_obj.last_receive_at, "by_user_name":receive_user_obj.name, "name": list(map(lambda x:str(x), drug_info.values()))[0] }) return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)}) # 使用频次占比 @router.get('/roomUsagePieJson', summary="使用频次占比") async def index(): """ 使用频次占比 :return: """ result=list() archives = await Archive.all() query = DrugUseLog.filter(state__in=[DrugUseStateEnum.TAKE, DrugStateEnum.EMPTY]) for archive in archives: cabinets_ids =await Cabinet.filter(archive_id =archive.id).values_list("id", flat=True) count =await query.filter(cabinet_id__in=cabinets_ids).count() # print(archive.name) drug_type ='' if archive.name =='普通试剂': drug_type='1' if archive.name =='危化品': drug_type='3' if archive.name =='标准品': drug_type='2' if archive.name =='耗材': drug_type='耗材' result.append({ "name":drug_type, "value":count, }) return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)}) # 一周温度 @router.get('/week', summary="一周温度") async def index(): """ 一周温度 :return: """ result = {} query = QuerySet(EnvironmentLogs).filter( Q(right_temperature__isnull=False)) stime = datetime.now() - timedelta(days=7) etime = datetime.today().strftime("%Y-%m-%d") stime =stime.strftime("%Y-%m-%d") query = query.filter(created_at__gte=stime, created_at__lte=etime).order_by('created_at') environmentLogs = await query.all() left_data = list() right_data =list() for environment in environmentLogs: # print(environment.created_at.strftime("%Y-%m-%d")) left_data.append( [f"{environment.cabinet_id}_1", environment.left_temperature, environment.created_at.strftime("%Y-%m-%d")]) right_data.append([f"{environment.cabinet_id}_2",environment.right_temperature,environment.created_at.strftime("%Y-%m-%d")]) for item in left_data: if result.get(item[0]): result[item[0]].append([item[2][5:].replace('-','/'), item[1]]) else: result[item[0]] = [[item[2][5:].replace('-','/'), item[1]]] for item in right_data: if result.get(item[0]): result[item[0]].append([item[2][5:].replace('-','/'), item[1]]) else: result[item[0]] = [[item[2][5:].replace('-','/'), item[1]]] return JSONResponse(content={"status": 0, "msg": '成功', "data": jsonable_encoder(result)})