render('/default/index'); } /** * 活动列表接口 * @return mixed|void */ public function actionList() { try { $activity_status = \Yii::$app->request->get('activity_status') ?? 0; $search_begin_time = \Yii::$app->request->get('search_begin_time') ?? ''; $search_end_time = \Yii::$app->request->get('search_end_time') ?? ''; $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE]]; if (!empty($activity_status)) { $time = time(); $wheres[] = ['status' => StatusEnum::ENABLED]; switch ($activity_status) { case SeckillActivity::ACTIVITY_STATUS_WAIT: // 未开始 $wheres[] = ['>=', 'begin_time', $time]; break; case SeckillActivity::ACTIVITY_STATUS_ING: // 进行中 $wheres[] = ['and', ['<=', 'begin_time', $time], ['>=', 'end_time', $time]]; break; case SeckillActivity::ACTIVITY_STATUS_END: // 已结束 $wheres[] = ['<=', 'end_time', $time]; break; } } if($search_begin_time && $search_end_time){ //活动开始时间搜索 $search_begin_time = strtotime($search_begin_time); $search_end_time = strtotime($search_end_time); $wheres[] = ['and', ['>=', 'begin_time', $search_begin_time], ['<=', 'begin_time', $search_end_time]]; } $params = [ //'select' => 'id,cate_id,title,start_time,end_time,group_num,random_win_num,virtual_num,created_at,status', 'where' => $wheres, 'order' => 'id desc', 'page' => $page, 'limit' => $limit, ]; $data = SeckillActivity::listPage($params); if (false === $data['list']) { return $this->error(SeckillActivity::getStaticError()); } $goods_ids = array_column($data['list'], 'goods_id'); $goods_list = Goods::find() ->select('id as goods_id,goods_name,price,original_price,cover_pic,status,stock as goods_stock') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_ids]) ->asArray() ->all(); $goods_list = array_column($goods_list,null,'goods_id'); $status_map = SeckillActivity::getActivityStatusMap(); foreach ($data['list'] as &$list) { $list['goods_name'] = $goods_list[$list['goods_id']]['goods_name'] ?? ''; $list['cover_pic'] = $goods_list[$list['goods_id']]['cover_pic'] ?? ''; $list['activity_status'] = SeckillActivity::checkActivityStatus($list['begin_time'],$list['end_time']); $list['begin_time'] = date('Y-m-d H:i:s',$list['begin_time']); $list['end_time'] = date('Y-m-d H:i:s',$list['end_time']); $list['hot_time'] = date('Y-m-d H:i:s',$list['hot_time']); $list['now_stock'] = ($list['stock'] - $list['sale_nums']) > 0 ? ($list['stock'] - $list['sale_nums']) : 0; $list['activity_status_msg'] = $status_map[$list['activity_status']] ?? ''; } $data['status_map'] = $status_map; return $this->success('请求成功', $data); } catch (\Exception $exception) { return $this->error($exception->getMessage()); } } /** * 保存活动 * @return mixed|void */ public function actionSave() { try { if (!\Yii::$app->request->isPost) { throw new \ErrorException('NOT IS POST!'); } $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate ->validate( $params, [ [['title', 'goods_id', 'begin_time', 'end_time', 'stock', 'price'], 'required'], [['goods_id', 'stock', 'id','attr_id', 'limit_nums'], 'integer'], [['title'], 'string', 'max' => 64], [['begin_time', 'end_time', 'hot_time'], 'string', 'max' => 20], ] ); if ($res === false) { throw new \ErrorException(\Yii::$app->services->validate->getErrorMessage()); } $params['begin_time'] = strtotime($params['begin_time']); $params['end_time'] = strtotime($params['end_time']); $params['hot_time'] = strtotime($params['hot_time']); // 活动每次设置后,“已售数量”都应该归0,否则,这次活动结束后,继续开启下一次,“已售数量”就会在上一次活动的基础上一直叠加,让人误会。 $params['sale_nums'] = 0; if ($params['begin_time'] >= $params['end_time']) { //活动时间有误 throw new \ErrorException('活动时间有误'); } if ($params['hot_time'] >= $params['begin_time']) { throw new \ErrorException('活动预热时间应在活动开始之前'); } $res = SeckillActivity::setData($this->mall_id, $params); if ($res === false) { return $this->error(SeckillActivity::getStaticError()); } return $this->success('操作成功'); } catch (\ErrorException $errorException) { return $this->error($errorException->getMessage()); } catch (\Exception $exception) { return $this->error($exception->getMessage()); } } /** * 删除 * @return mixed|void */ public function actionDelete() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $id = \Yii::$app->request->post('id'); if (empty($id)) { return $this->error('参数错误'); } $activity = SeckillActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $id]); if (empty($activity)) { return $this->error('活动不存在'); } $activity->status = StatusEnum::DELETE; $res = $activity->save(); if (false === $res) { return $this->error('删除失败'); } // 删除对应的营销信息 $goodsMarketing = GoodsMarketing::findOne([ 'mall_id' => $this->mall_id, 'goods_id' => $activity->goods_id, 'marketing_id' => $activity->id, 'marketing_type' => SeckillEnum::ADDONS_NAME, 'status' => StatusEnum::ENABLED, ]); if ($goodsMarketing) { $goodsMarketing->status = StatusEnum::DELETE; $goodsMarketing->save(); } return $this->success('删除成功'); } /** * 获取商品规格 * @return mixed|void */ public function actionGetGoodsAttr() { $goods_id = \Yii::$app->request->get('goods_id') ?? 0; $attrs = GoodsAttr::find()->where(['goods_id' => $goods_id,'status' => StatusEnum::ENABLED])->asArray()->all(); if($attrs && count($attrs) == 1){ $attrs[0]['name'] = $attrs[0]['name'] ?: '默认规格'; } return $this->success('请求成功', $attrs); } /** * 活动详情 * @return mixed|void */ public function actionInfo() { $activity_id = \Yii::$app->request->get('id') ?? 0; $activity = SeckillActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $activity_id]); if(!$activity){ return $this->error('活动不存在'); } $activity = $activity->toArray(); $activity['hot_time'] = date('Y-m-d H:i:s',$activity['hot_time']); $activity['begin_time'] = date('Y-m-d H:i:s',$activity['begin_time']); $activity['end_time'] = date('Y-m-d H:i:s',$activity['end_time']); //返回商品 $activity['goods'] = Goods::find() ->select('id as goods_id,goods_name,price,original_price,cover_pic,status,stock as goods_stock') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $activity['goods_id']]) ->asArray() ->one(); $activity['goods_attr'] = GoodsAttr::find()->where(['id' => $activity['attr_id']])->asArray()->one(); $activity['goods_attr']['name'] = $activity['goods_attr']['name'] ?: '默认规格'; return $this->success('请求成功', $activity); } }