1], [['limit',], 'default', 'value' => 1000], ]; } public function search($params = []) { $query = Cart::find()->where(['store_id' => $this->store_id, 'user_id' => $this->user_id, 'is_delete' => 0, 'type' => (int)$params['type']]); if (get_md_id() > 0) { $md_id = get_md_id(); } else { $md_id = [-1, 0]; } $query->andWhere(['md_id' => $md_id]); if (!empty($this->cart_id_list)) { $query->andWhere(['in', 'id', $this->cart_id_list]); } $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => 10000,]); /* @var Cart[] $list */ $list = $query->orderBy('goods_id DESC')->limit($pagination->limit)->offset($pagination->offset)->all(); $new_list = []; $mch_list = [];//入驻商的商品 $goods_id_list = []; // 平台购物车商品ids $mch_data = []; $platform_profit_strategy = Option::get('platform_profit_strategy', 0, 'store')['value']; $platform_profit_strategy = json_decode($platform_profit_strategy, true); foreach ($list as $item) { $goods = Goods::findOne([ 'id' => $item->goods_id, 'is_delete' => 0, 'status' => 1, ]); if (!$goods) { continue; } //加价保护start if (!empty($platform_profit_strategy) && $goods->cloud_goods_id > 0) { if (intval($platform_profit_strategy['is_risk_control'])) { //开启风控 $id = \Yii::$app->cache->get('risk_control_model_id_' . $item->goods_id); if ($id && !\Yii::$app->queue->isDone($id)) {//\Yii::$app->queue->status($id) \Yii::$app->queue->remove($id); } $id =\queue_push(new \app\jobs\RiskControlModelJob(['goods_id' => $item->goods_id])); \Yii::$app->cache->set('risk_control_model_id_' . $item->goods_id, $id); } } //加价保护END $goods_id_list[] = $item->goods_id; $attr_list = Attr::find()->alias('a') ->select('ag.attr_group_name,a.attr_name,') ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id') ->where(['a.id' => json_decode($item->attr, true)]) ->asArray()->all(); // 门店逻辑 $attr = $goods->attr; $price = $goods->price; $status = $goods->status; // 独立运营门店不参与活动 团购活动需要写在判断门店之前 $activityModel = MdGroupActivitiesGoods::find()->alias('mgag')->leftJoin(['mga'=>MdGroupActivities::tableName()],'mga.id=mgag.activities_id')->where(['goods_id'=>$goods->id,'mgag.is_delete'=>0])->andWhere(['>=','mga.end_time',time()])->andWhere(['mga.is_delete'=>0])->asArray()->select('mgag.*,mga.start_time,mga.end_time')->one(); if($activityModel){ $attr = $activityModel['attr']; $price = $activityModel['price']; } if (get_md_id()) { $md = Md::findOne(get_md_id()); if ($md->is_single) { $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]); if ($md_goods) { $attr = $md_goods->attr; $price = $md_goods->price; $status = $md_goods->status; } } } $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $goods->is_level, 'use_attr' => $goods->use_attr, ]; $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($item->attr, true)); $attr_num = intval(empty($goods_attr_info['num']) ? 0 : $goods_attr_info['num']); $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods_attr_info['pic'] : $goods->cover_pic; //秒杀逻辑 //通过商品查找进行中的活动 // $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $item->goods_id]) // ->leftJoin(['sg' => SeckillActivity::tableName()], 'sg.id = sag.activity_id') // ->andWhere(['AND', ['>', 'sg.end_time', time()], ['<', 'sg.start_time', time()], ['sg.is_delete' => 0, 'sag.is_delete' => 0, 'sg.store_id' => get_store_id()]]) // ->select('sg.id, sg.end_time, sag.attr, sag.use_attr, sg.self_limit_num, sag.seckill_num, sag.seckill_price, sag.sale_num')->asArray()->one(); // $price = 0; // if (!empty($seckill_activity_goods)) { // //// $seckill_activity_goods['end_time'] = date("m月d日 H:s", $seckill_activity_goods['end_time']); // //如果商品使用规格 且 已经查找到活动 //// if ((int)$goods->use_attr === 1 && !empty($seckill_activity_goods['attr'])) { // //解码 // $seckill_activity_goods['attr'] = $sag_attrs = json_decode($seckill_activity_goods['attr'], true); // // //获取设置的商品秒杀规格id数组与购物车添加的规格id数组比较 // $sag_attrs = array_column($sag_attrs, 'attr_list'); // //假设没有对应的规格信息 // $open = false; // foreach ($sag_attrs as $index => $sag_attr) { // // $sag_attr_id = array_column($sag_attr, 'attr_id'); // //与购物车添加的规格id数组比较 // if (empty(array_diff($sag_attr_id, json_decode($item->attr, true)))) { // $price = $seckill_activity_goods['attr'][$index]['seckill_price']; // $open = true; // } // } // //没有对应的规格信息,则前端不传递秒杀信息 // if (!$open) { // $seckill_activity_goods = []; // } //// } else { //// $price = $seckill_activity_goods['seckill_price']; //// } // } //配送时间逻辑 $delivery_rules = DeliveryRules::find()->where(['id' => $goods->delivery_rules_id, 'is_delete' => 0, 'status' => 1, 'store_id' => get_store_id()])->select('type, times, days, name')->asArray()->one(); if ($delivery_rules) { $days = "下单" . $delivery_rules['days'] . "天后"; $delivery_rules['times'] = (int)$delivery_rules['type'] === 1 ? $days : date("m月d日 H:i:s", $delivery_rules['times']); $delivery_rules['type'] .= ''; } $price = $goods_attr_info['level_price']; //新人专享活动 $activityAt = ActivityNewUser::activityAt($goods->store_id); $open = false; if ($activityAt) { $goods_ext = ActivityNewUserGoods::findOne(['activity_id' => $activityAt->id, 'goods_id' => $goods->id, 'is_delete' => 0]); if ($goods_ext) { $ext_attrs = json_decode($goods_ext->attr, true); $attr_list_ = json_decode($item->attr, true); foreach($ext_attrs as $ext_attr){ $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id'); sort($ext_attr_id); sort($attr_list_); //与购物车添加的规格id数组比较 // array_splice($this->attr_list, 0, 1); if (empty(array_diff($ext_attr_id, $attr_list_))) { $ext_price = $ext_attr['price']; $open = true; } } $buy_limit = $activityAt->buy_limit; if ($open) { if ($buy_limit && $buy_limit > 0) { //部分享受优惠 $goodsNum = intval(Goods::getBuyNum(get_user(), $goods->id)); $diff_num = $buy_limit - $goodsNum; // 1 只有$diff_num件享受新人价格 if ($diff_num > 0) { $buy_num = $item->num - $diff_num;//1 - 5 if ($buy_num > 0) { $price = ($diff_num * $ext_price) + ($buy_num * $price); } else { $price = $item->num * $ext_price; } } }else{ //全部享受优惠 $price = $ext_price * $item->num; } // $price = sprintf('%.2f', $price / $item->num); } } } if (!$open) { $price = ($price * $item->num) ?: doubleval(empty($goods_attr_info['price']) ? $goods->price : $goods_attr_info['price']) * $item->num; } $attrData = json_decode($goods['attr'], true); $firstAttrItem = reset($attrData); $member1 = 0; if (get_user()->level < 0) { if (!empty($firstAttrItem['member1'])) { $member1 = $firstAttrItem['member1']; } else { $findLevel = Level::find() ->where(['status' => 1, 'is_delete' => 0, 'store_id' => $this->store_id,]) ->andWhere(['>', 'id', get_user()->level]) ->one(); $unitPrice = $goods->price; $quantity = $item->num; $totalPrice = $unitPrice * $quantity; if (!empty($findLevel)) { $discount = $findLevel->discount / 10; $member1 = $totalPrice * $discount; } } } $new_item = (object)[ 'cart_id' => $item->id, 'goods' => $goods, 'goods_id' => $goods->id, 'goods_name' => $goods->name, 'goods_pic' => $goods_pic, 'num' => $item->num, 'attr_list' => $attr_list, 'original_price' => doubleval($goods->original_price * $item->num), 'price' => floor_num($price, 2), '$goods_attr_info' => $goods_attr_info, 'unitPrice' => $price ?: doubleval($goods_attr_info['price']), 'max_num' => $attr_num, 'disabled' => ($item->num > $attr_num) ? true : false, 'status' => $status, 'seckill_activity_goods' => null, //$seckill_activity_goods ?: null, //秒杀逻辑,商品不可加购物车 'delivery_rules' => $delivery_rules ?: null, 'cost_price' => $goods->cost_price, 'user_id' => get_user_id(), // 'mch_id' => $md_id, 'rate' => $goods->rate, 'rate_type' => $goods->rate_type, 'balance' => $goods->balance, 'single_price' => $goods->price, 'weight' => $goods->weight, 'integral_price' => $goods->integral_price, 'freight' => $goods->freight, 'full_cut' => $goods->full_cut, 'goods_cat_id' => $goods->cat_id, 'id' => $goods->id, 'verify_card_id' => [], 'type' => $goods->type, 'delivery_type' => $goods->delivery_type, 'pieces' => $goods->pieces, 'forehead' => $goods->forehead, 'level_price' => $member1 ?? 0, 'user_is_level' => get_user()->level > 0 ? true : false, 'level_price_arr' => $firstAttrItem, 'original_price' => $firstAttrItem['original_price'], 'product_type' => $goods->product_type, ]; if ($goods->mch_id != 0) { if (!is_array($mch_list['mch_id_' . $goods->mch_id])) { $mch_list['mch_id_' . $goods->mch_id] = []; } $new_item->mch_id = $goods->mch_id; $mch_list['mch_id_' . $goods->mch_id][] = $new_item; } else { $new_list[] = $new_item; } } $new_mch_list = []; foreach ($mch_list as $i => $item) { $mch = Mch::findOne([ 'id' => $item[0]->mch_id, 'is_delete' => 0, 'is_open' => 1, 'is_lock' => 0, ]); if ($mch) { $new_mch_list[] = [ 'id' => $mch->id, 'name' => $mch->name, 'list' => $item, ]; } } // 获取平台可用优惠券 $coupon_list = Coupon::getList(0, 0, 0, $goods_id_list); foreach ($new_mch_list as &$value) { $mch_goods_id_list = []; foreach ($value['list'] as $v) { $mch_goods_id_list[] = $v->goods_id; } $value['coupon_list'] = Coupon::getList($value['id'], 0, 0, $mch_goods_id_list); } $mch_data = [ 'mch_id' => get_mch_id(), 'goods_list' => $new_list, 'name' => '平台自营', 'send_type' => ['express', 'shop'], 'is_shop' => null, 'shop_list' => [], 'plugin_type' => 0, 'total_price' => array_sum(array_column($new_list, 'price')), 'level_price' => array_sum(array_column($new_list, 'level_price')), 'level_price_arr' => [ 'member1' => array_sum(array_column($new_list, 'level_price')), 'member2' => array_sum(array_column($new_list, 'next_level_price')), 'member6' => array_sum(array_column($new_list, 'next_level_price')), ], 'payment_type' => 0, 'diy_send_type' => [ ['key' => 'express', 'name' => '快递配送'], ['key' => 'shop', 'name' => '自提配送'], ['key' => 'delivery', 'name' => '同城配送'], ], 'next_level_price' => '', 'next_level' => null, 'integral' => ['forehead' => 0, 'forehead_integral' => 0], 'coupon_list' => $new_mch_list['coupon_list'], ]; $shipping_fee = new OrderForm(); $calculations_shipping = $shipping_fee->getExpressPrice($mch_data); return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'row_count' => $count, 'page_count' => $pagination->pageCount, 'list' => $new_list, 'mch_list' => $new_mch_list, 'coupon_list' => $coupon_list, 'shipping_fee' => $calculations_shipping, ], ]; } public function save($params = []) { $type = (int)$params['type']; if ($this->list) { $cart_list = json_decode($this->list, true); foreach ($cart_list as $v) { $form = Cart::find()->where(['type'=>$type,'store_id' => $this->store_id, 'is_delete' => 0])->andWhere('id=:id', [':id' => $v['cart_id']])->one(); $form->num = $v['num']; $form->save(); } }; if ($this->mch_list) { $mch_list = json_decode($this->mch_list, true); if (is_array($mch_list)) { foreach ($mch_list as $i => $mch) { if (is_array($mch['list'])) { foreach ($mch['list'] as $j => $item) { $cart = Cart::findOne([ 'type'=>$type, 'id' => $item['cart_id'], 'user_id' => $this->user_id, ]); if (!$cart) { continue; } $cart->num = intval($item['num']); $cart->save(); } } } } } return [ 'code' => 0, 'msg' => 'success', ]; } }