logistics/拦截订单详细数据.ipynb

33 KiB
Raw Blame History

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

import os
import re
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_SKU_info(order_id):
    """
    根据订单号获取SKU信息,以及入库采购价
    """
    SKULIST = """
        SELECT
            order_id,
            CASE WHEN COUNT(DISTINCT opl.SKU) = 1 THEN "单SKU" ELSE "多SKU" end as "SKU类型",
            CONCAT(group_concat(opl.SKU),",") as "SKU明细",
            sum(s1.`成本价`*product_num) AS "入库采购价"
        FROM
            dws.order_product_list opl LEFT JOIN ods.stg_bayshop_litfad_sku s1  on s1.sku = opl.sku
            LEFT JOIN dwd.dim_erp_sku_package_vol_info des on des.erp_sku = opl.sku
        
        WHERE
            order_id = %s
        AND order_product_id regexp "[0-9]{15}_[0-9]*$"
        GROUP BY order_id 
            
        """
    engine = ods.engine()
    sku_df = pd.read_sql(SKULIST, engine,params=(order_id,))
    # print("SKU类型:",sku_df['SKU类型'][0],"SKU明细:",sku_df['SKU明细'][0],"入库采购价:",sku_df['入库采购价'][0])
    return sku_df['SKU类型'][0],sku_df['SKU明细'][0],sku_df['入库采购价'][0]

def get_package_real_vol_by_api(packages_id):
    """
    根据订单号的包裹ID,返回包裹类包裹明细包裹实重包裹体积重6000
    """
    packages = Package_group()
    packages_str = ""
    packages_weight=0
    packages_vol = 0
    for package_id in packages_id:
        url = f'https://cp.maso.hk/index.php?main=biphp&act=package_fund&key=W6BOYJ7BH27YCGRFCA0LWBVKMU1KRU5Q&package={package_id}'
        resp = requests.get(url).json()
        if resp['code'] == "0":
            weight = int(float(resp['data'][0]['weight'])*1000)
            package_length = resp['data'][0]['l'].replace(",","") if len(resp['data'][0]['l'])>0 else "0"
            package_width = resp['data'][0]['w'].replace(",","") if len(resp['data'][0]['w'])>0 else "0"
            package_hight = resp['data'][0]['h'].replace(",","") if len(resp['data'][0]['h'])>0 else "0"
            package = Package(str(package_id),float(package_length),float(package_width),float(package_hight),weight)
            packages.add_package(package)
            # 实际包裹尺寸
            package_str = f"{weight}|{package_length}*{package_width}*{package_hight}"
            packages_str += package_str + ","
    return packages,packages_str

def get_shiji_bill(opCountry,order_id,packages_id,postcode,convey,amount):
    # print(order_id)
    beizhu = amount
    conveys = 1 if convey == "海运" else 0
    try:
        packages,packages_str = get_package_real_vol_by_api(packages_id=packages_id)
        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
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(re.search(r"\d+\.?\d*", str(value)).group()) 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(country,order_id,postcode,convey,amount):
    print(order_id)
    # 取标准包裹数据
    sql = """SELECT
    order_id,
    opl.SKU,
    包裹数据
    FROM
    dws.order_product_list opl
    LEFT JOIN ads.new_erp_sku_size 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['SKU'])
    if order_package_date['包裹数据'] is None:
        return "",0,0,0,0,0,"",""
    # 取账单数据
    beizhu = amount
    conveys = 1 if convey == "海运" else 0
    opCountry = OperateCountry(country)
    try:
        packages,packages_str = get_package_info_by_sql(order_package_date)
        if packages is None:
            return "",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
    except ZeroDivisionError as e:
        print(e)
        return "",0,0,0,0,0,"",""
In [8]:
sql = """SELECT
        ol.order_id ,
        CONCAT("[",GROUP_CONCAT(pr.包裹号),"]") AS package_group ,
        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
    NOT EXISTS (
        SELECT
            1 
        FROM
            `order_express` oe 
        WHERE
        oe.包裹号 = pr.包裹号 
        AND oe.包裹状态 = "已作废")
    AND order_id IN (250610233027170 ,
250608163427468 ,
250521222214528 ,
250610230415406 ,
250607044202071 ,
250607144614471 ,
250607211414736 ,
250401032025780 ,
250531061202721 ,
250611112802162 ,
250614114015175 ,
250610185002525 ,
250610022439644 ,
250404163802384 ,
250531191002625 ,
250610035602297 ,
250609232002941 

)
    GROUP BY ol.order_id
"""
In [9]:
order_id_df = pd.read_sql(sql,engine)
# SKU类型和SKU明细以及入库采购价
order_id_df[['订单SKU类型','订单SKU明细','入库采购价']] = order_id_df.apply(lambda x: get_SKU_info(x['order_id']), axis=1, result_type='expand')

# 获取标准账单
order_id_df[["标准包裹尺寸详情","标准实重","标准体积重","标准头程单价","标准头程费用(CNY)","标准尾端费用(当地货币)","标准尾端附加费","标准尾端渠道"]] = order_id_df.apply(lambda x: get_biaozhun_bill(
                                                                                                                x['delivery_country'],
                                                                                                                        x['order_id'],
                                                                                                                    x['postcode'],    
                                                                                                                    x['convey'],
                                                                                                                    x['order_price_dollar']),axis=1,result_type='expand')
# 获取实际采购价
# order_id_df['实际采购价'] = order_id_df['order_id'].apply(lambda x: get_purchase_price(x))

# 获取实际账单
order_id_df[["实际包裹尺寸详情","实际实重","实际体积重","实际头程单价","实际头程费用(CNY)","实际尾端费用(当地货币)","实际尾端附加费","实际尾端渠道","总金额(USD)"]] = order_id_df.apply(lambda x: get_shiji_bill(OperateCountry(x['delivery_country']),
                                                                                                                        x['order_id'],
                                                                                                                    eval(x['package_group']),
                                                                                                                    x['postcode'],    
                                                                                                                    x['convey'],
                                                                                                                    x['order_price_dollar']),axis=1,result_type='expand')

order_id_df.to_clipboard()
250401032025780
0    2205003721
Name: SKU, dtype: int64
账单名称: 250401032025780
账单项:head_amount: 22.307399999999998 CNY   base: 7.17 USD   residential_delivery: 2.08 USD   fuel: 1.66 USD   tail_amount: 10.91 USD   总金额: 14.033036 USD
250404163802384
0    2205811679
Name: SKU, dtype: int64
账单名称: 250404163802384
账单项:head_amount: 79.78666666666666 CNY   base: 11.9 EUR   bigpackage: 44.5 EUR   fuel: 7.33 EUR   tail_amount: 63.73 EUR   总金额: 82.54773333333334 USD
250521222214528
0    2202859120
1    2202859129
Name: SKU, dtype: int64
账单名称: 250521222214528
账单项:head_amount: 2470.0 CNY   base: 7.4 GBP   tail_amount: 7.4 GBP   总金额: 355.42 USD
250531061202721
0    227752959
Name: SKU, dtype: int64
账单名称: 250531061202721
账单项:head_amount: 109.83735000000001 CNY   base: 21.9 USD   oversize: 8.17 USD   remote: 2.17 USD   residential_delivery: 2.08 USD   fuel: 6.18 USD   tail_amount: 40.5 USD   总金额: 55.877229 USD
250531191002625
0    2205993938
Name: SKU, dtype: int64
账单名称: 250531191002625
账单项:head_amount: 72.83966666666667 CNY   base: 11.9 EUR   fuel: 1.55 EUR   tail_amount: 13.45 EUR   总金额: 25.261553333333335 USD
250607044202071
0    228294469
Name: SKU, dtype: int64
账单名称: 250607044202071
账单项:head_amount: 168.73212180000002 CNY   base: 20 USD   transfer: 9.37 USD   tail_amount: 29.37 USD   总金额: 52.992497052000004 USD
250607144614471
0    227555929
Name: SKU, dtype: int64
账单名称: 250607144614471
账单项:head_amount: 37.5 CNY   base: 8.18 USD   residential_delivery: 2.08 USD   fuel: 1.85 USD   tail_amount: 12.11 USD   总金额: 17.36 USD
250607211414736
0    229586263
Name: SKU, dtype: int64
账单名称: 250607211414736
账单项:head_amount: 47.25 CNY   base: 7.77 USD   residential_delivery: 2.08 USD   fuel: 1.77 USD   tail_amount: 11.62 USD   总金额: 18.235 USD
250608163427468
0    227658471
Name: SKU, dtype: int64
账单名称: 250608163427468
账单项:head_amount: 554.4 CNY   base: 3.7 GBP   tail_amount: 3.7 GBP   总金额: 82.426 USD
250609232002941
0    2206109629
Name: SKU, dtype: int64
账单名称: 250609232002941
账单项:head_amount: 94.5 CNY   base: 10.2 EUR   fuel: 1.33 EUR   tail_amount: 11.53 EUR   总金额: 26.1436 USD
250610022439644
0    2206929691
Name: SKU, dtype: int64
账单名称: 250610022439644
账单项:head_amount: 280.0 CNY   base: 11.9 EUR   overweight: 2.89 EUR   fuel: 1.92 EUR   tail_amount: 16.71 EUR   总金额: 57.915200000000006 USD
250610035602297
0    2204180587
Name: SKU, dtype: int64
账单名称: 250610035602297
账单项:head_amount: 177.072 CNY   base: 20.4 EUR   overweight: 2.89 EUR   bigpackage: 44.5 EUR   fuel: 8.81 EUR   tail_amount: 76.6 EUR   总金额: 110.58208 USD
250610185002525
0    2203543601
Name: SKU, dtype: int64
账单名称: 250610185002525
账单项:head_amount: 95.33333333333333 CNY   base: 11.9 EUR   overweight: 2.89 EUR   bigpackage: 44.5 EUR   fuel: 7.71 EUR   tail_amount: 67.0 EUR   总金额: 88.38666666666667 USD
250610230415406
0    2205149996
Name: SKU, dtype: int64
账单名称: 250610230415406
账单项:head_amount: 735.0 CNY   base: 32.25 USD   oversize: 11.83 USD   remote: 2.17 USD   residential_delivery: 2.08 USD   fuel: 8.7 USD   tail_amount: 57.02 USD   总金额: 159.92000000000002 USD
250610233027170
0    229445257
Name: SKU, dtype: int64
账单名称: 250610233027170
账单项:head_amount: 1645.6533333333334 CNY   base: 3.7 GBP   tail_amount: 3.7 GBP   总金额: 235.2014666666667 USD
250611112802162
0    2206393292
Name: SKU, dtype: int64
账单名称: 250611112802162
账单项:head_amount: 49.6 CNY   base: 6.02 AUD   fuel: 0.31 AUD   tail_amount: 6.33 AUD   总金额: 11.375 USD
250614114015175
0    2202252863
Name: SKU, dtype: int64
账单名称: 250614114015175
账单项:head_amount: 270.9 CNY   base: 17.08 AUD   fuel: 0.87 AUD   tail_amount: 17.95 AUD   总金额: 50.491 USD
账单名称: 250401032025780
账单项:head_amount: 121.93650000000001 CNY   base: 20 USD   transfer: 6.77 USD   tail_amount: 26.77 USD   总金额: 43.84111 USD
账单名称: 250404163802384
账单项:head_amount: 176.11733333333333 CNY   base: 111.67 EUR   notify: 5 EUR   responsibility: 1.85 EUR   management: 2 EUR   toll: 0.72 EUR   tail_amount: 121.24 EUR   总金额: 160.44522666666668 USD
账单名称: 250521222214528
账单项:head_amount: 14967.906666666668 CNY   base: 55.0 GBP   tail_amount: 55.0 GBP   总金额: 2167.0069333333336 USD
账单名称: 250531061202721
账单项:head_amount: 694.17 CNY   base: 210 USD   tail_amount: 210.0 USD   总金额: 307.1838 USD
账单名称: 250531191002625
账单项:head_amount: 381.6 CNY   base: 11.9 EUR   overweight: 2.89 EUR   bigpackage: 44.5 EUR   fuel: 7.71 EUR   tail_amount: 67.0 EUR   总金额: 128.464 USD
账单名称: 250607044202071
账单项:head_amount: 1059.24 CNY   base: 75 USD   transfer: 58.85 USD   tail_amount: 133.85 USD   总金额: 282.1436 USD
账单名称: 250607144614471
账单项:head_amount: 533.5740000000001 CNY   base: 53.85 USD   oversize: 8.17 USD   residential_delivery: 4.16 USD   fuel: 11.91 USD   tail_amount: 78.09 USD   总金额: 152.79036000000002 USD
账单名称: 250607211414736
账单项:head_amount: 655.1999999999999 CNY   base: 59.17 USD   oversize: 8.17 USD   residential_delivery: 4.16 USD   fuel: 12.87 USD   tail_amount: 84.38 USD   总金额: 176.108 USD
账单名称: 250608163427468
账单项:head_amount: 2968.0 CNY   base: 48.02 GBP   fuel: 4.8 GBP   tail_amount: 52.82 GBP   总金额: 484.18600000000004 USD
账单名称: 250609232002941
账单项:head_amount: 351.488 CNY   base: 111.41 EUR   notify: 5 EUR   responsibility: 1.85 EUR   management: 2 EUR   toll: 1.2 EUR   tail_amount: 121.46 EUR   总金额: 185.24352000000002 USD
账单名称: 250610022439644
账单项:head_amount: 3410.88 CNY   base: 272.46 EUR   notify: 5 EUR   responsibility: 1.85 EUR   management: 2 EUR   toll: 2.16 EUR   tail_amount: 283.47 EUR   总金额: 795.0096000000001 USD
账单名称: 250610035602297
账单项:head_amount: 1189.824 CNY   base: 310 EUR   fuel: 24.8 EUR   tail_amount: 334.8 EUR   总金额: 541.55136 USD
账单名称: 250610185002525
账单项:head_amount: 119.25333333333333 CNY   base: 136.7 EUR   notify: 5 EUR   responsibility: 1.85 EUR   management: 2 EUR   toll: 0.96 EUR   tail_amount: 146.51 EUR   总金额: 180.7866666666667 USD
账单名称: 250610230415406
账单项:head_amount: 1500.9866666666667 CNY   base: 39.39 USD   remote: 6.2 USD   big_package: 47.73 USD   residential_delivery: 5.95 USD   fuel: 17.87 USD   tail_amount: 117.14 USD   总金额: 327.27813333333336 USD
账单名称: 250610233027170
账单项:head_amount: 4055.04 CNY   base: 76.65 GBP   fuel: 7.66 GBP   tail_amount: 84.31 GBP   总金额: 677.3086000000001 USD
账单名称: 250611112802162
账单项:head_amount: 793.8000000000001 CNY   base: 26.82 AUD   fuel: 1.94 AUD   tail_amount: 28.76 AUD   总金额: 131.264 USD
账单名称: 250614114015175
账单项:head_amount: 1276.5200000000002 CNY   base: 71.19 AUD   oversize: 15.5 AUD   fuel: 6.29 AUD   tail_amount: 92.98 AUD   总金额: 243.79880000000003 USD
In [ ]:
# 取订单号和包裹号
sql = """
SELECT
        pr.包裹号,pr.订单号
    FROM
        parcel pr 	
    WHERE
    订单号 IN (250516031202445 
)
"""
package_df = pd.read_sql(sql,engine)
package_df.to_clipboard(index=False)
In [ ]:
from utils.gtools import MySQLconnect
import pandas as pd
import os
# date = "2025/3/5"
# 连接数据库
ods = MySQLconnect("ods")
engine = ods.engine()

# 读取 Excel 数据
excel_path = r"D:\test\logistics\拦截数据\拦截订单登记明细.xlsx"
order_df = pd.read_excel(excel_path, sheet_name="拦截明细", skiprows=1)
# 读取 Excel 数据时,指定 '订单号' 列为字符串类型
order_df = pd.read_excel(excel_path, sheet_name="拦截明细", skiprows=1, dtype={'订单号': str})
# order_df = order_df[order_df['拦截计算日期'] == date]
order_df = order_df[['订单号', '提交拦截申请时间']]

# 提取订单号并转为字符串
order_id = [str(x) for x in order_df["订单号"].dropna()]

if not order_id:
    print("没有符合条件的订单号,查询终止。")
else:
    try:
        # 生成占位符并执行查询
        placeholders = ', '.join(['%s'] * len(order_id))
        sql = f"""
        SELECT
            单号,
            包裹号,
            包裹状态,
            快递跟踪号,
            `关联卡板号`,
            关联提单号,
            打包时间,
            `快递公司` AS 打单渠道,
            `包裹测量时间`,
            运单生成时间 AS 打单时间,
            绑定卡板时间,
            绑定提单时间,
            `提单发货时间`
        FROM
            ods.`order_express`
        WHERE
            单号 IN ({placeholders})
        """
        df = pd.read_sql(sql, engine, params=tuple(order_id))

        # 合并数据
        order_df["订单号"] = order_df["订单号"].astype(str)
        df["单号"] = df["单号"].astype(str)
        merged_df = df.merge(order_df, left_on="单号", right_on="订单号", how="left")
        merged_df = merged_df.drop(columns=["订单号"])  # 删除重复的 '订单号' 列

        # 重新排列列顺序
        merged_df = merged_df[[
            "单号",
            "包裹号",
            "提交拦截申请时间",
            "包裹状态",
            "快递跟踪号",
            "关联卡板号",
            "关联提单号",
            "打包时间",
            "包裹测量时间",
            "打单时间",
            "打单渠道",
            "绑定卡板时间",
            "绑定提单时间",
            "提单发货时间"
        ]]

        # 检查文件是否存在,并读取目标工作表
        if os.path.exists(excel_path):
            with pd.ExcelFile(excel_path) as xls:
                sheets = xls.sheet_names
                if "包裹时间记录" in sheets:
                    existing_df = pd.read_excel(excel_path, sheet_name="包裹时间记录")
                else:
                    existing_df = pd.DataFrame(columns=merged_df.columns)  # 如果表不存在,创建一个空 DataFrame
        else:
            existing_df = pd.DataFrame(columns=merged_df.columns)  # 如果文件不存在,创建一个空 DataFrame

        # 过滤掉已存在的包裹号
        existing_package_ids = existing_df["包裹号"].astype(str).tolist()
        new_data = merged_df[~merged_df["包裹号"].astype(str).isin(existing_package_ids)]

        # 如果没有新数据,直接退出
        if new_data.empty:
            print("没有新数据需要追加。")
        else:
            # 追加新数据
            
            combined_df = pd.concat([existing_df, new_data], ignore_index=True)

            # 写入 Excel保留其他工作表
            with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a' if os.path.exists(excel_path) else 'w', if_sheet_exists='replace') as writer:
                combined_df.to_excel(writer, sheet_name="包裹时间记录", index=False)
                print("数据已成功追加到工作表!")
        
    except Exception as e:
        print(f"操作失败,错误详情:{e}")
In [ ]:
# 手动输入包裹的包裹信息
from logisticsClass.logisticsTail_EUR import KPASLLogistics_FR
from utils.Package import Package,Package_group
from utils.gtools import MySQLconnect
from utils.countryOperator import OperateCountry
from utils.logisticsBill import BillFactory, Billing
packages = Package_group()

packages.add_package(Package("包裹1", 78,35,15, 15000))
# packages.add_package(Package("包裹1", 55,45,40, 9000))
# packages.add_package(Package("包裹1", 210,55,20, 32000))
# packages.add_package(Package("包裹1", 103,42,12, 8000))
# packages.add_package(Package("包裹1", 103,42,12, 8000))

country = 'United Kingdom'
postcode ='DY13 0RX'
conveys= 0 # 1海运0空运


opCountry = OperateCountry(country)
bill = Billing(str(1),opCountry,packages,postcode,company_name=None,head_type=conveys,beizhu="1")
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()

packages_str = ""
for package in packages.packages:
    package_str = f"{package.weight}|{package.length}*{package.width}*{package.height}"
    packages_str += package_str + ","
print(f"packages_str:{packages_str}")
print(f"实重:{total_weight}")
print(f"体积重:{volume_weight}")
print(f"头程单价:{per_head}")
print(f"预测头程CNY:{head_amount}")
print(f"预测尾端(当地货币):{tail_amount}")
print(f"其他费用:{other_detail}")
print(f"尾端渠道:{_type}")
print(f"总金额USD:{total_amount}")
print(KPASLLogistics_FR.active)

查找供应商退货退款金额

In [ ]:
import pandas as pd
import numpy as np
from utils.gtools import MySQLconnect
ods = MySQLconnect('ods')
engine = ods.engine()

# 读取 Excel 数据
excel_path = r"D:\test\logistics\拦截数据\拦截订单登记明细.xlsx"
order_df = pd.read_excel(excel_path, sheet_name="拦截明细", skiprows=1)
# 读取 Excel 数据时,指定 '订单号' 列为字符串类型
order_df = pd.read_excel(excel_path, sheet_name="拦截明细", skiprows=1, dtype={'订单号': str})

# 提取订单号并转为字符串
order_id = [str(x) for x in order_df["订单号"].dropna()]
placeholders = ','.join(['%s'] * len(order_id))
sql = f"""
WITH
t1 AS (
SELECT
  -- 提取交易号
  TRIM(SUBSTRING(
    `外部关联信息`,
    LOCATE('交易号:', `外部关联信息`) + CHAR_LENGTH('交易号:'),
    CASE 
      WHEN LOCATE('单品号:', `外部关联信息`) > 0
      THEN LOCATE('单品号:', `外部关联信息`) - LOCATE('交易号:', `外部关联信息`) - CHAR_LENGTH('交易号:')
      ELSE LOCATE('[', `外部关联信息`) - LOCATE('交易号:', `外部关联信息`) - CHAR_LENGTH('交易号:')
    END
  )) AS 交易号,

  -- 提取单品号(如果存在)
  CASE 
    WHEN LOCATE('单品号:', `外部关联信息`) > 0 THEN
      TRIM(SUBSTRING(
        `外部关联信息`,
        LOCATE('单品号:', `外部关联信息`) + CHAR_LENGTH('单品号:'),
        LOCATE('[', `外部关联信息`) - LOCATE('单品号:', `外部关联信息`) - CHAR_LENGTH('单品号:')
      ))
    ELSE NULL
  END AS 单品号,

  `支付账号`,
  `处理金额`,
  `添加时间`,
  `资金状态`,
  `完成时间`,
  备注

FROM cpmaso_procurement_fund_manage
WHERE `添加时间` >= DATE_SUB(NOW(), INTERVAL 8 MONTH)
)
SELECT
LEFT(order_product_id,15) AS 订单号,
	order_product_id,
	buy_audit AS 状态,
	trans_pay_date AS 采购时间,
	log_receiving_date AS 到货时间,
	t1.*
FROM
	`warehouse_purchasing` wp
LEFT JOIN t1 ON wp.trans_id = t1.交易号
WHERE
交易号>0 AND
LEFT(wp.order_product_id,15) IN ({placeholders})
ORDER BY 添加时间,订单号
"""
df = pd.read_sql(sql, engine,params=tuple(order_id))
df.to_clipboard(index = False)

入库

In [ ]:
import pandas as pd
import numpy as np
from sqlalchemy import text
from utils.gtools import MySQLconnect
ods = MySQLconnect('ods')
engine = ods.engine()

# 读取 Excel 数据
excel_path = r"D:\test\logistics\拦截数据\拦截订单登记明细.xlsx"
# 读取 Excel 数据时,指定 '订单号' 列为字符串类型
order_df = pd.read_excel(excel_path, sheet_name="拦截明细", skiprows=1, dtype={'订单号': str})

# 提取订单号并转为字符串
order_id = df['订单号'].astype(str).tolist()


bind_names = [f":p{i}" for i in range(len(order_id))]
placeholders = ', '.join(bind_names)

sql = text(f"""
SELECT
REGEXP_SUBSTR(note, '[0-9]{{15}}') AS 订单号,
stock_in_id AS `入库单号`,
instock_date AS `入库时间`
FROM stockinid_list
WHERE note REGEXP '[0-9]{{15}}_'
AND REGEXP_SUBSTR(note, '[0-9]{{15}}') IN ({placeholders})
""")

params = {f"p{i}": v for i, v in enumerate(order_id)}
df = pd.read_sql(sql, engine, params=params)
df.to_clipboard(index = False)