本文实例讲述了php实现的递归提成方案。分享给大家供大家参考,具体如下:
最近CRM项目中用到了递归提成的方案,分析如下:
SQL语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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( '0' , '1' ) DEFAULT '0' COMMENT '是否是标准' ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
|
PHP实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 ; //800
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程序设计有所帮助。