setName('UpdateCardFlipPvUv') ->setDescription('将翻牌活动的缓存数据存储到数据库'); } protected function execute(Input $input, Output $output) { Request::instance()->module('admin'); //cli模式下无法获取到当前的项目模块,手动指定一下 try { $list = Redis::instance()->sMembers(ActivityConstants::CARD_FLIP_LISTS); if (empty($list)) { Log::info('没有翻牌活动,程序结束'); return; } $cardFlipIds = []; foreach ($list as $v) { $temp = json_decode($v, true); $cardFlipIds[] = $temp['id']; } $channelIds = $this->getChannelIds(); foreach ($cardFlipIds as $cardFlipId) { $this->pvuvCollect(0, $cardFlipId); foreach ($channelIds as $channelId) { if (empty($channelId)) { continue; } $this->pvuvCollect($channelId, $cardFlipId); } } if (time() < strtotime(date('Y-m-d 01:30:00'))) { $yesterdayDate = date('Ymd', strtotime('-1 day')); if ($pvCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, 0, $yesterdayDate))) { foreach ($cardFlipIds as $cardFlipId) { $this->pvuvCollect(0, $cardFlipId, $yesterdayDate); foreach ($channelIds as $channelId) { $this->pvuvCollect($channelId, $cardFlipId, $yesterdayDate); } } Redis::instance()->del(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, 0, $yesterdayDate)); } } } catch (Exception $e) { $output->error('程序异常:' . $e->getMessage() . ' line:' . $e->getTraceAsString()); } } /** * @return array|bool|false|string|string[] * @throws Exception */ private function getChannelIds() { $dbRow = model('ChannelSpecialManage')->where('rule_name', 'cardflip')->find(); if (empty($dbRow)) { return []; } $data = $dbRow->toArray(); $channelIdsRow = model("ChannelMenuList")->where('id', $data['channel_id'])->find(); $data['channel_id'] = $channelIdsRow['channel_id'] ?: ''; $channelIds = []; if (strrpos($data['channel_id'], '*') !== false) { $channelIds = model('admin')->join('auth_group_access', 'auth_group_access.uid = admin.id') ->where('auth_group_access.group_id', 3) ->where('admin.status', 'normal') ->column('admin.id'); } else if (strlen($data['channel_id']) > 0) { $channelIds = explode(',', $data['channel_id']); } return $channelIds; } private function pvuvCollect($adminId, $cardFlipId, $date = null) { $createDate = empty($date) ? date('Ymd', time()) : $date; if ($pvCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, $adminId))) { $uvCount = Redis::instance()->pfCount(CardFlipService::instance()->getCardFlipUvKey($cardFlipId, $adminId)); $pvDrawsCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipDrawsPvKey($cardFlipId, $adminId)); $uvDrawsCount = Redis::instance()->pfCount(CardFlipService::instance()->getCardFlipDrawsUvKey($cardFlipId, $adminId)); $kandianCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipKandianKey($cardFlipId, $adminId)); $cardDayCollect = model('CardDayCollect') ->where('channel_id', $adminId) ->where('createdate', $createDate) ->where('c_id', $cardFlipId) ->field('id') ->find(); if ($cardDayCollect) { model('CardDayCollect')->where('id', $cardDayCollect['id']) ->update([ 'pv' => $pvCount, 'uv' => $uvCount, 'draws_pv' => $pvDrawsCount, 'draws_uv' => $uvDrawsCount, 'kandian' => $kandianCount, 'updatetime' => date('Y-m-d H:i:s'), ]); } else { $mapDay = [ 'channel_id' => $adminId, 'createdate' => $createDate, 'c_id' => $cardFlipId, 'pv' => $pvCount, 'uv' => $uvCount, 'draws_pv' => $pvDrawsCount, 'draws_uv' => $uvDrawsCount, 'kandian' => $kandianCount, 'createtime' => date('Y-m-d H:i:s'), 'updatetime' => date('Y-m-d H:i:s'), ]; model('CardDayCollect')->insert($mapDay); } } } }