OrderScope.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. namespace app\admin\model\shopro\order\traits;
  3. use app\admin\model\shopro\order\Order;
  4. use app\admin\model\shopro\order\OrderItem;
  5. use app\admin\model\shopro\activity\Groupon;
  6. trait OrderScope
  7. {
  8. // 已关闭
  9. public function scopeClosed($query)
  10. {
  11. return $query->where('status', Order::STATUS_CLOSED);
  12. }
  13. // 已取消
  14. public function scopeCancel($query)
  15. {
  16. return $query->where('status', Order::STATUS_CANCEL);
  17. }
  18. // 未支付
  19. public function scopeUnpaid($query)
  20. {
  21. return $query->where('status', Order::STATUS_UNPAID);
  22. }
  23. // 可以取消,未支付&货到付款未发货的订单
  24. public function scopeCanCancel($query)
  25. {
  26. return $query->where(function ($query) {
  27. $query->where('status', Order::STATUS_UNPAID)->whereOr(function ($query) {
  28. $self_name = (new Order())->getQuery()->getTable();
  29. $item_name = (new OrderItem())->getQuery()->getTable();
  30. $query->where('pay_mode', 'offline')->where('status', Order::STATUS_PENDING)->whereExists(function ($query) use ($self_name, $item_name) {
  31. // 货到付款订单,未发货未退款,可以申请售后
  32. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  33. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_NOSEND) // 未发货
  34. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成;
  35. });
  36. });
  37. });
  38. }
  39. // 已支付
  40. public function scopePaid($query)
  41. {
  42. return $query->whereIn('status', [Order::STATUS_PAID, Order::STATUS_COMPLETED]);
  43. }
  44. // 线下支付(货到付款) pending 时
  45. public function scopeOffline($query)
  46. {
  47. return $query->where('pay_mode', 'offline')->where('status', Order::STATUS_PENDING);
  48. }
  49. /**
  50. * 是否线下支付(货到付款),暂未付款
  51. *
  52. * @param object|array $order
  53. * @return boolean
  54. */
  55. public function isOffline($order)
  56. {
  57. return ($order['status'] == Order::STATUS_PENDING && $order['pay_mode'] == 'offline') ? true : false;
  58. }
  59. // 已支付的,或者是线下付款的未支付订单,后续可以,发货,收货,评价
  60. public function scopePretendPaid($query)
  61. {
  62. return $query->where(function ($query) {
  63. $query->whereIn('status', [Order::STATUS_PAID, Order::STATUS_COMPLETED])->whereOr(function($query) {
  64. $query->where('pay_mode', 'offline')->where('status', Order::STATUS_PENDING);
  65. });
  66. });
  67. }
  68. // 已完成
  69. public function scopeCompleted($query)
  70. {
  71. return $query->where('status', Order::STATUS_COMPLETED);
  72. }
  73. // 未申请全额退款,或者已拒绝
  74. public function scopeNoApplyRefund($query)
  75. {
  76. return $query->whereIn('apply_refund_status', [
  77. Order::APPLY_REFUND_STATUS_NOAPPLY,
  78. Order::APPLY_REFUND_STATUS_REFUSE
  79. ]);
  80. }
  81. // 申请全额退款中
  82. public function scopeApplyRefundIng($query)
  83. {
  84. return $query->where('apply_refund_status', Order::APPLY_REFUND_STATUS_APPLY);
  85. }
  86. //拼团待分享
  87. public function scopegroupon_ing($query){
  88. $self_name = (new Order())->getQuery()->getTable();
  89. $groupon_name = (new Groupon())->getQuery()->getTable();
  90. return $query->where('activity_type','groupon')->where('activity_id','NEQ',0)->whereExists(function ($query) use ($self_name,$groupon_name) {
  91. $query->table($groupon_name)->where('id=' . $self_name . '.groupon_id')->where('status','ing');
  92. }
  93. );
  94. }
  95. // 未发货
  96. public function scopeNosend($query)
  97. {
  98. $self_name = (new Order())->getQuery()->getTable();
  99. $item_name = (new OrderItem())->getQuery()->getTable();
  100. $is_express = (request()->action() == 'exportdelivery') ? 1 : 0; // 是否是 express,将只查快递物流的代发货
  101. return $query->noApplyRefund()->whereExists(function ($query) use ($self_name, $item_name, $is_express) {
  102. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  103. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_NOSEND) // 未发货
  104. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  105. if ($is_express) { // 只查快递物流的代发货
  106. $query->where('dispatch_type', 'express');
  107. }
  108. })->whereNotExists(function ($query) use ($self_name, $item_name, $is_express) {
  109. // 不是 正在售后的商品
  110. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  111. ->where('aftersale_status', OrderItem::AFTERSALE_STATUS_ING) // 但是售后中
  112. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_NOSEND) // 未发货
  113. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成;
  114. if ($is_express) { // 只查快递物流的代发货
  115. $query->where('dispatch_type', 'express');
  116. }
  117. });
  118. }
  119. // 待收货
  120. public function scopeNoget($query)
  121. {
  122. return $query->whereExists(function ($query) {
  123. $self_name = (new Order())->getQuery()->getTable();
  124. $item_name = (new OrderItem())->getQuery()->getTable();
  125. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  126. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_SENDED) // 已发货
  127. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  128. });
  129. }
  130. // 已拒收
  131. public function scopeRefuse($query)
  132. {
  133. return $query->whereExists(function ($query) {
  134. $self_name = (new Order())->getQuery()->getTable();
  135. $item_name = (new OrderItem())->getQuery()->getTable();
  136. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  137. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_REFUSE) // 已拒收
  138. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  139. });
  140. }
  141. // 待评价
  142. public function scopeNocomment($query)
  143. {
  144. return $query->whereExists(function ($query) {
  145. $self_name = (new Order())->getQuery()->getTable();
  146. $item_name = (new OrderItem())->getQuery()->getTable();
  147. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  148. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_GETED) // 已收货
  149. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND) // 没有退款完成
  150. ->where('comment_status', OrderItem::COMMENT_STATUS_NO); // 未评价
  151. });
  152. }
  153. // 售后 (后台要用,虽然有专门的售后单列表)
  154. public function scopeAftersale($query)
  155. {
  156. return $query->whereExists(function ($query) {
  157. $self_name = (new Order())->getQuery()->getTable();
  158. $item_name = (new OrderItem())->getQuery()->getTable();
  159. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  160. ->where('aftersale_status', '<>', OrderItem::AFTERSALE_STATUS_NOAFTER);
  161. });
  162. }
  163. // 退款
  164. public function scopeRefund($query)
  165. {
  166. return $query->whereExists(function ($query) {
  167. $self_name = (new Order())->getQuery()->getTable();
  168. $item_name = (new OrderItem())->getQuery()->getTable();
  169. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  170. ->where('refund_status', '<>', OrderItem::REFUND_STATUS_NOREFUND);
  171. });
  172. }
  173. public function scopeCanAftersale($query)
  174. {
  175. return $query->where('status', 'in', [Order::STATUS_PAID, Order::STATUS_COMPLETED]);
  176. }
  177. public function scopeCanDelete($query)
  178. {
  179. return $query->where('status', 'in', [
  180. Order::STATUS_CANCEL,
  181. Order::STATUS_CLOSED,
  182. Order::STATUS_COMPLETED
  183. ]);
  184. }
  185. }