RefundService.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace app\frontend\modules\refund\services;
  3. use app\common\exceptions\AppException;
  4. use app\common\models\Order;
  5. use app\common\models\refund\RefundApply;
  6. use app\common\modules\refund\RefundOrderFactory;
  7. /**
  8. * Created by PhpStorm.
  9. * Author: 芸众商城 www.yunzshop.com
  10. * Date: 2017/4/13
  11. * Time: 下午2:21
  12. */
  13. class RefundService
  14. {
  15. static public function refundApplyData(Order $order)
  16. {
  17. if ($order->refund_id) {
  18. throw new AppException('已存在售后申请,处理中');
  19. }
  20. //预约订单限制
  21. if (!is_null(\app\common\modules\shop\ShopConfig::current()->get('store_reserve_refund'))) {
  22. $class = array_get(\app\common\modules\shop\ShopConfig::current()->get('store_reserve_refund'), 'class');
  23. $function = array_get(\app\common\modules\shop\ShopConfig::current()->get('store_reserve_refund'), 'function');
  24. $plugin_res = $class::$function($order->id);
  25. if(!$plugin_res['res']) {
  26. throw new AppException($plugin_res['msg']);
  27. }
  28. }
  29. $refundOrder = RefundOrderFactory::getInstance()->getRefundOrder($order);
  30. $refundOrder->applyBeforeValidate();
  31. //0,92,120
  32. //支持部分退款的订单类型,平台订单,供应商订单,中台供应链
  33. $data['support_batch'] = $refundOrder->multipleRefund();
  34. $data['order'] = $refundOrder->frontendFormatArray();
  35. $refundedPrice = $refundOrder->getAfterSales();
  36. $orderOtherPrice = $refundOrder->getOrderOtherPrice();
  37. $orderFreightPrice = $refundOrder->getOrderFreightPrice();
  38. //这里减去运费和其他费用是因为前端直接拿这个字段当订单金额,但是售后现在把运费分离出来了。
  39. $data['order_goods_price'] = max($data['order']['price'] - $orderFreightPrice - $orderOtherPrice,0);
  40. //可退运费
  41. $data['refundable_freight'] = max(bcsub($orderFreightPrice, $refundedPrice->sum('freight_price'),2),0);
  42. //订单可退其他费用
  43. $data['refundable_other'] = max(bcsub($orderOtherPrice, $refundedPrice->sum('other_price'),2),0);
  44. $data['send_back_way'] = RefundService::getSendBackWay($order);
  45. $data['refundTypes'] = RefundService::getOptionalType($order);
  46. return $data;
  47. }
  48. public static function getOptionalType(Order $order)
  49. {
  50. $refundTypes = [];
  51. if ($order->status >= \app\common\models\Order::WAIT_SEND) {
  52. $refundTypes[] = [
  53. 'name' => '退款(仅退款不退货)',
  54. 'value' => RefundApply::REFUND_TYPE_REFUND_MONEY,
  55. 'desc' => '未收到货或者不用退货只退款',
  56. 'icon' => 'icon-fontclass-daizhifu',
  57. 'reasons' => [
  58. 'not_received' => [
  59. '拍错/多拍/不想要',
  60. '货物破损',
  61. '快递送货问题',
  62. '差价',
  63. '其他原因'
  64. ],
  65. 'received' => [
  66. '货物破损',
  67. '少件、漏发',
  68. '差价',
  69. '商品质量问题',
  70. '其他原因',
  71. ],
  72. ],
  73. ];
  74. }
  75. if ($order->status >= \app\common\models\Order::WAIT_RECEIVE) {
  76. $refundTypes[] = [
  77. 'name' => '退款退货',
  78. 'value' => RefundApply::REFUND_TYPE_RETURN_GOODS,
  79. 'desc' => '已收到货,需要退款退货',
  80. 'icon' => 'icon-fontclass-daishouhuo',
  81. 'reasons' => [
  82. 'not_received' => [],
  83. 'received' => [
  84. '包装或商品破损、少商品',
  85. '质量问题',
  86. '配送问题',
  87. '拍错/多拍/不想要',
  88. '其他原因(可填)',
  89. ]
  90. ],
  91. ];
  92. $refundTypes[] = [
  93. 'name' => '换货',
  94. 'value' => RefundApply::REFUND_TYPE_EXCHANGE_GOODS,
  95. 'desc' => '已收到货,需要更换',
  96. 'icon' => 'icon-fontclass-daifahuo',
  97. 'reasons' => [
  98. 'not_received' => [],
  99. 'received' => [],
  100. ],
  101. ];
  102. }
  103. return $refundTypes;
  104. }
  105. public static function getSendBackWay($order)
  106. {
  107. return RefundBackWayService::getBackWay($order);
  108. }
  109. public static function getSendBackWayData($refundApply)
  110. {
  111. return RefundBackWayService::getBackWayClassData($refundApply);
  112. }
  113. public static function getSendBackWayDetailData($refundApply)
  114. {
  115. return RefundBackWayService::getBackWayDetailData($refundApply);
  116. }
  117. public static function createOrderRN()
  118. {
  119. $refundSN = createNo('RN', true);
  120. while (1) {
  121. if (!RefundApply::where('refund_sn', $refundSN)->first()) {
  122. break;
  123. }
  124. $refundSN = createNo('RN', true);
  125. }
  126. return $refundSN;
  127. }
  128. }