request->isAjax || \Yii::$app->request->post('flag', '') === 'EXPORT') { if (\Yii::$app->request->isGet) { $title = \Yii::$app->request->get('title'); $activity_id = \Yii::$app->request->get('activity_id'); $activity_status = \Yii::$app->request->get('activity_status'); $start_time = \Yii::$app->request->get('start_time'); $end_time = \Yii::$app->request->get('end_time'); $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $time = date('H:i:s', time()); $wheres[] = ['and', ['mall_id' => $this->mall_id], ['!=', 'status', StatusEnum::DELETE]]; if (!empty($title)) { $wheres[] = ['like', 'title', $title]; } if (!empty($start_time)) { $wheres[] = ['>=', 'created_at', strtotime($start_time . ' 00:00:00')]; } if (!empty($end_time)) { $wheres[] = ['<=', 'created_at', strtotime($end_time . ' 23:59:59')]; } if (!empty($activity_id)) { $wheres[] = ['id' => $activity_id]; } if (!empty($activity_status)) { if (LuckyGroupEnum::ACTIVITY_STATUS_DISABLED == $activity_status) { $wheres[] = ['status' => StatusEnum::DISABLED]; } else { $wheres[] = ['status' => StatusEnum::ENABLED]; switch ($activity_status) { case LuckyGroupEnum::ACTIVITY_STATUS_NOT_START: // 未开始 $wheres[] = ['>=', 'start_time', $time]; break; case LuckyGroupEnum::ACTIVITY_STATUS_RUNNING: // 进行中 $wheres[] = ['and', ['<=', 'start_time', $time], ['>=', 'end_time', $time]]; break; case LuckyGroupEnum::ACTIVITY_STATUS_FINISHED: // 已结束 $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' => 'created_at desc', 'page' => $page, 'limit' => $limit, ]; //导出数据 if (\Yii::$app->request->post('flag') === 'EXPORT') { // $data = LuckyGroupActivity::listPage($params, false, true, true); // $exp = new LuckyGroupActivityExport(); // $exp->fieldsKeyList = explode(',', \Yii::$app->request->post('fields')); // $exp->export($data); // return; } $data = LuckyGroupActivity::listPage($params); // $data['exportList'] = (new LuckyGroupActivityExport())->fieldsList(); if (false === $data['list']) { return $this->error(LuckyGroupActivity::getStaticError()); } $activity_ids = array_column($data['list'], 'id'); $activity_goods = LuckyGroupGoods::find() ->select('activity_id,count(goods_id) as number') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_ids]) ->groupBy('activity_id') ->asArray() ->indexBy('activity_id') ->all(); // dd($activity_goods, $activity_ids); foreach ($data['list'] as &$list) { $activity_good = $activity_goods[$list['id']] ?? []; $list['relate_good_number'] = $activity_good['number'] ?? 0; if ($list['status'] == StatusEnum::DISABLED) { $list['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_DISABLED; } else { $start_time = strtotime($list['start_time']); $end_time = strtotime($list['end_time']); if ($start_time > strtotime($time)) { $list['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_NOT_START; } else if ($end_time <= strtotime($time)) { $list['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_FINISHED; } else { $list['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_RUNNING; } } } $status_map = LuckyGroupEnum::getActivityStatusMap(); $data['status_map'] = $status_map; return $this->success('请求成功', $data); } else { } } else { return $this->render('/activity/index'); } } /** * @name: * @msg: 添加 or 编辑活动 * @param {*} * @return {*} */ public function actionStorage() { if (\Yii::$app->request->isAjax) { if (\Yii::$app->request->isGet) { $activity_id = \Yii::$app->request->get('id'); $activity_cates = LuckyGroupCategory::find() ->select('id,sort,title') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]) ->orderBy('sort asc,created_at desc') ->asArray() ->all(); $level_list = LuckyGroupLevel::find() ->select('id,name,level') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]) ->orderBy('level asc') ->asArray() ->indexBy('level') ->all(); $currency_list = [ ["code" => "score", "name" => "积分"], ["code" => "balance", "name" => "余额"], ]; if (!empty($activity_id)) { // 编辑活动 $activity = LuckyGroupActivity::find() ->where(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $activity_id]) ->asArray() ->one(); $start_time = strtotime($activity['start_time']); $end_time = strtotime($activity['end_time']); $time = time(); $activity['activityTime'] = [$start_time * 1000, $end_time * 1000]; if ($start_time > $time) { $activity['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_NOT_START; } else if ($end_time <= $time) { $activity['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_FINISHED; } else { $activity['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_RUNNING; } // 如果活动已经停用,就算是在活动设置的时间范围内,也认为是 未开始状态 if ($activity['status'] == StatusEnum::DISABLED) { $activity['activity_status'] = LuckyGroupEnum::ACTIVITY_STATUS_NOT_START; } if (!empty($activity['attend_award_setting'])) { $activity['attend_award_setting'] = json_decode($activity['attend_award_setting'], true); } if (!empty($activity['equal_commission_setting'])) { $activity['equal_commission_setting'] = json_decode($activity['equal_commission_setting'], true); }else{ unset($activity['equal_commission_setting']); $equal_commission_setting = []; foreach ($level_list as $val){ $equal_commission_setting[]=[ 'level'=>$val['level'], 'equal_commission'=>0, ]; } $activity['equal_commission_setting'] = $equal_commission_setting; } if (!empty($activity['over_commission_setting'])) { $activity['over_commission_setting'] = json_decode($activity['over_commission_setting'], true); }else{ unset($activity['over_commission_setting']); $over_commission_setting = []; foreach ($level_list as $val){ $over_commission_setting[]=[ 'level'=>$val['level'], 'over_commission'=>0, ]; } $activity['over_commission_setting'] = $over_commission_setting; } if (!empty($activity['team_commission_setting'])) { $activity['team_commission_setting'] = json_decode($activity['team_commission_setting'], true); }else{ unset($activity['team_commission_setting']); $team_commission_setting = []; foreach ($level_list as $val){ $team_commission_setting[]=[ 'level'=>$val['level'], 'team_commission'=>0, ]; } $activity['team_commission_setting'] = $team_commission_setting; } if (!empty($activity['win_award_setting'])) { $activity['win_award_setting'] = json_decode($activity['win_award_setting'], true); } $lucky_group_good = LuckyGroupGoods::find() ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_id]) ->asArray() ->all(); $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' => array_column($lucky_group_good, 'goods_id')]) ->asArray() ->all(); } else { $activity = []; $goods_list = []; } $query = LuckyGroupGoods::find() ->select('goods_id') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]); if (!empty($activity_id)) { $query->andWhere(['!=', 'activity_id', $activity_id]); } $activity_goods_ids = $query->asArray()->column(); return $this->success('success', compact('activity_cates', 'activity', 'level_list', 'currency_list', 'goods_list', 'activity_goods_ids')); } else { $post = \Yii::$app->request->post(); // dd($post); $rules = [ [[ 'title', 'start_time', 'end_time', 'group_num', 'random_win_num', 'expend_type', 'attend_user_type', 'attend_award_setting', 'win_times', 'win_award_setting', 'is_percent_pool_trans', 'pool_trans_money', 'enable_commison', 'goods_ids', 'cate_id' ], 'required'], [['title', 'start_time', 'end_time'], 'string', 'max' => 20], [['goods_ids', 'expend_type'], 'string'], [['group_num', 'random_win_num', 'attend_user_type', 'win_times', 'is_percent_pool_trans', 'enable_commison', 'cate_id'], 'integer'], [['id', 'virtual_num', 'team_commission_setting', 'equal_commission_setting', 'over_commission_setting', 'expend_num'], 'safe'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $group_num = $post['group_num']; $random_win_num = $post['random_win_num']; $virtual_num = $post['virtual_num']??0; if($group_num<($random_win_num+$virtual_num)) return $this->error('成团人数<随机拼中人数+虚拟人数'); // dd($post); if (!empty($post['id'])) { $activity = LuckyGroupActivity::findOne(['mall_id' => $this->mall_id, 'id' => $post['id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($activity)) { return $this->error('活动不存在'); } $start_time = strtotime($activity->start_time); $end_time = strtotime($activity->end_time); $time = time(); if ($time >= $start_time && $time <= $end_time && $activity->status == StatusEnum::ENABLED) { return $this->error('正在进行中的活动不能编辑修改,请先停止活动后再修改'); } } $res = LuckyGroupActivity::alterateActivity($this->mall_id, $post); if (false === $res) { return $this->error(LuckyGroupActivity::getStaticError()); } return $this->success('操作成功'); } } else { return $this->render('/activity/edit'); } } /** * @name: * @msg: 删除拼团活动 * @param {*} * @return {*} */ public function actionDelete() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $id = \Yii::$app->request->post('id'); if (empty($id)) { return $this->error('参数错误'); } $activity = LuckyGroupActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $id]); if (empty($activity)) { return $this->error('活动不存在'); } $time = time(); if (strtotime($activity->start_time) <= $time && $time <= strtotime($activity->end_time) && $activity->status == StatusEnum::ENABLED) { return $this->error('活动在进行中不能删除'); } $res = (new OrderPaidQueueLogic())->delActivity($id); if ($res == false) return $this->error('该拼团活动还有待开团订单,请先禁用活动,等待清空队列后,再删除数据'); $params = [ 'activity_id' => $id, 'status' => StatusEnum::DELETE, ]; $res = LuckyGroupActivity::deleteActivity($this->mall_id, $params); if (false === $res) { return $this->error(LuckyGroupActivity::getStaticError()); } return $this->success('删除成功'); } /** * @name: * @msg: 拼团活动切换状态 * @param {*} * @return {*} */ public function actionSwitchAcitity() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $id = \Yii::$app->request->post('id'); $activity_status = \Yii::$app->request->post('status'); if (empty($id) || !in_array($activity_status, [2, 3])) { return $this->error('参数错误'); } $activity = LuckyGroupActivity::findOne(['mall_id' => $this->mall_id, 'id' => $id]); if (empty($activity)) { return $this->error('活动不存在'); } if ($activity_status == 2) { // 启用 if ($activity->status != StatusEnum::DISABLED) { return $this->error('活动数据异常:DISABLED'); } $tip = '启用'; } else { // 停用 if ($activity->status != StatusEnum::ENABLED) { return $this->error('活动数据异常:DISABLED'); } $tip = '停用'; } $status = $activity_status == 2 ? StatusEnum::ENABLED : StatusEnum::DISABLED; $activity->status = $status; $res = $activity->save(); if (false === $res) { return $this->error($tip . '失败:' . LuckyGroupActivity::getStaticError()); } if (3 == $activity_status) { // TODO: 触发拼团活动停止事件 (new OrderPaidQueueLogic())->trigger_disable_activity($this->mall_id, $id); } return $this->success($tip . '成功'); } /** * @name: * @msg: 拼团活动数据统计 * @param {*} * @return {*} */ public function actionActivityData() { if (!\Yii::$app->request->isAjax) { return $this->render('/activity/stat-data'); } if (\Yii::$app->request->isGet) { $activity_id = \Yii::$app->request->get('activity_id'); if (empty($activity_id)) { return $this->error('参数错误'); } $activity = LuckyGroupActivity::findOne(['mall_id' => $this->mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'id' => $activity_id]); if (empty($activity)) { return $this->error('活动不存在'); } /* 顶部统计数据 --- start --- */ $activity_statistics = LuckyGroupActivityStatistics::find() ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_id]) ->asArray() ->one(); /* 顶部统计数据 --- start --- */ /* 商品列表(用于搜索) ---- start ---- */ $group_goods_ids = LuckyGroupGoods::find() ->select('goods_id') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_id]) ->asArray() ->column(); $goods = Goods::find() ->select('id,goods_name,price,cover_pic,stock') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $group_goods_ids]) ->asArray() ->all(); /* 商品列表(用于搜索) ---- end ---- */ /* 拼团活动明细列表 ---- start ----- */ $goods_id = \Yii::$app->request->get('goods_id'); $lottery_period_query = LuckyGroupLotteryPeriod::find() ->select('mall_id,activity_id,goods_id,number,win_order_ids,loss_order_ids,created_at,open_reward_log_id')->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_id]); if (!empty($goods_id)) { $lottery_period_query->andWhere(['goods_id' => $goods_id]); } $lottery_periods = $lottery_period_query ->select('goods_id,open_reward_log_id,win_order_ids,number') ->groupBy('goods_id,number') ->orderBy('number desc,created_at desc') ->asArray() ->all(); if (!empty($lottery_periods)) { $goods_ids = array_column($lottery_periods, 'goods_id'); $goods_list = Goods::find() ->select('id,goods_name,cover_pic') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $goods_ids]) ->asArray() ->indexBy('id') ->all(); $open_reward_log_ids = array_column($lottery_periods, 'open_reward_log_id'); $open_reward_logs = LuckyGroupOpenRewardLog::find() ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $open_reward_log_ids]) ->asArray() ->indexBy('id') ->all(); foreach ($lottery_periods as &$lottery_period) { $good = $goods_list[$lottery_period['goods_id']] ?? []; $open_reward_log = $open_reward_logs[$lottery_period['open_reward_log_id']] ?? []; $lottery_period['goods_name'] = $good['goods_name'] ?? ''; $lottery_period['cover_pic'] = $good['cover_pic'] ?? ''; // 状态:如果所有人都拼不中,认为是失败 if (empty($lottery_period['win_order_ids'])) { $lottery_period['status'] = 0; } else { $lottery_period['status'] = 1; } // 成团金额 $lottery_period['group_amounts'] = $open_reward_log['attend_reward_amounts'] ?? 0; // 分配奖金池金额 $lottery_period['bonus_pool_amounts'] = $open_reward_log['distribute_bonus_pool_amounts'] ?? 0; // 消耗积分、余额 $lottery_period['deplete_balances'] = $lottery_period['deplete_scores'] = 0; if ('balance' == $open_reward_log['expend_type']) { $expend_num = $open_reward_log['expend_num'] ?? 0; $peoples = $open_reward_log['group_require_num'] - $open_reward_log['virtual_num']; $peoples = max($peoples, 0); $deplete_balances = bcmul($expend_num, $peoples, 2); $lottery_period['deplete_balances'] = $deplete_balances; } if ('score' == $open_reward_log['expend_type']) { $expend_num = $open_reward_log['expend_num'] ?? 0; $peoples = $open_reward_log['group_require_num'] - $open_reward_log['virtual_num']; $peoples = max($peoples, 0); $deplete_scores = bcmul($expend_num, $peoples, 2); $lottery_period['deplete_scores'] = $deplete_scores; } // 拼中奖励余额 $lottery_period['win_reward_balances'] = $open_reward_log['win_reward_balances'] ?? 0; // 拼中奖励积分 $lottery_period['win_reward_scores'] = $open_reward_log['win_reward_scores'] ?? 0; } } /* 拼团活动明细列表 ---- end ----- */ return $this->success('success', compact('activity_statistics', 'goods', 'lottery_periods')); } } /** * @name: * @msg: 某一期开奖参团会员列表 * @param {*} * @return {*} */ public function actionAttendUserList() { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $number = \Yii::$app->request->get('number'); $activity_id = \Yii::$app->request->get('activity_id'); if (empty($number)) { return $this->error('参数错误'); } $user_ids = LuckyGroupLotteryPeriod::find() ->select('user_id') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'activity_id' => $activity_id, 'number' => $number]) ->asArray() ->column(); if (!empty($user_ids)) { $user_ids = array_flip(array_flip($user_ids)); $group_users = LuckyGroupUser::find() ->select('user_id,created_at') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'user_id' => $user_ids]) ->asArray() ->indexBy('user_id') ->all(); $users = User::find() ->select('id,nickname,avatar_url,mobile') ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_ids]) ->asArray() ->all(); foreach ($users as &$user) { $group_user = $group_users[$user['id']] ?? []; $user['created_at'] = $group_user['created_at'] ?? 0; if (empty($user['avatar_url'])) { $user['avatar_url'] = \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png'; } } } else { $users = []; } return $this->success('success', $users); } public function actionGetData(){ if (!\Yii::$app->request->isAjax) { return $this->render('/activity/queue-data'); } $activity_id = \Yii::$app->request->get('activity_id'); $activity_goods_list = LuckyGroupGoods::lists([ 'where'=>[ ['activity_id'=>$activity_id], ['status'=>StatusEnum::ENABLED] ], 'with'=>['activity','goods'] ]); if(empty($activity_goods_list)) return $this->success('',[]); foreach ($activity_goods_list as $k=>&$item){ $logic = new OrderPaidQueueLogic(); $activity_id = $item['activity_id']; $queue = $logic->getQueueName($activity_id, $item['goods_id']); // if(empty($queue)) unset($activity_goods_list[$k]); //获取队列长度 $queue_len = \Yii::$app->redis->llen($queue); $item['queue_len'] =$queue_len; } return $this->success('',['list'=>$activity_goods_list]); } }