CalculationPointService.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/4/11
  6. * Time: 下午6:27
  7. */
  8. namespace app\common\services\finance;
  9. use app\common\facades\Setting;
  10. use app\common\models\Order;
  11. use app\common\models\OrderGoods;
  12. use Yunshop\StoreCashier\common\models\CashierGoods;
  13. use Yunshop\StoreCashier\common\models\StoreGoods;
  14. use Yunshop\StoreCashier\common\models\StoreSetting;
  15. class CalculationPointService
  16. {
  17. /**
  18. * @param OrderGoods $orderGoods
  19. * @return array
  20. */
  21. public static function calculationPointByGoods($orderGoods)
  22. {
  23. $point_set = Setting::get('point.set');
  24. $order = Order::find($orderGoods->order_id);
  25. $order_set = $order->orderSettings->where('key', 'point')->first();
  26. if ($order_set && $order_set->value['set']['give_point']) {
  27. $point_set['give_point'] = $order_set->value['set']['give_point'] . '%';
  28. }
  29. $point_data = [];
  30. //todo 如果等于0 不赠送积分
  31. if (isset($orderGoods->hasOneGoods->hasOneSale) && $orderGoods->hasOneGoods->hasOneSale->point !== '' && floatval($orderGoods->hasOneGoods->hasOneSale->point) <= 0) {
  32. return $point_data;
  33. }
  34. //todo 如果不等于空,按商品设置赠送积分,否则按统一设置赠送积分
  35. if (isset($orderGoods->hasOneGoods->hasOneSale) && !empty($orderGoods->hasOneGoods->hasOneSale->point)) {
  36. if (strexists($orderGoods->hasOneGoods->hasOneSale->point, '%')) {
  37. $point_data['point'] = floatval(str_replace('%', '', $orderGoods->hasOneGoods->hasOneSale->point) / 100 * static::goodsProfit($point_set, $order, $orderGoods));
  38. } else {
  39. $point_data['point'] = $orderGoods->hasOneGoods->hasOneSale->point * $orderGoods->total;
  40. }
  41. $point_data['remark'] = '购买商品[' . $orderGoods->hasOneGoods->title . '(比例:' . $orderGoods->hasOneGoods->hasOneSale->point . ')]赠送[' . $point_data['point'] . ']积分!';
  42. } else if (!empty($point_set['give_point'] && $point_set['give_point'])) {
  43. if (strexists($point_set['give_point'], '%')) {
  44. $point_data['point'] = floatval(str_replace('%', '', $point_set['give_point']) / 100 * static::goodsProfit($point_set, $order, $orderGoods));
  45. } else {
  46. $point_data['point'] = $point_set['give_point'] * $orderGoods->total;
  47. }
  48. $point_data['remark'] = "购买商品[统一设置(比例:" . $point_set['give_point'] . ")]赠送[{$point_data['point']}]积分!";
  49. }
  50. \Log::debug("个人会员奖励积分kk:", $point_data);
  51. return $point_data;
  52. }
  53. //订单商品利润
  54. private static function goodsProfit($point_set, $order, $orderGoods)
  55. {
  56. if ($point_set['give_type'] == 1) {
  57. if (app('plugins')->isEnabled('store-cashier') && in_array($order->plugin_id, [31, 32])) {
  58. return static::storeProfit($orderGoods);
  59. }
  60. return static::generalProfit($orderGoods);
  61. }
  62. return $orderGoods->payment_amount;
  63. }
  64. //门店收银台订单利润计算
  65. private static function storeProfit($orderGoods)
  66. {
  67. $cashier_good = CashierGoods::select('id', 'goods_id', 'shop_commission')->where('goods_id', $orderGoods->goods_id)->first();
  68. $store_good = StoreGoods::select('id', 'store_id', 'goods_id')->where('goods_id', $orderGoods->goods_id)->first();
  69. if ($cashier_good) {
  70. $profit = proportionMath($orderGoods->payment_amount, $cashier_good->shop_commission);
  71. } elseif ($store_good) {
  72. $store_setting = StoreSetting::where('store_id', $store_good->store_id)->where('key', 'store')->first();
  73. $shop_commission = (integer)$store_setting->value['shop_commission'];
  74. $profit = proportionMath($orderGoods->payment_amount, $shop_commission);
  75. } else {
  76. $profit = 0;
  77. }
  78. return $profit;
  79. }
  80. //普通订单利润计算
  81. private static function generalProfit($orderGoods)
  82. {
  83. $profit = $orderGoods->payment_amount - $orderGoods->goods_cost_price;
  84. return $profit > 0 ? $profit : 0;
  85. }
  86. public static function calculationPointByOrder($order_model)
  87. {
  88. $point_set = Setting::get('point.set');
  89. $point_data = [];
  90. if (isset($point_set['enoughs'])) {
  91. foreach (collect($point_set['enoughs'])->sortBy('enough') as $enough) {
  92. $orderPrice = $order_model->price - $order_model->dispatch_price - $order_model->fee_amount;
  93. if ($orderPrice >= $enough['enough'] && $enough['give'] > 0) {
  94. $point_price = $enough['enough'];
  95. $point_data['point'] = $enough['give'];
  96. $point_data['remark'] = '订单[' . $order_model->order_sn . ']消费满[' . $enough['enough'] . ']元赠送[' . $enough['give'] . ']积分';
  97. if ($point_set['point_award_type'] == 1) {
  98. $point_data['point'] = $orderPrice * $enough['give'] / 100;
  99. $point_data['remark'] = '订单[' . $order_model->order_sn . ']消费满[' . $enough['enough'] . ']元赠送[' . $enough['give'] . '%]积分';
  100. }
  101. }
  102. }
  103. }
  104. if (!empty($point_set['enough_money']) && !empty($point_set['enough_point'])) {
  105. $orderPrice = $order_model->price - $order_model->dispatch_price - $order_model->fee_amount;
  106. if ($orderPrice >= $point_set['enough_money'] && $point_set['enough_point'] > 0 && $point_set['enough_money'] > $point_price) {
  107. $point_data['point'] = $point_set['enough_point'];
  108. $point_data['remark'] = '订单[' . $order_model->order_sn . ']消费满[' . $point_set['enough_money'] . ']元赠送[' . $point_data['point'] . ']积分';
  109. if ($point_set['point_award_type'] == 1) {
  110. $point_data['point'] = $orderPrice * $point_set['enough_point'] / 100;
  111. $point_data['remark'] = '订单[' . $order_model->order_sn . ']消费满[' . $point_set['enough_money'] . ']元赠送[' . $point_data['point'] . '%]积分';
  112. }
  113. }
  114. }
  115. return $point_data;
  116. }
  117. }