HtPlantController.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: vanshao
  5. * Date: 2019-10-24
  6. * Time: 11:24
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Logics\Admin\SiteLogic;
  11. use App\Http\Logics\Admin\SiteSyncLogic;
  12. use App\Http\Models\Business;
  13. use App\Http\Models\Contract;
  14. use App\Http\Models\Role;
  15. use App\Http\Models\Server;
  16. use App\Http\Models\Site;
  17. use App\Http\Models\SiteAddition;
  18. use App\Http\Models\SiteEnterprise;
  19. use App\Http\Models\SiteInfo;
  20. use App\Http\Models\SiteMarketer;
  21. use App\Http\Models\SitePayment;
  22. use App\Http\Models\SiteSns;
  23. use App\Http\Models\SiteStation;
  24. use App\Http\Models\Social;
  25. use App\Http\Models\SocialPublish;
  26. use App\Http\Requests\Site\PaymentRequest;
  27. use App\Http\Requests\Site\SiteOverviewRequest;
  28. use App\Http\Requests\Site\CustomerRequest;
  29. use App\Http\Requests\Site\SiteSaveRequest;
  30. use App\Http\Requests\Site\SocialPublishRequest;
  31. use App\Http\Requests\Site\SocialQueueRequest;
  32. use App\Http\Requests\Site\SocialSaveRequest;
  33. use GuzzleHttp\Client;
  34. use Illuminate\Database\Eloquent\Builder;
  35. use Illuminate\Http\Request;
  36. use Illuminate\Support\Facades\Cache;
  37. use Illuminate\Support\Facades\DB;
  38. use Illuminate\Support\Facades\Log;
  39. use App\Http\Traits\HasSites;
  40. class HtPlantController extends Controller{
  41. public function index(Request $request)
  42. {
  43. if (!$request->ajax()) {
  44. return view('admin/ht_plant/index');
  45. }
  46. $cacheKey=md5('htall');
  47. $cacheContent = Cache::get($cacheKey);
  48. $cacheContentTotal = Cache::get($cacheKey.'total');
  49. $sortName = $request->input('sortName')=='id'?'traffic':$request->input('sortName');
  50. $sortOrder = $request->input('sortOrder');
  51. $traffic_number=$request->input('traffic_number');
  52. $inquire_number=$request->input('inquire_number');
  53. if ($cacheContent&&!$cacheContent->isEmpty()) {
  54. $records=$cacheContent;
  55. $total=$cacheContentTotal;
  56. }else{
  57. if ($status = $request->input('status')) {
  58. $condition['status'] = $status;
  59. }
  60. DB::connection()->enableQueryLog();
  61. $keyword = $request->input('keyword');
  62. $builder = Site::query()->withCount(['articles' , 'linkDetails'=>function(Builder $query){
  63. $query->where([
  64. ['enable', '=', 1]
  65. ]);
  66. }])
  67. ->withCount(['linkUrls'])
  68. ->with(['users','linkDetails','business'])->where($condition ?? [])->whereIn('status',[2,3])->where(function (Builder $builder) use ($keyword) {
  69. if ($keyword) {
  70. $builder->where('domain', 'like', '%' . $keyword . '%')
  71. ->orWhere('cn_title', 'like', '%' . $keyword . '%');
  72. }
  73. });
  74. if ($sortName == 'statusTitle') {
  75. $builder->orderBy('status', $sortOrder);
  76. }
  77. if ($sortName == 'order_at') {
  78. $builder->orderBy('order_at', $sortOrder);
  79. }
  80. $sites = $builder->orderByDesc('id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  81. $items = $sites->items();
  82. $oldIds = array_filter(array_column($items, 'old_id'));
  83. $rankConnection = DB::connection('rank');
  84. $top10ListMap = $rankConnection->table('project_keyword')
  85. ->selectRaw('SUM(CASE WHEN google_rank <= 10 THEN 1 ELSE 0 END) as top10,count(id) as keyword_num,project_id')->whereIn('project_id', $oldIds)
  86. ->groupBy('project_id')->get()->keyBy('project_id')->toArray();
  87. $listReportMap = $rankConnection->table('project_listreport')->whereIn('project_id', $oldIds)->where([
  88. 'ym' => date('Ym', strtotime('-1 month'))
  89. ])->get()->keyBy('project_id')->toArray();
  90. $reachTimeMap = $rankConnection->table('project')->whereIn('id',$oldIds)->get()->keyBy('id')->toArray();
  91. array_walk($items, function ($item) use (&$top10ListMap, &$listReportMap,&$reachTimeMap) {
  92. $item->identify = base64_encode($item->id);
  93. $item->managers_title = implode('-', $item->users->where('role_id', Role::TYPE_MANAGER)->pluck('nickname')->toArray());
  94. $item->statusTitle = Site::STATUS_MAP[$item->status] ?? '';
  95. $item->top10 = $item->old_id ? ($top10ListMap[$item->old_id]->top10 ?? '-') : '未关联';
  96. $item->keyword_num = $item->old_id ? ($top10ListMap[$item->old_id]->keyword_num ?? '-') : '未关联';
  97. $item->traffic = $item->old_id ? ($listReportMap[$item->old_id]->traffic ?? '-') : '未关联';
  98. $item->inquire = $item->old_id ? ($listReportMap[$item->old_id]->inquire ?? '-') : '未关联';
  99. $item->reach_time = $item->old_id ?($reachTimeMap[$item->old_id]->reach_time?intval((time()-$reachTimeMap[$item->old_id]->reach_time)/86400).'天':'未达标') : '未关联';
  100. $item->is_google_bid = in_array(Contract::GOOGLE_BID, $item->contract_ids ?? []) ? 1 : 0;
  101. $item->online_date = $item->online_at ? date('Y-m-d', strtotime($item->online_at)) : '';
  102. if($item->online_date){
  103. $online_time=strtotime($item->online_date);
  104. if($item->old_id){
  105. $seo_times=$reachTimeMap[$item->old_id]->reach_time?$reachTimeMap[$item->old_id]->reach_time-$online_time:time()-$online_time;
  106. $item->seo_time=intval($seo_times/86400);
  107. $item->seo_time=$item->seo_time>0?$item->seo_time.'天':'-';
  108. }
  109. }else{
  110. $item->seo_time='-';
  111. }
  112. try{
  113. if($item->webmaster_domain){
  114. $opts=array(
  115. "http"=>array(
  116. "method"=>"GET",
  117. "timeout"=>3
  118. ),
  119. );
  120. $context = stream_context_create($opts);
  121. $web_count=substr_count(file_get_contents($item->webmaster_domain.'sitemap.xml','false',$context),'http');
  122. $item->web_count=$web_count;
  123. }
  124. }catch(\Throwable $throwable){
  125. }
  126. $temp_link_details=array();
  127. foreach ($item->linkDetails as $value){
  128. $temp_link_details[]=$value['link_id'];
  129. }
  130. if($temp_link_details){
  131. $item->link_details_num=count(array_unique($temp_link_details));
  132. }
  133. unset($item->linkDetails);
  134. });
  135. $records = collect($items);
  136. $total=$sites->total();
  137. Cache::put($cacheKey,$records,10080);
  138. Cache::put($cacheKey.'total',$sites->total(),10080);
  139. }
  140. if (in_array($sortName, ['traffic', 'inquire', 'top10'])) {
  141. $descending = strtolower($sortOrder) == 'asc' ? false : true;
  142. $records = $records->sortBy(function ($item, $key) use ($sortName, $descending) {
  143. return intval($item[$sortName]);
  144. }, SORT_REGULAR, $descending)->values();
  145. }
  146. if($traffic_number){
  147. $number=explode(',',$traffic_number);
  148. $records=$records->filter(function ($value,$key) use($number){
  149. return $value['traffic']>$number[0]&&$value['traffic']<=$number[1];
  150. });
  151. }
  152. if($inquire_number){
  153. $number=explode(',',$inquire_number);
  154. $records=$records->filter(function ($value,$key) use($number){
  155. return $value['inquire']>$number[0]&&$value['inquire']<=$number[1];
  156. });
  157. }
  158. return response()->json([
  159. 'rows' => array_values($records->toArray()),
  160. 'total' => $total
  161. ]);
  162. }
  163. }