<?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. serialize存入数组

    原代码 def get_type type_list = "" if categories.include?"movie" type_list += " ...

  2. 【ZJOI2007】棋盘制作 BZOJ1057

    Description 国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对 ...

  3. xmind portable

    portable : http://dl2.xmind.cn/xmind-7.5-update1-portable.zip

  4. [教程] 【玩转终端1:apt-get】

    进来工作比较清闲,所以写点东西,给喜欢折腾的朋友.本文及后面将要介绍的一些终端命令,其实对于玩过linux的人来说,是很基础的东西,我可能是班门弄斧了(拍砖的请轻点,有愿意补充/纠正的,本人求知不得) ...

  5. iOS 归档archive使用方法

    归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存,文件将被保存成自定 义类型的文件,相对于NSUserDefault具有更好的保密性.   1.使用archiveRootObject ...

  6. poj1182食物链_并查集_挑战程序设计竞赛例题

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65534   Accepted: 19321 Description ...

  7. AngularJS HTML DOM

    AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled 指令: ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性 ...

  8. 去掉input框点击时的默认颜色

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  9. tensorflow添加自定义的auc计算operator

    tensorflow可以很方便的添加用户自定义的operator(如果不添加也可以采用sklearn的auc计算函数或者自己写一个 但是会在python执行,这里希望在graph中也就是c++端执行这 ...

  10. 【leetcode】Perfect Squares (#279)

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...