优惠分摊算法 php版

<?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;
    }
        

 

转载于:https://www.cnblogs.com/zx-admin/p/5548834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值