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

优惠分摊算法 php版的更多相关文章

  1. KMP算法-Python版

                               KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...

  2. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  3. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  4. .Net之时间轮算法(终极版)定时任务

    TimeWheelDemo 一个基于时间轮原理的定时器 对时间轮的理解 其实我是有一篇文章(.Net 之时间轮算法(终极版))针对时间轮的理论理解的,但是,我想,为啥我看完时间轮原理后,会采用这样的方 ...

  5. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  6. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

  7. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  8. 零基础学C#算法(零基础学算法——C#版)

    今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...

  9. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

随机推荐

  1. Ural 1057 Amount of Degrees

    Description 问[L,R]中有多少能表示k个b次幂之和. Sol 数位DP. 当2进制时. 建出一个二叉树, \(f[i][j]\) 表示长度为 \(i\) 有 \(j\) 个1的个数. 递 ...

  2. 【Python】自动生成html文件查看指定目录中的所有图片

    获取本目录下的pic子目录中的所有图片(jpg,png,bmp,gif等,此处以jpg文件为例),然后生成一个image.html文件,打开该html文件即可在浏览器中查看pic子目录中的所有图片. ...

  3. jquery手写实现单页滚动导航

    效果说明:点击tab导航,页面滑动到下方相应板块.并且当页面通过鼠标滚动下去时,上方的tab也可以自动切换到当前位置的板块上. 代码说明:js中对两个动作分别写,一个是tab点击下滑到相应板块位置:一 ...

  4. Python~迭代

            dict #默认情况下,dict迭代的是key 迭代value #迭代key,value     for value in  d.itervalues(): for k,v in d. ...

  5. js 的Location对象

    Location对象 location用于获取或设置窗体的URL,并且可以用于解析URL. 语法: location.[属性|方法] location对象属性图示: location 对象属性: ha ...

  6. PHP 链接数据库1(连接数据库&简单的登录注册)

    对 解析变量的理解 数据库的名称和表的名称不能重复 从结果中取出的数据   都是以数组的形式取出的 1.PHP查询数据库中的某条信息 //PHP链接数据库 /*1.造链接对象 IP地址 用户名 密码 ...

  7. springMVC 学习(一)

    本文主要介绍springmvc的框架原理,并通过一个入门程序展示环境搭建,配置以及部署调试. springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合 ...

  8. ubuntu下配置jdk

    1.首先下载jdk-7u51-linux-i586.tar.gz.并将它放在例如/home目录. 2.解压安装 sudo tar zxvf ./jdk-7u51-linux-i586.tar.gz  ...

  9. android tab选项卡的使用

    项目做完了,写写博客,在项目中遇到的一些问题,或者是自己觉得很不错的东西.这一篇主要是想和大家分享一下我在项目中封装的一个东西,就是tab选项卡.先看看效果图: 我在网上看了很多有关选项卡的demo, ...

  10. 浏览器-07 chromium 渲染1

    Chromium 软件渲染 软件渲染就是利用CPU,根据一定的算法来计算生成网页的内容; Chromium都是用软件渲染的技术来完成页面的绘制工作(除非强行打开硬件加速绘制); 软件渲染基础和架构 R ...