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