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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/ivan09/p/16981744.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通