diff --git a/sell/logistic_price/uk_price.py b/sell/logistic_price/uk_price.py new file mode 100644 index 0000000..26cbb42 --- /dev/null +++ b/sell/logistic_price/uk_price.py @@ -0,0 +1,47 @@ +# 英国海运订单费用,返回单个sku的订单费用和订单类型 +def uk_ocean_order_price(packages,k): + """ + 入参:packages的类型是Package_group,里面包含多个Package,这是一个类,这个类今天在群里发过 + 入参:k是物流分摊费,也就是k + + 出参: 订单物流费,订单类型 + """ + # 计算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 + if package.fst_size >=100 and package.sed_size >=60 and package.weight >=30000: + 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 + return round(order_fee,2), order_type \ No newline at end of file diff --git a/sell/logistic_price/us_price.py b/sell/logistic_price/us_price.py new file mode 100644 index 0000000..36689e1 --- /dev/null +++ b/sell/logistic_price/us_price.py @@ -0,0 +1,130 @@ +import pandas as pd +import math +express_price = pd.read_excel(r'D:\test\logistics\data\售价尾端价格.xlsx', sheet_name='Sheet1') +key_column = express_price.iloc[:, 8] # 第 I 列 +value_column = express_price.iloc[:, 9] # 第 J 列 +small_column = express_price.iloc[:, 10] # 第 K 列 +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)) +# 转换成字典 +ocean_price_dict = dict(zip(key_column, value_column)) +def ocean_order_price(packages): + express_fee = 0 # 快递基础费 + long_fee = 0 # 超长费 + weight_fee = 0 # 超重费 + big_fee = 0 # 大包裹费 + express_type = '' + express_type_weight = '' + express_type_length = '' + for package in packages: + for key, value in ocean_price_dict.items(): + if package.weight <=key: + express_fee+=value + break + if package.fst_size>=116 or package.sed_size>=71 or package.girth>=251: + long_fee += 16.3 + if express_type_length == '': + express_type_length ="超长" + if package.weight>=21000 and package.fst_size<238 and package.girth<315: + weight_fee+=25.5 + express_type_weight ="超重" + if package.fst_size>=238 or package.girth>=315: + big_fee+=61.6 + express_type_length ="大包裹" + express_fee = express_fee + long_fee + weight_fee + big_fee + express_type = express_type_length + express_type_weight + + # 卡派(步长为3) + ltl_base = 0 + ltl_fee = 0 + count1 = 0 + count2 = 0 + count3 = 0 + count4 = 0 + ltl_type = '卡派' + order_type_length='' + order_type_weight='' + order_ltl_oversize = 0 + order_ltl_overweight1 = 0 + order_ltl_overweight2 = 0 + order_ltl_overpackage = 0 + sku_total_cubic_feet = 0 + for package in packages: + cubic_feet= package.length * package.width * package.height / 1000000 * 35.3 + sku_total_cubic_feet += cubic_feet + # 卡派额外费用 + if package.fst_size>= 250: + count1 += 1 + order_ltl_oversize = 118 + if order_type_length == '': + order_type_length = '超长' + if package.weight >= 111000: + count2 += 1 + order_ltl_overweight1 = 78 + order_type_weight = '超重' + if package.weight >= 130000: + count3 += 1 + order_ltl_overweight2 = 30 + if package.fst_size >= 310: + count4 += 1 + order_ltl_overpackage = 30 + order_type_length = '大包裹' + order_type2 = ltl_type +order_type_length+ order_type_weight + + # 卡派基础费用 体积/1000000 *35.3 + if sku_total_cubic_feet < 25: + ltl_base = round(163 / 0.45 / 2, 2) # 181.11 + + elif sku_total_cubic_feet < 35: + ltl_base = round(180 / 0.45 / 2, 2) # 200 + else: + # 大于一个立方的(35立方英尺) 按照每立方英尺*5美金 + # 最低为190美金 + ltl_base = round(max(190, 5 * sku_total_cubic_feet) / 0.359 / 2) + + + ltl_fee = math.ceil(count1 / 3) * order_ltl_oversize + math.ceil(count2 / 3) * order_ltl_overweight1 + math.ceil( + count3 / 3) * order_ltl_overweight2 + math.ceil(count4 / 3) * order_ltl_overpackage + ltl_base + + if ltl_fee < express_fee: + ocean_fee = ltl_fee + order_type = order_type2 + else: + ocean_fee = express_fee + order_type = express_type + return ocean_fee, order_type + +def air_order_price(packages): + express_fee = 0 + express_type = '' + for package in packages: + price=0 + bill_weight = max(package.weight, package.get_volume_weight(8500)) + if package.weight<=420 and package.fst_size<=50 and package.sed_size<=40 and package.trd_size<=30: + for key, value in air_small_dict.items(): + if package.weight <=key: + price =value + break + elif package.weight<=2718 and package.fst_size<=50 and package.sed_size<=40 and package.trd_size<=30: + for key, value in air_small_dict.items(): + if bill_weight <=key: + price =value + break + else: + for key, value in air_big_dict.items(): + if bill_weight <=key: + price =value + break + if package.weight<=420: + express_fee+=((((min(max(package.density,37),337)*0.093+27.7)/6+0.65)*package.get_volume_weight(6000))*0.3+price)/0.45 + if express_type == '': + express_type='USPS' + elif package.weight<=2718: + express_fee+=(((min(max(package.density,37),337)*0.093+27.7)/6+0.65)*package.get_volume_weight(8500)*0.3+price)/0.45 + if express_type == '' or express_type == 'USPS': + express_type='UandF' + else: + express_fee+=(((min(max(package.density,37),337)*0.093+27.7-1.08)/6+0.65-1.06)*package.get_volume_weight(8500))/0.45+price + express_type='FEDEX' + return express_fee, express_type \ No newline at end of file