<?php /* * 優惠分攤,算法很多,這里是從shopnc挖出來,適合優惠條件過濾的算法,實質很簡單,但是理解難度還是有一點 * * 一個訂單的商品,如果不參與某種活動,需要分攤優惠,一般來說需要分攤的有購物金,積分,優惠券,滿減等 ,是在整個訂單的上來使用優惠 * 多件N折,限制搶購,團購等都是在商品單價上面做的 * 所以難點就在於如何去分攤優惠比如,購物金,積分,訂單取消之后需要返還,商品價格-購物金-積分之后的錢,才是需要退給用戶的錢 * * * useuserpoint 拆購物金分攤 * usediscount 拆代金卷分攤 * use_offer 除去購物金和折價券之外的優惠分攤,目前來說就是滿減的分攤 * * 按照不同活動類型來計算此次參與活動商品總金額,再按參與商品金額goods_total的占比來分配分攤的優惠,$type就是來對應相關的優惠分攤類型 */ function _splitPrice(&$goods_info, $tmprice, $type) { $goods_num = count($goods_info); $total = 0; foreach($goods_info as $k => $v) { if($type=='use_offer'){ if($v['is_own_shop'] == 1) { if($goods_num>1){ if(!$v['yihe_supplier_deliver']){ //第三方發貨的不要攤到滿減等優惠 if(!$v['more_goods_discount_info']){ //多件N折商品跳過滿減優惠分攤 $total += $v['goods_total']; } } }else{ $total += $v['goods_total']; } } }else{ if($v['is_own_shop'] == 1) { $total += $v['goods_total']; } } } $tmp = $tmprice; //表面看很不理解,但是其他2個$type對應的值寫出來就很明白就是一個根據不同優惠分攤類型經行計算總價格的, //下面的也是不過是計算分攤具體優惠轉換成存打數據庫的字段 // foreach($goods_info as $k => $v) { // if($type=='use_offer'){ // if($v['is_own_shop'] == 1) { // if($goods_num>1){ // if(!$v['yihe_supplier_deliver']){ //第三方發貨的不要攤到滿減等優惠 // if(!$v['more_goods_discount_info']){ //多件N折商品跳過滿減優惠分攤 // $total += $v['goods_total']; // } // } // }else{ // $total += $v['goods_total']; // } // } // }elseif($type=='usediscount'){ // if($v['is_own_shop'] == 1) { // $total += $v['goods_total']; // } // }elseif($type=='useuserpoint'){ // if($v['is_own_shop'] == 1) { // $total += $v['goods_total']; // } // // } // } foreach($goods_info as $k => $v) { //第三方發貨的跳過 //多件N折商品跳過滿減優惠分攤 if($type == 'use_offer'&&$goods_num>1&&$v['yihe_supplier_deliver']){ continue; } if($type == 'use_offer'&&$goods_num>1&&$v['more_goods_discount_info']){ continue; } if($v['is_own_shop'] == 1) { $splitVal = intval($v['goods_total']/$total*$tmprice) + 1; if($splitVal > $tmp) { $splitVal = $tmp; } $tmp -= $splitVal; if($type == 'useuserpoint') { $goods_info[$k]['goods_splituserpoint'] = $splitVal; } elseif($type == 'usediscount') { $goods_info[$k]['goods_splitusediscount'] = $splitVal; }elseif($type=='use_offer'){ $goods_info[$k]['goods_split_use_offer'] = $splitVal; } if($tmp == 0) { break; } } } // P($goods_info); // die; }