Warehouse module
This commit is contained in:
parent
5fe140714e
commit
efc505c12e
1 changed files with 142 additions and 0 deletions
142
pyjeeves/repositories/warehouse.py
Normal file
142
pyjeeves/repositories/warehouse.py
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
from pyjeeves.models.raw import ArticleShelf, ItemReplenishmentLevels
|
||||||
|
from pyjeeves.models import db
|
||||||
|
from sqlalchemy.sql.expression import and_
|
||||||
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
|
from pyjeeves.repositories import Article
|
||||||
|
|
||||||
|
from pyjeeves import logging
|
||||||
|
logger = logging.getLogger("PyJeeves." + __name__)
|
||||||
|
|
||||||
|
|
||||||
|
# Relocate Jeeves modules to separate folder and let a "master" module handle imports, and setup.
|
||||||
|
class Warehouse():
|
||||||
|
"""Handles articles in Jeeves, currently filters out all articles with class = 2"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_shelf(shelf_id):
|
||||||
|
""" Query a shelf by id """
|
||||||
|
try:
|
||||||
|
return db.raw_session.query(ArticleShelf).filter_by(
|
||||||
|
LagPlats=str(shelf_id)
|
||||||
|
).one()
|
||||||
|
except NoResultFound:
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_all_shelfs(filter_=and_()):
|
||||||
|
# .filter_by(ItemStatusCode=0, ArtKod=2)
|
||||||
|
return db.raw_session.query(ArticleShelf).filter(filter_).all()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def delete_empty_shelfs():
|
||||||
|
shelfs = db.raw_session.query(ArticleShelf).filter(and_(
|
||||||
|
ArticleShelf.LagStalle == 0,
|
||||||
|
ArticleShelf.JAPP_EWMS_zoneid.in_(['U', 'K', 'S']),
|
||||||
|
ArticleShelf.LagSaldo == 0)).all()
|
||||||
|
|
||||||
|
for shelf in shelfs:
|
||||||
|
db.raw_db.delete(shelf)
|
||||||
|
|
||||||
|
db.raw_db.commit()
|
||||||
|
logger.info('Deleted %s shelfs' % (len(shelfs)))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def delete_replenish():
|
||||||
|
replenish = db.raw_session.query(ItemReplenishmentLevels).all()
|
||||||
|
|
||||||
|
for repl in replenish:
|
||||||
|
db.raw_db.delete(repl)
|
||||||
|
|
||||||
|
db.raw_db.commit()
|
||||||
|
logger.info('Deleted old replenishment levels')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def add_replenish(shelfs=[]):
|
||||||
|
Warehouse.delete_replenish()
|
||||||
|
|
||||||
|
min_level = 54 # Should be how low we'd like the level to get. One layer on pallet?
|
||||||
|
max_level = 270 # How high is the roof?
|
||||||
|
|
||||||
|
# with db.raw_session.no_autoflush:
|
||||||
|
for shelf in shelfs:
|
||||||
|
art = Article.get(shelf['article_no'])
|
||||||
|
|
||||||
|
default_alt_unit = [unit for unit in art.ArticleUnit if unit.AltEnhetOrderStd == '1']
|
||||||
|
if default_alt_unit and len(default_alt_unit) == 1:
|
||||||
|
if default_alt_unit[0].AltEnhetOmrFaktor is not None:
|
||||||
|
unit_multiple = default_alt_unit[0].AltEnhetOmrFaktor
|
||||||
|
else:
|
||||||
|
unit_multiple = default_alt_unit[0].ArticleAlternativeUnit.AltEnhetOmrFaktor
|
||||||
|
else:
|
||||||
|
unit_multiple = 1
|
||||||
|
|
||||||
|
new_level = ItemReplenishmentLevels(
|
||||||
|
LagStalle='0', LagPlats=shelf['shelf'], ArtNr=shelf['article_no'],
|
||||||
|
JAPP_EWMS_minnoofitemsonbin=min_level,
|
||||||
|
MaxNoOfItemsOnBin=max_level,
|
||||||
|
JAPP_EWMS_multipel=unit_multiple,
|
||||||
|
ForetagKod=1)
|
||||||
|
|
||||||
|
db.raw_db.add(new_level)
|
||||||
|
db.raw_db.commit()
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: Should be moved to separate project with Lindvalls specific code
|
||||||
|
def update_shelfs_from_csv(filename='shelf_numbers_20211217.csv'):
|
||||||
|
SHELF_TYPES = {
|
||||||
|
'Hyllplats': 'HP',
|
||||||
|
'Pallplats': 'PP',
|
||||||
|
'Pallrad': 'PR'
|
||||||
|
}
|
||||||
|
SKIP_ZONES = ('U', 'K', 'KB', 'S', 'G')
|
||||||
|
|
||||||
|
import csv
|
||||||
|
with open(filename, newline='') as csvfile:
|
||||||
|
shelfreader = csv.reader(csvfile, delimiter=',')
|
||||||
|
headers = shelfreader.__next__()
|
||||||
|
logger.info('Found these columns: %s' % (', '.join(headers)))
|
||||||
|
for row in shelfreader:
|
||||||
|
if row[3] in SKIP_ZONES:
|
||||||
|
continue
|
||||||
|
maxkg = int(row[4]) if row[4] else 0
|
||||||
|
multiitems = '1' if row[2] == 'Pallrad' else '0'
|
||||||
|
n1 = ArticleShelf(
|
||||||
|
LagPlats=row[1], JAPP_EWMS_zoneid=row[3], LagStalle='0',
|
||||||
|
LagPlatsTyp=SHELF_TYPES.get(row[2]), MaxNoOfItemsOnBin=maxkg,
|
||||||
|
MultiItemsOnBin=multiitems, JAPP_EWMS_AllowMultipleBatchesOnBin=multiitems,
|
||||||
|
ForetagKod=1)
|
||||||
|
|
||||||
|
db.raw_db.merge(n1)
|
||||||
|
db.raw_db.commit()
|
||||||
|
logger.info('Succesfully commited shelfs to database')
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: Should be moved to separate project with Lindvalls specific code
|
||||||
|
def update_replenishment_levels(filename='repl_shelfs.csv'):
|
||||||
|
import csv
|
||||||
|
|
||||||
|
repl_shelfs = []
|
||||||
|
with open(filename, newline='') as csvfile:
|
||||||
|
shelfreader = csv.reader(csvfile, delimiter=',')
|
||||||
|
headers = shelfreader.__next__()
|
||||||
|
logger.info('Found these columns: %s' % (', '.join(headers)))
|
||||||
|
for row in shelfreader:
|
||||||
|
repl_shelfs.append({
|
||||||
|
'shelf': row[0],
|
||||||
|
'article_no': str(row[1])
|
||||||
|
})
|
||||||
|
logger.info('Updating %d replenishment levels' % (len(repl_shelfs)))
|
||||||
|
Warehouse.add_replenish(repl_shelfs)
|
||||||
|
logger.info('Succesfully commited levels to database')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# from pprint import pprint
|
||||||
|
# all_shelfs = Warehouse.get_all_shelfs()
|
||||||
|
# pprint([shelf.to_dict() for shelf in all_shelfs])
|
||||||
|
|
||||||
|
# Warehouse.delete_empty_shelfs()
|
||||||
|
update_shelfs_from_csv()
|
||||||
|
|
||||||
|
# update_replenishment_levels()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue