From 4162e6946e751162c881be21972188c155a9991a Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Fri, 9 Jun 2023 16:20:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Components.php | 43 ++++++- app/Admin/Controllers/HomeController.php | 133 +++++++++++++-------- app/Admin/Controllers/OldmenController.php | 3 +- 3 files changed, 127 insertions(+), 52 deletions(-) diff --git a/app/Admin/Components.php b/app/Admin/Components.php index 7ff57bc..a58afbc 100644 --- a/app/Admin/Components.php +++ b/app/Admin/Components.php @@ -2,6 +2,7 @@ namespace App\Admin; +use Carbon\Carbon; use App\Models\Keyword; use Slowlyo\OwlAdmin\Renderers\BaseRenderer; @@ -109,7 +110,7 @@ class Components extends BaseRenderer { $tips.= '
{a'.$i.'}: {c'.$i.'}'.($item['unit'] ?? ''); //纵坐标 $yAxisData[] = [ - 'name'=>$item['name'].($item['unit'] ?? ''), + // 'name'=>$item['unit'] ?? '', 'type' =>'value', 'axisTick' => true, 'alignTicks' => true, @@ -128,6 +129,8 @@ class Components extends BaseRenderer { 'name' => $item['name'] ?? '', 'data' => $item['data'] ?? [], 'type' => $item['type'] ?? 'line', + // 'smooth'=> true, + // 'symbol'=>'none', 'yAxisIndex' => $i, ]; switch($item['type']){ @@ -164,6 +167,8 @@ class Components extends BaseRenderer { 'grid' => [ 'left' => '8%', 'right' => '8%', + 'top' => 60, + 'bottom' => 30 ], 'xAxis' => [ 'type' => 'category', @@ -176,9 +181,39 @@ class Components extends BaseRenderer { /** * 生成饼状图config - * -todo + * */ - public function chartPieConfig(){ - return ; + public function chartPieConfig($title, $data){ + return [ + 'title' => [ + 'text' => $title, + ], + "tooltip" => [//提示 + 'trigger'=>'item', + ], + "legend" => [ + "bottom"=> '0', + "left" => 'center', + ], + "series" => [ + "name" => $title, + "type" => 'pie', + "avoidLabelOverlap" => false, + "itemStyle" => [ + "borderRadius"=> 10, + "borderColor"=>'#fff', + "borderWidth" => 2, + ], + "label" => [ + "show"=>true, + // "position"=>'center', + "formatter" => '{b} {d}%', + ], + "labelLive"=>[ + "show"=>false, + ], + "data" => $data, + ] + ]; } } \ No newline at end of file diff --git a/app/Admin/Controllers/HomeController.php b/app/Admin/Controllers/HomeController.php index d9261fc..f15aae9 100644 --- a/app/Admin/Controllers/HomeController.php +++ b/app/Admin/Controllers/HomeController.php @@ -14,6 +14,12 @@ use Slowlyo\OwlAdmin\Renderers\Custom; use Slowlyo\OwlAdmin\Renderers\Wrapper; use Illuminate\Http\Resources\Json\JsonResource; use Slowlyo\OwlAdmin\Controllers\AdminController; +use App\Admin\Components; +use App\Models\Oldmen; +use App\Models\ConstFlow; +use App\Models\Keyword; +use Carbon\Carbon; +use DB; class HomeController extends AdminController { @@ -109,7 +115,21 @@ JS Image::make()->src(url(config('admin.logo'))), Wrapper::make()->className('text-3xl mt-9')->body(config('admin.name')), Flex::make()->className('w-64 mt-5')->justify('space-around')->items([ - + Action::make() + ->level('link') + ->label('客人入住') + ->actionType('url') + ->link('live-in-do'), + Action::make() + ->level('link') + ->label('客人续住') + ->actionType('url') + ->link('live-continue-do'), + Action::make() + ->level('link') + ->label('退住结算') + ->actionType('url') + ->link('live-exit-do'), ]), ]), ]) @@ -118,60 +138,43 @@ JS public function pieChart(): Card { + $lvList = Keyword::getByParentKey('nurse_lv')->pluck('name', 'value'); + $listData = Oldmen::select(DB::raw('`nurse_lv`, count(`id`) as num'))->where('live_in', Oldmen::STATUS_LIVE)->groupBy('nurse_lv')->get()->keyBy('nurse_lv')->toArray(); + $data = []; + foreach($lvList as $lv=>$name){ + $data[] = [ + "name"=>$name, "value"=>$listData[$lv]['num'] ?? 0 + ]; + } return Card::make()->className('h-96')->body( - Chart::make()->height(350)->config("{ - title:{ text: '护理占比', }, - tooltip: { trigger: 'item' }, - legend: { bottom: 0, left: 'center' }, - series: [ - { - name: 'Access From', - type: 'pie', - radius: ['40%', '70%'], - avoidLabelOverlap: false, - itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, - label: { show: false, position: 'center' }, - emphasis: { - label: { show: true, fontSize: '40', fontWeight: 'bold' } - }, - labelLine: { show: false }, - data: [ - { value: 1048, name: 'Search Engine' }, - { value: 735, name: 'Direct' }, - { value: 580, name: 'Email' }, - { value: 484, name: 'Union Ads' }, - { value: 300, name: 'Video Ads' } - ] - } - ] -}") + Chart::make()->height(350)->config(Components::make()->chartPieConfig('当前护理占比', $data)) ); } public function lineChart(): Card { - $randArr = function () { - $_arr = []; - for ($i = 0; $i < 7; $i++) { - $_arr[] = random_int(10, 200); - } - return '[' . implode(',', $_arr) . ']'; - }; + $endDay = now()->format('Y-m-d'); + $startDay = now()->subDays(7)->format('Y-m-d'); - $random1 = $randArr(); - $random2 = $randArr(); + $data = []; + list($day, $diffDays, $xKeys) = $this->makeChartXkeys($startDay, $endDay); - $chart = Chart::make()->config("{ -title:{ text: '入住情况', }, -tooltip: { trigger: 'axis' }, -xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, -yAxis: { type: 'value' }, -grid:{ left: '7%', right:'3%', top: 60, bottom: 30, }, -legend: { data: ['访问量','注册量'] }, -series: [ - { name: '入住量', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', }, - { name:'注册量', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', }, -]}"); + $listData = ConstFlow::select(DB::raw('DATE_FORMAT(`start_at`, "%Y-%m-%d") as ymd, count(`oldman_id`) as num')) + ->where('const_type', ConstFlow::TYPE_IN)->whereBetween('start_at', [$startDay.' 00:00:00', $endDay.' 23:59:59'])->groupBy('ymd')->get()->keyBy('ymd')->toArray(); + + foreach($xKeys as $key){ + $data[] = $listData[$key]['num'] ?? 0; + } + + $chart = amisMake()->Chart()->config(Components::make()->chartLineBarConfig('入住情况', $xKeys, [ + [ + 'name'=> '入住情况', + 'type'=>'line', + 'data' => $data, + 'color' => '#3491fa', + 'unit' => '人' + ] + ])); return Card::make()->height(380)->className('h-96')->body($chart); } @@ -257,4 +260,40 @@ HTML ], ]; } + + /** + * 根据时间,处理X轴横坐标 + */ + private function makeChartXkeys($startTime = null, $endTime = null){ + $diffDays = 0; + $day = date('Y-m-d'); + $xKeys = []; + if($startTime && $endTime){ + if($startTime == $endTime){//查询某一天 + $day = $startTime; + }else{ + $startDay = Carbon::parse($startTime); + $endDay = Carbon::parse($endTime); + $diffDays = $startDay->diffInDays($endDay, false); + } + } + + $xKeys = []; + if($diffDays){ + for ($i = 0; $i<=$diffDays; $i++) { + $xKeys[] =(clone $startDay)->addDays($i)->startOfDay()->format('Y-m-d'); + } + }else{ + //调整截至到当前小时 + $h = 23; + if($day == date('Y-m-d')){ + $h = date('H'); + } + for ($i = 0; $i < ($h+1); $i++) { + $xKeys[] = str_pad($i, 2, '0', STR_PAD_LEFT).':00'; + } + } + + return array($day, $diffDays, $xKeys); + } } diff --git a/app/Admin/Controllers/OldmenController.php b/app/Admin/Controllers/OldmenController.php index 84ccc63..aca39c4 100644 --- a/app/Admin/Controllers/OldmenController.php +++ b/app/Admin/Controllers/OldmenController.php @@ -51,7 +51,8 @@ class OldmenController extends AdminController ->columns([ // TableColumn::make()->name('id')->label('ID')->sortable(), TableColumn::make()->name('name')->label('姓名'), - TableColumn::make()->name('age')->label('年龄')->sortable(), + TableColumn::make()->name('age')->label('年龄'), + TableColumn::make()->name('birthday')->label('生日'), TableColumn::make()->name('card_no')->label('身份证')->copyable(true), TableColumn::make()->name('floor_name')->label('楼栋'), TableColumn::make()->name('nurse_lv')->type('mapping')->map(Keyword::getByParentKey('nurse_lv')->pluck('name', 'value'))->label('护理等级')->className('text-primary')->sortable(),