logistics/sell/logistic_price/jp_price.py

86 lines
3.4 KiB
Python

import pandas
# 日本空运
def jp_air_order_price(packages):
# 先判断包裹数
if len(packages) > 30:
return 0,"包裹数超过30"
air_order_price = 0
air_order_type = '空运'
for package in packages:
m = package.density
v = package.get_volume_weight(6)
if package.weight <= 2000:
order_price = ((min(max(m, 37), 337) * 0.038 + 9.482 - 1.08) / 6 + 1.38 / 6 - 1.06) * v / 1000 / 0.359 + 4.03
elif package.weight <= 5000:
order_price = ((min(max(m, 37), 337) * 0.038 + 9.482 - 1.08) / 6 + 1.38 / 6 - 1.06) * v / 1000 / 0.359 + 4.57
elif package.weight <= 10000:
order_price = ((min(max(m, 37), 337) * 0.038 + 9.482 - 1.08) / 6 + 1.38 / 6 - 1.06) * v / 1000 / 0.359 + 5.83
elif package.weight <= 20000:
order_price = ((min(max(m, 37), 337) * 0.038 + 9.482 - 1.08) / 6 + 1.38 / 6 - 1.06) * v / 1000 / 0.359 + 8.7
elif package.weight <= 30000:
order_price = ((min(max(m, 37),337) * 0.038 + 9.482 - 1.08) / 6 + 1.38 / 6 - 1.06) * v / 1000 / 0.359 + 11.48
else:
return 999999,"不可发"
air_order_price += order_price
air_order_price = round(air_order_price, 2)
return air_order_price,air_order_type
def jp_order_yamato(packages,t):
# 先判断包裹数
if len(packages) > 30:
return 0,"包裹数超过30"
order_type = 'yamato'
order_fee = 0
# 判断不可发
for package in packages:
v = package.get_volume_weight(6)
billing_weight = max(package.weight,v)
if package.weight > 30000 or v > 49400:
return 999999,"不可发"
if billing_weight <= 2000:
jp_base_fee = 700 if v<=1400 else 920
order_fee1 = jp_base_fee /0.359/146 -7.82
elif billing_weight <= 5000:
jp_base_fee = 920 if v<=3200 else 1162
order_fee1 = jp_base_fee /0.359/146 -6.64
elif billing_weight <= 10000:
jp_base_fee = 1162 if v<=6200 else 1382
order_fee1 = jp_base_fee /0.359/146 -6.91
elif billing_weight <=15000:
jp_base_fee = 1382 if v<=10700 else 1624
order_fee1 = jp_base_fee /0.359/146 -7.84
elif billing_weight <=20000:
jp_base_fee = 1624 if v<=16900 else 1844
order_fee1 = jp_base_fee /0.359/146 -8.83
elif billing_weight <=25000:
jp_base_fee = 1844
order_fee1 = jp_base_fee /0.359/146 -10.99
elif billing_weight <=30000:
if package.weight >25000 or v >25300:
jp_base_fee = 2548
elif v <=25300:
jp_base_fee =1844
order_fee1 = jp_base_fee /0.359/146 -12.87
elif billing_weight <=36000:
jp_base_fee = 2548
order_fee1 = jp_base_fee /0.359/146 -14.57
elif billing_weight <=49400:
jp_base_fee =2988
order_fee1 = jp_base_fee /0.359/146 -17.62
order_fee += (order_fee1 -0.4*v/1000 +t*0.05)/0.97
return round(order_fee,2),order_type
def min_price(packages):
air_order_fee,air_type = jp_air_order_price(packages)
yamato_order_fee,yamato_type = jp_order_yamato(packages)
if air_order_fee <= yamato_order_fee:
order_fee =air_order_fee
order_type = air_type
else:
order_fee = yamato_order_fee
order_type = yamato_type
return order_fee,order_type