{ "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 }