86 lines
3.4 KiB
Python
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
|