ActivityController.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?php
  2. namespace addons\Seckill\backend\controllers;
  3. use addons\Seckill\common\enums\SeckillEnum;
  4. use addons\Seckill\common\logic\ActivityLogic;
  5. use common\enums\StatusEnum;
  6. use common\models\goods\Goods;
  7. use addons\Seckill\common\models\SeckillActivity;
  8. use common\models\goods\GoodsAttr;
  9. use common\models\goods\GoodsMarketing;
  10. /**
  11. * 活动控制器
  12. *
  13. * Class ActivityController
  14. * @package addons\Seckill\backend\controllers
  15. */
  16. class ActivityController extends BaseController
  17. {
  18. public $enableCsrfValidation = false;
  19. /**
  20. * 首页
  21. *
  22. * @return string
  23. */
  24. public function actionIndex()
  25. {
  26. return $this->render('/default/index');
  27. }
  28. /**
  29. * 活动列表接口
  30. * @return mixed|void
  31. */
  32. public function actionList()
  33. {
  34. try {
  35. $activity_status = \Yii::$app->request->get('activity_status') ?? 0;
  36. $search_begin_time = \Yii::$app->request->get('search_begin_time') ?? '';
  37. $search_end_time = \Yii::$app->request->get('search_end_time') ?? '';
  38. $page = \Yii::$app->request->get('page', 1);
  39. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  40. $wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE]];
  41. if (!empty($activity_status)) {
  42. $time = time();
  43. $wheres[] = ['status' => StatusEnum::ENABLED];
  44. switch ($activity_status) {
  45. case SeckillActivity::ACTIVITY_STATUS_WAIT:
  46. // 未开始
  47. $wheres[] = ['>=', 'begin_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. }
  59. if($search_begin_time && $search_end_time){
  60. //活动开始时间搜索
  61. $search_begin_time = strtotime($search_begin_time);
  62. $search_end_time = strtotime($search_end_time);
  63. $wheres[] = ['and', ['>=', 'begin_time', $search_begin_time], ['<=', 'begin_time', $search_end_time]];
  64. }
  65. $params = [
  66. //'select' => 'id,cate_id,title,start_time,end_time,group_num,random_win_num,virtual_num,created_at,status',
  67. 'where' => $wheres,
  68. 'order' => 'id desc',
  69. 'page' => $page,
  70. 'limit' => $limit,
  71. ];
  72. $data = SeckillActivity::listPage($params);
  73. if (false === $data['list']) {
  74. return $this->error(SeckillActivity::getStaticError());
  75. }
  76. $goods_ids = array_column($data['list'], 'goods_id');
  77. $goods_list = Goods::find()
  78. ->select('id as goods_id,goods_name,price,original_price,cover_pic,status,stock as goods_stock')
  79. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_ids])
  80. ->asArray()
  81. ->all();
  82. $goods_list = array_column($goods_list,null,'goods_id');
  83. $status_map = SeckillActivity::getActivityStatusMap();
  84. foreach ($data['list'] as &$list) {
  85. $list['goods_name'] = $goods_list[$list['goods_id']]['goods_name'] ?? '';
  86. $list['cover_pic'] = $goods_list[$list['goods_id']]['cover_pic'] ?? '';
  87. $list['activity_status'] = SeckillActivity::checkActivityStatus($list['begin_time'],$list['end_time']);
  88. $list['begin_time'] = date('Y-m-d H:i:s',$list['begin_time']);
  89. $list['end_time'] = date('Y-m-d H:i:s',$list['end_time']);
  90. $list['hot_time'] = date('Y-m-d H:i:s',$list['hot_time']);
  91. $list['now_stock'] = ($list['stock'] - $list['sale_nums']) > 0 ? ($list['stock'] - $list['sale_nums']) : 0;
  92. $list['activity_status_msg'] = $status_map[$list['activity_status']] ?? '';
  93. }
  94. $data['status_map'] = $status_map;
  95. return $this->success('请求成功', $data);
  96. } catch (\Exception $exception) {
  97. return $this->error($exception->getMessage());
  98. }
  99. }
  100. /**
  101. * 保存活动
  102. * @return mixed|void
  103. */
  104. public function actionSave()
  105. {
  106. try {
  107. if (!\Yii::$app->request->isPost) {
  108. throw new \ErrorException('NOT IS POST!');
  109. }
  110. $params = \Yii::$app->request->post();
  111. $res = \Yii::$app->services->validate
  112. ->validate(
  113. $params,
  114. [
  115. [['title', 'goods_id', 'begin_time', 'end_time', 'stock', 'price'], 'required'],
  116. [['goods_id', 'stock', 'id','attr_id', 'limit_nums'], 'integer'],
  117. [['title'], 'string', 'max' => 64],
  118. [['begin_time', 'end_time', 'hot_time'], 'string', 'max' => 20],
  119. ]
  120. );
  121. if ($res === false) {
  122. throw new \ErrorException(\Yii::$app->services->validate->getErrorMessage());
  123. }
  124. $params['begin_time'] = strtotime($params['begin_time']);
  125. $params['end_time'] = strtotime($params['end_time']);
  126. $params['hot_time'] = strtotime($params['hot_time']);
  127. // 活动每次设置后,“已售数量”都应该归0,否则,这次活动结束后,继续开启下一次,“已售数量”就会在上一次活动的基础上一直叠加,让人误会。
  128. $params['sale_nums'] = 0;
  129. if ($params['begin_time'] >= $params['end_time']) {
  130. //活动时间有误
  131. throw new \ErrorException('活动时间有误');
  132. }
  133. if ($params['hot_time'] >= $params['begin_time']) {
  134. throw new \ErrorException('活动预热时间应在活动开始之前');
  135. }
  136. $res = SeckillActivity::setData($this->mall_id, $params);
  137. if ($res === false) {
  138. return $this->error(SeckillActivity::getStaticError());
  139. }
  140. return $this->success('操作成功');
  141. } catch (\ErrorException $errorException) {
  142. return $this->error($errorException->getMessage());
  143. } catch (\Exception $exception) {
  144. return $this->error($exception->getMessage());
  145. }
  146. }
  147. /**
  148. * 删除
  149. * @return mixed|void
  150. */
  151. public function actionDelete()
  152. {
  153. if (!\Yii::$app->request->isPost) {
  154. return $this->error('请求方式错误');
  155. }
  156. $id = \Yii::$app->request->post('id');
  157. if (empty($id)) {
  158. return $this->error('参数错误');
  159. }
  160. $activity = SeckillActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $id]);
  161. if (empty($activity)) {
  162. return $this->error('活动不存在');
  163. }
  164. $activity->status = StatusEnum::DELETE;
  165. $res = $activity->save();
  166. if (false === $res) {
  167. return $this->error('删除失败');
  168. }
  169. // 删除对应的营销信息
  170. $goodsMarketing = GoodsMarketing::findOne([
  171. 'mall_id' => $this->mall_id,
  172. 'goods_id' => $activity->goods_id,
  173. 'marketing_id' => $activity->id,
  174. 'marketing_type' => SeckillEnum::ADDONS_NAME,
  175. 'status' => StatusEnum::ENABLED,
  176. ]);
  177. if ($goodsMarketing) {
  178. $goodsMarketing->status = StatusEnum::DELETE;
  179. $goodsMarketing->save();
  180. }
  181. return $this->success('删除成功');
  182. }
  183. /**
  184. * 获取商品规格
  185. * @return mixed|void
  186. */
  187. public function actionGetGoodsAttr()
  188. {
  189. $goods_id = \Yii::$app->request->get('goods_id') ?? 0;
  190. $attrs = GoodsAttr::find()->where(['goods_id' => $goods_id,'status' => StatusEnum::ENABLED])->asArray()->all();
  191. if($attrs && count($attrs) == 1){
  192. $attrs[0]['name'] = $attrs[0]['name'] ?: '默认规格';
  193. }
  194. return $this->success('请求成功', $attrs);
  195. }
  196. /**
  197. * 活动详情
  198. * @return mixed|void
  199. */
  200. public function actionInfo()
  201. {
  202. $activity_id = \Yii::$app->request->get('id') ?? 0;
  203. $activity = SeckillActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $activity_id]);
  204. if(!$activity){
  205. return $this->error('活动不存在');
  206. }
  207. $activity = $activity->toArray();
  208. $activity['hot_time'] = date('Y-m-d H:i:s',$activity['hot_time']);
  209. $activity['begin_time'] = date('Y-m-d H:i:s',$activity['begin_time']);
  210. $activity['end_time'] = date('Y-m-d H:i:s',$activity['end_time']);
  211. //返回商品
  212. $activity['goods'] = Goods::find()
  213. ->select('id as goods_id,goods_name,price,original_price,cover_pic,status,stock as goods_stock')
  214. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $activity['goods_id']])
  215. ->asArray()
  216. ->one();
  217. $activity['goods_attr'] = GoodsAttr::find()->where(['id' => $activity['attr_id']])->asArray()->one();
  218. $activity['goods_attr']['name'] = $activity['goods_attr']['name'] ?: '默认规格';
  219. return $this->success('请求成功', $activity);
  220. }
  221. }