wms库存调整

# xtw 库存调整 # 这一段没有比对 原库位sp库存一致 没有做排除 import time import requests import pandas as pd from openpyxl import Workbook wb = Workbook() ws = wb.active # title = ['69码','库位','调整后库存','当前库位上的库存','货主','sp码','备注','库存id','现存库位id','指定库位id'] title =['sp' ,'目标库位id', '期望库存', '调整库位id','目标库位库存' ,'合计库存'] # sp 目标库位id 期望库存 调整库位id,目标库位库存,合计库存 # 因为货主的原因 存在一个品在同库位多个库存记录,此次第二批已经排除不包含,所以未将货主纳入 #主要是判断目标库位、默认库位上库存是否足够;一律排除其他库位 # 只有默认库存库存记录: # 1.库存足够,分别对目标库存进行移库就ok; # 2.库存小于合计库存,需要先进行默认库位上库存调整,然后分别对目标库存进行移库就ok; # 部分存在库存记录 # 1.目标库存足够,进行移库至目标库位; # 1.1 默认库存库存足够,分别对目标库存进行移库就ok; # 1.2 库存小于剩余合计库存,需要先进行默认库位上库存调整,然后分别对目标库存进行移库就ok; # 2.库存刚好,默认库位对目标库位进行移库就ok; # 2.1 默认库存库存足够,分别对目标库存进行移库就ok; # 2.2 库存剩余小于合计库存,需要先进行默认库位上库存调整,然后分别对目标库存进行移库就ok; # 3.库存小于目标库位上库存,需要先进行默认库位上库存调整,然后分别对目标库存进行移库就ok; # 3.1 默认库存库存足够,分别对目标库存进行移库就ok; # 3.2 库存小于剩余合计库存,需要先进行默认库位上库存调整,然后分别对目标库存进行移库就ok; # 库存记录 全部符合; # 1.只需要进行库存调整即可,无需移库 ws.append(title) session_wms = requests.Session() info =() # 这个url是登陆入口 login_url = "https://apollo-api.xtw-tech.com/v1/auth/token" inventories = [] inventories_MOVE = [] inventories_initialize =[] inventories_move_only =[] # 请求头文件Request Headers headers = { # 'accept': 'application/json, text/plain, */*', # 'accept-encoding': 'gzip, deflate, br', # 'accept-language': 'zh-CN,zh;q=0.9', # 'content-length': '46', # 'content-type': 'application/json', 'grpc-metadata-application-code': 'VENUS', # 'grpc-metadata-user-auth-token': 'null', # 'origin': 'https://mercury.xtw-tech.com', # 'referer': 'https://mercury.xtw-tech.com/', # 'sec-fetch-mode': 'cors', # 'sec-fetch-site': 'same-site', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36' } # 登陆wms data = { 'username': "xujingfei", 'password': "Xjf2567483" } # 登录wms response_wms = session_wms.post(url=login_url, headers=headers, json=data) adjust_data = pd.read_excel('/Users/xujingfei/Desktop/test/药品.xlsx',sheet_name='Sheet1',engine='openpyxl') # # 需要改变遍历方式 # 用于存储sp在该仓库的库位上的库存记录情况 global inventorylist inventorylist = {} #用于存储sp在目标库位上的目标库存 in_list ={} for i in range(len(adjust_data.index)): id = adjust_data.iloc[i, :8] ean_code = id.at['sp码'] sp_code = id.at['69码'] inventory_name_data = id.at['库位'] inventory_id_data = id.at['inventory_id'] num_data = id.at['调整后库存'] total = id.at['合计库存'] if ean_code in in_list.keys(): in_list[f'{ean_code}'][f'{inventory_id_data}'] = [num_data,total] else: in_list[f'{ean_code}'] ={} in_list[f'{ean_code}'][f'{inventory_id_data}'] = [num_data,total] #当前商品的库存价格 currentInventoryCost 、当前库存currentQuantity 库存id inventoryId li = 'https://titan-api.xtw-tech.com/v1/inventory/list' header ={ 'authority': 'titan-api.xtw-tech.com', 'method': 'POST', 'path': '/v1/inventory/list', 'scheme': 'https', 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'content-length': '471', 'content-type': 'application/json', 'grpc-metadata-application-code': 'MERCURY', 'grpc-metadata-user-auth-token': f'{response_wms.cookies.values()[0]}', 'origin': 'https://mercury.xtw-tech.com', 'referer': 'https://mercury.xtw-tech.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', } data = {'tenantId': "344", 'listOption': {'page': '1', 'pageSize': '100', 'keyword': "", 'sortBy': {'fieldToSort': "quantity", 'direction': "ASCENDING"}, 'fieldFilter': [{'fieldToFilter': "no_virtual_location", 'keyword': "1"}, {'fieldToFilter': "only_no_lot", 'keyword': "0"}, {'fieldToFilter': "sp_code", 'keyword': f"{ean_code}"}, {'fieldToFilter': "warehouse_ids", 'keyword': "741"}, {'fieldToFilter': "inventory_scrap_type", 'keyword': "normal"}, {'fieldToFilter': "inventory_lot_status", 'keyword': "valid"}, {'fieldToFilter': "is_show_invalid", 'keyword': "0"}, {'fieldToFilter': "no_zero_inventory", 'keyword': "0"}], 'keyword': ""}} invent_respon =session_wms.post(url=li,headers=header,json=data) item = invent_respon.json()['items'] inventorylist[f'{ean_code}'] ={} price = 0 for i in item: sp_inventory_id = i['id'] currentInventoryCost = i['inventoryCost'] owner_id = i['owner']['id'] owner_name = i['owner']['name'] currentQuantity = i['quantity'] inventoryId = i['location']['id'] sp = i['standardProductTenantMapping']['standardProduct']['code'] if inventoryId in inventorylist[f'{ean_code}'].keys(): if inventoryId !='261312': # 如何 将库存id也一块保存下来呢 inventorylist[f'{ean_code}'][f'{inventoryId}'][0] += int(currentQuantity) # 将该sp的在该仓库所有的库存记录的库位id均保存下来 inventorylist[f'{ean_code}'][f'{inventoryId}'] = [inventorylist[f'{ean_code}'][f'{inventoryId}'][0],sp_inventory_id,currentInventoryCost] else: inventorylist[f'{ean_code}'][f'{inventoryId}'] = [int(currentQuantity),sp_inventory_id,currentInventoryCost] # 取默认库位上最大value else: inventorylist[f'{ean_code}'][f'{inventoryId}'] = [int(currentQuantity),sp_inventory_id,currentInventoryCost] # 开始进入判断条件 # 只有默认库存记录 # in_list {'SP103137869481243740': {'274930': [60, 94], '274906': [34, 94]}, 'SP103730206541817827': {'276062': [613, 1223], '276060': [610, 1223]}} # inventorylist {'SP103137869481243740': {'261312': '94'}, 'SP103730206541817827': {'276062': '898', '276060': '182', '261312': '69'}} default = '261312' print(in_list,'\n') # 需要按照目标库位分配执行库存 print(inventorylist) # sp在仓库库位库存分布情况 # 库存调整的时候需要库存id for key_1,val_1 in in_list.items(): expect = 0 temp_total = 0 i = 0 ke = '' for key_2,val_2 in val_1.items(): # 有库存记录的 自己库位上调整 没有库存记录的 就统一由默认库位进行调整 然后分发需求剩余的库存给目标库位 if key_2 in inventorylist[key_1].keys() and int(inventorylist[key_1][key_2][0]) != int(val_1[key_2][0]): # 目前库位存在于库存记录中 # i+=1 # 需要做库存调整,调整值为目标'调整后库存',无论现有目标库位上库存是多少,仅需要库存调整,此时为目标库位 # 提前处理掉数据 保证 sp-库位-库存 一致的被排除掉 expectquantity= val_1[key_2][0] # temp_total = in_list[key_1][key_2][1]-temp_total # 这里这个 tem_total 好像有点鸡肋 没有起到作用 temp_total = in_list[key_1][key_2][1]-expectquantity # 这里这个 tem_total 好像有点鸡肋 没有起到作用 temp_total是合计调整库存的临时变量 dic = {'currentInventoryCost': f"{inventorylist[key_1][key_2][2]}", 'currentQuantity': f"{inventorylist[key_1][key_2][0]}", 'expectedInventoryCost': f"{inventorylist[key_1]['261312'][2]}", 'expectedQuantity': f"{expectquantity}", 'inventoryId': f"{inventorylist[key_1][key_2][1]}"} inventories.append(dic) # sp 目标库位id 期望库存 调整库位id,目标库位库存,合计库存 info =(key_1, # sp key_2,#目标库位id expectquantity, key_2, in_list[key_1][key_2][0], in_list[key_1][key_2][1]) ws.append(info) elif int(inventorylist[key_1][key_2][0]) == int(val_1[key_2][0]): print('sp-库位-库存无须处理') else: # 说明一次没有匹配到条件1 i==0 不够包含 # 还需要注意 当默认库存上库存 与expect 一样时无需调整 # 传参至外部 ke = key_2 print(key_1,key_2) # 需要考虑到当默认库位上的库存刚好足够 目标库位库存的时候,就不要在对默认库位做库存调整,直接进行后续移库就可以了。 if inventorylist[key_1]['261312'][0] != temp_total or inventorylist[key_1]['261312'][0]==0 : i+=1 expect +=val_1[key_2][0] temp_total = temp_total-val_1[key_2][0] else: expect = 0 print('Nothing') # 默认库位需要调整的库存为 合计库存 # 开始动用默认库位 # 需要做库存调整,调整值为目标'调整后库存',先库存调整后移库 if i>=1: if expect ==inventorylist[key_1]['261312'][0]: pass else: dic_move = {'currentInventoryCost': f"{inventorylist[key_1]['261312'][2]}", 'currentQuantity': f"{inventorylist[key_1]['261312'][0]}", 'expectedInventoryCost': f"{inventorylist[key_1]['261312'][2]}", 'expectedQuantity': f"{expect}", 'inventoryId': f"{inventorylist[key_1]['261312'][1]}"} print(dic_move) info =(key_1, ke,expect,'261312',inventorylist[key_1]['261312'][0],in_list[key_1][ke][1]) ws.append(info) inventories_MOVE.append(dic_move) wb.save('/Users/xujingfei/Desktop/test/结果-汇总-5.xlsx') # 移库量确定 # {'locationId': f"{locationId}", 'quantity': f"{quantity}", 'snapshotQuantity': f"{snapshotQuantity}", 'tenantId': "344"} # inventories_move_only # 需要比较原目标库位上库存 &目标库存 # snapshotQuantity = # # 循环结束以后提交调整单 create = 'https://titan-api.xtw-tech.com/v1/adjustment_record/create' header = { 'authority': 'titan-api.xtw-tech.com', 'method': 'POST', 'path': '/v1/adjustment_record/create', 'scheme': 'https', 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'content-length': '342', 'content-type': 'application/json', 'grpc-metadata-application-code': 'MERCURY', 'grpc-metadata-user-auth-token': f'{response_wms.cookies.values()[0]}', 'origin': 'https://mercury.xtw-tech.com', 'referer': 'https://mercury.xtw-tech.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', } dd = inventories+inventories_MOVE print(dd) data = {'name': "岳阳中心仓库存调整1211-1", 'warehouseId': "741", 'inventories': dd, 'tenantId': "344"} wjj = session_wms.post(json=data,headers=header,url=create) print(wjj.json())

__EOF__

本文作者ivan09
本文链接https://www.cnblogs.com/ivan09/p/16981744.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   烦恼1234  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示