's'] ]; } // 走过验证后 查询相应数据 public function afterValidate() { $this->user = User::findOne($this->user_id); $this->level = $this->getLevelData(); $this->integral = [ 'forehead' => 0, 'forehead_integral' => 0, 'integration' => Option::get(OptionSetting::STORE_INTEGRATION, get_store_id(), 'gift', Option::get(OptionSetting::STORE_INTEGRATION, get_store_id(), 'store')['value'])['value'] ]; $this->saas_user = SaasUser::findOne(['mobile' => $this->user->binding]); parent::afterValidate(); } protected function getLevelData() { $level = Level::find()->select([ 'name', 'level', 'discount', ])->where(['level' => $this->user->level, 'store_id' => $this->store_id, 'is_delete' => 0]) ->asArray()->one(); return $level; } public function search() { if (!$this->validate()) { return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]]; } $this->attr_list = json_decode($this->attr_list, true); $goods = Goods::findOne($this->goods_id); if (!$goods) { return [ 'code' => 0, 'msg' => '商品不存在' ]; } // $res = $goods->getAttrInfo($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; } } //秒杀活动 $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'] - $seckill_activity_arr['sale_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']; // } } $otherData = [ 'goods_id' => $goods->id, 'user_id' => $this->user_id ]; $this->user && $otherData = array_merge($otherData, ['user'=> $this->user]); $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $goods->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, $otherData, $this->number); foreach($res['attr_list'] as &$item){ $item['attr_group_id'] = Attr::findOne($item['attr_id'])->attr_group_id; } $warn_goods_timeout = Goods::warn_goods_timeout($goods->store_id); $res['timeout_day'] = $goods->time_made_day ? date('Y-m-d', $goods->time_made_day + 86400 * $goods->time_shelf_life) : ''; $res['is_warn_goods_timeout'] = ($goods->time_made_day && ($goods->time_made_day + 86400 * $goods->time_shelf_life) < (time() + $warn_goods_timeout * 86400)) ? 1 : 0; return [ 'code' => 0, 'data' => $res ]; } }