TradeDispatch.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2018/11/23
  6. * Time: 5:11 PM
  7. */
  8. namespace app\common\modules\trade\models;
  9. use app\common\models\DispatchType;
  10. use app\common\models\Goods;
  11. use app\common\facades\Setting;
  12. use app\common\models\BaseModel;
  13. use app\frontend\modules\memberCart\controllers\DispatchTypeController;
  14. use app\frontend\modules\order\dispatch\DispatchTypeMenu;
  15. use app\frontend\modules\order\models\PreOrder;
  16. class TradeDispatch extends BaseModel
  17. {
  18. protected $appends = ['delivery_method', 'recommend_goods', 'use_wechat_address', 'custom_data'];
  19. /**
  20. * @var Trade
  21. */
  22. private $trade;
  23. public function init(Trade $trade)
  24. {
  25. $this->trade = $trade;
  26. $this->setRelation('default_member_address', $this->getMemberAddress());
  27. return $this;
  28. }
  29. /**
  30. * @return mixed
  31. */
  32. private function getMemberAddress()
  33. {
  34. return $this->trade->orders->first()->orderAddress->getMemberAddress();
  35. }
  36. /**
  37. * 交易中所有商品配送方式的交集
  38. * @return array
  39. */
  40. protected function _gteDeliveryMethod()
  41. {
  42. //todo 虚拟订单不需要配送方式
  43. $need_address = $this->trade->orders->contains(function (PreOrder $order) {
  44. return $order->isVirtual() === false;
  45. });
  46. if (!$need_address) {
  47. return [];
  48. }
  49. $orders = $this->trade->orders;
  50. // 遍历获取订单的有效配送方式
  51. foreach ($this->trade->orders as $order) {
  52. $dispatchTypeManager = new \app\frontend\modules\order\dispatch\DispatchTypeMenuManager($order, $orders);
  53. $dispatchTypes = $dispatchTypeManager->getOrderDispatchType();
  54. $parameter = $dispatchTypes->map(function (DispatchTypeMenu $dispatchType) {
  55. return [
  56. 'dispatch_type_id' => $dispatchType->getId(),
  57. 'name' => $dispatchType->getName(),
  58. ];
  59. })->values();
  60. if ($parameter->isNotEmpty()) {
  61. $parameters[] = $parameter;
  62. }
  63. }
  64. if (empty($parameters)) {
  65. return [];
  66. }
  67. $result = $parameters[0];
  68. foreach ($parameters as $parameter) {
  69. // 与结果取差,删掉不相交的值
  70. $diffIds = $result->pluck('dispatch_type_id')->diff($parameter->pluck('dispatch_type_id'));
  71. foreach ($result as $key => $item) {
  72. if ($diffIds->contains($item['dispatch_type_id'])) {
  73. unset($result[$key]);
  74. }
  75. }
  76. }
  77. return $result->values();
  78. }
  79. public function getDeliveryMethodAttribute()
  80. {
  81. if (!miniVersionCompare('1.1.105') || !versionCompare('1.1.105')) {
  82. return $this->tempDeliveryMethod();
  83. }
  84. return [];
  85. }
  86. protected function tempDeliveryMethod()
  87. {
  88. $goods_id = $this->trade->orders->map(function (PreOrder $order) {
  89. return $order->orderGoods->pluck('goods_id');
  90. })->collapse()->values()->toArray();
  91. $dispatch = (new DispatchTypeController())->getOrderDispatch($goods_id);
  92. return $dispatch;
  93. }
  94. // 只有预下单里面的订单全部是自营, 才计算他们的运费, 再是否显示推荐商品
  95. public function getRecommendGoodsAttribute()
  96. {
  97. $is_display = true;
  98. foreach ($this->trade->orders as $model) {
  99. $pass = [0, 92, 44];
  100. if (!in_array($model->plugin_id, $pass)) {
  101. $is_display = false;
  102. break;
  103. }
  104. }
  105. if (!$is_display || \Setting::get('shop.order.order_apart')) {
  106. return [];
  107. }
  108. $dispatch_price = $this->trade->orders->sum('dispatch_price');
  109. $enoughReduce = Setting::get('enoughReduce.freeFreight');
  110. if ($enoughReduce['open']
  111. && $enoughReduce['postage_included_category_open']
  112. && $dispatch_price > 0) {
  113. $goods = Goods::select('id', 'title', 'price', 'thumb')->whereStatus(1)->whereHas('hasManyPostageIncluded')->inRandomOrder()->take(4)->get();
  114. $goods->each(function (&$model) {
  115. $model->thumb = yz_tomedia($model->thumb);
  116. });
  117. return $goods;
  118. }
  119. return [];
  120. }
  121. public function getUseWechatAddressAttribute()
  122. {
  123. return (bool)Setting::get('shop.order.use_wechat_address');
  124. }
  125. // 配送方式的一些需要的数据放到这里处理然后返回. custom_data
  126. public function getCustomDataAttribute()
  127. {
  128. $data = '';
  129. if (request()->input('dispatch_type_id') == DispatchType::PACKAGE_DELIVER) {
  130. $data = [
  131. 'custom_consignee' => Setting::get('plugin.package_deliver.custom_consignee') ?: '提货人姓名',
  132. 'custom_phone' => Setting::get('plugin.package_deliver.custom_phone') ?: '提货人手机'
  133. ];
  134. }
  135. return $data;
  136. }
  137. }