Order.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: yunzhong
  5. * Date: 2018/10/4
  6. * Time: 15:28
  7. */
  8. namespace app\backend\modules\charts\models;
  9. use app\common\models\MemberShopInfo;
  10. use app\common\models\order\OrderPluginBonus;
  11. use Illuminate\Support\Facades\DB;
  12. use Yunshop\StoreCashier\common\models\CashierOrder;
  13. use Yunshop\StoreCashier\common\models\StoreOrder;
  14. use Yunshop\Supplier\common\models\SupplierOrder;
  15. class Order extends \app\common\models\Order
  16. {
  17. //订单导出订单数据
  18. public static function getExportOrders($search)
  19. {
  20. $builder = Order::exportOrders($search);
  21. $orders = $builder->get()->toArray();
  22. return $orders;
  23. }
  24. public function scopeExportOrders($query, $search)
  25. {
  26. $order_builder = $query->search($search);
  27. $orders = $order_builder->with([
  28. 'belongsToMember' => self::memberBuilder(),
  29. 'hasManyOrderGoods' => self::orderGoodsBuilder(),
  30. 'hasOneDispatchType',
  31. 'address',
  32. 'hasOneOrderRemark',
  33. 'express',
  34. 'hasOnePayType',
  35. 'hasOneOrderPay'
  36. ]);
  37. return $orders;
  38. }
  39. public function belongsToRecommender()
  40. {
  41. return $this->belongsTo(MemberShopInfo::class, 'uid', 'member_id');
  42. }
  43. public function scopeOrders($order_builder, $search)
  44. {
  45. $order_builder->search($search);
  46. $order_builder->where('status','>',0);
  47. $orders = $order_builder->with([
  48. 'belongsToMember' => function ($query) {
  49. $query->select(['uid', 'mobile', 'nickname', 'realname','avatar']);
  50. },
  51. 'hasOneOrderGoods' => function ($query) {
  52. $query->select(DB::raw('sum(goods_cost_price) as total_cost_price'),'order_id')->groupBy('order_id');
  53. // $query->whereRaw('sum(goods_cost_price) as total_cost_price')->groupBy('order_id');
  54. },
  55. 'hasOneDispatchType',
  56. 'belongsToRecommender' => function ($query) {
  57. },
  58. 'hasOnePayType',
  59. 'address',
  60. 'express',
  61. 'hasOneRefundApply' => self::refundBuilder(),
  62. 'hasOneOrderRemark',
  63. // 'hasOneOrderPay'=> function (Builder $query) {
  64. // $query->orderPay();
  65. // },
  66. ]);
  67. return $orders;
  68. }
  69. private static function refundBuilder()
  70. {
  71. return function ($query) {
  72. return $query->with('returnExpress')->with('resendExpress');
  73. };
  74. }
  75. private static function memberBuilder()
  76. {
  77. return function ($query) {
  78. return $query->select(['uid', 'mobile', 'nickname', 'realname','avatar']);
  79. };
  80. }
  81. private static function orderGoodsBuilder()
  82. {
  83. return function ($query) {
  84. $query->orderGoods();
  85. };
  86. }
  87. public function scopeSearch($order_builder, $params)
  88. {
  89. if (array_get($params, 'ambiguous.field', '') && array_get($params, 'ambiguous.string', '')) {
  90. //订单.支付单号
  91. if ($params['ambiguous']['field'] == 'order') {
  92. call_user_func(function () use (&$order_builder, $params) {
  93. list($field, $value) = explode(':', $params['ambiguous']['string']);
  94. if (isset($value)) {
  95. return $order_builder->where($field, $value);
  96. } else {
  97. return $order_builder->where(function ($query)use ($params){
  98. $query->searchLike($params['ambiguous']['string']);
  99. $query->orWhereHas('hasOneOrderPay', function ($query) use ($params) {
  100. $query->where('pay_sn','like',"%{$params['ambiguous']['string']}%");
  101. });
  102. });
  103. }
  104. });
  105. }
  106. //用户
  107. if ($params['ambiguous']['field'] == 'member') {
  108. call_user_func(function () use (&$order_builder, $params) {
  109. list($field, $value) = explode(':', $params['ambiguous']['string']);
  110. if (isset($value)) {
  111. return $order_builder->where($field, $value);
  112. } else {
  113. return $order_builder->whereHas('belongsToMember', function ($query) use ($params) {
  114. return $query->searchLike($params['ambiguous']['string']);
  115. });
  116. }
  117. });
  118. }
  119. //订单商品
  120. if ($params['ambiguous']['field'] == 'order_goods') {
  121. $order_builder->whereHas('hasManyOrderGoods', function ($query) use ($params) {
  122. $query->searchLike($params['ambiguous']['string']);
  123. });
  124. }
  125. //快递单号
  126. if ($params['ambiguous']['field'] == 'dispatch') {
  127. $order_builder->whereHas('express', function ($query) use ($params) {
  128. $query->searchLike($params['ambiguous']['string']);
  129. });
  130. }
  131. }
  132. //支付方式
  133. if (array_get($params, 'pay_type', '')) {
  134. $order_builder->where('pay_type_id', $params['pay_type']);
  135. }
  136. //操作时间范围
  137. if (array_get($params, 'time_range.field', '') && array_get($params, 'time_range.start', 0) && array_get($params, 'time_range.end', 0)) {
  138. $range = [strtotime($params['time_range']['start']), strtotime($params['time_range']['end'])];
  139. $order_builder->whereBetween($params['time_range']['field'], $range);
  140. }
  141. return $order_builder;
  142. }
  143. public static function getOrderDetailById($order_id)
  144. {
  145. return self::orders()->with(['deductions','coupons','discounts','orderPays'=> function ($query) {
  146. $query->with('payType');
  147. },'hasOnePayType'])->find($order_id);
  148. }
  149. public static function boot()
  150. {
  151. parent::boot();
  152. // static::addGlobalScope(function (Builder $builder) {
  153. // $builder->isPlugin();
  154. // });
  155. }
  156. public function hasManyOrderGoods()
  157. {
  158. return $this->hasMany(OrderGoods::class, 'order_id', 'id');
  159. }
  160. public function hasManyCashierOrder()
  161. {
  162. return $this->hasMany(CashierOrder::class,'order_id','id');
  163. }
  164. public function hasManyStoreOrder()
  165. {
  166. return $this->hasMany(StoreOrder::class,'order_id','id');
  167. }
  168. public function hasManySupplierOrder()
  169. {
  170. return $this->hasMany(SupplierOrder::class,'order_id','id');
  171. }
  172. public function hasManyOrderPluginBonus()
  173. {
  174. return $this->hasMany(OrderPluginBonus::class, 'order_id', 'id');
  175. }
  176. }