MemberCartCollection.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2018/11/22
  6. * Time: 11:58 AM
  7. */
  8. namespace app\common\modules\memberCart;
  9. use app\common\exceptions\AppException;
  10. use app\common\models\BaseModel;
  11. use app\common\models\DispatchType;
  12. use app\common\models\goods\Dispatch;
  13. use app\common\models\Member;
  14. use app\common\models\MemberCart;
  15. use app\common\modules\trade\models\Trade;
  16. use app\common\services\Plugin;
  17. use app\framework\Database\Eloquent\Collection;
  18. use app\framework\Http\Request;
  19. use app\frontend\modules\order\models\PreOrder;
  20. use app\frontend\modules\order\services\OrderService;
  21. class MemberCartCollection extends Collection
  22. {
  23. /**
  24. * @var [MemberCart]
  25. */
  26. protected $items;
  27. private $validated = false;
  28. /**
  29. * 验证商品有效性
  30. * @throws AppException
  31. */
  32. public function validate()
  33. {
  34. if ($this->validated) {
  35. return true;
  36. }
  37. if($this->isEmpty()){
  38. throw new AppException("未选择下单商品");
  39. }
  40. if ($this->unique('member_id')->count() != 1) {
  41. throw new AppException("操作无效,购物车记录属于{$this->unique('member_id')->count()}个用户");
  42. }
  43. //这里处理需要合并规格商品验证的购物车,没有开启规格购物权限的,线下pos收银机无需验证
  44. $buyMemberId = $this->first()->member_id;
  45. if (isset($buyMemberId) && !empty($buyMemberId) && \app\frontend\models\Member::current()->uid !== $buyMemberId && request()->type != 9) {
  46. throw new AppException("操作无效,购物车记录属于其他用户");
  47. }
  48. $this->unique('goods_id')->each(function (MemberCart $memberCart) {
  49. if (isset($memberCart->goods->hasOnePrivilege) && empty($memberCart->goods->hasOnePrivilege->option_id_array)) {
  50. // 合并规格商品数量,并校验
  51. $total = $this->where('goods_id', $memberCart->goods_id)->sum('total');
  52. $memberCart->goods->hasOnePrivilege->validate($memberCart->member, $total);
  53. }
  54. });
  55. $this->each(function (Membercart $memberCart) {
  56. $memberCart->validate();
  57. });
  58. $this->validated = true;
  59. return $this->validated;
  60. }
  61. /**
  62. * 载入管理模型
  63. * @return $this
  64. */
  65. public function loadRelations()
  66. {
  67. $with = ['goods' => function ($query) {
  68. $query->select(['id', 'uniacid', 'brand_id', 'type', 'status', 'display_order', 'title', 'thumb', 'thumb_url', 'sku', 'goods_sn', 'product_sn', 'market_price', 'price', 'cost_price', 'stock', 'reduce_stock_method', 'show_sales', 'real_sales', 'weight', 'has_option', 'is_new', 'is_hot', 'is_discount', 'is_recommand', 'is_comment', 'is_deleted', 'created_at', 'deleted_at', 'updated_at', 'comment_num', 'is_plugin', 'plugin_id', 'virtual_sales', 'no_refund', 'need_address', 'type2']);
  69. }, 'goods.hasOnePrivilege', 'goods.hasOneOptions', 'goods.hasManyGoodsDiscount', 'goods.hasOneGoodsDispatch', 'goods.hasOneSale', 'goodsOption'];
  70. $with = array_merge($with, \app\common\modules\shop\ShopConfig::current()->get('shop-foundation.member-cart.with'));
  71. if (is_array($with)) {
  72. $this->expansionLoad($with);
  73. }
  74. $this->each(function (MemberCart $memberCart) {
  75. if (isset($memberCart->goodsOption)) {
  76. $memberCart->goodsOption->setRelation('goods', $memberCart->goods);
  77. }
  78. });
  79. return $this;
  80. }
  81. /**
  82. * 将购物车集合按groupId分组
  83. * @return static
  84. */
  85. public function groupByGroupId()
  86. {
  87. $groups = $this->groupBy(function (MemberCart $memberCart) {
  88. return $memberCart->getGroupId();
  89. });
  90. $groups->map(function (MemberCartCollection $memberCartCollection) {
  91. return $memberCartCollection;
  92. });
  93. return $groups;
  94. }
  95. /**
  96. * 获取交易对象
  97. * @param null $request
  98. * @return Trade|\Illuminate\Foundation\Application|mixed
  99. */
  100. public function getTrade($member = null, $request = null)
  101. {
  102. $request = $request ?: request();
  103. $trade = app(Trade::class);
  104. /**
  105. * @var Trade $trade
  106. */
  107. $trade->init($this, $member, $request);
  108. return $trade;
  109. }
  110. /**
  111. * 根据自身创建plugin_id对应类型的订单,当member已经实例化时传入member避免重复查询
  112. * @param Member|null $member
  113. * @param Plugin|null $plugin
  114. * @param Request $request
  115. * @return PreOrder|bool
  116. * @throws AppException
  117. * @throws \Exception
  118. */
  119. public function getOrder(Plugin $plugin = null, Member $member = null, $request = null)
  120. {
  121. $request = $request ?: request();
  122. if ($this->isEmpty()) {
  123. return false;
  124. }
  125. if (!isset($member)) {
  126. $member = $this->getMember();
  127. }
  128. // if ($member->uid != $this->getUid()) {
  129. // throw new AppException("用户({$member->uid})与购物车所属用户({$this->getUid()})不符");
  130. // }
  131. $this->validate();
  132. $orderGoodsCollection = OrderService::getOrderGoods($this);
  133. /**
  134. * @var PreOrder $order
  135. */
  136. $app = $plugin && $plugin->app()->bound('OrderManager') ? $plugin->app() : app();
  137. $order = $app->make('OrderManager')->make('PreOrder');
  138. $order->init($member, $orderGoodsCollection, $request);
  139. return $order;
  140. }
  141. /**
  142. * 所属uid
  143. * @return mixed
  144. */
  145. public function getUid()
  146. {
  147. return $this->first()->member_id;
  148. }
  149. /**
  150. * 所属用户对象
  151. * @return Member
  152. */
  153. public function getMember()
  154. {
  155. return $this->first()->member;
  156. }
  157. /**
  158. * 第一个调购物车记录
  159. * @param callable|null $callback
  160. * @param null $default
  161. * @return MemberCart
  162. */
  163. public function first(callable $callback = null, $default = null)
  164. {
  165. return parent::first($callback, $default);
  166. }
  167. /**
  168. * @return null
  169. * @throws AppException
  170. */
  171. public function getPlugin()
  172. {
  173. $this->validate();
  174. return $this->first()->goods->getPlugin();
  175. }
  176. public function groupByDispatchType()
  177. {
  178. $result = [];
  179. $dispatchType = new DispatchType();
  180. $settings = $dispatchType->dispatchTypesSetting(DispatchType::getCurrentUniacidSet([0,92])->toArray());
  181. foreach ($settings as $setting) {
  182. $memberCarts = [];
  183. // 按照配送方式分组
  184. foreach ($this->values() as $memberCart){
  185. if(in_array($setting['id'],$memberCart->goods->goodsDispatchTypeIds())){
  186. $memberCarts[] = $memberCart;
  187. }
  188. }
  189. $dispatch['id'] = $setting['id'];
  190. $dispatch['name'] = $setting['name'];
  191. if(empty($memberCarts)){
  192. continue;
  193. }
  194. $dispatch['member_carts'] = $memberCarts;
  195. $result[] = $dispatch;
  196. }
  197. return $result;
  198. }
  199. }