CalculationPointService.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/4/11
  6. * Time: 下午9:44
  7. */
  8. namespace app\frontend\modules\finance\services;
  9. use app\backend\modules\member\models\Member;
  10. use app\common\models\Order;
  11. use Illuminate\Support\Facades\Log;
  12. class CalculationPointService
  13. {
  14. private $orderGoodsModels;
  15. /**
  16. * @var Order
  17. */
  18. private $order;
  19. private $point_set;
  20. public $point;
  21. private $member;
  22. public $point_money;
  23. public function __construct($order, $member_id)
  24. {
  25. $this->order = $order;
  26. $this->orderGoodsModels = $order->orderGoods;
  27. //验证积分设置
  28. $this->verifyPointSet();
  29. //验证用户积分
  30. $this->verifyMemberPoint($member_id);
  31. //计算积分
  32. $this->calculationPoint();
  33. $this->point_money = floor($this->point * $this->point_set['money'] * 100) / 100;
  34. Log::info("订单{$this->order->id}:用户积分使用{$this->point_money}");
  35. }
  36. /**
  37. * @name 验证积分设置的是否开启积分抵扣
  38. * @author yangyang
  39. * @return false
  40. */
  41. private function verifyPointSet()
  42. {
  43. Log::info("订单{$this->order->id}:订单积分设置");
  44. if ($this->order->getSetting('point.set.point_deduct') == 0) {
  45. return false;
  46. }
  47. $this->point_set = $this->order->getSetting('point.set');
  48. }
  49. /**
  50. * @name 验证用户是否有积分
  51. * @author yangyang
  52. * @param $member_id
  53. * @return false
  54. */
  55. private function verifyMemberPoint($member_id)
  56. {
  57. Log::info("订单{$this->order->id}:用户积分验证");
  58. if (Member::getMemberInfoById($member_id)['credit1'] <= 0) {
  59. return false;
  60. }
  61. $this->member = Member::getMemberInfoById($member_id);
  62. }
  63. /**
  64. * @name 计算可以使用多少积分
  65. * @author yangyang
  66. */
  67. private function calculationPoint()
  68. {
  69. foreach ($this->orderGoodsModels as $goodsModel) {
  70. $this->calculationMemberPoint($this->getGoodsPoint($goodsModel));
  71. }
  72. }
  73. /**
  74. * @name 获取商品
  75. * @author yangyang
  76. * @param $goods_model
  77. * @return float|int
  78. */
  79. private function getGoodsPoint($goods_model)
  80. {
  81. if ($goods_model->goods->hasOneSale->max_point_deduct === '0') {
  82. return 0;
  83. }
  84. if ($goods_model->goods->hasOneSale->max_point_deduct) {
  85. if (strexists($goods_model->goods->hasOneSale->max_point_deduct, '%')) {
  86. // 独立价格比例
  87. $goods_point = floatval(str_replace('%', '', $goods_model->goods->hasOneSale->max_point_deduct) / 100 * $goods_model->goods_price / $this->point_set['money']);
  88. } else {
  89. // 独立固定金额
  90. $goods_point = $goods_model->goods->hasOneSale->max_point_deduct * $goods_model->total / $this->point_set['money'];
  91. }
  92. return $goods_point;
  93. } else if ($this->point_set['money_max'] > 0 && empty($goods_model->goods->hasOneSale->max_point_deduct)) {
  94. // 全局比例
  95. $goods_point = $this->point_set['money_max'] / 100 * $goods_model->price / $this->point_set['money'];
  96. return $goods_point;
  97. }
  98. }
  99. private function calculationMemberPoint($goods_point)
  100. {
  101. if ($goods_point >= $this->member['credit1']) {
  102. $this->point += $this->member['credit1'];
  103. $this->member['credit1'] = 0;
  104. } else {
  105. $this->point += $goods_point;
  106. $this->member['credit1'] = $this->member['credit1'] - $goods_point;
  107. }
  108. }
  109. }