UpdateCardFlipPvUv.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace app\admin\command;
  3. use app\common\library\Redis;
  4. use app\common\service\CardFlipService;
  5. use app\main\constants\ActivityConstants;
  6. use think\console\Command;
  7. use think\console\Input;
  8. use think\console\Output;
  9. use think\Exception;
  10. use think\Log;
  11. use think\Request;
  12. class UpdateCardFlipPvUv extends Command
  13. {
  14. protected function configure()
  15. {
  16. $this->setName('UpdateCardFlipPvUv')
  17. ->setDescription('将翻牌活动的缓存数据存储到数据库');
  18. }
  19. protected function execute(Input $input, Output $output)
  20. {
  21. Request::instance()->module('admin'); //cli模式下无法获取到当前的项目模块,手动指定一下
  22. try {
  23. $list = Redis::instance()->sMembers(ActivityConstants::CARD_FLIP_LISTS);
  24. if (empty($list)) {
  25. Log::info('没有翻牌活动,程序结束');
  26. return;
  27. }
  28. $cardFlipIds = [];
  29. foreach ($list as $v) {
  30. $temp = json_decode($v, true);
  31. $cardFlipIds[] = $temp['id'];
  32. }
  33. $channelIds = $this->getChannelIds();
  34. foreach ($cardFlipIds as $cardFlipId) {
  35. $this->pvuvCollect(0, $cardFlipId);
  36. foreach ($channelIds as $channelId) {
  37. if (empty($channelId)) {
  38. continue;
  39. }
  40. $this->pvuvCollect($channelId, $cardFlipId);
  41. }
  42. }
  43. if (time() < strtotime(date('Y-m-d 01:30:00'))) {
  44. $yesterdayDate = date('Ymd', strtotime('-1 day'));
  45. if ($pvCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, 0, $yesterdayDate))) {
  46. foreach ($cardFlipIds as $cardFlipId) {
  47. $this->pvuvCollect(0, $cardFlipId, $yesterdayDate);
  48. foreach ($channelIds as $channelId) {
  49. $this->pvuvCollect($channelId, $cardFlipId, $yesterdayDate);
  50. }
  51. }
  52. Redis::instance()->del(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, 0, $yesterdayDate));
  53. }
  54. }
  55. } catch (Exception $e) {
  56. $output->error('程序异常:' . $e->getMessage() . ' line:' . $e->getTraceAsString());
  57. }
  58. }
  59. /**
  60. * @return array|bool|false|string|string[]
  61. * @throws Exception
  62. */
  63. private function getChannelIds()
  64. {
  65. $dbRow = model('ChannelSpecialManage')->where('rule_name', 'cardflip')->find();
  66. if (empty($dbRow)) {
  67. return [];
  68. }
  69. $data = $dbRow->toArray();
  70. $channelIdsRow = model("ChannelMenuList")->where('id', $data['channel_id'])->find();
  71. $data['channel_id'] = $channelIdsRow['channel_id'] ?: '';
  72. $channelIds = [];
  73. if (strrpos($data['channel_id'], '*') !== false) {
  74. $channelIds = model('admin')->join('auth_group_access', 'auth_group_access.uid = admin.id')
  75. ->where('auth_group_access.group_id', 3)
  76. ->where('admin.status', 'normal')
  77. ->column('admin.id');
  78. } else if (strlen($data['channel_id']) > 0) {
  79. $channelIds = explode(',', $data['channel_id']);
  80. }
  81. return $channelIds;
  82. }
  83. private function pvuvCollect($adminId, $cardFlipId, $date = null)
  84. {
  85. $createDate = empty($date) ? date('Ymd', time()) : $date;
  86. if ($pvCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipPvKey($cardFlipId, $adminId))) {
  87. $uvCount = Redis::instance()->pfCount(CardFlipService::instance()->getCardFlipUvKey($cardFlipId, $adminId));
  88. $pvDrawsCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipDrawsPvKey($cardFlipId, $adminId));
  89. $uvDrawsCount = Redis::instance()->pfCount(CardFlipService::instance()->getCardFlipDrawsUvKey($cardFlipId, $adminId));
  90. $kandianCount = Redis::instance()->get(CardFlipService::instance()->getCardFlipKandianKey($cardFlipId, $adminId));
  91. $cardDayCollect = model('CardDayCollect')
  92. ->where('channel_id', $adminId)
  93. ->where('createdate', $createDate)
  94. ->where('c_id', $cardFlipId)
  95. ->field('id')
  96. ->find();
  97. if ($cardDayCollect) {
  98. model('CardDayCollect')->where('id', $cardDayCollect['id'])
  99. ->update([
  100. 'pv' => $pvCount,
  101. 'uv' => $uvCount,
  102. 'draws_pv' => $pvDrawsCount,
  103. 'draws_uv' => $uvDrawsCount,
  104. 'kandian' => $kandianCount,
  105. 'updatetime' => date('Y-m-d H:i:s'),
  106. ]);
  107. } else {
  108. $mapDay = [
  109. 'channel_id' => $adminId,
  110. 'createdate' => $createDate,
  111. 'c_id' => $cardFlipId,
  112. 'pv' => $pvCount,
  113. 'uv' => $uvCount,
  114. 'draws_pv' => $pvDrawsCount,
  115. 'draws_uv' => $uvDrawsCount,
  116. 'kandian' => $kandianCount,
  117. 'createtime' => date('Y-m-d H:i:s'),
  118. 'updatetime' => date('Y-m-d H:i:s'),
  119. ];
  120. model('CardDayCollect')->insert($mapDay);
  121. }
  122. }
  123. }
  124. }