PointRefund.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace app\common\services\finance;
  3. use app\common\events\order\AfterOrderCanceledEvent;
  4. use app\common\events\order\AfterOrderRefundSuccessEvent;
  5. use app\common\exceptions\ShopException;
  6. use app\common\facades\Setting;
  7. use app\common\models\finance\PointLog;
  8. use app\common\models\Order;
  9. use app\common\models\OrderGoods;
  10. use app\common\models\point\ParentRewardLog;
  11. use app\common\services\finance\PointService;
  12. use app\common\services\point\ParentReward;
  13. use Illuminate\Support\Facades\DB;
  14. /**
  15. * 处理退货时需要扣除赠送的积分
  16. */
  17. class PointRefund
  18. {
  19. /**
  20. * @var Order
  21. */
  22. protected $orderModel;
  23. //退款完成,扣除已退款订单商品赠送积分
  24. public function refundReturn(AfterOrderRefundSuccessEvent $event)
  25. {
  26. if (!Setting::get('point.set.point_refund')) {
  27. \Log::info(self::class . '检测到当前后台积分设置->没有开启积分扣除');
  28. return;
  29. };
  30. $refund = $event->getModel();
  31. $this->orderModel = $event->getOrderModel();
  32. $where = [
  33. 'order_id' => $this->orderModel->id,
  34. 'uniacid' => $this->orderModel->uniacid,
  35. 'member_id' => $this->orderModel->uid,
  36. ];
  37. $order_goods_ids = $refund->refundOrderGoods->pluck('order_goods_id')->all();
  38. //只获得首次退款的订单商品ID
  39. $canRollbackGoodsIds = OrderGoods::whereIn('id', $order_goods_ids)
  40. ->where('is_refund', '<=', OrderGoods::FIRST_REFUND)
  41. ->pluck('id')->toArray();
  42. if ($canRollbackGoodsIds) { //上级赠送积分回退
  43. (new ParentReward())->refund(0, $canRollbackGoodsIds);
  44. }
  45. $where['point_mode'] = PointService::POINT_MODE_GOODS_REFUND;
  46. $hasPointRefund = PointLog::where($where)->whereIn('order_goods_id', $canRollbackGoodsIds)->first();
  47. if ($hasPointRefund) {
  48. \Log::info($refund->id.',当前售后已有退款积分操作, 不再执行积分扣除');
  49. return;
  50. }
  51. $where['point_mode'] = PointService::POINT_MODE_GOODS;
  52. $pointLogs = PointLog::where($where)->whereIn('order_goods_id', $canRollbackGoodsIds)->get();
  53. if ($pointLogs->isEmpty()) {
  54. return;
  55. }
  56. foreach ($pointLogs as $pointLog) {
  57. $point_data = [
  58. 'point_income_type' => PointService::POINT_INCOME_LOSE,
  59. 'point_mode' => PointService::POINT_MODE_GOODS_REFUND,
  60. 'member_id' => $pointLog->member_id,
  61. 'order_id' => $this->orderModel->id,
  62. 'point' => bcsub(0, $pointLog->point, 2),
  63. 'remark' => '订单('.$refund->order->order_sn.')商品退款,退回赠送积分',
  64. ];
  65. $point_service = new PointService($point_data);
  66. $point_service->deductPoint();
  67. }
  68. \Log::info('退款ID' . $refund->id . ' ,赠送的积分扣除成功');
  69. }
  70. public function exec(AfterOrderCanceledEvent $event)
  71. {
  72. if (!Setting::get('point.set.point_refund')) {
  73. \Log::info(self::class . '检测到当前后台积分设置->没有开启积分扣除');
  74. return;
  75. };
  76. $this->orderModel = $event->getOrderModel();
  77. \Log::info( '执行积分扣除');
  78. $this->deductOrder();
  79. $this->deductOrderGoods();
  80. (new ParentReward())->refund($this->orderModel->id);
  81. \Log::info('订单ID' . $this->orderModel->order_sn . ' 退货的积分扣除成功');
  82. }
  83. //先扣除订单赠送的
  84. public function deductOrder()
  85. {
  86. $where = [
  87. 'order_id' => $this->orderModel->id,
  88. 'uniacid' => $this->orderModel->uniacid,
  89. 'member_id' => $this->orderModel->uid,
  90. ];
  91. $hasPointRefund = PointLog::where($where)->where('point_mode',PointService::POINT_MODE_ORDER_REFUND)->first();
  92. if ($hasPointRefund) {
  93. \Log::info(self::class . '当前订单已有退款积分操作, 不再执行积分扣除');
  94. return;
  95. }
  96. $orderPointLogs = PointLog::where($where)->where('point_mode',PointService::POINT_MODE_ORDER)->get();
  97. if ($orderPointLogs->isNotEmpty()) {
  98. $orderPointLogs->each(function ($point_log) {
  99. $point_data = [
  100. 'point_income_type' => PointService::POINT_INCOME_LOSE,
  101. 'point_mode' => PointService::POINT_MODE_ORDER_REFUND,
  102. 'order_id' => $this->orderModel->id,
  103. 'member_id' => $point_log->member_id,
  104. 'point' => bcsub(0, $point_log->point, 2),
  105. 'remark' => '订单[' . $this->orderModel->order_sn . '关闭,退回订单赠送积分',
  106. ];
  107. $point_service = new PointService($point_data);
  108. $point_service->deductPoint();
  109. });
  110. }
  111. }
  112. //扣除商品赠送的积分
  113. public function deductOrderGoods()
  114. {
  115. $where = [
  116. 'order_id' => $this->orderModel->id,
  117. 'uniacid' => $this->orderModel->uniacid,
  118. 'member_id' => $this->orderModel->uid,
  119. ];
  120. $orderPointLogs = PointLog::where($where)->where('point_mode',PointService::POINT_MODE_GOODS)->get();
  121. if ($orderPointLogs->isNotEmpty()) {
  122. foreach ($orderPointLogs as $pointLogs) {
  123. //已退款商品订单关闭不需要扣除,退款完成监听会扣除
  124. if ($pointLogs->order_goods_id) {
  125. $orderGoods = $this->orderModel->orderGoods->where('id',$pointLogs->order_goods_id)->first();
  126. if ($orderGoods && $orderGoods->isRefund()) {
  127. continue;
  128. }
  129. }
  130. $point_data = [
  131. 'point_income_type' => PointService::POINT_INCOME_LOSE,
  132. 'point_mode' => PointService::POINT_MODE_GOODS_REFUND,
  133. 'order_id' => $this->orderModel->id,
  134. 'member_id' => $pointLogs->member_id,
  135. 'point' => bcsub(0, $pointLogs->point, 2),
  136. 'remark' => '订单('.$this->orderModel->order_sn.')关闭,退回商品赠送积分',
  137. ];
  138. $point_service = new PointService($point_data);
  139. $point_service->deductPoint();
  140. }
  141. }
  142. }
  143. protected function getPointMode($point_mode)
  144. {
  145. if ($point_mode == 1) {
  146. return PointService::POINT_MODE_GOODS_REFUND;
  147. }
  148. return PointService::POINT_MODE_ORDER_REFUND;
  149. }
  150. protected function getRemark($point_mode)
  151. {
  152. if ($point_mode == 1) {
  153. return '商品退货退回赠送积分';
  154. }
  155. return '订单[' . $this->orderModel->order_sn . ']退货退回赠送积分';
  156. }
  157. }