DashBoardController.php 7.1 KB

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