BonusAmount.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2018/8/24
  6. * Time: 下午6:35
  7. */
  8. namespace bonus;
  9. use UnImplementsException;
  10. class BonusAmount implements IMoneyCalc
  11. {
  12. private $mDirty;
  13. private $mAmount;
  14. public function __construct($rates)
  15. {
  16. $this->mDirty = false;
  17. $this->mAmount = 0.00;
  18. $amount = 0.0;
  19. foreach ($rates as $key => $val) {
  20. $amount += $val;
  21. }
  22. $this->mAmount = intval(100 * $amount + 0.5) / 100;
  23. }
  24. public function add_bonuses($items)
  25. {
  26. foreach ($items as $item) {
  27. $bonus = \bonus\user_bonus::create_by_param($item);
  28. $amount = intval($bonus->remain_amount() * 100 + 0.5) / 100;
  29. if ($amount <= 0) continue;
  30. $this->mAmount += intval(100 * $amount + 0.5) / 100;
  31. $this->mDirty = true;
  32. }
  33. }
  34. public function is_enough(&$rate, $amount)
  35. {
  36. $rate = defaultBonusRate();
  37. $amount = intval($amount * 100 + 0.5);
  38. $tmp = intval($this->mAmount * 100 + 0.5);
  39. return $tmp >= $amount;
  40. }
  41. public function with_hold($rate, $amount)
  42. {
  43. $this->mAmount -= ($amount * 100 + 0.5) / 100;
  44. $this->mDirty = true;
  45. }
  46. public function find_rate($amount)
  47. {
  48. if ($this->is_enough($rate, $amount)) {
  49. return ['rate' => defaultBonusRate(), 'amount' => intval($amount * 100 + 0.5) / 100];
  50. } else {
  51. $amount = intval($amount * 100 + 0.5);
  52. return ['rate' => $rate, 'amount' => $amount / 100];
  53. }
  54. }
  55. public function format()
  56. {
  57. return [defaultBonusRate() => intval($this->mAmount * 100 + 0.5) / 100];
  58. }
  59. public function total()
  60. {
  61. return $this->mAmount;
  62. }
  63. public function dirty()
  64. {
  65. return $this->mDirty;
  66. }
  67. public function clean()
  68. {
  69. $this->mDirty = false;
  70. }
  71. public function calc_rates($amount)
  72. {
  73. throw new UnImplementsException(__METHOD__);
  74. }
  75. public function calc_money($price, &$rates)
  76. {
  77. throw new UnImplementsException(__METHOD__);
  78. }
  79. public function calc_price($price, &$rates)
  80. {
  81. throw new UnImplementsException(__METHOD__);
  82. }
  83. static function scale()
  84. {
  85. return (100 - self::PRED_RATE) / 100;
  86. }
  87. }