2025-06-17 18:44:31 +08:00
|
|
|
|
# 英国海运订单费用,返回单个sku的订单费用和订单类型
|
2026-03-16 23:36:00 +08:00
|
|
|
|
import sys
|
|
|
|
|
|
sys.path.append(r'D:\workspace\dags\logistics')
|
|
|
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
|
|
|
|
import math
|
|
|
|
|
|
from utils.Package import Package, Package_group
|
|
|
|
|
|
import re
|
|
|
|
|
|
def uk_ocean_order_price(packages_dict_str,k):
|
2025-06-17 18:44:31 +08:00
|
|
|
|
"""
|
|
|
|
|
|
入参:packages的类型是Package_group,里面包含多个Package,这是一个类,这个类今天在群里发过
|
|
|
|
|
|
入参:k是物流分摊费,也就是k
|
|
|
|
|
|
|
|
|
|
|
|
出参: 订单物流费,订单类型
|
|
|
|
|
|
"""
|
2026-03-16 23:36:00 +08:00
|
|
|
|
|
|
|
|
|
|
packages = Package_group()
|
|
|
|
|
|
def extract_number(value):
|
|
|
|
|
|
# 提取字符串中的第一个数字
|
|
|
|
|
|
match = re.search(r"[-+]?\d*\.\d+|\d+", str(value))
|
|
|
|
|
|
return float(match.group()) if match else 0.0
|
|
|
|
|
|
packages_dict = eval(packages_dict_str)
|
|
|
|
|
|
if len(packages_dict) == 0:
|
|
|
|
|
|
return (0,0)
|
|
|
|
|
|
for key, package in packages_dict.items():
|
|
|
|
|
|
package['长'] = extract_number(package['长'])
|
|
|
|
|
|
package['宽'] = extract_number(package['宽'])
|
|
|
|
|
|
package['高'] = extract_number(package['高'])
|
|
|
|
|
|
package['重量'] = extract_number(package['重量'])
|
|
|
|
|
|
|
|
|
|
|
|
if package['长'] == 0 or package['宽'] == 0 or package['高'] == 0 or package['重量'] == 0:
|
|
|
|
|
|
return (0,0)
|
|
|
|
|
|
packages.add_package(Package(key,package['长'], package['宽'], package['高'], package['重量']))
|
|
|
|
|
|
|
2025-06-17 18:44:31 +08:00
|
|
|
|
# 计算uk经济直达费用
|
|
|
|
|
|
order_fee = 0
|
|
|
|
|
|
express_fee = 0
|
|
|
|
|
|
order_type1 = '' # 订单类型
|
|
|
|
|
|
num = len(packages)
|
|
|
|
|
|
if num > 30:
|
|
|
|
|
|
return 0, '包裹数超过30'
|
|
|
|
|
|
for package in packages:
|
|
|
|
|
|
base_fee = 0
|
|
|
|
|
|
other_fee1 = 0
|
|
|
|
|
|
if package.fst_size <= 175 and package.girth <= 339 and package.weight <= 40000:
|
|
|
|
|
|
base_fee = 3.7/0.359*1.3-k-0.8*package.get_volume_weight(6000)
|
|
|
|
|
|
else:
|
|
|
|
|
|
base_fee = 999999
|
2026-03-16 23:36:00 +08:00
|
|
|
|
if package.fst_size >=100 or package.sed_size >=60 or package.weight >=30000:
|
2025-06-17 18:44:31 +08:00
|
|
|
|
other_fee1 =45
|
|
|
|
|
|
order_type1 += '大包裹'
|
|
|
|
|
|
|
|
|
|
|
|
express_fee += (base_fee + other_fee1)
|
|
|
|
|
|
express_fee = round(express_fee, 2)
|
|
|
|
|
|
|
|
|
|
|
|
# 卡派 主计费实重,辅计费抛重
|
|
|
|
|
|
ltl_fee = 0
|
|
|
|
|
|
order_type2 = '卡派'
|
|
|
|
|
|
sku_total_cubic_feet = 0
|
|
|
|
|
|
for package in packages:
|
|
|
|
|
|
cubic_feet= package.length * package.width * package.height / 6000
|
|
|
|
|
|
sku_total_cubic_feet += cubic_feet
|
|
|
|
|
|
if package.length >310:
|
|
|
|
|
|
return 999999,'包裹超尺寸'
|
|
|
|
|
|
ltl_fee = max(151/0.359 - 2.4 /7 * sku_total_cubic_feet,2.5)
|
|
|
|
|
|
|
|
|
|
|
|
if express_fee <= ltl_fee:
|
|
|
|
|
|
order_fee = express_fee
|
|
|
|
|
|
order_type = order_type1
|
|
|
|
|
|
else:
|
|
|
|
|
|
order_fee = ltl_fee
|
|
|
|
|
|
order_type = order_type2
|
2026-03-16 23:36:00 +08:00
|
|
|
|
return max(round(order_fee,2),2), order_type
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
import sys
|
|
|
|
|
|
sys.path.append(r'D:\workspace\dags\logistics')
|
|
|
|
|
|
|
|
|
|
|
|
sql = """SELECT
|
|
|
|
|
|
t1.*,
|
|
|
|
|
|
t2.`物流分摊`
|
|
|
|
|
|
FROM
|
|
|
|
|
|
`dim_erp_sku_package_vol_info`t1 left join ods.stg_bayshop_litfad_sku t2 on t1.erp_sku = t2.SKU
|
|
|
|
|
|
where id >=%s AND id <=%s
|
|
|
|
|
|
AND uk_price IS NULL
|
|
|
|
|
|
AND `物流分摊` IS NOT NULL
|
|
|
|
|
|
"""
|
|
|
|
|
|
from utils.gtools import MySQLconnect
|
|
|
|
|
|
from tqdm import tqdm
|
|
|
|
|
|
import pandas as pd
|
|
|
|
|
|
with MySQLconnect('dwd') as db:
|
|
|
|
|
|
for i in tqdm(range(0,150)):
|
|
|
|
|
|
# count=0
|
|
|
|
|
|
print(i,"开始")
|
|
|
|
|
|
dfsql = sql % (i*100000, (i+1)*100000-1)
|
|
|
|
|
|
df = pd.read_sql(dfsql, db.engine())
|
|
|
|
|
|
if len(df) == 0:
|
|
|
|
|
|
continue
|
|
|
|
|
|
df[['us_price','logitcs_type']] = df.apply(lambda x: uk_ocean_order_price(x['erp_package_vol'],x['物流分摊']), axis=1, result_type='expand')
|
|
|
|
|
|
pd.io.sql.to_sql(df, "temp_update",db.eng, if_exists='replace', index=False )
|
|
|
|
|
|
#添加主键ID
|
|
|
|
|
|
modifysql = """ALTER TABLE `temp_update` ADD PRIMARY KEY (`id`)
|
|
|
|
|
|
"""
|
|
|
|
|
|
db.cur.execute(modifysql)
|
|
|
|
|
|
|
|
|
|
|
|
# se = [tuple([round(x['us_price'],2),x['id']]) for y,x in df.iterrows()]
|
|
|
|
|
|
update_sql = """
|
|
|
|
|
|
UPDATE dim_erp_sku_package_vol_info AS target
|
|
|
|
|
|
JOIN temp_update AS src
|
|
|
|
|
|
ON target.id = src.id -- 根据主键关联
|
|
|
|
|
|
SET target.uk_price = src.us_price;"""
|
|
|
|
|
|
# db.cur.executemany(update_sql, se)
|
|
|
|
|
|
db.cur.execute(update_sql)
|
|
|
|
|
|
db.con.commit()
|
|
|
|
|
|
print(i,"结束")
|