from enum import IntEnum from tortoise import fields, models from helper.drug import milligram_to_gram, gram_to_milliliter # from models.drug import Drug class DrugUseStateEnum(IntEnum): # 0 = 入库 1 = 归还, 2 = 领用, 3 = 空瓶, 4 = 报废 IN = 0 PUT = 1 TAKE = 2 EMPTY = 3 SCRAP = 4 class DrugUseLog(models.Model): id = fields.UUIDField(pk=True) drug = fields.ForeignKeyField('rms.Drug', to_field='id', description='药剂ID') state = fields.IntEnumField(DrugUseStateEnum, description='0=入库, 1=归还,2=领用,3=空瓶,4=报废') user_id = fields.UUIDField() peer_ids = fields.CharField(null=True, max_length=255, description='陪同者IDs') users = fields.CharField(null=True, max_length=255, description='用户信息描述') terminal_id = fields.UUIDField(null=True, description='终端ID') cabinet_id = fields.UUIDField(null=True, description='柜体ID') drawer_id = fields.UUIDField(null=True, description='抽屉ID') drawer_board_id = fields.UUIDField(null=True, description='抽屉定位板ID') hole = fields.SmallIntField(null=True, description='芯片序号') position = fields.CharField(null=True, max_length=255, description='位置描述') weight = fields.IntField(null=True, description='重量(mg)') use_weight = fields.IntField(null=True, description='用量(mg)') alerted = fields.BooleanField(null=True, default=True, description='是否已报警') alarm_state = fields.SmallIntField(null=True, default=0, description="异常状态码 0=正常,1=称重异常,2=超期归还") alarm_desc = fields.CharField(null=True, max_length=255, description="异常描述信息") return_log_id = fields.CharField(null=True, max_length=255, description="关联归还字段id") created_at = fields.DatetimeField(auto_now_add=True) updated_at = fields.DatetimeField(auto_now=True) class Meta: table = 'drug_use_logs' table_description = '药剂流转日志表' @classmethod async def get_last_put_record(cls, drug_id): latest_record = await cls.filter(drug_id=drug_id, state=DrugUseStateEnum.PUT).order_by( "-created_at").first() return latest_record @classmethod async def judge_receive_require_weigh(cls, drug_id, terminal_obj): """ 判断领用是否需称重 上次归还需称重未称重则本次领用需称重 :return: """ return False def parse_use_weight(self, weight): """ 用量 > 1000 转换为g 保留一位小数 weight 单位mg,根据净含量单位进行转化显示,如果没有净含量,> 1000 转换为g 保留一位小数否则返回mg :param weight: :return: """ if not weight: return '-' else: weight = float(weight) if weight >= 1000: weight_str = f"{milligram_to_gram(weight)}g" else: weight_str = f"{weight}mg" net_weight = self.drug.fill_json_content.get('net_weight') # 净含量 if net_weight: # if net_weight.endswith('ml'): # weight_str = f"{weight}ml" density = self.drug.attribute("density") # 密度 if density and net_weight.endswith('ml'): volume = gram_to_milliliter(milligram_to_gram(weight), density) weight_str = f"{weight_str}({volume}ml)" if volume else f"{weight_str}" return weight_str