如果取消一个(现金+满减+积分)订单的商品,你如何分摊优惠

优惠分摊,算法很多,这里是从shopnc挖出来,适合优惠条件过滤的算法,实质很简单,但是理解难度还是有一点

 

 

应用场景:

一个订单的商品,如果不参与某种活动的时候,那就需要分摊优惠,一般来说需要分摊的有购物金,积分,优惠券,满减等。而且是在整个订单上来使用优惠。

多件N折,限制抢购,团购等都是在商品单价上面体现的,所以难点就在于如何去分摊优惠,比如一个订单用购物金,积分下单了。订单取消后需要返还。这个时候需要退给用户的钱就是商品的价格-购物金-积分之后的钱了

 

示例截图

 

以下提供优惠分摊的方法,有需要的可以借鉴一下

<?php
/*
* 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;
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值