witholder.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. use bonus_helper;
  11. use QueueClient;
  12. function asc_usable(user_bonus $left,user_bonus $right)
  13. {
  14. $t_l = $left->usable_time();
  15. $t_r = $right->usable_time();
  16. if($t_l > $t_r) {
  17. return 1;
  18. }
  19. elseif($t_l == $t_r) {
  20. return 0;
  21. }
  22. else {
  23. return -1;
  24. }
  25. }
  26. class witholder
  27. {
  28. private $member_id;
  29. private $mRateBonus;
  30. private $usable_amount; //可用红包总金额
  31. private $mUsedType;
  32. private $mod_bonus;
  33. public function __construct($member_id,$used_type)
  34. {
  35. $this->mod_bonus = Model('user_bonus');
  36. $this->member_id = $member_id;
  37. $this->mRateBonus = array();
  38. $this->usable_amount = 0.00;
  39. $this->usable_amount = $this->mod_bonus->getUsableSum($this->member_id);
  40. $items = $this->mod_bonus->getUsableBonus($this->member_id);
  41. foreach ($items as $item) {
  42. $bonus = user_bonus::create_by_param($item);
  43. $this->add_bouns($bonus);
  44. }
  45. foreach ($this->mRateBonus as &$item) {
  46. $bonuses = &$item['bonus'];
  47. uasort($bonuses,'bonus\asc_usable');
  48. }
  49. $this->mUsedType = $used_type;
  50. }
  51. private function add_bouns(user_bonus $bonus)
  52. {
  53. $rate = $bonus->bonus_rate();
  54. if(array_key_exists($rate,$this->mRateBonus) == false) {
  55. $this->mRateBonus[$rate]['bonus'] = [];
  56. $this->mRateBonus[$rate]['amount'] = 0.00;
  57. $this->mRateBonus[$rate]['rate'] = $rate;
  58. }
  59. $this->mRateBonus[$rate]['bonus'][] = $bonus;
  60. $this->mRateBonus[$rate]['amount'] = $this->mRateBonus[$rate]['amount'] + $bonus->remain_amount();
  61. }
  62. public function usable_amount() {
  63. return $this->usable_amount;
  64. }
  65. public function withold_bonus($rate,$bonus_sn,$money)
  66. {
  67. if(array_key_exists($rate,$this->mRateBonus) == false) return false;
  68. $bounses = $this->mRateBonus[$rate]['bonus'];
  69. foreach ($bounses as $bonus)
  70. {
  71. if($bonus_sn == $bonus->bonus_sn())
  72. {
  73. $left = intval($bonus->remain_amount() * 100 + 0.5);
  74. $money = intval($money * 100 + 0.5);
  75. $left = $left - $money;
  76. $left = $left >= 0 ? $left / 100 : 0.00;
  77. $rate = $bonus->bonus_rate();
  78. $param = $bonus->get_param();
  79. $param['remain_amount'] = $left;
  80. if($this->mUsedType == bonus_helper::send_bonus_withold) {
  81. $send = intval($bonus->send_amount() * 100 + 0.5);
  82. $send = $send + $money;
  83. $send = $send / 100;
  84. $param['send_amount'] = $send;
  85. }
  86. elseif($this->mUsedType == bonus_helper::pay_order_withold) {
  87. $paied = intval($bonus->pay_amount() * 100 + 0.5);
  88. $paied = $paied + $money;
  89. $paied = $paied / 100;
  90. $param['pay_amount'] = $paied;
  91. }
  92. else {
  93. }
  94. QueueClient::push("onUseBonus",['time' => time(),'use_type' => $this->mUsedType,'rate' => $rate,'amount' => $money / 100,'member_id' => $this->member_id]);
  95. $this->mod_bonus->replace($param);
  96. return true;
  97. }
  98. }
  99. return false;
  100. }
  101. public function withold($rate,$money)
  102. {
  103. if(array_key_exists($rate,$this->mRateBonus) == false) {
  104. return false;
  105. }
  106. $r_bonuses = &$this->mRateBonus[$rate];
  107. $left = intval($money * 100 + 0.5);
  108. if($left <= 0 || intval($r_bonuses['amount'] * 100 + 0.5) < $left) {
  109. return false;
  110. }
  111. $r_bonuses['amount'] -= $money;
  112. $datas = array();
  113. $bonuses = &$r_bonuses['bonus'];
  114. foreach ($bonuses as $bonus)
  115. {
  116. if($left <= 0) break;
  117. if($this->mUsedType == bonus_helper::send_bonus_withold && $bonus->can_share() == false) {
  118. continue;
  119. }
  120. $rate = $bonus->bonus_rate();
  121. $param = $bonus->get_param();
  122. $remain = $bonus->remain_amount();
  123. $remain = intval($remain * 100 + 0.5);
  124. if($left >= $remain) {
  125. $left -= $remain;
  126. $param['remain_amount'] = 0.00;
  127. $used = $remain;
  128. } else {
  129. $remain -= $left;
  130. $param['remain_amount'] = $remain / 100;
  131. $used = $left;
  132. $left = 0;
  133. }
  134. if($this->mUsedType == bonus_helper::send_bonus_withold) {
  135. $send = intval($bonus->send_amount() * 100 + 0.5);
  136. $send = $send + $used;
  137. $send = $send / 100;
  138. $param['send_amount'] = $send;
  139. }
  140. elseif($this->mUsedType == bonus_helper::pay_order_withold) {
  141. $paied = intval($bonus->pay_amount() * 100 + 0.5);
  142. $paied = $paied + $used;
  143. $paied = $paied / 100;
  144. $param['pay_amount'] = $paied;
  145. }
  146. else {
  147. }
  148. QueueClient::push("onUseBonus",['time' => time(),'use_type' => $this->mUsedType,'rate' => $rate,'amount' => $used / 100,'member_id' => $this->member_id]);
  149. array_push($datas,$param);
  150. }
  151. if(!empty($datas)) {
  152. $this->mod_bonus->replaceAll($datas);
  153. }
  154. return true;
  155. }
  156. }