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())





posted @ 2022-12-14 12:31  烦恼1234  阅读(27)  评论(0编辑  收藏  举报