知识案列

php实现的递归提成方案实例

 

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;

}

原文地址:https://www.cnblogs.com/xa4312cs/p/6188838.html