You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
8.9 KiB

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Date:2022/07/18 16:54:45
'''
import datetime
from sqlalchemy import or_, and_, desc, asc
from sqlalchemy.sql import func
from db_logic.db_base import Repository
from models.medicament_models import EntityMedicament, EntityMedicamentRecord, EntityMedicamentTemplate
from models.client_models import EntityClient
from models.user_models import EntityUser
from common.utils import Utils, DrugStatus, DrugRecordType
#药剂流程业务逻辑类
class BllMedicament(Repository):
#_instance_lock = threading.Lock()
##实现单例模式
#def __new__(cls, *args, **kwargs):
# if not hasattr(BllMedicament, "_instance"):
# with BllMedicament._instance_lock:
# if not hasattr(BllMedicament, "_instance"):
# BllMedicament._instance = object.__new__(cls)
# return BllMedicament._instance
def __init__(self, entityType=EntityMedicament):
return super().__init__(entityType)
#获取药剂列表
def getDrugList(self, customerId, keyWord, pageParam):
keyWord = '%' + keyWord + '%'
orm_query = self.findList().filter(EntityMedicament.CustomerId == customerId
).filter(or_(EntityMedicament.RFID.like(keyWord), EntityMedicament.Name.like(keyWord))).order_by(desc(EntityMedicament.PutInStorageDate))
return self.queryPage(orm_query, pageParam)
# 药剂入库
def drugPutIn(self, entityDrug=EntityMedicament(), entityClient=EntityClient(), entityUser=EntityUser()):
entityDrugRecord = EntityMedicamentRecord()
entityDrugRecord.RecordId = Utils.UUID()
entityDrugRecord.CustomerId = entityClient.CustomerId
entityDrugRecord.ClientId = entityClient.ClientId
entityDrugRecord.ClientCode = entityClient.ClientCode
entityDrugRecord.VarietyId = entityDrug.VarietyId
entityDrugRecord.MedicamentId = entityDrug.MedicamentId
entityDrugRecord.Price = entityDrug.Price
entityDrugRecord.RecordType = DrugRecordType.PutIn
entityDrugRecord.RecordRemain = float(entityDrug.Remain)
entityDrugRecord.IsEmpty = 0
entityDrugRecord.CreateDate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
entityDrugRecord.CreateUserId = entityUser.UserId
entityDrugRecord.CreateUserName = entityUser.RealName
# 创建事务
self.beginTrans()
self.session.add(entityDrug)
self.session.add(entityDrugRecord)
self.commitTrans()
# 药剂领用
def drugUse(self, entityDrug=EntityMedicament(), entityClient=EntityClient(), entityUser=EntityUser()):
#创建事务
self.beginTrans()
self.session.merge(entityDrug)
#if(BllUserMedicament().isJInZhiUser(entityUser.UserId,entityDrug.MedicamentId)):
# warning_obj = EntityWarning(WarningId=str(Utils.UUID()), CustomerId=entityDrug.CustomerId,
# ObjectType=7, ObjectId=entityDrug.MedicamentId, ObjectName=entityDrug.Name,
# WarningContent= entityUser.RealName+'违规领用了药剂“'+entityDrug.Name+'”('+entityDrug.BarCode+'',WarningDate=datetime.datetime.now(),
# WarningUserName=entityUser.RealName, IsSolve=0, IsAdd=1)
# BllWarning().insert(warning_obj)
entityDrugRecord = EntityMedicamentRecord()
entityDrugRecord.RecordId = Utils.UUID()
entityDrugRecord.CustomerId = entityClient.CustomerId
entityDrugRecord.ClientId = entityClient.ClientId
entityDrugRecord.ClientCode = entityClient.ClientCode
entityDrugRecord.VarietyId = entityDrug.VarietyId
entityDrugRecord.MedicamentId = entityDrug.MedicamentId
entityDrugRecord.Price = entityDrug.Price
entityDrugRecord.RecordType = DrugRecordType.Use
entityDrugRecord.IsEmpty = 0
entityDrugRecord.RecordRemain = float(entityDrug.Remain)
entityDrugRecord.CreateDate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
entityDrugRecord.CreateUserId = entityUser.UserId
entityDrugRecord.CreateUserName = entityUser.RealName
self.session.add(entityDrugRecord)
entityVariety = BllMedicamentVariety().findEntity(entityDrug.VarietyId)
entityVariety.NormalCount -= 1
entityVariety.UseCount += 1
self.session.merge(entityVariety)
self.commitTrans()
# 药剂归还
def drugReturn(self, entityDrug=EntityMedicament(), entityClient=EntityClient(), entityUser=EntityUser()):
#创建事务
self.beginTrans()
self.session.merge(entityDrug)
entityDrugRecord = EntityMedicamentRecord()
entityDrugRecord.RecordId = Utils.UUID()
entityDrugRecord.CustomerId = entityClient.CustomerId
entityDrugRecord.ClientId = entityClient.ClientId
entityDrugRecord.ClientCode = entityClient.ClientCode
entityDrugRecord.VarietyId = entityDrug.VarietyId
entityDrugRecord.MedicamentId = entityDrug.MedicamentId
entityDrugRecord.Price = entityDrug.Price
drug = BllMedicament().findEntity(entityDrug.MedicamentId)
lastRemain = float(drug.Remain)
entityDrugRecord.UseQuantity = float(
lastRemain) - float(entityDrug.Remain if entityDrug.Remain else 0)
entityDrugRecord.RecordType = DrugRecordType.Return
entityDrugRecord.RecordRemain = float(entityDrug.Remain)
entityDrugRecord.IsEmpty = 1 if(
entityDrug.Status == DrugStatus.Empty) else 0
entityDrugRecord.CreateDate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
entityDrugRecord.CreateUserId = entityUser.UserId
entityDrugRecord.CreateUserName = entityUser.RealName
self.session.add(entityDrugRecord)
entityVariety = BllMedicamentVariety().findEntity(entityDrug.VarietyId)
if(entityDrug.Remain != 0):
entityVariety.NormalCount += 1
else:
entityVariety.EmptyCount += 1
entityVariety.UseCount -= 1
self.session.merge(entityVariety)
self.commitTrans()
#获取离保质期最近的同类药剂
def getDrugNearExpired(self, varietyId, customerId):
drugList = self.findList(and_(EntityMedicament.Status == DrugStatus.Normal, EntityMedicament.VarietyId == varietyId)).order_by(
asc(EntityMedicament.ExpirationDate)).limit(1)
return drugList.first()
#获过期药剂列表
def getExpiredDrugList(self, customerId):
todayDate = datetime.datetime.now().strftime("%Y-%m-%d")
drugList = self.findList(and_(func.date_format(
EntityMedicament.ExpirationDate, '%Y-%m-%d') <= todayDate, EntityMedicament.Status != 3)).all()
return drugList
#获取待归还药剂列表
def getWaitReturnDrugList(self, customerId):
drugList = self.findList(and_(EntityMedicament.CustomerId ==
customerId, EntityMedicament.Status == DrugStatus.Out)).all()
return drugList
#获取待入库药剂模板
def getWaitPutInDrugTemplateList(self, customerId, clientId):
templateList = BllMedicamentTemplate().findList(and_(EntityMedicamentTemplate.CustomerId == customerId, EntityMedicamentTemplate.ClientId ==
clientId, EntityMedicamentTemplate.IsWaitExport == 1)).order_by(EntityMedicamentTemplate.CreateDate.desc()).limit(1).all()
return templateList
#获取所有药剂列表
def getAllDrugList(self, searchWord, pageParam, customerId):
queryStr = '(select * from RMS_Medicament where CustomerId=:customerId and ClientId=:clientId and (Name like :searchWord or BarCode like :searchWord or EnglishName like :searchWord)) '
queryStr += ' union all (select * from RMS_Medicament where CustomerId=:customerId and ClientId!=:clientId and (Name like :searchWord or BarCode like :searchWord or EnglishName like :searchWord) order by ClientCode ASC ) '
queryParams = {"searchWord": '%' + searchWord + '%',
"customerId": customerId, "clientId": CurrentInfo.ClientInfo.ClientId}
templateList = self.execute(queryStr + ' limit ' + str((pageParam.curPage - 1)
* pageParam.pageRows) + ',' + str(pageParam.pageRows), queryParams).fetchall()
countQuery = "select count(*) from RMS_Medicament where CustomerId=:customerId and (Name like :searchWord or BarCode like :searchWord or EnglishName like :searchWord)"
pageParam.totalRecords = self.execute(
countQuery, queryParams).fetchone()[0]
jsonData = Utils.mysqlTable2Model(templateList)
return jsonData
#获取指定用户当前领用药剂
def getUserUseDrugList(self, userId):
drugList = self.findList(
EntityMedicament.ByUserId == userId, EntityMedicament.Status == DrugStatus.Out).all()
return drugList