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.

248 lines
8.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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