CashierOrderRefund.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\cashier\model\order;
  11. use addon\memberrecharge\model\RechargeOrder;
  12. use addon\o2o\model\member\MemberOnceCard;
  13. use addon\o2o\model\store\Store;
  14. use app\model\BaseModel;
  15. use app\model\member\MemberLevelOrder;
  16. use app\model\order\OrderCommon;
  17. use app\model\order\OrderLog;
  18. use app\model\order\OrderRefund;
  19. use app\model\site\Site;
  20. /**
  21. * 收银订单
  22. *
  23. * @author Administrator
  24. *
  25. */
  26. class CashierOrderRefund extends BaseModel
  27. {
  28. public function getRefundApplyData($params)
  29. {
  30. $store_id = $params[ 'store_id' ];
  31. $site_id = $params[ 'site_id' ];
  32. $order_id = $params[ 'order_id' ];
  33. $order_refund_model = new OrderRefund();
  34. $refund_array = empty($params[ 'refund_array' ]) ? [] : json_decode($params[ 'refund_array' ], true);
  35. if (empty($refund_array))
  36. return $this->error([], '请选择要退款的订单项!');
  37. $refund_list = [];
  38. foreach ($refund_array as $k => $refund_v) {
  39. $item = $order_refund_model->getOrderGoodsRefundInfo($refund_v, $site_id, $store_id)[ 'data' ] ?? [];
  40. if (!empty($item)) {
  41. $order_info = $item[ 'order_info' ];
  42. $refund_list[] = $item;
  43. }
  44. }
  45. if (empty($refund_list))
  46. return $this->error([], '请选择要退款的订单项');
  47. $refund_data = [];
  48. $refund_transfer_type = $this->getRefundTransferType($order_info);
  49. $refund_data[ 'refund_transfer_type' ] = $refund_transfer_type;
  50. $refund_data[ 'refund_list' ] = $refund_list;
  51. return $this->success($refund_data);
  52. }
  53. /**
  54. * 退款转账方式
  55. * @param int $online_money 1 原路退款 2 线下退款 3退款到余额
  56. * @return array
  57. */
  58. public function getRefundTransferType($params = [])
  59. {
  60. $pay_type = $params[ 'pay_type' ] ?? '';
  61. $pay_money = $params[ 'pay_money' ] ?? 0;
  62. $list = array (
  63. '4' => [ 'name' => '现金退款', 'desc' => '与客户协商一致, 以现金的形式退款给客户' ],
  64. '2' => [ 'name' => '线下退款', 'desc' => '与客户协商一致, 在线下以支付宝或微信等形式退款给客户' ],
  65. );
  66. // if (in_array($pay_type, ['wechatpay', 'alipay']) && $pay_money > 0) {
  67. $list[ '1' ] = [ 'name' => '原路退款', 'desc' => '与客户协商一致,原路退款给客户' ];
  68. // }
  69. return $list;
  70. }
  71. public function refund($params)
  72. {
  73. //判断是不是退全部
  74. $order_id = $params[ 'order_id' ];
  75. $store_id = $params[ 'store_id' ];
  76. $site_id = $params[ 'site_id' ];
  77. $refund_transfer_type = $params[ 'refund_transfer_type' ];
  78. $refund_array = $params[ 'refund_array' ];
  79. $refund_remark = $params[ 'refund_remark' ];
  80. $order_common_model = new OrderCommon();
  81. $order_goods_ids = [];
  82. $order_condition = array (
  83. [ 'order_id', '=', $order_id ],
  84. [ 'store_id', '=', $store_id ]
  85. );
  86. $order_info = $order_common_model->getOrderInfo($order_condition)[ 'data' ] ?? [];
  87. if (empty($order_info))
  88. return $this->error();
  89. //已经退款的金额
  90. $order_money = $order_info[ 'order_money' ];
  91. $now_refund_money = $order_info[ 'refund_money' ];
  92. $operator = $params[ 'operator' ] ?? [];
  93. $surplus_money = $order_money - $now_refund_money;
  94. model('order_goods')->startTrans();
  95. try {
  96. $order_refund_model = new OrderRefund();
  97. foreach ($refund_array as $k => $v) {
  98. $order_goods_info = $order_common_model->getOrderGoodsInfo([ [ 'order_goods_id', '=', $k ] ])[ 'data' ] ?? [];
  99. $order_goods_ids[] = $k;
  100. //计算当前订单能退的金额(金额既不能大于剩余可退, 也不能大于当前订单项最多能退)
  101. $item_refund_money = $v[ 'refund_money' ];
  102. $goods_money = $order_goods_info[ 'real_goods_money' ];
  103. // $item_rate = $goods_money/$order_money;
  104. if ($item_refund_money > $goods_money) {
  105. $item_refund_money = $goods_money;
  106. }
  107. if ($item_refund_money > $surplus_money) {
  108. $item_refund_money = $surplus_money;
  109. }
  110. $data = array (
  111. 'order_goods_id' => $k,
  112. 'refund_money_type' => $refund_transfer_type,
  113. 'shop_refund_remark' => $refund_remark,
  114. 'shop_active_refund' => 1,
  115. 'do_refund_money' => $item_refund_money
  116. );
  117. $log_data = [
  118. 'uid' => $operator[ 'uid' ] ?? 0,
  119. 'nick_name' => $operator[ 'username' ] ?? '',
  120. 'action' => '门店员工【'.$operator[ 'username' ].'】对订单进行了主动退款',
  121. 'action_way' => 2
  122. ];
  123. $result = $order_refund_model->orderRefundFinish($data, $operator, $log_data);
  124. if ($result[ 'code' ] < 0) {
  125. model('order_goods')->rollback();
  126. return $result;
  127. }
  128. $surplus_money -= $item_refund_money;
  129. }
  130. model('order_goods')->commit();
  131. return $this->success();
  132. } catch (\Exception $e) {
  133. model('order_goods')->rollback();
  134. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  135. }
  136. }
  137. }