|
不知道对不对了
用py写的
- from collections import deque
- import xlwings as xl
- from itertools import groupby
- from math import ceil
- wb = xl.Book("余料匹配.xls")
- sht = wb.sheets[0]
- kc = sorted(sht.range("d3").expand().value, key=lambda x: (x[0], x[1]))
- dic = {}
- for row in kc:
- dic.setdefault(row[0], deque()).append(row)
- def find_liao(row, dic):
- """给一行记录, 去库存字典里自动找库存函数
- :row -> 一行记录
- :dic -> 库存字典
- :return -> 使用库存记录和剩余数量
- """
- key = row[0]
- dq = dic[key]
- guige = row[1]
- num = row[2]
- yong = [] # 使用库存的数据
- res = []
- for _ in range(len(dq)):
- temp = dq.popleft()
- if temp[1] < guige: # 如果规格太小了就直接从右边回去
- dq.append(temp)
- continue
- kc_num = temp[2]
- kc_guige = temp[1]
- max_num = kc_guige // guige * kc_num # 最大的根数
- # 分三个情况
- if max_num == num: # 完全相等正好用了
- yong.append("-".join(map(str, temp)))
- num = 0
- break
- if max_num < num: # 不够解决问题的时候, 全部要给使用, 不用再返回库存
- yong.append("-".join(map(str, temp)))
- num = num - max_num # 需要的数据更新下
- if max_num > num: # 够的情况, 但是要返回库存一部分数据
- n = ceil(num / (kc_guige // guige)) # 需要多少根
- temp[2] = kc_num - n # 库存剩余数量
- yong.append("-".join(map(str, [key, kc_guige, n]))) # 使用记录
- if temp[2] != 0:
- dq.append(temp) # 如果剩余就更新下库存
- num = 0
- break
- return "\n".join(yong), num # 返回文本库存使用记录, 和剩余数量
- kc = sorted(sht.range("d3").expand().value, key=lambda x: (x[0], x[1]))
- dic = {}
- for row in kc:
- dic.setdefault(row[0], deque()).append(row)
- data = sht.range("a3").resize(len(kc), 3).value
- # 先处理一个的逻辑
- for row in data:
- s, n = find_liao((row), dic)
- row.extend([s, n])
- wb.sheets[1].range("a2").expand().clear_contents()
- wb.sheets[1].range("a2").value = data
- # 写入库存剩余数量
- res = []
- for k, v in dic.items():
- if len(v) > 0:
- for row in v:
- res.append(row)
- wb.sheets[1].range("g2").expand().clear_contents()
- wb.sheets[1].range("g2").value = res
复制代码
|
评分
-
1
查看全部评分
-
|