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.
96 lines
5.2 KiB
96 lines
5.2 KiB
import math
|
|
|
|
from pypinyin import lazy_pinyin, Style
|
|
|
|
from utils.Dict2Obj import *
|
|
from utils.configOperatingTypeHelper import GetOperatingTypeOutStock, GetOperatingTypeBad
|
|
from utils.listHelper import list2String
|
|
from utils.logHelper import *
|
|
|
|
|
|
def priorityDelivery(item, index, token, data):
|
|
entity = Dict2Obj(item)
|
|
toBeOutEntities = ReagtStock.query.join(ReagtReagent, ReagtStock.ReagentId == ReagtReagent.ReagentId). \
|
|
filter(ReagtReagent.Name == entity.Name, ReagtStock.Position == entity.Position,
|
|
ReagtReagent.Specification == entity.Specification,
|
|
ReagtStock.ProductionBatch == entity.ProductionBatch).order_by(ReagtStock.Expiration.asc()).all()
|
|
if data.get('status') == 'firstIN':
|
|
# 先入先出
|
|
toBeOutEntities = ReagtStock.query.join(ReagtReagent, ReagtStock.ReagentId == ReagtReagent.ReagentId). \
|
|
filter(ReagtReagent.Name == entity.Name, ReagtStock.Position == entity.Position,
|
|
ReagtReagent.Specification == entity.Specification,
|
|
ReagtStock.ProductionBatch == entity.ProductionBatch).order_by(ReagtStock.InTime.desc()).all()
|
|
outNumber = entity.OutStockNumber
|
|
minOutNumber = entity.OutStockMinNumber
|
|
for toBeOutEntity in toBeOutEntities:
|
|
singleNumber = toBeOutEntity.LastNumber
|
|
if outNumber is 0:
|
|
break
|
|
# 出库数量大于当条数量
|
|
if outNumber > singleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, singleNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
db.session.delete(toBeOutEntity)
|
|
outNumber -= singleNumber
|
|
continue
|
|
# 出库数量小于当条数量
|
|
if outNumber < singleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, outNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
toBeOutEntity.LastNumber -= outNumber
|
|
toBeOutEntity.MinNumberUnit -= outNumber*ReagtReagent.query.filter_by(ReagentId=toBeOutEntity.ReagentId)\
|
|
.first().Ratio
|
|
break
|
|
if outNumber == singleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, singleNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
db.session.delete(toBeOutEntity)
|
|
break
|
|
|
|
if minOutNumber > 0:
|
|
for toBeOutEntity in toBeOutEntities:
|
|
minSingleNumber = toBeOutEntity.MinNumberUnit
|
|
if minOutNumber is 0:
|
|
break
|
|
# 出库数量大于当条数量
|
|
if minOutNumber > minSingleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, singleNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
db.session.delete(toBeOutEntity)
|
|
minOutNumber -= minSingleNumber
|
|
continue
|
|
# 出库数量小于当条数量
|
|
if minOutNumber < minSingleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, outNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
toBeOutEntity.MinNumberUnit -= minOutNumber
|
|
toBeOutEntity.LastNumber -= math.ceil(minOutNumber/ReagtReagent.query.
|
|
filter_by(ReagentId=toBeOutEntity.ReagentId)
|
|
.first().Ratio)
|
|
break
|
|
if minOutNumber == minSingleNumber:
|
|
OutStockAndBadLog(index, token, entity.Name, entity.Specification, singleNumber, data,
|
|
toBeOutEntity.Code, toBeOutEntity.Position, minOutNumber, toBeOutEntity.ReagentId,
|
|
data.get('receiver'))
|
|
db.session.delete(toBeOutEntity)
|
|
break
|
|
|
|
db.session.commit()
|
|
|
|
|
|
def OutStockAndBadLog(index, token, name, specification, number, data, code, position, minOutNumber, reagentId, receiver):
|
|
if index is 1:
|
|
# 出库
|
|
LogAdd(token, GetOperatingTypeOutStock(), data, code, name,
|
|
list2String(lazy_pinyin(name+specification, style=Style.FIRST_LETTER)),
|
|
number, specification, position, operateMinNumber=minOutNumber, reagentId=reagentId, receiver=receiver)
|
|
if index is 2:
|
|
# 报损
|
|
LogAdd(token, GetOperatingTypeBad(), data, code, name,
|
|
list2String(lazy_pinyin(name+specification, style=Style.FIRST_LETTER)),
|
|
number, specification, position, reagentId=reagentId)
|
|
|