| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- <?php
- namespace addons\Seckill\backend\controllers;
- use addons\Seckill\common\enums\SeckillEnum;
- use addons\Seckill\common\logic\ActivityLogic;
- use common\enums\StatusEnum;
- use common\models\goods\Goods;
- use addons\Seckill\common\models\SeckillActivity;
- use common\models\goods\GoodsAttr;
- use common\models\goods\GoodsMarketing;
- /**
- * 活动控制器
- *
- * Class ActivityController
- * @package addons\Seckill\backend\controllers
- */
- class ActivityController extends BaseController
- {
- public $enableCsrfValidation = false;
- /**
- * 首页
- *
- * @return string
- */
- public function actionIndex()
- {
- return $this->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);
- }
- }
|