OrderRefund.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. namespace app\shop\model\order;
  3. use app\common\model\order\OrderRefund as OrderRefundModel;
  4. use app\shop\model\user\User as UserModel;
  5. use app\common\service\order\OrderRefundService;
  6. use app\common\service\message\MessageService;
  7. /**
  8. * 售后管理模型
  9. */
  10. class OrderRefund extends OrderRefundModel
  11. {
  12. /**
  13. * 获取售后单列表
  14. */
  15. public function getList($query = [])
  16. {
  17. $model = $this;
  18. // 查询条件:订单号
  19. if (isset($query['order_no']) && !empty($query['order_no'])) {
  20. $model = $model->where('order.order_no', 'like', "%{$query['order_no']}%");
  21. }
  22. // 查询条件:起始日期
  23. if (isset($query['create_time']) && !empty($query['create_time'])) {
  24. $sta_time = array_shift($query['create_time']);
  25. $end_time = array_pop($query['create_time']);
  26. $model = $model->whereBetweenTime('m.create_time', $sta_time, $end_time);
  27. }
  28. // 售后类型
  29. if (isset($query['type']) && $query['type'] > 0) {
  30. $model = $model->where('m.type', '=', $query['type']);
  31. }
  32. // 售后单状态(选项卡)
  33. if (isset($query['status']) && $query['status'] >= 0) {
  34. $model = $model->where('m.status', '=', $query['status']);
  35. }
  36. // 获取列表数据
  37. return $model->alias('m')
  38. ->field('m.*, order.order_no')
  39. ->with(['orderproduct.image', 'orderMaster', 'user'])
  40. ->join('order', 'order.order_id = m.order_id')
  41. ->order(['m.create_time' => 'desc'])
  42. ->paginate($query);
  43. }
  44. public function groupCount($query)
  45. {
  46. $model = $this;
  47. // 查询条件:订单号
  48. if (isset($query['order_no']) && !empty($query['order_no'])) {
  49. $model = $model->where('order.order_no', 'like', "%{$query['order_no']}%");
  50. }
  51. // 查询条件:起始日期
  52. if (isset($query['create_time']) && !empty($query['create_time'])) {
  53. $sta_time = array_shift($query['create_time']);
  54. $end_time = array_pop($query['create_time']);
  55. $model = $model->whereBetweenTime('m.create_time', $sta_time, $end_time);
  56. }
  57. // 售后类型
  58. if (isset($query['type']) && $query['type'] > 0) {
  59. $model = $model->where('m.type', '=', $query['type']);
  60. }
  61. // 获取列表数据
  62. return $model->alias('m')
  63. ->field('m.status,COUNT(*) as total')
  64. ->join('order', 'order.order_id = m.order_id')
  65. ->group('m.status')->select()->toArray();
  66. }
  67. /**
  68. * 商家审核
  69. */
  70. public function audit($data)
  71. {
  72. if ($data['is_agree'] == 20 && empty($data['refuse_desc'])) {
  73. $this->error = '请输入拒绝原因';
  74. return false;
  75. }
  76. if ($data['is_agree'] == 10 && $this['type']['value'] != 30 && empty($data['address_id'])) {
  77. $this->error = '请选择退货地址';
  78. return false;
  79. }
  80. $this->startTrans();
  81. try {
  82. // 拒绝申请, 标记售后单状态为已拒绝
  83. $data['is_agree'] == 20 && $data['status'] = 10;
  84. // 同意换货申请, 标记售后单状态为已完成
  85. // $data['is_agree'] == 10 && $this['type']['value'] == 20 && $data['status'] = 20;
  86. // 更新退款单状态
  87. $this->save($data);
  88. // 同意售后申请, 记录退货地址
  89. if ($data['is_agree'] == 10 && $this['type']['value'] != 30) {
  90. $model = new OrderRefundAddress();
  91. $model->add($this['order_refund_id'], $data['address_id']);
  92. }
  93. // 订单详情
  94. $order = Order::detail($this['order_id']);
  95. // 发送模板消息
  96. (new MessageService)->refund(self::detail($this['order_refund_id']), $order['order_no'], 'audit');
  97. // 如果是仅退款
  98. if ($data['is_agree'] == 10 && $this['type']['value'] == 30) {
  99. if ($data['refund_money'] > $order['pay_price']) {
  100. $this->error = '退款金额不能大于商品实付款金额';
  101. return false;
  102. }
  103. $this->refundMoney($order, $data);
  104. }
  105. // 事务提交
  106. $this->commit();
  107. return true;
  108. } catch (\Exception $e) {
  109. $this->error = $e->getMessage();
  110. $this->rollback();
  111. return false;
  112. }
  113. }
  114. /**
  115. * 确认收货并退款
  116. */
  117. public function receipt($data)
  118. {
  119. // 订单详情
  120. $order = Order::detail($this['order_id']);
  121. if ($data['refund_money'] > $order['pay_price']) {
  122. $this->error = '退款金额不能大于商品实付款金额';
  123. return false;
  124. }
  125. $this->transaction(function () use ($order, $data) {
  126. $this->refundMoney($order, $data);
  127. });
  128. return true;
  129. }
  130. private function refundMoney($order, $data)
  131. {
  132. $update = [
  133. 'is_receipt' => 1,
  134. 'status' => 20
  135. ];
  136. if ($this['type']['value'] == 20) {
  137. $update['send_express_id'] = $data['send_express_id'];
  138. $update['send_express_no'] = $data['send_express_no'];
  139. $update['deliver_time'] = time();
  140. $update['is_plate_send'] = 1;
  141. }
  142. $data['refund_money'] > 0 && $update['refund_money'] = $data['refund_money'];
  143. // 更新售后单状态
  144. $this->save($update);
  145. // 消减用户的实际消费金额
  146. // 条件:判断订单是否已结算
  147. if ($order['is_settled'] == true) {
  148. (new UserModel)->setDecUserExpend($order['user_id'], $data['refund_money']);
  149. }
  150. // 执行原路退款
  151. $data['refund_money'] > 0 && (new OrderRefundService)->execute($order, $data['refund_money']);
  152. // 发送模板消息
  153. (new MessageService)->refund(self::detail($this['order_refund_id']), $order['order_no'], 'receipt');
  154. }
  155. /**
  156. * 统计售后订单
  157. */
  158. public function getRefundOrderTotal()
  159. {
  160. $filter['is_agree'] = 0;
  161. return $this->where($filter)->count();
  162. }
  163. /**
  164. * 获取退款订单总数 (可指定某天)
  165. * 已同意的退款
  166. */
  167. public function getOrderRefundData($startDate, $endDate, $type)
  168. {
  169. $model = $this;
  170. $model = $model->where('create_time', '>=', strtotime($startDate));
  171. if (is_null($endDate)) {
  172. $model = $model->where('create_time', '<', strtotime($startDate) + 86400);
  173. } else {
  174. $model = $model->where('create_time', '<', strtotime($endDate) + 86400);
  175. }
  176. $model = $model->where('is_agree', '=', 10);
  177. if ($type == 'order_refund_money') {
  178. // 退款金额
  179. return $model->sum('refund_money');
  180. } else if ($type == 'order_refund_total') {
  181. // 退款数量
  182. return $model->count();
  183. }
  184. return 0;
  185. }
  186. }