好久没有写blog了,最近CRM项目中用到了递归提成的方案

CREATE TABLE `crm_proxy_bonux_rule` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '超过的部份提成规则ID',
`bouns_rule_name` varchar(20) NOT NULL COMMENT '规则名称,如D套餐0-20范围',
`rid` bigint(20) DEFAULT NULL COMMENT '为0,就是默认的全局设置',
`start_rang` smallint(6) DEFAULT NULL COMMENT '开始范围',
`end_rang` smallint(6) DEFAULT NULL COMMENT '结束范围',
`bonus_rate` smallint(6) DEFAULT NULL COMMENT '提成率',
`bonus_reward` decimal(8,2) DEFAULT NULL COMMENT '奖励现金',
`chain_pre` int(11) DEFAULT NULL COMMENT '链表上一个值默认为0,表示根结点',
`chain_next` int(11) DEFAULT NULL COMMENT '链表下一个值',
`is_standard` enum('','') DEFAULT '' COMMENT '是否是标准',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
 private function bouns_recursion($range,$standard,&$rule_list,$amount){
$price = 1000;
$max = $standard['end_rang'] ;//最大值
$min = $standard['start_rang'] ;//最小值
$bonus_rate = $standard['bonus_rate'];//分红率
if($range<$min){
return false;
}
$standard_amount = 0;
$plus = 0;
//是否是标准 第一个
if($standard['is_standard']==1){
$standard_amount = $price * $min * $bonus_rate / 100; //求提成 600 300
}else{
$plus = 1; //第二次要累加
}
if($range > $max){
$number = ($max - $min) + $plus;//算出差值值 5 4-3 == 1
$amount = ($price * $number * $bonus_rate / 100); //求提成 200
}else{
$number = ($range - $min ) + $plus;//算出差值值 4 1
$amount = ($price * $number * $bonus_rate / 100); //求提成
}
$amount = $amount + $standard_amount;//
if(!empty($rule_list[$standard['chain_next']]) && $range > $max){
return $amount += $this->bouns_recursion($range, $rule_list[$standard['chain_next']], $rule_list,$amount);
}
return $amount;
}

php 处理递归提成的方案的更多相关文章

  1. 第1次实验——NPC问题(回溯算法、聚类分析)

    题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一 ...

  2. Go/Python/Erlang编程语言对比分析及示例

    本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴 ...

  3. Python3-Cookbook总结 - 第二章:字符串和文本

    第二章:字符串和文本 几乎所有有用的程序都会涉及到某些文本处理,不管是解析数据还是产生输出. 这一章将重点关注文本的操作处理,比如提取字符串,搜索,替换以及解析等. 大部分的问题都能简单的调用字符串的 ...

  4. 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议

    本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight's Dialer:翻译:实验楼 ...

  5. 你真的会用Gson吗?Gson使用指南(4)

    原文出处: 怪盗kidou 注:此系列基于Gson 2.4. 本次文章的主要内容: TypeAdapter JsonSerializer与JsonDeserializer TypeAdapterFac ...

  6. c#栈和队列习题

    3.1 比较线性表.栈和队列这三种数据结构的相同点和不同点. 栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表.队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性 ...

  7. 面试题之发散思维能力:如何用非常规方法求1+2+···+n

    今天在<剑指offer>里看到了下面这样一个简单且有趣的题,考察程序员的发散思维能力,前提是你对C++相关知识点熟悉,否则是想不出来方案的,分享给大家.   题目:求1+2+···+n,要 ...

  8. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  9. sqlite3树形结构遍历效率对照測试

    sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...

随机推荐

  1. Win10 资源文件

    ResourceLoader rl = new ResourceLoader(); DisOutText.Text = rl.GetString("Display"); Resou ...

  2. js判断访问的当前设备是手机还是电脑

    function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...

  3. php计算几分钟前、几小时前等

    function format_date($time){ $t=time()-$time; $f=array( '=>'年', '=>'个月', '=>'星期', '=>'天' ...

  4. ARM伪指令,王明学learn

    ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...

  5. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  6. 批量删除SharePoint 2010的List中的item

    第一种方式:循环遍历List中的所有item,然后根据条件去判断当前item是否应该被删除[注:要用 i-- 方式去遍历,这也是删除集合里面item的常用做法,如果用 i++ 的方式去遍历删除,会出错 ...

  7. 获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤

    循环每个内核模块 统计模块大小 判断触发异常的地址属于那个模块.来确定模块 获取发生异常地址 nt!_EXCEPTION_RECORD +0x000 ExceptionCode : -21391605 ...

  8. 【转】使用jquery animate创建平滑滚动效果

    这篇文章主要介绍了使用jquery animate创建平滑滚动效果,效果可以滚动到顶部.到底部或页面中指定地方,生要的是非常平滑,很舒服,需要的朋友可以参考下 滚动到顶部: $('.scroll_to ...

  9. TextView展开和收回

    第一步:接口请求返回数据 第二步:使用handler和textview.getLineCount方法判断是否超过指定行数: community_desc_more.setVisibility(View ...

  10. hdu1003 dp

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1003 #include<cstdio> #include<algorit ...