ActivityController.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace addons\Seckill\api\modules\v1\controllers;
  3. use addons\Seckill\common\logic\ActivityLogic;
  4. use common\enums\StatusEnum;
  5. use addons\Seckill\common\models\SeckillActivity;
  6. use common\models\goods\Goods;
  7. use common\models\goods\GoodsAttr;
  8. use common\models\user\UserPartitionRelationship;
  9. use Yii;
  10. use api\controllers\OnAuthController;
  11. use Exception;
  12. /**
  13. * 活动控制器
  14. *
  15. * Class ActivityController
  16. * @package addons\Seckill\api\modules\v1\controllers
  17. */
  18. class ActivityController extends OnAuthController
  19. {
  20. public $modelClass = '';
  21. /**
  22. * 不用进行登录验证的方法
  23. *
  24. * 例如: ['index', 'update', 'create', 'view', 'delete']
  25. * 默认全部需要验证
  26. *
  27. * @var array
  28. */
  29. protected $authOptional = ['index', 'info'];
  30. /**
  31. * 活动列表
  32. */
  33. public function actionIndex()
  34. {
  35. try{
  36. //缓存记录未开始,已结束
  37. $activity_status = \Yii::$app->request->get('status', SeckillActivity::ACTIVITY_STATUS_ING);
  38. $status_map = SeckillActivity::getActivityStatusMap();
  39. if(!array_key_exists($activity_status,$status_map)){
  40. $activity_status = SeckillActivity::ACTIVITY_STATUS_ING;
  41. }
  42. $wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE]];
  43. $time = time();
  44. switch ($activity_status) {
  45. case SeckillActivity::ACTIVITY_STATUS_WAIT:
  46. // 未开始
  47. $wheres[] = ['and', ['>=', 'begin_time', $time], ['<=', 'hot_time', $time]];
  48. break;
  49. case SeckillActivity::ACTIVITY_STATUS_ING:
  50. // 进行中
  51. $wheres[] = ['and', ['<=', 'begin_time', $time], ['>=', 'end_time', $time]];
  52. break;
  53. case SeckillActivity::ACTIVITY_STATUS_END:
  54. // 已结束
  55. $wheres[] = ['<=', 'end_time', $time];
  56. break;
  57. }
  58. $params = [
  59. //'select' => 'id,cate_id,title,start_time,end_time,group_num,random_win_num,virtual_num,created_at,status',
  60. 'where' => $wheres,
  61. 'order' => 'id desc',
  62. ];
  63. $data = SeckillActivity::listPage($params);
  64. if (false === $data['list']) {
  65. return $this->error(SeckillActivity::getStaticError());
  66. }
  67. $goods_ids = array_column($data['list'], 'goods_id');
  68. $goods_list = Goods::find()
  69. ->select('id as goods_id,goods_name,price,original_price,cover_pic,status,stock as goods_stock')
  70. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_ids])
  71. ->asArray()
  72. ->all();
  73. $goods_list = array_column($goods_list,null,'goods_id');
  74. $attr_ids = array_column($data['list'], 'attr_id');
  75. $goods_attr_list = GoodsAttr::find() ->select('id,price')->where(['id' => $attr_ids])->asArray()->all();
  76. $goods_attr_list = array_column($goods_attr_list,null,'id');
  77. foreach ($data['list'] as &$list) {
  78. $list['goods_name'] = $goods_list[$list['goods_id']]['goods_name'] ?? '';
  79. $list['cover_pic'] = $goods_list[$list['goods_id']]['cover_pic'] ?? '';
  80. $list['activity_status'] = SeckillActivity::checkActivityStatus($list['begin_time'],$list['end_time']);
  81. $list['begin_time'] = date('Y-m-d H:i:s',$list['begin_time']);
  82. $list['end_time'] = date('Y-m-d H:i:s',$list['end_time']);
  83. $list['hot_time'] = date('Y-m-d H:i:s',$list['hot_time']);
  84. $list['now_stock'] = ($list['stock'] - $list['sale_nums']) > 0 ? ($list['stock'] - $list['sale_nums']) : 0;
  85. $list['goods_original_price'] = $goods_attr_list[$list['attr_id']]['price'] ?? 0;
  86. $list['sale_percent'] = $list['stock'] > 0 ? bcdiv($list['sale_nums'],$list['stock'],2) : 0;
  87. }
  88. $status_map = SeckillActivity::getActivityStatusMap();
  89. $data['status_map'] = $status_map;
  90. return $this->success('请求成功', $data);
  91. }catch(Exception $e){
  92. return $this->error($e->getMessage());
  93. }
  94. }
  95. /**
  96. * 活动商品详情
  97. * @return mixed|void
  98. */
  99. public function actionInfo()
  100. {
  101. try{
  102. $activity_id = \Yii::$app->request->get('activity_id', 0);
  103. //$wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE],['=','id',$activity_id]];
  104. $info = SeckillActivity::getActivityByCache($activity_id);
  105. if(!$info){
  106. throw new Exception('活动不存在');
  107. }
  108. if($info['mall_id'] != $this->mall_id){
  109. throw new Exception('活动不存在');
  110. }
  111. $info['remain_time'] = 0; //活动剩余时间:秒
  112. if($info['activity_status'] == SeckillActivity::ACTIVITY_STATUS_ING){
  113. //活动开始:获取库存信息
  114. $info['now_stock'] = ActivityLogic::getNowStock($activity_id);
  115. $info['sale_nums'] = ($info['stock'] - $info['now_stock']) > 0 ? $info['stock'] - $info['now_stock'] : 0;
  116. $info['remain_time'] = ($info['end_time'] - time()) > 0 ? $info['end_time'] - time() : 0;
  117. $info['goods']['stock'] = $info['now_stock'];
  118. }
  119. if($info['activity_status'] == SeckillActivity::ACTIVITY_STATUS_WAIT){
  120. $info['remain_time'] = ($info['begin_time'] - time()) > 0 ? $info['begin_time'] - time() : 0;
  121. }
  122. $info['goods']['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0);
  123. return $this->success('请求成功', $info);
  124. }catch(Exception $e){
  125. return $this->error($e->getMessage());
  126. }
  127. }
  128. }