|
|
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
|