| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 |
- <?php
- namespace addons\LuckyGroup\backend\controllers;
- use addons\LuckyGroup\common\enums\LuckyGroupEnum;
- use addons\LuckyGroup\common\models\LuckyGroupActivity;
- use addons\LuckyGroup\common\models\LuckyGroupActivityStatistics;
- use addons\LuckyGroup\common\models\LuckyGroupCategory;
- use addons\LuckyGroup\common\models\LuckyGroupCommissionLog;
- use addons\LuckyGroup\common\models\LuckyGroupGoods;
- use addons\LuckyGroup\common\models\LuckyGroupLevel;
- use addons\LuckyGroup\common\models\LuckyGroupLotteryPeriod;
- use addons\LuckyGroup\common\models\LuckyGroupOpenRewardLog;
- use addons\LuckyGroup\common\models\LuckyGroupOrder;
- use addons\LuckyGroup\common\models\LuckyGroupUser;
- use addons\LuckyGroup\common\queue\OrderPaidQueueLogic;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\models\common\BalanceLog;
- use common\models\common\ScoreLog;
- use common\models\goods\Goods;
- use common\models\user\User;
- class GroupActivityController extends BaseController
- {
- /**
- * @name:
- * @msg: 拼团活动列表
- * @param {*}
- * @return {*}
- */
- public function actionIndex()
- {
- if (\Yii::$app->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]);
- }
- }
|