GoodsDeduct.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. *
  4. * @copyright ©2020 点小铺
  5. * @author hanj
  6. * @link: https://dyuit.com
  7. * Created by VSCode
  8. */
  9. namespace app\api\service\points;
  10. use app\common\library\helper;
  11. use app\api\model\Setting as SettingModel;
  12. class GoodsDeduct
  13. {
  14. private $goodsList;
  15. public function __construct($goodsList)
  16. {
  17. $this->goodsList = $goodsList;
  18. }
  19. public function setGoodsPoints($maxPointsNumCount, $actualPointsNum)
  20. {
  21. // 计算实际积分抵扣数量
  22. $this->setGoodsListPointsNum($maxPointsNumCount, $actualPointsNum);
  23. // 总抵扣数量
  24. $totalPointsNum = helper::getArrayColumnSum($this->goodsList, 'points_num');
  25. // 填充余数
  26. $this->setGoodsListPointsNumFill($actualPointsNum, $totalPointsNum);
  27. $this->setGoodsListPointsNumDiff($actualPointsNum, $totalPointsNum);
  28. // 计算实际积分抵扣金额
  29. $this->setGoodsListPointsMoney();
  30. return true;
  31. }
  32. /**
  33. * 计算实际积分抵扣数量
  34. * @param $maxPointsNumCount
  35. * @param $actualPointsNum
  36. */
  37. private function setGoodsListPointsNum($maxPointsNumCount, $actualPointsNum)
  38. {
  39. foreach ($this->goodsList as &$goods) {
  40. if (!$goods['is_points_discount']) continue;
  41. $goods['points_num'] = floor($goods['max_points_num'] / $maxPointsNumCount * $actualPointsNum);
  42. }
  43. }
  44. /**
  45. * 计算实际积分抵扣金额
  46. */
  47. private function setGoodsListPointsMoney()
  48. {
  49. $setting = SettingModel::getItem('points');
  50. foreach ($this->goodsList as &$goods) {
  51. if (!$goods['is_points_discount']) continue;
  52. $goods['points_money'] = helper::bcmul($goods['points_num'], $setting['discount']['discount_ratio']);
  53. }
  54. }
  55. private function setGoodsListPointsNumFill($actualPointsNum, $totalPointsNum)
  56. {
  57. if ($totalPointsNum === 0) {
  58. $temReducedMoney = $actualPointsNum;
  59. foreach ($this->goodsList as &$goods) {
  60. if (!$goods['is_points_discount']) continue;
  61. if ($temReducedMoney === 0) break;
  62. $goods['points_num'] = 1;
  63. $temReducedMoney--;
  64. }
  65. }
  66. return true;
  67. }
  68. private function setGoodsListPointsNumDiff($actualPointsNum, $totalPointsNum)
  69. {
  70. $tempDiff = $actualPointsNum - $totalPointsNum;
  71. foreach ($this->goodsList as &$goods) {
  72. if (!$goods['is_points_discount']) continue;
  73. if ($tempDiff < 1) break;
  74. $goods['points_num'] = $goods['points_num'] + 1;
  75. $tempDiff--;
  76. }
  77. return true;
  78. }
  79. }