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)