diff --git a/app/Admin/Controllers/ProductStatisticsController.php b/app/Admin/Controllers/ProductStatisticsController.php new file mode 100755 index 0000000..2672fc9 --- /dev/null +++ b/app/Admin/Controllers/ProductStatisticsController.php @@ -0,0 +1,163 @@ +body( + << + + + HTML + + ) + + ->body(function (Row $row){ + $row->column(6,function (Column $column){ + $column->row(new \App\Admin\Tools\DataReportDate('data_report')); + }); + + }) + + ->body(function (Row $row){ + $row->column(4, function (Column $column) { + $column->row(Card::make('总数', function () { + $dateTime = request()->get('created_at')??null; + $count = AgentProduct::query(); + if (!empty($dateTime)) { + $count->whereBetween('created_at',$dateTime); + } + $count = $count->count(); + return << +

$count

+ +HTML; + })); + }); + + $row->column(4, function (Column $column) { + $column->row(Card::make('上架', function () { + $dateTime = request()->get('created_at')??null; + $profit = AgentProduct::query()->where('status',ProductStatus::ON_SALE); + if (!empty($dateTime)) { + $profit->whereBetween('created_at',$dateTime); + } + $profit = $profit->count(); + return << +

$profit

+ +HTML; + })); + + }); + + $row->column(4, function (Column $column) { + $column->row(Card::make('下架', function () { + $unSale = AgentProduct::query() + ->where('status',ProductStatus::SOLD_OUT); + $dateTime = request()->get('created_at')??null; + if (!empty($dateTime)) { + $unSale->whereBetween('created_at',$dateTime); + } + $unSale = $unSale->count(); + return << +

$unSale

+ +HTML; + })); + + }); + + }) + ->body(function (Row $row){ + // 构建下拉菜单,当点击菜单时发起请求获取数据重新渲染图表 + $menu = [ + '1' => '日', + '30' => '月', + '365' => '年', + ]; + $buttonName = '日'; + if (Arr::exists($menu, \request()->input('time_key', ''))) { + $buttonName = $menu[\request()->input('time_key')]; + } + + $dropdown = Dropdown::make($menu) + ->button(current($menu)) + ->button($buttonName) + ->click() + ->map(function ($v, $k) { + $querys = \request()->all(); + $querys['time_key'] = $k; + $queryString = http_build_query($querys); + $str = Str::replaceFirst('admin/','',request()->path()); + $url = admin_url($str.'?'.$queryString); + // 此处设置的 data-xxx 属性会作为post数据发送到后端api + return "{$v}"; + }); + + // 传递自定义参数 + + $bar = ProductStatistics::make() + ->fetching('$("#my-box").loading()') // 设置loading效果 + ->fetched('$("#my-box").loading(false)') // 移除loading效果 + ->click('.switch-bar'); // 设置图表点击菜单则重新发起请求,且被点击的目标元素上的 data-xxx 属性会被作为post数据发送到后端API + + $box = Box::make('成本总额图表', $bar) + ->id('my-box') // 设置盒子的ID + ->tool($dropdown); // 设置下拉菜单按钮 + + $row->column(12, $box); + }); + } +} diff --git a/app/Admin/Controllers/UserStatisticsController.php b/app/Admin/Controllers/UserStatisticsController.php new file mode 100755 index 0000000..390eb73 --- /dev/null +++ b/app/Admin/Controllers/UserStatisticsController.php @@ -0,0 +1,102 @@ +body( + << + + + HTML + + ) + ->body(function (Row $row) { + $row->column(6, function (Column $column) { + $column->row(new \App\Admin\Tools\DataReportDate('data_report')); + }); + + }) + ->body(function (Row $row) { + // 构建下拉菜单,当点击菜单时发起请求获取数据重新渲染图表 + $menu = [ + '1' => '日', + '30' => '月', + '365' => '年', + ]; + $buttonName = '日'; + if (Arr::exists($menu, \request()->input('time_key', ''))) { + $buttonName = $menu[\request()->input('time_key')]; + } + + $dropdown = Dropdown::make($menu) + ->button(current($menu)) + ->button($buttonName) + ->click() + ->map(function ($v, $k) { + $querys = \request()->all(); + $querys['time_key'] = $k; + $queryString = http_build_query($querys); + $str = Str::replaceFirst('admin/', '', request()->path()); + $url = admin_url($str . '?' . $queryString); + // 此处设置的 data-xxx 属性会作为post数据发送到后端api + return "{$v}"; + }); + + // 传递自定义参数 + + $bar = UserStatistics::make() + ->fetching('$("#my-box").loading()') // 设置loading效果 + ->fetched('$("#my-box").loading(false)') // 移除loading效果 + ->click('.switch-bar'); // 设置图表点击菜单则重新发起请求,且被点击的目标元素上的 data-xxx 属性会被作为post数据发送到后端API + + $box = Box::make('成本总额图表', $bar) + ->id('my-box') // 设置盒子的ID + ->tool($dropdown); // 设置下拉菜单按钮 + + $row->column(12, $box); + }); + + } +} diff --git a/app/Admin/Metrics/Examples/ProductStatistics.php b/app/Admin/Metrics/Examples/ProductStatistics.php new file mode 100644 index 0000000..ad44771 --- /dev/null +++ b/app/Admin/Metrics/Examples/ProductStatistics.php @@ -0,0 +1,141 @@ +setUpOptions(); + } + + /** + * 初始化图表配置 + */ + protected function setUpOptions() + { + $this->options([ + 'chart' => [ + //'width' => '180%', + 'type' => 'bar', + 'events' => [ + ], + 'toolbar' => ['show' => false], + ], + 'plotOptions' => [ + 'bar' => [ + //'columnWidth' => '45%', + 'distributed' => true, + ] + ], + 'dataLabels' => [ + 'enabled' => false + ], + 'legend' => [ + 'show' => false + ], + 'xaxis' => [ + //'categories' => + // [75, 125, 225, 175, 125, 75, 25] + //, + 'labels' => [ + 'show' => true, + 'style' => [ + 'fontSize' => '12px' + ] + ], + ], + 'yaxis' => [ + 'show' => true + ], + 'tooltip' => [ + 'x' => ['show' => true], + ], + ]); + } + + /** + * 处理图表数据 + */ + protected function buildData() + { + $query = Order::query() + ->select('*'); + $dateTime = request('created_at', 0); + if ($dateTime) { + $query->whereBetween('created_at',$dateTime); + } + switch (request('time_key', 0)) { + case '1': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time")); + break; + case '30': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at)) AS statistics_time")); + break; + case '365': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at)) AS statistics_time")); + break; + default: + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time")); + } + $order = $query->groupBy('statistics_time') + ->orderBy('statistics_time') + ->get() + ->toArray(); + + $this->withData([ + [ + 'name' => '销量', + 'data' => Arr::pluck($order,'sum_price') + ], + ] + ); + $this->withCategories( + Arr::pluck($order,'statistics_time') + ); + + } + + /** + * 设置图表数据 + * + * @param array $data + * + * @return \App\AdminAgent\Metrics\Examples\ProductStatistics + */ + public function withData(array $data) + { + return $this->option('series', $data); + } + + /** + * 设置图表类别. + * + * @param array $data + * + * @return $this + */ + public function withCategories(array $data) + { + return $this->option('xaxis.categories', $data); + } + + /** + * 渲染图表 + * + * @return string + */ + public function render() + { + $this->buildData(); + + return parent::render(); + } +} diff --git a/app/Admin/Metrics/Examples/UserStatistics.php b/app/Admin/Metrics/Examples/UserStatistics.php new file mode 100644 index 0000000..e200af3 --- /dev/null +++ b/app/Admin/Metrics/Examples/UserStatistics.php @@ -0,0 +1,149 @@ +setUpOptions(); + } + + /** + * 初始化图表配置 + */ + protected function setUpOptions() + { + $this->options([ + 'chart' => [ + //'width' => '180%', + 'type' => 'bar', + 'events' => [ + ], + 'toolbar' => ['show' => false], + ], + 'plotOptions' => [ + 'bar' => [ + //'columnWidth' => '45%', + 'distributed' => true, + ] + ], + 'dataLabels' => [ + 'enabled' => false + ], + 'legend' => [ + 'show' => false + ], + 'xaxis' => [ + //'categories' => + // [75, 125, 225, 175, 125, 75, 25] + //, + 'labels' => [ + 'show' => true, + 'style' => [ + 'fontSize' => '12px' + ] + ], + ], + 'yaxis' => [ + 'show' => true + ], + 'tooltip' => [ + 'x' => ['show' => true], + ], + ]); + } + + /** + * 处理图表数据 + */ + protected function buildData() + { + $query = User::query() + ->select('*'); + + + $dateTime = request('created_at', 0); + if ($dateTime) { + $query->whereBetween('created_at',$dateTime); + } + + switch (request('time_key', 0)) { + case '1': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time")); + break; + case '30': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at)) AS statistics_time")); + break; + case '365': + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at)) AS statistics_time")); + break; + default: + $query->addSelect(DB::raw("count(id) as sum_price,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time")); + } + $users = $query->groupBy('statistics_time') + ->orderBy('statistics_time') + ->get(); + + $userNum = 0; + $userArr = []; + + foreach ($users as $user) { + $userNum += $user->sum_price; + array_push($userArr,$userNum); + } + + + $this->withData([ + [ + 'name' => '用户数', + 'data' => $userArr + ], + ] + ); + $this->withCategories( + Arr::pluck($users,'statistics_time') + ); + + } + + public function withData(array $data) + { + return $this->option('series', $data); + } + + /** + * 设置图表类别. + * + * @param array $data + * + * @return $this + */ + public function withCategories(array $data) + { + return $this->option('xaxis.categories', $data); + } + + /** + * 渲染图表 + * + * @return string + */ + public function render() + { + $this->buildData(); + + return parent::render(); + } +}