python排货规则算法,在一个仓库中,存在多个单号,每一个相同的单号,有不同库龄和不同数量的货物,库龄大的优先出库,若某个单号每天出库10票,优先出库库龄大的,如果库龄最大的数量出完了,但是此单号还没出完10票,则开始出库龄第二大的,直到此单号出满10票为止,或者直至此单号库存为0为止,且此单号每天入库2票,则此单号新增两票库龄为1天的货物,然后在执行下一个新单号的出库和入库需求,连续30天以此类推,最终生成一个各个单号1-30天的库存变化的Excel表格,python代码怎么实现
时间: 2024-03-20 20:40:53 浏览: 80
与前一个问题相比,这个问题中每个单号可能存在多个货物,因此我们需要将每个单号的货物信息保存到一个嵌套字典中,字典的键为单号,值为另一个字典,该字典的键为货物编号,值为包含库存数量和库龄信息的元组。例如,单号为"001",货物编号为"01",库存数量为50,库龄为3天,则字典中的对应项应为:"001": {"01": (50, 3)}。
在模拟入库和出库操作时,我们需要遍历所有单号和货物,按照库龄从大到小的顺序出库,直到某个单号出完10票或库存为0为止。如果某个货物出库不足10票,我们就从相邻的库龄较小的货物中补足数量,同时将库存中相应的货物库龄加1。如果某个单号的所有货物出库完成后库存为0,则删除该单号的信息。出库完成后,我们再根据每个单号的入库需求,将新货物加入库存中。
最后,我们将每个单号每天的库存变化保存到一个二维列表中,再将其转化为Excel表格即可。
下面是一个可能的实现代码:
```python
import openpyxl
# 初始化单号和货物信息字典
inventory = {
"001": {"01": (50, 3), "02": (100, 2)},
"002": {"03": (200, 1)},
"003": {"04": (50, 2), "05": (100, 1)}
}
# 初始化每个单号的入库需求
incoming = {
"001": 2,
"002": 3,
"003": 5
}
# 初始化每个单号每天的库存变化列表
stock_changes = [[] for i in range(30)]
# 模拟30天的入库和出库操作
for day in range(30):
# 遍历所有单号和货物
for item in inventory:
for product in inventory[item]:
# 获取该货物的库存数量和库龄
stock, age = inventory[item][product]
# 如果该货物库存为0,则跳过出库操作
if stock == 0:
continue
# 计算该货物需要出库的数量
to_be_delivered = min(stock, 10)
# 从该货物的库存中按照库龄从大到小的顺序出库
for i in range(age, 0, -1):
if to_be_delivered == 0:
break
if inventory[item][product][1] == i:
# 出库数量不足10票,从相邻库龄的货物中补足数量
if to_be_delivered > stock:
to_be_delivered -= stock
inventory[item][product] = (0, age + 1)
# 出库数量足够,更新库存和出库数量
else:
inventory[item][product] = (stock - to_be_delivered, age)
to_be_delivered = 0
# 记录该货物当天的出库数量和库存变化
stock_changes[day].append((item, product, -to_be_delivered))
# 如果该货物出库数量不足10票,从相邻的库龄较小的货物中补足数量
while to_be_delivered > 0:
for i in range(age - 1, 0, -1):
if to_be_delivered == 0:
break
if inventory[item][product][1] == i:
stock = min(to_be_delivered, incoming[item])
inventory[item][product] = (inventory[item][product][0] + stock, i)
to_be_delivered -= stock
incoming[item] -= stock
# 记录该货物当天的入库数量和库存变化
stock_changes[day].append((item, product, stock))
# 如果该单号的所有货物出库完成后库存为0,则删除该单号的信息
if sum([inventory[item][p][0] for p in inventory[item]]) == 0:
del inventory[item]
# 处理所有单号的入库需求
for item in incoming:
for i in range(incoming[item]):
# 为该单号新增两票库龄为1天的货物
new_product = f"{len(inventory[item]) + 1:02}"
inventory[item][new_product] = (2, 1)
# 将每个单号每天的库存变化保存到Excel表格中
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = 'Day'
for i in range(1, 31):
ws.cell(row=1, column=i+1).value = f"Day {i}"
row = 2
for item in inventory:
for product in inventory[item]:
ws.cell(row=row, column=1).value = f"{item}-{product}"
for j, change in enumerate(stock_changes):
stock = inventory[item][product][0]
for c in change:
if c[0] == item and c[1] == product:
stock += c[2]
ws.cell(row=row, column=j+2).value = stock
row += 1
wb.save('inventory.xlsx')
```
这段代码模拟了30天的入库和出库操作,并将每个单号每天的库存变化保存到了名为"inventory.xlsx"的Excel表格中。你可以根据实际需求修改代码中的初始库存、入库需求和运行天数等参数。
阅读全文