DashBoardController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace App\Admin\Controllers;
  3. use App\Admin\Metrics\Examples;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\Account;
  6. use App\Models\ProductCategory;
  7. use App\Models\Showroom;
  8. use App\Models\StatProduct;
  9. use App\Models\StatProductDownload;
  10. use App\Models\StatShowroom;
  11. use Carbon\Carbon;
  12. use Dcat\Admin\Admin;
  13. use Dcat\Admin\Http\Controllers\Dashboard;
  14. use Dcat\Admin\Http\JsonResponse;
  15. use Dcat\Admin\Layout\Column;
  16. use Dcat\Admin\Layout\Content;
  17. use Dcat\Admin\Layout\Row;
  18. use Dcat\Admin\Widgets\Card;
  19. use Dcat\Admin\Widgets\Tab;
  20. use Illuminate\Database\Eloquent\Model;
  21. use Illuminate\Database\Query\Builder;
  22. class DashBoardController extends Controller
  23. {
  24. public function view(Content $content)
  25. {
  26. if(request()->isMethod('post')){
  27. $isProduct = request()->input('product', 1);
  28. if($isProduct){
  29. return $this->viewerProduct();
  30. }
  31. return $this->viewerShowroom();
  32. }
  33. $isProduct = \request('product',1);
  34. if ($isProduct) {
  35. $view = $this->viewerProduct();
  36. }else{
  37. $view = $this->viewerShowroom();
  38. }
  39. return $content->body($view);
  40. }
  41. public function download(Content $content)
  42. {
  43. if(request()->isMethod('post')){
  44. return $this->queryData('download');
  45. }
  46. $categories = ProductCategory::with(['products:id,name,cate_id'])->get();
  47. $data = [
  48. 'categories' => $categories
  49. ];
  50. static::loadJS('download');
  51. return $content->body(view('admin.dashboard.download', $data));
  52. }
  53. private function viewerShowroom()
  54. {
  55. if(request()->isMethod('post')){
  56. return $this->queryData('product');
  57. }
  58. static::loadJS('showroom');
  59. $showrooms = Showroom::all();
  60. $data = [
  61. 'showrooms' => $showrooms
  62. ];
  63. return view('admin.dashboard.showroom', $data);
  64. }
  65. private function viewerProduct()
  66. {
  67. if(request()->isMethod('post')){
  68. return $this->queryData('product');
  69. }
  70. static::loadJS('product');
  71. $categories = ProductCategory::with(['products:id,name,cate_id'])->get();
  72. $data = [
  73. 'categories' => $categories
  74. ];
  75. return view('admin.dashboard.product', $data);
  76. }
  77. private function queryData($type): JsonResponse
  78. {
  79. $startAt = \request()->input('startAt','');
  80. $endAt = \request()->input('endAt','');
  81. $productIds = \request()->input('productIds',[]);
  82. $name = \request()->input('name','');
  83. $dates = $this->getDays($startAt, $endAt);
  84. $userIds = $this->getUserIds();
  85. if(empty($productIds) || ($name && empty($userIds))){
  86. return Admin::json()->data(['dates' => $dates])->success('');
  87. }
  88. if($type == 'download' || $type == 'product'){
  89. $model = $type == 'download' ? app(StatProductDownload::class) :app(StatProduct::class);
  90. $model = $model->with([
  91. 'product' => function($query) use ($productIds){
  92. /* @var Builder $query*/
  93. $query->when($productIds, function ($query) use ($productIds){
  94. /* @var Builder $query*/
  95. return $query->whereIn('id', $productIds);
  96. });
  97. },
  98. ])->selectRaw(
  99. 'product_id,DATE_FORMAT(created_at, "%Y-%m-%d") as date, count(*) as count'
  100. );
  101. }else{
  102. $model = StatShowroom::with([
  103. 'showroom' => function($query) use ($productIds){
  104. /* @var Builder $query*/
  105. $query->when($productIds, function ($query) use ($productIds){
  106. /* @var Builder $query*/
  107. return $query->whereIn('id', $productIds);
  108. });
  109. },
  110. ])->selectRaw(
  111. 'showroom_id,showroom_id as product_id,DATE_FORMAT(created_at, "%Y-%m-%d") as date, count(*) as count'
  112. );
  113. }
  114. /* @var Model $model*/
  115. $lists = $model->when($startAt, function ($query) use ($startAt){
  116. return $query->where('created_at', '>=',$startAt);
  117. })->when($endAt, function ($query) use ($endAt){
  118. return $query->where('created_at', '<=',$endAt);
  119. })->when($userIds, function ($query) use ($userIds){
  120. return $query->whereIn('user_id', $userIds);
  121. })->groupBy(['product_id','date'])
  122. ->get();
  123. $statData = [];
  124. foreach ($lists as $list){
  125. $statData[$list->date][$list->product_id] = $list->toArray();
  126. }
  127. $analyzeData = [];
  128. foreach ($productIds as $id){
  129. foreach ($dates as $date){
  130. $analyzeData[$id][] = $statData[$date][$id]['count'] ?? 0;
  131. }
  132. }
  133. $data = [
  134. 'dates' => $dates,
  135. ];
  136. foreach ($analyzeData as $key => $value){
  137. $data['analyze_'.$key] = $value;
  138. }
  139. return Admin::json()->data($data)->success('');
  140. }
  141. private static function getDays($startAt, $endAt): array
  142. {
  143. $startAt = $startAt ?: Carbon::today()->subDays(30)->toDateString();
  144. $endAt = $endAt ?: Carbon::today()->toDateString();
  145. $daysPeriod = Carbon::parse($startAt)->daysUntil($endAt);
  146. return iterator_to_array(
  147. $daysPeriod->map(function ($day){
  148. return Carbon::make($day)->toDateString();
  149. })
  150. );
  151. }
  152. private function getUserIds(): array
  153. {
  154. $name = \request()->input('name','');
  155. if(empty($name)) return [];
  156. $account = Account::with([
  157. 'user:id,account_id'
  158. ])->where('user_name', 'Like', "%$name%")->get();
  159. return iterator_to_array(
  160. $account->map(function ($row){
  161. return $row->user->id;
  162. })
  163. );
  164. }
  165. private static function loadJS($type)
  166. {
  167. \Admin::css([
  168. 'vendor/dcat-admin/dcat/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css'
  169. ]);
  170. $analyzeJS = '/static/js/analyze.js';
  171. $analyzeJS = $analyzeJS.'?t='.fileatime(public_path($analyzeJS));
  172. \Admin::js([
  173. '/vendor/dcat-admin/dcat/plugins/moment/moment-with-locales.min.js',
  174. '/vendor/dcat-admin/dcat/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js',
  175. '/static/js/echarts.common.min.js',
  176. $analyzeJS,
  177. ]);
  178. if(is_array($type)){
  179. foreach ($type as $item){
  180. $pageJS = "/static/js/analyze.{$item}.js";
  181. $pageJS = $pageJS.'?t='.fileatime(public_path($pageJS));
  182. \Admin::js($pageJS);
  183. }
  184. }else{
  185. $pageJS = "/static/js/analyze.{$type}.js";
  186. $pageJS = $pageJS.'?t='.fileatime(public_path($pageJS));
  187. \Admin::js($pageJS);
  188. }
  189. }
  190. }