witholder.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/6/27
  6. * Time: 上午12:34
  7. * 扣款者,用来做红包扣款
  8. */
  9. namespace bonus;
  10. function asc_usable(user_bonus $left,user_bonus $right)
  11. {
  12. $t_l = $left->usable_time();
  13. $t_r = $right->usable_time();
  14. if($t_l > $t_r) {
  15. return 1;
  16. }
  17. elseif($t_l == $t_r) {
  18. return 0;
  19. }
  20. else {
  21. return -1;
  22. }
  23. }
  24. class witholder
  25. {
  26. private $member_id;
  27. private $mRateBonus;
  28. private $usable_amount; //可用红包总金额
  29. private $mod_bonus;
  30. public function __construct($member_id)
  31. {
  32. $this->mod_bonus = Model('user_bonus');
  33. $this->member_id = $member_id;
  34. $this->mRateBonus = array();
  35. $this->usable_amount = 0.00;
  36. $this->usable_amount = $this->mod_bonus->getUsableSum($this->member_id);
  37. $items = $this->mod_bonus->getUsableBonus($this->member_id);
  38. foreach ($items as $item) {
  39. $bonus = user_bonus::create_by_param($item);
  40. $this->add_bouns($bonus);
  41. }
  42. foreach ($this->mRateBonus as &$item) {
  43. $bonuses = &$item['bonus'];
  44. uasort($bonuses,'bonus\asc_usable');
  45. }
  46. }
  47. private function add_bouns(user_bonus $bonus)
  48. {
  49. $rate = $bonus->bonus_rate();
  50. if(array_key_exists($rate,$this->mRateBonus) == false) {
  51. $this->mRateBonus[$rate]['bonus'] = [];
  52. $this->mRateBonus[$rate]['amount'] = 0.00;
  53. $this->mRateBonus[$rate]['rate'] = $rate;
  54. }
  55. $this->mRateBonus[$rate]['bonus'][] = $bonus;
  56. $this->mRateBonus[$rate]['amount'] = $this->mRateBonus[$rate]['amount'] + $bonus->remain_amount();
  57. }
  58. public function usable_amount() {
  59. return $this->usable_amount;
  60. }
  61. public function withold_bonus($rate,$bonus_sn,$money)
  62. {
  63. if(array_key_exists($rate,$this->mRateBonus) == false) return false;
  64. $bounses = $this->mRateBonus[$rate]['bonus'];
  65. foreach ($bounses as $bonus)
  66. {
  67. if($bonus_sn == $bonus->bonus_sn()) {
  68. $left = intval($bonus->remain_amount() * 100 + 0.5);
  69. $money = intval($money * 100 + 0.5);
  70. $left = $left - $money;
  71. $left = $left >= 0 ? $left / 100 : 0.00;
  72. $param = $bonus->get_param();
  73. $param['remain_amount'] = $left;
  74. $this->mod_bonus->replace($param);
  75. return true;
  76. }
  77. }
  78. return false;
  79. }
  80. public function withold($rate,$money)
  81. {
  82. if(array_key_exists($rate,$this->mRateBonus) == false) {
  83. return false;
  84. }
  85. $r_bonuses = &$this->mRateBonus[$rate];
  86. $left = intval($money * 100 + 0.5);
  87. if($left <= 0 || intval($r_bonuses['amount'] * 100 + 0.5) < $left) {
  88. return false;
  89. }
  90. $r_bonuses['amount'] -= $money;
  91. $datas = array();
  92. $bonuses = &$r_bonuses['bonus'];
  93. foreach ($bonuses as $bonus)
  94. {
  95. if($left <= 0) break;
  96. $param = $bonus->get_param();
  97. $remain = $bonus->remain_amount();
  98. $remain = intval($remain * 100 + 0.5);
  99. if($left >= $remain) {
  100. $left -= $remain;
  101. $param['remain_amount'] = 0.00;
  102. } else {
  103. $remain -= $left;
  104. $param['remain_amount'] = $remain / 100;
  105. $left = 0;
  106. }
  107. array_push($datas,$param);
  108. }
  109. if(!empty($datas)) {
  110. $this->mod_bonus->replaceAll($datas);
  111. }
  112. return true;
  113. }
  114. }