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.

141 lines
5.6 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/7/1 9:26
@Author: hxl
@Des:
"""
from fastapi import APIRouter, Depends
from fastapi.requests import Request
from fastapi.encoders import jsonable_encoder
from tortoise.queryset import QuerySet
from conf import setting
from endpoints.cab.drug import DrugRfids
from helper import respond_to, login_required
from helper.drug import milligram_to_gram, drugs_except_info
from models import Drug, Dictionary, DrugStateEnum, Template, Terminal
router = APIRouter(prefix='/drug', dependencies=[Depends(login_required)])
# 库存明细
@router.get('/inventory', summary="試劑库存明细")
async def index(request: Request, drug_name: str = '', drug_type: str = '', dictionary_id: str = '', page_no: int = 1, page_size: int = 20):
"""
库存明细
查询条件药剂名称目前暂定K1字段为药剂名称 -> 刷选后列出对应其它关键信息
查询条件如果有药剂名称则查询药剂名称对应字典对应药剂如果参数有字典id直接查询对应字典对应药剂如果两个都有则联合查询
- 药剂信息药剂名称、药剂规格、药剂纯度等组合、CAS码、保质期、最后使用人、余量、状态在库出库、位置按药剂信息和保质期最快到期在前排序
- 查询成单独一类(以药剂字典为准)后,按余量少的排序在前
:return:
"""
offset = (page_no - 1) * page_size
query = QuerySet(Drug).filter(state__in=[DrugStateEnum.IN, DrugStateEnum.OUT])
# 查询药剂名称对应的字典ID
if drug_name:
dictionary_ids = await Dictionary.filter(k1__contains=drug_name).values_list("id", flat=True)
query = query.filter(dictionary_id__in=dictionary_ids)
# 单独查询字典ID对应的药剂
if dictionary_id:
query = query.filter(dictionary_id__in=[dictionary_id])
if drug_type:
query = query.filter(drug_type=drug_type)
count = await query.count()
drug_objs = await query.limit(page_size).offset(offset).order_by("-expired_at")
archive_id = request.state.archive_id
if not archive_id:
return respond_to(code=400, desc="未获取到大类ID")
template_obj = await Template.get(archive_id=archive_id)
result = []
for drug_obj in drug_objs:
data_dict = {}
for item in template_obj.xlsx:
if item["key"] in drug_obj.fill_json_content:
data_dict[item["key"]] = drug_obj.fill_json_content[item["key"]]
data_dict["last_user"] = await drug_obj.attribute_last_user()
data_dict["state"] = '在库' if drug_obj.state == 1 else '出库'
data_dict["remain_gross_weight"] = f'{milligram_to_gram(drug_obj.remain_gross_weight)}g'
data_dict["position"] = drug_obj.position
data_dict["drug_id"] = drug_obj.id
data_dict["rfid"] = drug_obj.rfid
# 文件
data_dict["files"] = drug_obj.files
result.append(data_dict)
return respond_to(code=200, data=dict(count=count, data={'xlsx': template_obj.xlsx, 'result': result}))
@router.put('/{rfid}', summary='编辑试剂信息')
async def update(rfid: str, fill_json_content: dict):
"""
更新RFID药剂信息
:return:
"""
drug_obj = await Drug.get(rfid=rfid)
drug_obj.fill_json_content = fill_json_content
await drug_obj.save()
return respond_to()
@router.post('', summary='RFID药剂详情')
async def index(request: DrugRfids):
"""
获取RFID药剂信息 药剂信息详情
:return:
"""
drugs = list()
for rfid in request.rfids:
drug_obj = await Drug.get_or_none(rfid=rfid).prefetch_related('dictionary', 'template')
if drug_obj is None:
continue
result = jsonable_encoder(drug_obj)
terminal_obj = await Terminal.get(id=setting.TERMINAL_ID)
data = await drugs_except_info(drug_obj, terminal_obj)
drug_info = await drug_obj.attribute_drug_info()
parse_fill_json_content = await drug_obj.parse_fill_json_content()
# parse_fill_json_content.update({f'余重(g)': f'{milligram_to_gram(drug_obj.remain_gross_weight)}'})
result.update({
"drugs_except_info": data,
"remain_weight": f'{milligram_to_gram(drug_obj.remain_gross_weight)}',
"fill_json_content": parse_fill_json_content,
"rfid_drug": {drug_obj.rfid: f"[{drug_obj.rfid}]" + ",".join(list(map(lambda x:str(x), drug_info.values()))) + "," +
f"{drug_obj.remain_gross_weight}"}
})
drugs.append(result)
return respond_to(code=200, desc="获取RFID药剂信息成功", data=drugs)
@router.post('/except', summary='RFID药剂异常信息')
async def index(request: DrugRfids):
"""
获取RFID药剂异常信息
:return:
"""
result = list()
drugs = await Drug.filter(rfid__in=request.rfids).prefetch_related('dictionary', 'template').all()
terminal_obj = await Terminal.get(id=setting.TERMINAL_ID)
for drug in drugs:
data = await drugs_except_info(drug, terminal_obj)
data["rfid"] = drug.rfid
result.append(data)
# 传入rfid与data所有rfid比较差集就是非法标签
post_rfid = set(request.rfids)
effective_rfid = set([i["rfid"] for i in result])
diff_rfid = post_rfid - effective_rfid
if diff_rfid:
result.extend([{
"rfid": rfid,
"is_rfid_except": True,
"sound": True,
"message": "非法标签",
"state": 0,
} for rfid in diff_rfid])
return respond_to(code=200, desc="获取RFID药剂信息成功", data=result)