Order.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/7
  6. * Time: 下午2:59
  7. */
  8. namespace app\backend\modules\order\models;
  9. use app\backend\modules\member\models\MemberParent;
  10. use app\backend\modules\order\services\OrderService;
  11. use app\common\models\ExpeditingDelivery;
  12. use app\common\models\Member;
  13. use app\common\models\order\FirstOrder;
  14. use app\common\models\order\OrderDeliver;
  15. use Illuminate\Database\Eloquent\Builder;
  16. use \Illuminate\Support\Facades\DB;
  17. use app\common\models\PayTypeGroup;
  18. use app\common\models\MemberCertified;
  19. use Yunshop\PackageDelivery\models\DeliveryOrder;
  20. use Yunshop\StoreCashier\common\models\SelfDelivery;
  21. use Yunshop\StoreCashier\common\models\StoreDelivery;
  22. /**
  23. * Class Order
  24. * @package app\backend\modules\order\models
  25. * @method static self exportOrders($search)
  26. * @method static self search($search)
  27. */
  28. class Order extends \app\common\models\Order
  29. {
  30. protected $appends = ['status_name', 'pay_type_name'];
  31. //订单导出订单数据
  32. public static function getExportOrders($search)
  33. {
  34. $builder = Order::exportOrders($search);
  35. $orders = $builder->get()->toArray();
  36. return $orders;
  37. }
  38. public function hasManyOrderGoods()
  39. {
  40. return $this->hasMany(OrderGoods::class, 'order_id', 'id');
  41. }
  42. public function hasManyFirstOrder()
  43. {
  44. return $this->hasMany(FirstOrder::class, 'order_id', 'id');
  45. }
  46. public function hasManyMemberCertified(){
  47. return $this->hasOne(MemberCertified::class,'order_id','id')->orderBy('updated_at','desc');
  48. }
  49. public function orderDeliver()
  50. {
  51. return $this->hasOne(OrderDeliver::class, 'order_id', 'id');
  52. }
  53. public function deliveryOrder()
  54. {
  55. return $this->hasOne(DeliveryOrder::class, 'order_id', 'id');
  56. }
  57. public function selfDelivery()
  58. {
  59. return $this->hasOne(SelfDelivery::class, 'order_id', 'id');
  60. }
  61. public function StoreDelivery()
  62. {
  63. return $this->hasOne(StoreDelivery::class, 'order_id', 'id');
  64. }
  65. public function scopeExportOrders(Order $query, $search)
  66. {
  67. if ($search['first_order']) {
  68. $query->whereHas('hasManyFirstOrder');
  69. }
  70. $order_builder = $query->search($search);
  71. $orders = $order_builder->with([
  72. 'belongsToMember' => self::memberBuilder(),
  73. 'hasManyOrderGoods' => self::orderGoodsBuilder(),
  74. 'hasOneDispatchType',
  75. 'address',
  76. 'hasOneOrderRemark',
  77. 'express',
  78. 'hasOnePayType',
  79. 'hasOneOrderPay',
  80. 'hasManyFirstOrder',
  81. 'hasManyMemberCertified'
  82. ]);
  83. return $orders;
  84. }
  85. public function scopeOrders(Builder $order_builder, $search = [])
  86. {
  87. if ($search['first_order']) {
  88. $order_builder->whereHas('hasManyFirstOrder');
  89. }
  90. $order_builder->search($search);
  91. $orders = $order_builder->with([
  92. 'belongsToMember' => self::memberBuilder(),
  93. 'hasManyOrderGoods' => self::orderGoodsBuilder(),
  94. 'hasOneDispatchType',
  95. 'hasOnePayType',
  96. 'address',
  97. 'express',
  98. 'process',
  99. 'hasOneRefundApply' => self::refundBuilder(),
  100. 'hasOneOrderRemark',
  101. 'hasOneOrderPay'=> function ($query) {
  102. $query->orderPay();
  103. },
  104. 'hasManyFirstOrder',
  105. 'orderDeliver',
  106. 'hasManyMemberCertified'
  107. ]);
  108. return $orders;
  109. }
  110. private static function refundBuilder()
  111. {
  112. return function ($query) {
  113. return $query->with('returnExpress')->with('resendExpress');
  114. };
  115. }
  116. private static function memberBuilder()
  117. {
  118. return function ($query) {
  119. return $query->select(['uid', 'mobile', 'nickname', 'realname','avatar','idcard']);
  120. };
  121. }
  122. private static function orderGoodsBuilder()
  123. {
  124. return function ($query) {
  125. $query->orderGoods();
  126. };
  127. }
  128. public function scopeSearch($order_builder, $params)
  129. {
  130. // print_r($params['ambiguous']['field']);exit;
  131. if (array_get($params, 'ambiguous.field', '') && array_get($params, 'ambiguous.string', '')) {
  132. //订单.支付单号
  133. if ($params['ambiguous']['field'] == 'order') {
  134. call_user_func(function () use (&$order_builder, $params) {
  135. list($field, $value) = explode(':', $params['ambiguous']['string']);
  136. if (isset($value)) {
  137. return $order_builder->where($field, $value);
  138. } else {
  139. // return $order_builder->addSelect('yz_order.*')->leftjoin('yz_order_pay', 'yz_order_pay.id', '=', 'yz_order.order_pay_id')->where(function ($query) use ($params) {
  140. // $query->orWhere('yz_order.order_sn', 'like', "%{$params['ambiguous']['string']}%")
  141. // ->orWhere('yz_order_pay.pay_sn', 'like', "%{$params['ambiguous']['string']}%");
  142. // });
  143. if (strpos($params['ambiguous']['string'],'PN') === 0) {
  144. return $order_builder->addSelect('yz_order.*')->leftjoin('yz_order_pay', 'yz_order_pay.id', '=', 'yz_order.order_pay_id')
  145. ->where('yz_order_pay.pay_sn', $params['ambiguous']['string']);
  146. } else {
  147. return $order_builder->addSelect('yz_order.*')->where('yz_order.order_sn', $params['ambiguous']['string']);
  148. }
  149. }
  150. });
  151. }
  152. //用户
  153. if ($params['ambiguous']['field'] == 'member') {
  154. call_user_func(function () use (&$order_builder, $params) {
  155. list($field, $value) = explode(':', $params['ambiguous']['string']);
  156. if (isset($value)) {
  157. return $order_builder->where($field, $value);
  158. } else {
  159. //todo wherein这个可能有个数限制,用连表模糊匹配查询又用不了索引,导致有数据多的客户老是查询超时,先优化成这个样子,少用全表扫描的查询!
  160. $memberIds = Member::uniacid()
  161. ->whereRaw('LOCATE(?, realname)', [$params['ambiguous']['string']])
  162. ->orWhereRaw('LOCATE(?, mobile)', [$params['ambiguous']['string']])
  163. ->orWhereRaw('LOCATE(?, nickname)', [$params['ambiguous']['string']])
  164. ->pluck('uid')->all();
  165. return $order_builder->whereIn('uid',($memberIds?:[0]));
  166. // return $order_builder->join('mc_members', function ($join) use ($params) {
  167. // $join->on('mc_members.uid', '=', 'yz_order.uid')->where(function ($where) use ($params) {
  168. // return $where->whereRaw('LOCATE(?, realname)', [$params['ambiguous']['string']])
  169. // ->orWhereRaw('LOCATE(?, mobile)', [$params['ambiguous']['string']])
  170. // ->orWhereRaw('LOCATE(?, nickname)', [$params['ambiguous']['string']]);
  171. // });
  172. // });
  173. // return $order_builder->whereHas('belongsToMember', function ($query) use ($params) {
  174. // return $query->where('realname', 'like', '%' . $params['ambiguous']['string'] . '%')
  175. // ->orWhere('mobile', 'like', '%' . $params['ambiguous']['string'] . '%')
  176. // ->orWhere('nickname', 'like', '%' . $params['ambiguous']['string'] . '%');
  177. // });
  178. }
  179. });
  180. }
  181. //根据会员id搜索
  182. if ($params['ambiguous']['field'] == 'member_id') {
  183. call_user_func(function () use (&$order_builder, $params) {
  184. return $order_builder->where('uid', $params['ambiguous']['string']);
  185. });
  186. }
  187. //增加地址,姓名,手机号搜索
  188. if ($params['ambiguous']['field'] == 'address') {
  189. call_user_func(function () use (&$order_builder, $params) {
  190. list($field, $value) = explode(':', $params['ambiguous']['string']);
  191. if (isset($value)) {
  192. return $order_builder->where($field, $value);
  193. } else {
  194. return $order_builder->whereHas('address', function ($query) use ($params) {
  195. return $query->where('address','like', '%' . $params['ambiguous']['string'] . '%')
  196. ->orWhere('mobile','like','%' . $params['ambiguous']['string'] . '%')
  197. ->orWhere('realname','like','%' . $params['ambiguous']['string'] . '%');
  198. });
  199. }
  200. });
  201. }
  202. //增加根据优惠券名称搜索订单
  203. if($params['ambiguous']['field'] == 'coupon'){
  204. call_user_func(function () use (&$order_builder, $params) {
  205. list($field, $value) = explode(':', $params['ambiguous']['string']);
  206. if (isset($value)) {
  207. return $order_builder->where($field, $value);
  208. } else {
  209. return $order_builder->whereHas('coupons', function ($query) use ($params) {
  210. return $query->where('name','like','%' . $params['ambiguous']['string'] . '%');
  211. });
  212. }
  213. });
  214. }
  215. //订单商品
  216. // if ($params['ambiguous']['field'] == 'order_goods') {
  217. // $order_builder->whereHas('hasManyOrderGoods', function ($query) use ($params) {
  218. // $query->searchLike($params['ambiguous']['string']);
  219. // });
  220. // }
  221. //商品id
  222. if ($params['ambiguous']['field'] == 'goods_id') {
  223. $order_builder->whereHas('hasManyOrderGoods', function ($query) use ($params) {
  224. $query->where('goods_id',$params['ambiguous']['string']);
  225. });
  226. }
  227. if ($params['ambiguous']['field'] == 'goods_title') {
  228. $order_builder->whereHas('hasManyOrderGoods', function ($query) use ($params) {
  229. $query->where('title', 'like','%' . $params['ambiguous']['string'] . '%');
  230. });
  231. }
  232. //快递单号
  233. if ($params['ambiguous']['field'] == 'dispatch') {
  234. $order_builder->whereHas('express', function ($query) use ($params) {
  235. $query->searchLike($params['ambiguous']['string']);
  236. });
  237. }
  238. }
  239. //支付方式
  240. if (array_get($params, 'pay_type', '')) {
  241. /* 改为按支付分组方式查询后,该部分被替换
  242. $order_builder->where('pay_type_id', $params['pay_type']);
  243. */
  244. //改为支付分组查询,前端传入支付分组id,在该处通过分组id获取组中所有成员,这些成员就是确切的支付方式
  245. //如前端传入的分组id为2,对应的是支付宝支付分组,然后查找属于支付宝支付组的支付方式,找到如支付宝,支付宝-yz这些具体支付方式
  246. //获取到确切的支付方式后,对查询条件进行拼接
  247. $payTypeGroup = PayTypeGroup::with('hasManyPayType')->find($params['pay_type']);
  248. if($payTypeGroup) {
  249. $payTypes = $payTypeGroup->toArray();
  250. if($payTypes['has_many_pay_type']) {
  251. $pay_type_ids = array_column($payTypes['has_many_pay_type'], 'id');
  252. $order_builder->whereIn('yz_order.pay_type_id', $pay_type_ids);
  253. }
  254. } else {
  255. $order_builder->where('yz_order.pay_type_id', $params['pay_type']);
  256. }
  257. }
  258. //操作时间范围
  259. if (array_get($params, 'time_range.field', '') && array_get($params, 'time_range.start', 0) && array_get($params, 'time_range.end', 0)) {
  260. $range = [strtotime($params['time_range']['start']), strtotime($params['time_range']['end'])];
  261. $order_builder->whereBetween('yz_order'.'.'.$params['time_range']['field'], $range);
  262. }
  263. return $order_builder;
  264. }
  265. public static function getOrderDetailById($order_id)
  266. {
  267. return self::orders()->with(['deductions','coupons','discounts','orderFees', 'orderServiceFees','orderPays'=> function ($query) {
  268. $query->with('payType');
  269. },'hasOnePayType','hasOneExpeditingDelivery'])->find($order_id);
  270. }
  271. /**
  272. * @param $keyWord
  273. *
  274. */
  275. public static function getOrderByName($keyWord)
  276. {
  277. return \Illuminate\Support\Facades\DB::select('select title,goods_id,thumb from '.app('db')->getTablePrefix().'yz_order_goods where title like '."'%" .$keyWord ."%'");
  278. // return self::uniacid()
  279. // ->whereHas('OrderGoods', function ($query)use ($keyWord) {
  280. // $query->searchLike($keyWord);
  281. // })
  282. // ->with('OrderGoods')
  283. // ->get();
  284. }
  285. public function hasManyParentTeam()
  286. {
  287. return $this->hasMany(MemberParent::class, 'member_id', 'uid');
  288. }
  289. public function hasOneTeamDividend()
  290. {
  291. return $this->hasOne('Yunshop\TeamDividend\models\TeamDividendAgencyModel', 'uid', 'uid');
  292. }
  293. public function hasOneExpeditingDelivery()
  294. {
  295. return $this->hasOne(ExpeditingDelivery::class,'order_id','id');
  296. }
  297. }