# 英国海运订单费用,返回单个sku的订单费用和订单类型 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): """ 入参:packages的类型是Package_group,里面包含多个Package,这是一个类,这个类今天在群里发过 入参:k是物流分摊费,也就是k 出参: 订单物流费,订单类型 """ 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['重量'])) # 计算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 or package.sed_size >=60 or 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 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,"结束")