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