更新物流投递审核代码

This commit is contained in:
Wenxixi 2025-07-01 18:18:37 +08:00
parent 0e49591945
commit 1bbd4c643f
3 changed files with 48 additions and 41 deletions

View File

@ -649,8 +649,14 @@ class XmilesLogistics_US(TailLogistics):
detail_amount['tail_amount'] = 99999 detail_amount['tail_amount'] = 99999
return detail_amount return detail_amount
postcode = int(postcode[:5]) postcode = int(postcode[:5])
# 判断邮编是美东还是美西
zone = self.postcode_table[self.postcode_table['POSTCODE'] == postcode]['地区']
if zone.empty:
detail_amount['tail_amount'] = 99999
return detail_amount
base_fee_list = set() # 将每个包裹费用都记录在列表中 base_fee_list = [] # 将每个包裹费用都记录在列表中
volume_weight = 0 # 计算抛重,用于计算美西转运美东价格 volume_weight = 0 # 计算抛重,用于计算美西转运美东价格
for package in packages: for package in packages:
volume_weight +=package.get_volume_weight(6000) volume_weight +=package.get_volume_weight(6000)
@ -658,35 +664,30 @@ class XmilesLogistics_US(TailLogistics):
detail_amount['tail_amount'] = 99999 detail_amount['tail_amount'] = 99999
return detail_amount return detail_amount
if package.lbs_weight <=90 and package.fst_inch <=96 and package.girth_inch <=130: if package.lbs_weight <=90 and package.fst_inch <=96 and package.girth_inch <=130:
base_fee_list.add(20) base_fee_list.append(20)
elif package.lbs_weight <=150 and package.fst_inch <=96 and package.girth_inch <=130: elif package.lbs_weight <=150 and package.fst_inch <=96 and package.girth_inch <=130:
base_fee_list.add(38) base_fee_list.append(38)
elif package.lbs_weight <=150 and package.fst_inch <=108 and package.girth_inch <=165: elif package.lbs_weight <=150 and package.fst_inch <=108 and package.girth_inch <=165:
base_fee_list.add(50) base_fee_list.append(50)
elif package.lbs_weight <=200 and package.fst_inch <=144 and package.girth_inch <=225: elif package.lbs_weight <=200 and package.fst_inch <=144 and package.girth_inch <=225:
base_fee_list.add(75) base_fee_list.append(75)
else: else:
base_fee_list.add(75+0.55*math.ceil(package.lbs_weight)) base_fee_list.append(75+0.55*math.ceil(package.lbs_weight))
# 取所有费用,最大的费用取全部费用,其他取半价然后求和 # 取所有费用,最大的费用取全部费用,其他取半价然后求和
base_fee_list = sorted(base_fee_list,reverse=True) base_fee_list = sorted(base_fee_list,reverse=True)
# 计算base_fee_list最大值+其他费用的一半 # 计算base_fee_list最大值+其他费用的一半
if len(base_fee_list) == 0: if len(base_fee_list) == 0:
detail_amount['tail_amount'] = 99999
return detail_amount return detail_amount
elif len(base_fee_list) == 1: elif len(base_fee_list) == 1:
detail_amount["base"] = base_fee_list[0] detail_amount["base"] = base_fee_list[0]
else: else:
detail_amount["base"] = base_fee_list[0] + sum(base_fee_list[1:])/2 detail_amount["base"] = base_fee_list[0] + sum(base_fee_list[1:])/2
# 判断邮编是美东还是美西
zone = self.postcode_table[self.postcode_table['POSTCODE'] == postcode]['地区']
if zone.empty:
detail_amount['tail_amount'] = 99999
return detail_amount
zone = zone.iloc[0] zone = zone.iloc[0]
if zone =="NJ": if zone =="NJ":
detail_amount["transfer"] = 0.5*volume_weight detail_amount["transfer"] = 0.5*volume_weight
for key in detail_amount: for key in detail_amount:
if key!= 'tail_amount': if key!= 'tail_amount':
detail_amount['tail_amount'] += detail_amount[key] detail_amount['tail_amount'] += detail_amount[key]

View File

@ -1,14 +1,14 @@
import pandas as pd import pandas as pd
import math import math
express_price = pd.read_excel(r'D:\test\logistics\data\售价尾端价格.xlsx', sheet_name='Sheet1') from utils.gtools import MySQLconnect,DBconnect
key_column = express_price.iloc[:, 8] # 第 I 列 # 取计算订单物流费的参数
value_column = express_price.iloc[:, 9] # 第 J 列 with DBconnect() as db:
small_column = express_price.iloc[:, 10] # 第 K 列 express_dict= pd.read_sql("SELECT * FROM us_shop_logistics",db.eng)
big_column = express_price.iloc[:, 11] # 第 L 列
air_small_dict = dict(zip(key_column, small_column)) # 构建字典
air_big_dict = dict(zip(key_column, big_column)) air_small_dict = dict(zip(express_dict['g'], express_dict["空运usps_v2"]))
# 转换成字典 air_big_dict = dict(zip(express_dict['g'], express_dict["空运fedex_v2"]))
ocean_price_dict = dict(zip(key_column, value_column)) ocean_price_dict = dict(zip(express_dict['g'], express_dict["海运物流配置_v2"]))
def ocean_order_price(packages): def ocean_order_price(packages):
express_fee = 0 # 快递基础费 express_fee = 0 # 快递基础费
long_fee = 0 # 超长费 long_fee = 0 # 超长费
@ -19,7 +19,7 @@ def ocean_order_price(packages):
express_type_length = '' express_type_length = ''
for package in packages: for package in packages:
for key, value in ocean_price_dict.items(): for key, value in ocean_price_dict.items():
if max(package.get_volume_weight(8.5), package.weight) <=key: if max(package.get_volume_weight(8500)*1000, package.weight) <=key:
express_fee+=value express_fee+=value
break break
if package.fst_size>=116 or package.sed_size>=71 or package.girth>=251: if package.fst_size>=116 or package.sed_size>=71 or package.girth>=251:

View File

@ -23,7 +23,7 @@ def fetch_order_data():
oe.单号 AS order_id, oe.单号 AS order_id,
oe.运输方式, oe.运输方式,
oe.`目的国`, oe.`目的国`,
oe.快递公司, ol.postcode AS postcode,
oe.`快递分区`, oe.`快递分区`,
oe.快递跟踪号, oe.快递跟踪号,
ecm.类型 AS 渠道类型, -- 包裹类型 ecm.类型 AS 渠道类型, -- 包裹类型
@ -34,7 +34,8 @@ def fetch_order_data():
pfi.express_fee AS 基础估算, pfi.express_fee AS 基础估算,
pfi.express_additional_fee AS 偶发估算, pfi.express_additional_fee AS 偶发估算,
pfi.express_fee + pfi.express_additional_fee AS 总估算, pfi.express_fee + pfi.express_additional_fee AS 总估算,
ol.postcode AS postcode
oe.快递公司
FROM FROM
ods.order_express oe ods.order_express oe
LEFT JOIN ods.express_company ecm ON oe.快递公司 = ecm.快递公司 LEFT JOIN ods.express_company ecm ON oe.快递公司 = ecm.快递公司
@ -47,7 +48,7 @@ def fetch_order_data():
AND `卡板发货时间` REGEXP "--" AND `卡板发货时间` REGEXP "--"
AND ol.fund_status NOT REGEXP '等待|全额退款' AND ol.fund_status NOT REGEXP '等待|全额退款'
AND ol.site_name REGEXP 'litfad|kwoking|lakiq' AND ol.site_name REGEXP 'litfad|kwoking|lakiq'
AND oe.投递时间 >= DATE_SUB(NOW(), INTERVAL 20 DAY) AND oe.投递时间 >= DATE_SUB(NOW(), INTERVAL 3 DAY)
AND pvi.length>0 AND pvi.width >0 AND pvi.hight>0 AND pvi.weight>0 AND pvi.length>0 AND pvi.width >0 AND pvi.hight>0 AND pvi.weight>0
and oe.目的国 regexp 'United States' and oe.目的国 regexp 'United States'
""" """
@ -58,6 +59,7 @@ def fetch_order_data():
def cal_min_fee(raw_data: pd.DataFrame): def cal_min_fee(raw_data: pd.DataFrame):
""" """
处理物流费用数据并实现业务逻辑判断 处理物流费用数据并实现业务逻辑判断
1.
""" """
df = raw_data.copy() df = raw_data.copy()
# 包裹层面审核 # 包裹层面审核
@ -81,10 +83,13 @@ def cal_min_fee(raw_data: pd.DataFrame):
# 计算一票多件 # 计算一票多件
package_group.add_package(package) package_group.add_package(package)
# 计算一票多件 # 计算一票多件
bill_ltl = Billing("1",opCountry,package_group,row['postcode'],company_name=None,head_type=1,beizhu="") if len(package_group) > 1:
df.loc[df['order_id']==order_id,'卡派尾端费用'] = bill_ltl.tail_amount[0]/len(package_group) bill_ltl = Billing("1",opCountry,package_group,row['postcode'],company_name=None,head_type=1,beizhu="")
df.loc[df['order_id']==order_id,'卡派尾端渠道'] = bill_ltl.company_name df.loc[df['order_id']==order_id,'卡派尾端费用'] = bill_ltl.tail_amount[0]/len(package_group)
min_fee = min(bill_ltl.tail_amount[0],express_fee) df.loc[df['order_id']==order_id,'卡派尾端渠道'] = bill_ltl.company_name
min_fee = min(bill_ltl.tail_amount[0],express_fee)
else:
min_fee = express_fee
if min_fee == express_fee: if min_fee == express_fee:
df.loc[df['order_id']==order_id,'最优总物流费用'] = min_fee df.loc[df['order_id']==order_id,'最优总物流费用'] = min_fee
df.loc[df['order_id']==order_id,'最优渠道类型'] = "快递" df.loc[df['order_id']==order_id,'最优渠道类型'] = "快递"
@ -141,7 +146,7 @@ def analyze_orders(raw_data: pd.DataFrame):
'快递公司列表': grouped['快递公司'].unique(), '快递公司列表': grouped['快递公司'].unique(),
'渠道类型列表': grouped['渠道类型'].unique(), '渠道类型列表': grouped['渠道类型'].unique(),
'邮编列表': grouped['postcode'].first(), '邮编列表': grouped['postcode'].first(),
'快递跟踪号数量': grouped['快递跟踪号'].unique() '快递跟踪号': grouped['快递跟踪号'].unique()
}).reset_index() }).reset_index()
# 3. 实现业务逻辑判断(保持不变) # 3. 实现业务逻辑判断(保持不变)
@ -168,15 +173,15 @@ def analyze_orders(raw_data: pd.DataFrame):
status = '正常' status = '正常'
comments = [] comments = []
if row['订单类型'] == '卡派': if row['订单类型'] == '卡派' and len(row['快递跟踪号']) > 1:
tracking_nos = [list(p.values())[0] for p in row['包裹数据'].values()] # tracking_nos = [list(p.values())[0] for p in row['包裹数据'].values()]
if len(set(tracking_nos)) > 1: # if len(set(tracking_nos)) > 1:
status = '异常' # status = '异常'
if len(row['快递跟踪号数量']) > 1 : status = '异常'
comments.append('卡派订单包含多个不同快递单号') comments.append('卡派订单包含多个不同快递单号')
elif row['订单类型'] == '混合': elif row['订单类型'] == '混合':
status = '异常' status = '异常'
comments.append('出现混合类型订单,需要核查') comments.append('出现混合渠道类型订单,需要核查')
if row['渠道种类'] == '多渠道': if row['渠道种类'] == '多渠道':
if row['总重量'] < 1000: if row['总重量'] < 1000:
@ -197,7 +202,7 @@ def analyze_orders(raw_data: pd.DataFrame):
'包裹数量', '总重量', '包裹数量', '总重量',
'总基础估算', '总附加估算', '总物流估算', '总基础估算', '总附加估算', '总物流估算',
'快递公司列表', '邮编列表', '快递公司列表', '邮编列表',
'包裹数据' ,'状态', '备注','快递跟踪号数量'# 使用新列名 '包裹数据' ,'状态', '备注','快递跟踪号'# 使用新列名
] ]
return aggregated[final_columns] return aggregated[final_columns]
@ -234,8 +239,9 @@ def analyze_logistics(df: pd.DataFrame):
return all_estimate return all_estimate
df['费用一致'] = df.apply(lambda row: abs(all_estimate(row) - row['最优总物流费用'])<1, axis=1) df['费用一致'] = df.apply(lambda row: False if isinstance(all_estimate(row), str) else abs(all_estimate(row) - row['最优总物流费用']) < 1,axis=1)
df['费用差(当地货币)'] = df.apply(lambda row: row['最优总物流费用']-all_estimate(row), axis=1)
df['费用差(当地货币)'] = df.apply(lambda row: "费用有误" if isinstance(all_estimate(row), str) else row['最优总物流费用'] - all_estimate(row),axis=1)
return df return df
def main(): def main():