701 lines
33 KiB
Plaintext
701 lines
33 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 根据订单号,查询实际包裹尺寸,实际包裹实重,实际包裹体积重,\n",
|
||
"# bill账单给头程单价,实际尾端计费重,预估尾端成本,尾端附加费\n",
|
||
"\n",
|
||
"import os\n",
|
||
"import re\n",
|
||
"import pandas as pd\n",
|
||
"from utils.Package import Package,Package_group\n",
|
||
"from utils.gtools import MySQLconnect\n",
|
||
"from utils.countryOperator import OperateCountry\n",
|
||
"from utils.logisticsBill import BillFactory, Billing\n",
|
||
"import requests\n",
|
||
"import json\n",
|
||
"ods = MySQLconnect(\"ods\")\n",
|
||
"engine = ods.engine()\n",
|
||
"def get_SKU_info(order_id):\n",
|
||
" \"\"\"\n",
|
||
" 根据订单号获取SKU信息,以及入库采购价\n",
|
||
" \"\"\"\n",
|
||
" SKULIST = \"\"\"\n",
|
||
" SELECT\n",
|
||
" order_id,\n",
|
||
" CASE WHEN COUNT(DISTINCT opl.SKU) = 1 THEN \"单SKU\" ELSE \"多SKU\" end as \"SKU类型\",\n",
|
||
" CONCAT(group_concat(opl.SKU),\",\") as \"SKU明细\",\n",
|
||
" sum(s1.`成本价`*product_num) AS \"入库采购价\"\n",
|
||
" FROM\n",
|
||
" dws.order_product_list opl LEFT JOIN ods.stg_bayshop_litfad_sku s1 on s1.sku = opl.sku\n",
|
||
" LEFT JOIN dwd.dim_erp_sku_package_vol_info des on des.erp_sku = opl.sku\n",
|
||
" \n",
|
||
" WHERE\n",
|
||
" order_id = %s\n",
|
||
" AND order_product_id regexp \"[0-9]{15}_[0-9]*$\"\n",
|
||
" GROUP BY order_id \n",
|
||
" \n",
|
||
" \"\"\"\n",
|
||
" engine = ods.engine()\n",
|
||
" sku_df = pd.read_sql(SKULIST, engine,params=(order_id,))\n",
|
||
" # print(\"SKU类型:\",sku_df['SKU类型'][0],\"SKU明细:\",sku_df['SKU明细'][0],\"入库采购价:\",sku_df['入库采购价'][0])\n",
|
||
" return sku_df['SKU类型'][0],sku_df['SKU明细'][0],sku_df['入库采购价'][0]\n",
|
||
"\n",
|
||
"def get_package_real_vol_by_api(packages_id):\n",
|
||
" \"\"\"\n",
|
||
" 根据订单号的包裹ID,返回包裹类,包裹明细,包裹实重,包裹体积重6000\n",
|
||
" \"\"\"\n",
|
||
" packages = Package_group()\n",
|
||
" packages_str = \"\"\n",
|
||
" packages_weight=0\n",
|
||
" packages_vol = 0\n",
|
||
" for package_id in packages_id:\n",
|
||
" url = f'https://cp.maso.hk/index.php?main=biphp&act=package_fund&key=W6BOYJ7BH27YCGRFCA0LWBVKMU1KRU5Q&package={package_id}'\n",
|
||
" resp = requests.get(url).json()\n",
|
||
" if resp['code'] == \"0\":\n",
|
||
" weight = int(float(resp['data'][0]['weight'])*1000)\n",
|
||
" package_length = resp['data'][0]['l'].replace(\",\",\"\") if len(resp['data'][0]['l'])>0 else \"0\"\n",
|
||
" package_width = resp['data'][0]['w'].replace(\",\",\"\") if len(resp['data'][0]['w'])>0 else \"0\"\n",
|
||
" package_hight = resp['data'][0]['h'].replace(\",\",\"\") if len(resp['data'][0]['h'])>0 else \"0\"\n",
|
||
" package = Package(str(package_id),float(package_length),float(package_width),float(package_hight),weight)\n",
|
||
" packages.add_package(package)\n",
|
||
" # 实际包裹尺寸\n",
|
||
" package_str = f\"{weight}|{package_length}*{package_width}*{package_hight}\"\n",
|
||
" packages_str += package_str + \",\"\n",
|
||
" return packages,packages_str\n",
|
||
"\n",
|
||
"def get_shiji_bill(opCountry,order_id,packages_id,postcode,convey,amount):\n",
|
||
" # print(order_id)\n",
|
||
" beizhu = amount\n",
|
||
" conveys = 1 if convey == \"海运\" else 0\n",
|
||
" try:\n",
|
||
" packages,packages_str = get_package_real_vol_by_api(packages_id=packages_id)\n",
|
||
" bill = Billing(str(order_id),opCountry,packages,postcode,company_name=None,head_type=conveys,beizhu=beizhu)\n",
|
||
" print(bill)\n",
|
||
" tail_amount = bill.bill_dict()[\"预测尾端\"]\n",
|
||
" total_weight = sum([p.weight/1000 for p in packages.packages])\n",
|
||
" _type = bill.bill_dict()[\"尾端渠道\"]\n",
|
||
" head_amount = bill.bill_dict()[\"预测头程CNY\"]\n",
|
||
" total_amount = bill.bill_dict()[\"总金额USD\"]\n",
|
||
" volume_weight = bill.bill_dict()[\"体积重\"]\n",
|
||
" per_head = bill.bill_dict()[\"头程单价\"]\n",
|
||
" other_detail = bill.get_other_fee()\n",
|
||
" return packages_str,total_weight,volume_weight,per_head,head_amount,tail_amount,other_detail,_type,total_amount\n",
|
||
" except ZeroDivisionError as e:\n",
|
||
" print(e)\n",
|
||
" return \"\",0,0,0,0,0,\"\",\"\",0\n",
|
||
"def get_package_info_by_sql(order_df):\n",
|
||
" packages = Package_group()\n",
|
||
" packages_str = \"\"\n",
|
||
" for index, row in order_df.iterrows():\n",
|
||
" if row['包裹数据'] is None:\n",
|
||
" return None,\"\"\n",
|
||
" row['包裹数据'] = json.loads(row['包裹数据'])\n",
|
||
" item_list = [\n",
|
||
" {key: float(re.search(r\"\\d+\\.?\\d*\", str(value)).group()) for key, value in package.items()}\n",
|
||
" for package in row['包裹数据'].values()\n",
|
||
"]\n",
|
||
" for item in item_list:\n",
|
||
" if item['长'] == 0 or item['宽'] == 0 or item['高'] == 0 or item['重量'] == 0:\n",
|
||
" return None,\"\"\n",
|
||
" package = Package(row['SKU'], item['长'], item['宽'], item['高'], item['重量'])\n",
|
||
" packages.add_package(package)\n",
|
||
" # 实际包裹尺寸\n",
|
||
" package_str = f\"{ item['重量']}|{item['长']}*{ item['宽']}*{item['高']}\"\n",
|
||
" packages_str += package_str + \",\"\n",
|
||
" return packages,packages_str\n",
|
||
"\n",
|
||
"def get_biaozhun_bill(country,order_id,postcode,convey,amount):\n",
|
||
" print(order_id)\n",
|
||
" # 取标准包裹数据\n",
|
||
" sql = \"\"\"SELECT\n",
|
||
" order_id,\n",
|
||
" opl.SKU,\n",
|
||
" 包裹数据\n",
|
||
" FROM\n",
|
||
" dws.order_product_list opl\n",
|
||
" LEFT JOIN ads.new_erp_sku_size spi ON opl.SKU =spi.SKU\n",
|
||
" WHERE\n",
|
||
" order_id = %s\n",
|
||
" AND\n",
|
||
" opl.order_product_id REGEXP \"[0-9]{15}_[0-9]*$\"\n",
|
||
" \"\"\"\n",
|
||
" order_package_date = pd.read_sql(sql, engine, params=(order_id,))\n",
|
||
" print(order_package_date['SKU'])\n",
|
||
" if order_package_date['包裹数据'] is None:\n",
|
||
" return \"\",0,0,0,0,0,\"\",\"\"\n",
|
||
" # 取账单数据\n",
|
||
" beizhu = amount\n",
|
||
" conveys = 1 if convey == \"海运\" else 0\n",
|
||
" opCountry = OperateCountry(country)\n",
|
||
" try:\n",
|
||
" packages,packages_str = get_package_info_by_sql(order_package_date)\n",
|
||
" if packages is None:\n",
|
||
" return \"\",0,0,0,0,0,\"\",\"\"\n",
|
||
" bill = Billing(str(order_id),opCountry,packages,postcode,company_name=None,head_type=conveys,beizhu=beizhu)\n",
|
||
" print(bill)\n",
|
||
" tail_amount = bill.bill_dict()[\"预测尾端\"]\n",
|
||
" total_weight = sum([p.weight/1000 for p in packages.packages])\n",
|
||
" _type = bill.bill_dict()[\"尾端渠道\"]\n",
|
||
" head_amount = bill.bill_dict()[\"预测头程CNY\"]\n",
|
||
" total_amount = bill.bill_dict()[\"总金额USD\"]\n",
|
||
" volume_weight = bill.bill_dict()[\"体积重\"]\n",
|
||
" per_head = bill.bill_dict()[\"头程单价\"]\n",
|
||
" other_detail = bill.get_other_fee()\n",
|
||
" return packages_str,total_weight,volume_weight,per_head,head_amount,tail_amount,other_detail,_type\n",
|
||
" except ZeroDivisionError as e:\n",
|
||
" print(e)\n",
|
||
" return \"\",0,0,0,0,0,\"\",\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"sql = \"\"\"SELECT\n",
|
||
" ol.order_id ,\n",
|
||
" CONCAT(\"[\",GROUP_CONCAT(pr.包裹号),\"]\") AS package_group ,\n",
|
||
" ol.postcode,\n",
|
||
" ol.delivery_country,\n",
|
||
" ol.convey,\n",
|
||
"\t\t\t\tols.`货币`,\n",
|
||
"\t\t\t\tols.`订单总额`,\n",
|
||
"\t\t\t\tols.支付方式,\n",
|
||
" ol.order_price_dollar\n",
|
||
" FROM\n",
|
||
" parcel pr\n",
|
||
" LEFT JOIN dwd.order_list ol ON ol.order_id = pr.订单号 \n",
|
||
"\t\t\t\tleft JOIN ods.order_list_supplement ols ON ol.order_id = ols.订单号\n",
|
||
" WHERE\n",
|
||
" NOT EXISTS (\n",
|
||
" SELECT\n",
|
||
" 1 \n",
|
||
" FROM\n",
|
||
" `order_express` oe \n",
|
||
" WHERE\n",
|
||
" oe.包裹号 = pr.包裹号 \n",
|
||
" AND oe.包裹状态 = \"已作废\")\n",
|
||
" AND order_id IN (250610233027170 ,\n",
|
||
"250608163427468 ,\n",
|
||
"250521222214528 ,\n",
|
||
"250610230415406 ,\n",
|
||
"250607044202071 ,\n",
|
||
"250607144614471 ,\n",
|
||
"250607211414736 ,\n",
|
||
"250401032025780 ,\n",
|
||
"250531061202721 ,\n",
|
||
"250611112802162 ,\n",
|
||
"250614114015175 ,\n",
|
||
"250610185002525 ,\n",
|
||
"250610022439644 ,\n",
|
||
"250404163802384 ,\n",
|
||
"250531191002625 ,\n",
|
||
"250610035602297 ,\n",
|
||
"250609232002941 \n",
|
||
"\n",
|
||
")\n",
|
||
" GROUP BY ol.order_id\n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"250401032025780\n",
|
||
"0 2205003721\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250401032025780\n",
|
||
"账单项: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\n",
|
||
"250404163802384\n",
|
||
"0 2205811679\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250404163802384\n",
|
||
"账单项: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\n",
|
||
"250521222214528\n",
|
||
"0 2202859120\n",
|
||
"1 2202859129\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250521222214528\n",
|
||
"账单项:head_amount: 2470.0 CNY base: 7.4 GBP tail_amount: 7.4 GBP 总金额: 355.42 USD\n",
|
||
"250531061202721\n",
|
||
"0 227752959\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250531061202721\n",
|
||
"账单项: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\n",
|
||
"250531191002625\n",
|
||
"0 2205993938\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250531191002625\n",
|
||
"账单项:head_amount: 72.83966666666667 CNY base: 11.9 EUR fuel: 1.55 EUR tail_amount: 13.45 EUR 总金额: 25.261553333333335 USD\n",
|
||
"250607044202071\n",
|
||
"0 228294469\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250607044202071\n",
|
||
"账单项:head_amount: 168.73212180000002 CNY base: 20 USD transfer: 9.37 USD tail_amount: 29.37 USD 总金额: 52.992497052000004 USD\n",
|
||
"250607144614471\n",
|
||
"0 227555929\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250607144614471\n",
|
||
"账单项: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\n",
|
||
"250607211414736\n",
|
||
"0 229586263\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250607211414736\n",
|
||
"账单项: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\n",
|
||
"250608163427468\n",
|
||
"0 227658471\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250608163427468\n",
|
||
"账单项:head_amount: 554.4 CNY base: 3.7 GBP tail_amount: 3.7 GBP 总金额: 82.426 USD\n",
|
||
"250609232002941\n",
|
||
"0 2206109629\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250609232002941\n",
|
||
"账单项:head_amount: 94.5 CNY base: 10.2 EUR fuel: 1.33 EUR tail_amount: 11.53 EUR 总金额: 26.1436 USD\n",
|
||
"250610022439644\n",
|
||
"0 2206929691\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250610022439644\n",
|
||
"账单项: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\n",
|
||
"250610035602297\n",
|
||
"0 2204180587\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250610035602297\n",
|
||
"账单项: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\n",
|
||
"250610185002525\n",
|
||
"0 2203543601\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250610185002525\n",
|
||
"账单项: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\n",
|
||
"250610230415406\n",
|
||
"0 2205149996\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250610230415406\n",
|
||
"账单项: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\n",
|
||
"250610233027170\n",
|
||
"0 229445257\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250610233027170\n",
|
||
"账单项:head_amount: 1645.6533333333334 CNY base: 3.7 GBP tail_amount: 3.7 GBP 总金额: 235.2014666666667 USD\n",
|
||
"250611112802162\n",
|
||
"0 2206393292\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250611112802162\n",
|
||
"账单项:head_amount: 49.6 CNY base: 6.02 AUD fuel: 0.31 AUD tail_amount: 6.33 AUD 总金额: 11.375 USD\n",
|
||
"250614114015175\n",
|
||
"0 2202252863\n",
|
||
"Name: SKU, dtype: int64\n",
|
||
"账单名称: 250614114015175\n",
|
||
"账单项:head_amount: 270.9 CNY base: 17.08 AUD fuel: 0.87 AUD tail_amount: 17.95 AUD 总金额: 50.491 USD\n",
|
||
"账单名称: 250401032025780\n",
|
||
"账单项:head_amount: 121.93650000000001 CNY base: 20 USD transfer: 6.77 USD tail_amount: 26.77 USD 总金额: 43.84111 USD\n",
|
||
"账单名称: 250404163802384\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250521222214528\n",
|
||
"账单项:head_amount: 14967.906666666668 CNY base: 55.0 GBP tail_amount: 55.0 GBP 总金额: 2167.0069333333336 USD\n",
|
||
"账单名称: 250531061202721\n",
|
||
"账单项:head_amount: 694.17 CNY base: 210 USD tail_amount: 210.0 USD 总金额: 307.1838 USD\n",
|
||
"账单名称: 250531191002625\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250607044202071\n",
|
||
"账单项:head_amount: 1059.24 CNY base: 75 USD transfer: 58.85 USD tail_amount: 133.85 USD 总金额: 282.1436 USD\n",
|
||
"账单名称: 250607144614471\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250607211414736\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250608163427468\n",
|
||
"账单项:head_amount: 2968.0 CNY base: 48.02 GBP fuel: 4.8 GBP tail_amount: 52.82 GBP 总金额: 484.18600000000004 USD\n",
|
||
"账单名称: 250609232002941\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250610022439644\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250610035602297\n",
|
||
"账单项:head_amount: 1189.824 CNY base: 310 EUR fuel: 24.8 EUR tail_amount: 334.8 EUR 总金额: 541.55136 USD\n",
|
||
"账单名称: 250610185002525\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250610230415406\n",
|
||
"账单项: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\n",
|
||
"账单名称: 250610233027170\n",
|
||
"账单项:head_amount: 4055.04 CNY base: 76.65 GBP fuel: 7.66 GBP tail_amount: 84.31 GBP 总金额: 677.3086000000001 USD\n",
|
||
"账单名称: 250611112802162\n",
|
||
"账单项:head_amount: 793.8000000000001 CNY base: 26.82 AUD fuel: 1.94 AUD tail_amount: 28.76 AUD 总金额: 131.264 USD\n",
|
||
"账单名称: 250614114015175\n",
|
||
"账单项: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\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"order_id_df = pd.read_sql(sql,engine)\n",
|
||
"# SKU类型和SKU明细,以及入库采购价\n",
|
||
"order_id_df[['订单SKU类型','订单SKU明细','入库采购价']] = order_id_df.apply(lambda x: get_SKU_info(x['order_id']), axis=1, result_type='expand')\n",
|
||
"\n",
|
||
"# 获取标准账单\n",
|
||
"order_id_df[[\"标准包裹尺寸详情\",\"标准实重\",\"标准体积重\",\"标准头程单价\",\"标准头程费用(CNY)\",\"标准尾端费用(当地货币)\",\"标准尾端附加费\",\"标准尾端渠道\"]] = order_id_df.apply(lambda x: get_biaozhun_bill(\n",
|
||
" x['delivery_country'],\n",
|
||
" x['order_id'],\n",
|
||
" x['postcode'], \n",
|
||
" x['convey'],\n",
|
||
" x['order_price_dollar']),axis=1,result_type='expand')\n",
|
||
"# 获取实际采购价\n",
|
||
"# order_id_df['实际采购价'] = order_id_df['order_id'].apply(lambda x: get_purchase_price(x))\n",
|
||
"\n",
|
||
"# 获取实际账单\n",
|
||
"order_id_df[[\"实际包裹尺寸详情\",\"实际实重\",\"实际体积重\",\"实际头程单价\",\"实际头程费用(CNY)\",\"实际尾端费用(当地货币)\",\"实际尾端附加费\",\"实际尾端渠道\",\"总金额(USD)\"]] = order_id_df.apply(lambda x: get_shiji_bill(OperateCountry(x['delivery_country']),\n",
|
||
" x['order_id'],\n",
|
||
" eval(x['package_group']),\n",
|
||
" x['postcode'], \n",
|
||
" x['convey'],\n",
|
||
" x['order_price_dollar']),axis=1,result_type='expand')\n",
|
||
"\n",
|
||
"order_id_df.to_clipboard()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 取订单号和包裹号\n",
|
||
"sql = \"\"\"\n",
|
||
"SELECT\n",
|
||
" pr.包裹号,pr.订单号\n",
|
||
" FROM\n",
|
||
" parcel pr \t\n",
|
||
" WHERE\n",
|
||
" 订单号 IN (250516031202445 \n",
|
||
")\n",
|
||
"\"\"\"\n",
|
||
"package_df = pd.read_sql(sql,engine)\n",
|
||
"package_df.to_clipboard(index=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from utils.gtools import MySQLconnect\n",
|
||
"import pandas as pd\n",
|
||
"import os\n",
|
||
"# date = \"2025/3/5\"\n",
|
||
"# 连接数据库\n",
|
||
"ods = MySQLconnect(\"ods\")\n",
|
||
"engine = ods.engine()\n",
|
||
"\n",
|
||
"# 读取 Excel 数据\n",
|
||
"excel_path = r\"D:\\test\\logistics\\拦截数据\\拦截订单登记明细.xlsx\"\n",
|
||
"order_df = pd.read_excel(excel_path, sheet_name=\"拦截明细\", skiprows=1)\n",
|
||
"# 读取 Excel 数据时,指定 '订单号' 列为字符串类型\n",
|
||
"order_df = pd.read_excel(excel_path, sheet_name=\"拦截明细\", skiprows=1, dtype={'订单号': str})\n",
|
||
"# order_df = order_df[order_df['拦截计算日期'] == date]\n",
|
||
"order_df = order_df[['订单号', '提交拦截申请时间']]\n",
|
||
"\n",
|
||
"# 提取订单号并转为字符串\n",
|
||
"order_id = [str(x) for x in order_df[\"订单号\"].dropna()]\n",
|
||
"\n",
|
||
"if not order_id:\n",
|
||
" print(\"没有符合条件的订单号,查询终止。\")\n",
|
||
"else:\n",
|
||
" try:\n",
|
||
" # 生成占位符并执行查询\n",
|
||
" placeholders = ', '.join(['%s'] * len(order_id))\n",
|
||
" sql = f\"\"\"\n",
|
||
" SELECT\n",
|
||
" 单号,\n",
|
||
" 包裹号,\n",
|
||
" 包裹状态,\n",
|
||
" 快递跟踪号,\n",
|
||
" `关联卡板号`,\n",
|
||
" 关联提单号,\n",
|
||
" 打包时间,\n",
|
||
" `快递公司` AS 打单渠道,\n",
|
||
" `包裹测量时间`,\n",
|
||
" 运单生成时间 AS 打单时间,\n",
|
||
" 绑定卡板时间,\n",
|
||
" 绑定提单时间,\n",
|
||
" `提单发货时间`\n",
|
||
" FROM\n",
|
||
" ods.`order_express`\n",
|
||
" WHERE\n",
|
||
" 单号 IN ({placeholders})\n",
|
||
" \"\"\"\n",
|
||
" df = pd.read_sql(sql, engine, params=tuple(order_id))\n",
|
||
"\n",
|
||
" # 合并数据\n",
|
||
" order_df[\"订单号\"] = order_df[\"订单号\"].astype(str)\n",
|
||
" df[\"单号\"] = df[\"单号\"].astype(str)\n",
|
||
" merged_df = df.merge(order_df, left_on=\"单号\", right_on=\"订单号\", how=\"left\")\n",
|
||
" merged_df = merged_df.drop(columns=[\"订单号\"]) # 删除重复的 '订单号' 列\n",
|
||
"\n",
|
||
" # 重新排列列顺序\n",
|
||
" merged_df = merged_df[[\n",
|
||
" \"单号\",\n",
|
||
" \"包裹号\",\n",
|
||
" \"提交拦截申请时间\",\n",
|
||
" \"包裹状态\",\n",
|
||
" \"快递跟踪号\",\n",
|
||
" \"关联卡板号\",\n",
|
||
" \"关联提单号\",\n",
|
||
" \"打包时间\",\n",
|
||
" \"包裹测量时间\",\n",
|
||
" \"打单时间\",\n",
|
||
" \"打单渠道\",\n",
|
||
" \"绑定卡板时间\",\n",
|
||
" \"绑定提单时间\",\n",
|
||
" \"提单发货时间\"\n",
|
||
" ]]\n",
|
||
"\n",
|
||
" # 检查文件是否存在,并读取目标工作表\n",
|
||
" if os.path.exists(excel_path):\n",
|
||
" with pd.ExcelFile(excel_path) as xls:\n",
|
||
" sheets = xls.sheet_names\n",
|
||
" if \"包裹时间记录\" in sheets:\n",
|
||
" existing_df = pd.read_excel(excel_path, sheet_name=\"包裹时间记录\")\n",
|
||
" else:\n",
|
||
" existing_df = pd.DataFrame(columns=merged_df.columns) # 如果表不存在,创建一个空 DataFrame\n",
|
||
" else:\n",
|
||
" existing_df = pd.DataFrame(columns=merged_df.columns) # 如果文件不存在,创建一个空 DataFrame\n",
|
||
"\n",
|
||
" # 过滤掉已存在的包裹号\n",
|
||
" existing_package_ids = existing_df[\"包裹号\"].astype(str).tolist()\n",
|
||
" new_data = merged_df[~merged_df[\"包裹号\"].astype(str).isin(existing_package_ids)]\n",
|
||
"\n",
|
||
" # 如果没有新数据,直接退出\n",
|
||
" if new_data.empty:\n",
|
||
" print(\"没有新数据需要追加。\")\n",
|
||
" else:\n",
|
||
" # 追加新数据\n",
|
||
" \n",
|
||
" combined_df = pd.concat([existing_df, new_data], ignore_index=True)\n",
|
||
"\n",
|
||
" # 写入 Excel(保留其他工作表)\n",
|
||
" with pd.ExcelWriter(excel_path, engine='openpyxl', mode='a' if os.path.exists(excel_path) else 'w', if_sheet_exists='replace') as writer:\n",
|
||
" combined_df.to_excel(writer, sheet_name=\"包裹时间记录\", index=False)\n",
|
||
" print(\"数据已成功追加到工作表!\")\n",
|
||
" \n",
|
||
" except Exception as e:\n",
|
||
" print(f\"操作失败,错误详情:{e}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 手动输入包裹的包裹信息\n",
|
||
"from logisticsClass.logisticsTail_EUR import KPASLLogistics_FR\n",
|
||
"from utils.Package import Package,Package_group\n",
|
||
"from utils.gtools import MySQLconnect\n",
|
||
"from utils.countryOperator import OperateCountry\n",
|
||
"from utils.logisticsBill import BillFactory, Billing\n",
|
||
"packages = Package_group()\n",
|
||
"\n",
|
||
"packages.add_package(Package(\"包裹1\", 78,35,15, 15000))\n",
|
||
"# packages.add_package(Package(\"包裹1\", 55,45,40, 9000))\n",
|
||
"# packages.add_package(Package(\"包裹1\", 210,55,20, 32000))\n",
|
||
"# packages.add_package(Package(\"包裹1\", 103,42,12, 8000))\n",
|
||
"# packages.add_package(Package(\"包裹1\", 103,42,12, 8000))\n",
|
||
"\n",
|
||
"country = 'United Kingdom'\n",
|
||
"postcode ='DY13 0RX'\n",
|
||
"conveys= 0 # 1海运0空运\n",
|
||
"\n",
|
||
"\n",
|
||
"opCountry = OperateCountry(country)\n",
|
||
"bill = Billing(str(1),opCountry,packages,postcode,company_name=None,head_type=conveys,beizhu=\"1\")\n",
|
||
"print(bill)\n",
|
||
"tail_amount = bill.bill_dict()[\"预测尾端\"]\n",
|
||
"total_weight = sum([p.weight/1000 for p in packages.packages])\n",
|
||
"_type = bill.bill_dict()[\"尾端渠道\"]\n",
|
||
"head_amount = bill.bill_dict()[\"预测头程CNY\"]\n",
|
||
"total_amount = bill.bill_dict()[\"总金额USD\"]\n",
|
||
"volume_weight = bill.bill_dict()[\"体积重\"]\n",
|
||
"per_head = bill.bill_dict()[\"头程单价\"]\n",
|
||
"other_detail = bill.get_other_fee()\n",
|
||
"\n",
|
||
"packages_str = \"\"\n",
|
||
"for package in packages.packages:\n",
|
||
" package_str = f\"{package.weight}|{package.length}*{package.width}*{package.height}\"\n",
|
||
" packages_str += package_str + \",\"\n",
|
||
"print(f\"packages_str:{packages_str}\")\n",
|
||
"print(f\"实重:{total_weight}\")\n",
|
||
"print(f\"体积重:{volume_weight}\")\n",
|
||
"print(f\"头程单价:{per_head}\")\n",
|
||
"print(f\"预测头程CNY:{head_amount}\")\n",
|
||
"print(f\"预测尾端(当地货币):{tail_amount}\")\n",
|
||
"print(f\"其他费用:{other_detail}\")\n",
|
||
"print(f\"尾端渠道:{_type}\")\n",
|
||
"print(f\"总金额USD:{total_amount}\")\n",
|
||
"print(KPASLLogistics_FR.active)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"查找供应商退货退款金额"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"from utils.gtools import MySQLconnect\n",
|
||
"ods = MySQLconnect('ods')\n",
|
||
"engine = ods.engine()\n",
|
||
"\n",
|
||
"# 读取 Excel 数据\n",
|
||
"excel_path = r\"D:\\test\\logistics\\拦截数据\\拦截订单登记明细.xlsx\"\n",
|
||
"order_df = pd.read_excel(excel_path, sheet_name=\"拦截明细\", skiprows=1)\n",
|
||
"# 读取 Excel 数据时,指定 '订单号' 列为字符串类型\n",
|
||
"order_df = pd.read_excel(excel_path, sheet_name=\"拦截明细\", skiprows=1, dtype={'订单号': str})\n",
|
||
"\n",
|
||
"# 提取订单号并转为字符串\n",
|
||
"order_id = [str(x) for x in order_df[\"订单号\"].dropna()]\n",
|
||
"placeholders = ','.join(['%s'] * len(order_id))\n",
|
||
"sql = f\"\"\"\n",
|
||
"WITH\n",
|
||
"t1 AS (\n",
|
||
"SELECT\n",
|
||
" -- 提取交易号\n",
|
||
" TRIM(SUBSTRING(\n",
|
||
" `外部关联信息`,\n",
|
||
" LOCATE('交易号:', `外部关联信息`) + CHAR_LENGTH('交易号:'),\n",
|
||
" CASE \n",
|
||
" WHEN LOCATE('单品号:', `外部关联信息`) > 0\n",
|
||
" THEN LOCATE('单品号:', `外部关联信息`) - LOCATE('交易号:', `外部关联信息`) - CHAR_LENGTH('交易号:')\n",
|
||
" ELSE LOCATE('[', `外部关联信息`) - LOCATE('交易号:', `外部关联信息`) - CHAR_LENGTH('交易号:')\n",
|
||
" END\n",
|
||
" )) AS 交易号,\n",
|
||
"\n",
|
||
" -- 提取单品号(如果存在)\n",
|
||
" CASE \n",
|
||
" WHEN LOCATE('单品号:', `外部关联信息`) > 0 THEN\n",
|
||
" TRIM(SUBSTRING(\n",
|
||
" `外部关联信息`,\n",
|
||
" LOCATE('单品号:', `外部关联信息`) + CHAR_LENGTH('单品号:'),\n",
|
||
" LOCATE('[', `外部关联信息`) - LOCATE('单品号:', `外部关联信息`) - CHAR_LENGTH('单品号:')\n",
|
||
" ))\n",
|
||
" ELSE NULL\n",
|
||
" END AS 单品号,\n",
|
||
"\n",
|
||
" `支付账号`,\n",
|
||
" `处理金额`,\n",
|
||
" `添加时间`,\n",
|
||
" `资金状态`,\n",
|
||
" `完成时间`,\n",
|
||
" 备注\n",
|
||
"\n",
|
||
"FROM cpmaso_procurement_fund_manage\n",
|
||
"WHERE `添加时间` >= DATE_SUB(NOW(), INTERVAL 8 MONTH)\n",
|
||
")\n",
|
||
"SELECT\n",
|
||
"LEFT(order_product_id,15) AS 订单号,\n",
|
||
"\torder_product_id,\n",
|
||
"\tbuy_audit AS 状态,\n",
|
||
"\ttrans_pay_date AS 采购时间,\n",
|
||
"\tlog_receiving_date AS 到货时间,\n",
|
||
"\tt1.*\n",
|
||
"FROM\n",
|
||
"\t`warehouse_purchasing` wp\n",
|
||
"LEFT JOIN t1 ON wp.trans_id = t1.交易号\n",
|
||
"WHERE\n",
|
||
"交易号>0 AND\n",
|
||
"LEFT(wp.order_product_id,15) IN ({placeholders})\n",
|
||
"ORDER BY 添加时间,订单号\n",
|
||
"\"\"\"\n",
|
||
"df = pd.read_sql(sql, engine,params=tuple(order_id))\n",
|
||
"df.to_clipboard(index = False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"入库\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"from sqlalchemy import text\n",
|
||
"from utils.gtools import MySQLconnect\n",
|
||
"ods = MySQLconnect('ods')\n",
|
||
"engine = ods.engine()\n",
|
||
"\n",
|
||
"# 读取 Excel 数据\n",
|
||
"excel_path = r\"D:\\test\\logistics\\拦截数据\\拦截订单登记明细.xlsx\"\n",
|
||
"# 读取 Excel 数据时,指定 '订单号' 列为字符串类型\n",
|
||
"order_df = pd.read_excel(excel_path, sheet_name=\"拦截明细\", skiprows=1, dtype={'订单号': str})\n",
|
||
"\n",
|
||
"# 提取订单号并转为字符串\n",
|
||
"order_id = df['订单号'].astype(str).tolist()\n",
|
||
"\n",
|
||
"\n",
|
||
"bind_names = [f\":p{i}\" for i in range(len(order_id))]\n",
|
||
"placeholders = ', '.join(bind_names)\n",
|
||
"\n",
|
||
"sql = text(f\"\"\"\n",
|
||
"SELECT\n",
|
||
"REGEXP_SUBSTR(note, '[0-9]{{15}}') AS 订单号,\n",
|
||
"stock_in_id AS `入库单号`,\n",
|
||
"instock_date AS `入库时间`\n",
|
||
"FROM stockinid_list\n",
|
||
"WHERE note REGEXP '[0-9]{{15}}_'\n",
|
||
"AND REGEXP_SUBSTR(note, '[0-9]{{15}}') IN ({placeholders})\n",
|
||
"\"\"\")\n",
|
||
"\n",
|
||
"params = {f\"p{i}\": v for i, v in enumerate(order_id)}\n",
|
||
"df = pd.read_sql(sql, engine, params=params)\n",
|
||
"df.to_clipboard(index = False)"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "base",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.11.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|