UpdateChannelPvUv.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace app\admin\command;
  3. use app\common\library\Redis;
  4. use app\main\constants\AdminConstants;
  5. use app\main\service\PvuvCollectService;
  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 UpdateChannelPvUv extends Command
  13. {
  14. protected function configure()
  15. {
  16. $this->setName('UpdateChannelPvUv')
  17. ->setDescription('更新渠道商PvUv数据');
  18. }
  19. protected function execute(Input $input, Output $output)
  20. {
  21. Request::instance()->module('admin'); //cli模式下无法获取到当前的项目模块,手动指定一下
  22. try {
  23. $pageSize = 1000;
  24. $lastAdminId = 0;
  25. $this->makeAdminCollect(['id' => 0, 'group_id' => AdminConstants::ADMIN_GROUP_ID_CHANNEL]);
  26. while (true) {
  27. Log::info('beginAdminId:' . $lastAdminId);
  28. $adminInfos = model('Admin')->join('auth_group_access', 'admin.id = auth_group_access.uid')
  29. ->field(['admin.id', 'auth_group_access.group_id'])
  30. ->where('admin.status', 'normal')
  31. ->whereIn('auth_group_access.group_id', [AdminConstants::ADMIN_GROUP_ID_CHANNEL, AdminConstants::ADMIN_GROUP_ID_AGENT])
  32. ->where('admin.id', '>', $lastAdminId)
  33. ->limit($pageSize)
  34. ->select();
  35. if (empty($adminInfos)) {
  36. Log::info('没有找到渠道商,程序结束');
  37. break;
  38. }
  39. foreach ($adminInfos as $adminInfo) {
  40. $this->makeAdminCollect($adminInfo);
  41. }
  42. $lastAdminInfo = end($adminInfos);
  43. $lastAdminId = $lastAdminInfo['id'];
  44. }
  45. if (time() < strtotime(date('Y-m-d 01:30:00'))) {
  46. $yesterdayDate = date('Ymd', strtotime('-1 day'));
  47. $wholePvKey = PvuvCollectService::instance()->getPvKey(['id' => 0, 'group_id' => AdminConstants::ADMIN_GROUP_ID_CHANNEL], $yesterdayDate);
  48. if (Redis::instance()->exists($wholePvKey)) {
  49. $lastAdminId = 0;
  50. $this->makeAdminCollect(0, $yesterdayDate);
  51. while (true) {
  52. Log::info('yesterday collect beginAdminId:' . $lastAdminId);
  53. $adminInfos = model('Admin')->join('auth_group_access', 'admin.id = auth_group_access.uid')
  54. ->field(['admin.id', 'auth_group_access.group_id'])
  55. ->where('admin.status', 'normal')
  56. ->whereIn('auth_group_access.group_id', [AdminConstants::ADMIN_GROUP_ID_CHANNEL, AdminConstants::ADMIN_GROUP_ID_AGENT])
  57. ->where('admin.id', '>', $lastAdminId)
  58. ->limit($pageSize)
  59. ->select();
  60. if (empty($adminIds)) {
  61. Log::info('没有找到渠道商,程序结束');
  62. break;
  63. }
  64. foreach ($adminInfos as $adminInfo) {
  65. $this->makeAdminCollect($adminInfo, $yesterdayDate);
  66. }
  67. $lastAdminInfo = end($adminInfos);
  68. $lastAdminId = $lastAdminInfo['id'];
  69. }
  70. Redis::instance()->del($wholePvKey);
  71. }
  72. }
  73. } catch (Exception $e) {
  74. $output->error('程序异常:' . $e->getMessage() . ' line:' . $e->getTraceAsString());
  75. }
  76. $output->writeln("UpdateChannelPvUv 结束");
  77. }
  78. private function makeAdminCollect($adminInfo, $date = null)
  79. {
  80. $adminId = $adminInfo['id'];
  81. $groupId = $adminInfo['group_id'];
  82. $pvKey = PvuvCollectService::instance()->getPvKey($adminId, $date);
  83. $uvKey = PvuvCollectService::instance()->getUvKey($adminId, $date);
  84. $pvCount = Redis::instance()->get($pvKey);
  85. $uvCount = Redis::instance()->pfCount($uvKey);
  86. Log::info(sprintf('makeAdminCollect,adminId:%s,groupId:%s,date:%s,pv:%s,uv:%s', $adminId, $groupId, $date, $pvCount, $uvCount));
  87. if ($pvCount > 0 || $uvCount > 0) {
  88. if ($adminId == 0) {
  89. $this->pvuvCollect($adminId, $pvCount, $uvCount, '2', $date);
  90. } elseif ($groupId == AdminConstants::ADMIN_GROUP_ID_CHANNEL) {
  91. $this->pvuvCollect($adminId, $pvCount, $uvCount, '3', $date);
  92. } elseif ($groupId == AdminConstants::ADMIN_GROUP_ID_AGENT) {
  93. $this->pvuvCollect($adminId, $pvCount, $uvCount, '1', $date);
  94. }
  95. }
  96. }
  97. /**
  98. * 将pvuv数据存入数据库
  99. * @param $adminId
  100. * @param $pv
  101. * @param $uv
  102. * @param $flag
  103. * @param null $date
  104. */
  105. private function pvuvCollect($adminId, $pv, $uv, $flag, $date = null)
  106. {
  107. $createDate = empty($date) ? date('Ymd', time()) : $date;
  108. $selfCollect = model('OrdersCollect')
  109. ->where('admin_id', $adminId)
  110. ->where('createdate', $createDate)
  111. ->where('type', '1')
  112. ->where('flag', $flag)
  113. ->field('id')
  114. ->find();
  115. if ($selfCollect) {
  116. model('OrdersCollect')->where('id', $selfCollect['id'])
  117. ->update(['pv' => $pv, 'uv' => $uv, 'updatetime' => time()]);
  118. } else {
  119. $map_day = [
  120. 'admin_id' => $adminId,
  121. 'type' => '1',
  122. 'flag' => $flag,
  123. 'createdate' => $createDate,
  124. 'business_line' => '0',
  125. 'pv' => $pv,
  126. 'uv' => $uv,
  127. 'createtime' => time(),
  128. 'updatetime' => time(),
  129. ];
  130. model('OrdersCollect')->insert($map_day);
  131. }
  132. }
  133. }