# -*- coding:utf-8 -*- """ @Created on : 2023/5/30 8:48 @Author: hxl @Des: """ import asyncio from itertools import chain # from conf import setting from models import DrawerBoard, Drug from models.terminal import Terminal async def update_drug_objects(board, drugs, drawer_boards): """ 更新数据库中药品对象的 hole 字段值 :param board: 当前定位板的 RFID 字典 :param drugs: 当前定位板内所有药品对象的集合 """ # terminal_obj = await Terminal.get(id=setting.TERMINAL_ID) # terminal_name = terminal_obj.name drawer_label = drawer_boards.drawer.label cabinet_location_label = f"{drawer_boards.cabinet.label}" result = {v: k for k, v in board.items()} # 反转字典,根据 RFID 查找 hole 编号 for drug in drugs: hole = result.get(drug.rfid) if hole: board_hole = drawer_boards.board.chip_dict.get(str(hole), "") if drawer_boards.board.chip_dict else "" position_str = f"{cabinet_location_label}-{drawer_label}" if board_hole: position_str += f"-{board_hole}" drug.hole = hole drug.drawer_board_id = drawer_boards.id drug.position = position_str await drug.save(update_fields=['hole', 'drawer_board_id', 'position']) class InventoryCheck: """ 将收到的十六进制字符串转换成孔位rfid字典, """ def __init__(self, receive_data: str): self.receive_data = receive_data async def restruct(self): """ return: {'A15E1F19': 1, 'C1031119': 2, '811D1619': 3, },key为rfid,value为position """ result = {} if not self.receive_data: return result data_list = self.receive_data.split("7E") for index, data in enumerate(data_list): print(data) print("===") if data and len(data) > 8: value = data[-8:] if value != "00000000": result.setdefault(value, index) return result async def inventory_keys_result(self, cabinet_id: str): """ inventory: {'A15E1F19': 1, 'C1031119': 2, '811D1619': 3, },key为rfid,value为position """ inventory = await self.restruct() # 上报的所有药剂rfid push_rfid_set = set(rfid for rfid in inventory.keys() if rfid != "00000000") drugs = await Drug.filter(cabinet_id=cabinet_id, state=1, position__isnull=False,).values('rfid') # 柜体所有药剂标签 db_rfid_set = {item['rfid'] for item in drugs} # 放入rfid标签列表 put_in_set = push_rfid_set - db_rfid_set # 拿出rfid标签列表 take_out_set = db_rfid_set - push_rfid_set return put_in_set, take_out_set if __name__ == '__main__': data = '7E010101120304050607087E010301020304050607987E01090102030405060710' obj = InventoryCheck(data) inventory = obj.restruct() print(inventory)