's'], [['is_pt', 'is_seckill'], 'safe'] ]; } public function search() { if (!$this->validate()) { return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]]; } $attrList = json_decode($this->attr_list, true); if(!$attrList || !is_array($attrList)){ $attrList = explode(',', $this->attr_list); } $this->attr_list = $attrList; $goods = Goods::findOne($this->goods_id); if (!$goods) { return [ 'code' => 0, 'msg' => '商品不存在' ]; } // $res = $goods->getAttrInfo($this->attr_list); foreach ($this->attr_list as $index => $value) { if ($value < 0) { unset($this->attr_list[$index]); } } $this->attr_list = array_values($this->attr_list); $GoodsFullMinus = GoodsFullMinus::find() ->select('*') ->where(['store_id' => get_store_id(),'goods_id' => $goods->id]) ->orderBy('full_minus_num ASC')->asArray()->all(); // 门店逻辑 $attr = $goods->attr; $price = $goods->price; if (get_md_id()) { $md_goods = MdGoods::findOne(['goods_id' => $goods->id, 'md_id' => get_md_id()]); if ($md_goods) { $attr = $md_goods->attr; $price = $md_goods->price; } } //新人专享活动 $activityAt = ActivityNewUser::activityAt($goods->store_id); 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); $ext_price = 0; //计算购物车当前数量与下单数量是否大于额定数量,若小于额定数量则将价格改为新人专享价格 START $price_open = false; $buy_limit = $activityAt->buy_limit; $attr = json_decode($attr, true); if ($buy_limit && $buy_limit > 0) { $open = false; //部分享受优惠 $goodsNum = intval(Goods::getBuyNum(get_user(), $goods->id)); if ($goodsNum < $buy_limit) { $open = true; } //获取购物车中的数量 $cart = Cart::findOne([ 'type'=>Cart::TYPE_DEFAULT, 'store_id' => $goods->store_id, 'goods_id' => $goods->id, 'user_id' => get_user_id(), 'is_delete' => 0 ]); $cart_num = 0; if ($cart) { $cart_num = $cart->num ?: 0; } $total_num = $cart_num + $goodsNum; if ($open && $total_num < $buy_limit) { $price_open = true; } if ($price_open) { $open = false; foreach($ext_attrs as $ext_attr){ $ext_attr_id = array_column($ext_attr['attr_list'], 'attr_id'); foreach($attr as &$attr_item){ $attr_id = array_column($attr_item['attr_list'], 'attr_id'); sort($ext_attr_id); sort($attr_id); if($attr_id == $ext_attr_id){ $attr_item['price'] = $ext_attr['price']; } sort($this->attr_list); if (empty(array_diff($attr_id, $this->attr_list))) { $open = true; $ext_price = $attr_item['price']; } } } if ($open) { $is_level = false; $GoodsFullMinus = []; } $price = $ext_price ?: $price; } } $attr = json_encode($attr, JSON_UNESCAPED_UNICODE); } //END } $seckill_activity_goods = []; if ($this->is_seckill) { //秒杀活动 $seckill_activity_goods = SeckillActivityGoods::find()->alias('sag')->where(['sag.goods_id' => $goods->id]) ->leftJoin(['sa' => SeckillActivity::tableName()], 'sag.activity_id = sa.id') ->andWhere(['AND', ['sa.is_delete' => 0], ['>', 'sa.end_time', time()], ['sag.is_delete' => 0]]) ->select('sa.id, sa.self_limit_num, sa.order_limit_num, sa.start_time, sa.end_time, sag.attr, sag.seckill_num, sag.seckill_price, sag.use_attr, sag.sale_num, sag.virtual_sales')->asArray()->all(); } $seckill_activity_arr = []; if (!empty($seckill_activity_goods)) { $last_names = array_column($seckill_activity_goods,'start_time'); array_multisort($last_names, SORT_ASC, $seckill_activity_goods); foreach ($seckill_activity_goods as $activity_good) { $activity_good['progress'] = sprintf('%.2f', (($activity_good['sale_num'] + $activity_good['virtual_sales']) / ($activity_good['seckill_num'] + $activity_good['virtual_sales'])) * 100); $activity_good['price'] = $goods->price; if ($activity_good['start_time'] < time()) { //活动进行中 前端展示距离结束 $activity_good['status'] = 1; $seckill_activity_arr = $activity_good; goto seckill_activity_arr; } if ($activity_good['start_time'] >= time()) {//活动进行中 前端展示距离开始 $activity_good['status'] = 2; $seckill_activity_arr = $activity_good; goto seckill_activity_arr; } } seckill_activity_arr: } if (!empty($seckill_activity_arr)) { $seckill_activity_arr['attr'] = json_decode($seckill_activity_arr['attr'], true); $GoodsFullMinus = []; $goods->is_level = 0; // if ((int)$goods->use_attr === 1 && !empty($seckill_activity_arr['attr'])) { $open = false; foreach ($seckill_activity_arr['attr'] as $sag_attr) { $sag_attr_id = array_column($sag_attr['attr_list'], 'attr_id'); $new_attr[] = $sag_attr; //与购物车添加的规格id数组比较 if (empty(array_diff($sag_attr_id, $this->attr_list))) { $open = true; } } if ($open) { foreach ($seckill_activity_arr['attr'] as &$sag_attr) { $num = $sag_attr['seckill_num']; $sag_attr['price'] = $sag_attr['seckill_price']; $sag_attr['num'] = $num > 0 ? $num : 0; } $attr = json_encode($seckill_activity_arr['attr']); } $price = $seckill_activity_arr['attr'][0]['seckill_price']; // } else { // $price = $seckill_activity_arr['attr'][0]['seckill_price']; // } } $is_level = $goods->is_level; //拼团活动 if ((int)$this->is_pt) { $pt_activity_goods = PtActivityGoods::find()->alias('pag')->where(['pag.goods_id' => $goods->id]) ->leftJoin(['pa' => PtActivity::tableName()], 'pag.activity_id = pa.id') ->andWhere(['AND', ['pa.is_delete' => 0], ['>', 'pa.end_time', time()], ['<', 'start_time', time()], ['pag.is_delete' => 0]]) ->select('pa.id, pa.party_size, pa.party_type, pa.party_goods_count, pa.join_num, pa.start_time, pa.end_time, pag.attr, pag.pt_price, pag.use_attr, pag.sale_num, pag.virtual_sales')->asArray()->one(); if (!empty($pt_activity_goods)) { $pt_activity_goods['attr'] = json_decode($pt_activity_goods['attr'], true); $open = false; foreach ($pt_activity_goods['attr'] as &$pt_attr) { $pt_attr_id = array_column($pt_attr['attr_list'], 'attr_id'); sort($pt_attr_id); sort($this->attr_list); //与购物车添加的规格id数组比较 // array_splice($this->attr_list, 0, 1); if (empty(array_diff($pt_attr_id, $this->attr_list))) { $open = true; $pt_attr['price'] = $pt_attr['pt_price']; } } if ($open) { $attr = json_encode($pt_activity_goods['attr']); } $price = $pt_activity_goods['attr'][0]['pt_price']; } $is_level = false; } $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']; } $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $is_level, 'mch_id' => $goods->mch_id, 'full_minus' => $GoodsFullMinus, 'unit' => $goods->unit, 'use_attr' => $goods->use_attr, ]; $res = CommonGoods::currentGoodsAttr($goodsData, (array) $this->attr_list, [], $this->number); $user = get_user(); if($user && $goods['stbz_goods_id']){ // $res['num'] % 2 && $res['num'] = 0; $addressData = \app\models\Address::find()->where([ 'user_id' => get_saas_user_id(), 'is_default' => 1, 'is_delete' => 0, ])->limit(1)->one(); if($addressData){ $params = []; $params['address'] = [ "area"=>$addressData['district'],//区 "city"=>$addressData['city'],//市 "consignee"=>$addressData['name'],//收件人 "description"=>$addressData['detail'],//详细地址 "phone"=>$addressData['mobile'],//联系电话 "province"=>$addressData['province'],//省 "street"=>'',//街道 "freight"=>1 * 100,//运费 单位分 ]; $spu = [ 'number' => 1, 'sku' => $res['no'], ]; $params['spu'] = $spu; // debug_log('胜天半子可售检测' . json_encode($spu)); $checkData = \stbz_client()->getApiResponse('get', '/v2/order/availableCheck', $params); // var_dump($params, $checkData);die; $checkData = \json_decode($checkData, true); $res['availableCheck'] = $checkData; // debug_log('胜天半子可售检测' . json_encode($checkData)); if ($checkData['code'] == 1) { if($checkData['data']['code'] == 1){ if($checkData['data']['data']['ban']){ $res['num'] = 0; } } } } } return [ 'code' => 0, 'data' => $res ]; } }