| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- namespace addons\Seckill\api\modules\v1\controllers;
- use addons\Seckill\common\logic\ActivityLogic;
- use common\enums\StatusEnum;
- use addons\Seckill\common\models\SeckillActivity;
- use common\models\goods\Goods;
- use common\models\goods\GoodsAttr;
- use common\models\user\UserPartitionRelationship;
- use Yii;
- use api\controllers\OnAuthController;
- use Exception;
- /**
- * 活动控制器
- *
- * Class ActivityController
- * @package addons\Seckill\api\modules\v1\controllers
- */
- class ActivityController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['index', 'info'];
- /**
- * 活动列表
- */
- public function actionIndex()
- {
- try{
- //缓存记录未开始,已结束
- $activity_status = \Yii::$app->request->get('status', SeckillActivity::ACTIVITY_STATUS_ING);
- $status_map = SeckillActivity::getActivityStatusMap();
- if(!array_key_exists($activity_status,$status_map)){
- $activity_status = SeckillActivity::ACTIVITY_STATUS_ING;
- }
- $wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE]];
- $time = time();
- switch ($activity_status) {
- case SeckillActivity::ACTIVITY_STATUS_WAIT:
- // 未开始
- $wheres[] = ['and', ['>=', 'begin_time', $time], ['<=', 'hot_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;
- }
- $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',
- ];
- $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');
- $attr_ids = array_column($data['list'], 'attr_id');
- $goods_attr_list = GoodsAttr::find() ->select('id,price')->where(['id' => $attr_ids])->asArray()->all();
- $goods_attr_list = array_column($goods_attr_list,null,'id');
- 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['goods_original_price'] = $goods_attr_list[$list['attr_id']]['price'] ?? 0;
- $list['sale_percent'] = $list['stock'] > 0 ? bcdiv($list['sale_nums'],$list['stock'],2) : 0;
- }
- $status_map = SeckillActivity::getActivityStatusMap();
- $data['status_map'] = $status_map;
- return $this->success('请求成功', $data);
- }catch(Exception $e){
- return $this->error($e->getMessage());
- }
- }
- /**
- * 活动商品详情
- * @return mixed|void
- */
- public function actionInfo()
- {
- try{
- $activity_id = \Yii::$app->request->get('activity_id', 0);
- //$wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE],['=','id',$activity_id]];
- $info = SeckillActivity::getActivityByCache($activity_id);
- if(!$info){
- throw new Exception('活动不存在');
- }
- if($info['mall_id'] != $this->mall_id){
- throw new Exception('活动不存在');
- }
- $info['remain_time'] = 0; //活动剩余时间:秒
- if($info['activity_status'] == SeckillActivity::ACTIVITY_STATUS_ING){
- //活动开始:获取库存信息
- $info['now_stock'] = ActivityLogic::getNowStock($activity_id);
- $info['sale_nums'] = ($info['stock'] - $info['now_stock']) > 0 ? $info['stock'] - $info['now_stock'] : 0;
- $info['remain_time'] = ($info['end_time'] - time()) > 0 ? $info['end_time'] - time() : 0;
- $info['goods']['stock'] = $info['now_stock'];
- }
- if($info['activity_status'] == SeckillActivity::ACTIVITY_STATUS_WAIT){
- $info['remain_time'] = ($info['begin_time'] - time()) > 0 ? $info['begin_time'] - time() : 0;
- }
- $info['goods']['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0);
- return $this->success('请求成功', $info);
- }catch(Exception $e){
- return $this->error($e->getMessage());
- }
- }
-
-
- }
|