OrderScope.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. //notexists 没成团的订单
  96. /*
  97. SELECT
  98. *
  99. FROM
  100. `shopro_order`
  101. WHERE
  102. (
  103. `user_id` = 11
  104. AND ( `status` IN ( 'paid', 'completed' ) OR ( `pay_mode` = 'offline' AND `status` = 'pending' ) )
  105. AND `apply_refund_status` IN ( 0,- 1 )
  106. AND EXISTS ( SELECT * FROM `shopro_order_item` WHERE ( order_id = shopro_order.id ) AND `dispatch_status` = 0 AND `refund_status` = 0 )
  107. AND NOT EXISTS ( SELECT * FROM `shopro_order_item` WHERE ( order_id = shopro_order.id ) AND `aftersale_status` = 1 AND `dispatch_status` = 0 AND `refund_status` = 0 )
  108. AND NOT EXISTS (
  109. SELECT
  110. *
  111. FROM
  112. `shopro_order` `so`
  113. WHERE
  114. ( so.id = shopro_order.id )
  115. AND `so`.`activity_type` = 'groupon'
  116. AND `so`.`activity_id` <> 0
  117. AND EXISTS ( SELECT * FROM `shopro_activity_groupon` WHERE ( id = so.groupon_id ) AND `status` NOT IN ( 'finish', 'finish_fictitious' ) )
  118. )
  119. )
  120. AND `shopro_order`.`deletetime` IS NULL
  121. ORDER BY
  122. `id` DESC
  123. LIMIT 0,
  124. 10
  125. */
  126. public function scopegroupon_finish($query){
  127. $self_name = (new Order())->getQuery()->getTable();
  128. $groupon_name = (new Groupon())->getQuery()->getTable();
  129. return $query->whereNotExists(function ($query) use ($self_name,$groupon_name) {
  130. $query->table($self_name)->alias('so')->where('so.id=' . $self_name . '.id')->where('so.activity_type','groupon')->where('so.activity_id','NEQ',0)
  131. ->whereExists(function ($query) use ($groupon_name) {
  132. $query->table($groupon_name)->where('id=so.groupon_id')->where('status','NOTIN',['finish','finish_fictitious']);
  133. });
  134. });
  135. }
  136. // 未发货
  137. public function scopeNosend($query)
  138. {
  139. $self_name = (new Order())->getQuery()->getTable();
  140. $item_name = (new OrderItem())->getQuery()->getTable();
  141. $is_express = (request()->action() == 'exportdelivery') ? 1 : 0; // 是否是 express,将只查快递物流的代发货
  142. return $query->noApplyRefund()->whereExists(function ($query) use ($self_name, $item_name, $is_express) {
  143. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  144. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_NOSEND) // 未发货
  145. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  146. if ($is_express) { // 只查快递物流的代发货
  147. $query->where('dispatch_type', 'express');
  148. }
  149. })->whereNotExists(function ($query) use ($self_name, $item_name, $is_express) {
  150. // 不是 正在售后的商品
  151. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  152. ->where('aftersale_status', OrderItem::AFTERSALE_STATUS_ING) // 但是售后中
  153. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_NOSEND) // 未发货
  154. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成;
  155. if ($is_express) { // 只查快递物流的代发货
  156. $query->where('dispatch_type', 'express');
  157. }
  158. });
  159. }
  160. // 待收货
  161. public function scopeNoget($query)
  162. {
  163. return $query->whereExists(function ($query) {
  164. $self_name = (new Order())->getQuery()->getTable();
  165. $item_name = (new OrderItem())->getQuery()->getTable();
  166. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  167. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_SENDED) // 已发货
  168. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  169. });
  170. }
  171. // 已拒收
  172. public function scopeRefuse($query)
  173. {
  174. return $query->whereExists(function ($query) {
  175. $self_name = (new Order())->getQuery()->getTable();
  176. $item_name = (new OrderItem())->getQuery()->getTable();
  177. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  178. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_REFUSE) // 已拒收
  179. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND); // 没有退款完成
  180. });
  181. }
  182. // 待评价
  183. public function scopeNocomment($query)
  184. {
  185. return $query->whereExists(function ($query) {
  186. $self_name = (new Order())->getQuery()->getTable();
  187. $item_name = (new OrderItem())->getQuery()->getTable();
  188. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  189. ->where('dispatch_status', OrderItem::DISPATCH_STATUS_GETED) // 已收货
  190. ->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND) // 没有退款完成
  191. ->where('comment_status', OrderItem::COMMENT_STATUS_NO); // 未评价
  192. });
  193. }
  194. // 售后 (后台要用,虽然有专门的售后单列表)
  195. public function scopeAftersale($query)
  196. {
  197. return $query->whereExists(function ($query) {
  198. $self_name = (new Order())->getQuery()->getTable();
  199. $item_name = (new OrderItem())->getQuery()->getTable();
  200. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  201. ->where('aftersale_status', '<>', OrderItem::AFTERSALE_STATUS_NOAFTER);
  202. });
  203. }
  204. // 退款
  205. public function scopeRefund($query)
  206. {
  207. return $query->whereExists(function ($query) {
  208. $self_name = (new Order())->getQuery()->getTable();
  209. $item_name = (new OrderItem())->getQuery()->getTable();
  210. $query->table($item_name)->where('order_id=' . $self_name . '.id')
  211. ->where('refund_status', '<>', OrderItem::REFUND_STATUS_NOREFUND);
  212. });
  213. }
  214. public function scopeCanAftersale($query)
  215. {
  216. return $query->where('status', 'in', [Order::STATUS_PAID, Order::STATUS_COMPLETED]);
  217. }
  218. public function scopeCanDelete($query)
  219. {
  220. return $query->where('status', 'in', [
  221. Order::STATUS_CANCEL,
  222. Order::STATUS_CLOSED,
  223. Order::STATUS_COMPLETED
  224. ]);
  225. }
  226. }