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

最新文章

  1. 如何在web中实现类似excel的表格控件
  2. 读懂IL代码就这么简单 (一)
  3. Arch Linux 安装、配置、美化和优化
  4. 指定线程执行的顺序---join()
  5. dom4j生成xml
  6. android 自定义控件中获取属性的三种方式(转)
  7. css解决IE6、Chrome、ff 浏览器position:fixed;和闪动问题
  8. 玩转图片Base64编码
  9. sd nfrmtl
  10. java多线程(七)-线程之间的 协作
  11. emwin 之 GUI_MessageBox 阻塞特性
  12. 第五节: Quartz.Net五大构件之Trigger的四大触发类
  13. gitlab-ci.xml:script config should be a string or an array of strings
  14. 详解Vue 开发模式下跨域问题
  15. 半透明全屏蒙层+全屏屏蔽+内容居中+css
  16. # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟
  17. 关联查询resultMap使用规则总结——(十一)
  18. Node.js之接收前台数据实例
  19. 筛选DataTable中的数据
  20. Win10 C盘根目录权限

热门文章

  1. shutil复制粘贴和压缩
  2. ServletConfig 可以做啥
  3. CSS 魔法系列:纯 CSS 绘制三角形(各种角度)
  4. PHP 链接数据库1(连接数据库&amp;简单的登录注册)
  5. .NET LINQ数据转换
  6. 一、CoreAnimation之图层树详解
  7. [Android Pro] android控件ListView顶部或者底部也显示分割线
  8. JAVA实现 springMVC方式的微信接入、实现消息自动回复
  9. 自动保存u盘里的文件
  10. Guava学习笔记(2):Preconditions优雅的检验参数