logistics/取订单标准物流费.ipynb

7.1 KiB
Raw Blame History

In [ ]:
# 根据订单号,查询实际包裹尺寸,实际包裹实重,实际包裹体积重,
# bill账单给头程单价实际尾端计费重预估尾端成本尾端附加费

import os
import pandas as pd
from utils.Package import Package,Package_group
from utils.gtools import MySQLconnect
from utils.countryOperator import OperateCountry
from utils.logisticsBill import BillFactory, Billing
import requests
import json
ods = MySQLconnect("ods")
engine = ods.engine()
def get_package_info_by_sql(order_df):
    packages = Package_group()
    packages_str = ""
    for index, row in order_df.iterrows():
        if row['包裹数据'] is None:
            return None,""
        row['包裹数据'] = json.loads(row['包裹数据'])
        item_list = [
                {key: float(value) for key, value in package.items()} for package in row['包裹数据'].values()
            ]
        for item in item_list:
            if item['长'] == 0 or item['宽'] == 0 or item['高'] == 0 or item['重量'] == 0:
                return None,""
            package = Package(row['SKU'], item['长'], item['宽'], item['高'], item['重量'])
            packages.add_package(package)
            # 实际包裹尺寸
            package_str = f"{ item['重量']}|{item['长']}*{ item['宽']}*{item['高']}"
            packages_str += package_str + ","
    return packages,packages_str

def get_biaozhun_bill(opCountry,order_id,postcode,convey,amount):
    print(order_id)
    # 取标准包裹数据
    sql = """SELECT
    order_id,
    opl.SKU,
    包裹数据
    FROM
    dws.order_product_list opl
    LEFT JOIN ads.sku_package_new spi ON opl.SKU =spi.SKU
    WHERE
    order_id = %s
    AND
    opl.order_product_id REGEXP "[0-9]{15}_[0-9]*$"
    """
    order_package_date = pd.read_sql(sql, engine, params=(order_id,))
    print(order_package_date)
    if order_package_date['包裹数据'] is None:
        return "",0,0,0,0,0,"","",0
    # 取账单数据
    beizhu = amount
    conveys = 1 if convey == "海运" else 0
    try:
        packages,packages_str = get_package_info_by_sql(order_package_date)
        if packages is None:
            return "",0,0,0,0,0,"","",0
        bill = Billing(str(order_id),opCountry,packages,postcode,company_name=None,head_type=conveys,beizhu=beizhu)
        print(bill)
        tail_amount = bill.bill_dict()["预测尾端"]
        total_weight = sum([p.weight/1000 for p in packages.packages])
        _type =  bill.bill_dict()["尾端渠道"]
        head_amount = bill.bill_dict()["预测头程CNY"]
        total_amount = bill.bill_dict()["总金额USD"]
        volume_weight = bill.bill_dict()["体积重"]
        per_head = bill.bill_dict()["头程单价"]
        other_detail = bill.get_other_fee()
        return packages_str,total_weight,volume_weight,per_head,head_amount,tail_amount,other_detail,_type,total_amount
    except ZeroDivisionError as e:
        print(e)
        return "",0,0,0,0,0,"","",0
In [ ]:
sql = """SELECT
        CONCAT("[",GROUP_CONCAT(pr.包裹号),"]") AS package_group ,
        ol.order_id ,
        ol.postcode,
        ol.delivery_country,
        ol.convey,
				ols.`货币`,
				ols.`订单总额`,
				ols.支付方式,
        ol.order_price_dollar
    FROM
        parcel pr
        LEFT JOIN dwd.order_list ol ON ol.order_id = pr.订单号 
				left JOIN ods.order_list_supplement ols ON ol.order_id = ols.订单号
    WHERE
        order_id IN (250111180013924 ,
250114055637547 ,
250113020908795 ,
250113090041954 ,
250112064002567 ,
250112105838284 ,
250111100026591 ,
250112131002633 ,
250113090613446 ,
250115164425035 ,
250111231028179 ,
250117024809584 ,
250117005435286 ,
250117100906322 ,
250113100616085 ,
250117053614017 ,
250113011509113 ,
250119211402563 ,
250119153413596 ,
250117234053287 ,
250127001437947 ,
250127175227235 ,
250129051002053 ,
250121125819971 ,
250122061036006 ,
250129112827456 ,
250121212647006 ,
250124213014331 ,
250202204402848 ,
250130194409986 ,
250128015414537 ,
250201063711441 ,
250129075002066 


)
GROUP BY ol.order_id
"""

order_id_df = pd.read_sql(sql,engine)
order_id_df[["包裹尺寸详情","实重","体积重","头程单价","头程费用(CNY)","尾端费用(当地货币)","尾端附加费","尾端渠道","总金额(USD)"]] = order_id_df.apply(lambda x: get_biaozhun_bill(OperateCountry(x['delivery_country']),
                                                                                                                        x['order_id'],
                                                                                                                    x['postcode'],    
                                                                                                                    x['convey'],
                                                                                                                    x['order_price_dollar']),axis=1,result_type='expand')
In [ ]:

In [ ]:
order_id_df.to_clipboard()
In [ ]:
#