VueOrder.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2020/12/3
  6. * Time: 10:35
  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\backend\modules\order\services\OrderViewService;
  12. use app\common\models\ExpeditingDelivery;
  13. use app\common\models\Member;
  14. use app\common\models\order\FirstOrder;
  15. use app\common\models\order\OrderDeliver;
  16. use Illuminate\Database\Eloquent\Builder;
  17. use \Illuminate\Support\Facades\DB;
  18. use app\common\models\PayTypeGroup;
  19. use app\common\models\MemberCertified;
  20. use Yunshop\ElectronicsBill\common\models\ElectronicsBillTemplate;
  21. use Yunshop\PackageDeliver\model\PackageDeliverOrder;
  22. use Yunshop\PackageDelivery\models\DeliveryOrder;
  23. /**
  24. * Class VueOrder
  25. * @package app\backend\modules\order\models
  26. */
  27. class VueOrder extends \app\common\models\Order
  28. {
  29. protected $appends = ['backend_button_models', 'status_name', 'pay_type_name', 'row_bottom'];
  30. protected $orderType;
  31. /**
  32. * @return \app\backend\modules\order\services\type\NoneOrder|\app\backend\modules\order\services\type\OrderTypeFactory
  33. */
  34. public function getOrderType()
  35. {
  36. if (!isset($this->orderType)) {
  37. $this->orderType = $this->_getOrderType();
  38. }
  39. return $this->orderType;
  40. }
  41. protected function _getOrderType()
  42. {
  43. $configs = \app\common\modules\shop\ShopConfig::current()->get('shop-foundation.order-list.type');
  44. // 从配置文件中载入,按优先级排序
  45. $orderTypeConfigs = collect($configs)->sortBy('priority');
  46. //遍历取到第一个通过验证的订单类型返回
  47. foreach ($orderTypeConfigs as $configItem) {
  48. /**
  49. * @var \app\backend\modules\order\services\type\OrderTypeFactory $orderType
  50. */
  51. $orderType = call_user_func($configItem['class'], $this);
  52. //通过验证返回
  53. if (isset($orderType) && $orderType->isBelongTo()) {
  54. return $orderType;
  55. }
  56. }
  57. //没有对应订单类型,返回默认订单类型
  58. return new \app\backend\modules\order\services\type\NoneOrder($this);
  59. }
  60. /**
  61. * 订单后端操作按钮
  62. * @return array
  63. */
  64. public function getBackendButtonModelsAttribute()
  65. {
  66. return $this->getOrderType()->buttonModels();
  67. }
  68. /**
  69. * 订单列表行顶部显示
  70. * @return array
  71. */
  72. public function getTopRowAttribute()
  73. {
  74. return $this->getOrderType()->rowHeadShow();
  75. }
  76. public function getRowBottomAttribute()
  77. {
  78. return $this->getOrderType()->rowBottom();
  79. }
  80. //订单链接操作
  81. public function getFixedLinkAttribute()
  82. {
  83. return $this->getOrderType()->fixedLink();
  84. }
  85. /**
  86. * 订单列表固定按钮操作
  87. * @return array
  88. */
  89. public function getFixedButtonAttribute()
  90. {
  91. return $this->getOrderType()->fixedButton();
  92. }
  93. public function scopeStatusCode($query, $code = null)
  94. {
  95. switch ($code) {
  96. case 'waitPay':
  97. $query->waitPay(); //待支付
  98. break;
  99. case 'waitSend':
  100. $query->waitSend(); //待发货
  101. break;
  102. case 'waitReceive':
  103. $query->waitReceive(); //待收货
  104. break;
  105. case 'completed':
  106. $query->completed(); //已完成
  107. break;
  108. case 'cancelled':
  109. $query->cancelled(); //已关闭
  110. break;
  111. case 'expeditingSend':
  112. $query->waitSend()->join('yz_order_expediting_delivery', 'yz_order_expediting_delivery.order_id', '=', 'yz_order.id'); //催发货
  113. break;
  114. case 'callbackFail':
  115. $orderIds = DB::table('yz_order as o')->join('yz_order_pay_order as opo', 'o.id', '=', 'opo.order_id')
  116. ->join('yz_order_pay as op', 'op.id', '=', 'opo.order_pay_id')
  117. ->join('yz_pay_order as po', 'po.out_order_no', '=', 'op.pay_sn')
  118. ->where('op.status', 0)
  119. ->where('o.pay_time', 0)
  120. ->where('po.status', 2)
  121. ->distinct()->pluck('o.id');
  122. $query->whereIn('id', $orderIds); //支付异常订单
  123. break;
  124. case 'payFail':
  125. $orderIds = DB::table('yz_order as o')->join('yz_order_pay_order as opo', 'o.id', '=', 'opo.order_id')
  126. ->join('yz_order_pay as op', 'op.id', '=', 'opo.order_pay_id')
  127. ->whereIn('o.status', [0, -1])
  128. ->where('op.status', 1)
  129. ->pluck('o.id');
  130. $query->whereIn('id', $orderIds); //支付回调异常订单
  131. break;
  132. case 'all':
  133. break;
  134. default:
  135. }
  136. if ($code == 'all') {
  137. //todo 暂时的,只显示有设置config配置的订单
  138. foreach ((new OrderViewService())->getOrderType() as $orderType) {
  139. $pluginIds[] = $orderType['plugin_id'];
  140. }
  141. if ($pluginIds) {
  142. $query->whereIn('plugin_id', $pluginIds);
  143. }
  144. } else {
  145. $query->pluginId();
  146. }
  147. return $query;
  148. }
  149. public function scopeSearch(Builder $order_builder, $search = [])
  150. {
  151. $order_builder->select('yz_order.*');
  152. //订单首单搜索
  153. if ($search['first_order']) {
  154. $order_builder->whereHas('hasManyFirstOrder');
  155. //$order_builder->join('yz_first_order', 'yz_first_order.order_id', '=', 'yz_order.id');
  156. }
  157. if (isset($search['plugin_id']) && $search['plugin_id'] != '') {
  158. $order_builder->where('yz_order.plugin_id', $search['plugin_id']);
  159. }
  160. if (isset($search['order_type']) && $search['order_type'] != '') {
  161. $order_builder->where('yz_order.plugin_id', $search['order_type']);
  162. }
  163. if ($search['order_id']) {
  164. $order_builder->where('yz_order.id', $search['order_id']);
  165. }
  166. if ($search['order_status']) {
  167. if (is_array($search['order_status'])) {
  168. if ($status = array_intersect([-1, 1, 2, 3, 'waitPay'], $search['order_status'])) {
  169. if (($key = array_search('waitPay', $status)) !== false) {
  170. $status[$key] = 0;
  171. }
  172. $order_builder->whereIn('yz_order.status', $status);
  173. }
  174. } else {
  175. $status = $search['order_status'] == 'waitPay' ? 0 : $search['order_status'];
  176. $order_builder->where('yz_order.status', $status);
  177. }
  178. }
  179. if ($search['order_sn']) {
  180. $order_builder->where('yz_order.order_sn', trim($search['order_sn']));
  181. }
  182. if ($search['pay_sn']) {
  183. $order_builder->join('yz_order_pay', 'yz_order_pay.id', '=', 'yz_order.order_pay_id')
  184. ->where('yz_order_pay.pay_sn', trim($search['pay_sn']));
  185. }
  186. // 营销码标签搜索
  187. if ($search['marketing_qr_label']) {
  188. $order_builder->join('yz_marketing_qr_log', 'yz_order.id', '=', 'yz_marketing_qr_log.order_id')
  189. ->join('yz_marketing_qr', 'yz_marketing_qr.id', '=', 'yz_marketing_qr_log.marketing_qr_id')
  190. ->where('yz_marketing_qr.label', 'like', "%" . trim($search['marketing_qr_label']) . "%");;
  191. }
  192. //根据会员id搜索
  193. if ($search['member_id']) {
  194. $order_builder->where('yz_order.uid', $search['member_id']);
  195. }
  196. //根据上级id搜索
  197. if (isset($search['parent_id'])) {
  198. // 去空
  199. $parent_id = str_replace(' ', '', $search['parent_id']);
  200. // 0为搜索上级总店
  201. if ($parent_id > 0) {
  202. $parent_id = (int)$search['parent_id'];
  203. }else{
  204. // 参数为字符串时,查询不存在记录返回空.
  205. if($parent_id) {
  206. $parent_id = -99;
  207. }
  208. // 查询为0的上级(总店)
  209. if ($parent_id === '0') {
  210. $parent_id = 0;
  211. }
  212. // 空字符串返回所有
  213. if ($parent_id === '') {
  214. $parent_id = 'all';
  215. }
  216. }
  217. if ($parent_id !== 'all'){
  218. $order_builder->join('yz_member', function ($join) use ($parent_id) {
  219. return $join->on('yz_member.member_id', '=', 'yz_order.uid')->where('parent_id', $parent_id);
  220. });
  221. }
  222. }
  223. if ($search['member_info']) {
  224. $order_builder->join('mc_members', function ($join) use ($search) {
  225. $join->on('mc_members.uid', '=', 'yz_order.uid')->where(function ($where) use ($search) {
  226. return $where->where('mc_members.realname', 'like', "%{$search['member_info']}%")
  227. ->orWhere('mc_members.mobile', 'like', "%{$search['member_info']}%")
  228. ->orWhere('mc_members.nickname', 'like', "%{$search['member_info']}%");
  229. });
  230. });
  231. }
  232. //增加地址,姓名,手机号搜索
  233. if ($search['address_mobile'] || $search['address'] || $search['address_name']) {
  234. $order_builder->join('yz_order_address', 'yz_order_address.order_id', '=', 'yz_order.id')->where(function ($query) use ($search) {
  235. if ($search['address_mobile']) {
  236. $query->where('yz_order_address.mobile', 'like', "%{$search['address_mobile']}%");
  237. }
  238. if ($search['address_name']) {
  239. $query->where('yz_order_address.realname', 'like', "%{$search['address_name']}%");
  240. }
  241. if ($search['address']) {
  242. $query->where('yz_order_address.address', 'like', "%{$search['address']}%");
  243. }
  244. });
  245. // $order_builder->whereHas('address', function ($query) use ($search) {
  246. // return $query->where('mobile', 'like', '%' . $search['address_mobile'] . '%')
  247. // ->where('realname', 'like', '%' . $search['address_name'] . '%');
  248. // });
  249. }
  250. //商品id 商品名称
  251. if ($search['goods_id'] || $search['goods_title']) {
  252. $orderGoodsModel = OrderGoods::uniacid();
  253. if ($search['goods_id']) {
  254. $orderGoodsModel->where('goods_id', $search['goods_id']);
  255. }
  256. if ($search['goods_title']) {
  257. $orderGoodsModel->where('title', 'like', "%".trim($search['goods_title'])."%");
  258. }
  259. $goods_order_ids = $orderGoodsModel->pluck('order_id')->unique()->toArray();
  260. $order_builder->whereIn('yz_order.id', $goods_order_ids);
  261. }
  262. //快递单号
  263. if ($search['express']) {
  264. $order_builder->whereHas('express', function ($query) use ($search) {
  265. $query->where('express_sn',$search['express']);
  266. });
  267. }
  268. if ($search['pay_type']) {
  269. $order_builder->where('yz_order.pay_type_id', $search['pay_type']);
  270. } else {
  271. //支付方式:先按分组查询,如分组不存在按支付类型查询
  272. if (array_get($search, 'pay_type_group', '')) {
  273. //改为支付分组查询,前端传入支付分组id,在该处通过分组id获取组中所有成员,这些成员就是确切的支付方式
  274. //如前端传入的分组id为2,对应的是支付宝支付分组,然后查找属于支付宝支付组的支付方式,找到如支付宝,支付宝-yz这些具体支付方式
  275. //获取到确切的支付方式后,对查询条件进行拼接
  276. $payTypeGroup = PayTypeGroup::with('hasManyPayType')->find($search['pay_type_group']);
  277. if($payTypeGroup) {
  278. $payTypes = $payTypeGroup->toArray();
  279. if($payTypes['has_many_pay_type']) {
  280. $pay_type_ids = array_column($payTypes['has_many_pay_type'], 'id');
  281. $order_builder->whereIn('yz_order.pay_type_id', $pay_type_ids);
  282. }
  283. }
  284. }
  285. }
  286. //操作时间范围
  287. if ($search['start_time'] && $search['end_time'] && $search['time_field']) {
  288. $range = [strtotime($search['start_time']), strtotime($search['end_time'])];
  289. if (in_array($search['time_field'],['refund_create_time','refund_finish_time'])) {
  290. $refund_time_field = ['refund_create_time'=> 'create_time', 'refund_finish_time'=> 'refund_time'];
  291. $order_builder->join('yz_order_refund', 'yz_order_refund.id', '=', 'yz_order.refund_id')
  292. ->whereBetween('yz_order_refund.'.$refund_time_field[$search['time_field']], $range);
  293. } else {
  294. $order_builder->whereBetween('yz_order.'.$search['time_field'], $range);
  295. }
  296. }
  297. //自提点条件搜索
  298. if ($search['package_deliver_id']) {
  299. $order_builder->join('yz_package_deliver_order', 'yz_package_deliver_order.order_id', '=', 'yz_order.id')
  300. ->where('yz_package_deliver_order.deliver_id', $search['package_deliver_id']);
  301. }
  302. if ($search['package_deliver_name']) {
  303. $deliver_ids = \Yunshop\PackageDeliver\model\Deliver::uniacid()
  304. ->where('deliver_name', 'like', "%{$search['package_deliver_name']}%")
  305. ->pluck('id')->all();
  306. $order_builder->join('yz_package_deliver_order', 'yz_package_deliver_order.order_id', '=', 'yz_order.id')
  307. ->whereIn('yz_package_deliver_order.deliver_id', $deliver_ids);
  308. }
  309. if($search['bill_print']){
  310. if(app('plugins')->isEnabled('electronics-bill')){
  311. $table_prefix = app('db')->getTablePrefix();
  312. if ($search['bill_print'] == 'print') {
  313. $order_builder->whereRaw($table_prefix . "yz_order.id in (select distinct order_id from " . $table_prefix . "yz_electronics_bill_template)");
  314. } elseif ($search['bill_print'] == 'not_print') {
  315. $order_builder->whereRaw($table_prefix . "yz_order.id not in (select distinct order_id from " . $table_prefix . "yz_electronics_bill_template)");
  316. }
  317. }
  318. }
  319. if ($search['dispatch_type_id']) {
  320. $order_builder->where('dispatch_type_id', $search['dispatch_type_id']);
  321. }
  322. if (app('plugins')->isEnabled('shop-clerk') && ($search['shop_clerk_kwd'] || $search['shop_clerk_uid'])) {
  323. $clerk_query = \Yunshop\ShopClerk\models\ShopClerk::uniacid()->select('id','uid');
  324. if ($search['shop_clerk_kwd']) {
  325. $clerk_query->whereHas('hasOneMember', function ($query) use ($search) {
  326. $query->where('nickname', 'like', "%{$search['shop_clerk_kwd']}%")
  327. ->orWhere('mobile', 'like', "%{$search['shop_clerk_kwd']}%")
  328. ->orWhere('realname', 'like', "%{$search['shop_clerk_kwd']}%");
  329. });
  330. }
  331. if ($search['shop_clerk_uid']) {
  332. $clerk_query->where('uid', $search['shop_clerk_uid']);
  333. }
  334. $clerk_ids = $clerk_query->pluck('id')->toArray() ?: [-1];
  335. $clerk_order_ids = \Yunshop\ShopPos\models\PosOrder::uniacid()->whereIn('clerk_id', $clerk_ids)->select('order_id')->pluck('order_id')->toArray() ?: [-1];
  336. $order_builder->whereIn('id', $clerk_order_ids);
  337. }
  338. if (app('plugins')->isEnabled('package-delivery')) {
  339. $package_where = [];
  340. if ($search['package_delivery_clerk_kwd']) {
  341. $clerk_uids = \Yunshop\PackageDelivery\models\DeliveryClerk::uniacid()->select('uid')->whereHas('hasOneMember',function ($query)use($search){
  342. $query->where('nickname', 'like', "%{$search['package_delivery_clerk_kwd']}%")
  343. ->orWhere('mobile', 'like', "%{$search['package_delivery_clerk_kwd']}%")
  344. ->orWhere('realname', 'like', "%{$search['package_delivery_clerk_kwd']}%");
  345. })->pluck('uid')->toArray() ?: [-1];
  346. $package_where[] = [function ($query) use ($clerk_uids) {
  347. $query->whereIn('confirm_uid', $clerk_uids);
  348. }];
  349. }
  350. if ($search['package_delivery_clerk_uid']) {
  351. $package_where[] = ['confirm_uid', $search['package_delivery_clerk_uid']];
  352. }
  353. if ($package_where) {
  354. $package_order_ids = \Yunshop\PackageDelivery\models\DeliveryOrder::uniacid()->where($package_where)->select('order_id')->pluck('order_id')->toArray() ?: [-1];
  355. $order_builder->whereIn('id', $package_order_ids);
  356. }
  357. }
  358. return $order_builder;
  359. }
  360. //订单导出订单数据
  361. public static function getExportOrders($search)
  362. {
  363. $builder = Order::exportOrders($search);
  364. $orders = $builder->get()->toArray();
  365. return $orders;
  366. }
  367. public function hasManyOrderGoods()
  368. {
  369. return $this->hasMany(OrderGoods::class, 'order_id', 'id');
  370. }
  371. public function hasManyFirstOrder()
  372. {
  373. return $this->hasMany(FirstOrder::class, 'order_id', 'id');
  374. }
  375. public function hasManyMemberCertified(){
  376. return $this->hasOne(MemberCertified::class,'order_id','id')->orderBy('updated_at','desc');
  377. }
  378. public function orderDeliver()
  379. {
  380. return $this->hasOne(OrderDeliver::class, 'order_id', 'id');
  381. }
  382. public function scopeExportOrders(Order $query, $search)
  383. {
  384. $order_builder = $query->search($search);
  385. $orders = $order_builder->with([
  386. 'belongsToMember' => self::memberBuilder(),
  387. 'hasManyOrderGoods' => self::orderGoodsBuilder(),
  388. 'hasOneDispatchType',
  389. 'address',
  390. 'hasOneOrderRemark',
  391. 'express',
  392. 'hasOnePayType',
  393. 'hasOneOrderPay',
  394. 'hasManyFirstOrder',
  395. 'hasManyMemberCertified',
  396. ]);
  397. return $orders;
  398. }
  399. public function scopeOrders(Builder $order_builder, $search = [])
  400. {
  401. $order_builder->search($search);
  402. $orders = $order_builder->with([
  403. 'belongsToMember' => self::memberBuilder(),
  404. 'hasManyOrderGoods' => self::orderGoodsBuilder(),
  405. 'hasOneDispatchType',
  406. 'hasOnePayType',
  407. 'address',
  408. 'hasManyOrderGoods.goods.belongsToCategorys',
  409. 'express',
  410. 'expressmany',
  411. 'process',
  412. 'hasOneRefundApply' => self::refundBuilder(),
  413. 'hasOneOrderRemark',
  414. 'manualRefundLog',
  415. 'hasOneOrderPay'=> function ($query) {
  416. $query->orderPay();
  417. },
  418. 'hasManyFirstOrder',
  419. 'hasManyMemberCertified',
  420. 'hasOneBehalfPay',
  421. 'memberCancel' => self::memberCancel_v(),
  422. ]);
  423. if(app('plugins')->isEnabled('electronics-bill')){
  424. $orders->with([
  425. 'hasManyBillTemp' => function($q){
  426. $q->groupBy('order_id');
  427. }
  428. ]);
  429. }
  430. if (app('plugins')->isEnabled('city-delivery') && \Yunshop\CityDelivery\services\SettingService::getBaseSetting()['open_state']) {
  431. $orders->with(['hasOneCityDelivery.hasOneAnotherOrder'])->with('hasManyCityDeliveryAnother');
  432. }
  433. return $orders;
  434. }
  435. private static function memberCancel_v()
  436. {
  437. return function ($query) {
  438. return $query->select(['member_id','status']);
  439. };
  440. }
  441. public function scopeDetailOrders(Builder $order_builder)
  442. {
  443. $orders = $order_builder->with([
  444. 'belongsToMember' => self::memberBuilder(),
  445. 'hasManyOrderGoods' => function($orderGoods) {
  446. $orderGoods->orderDetailGoods();
  447. },
  448. 'hasOneDispatchType',
  449. 'hasOnePayType',
  450. 'address',
  451. 'express',
  452. 'process',
  453. 'hasOneRefundApply' => self::refundBuilder(),
  454. 'hasManyRefundApply' => function ($query) {
  455. return $query->with(['processLog','refundOrderGoods']);
  456. },
  457. 'refundProcessLog' => function ($query) {
  458. return $query->orderBy('id', 'desc');
  459. },
  460. 'hasOneOrderRemark',
  461. 'hasOneOrderPay'=> function ($query) {
  462. $query->orderPay();
  463. },
  464. 'deductions',
  465. 'coupons',
  466. 'discounts',
  467. 'orderFees',
  468. 'orderServiceFees',
  469. 'orderInvoice',
  470. 'orderPays' => function ($query) {
  471. $query->with('payType');
  472. },
  473. 'hasOneExpeditingDelivery',
  474. 'hasManyMemberCertified',
  475. ]);
  476. if(app('plugins')->isEnabled('exchange-code')){
  477. $orders->with([
  478. 'hasOneExchangeCode.record.code'
  479. ]);
  480. }
  481. return $orders;
  482. }
  483. private static function refundBuilder()
  484. {
  485. return function ($query) {
  486. return $query->with(['returnExpress','hasManyResendExpress','changeLog','refundOrderGoods']);
  487. };
  488. }
  489. private static function memberBuilder()
  490. {
  491. return function ($query) {
  492. return $query->select(['uid', 'mobile', 'nickname', 'realname','avatar','idcard']);
  493. };
  494. }
  495. private static function orderGoodsBuilder()
  496. {
  497. return function ($query) {
  498. $query->orderGoods();
  499. };
  500. }
  501. public static function getOrderDetailById($order_id)
  502. {
  503. return self::orders()->with(['deductions','coupons','discounts','orderFees', 'orderServiceFees','orderPays'=> function ($query) {
  504. $query->with('payType');
  505. },'hasOnePayType','hasOneExpeditingDelivery'])->find($order_id);
  506. }
  507. /**
  508. * @param $keyWord
  509. *
  510. */
  511. public static function getOrderByName($keyWord)
  512. {
  513. return \Illuminate\Support\Facades\DB::select('select title,goods_id,thumb from '.app('db')->getTablePrefix().'yz_order_goods where title like '."'%" .$keyWord ."%'");
  514. // return self::uniacid()
  515. // ->whereHas('OrderGoods', function ($query)use ($keyWord) {
  516. // $query->searchLike($keyWord);
  517. // })
  518. // ->with('OrderGoods')
  519. // ->get();
  520. }
  521. public function hasManyBillTemp()
  522. {
  523. return $this->hasMany(ElectronicsBillTemplate::class,'order_id','id');
  524. }
  525. public function hasOneCityDelivery()
  526. {
  527. return $this->hasOne(\Yunshop\CityDelivery\models\DeliveryOrder::class, 'order_id', 'id');
  528. }
  529. public function hasManyCityDeliveryAnother()
  530. {
  531. return $this->hasMany(\Yunshop\CityDelivery\models\AnotherOrder::class, 'order_id', 'id');
  532. }
  533. public function hasManyParentTeam()
  534. {
  535. return $this->hasMany(MemberParent::class, 'member_id', 'uid');
  536. }
  537. public function hasOneTeamDividend()
  538. {
  539. return $this->hasOne('Yunshop\TeamDividend\models\TeamDividendAgencyModel', 'uid', 'uid');
  540. }
  541. public function hasOneExpeditingDelivery()
  542. {
  543. return $this->hasOne(ExpeditingDelivery::class,'order_id','id');
  544. }
  545. public function hasOnePackageDeliveryOrder()
  546. {
  547. return $this->hasOne(DeliveryOrder::class, 'order_id', 'id');
  548. }
  549. public function hasOnePackageDeliverOrder()
  550. {
  551. return $this->hasOne(PackageDeliverOrder::class, 'order_id', 'id');
  552. }
  553. public function hasOneExchangeCode()
  554. {
  555. return $this->hasOne('Yunshop\ExchangeCode\common\models\ExchangeCodePayRelation', 'order_id', 'id');
  556. }
  557. }