GoodsDeduct.php 2.5 KB

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