# -*- coding:utf-8 -*- """ @Created on : 2023/6/30 16:17 @Author: hxl @Des: """ from datetime import datetime import json import os.path from fastapi import APIRouter, Request,Depends,Response from fastapi.encoders import jsonable_encoder from fastapi.responses import FileResponse from urllib.parse import quote from pydantic import BaseModel from pydantic.datetime_parse import timedelta from tortoise.expressions import Q from tortoise.queryset import QuerySet from helper import respond_to ,login_required from helper.report_excel import ReportData from helper.write_doc import WriteDoc from helper.log import logger_wrapper from helper.utils import get_seq_no,get_UDisk_path,mkdir from models import Cabinet, Drawer, User, Archive,Fluid,Drug router = APIRouter(prefix='/fluids',dependencies=[Depends(login_required)]) #dependencies=[Depends(login_required)] class LabelSet(BaseModel): seq_no_list :list class UpdateFuild(BaseModel): name: str # 配液名称 config_concentration:str # 配置浓度 allocation:str # 配置量 solvent:str # 溶剂量 configuration_date: str # 配置日期 validity_date:str # 有效期 configuration_record:str # 配置记录 configuration_basis:str # 配置依据 class CreateFuild(BaseModel): name: str # 配液名称 barcode_list:str # 单位编号, 组合barcode config_concentration:str # 配置浓度 allocation:str # 配置量 solvent:str # 溶剂量 configuration_date: str # 配置日期 validity_date:str # 有效期 configuration_record:str = "" # 配置记录 configuration_basis:str = "" # 配置依据 @router.get('',summary='获取配液列表') async def index (request: Request, page_no: int = 1, page_size: int = 20, state: int = 0, search: str = '',): """ 获取配液列表 :param page_no: int :param page_size: int :param state: int # 0 全部, 1 在库 2 出库 :param search: str :return: """ offset = (page_no - 1) * page_size condition_filter = Q(name__contains=search) if state: condition_filter = condition_filter & Q(state=state) query = QuerySet(Fluid).filter(condition_filter) count = await query.count() query_objs = await query.limit(page_size).offset(offset).order_by('-created_at') return respond_to(data=dict(count=count, data=query_objs)) @router.post('/add_fluid',summary='新增配液') async def add_fluid(request: Request,model:CreateFuild): """ 新增配液 :param request: Request请求头信息 :param model: 配液信息的请求体 :return: """ # 获取配液当天最大的number today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) # 获取当前日期,截断到天 tomorrow = today + timedelta(days=1) # 当天起始时间的下一天 fluid_max_num = await Fluid.filter(created_at__gte=today, created_at__lt=tomorrow).limit(1).order_by('-number') if fluid_max_num and fluid_max_num[0].number: number = fluid_max_num[0].number+1 else: number = 1 seq_no = get_seq_no(number) user_id = request.state.current_user.id username = request.state.current_user.username fluid_obj = await Fluid.create(**model.dict(),user_id=user_id,user_name=username,seq_no=seq_no) return respond_to(data=fluid_obj) @router.get('/get_fluid/{id}',summary='获取单条记录') async def get_fluid(id:str): """ 获取单条记录 :param id: str :return: """ fluid_obj = await Fluid.get(id=id) return respond_to(data=fluid_obj) @router.put('/update_fluid/{id}',summary='编辑配液信息') async def update_fluid(id:str,post:UpdateFuild): """ 编辑配液信息 :param id: str :param post: 修改配液信息的请求体 :return: """ fluid_obj = await Fluid.get(id=id) data = post.dict() await fluid_obj.update_from_dict(data) await fluid_obj.save() return respond_to(desc=f"修改[{fluid_obj.name}]信息成功") @router.get('/get_drug/{barcode}',summary='查询单个药剂') async def get_drug(barcode:str): """ 查询单个药剂 :param barcode: str :return: """ # drug_obj = await Drug.get(barcode = barcode) drug_obj = await Drug.get_or_none(Q(barcode=barcode) | Q(rfid=barcode)) # drug_obj = await Fluid.get(seq_no = barcode) # 测试数据 return respond_to(data=drug_obj) @router.post('/print_fluid_label',summary='打印配液标签') async def print_fluid_label(model:LabelSet): """ 打印配液标签 :param model: list :return: """ # 预留调用标签打印机服务 print('LabelSet:::',model) return respond_to(data={'data':model}) @router.delete('/delete_fluid/{id_list}',summary='删除配液') async def delete_fluid(id_list:str): """ 删除配液 :param id_list: str :return: """ id_list = id_list.split(',') if id_list: for id in id_list: fluid_obj = await Fluid.get_or_none(id=id) await fluid_obj.delete() return respond_to(desc='删除成功') return respond_to(code=400, desc='请传入配液id') @router.get('/download_fluid_report',summary='下载配液报表') async def download_fluid_report(visit_type: int = 1 , state: int = 0 , search: str=''): """ 下载配液报表excel :param visit_type: int # 1 u盘下载, 2 网页下载 :param state : int # 0 全部 ,1 在库 ,2 出库 :param search : str :return: """ condition_filter = Q(name__contains=search) if state: condition_filter = condition_filter & Q(state=state) query = QuerySet(Fluid).filter(condition_filter) query_obj = query.order_by('-created_at') data = await query_obj.all() file_name = '配液报表' obj_report = ReportData() obj = obj_report.build_file(**{ "file_name": file_name, "data_list": data, "key_list": ["name", "seq_no", "config_concentration", "allocation", "solvent", "state", "configuration_date", 'validity_date', 'user_name', 'configuration_record', 'configuration_basis'], "finds_name": ["配液名称", "储备液编号", "配置浓度", "配置量", "溶剂", "配液状态", "配置日期", "有效期","配置人", "配置记录", "配置依据", ], }) res_save_file = f"{file_name}-{datetime.now().strftime('%Y%m%d%H%M%S')}" # # visit_type: 1 , 默认导出到U盘, 2:导出到前端 if visit_type==1: file_path= get_UDisk_path() if not file_path: return respond_to(code=400,desc = '未检测到U盘' ) obj.save(os.path.join(file_path,res_save_file)) return respond_to( desc ='导出成功') else: # 远程访问 try: file_path = "Resource/" mkdir(file_path) obj.save(os.path.join(file_path, res_save_file)) return FileResponse(os.path.join(os.getcwd(),file_path,res_save_file+'.xlsx'),filename=res_save_file+'.xlsx',media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") except Exception as e : return respond_to(code=400, desc= '导出失败'+str(e)) @router.get('/download_fluid_report1',summary='下载配液报表word') async def download_fluid_report1(visit_type: int = 1 , state: int = 0 , search: str=''): """ 下载配液报表word :param visit_type: int # 1 u盘下载, 2 网页下载 :param state : int # 0 全部 ,1 在库 ,2 出库 :param search : str :return: """ condition_filter = Q(name__contains=search) if state: condition_filter = condition_filter & Q(state=state) query = QuerySet(Fluid).filter(condition_filter) query_obj = query.order_by('-created_at') data = await query_obj.all() file_name = '配液报表' obj = WriteDoc(data,'').add_table() rsp_file_name = f"{file_name}{datetime.now().strftime('%Y%m%d%H%M%S')}" if visit_type==1: file_path= get_UDisk_path() if not file_path: return respond_to(code=400,desc = '未检测到U盘' ) obj.save(os.path.join(file_path, rsp_file_name)+'.docx') return respond_to( desc ='导出成功') else: try: file_path = "Resource" mkdir(file_path) obj.save(os.path.join(file_path, rsp_file_name)+'.docx') file_name = rsp_file_name+".docx" response = Response(WriteDoc.download_doc(os.path.join(file_path, file_name))) response.headers["Content-Disposition"] = \ "attachment;" \ "filename*=UTF-8''{utf_filename}".format( utf_filename=quote(file_name) ) return response except Exception as e : return respond_to(code=400, desc= '导出失败'+str(e))