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