service->listQuery()->select(['id as value', 'name as label'])->get(); return $this->response()->success($list); } public function list(): Page { $crud = $this->baseCRUD() ->filterTogglable(false) ->headerToolbar([ $this->createButton(true, 'lg'), ...$this->baseHeaderToolBar(), ]) ->filter($this->baseFilter()->actions([])->body([ TextControl::make()->name('name')->label('名称')->size('md'), amisMake()->SelectControl()->name('factory')->label('厂家')->options(Keyword::getByParentKey('device-factory')->pluck('name', 'id')->toArray())->size('md'), amisMake()->SelectControl()->name('type')->label('类型')->options(Device::typeMap())->size('md'), Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'), amis('submit')->label(__('admin.search'))->level('primary'), ])) ->columns([ TableColumn::make()->name('id')->label('ID')->sortable(true), TableColumn::make()->name('name')->label('名称'), TableColumn::make()->name('factory.name')->label('厂家'), TableColumn::make()->name('sn')->label('编号'), TableColumn::make()->name('type')->type('mapping')->map(Device::typeMap())->label('类型'), TableColumn::make()->name('created_at')->label('创建时间')->type('datetime')->sortable(true), TableColumn::make()->name('updated_at')->label('更新时间')->type('datetime')->sortable(true), $this->rowActions(true, 'lg'), ])->debug(true); return $this->baseList($crud); } public function form(): Form { return $this->baseForm()->body([ TextControl::make()->name('name')->label('名称')->required(true), TextControl::make()->name('sn')->label('设备编号')->required(true), \amisMake()->SelectControl()->name('powered_by')->label('厂家')->options(Keyword::getByParentKey('device-factory')->pluck('name', 'id')->toArray())->required(true), TextControl::make()->name('model_sn')->label('型号'), \amisMake()->RadiosControl()->name('type')->label('类型')->options(Device::typeMap())->required(true), // 监控设备-额外参数 // rtsp://admin:lcdx12345@172.16.40.2:554/Streaming/Channels/5201 TextControl::make()->name('extends.rtsp_url')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label(__('device.rtsp_url')), // rtsp://admin:lcdx12345@172.16.40.2:554/Streaming/tracks/5201 TextControl::make()->name('extends.rtsp_history')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label(__('device.rtsp_history')), ]); } public function detail(): Form { return $this->baseDetail()->body([ TextControl::make()->static(true)->name('id')->label('ID'), TextControl::make()->static(true)->name('name')->label('名称'), TextControl::make()->static(true)->name('sn')->label('编号'), TextControl::make()->static(true)->name('factory.name')->label('厂家'), TextControl::make()->static(true)->name('model_sn')->label('型号'), TextControl::make()->static(true)->name('type')->label('类型')->staticSchema( Mapping::make()->map(Device::typeMap())), TextControl::make()->static(true)->name('extends')->label('扩展信息')->staticSchema( Json::make()), TextControl::make()->static(true)->name('created_at')->label('创建时间'), TextControl::make()->static(true)->name('updated_at')->label('更新时间') ]); } /** * 监控设备列表 */ public function monitorList() { if ($this->actionOfGetData()) { return $this->response()->success($this->service->list()); } $regionId = request()->input('region_id', 0); if($regionId){ $region = Region::find($regionId); $query = $region->monitorModes()->where('type', MonitorMode::TYPE_MONITOR)->pluck('name','monitor_id'); }else{ $query = MonitorMode::where('type', MonitorMode::TYPE_MONITOR)->pluck('name','id'); } return CRUDTable::make() ->mode('cards') ->hideCheckToggler() ->columnsCount(3) ->perPage(6) ->affixHeader(false) ->filterTogglable(true) ->set('primaryField', $this->service->primaryKey()) ->api(admin_url($this->queryPath . '?_action=getData&_type=' . Device::TYPE_MONITOR)) ->footerToolbar(['statistics', 'pagination']) ->headerToolbar([]) ->filter($this->baseFilter()->actions([])->body([ amisMake()->SelectControl('monitor_mode', '点位名称')->size('md')->options($query->toArray())->selectFirst(true), Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'), Component::make()->setType('submit')->label(__('admin.search'))->level('primary'), ])) ->actions([]) ->itemClassName('col-sm-4') ->card(Card::make()->header(['title' => '$name'])->body(Video::make()->videoType('video/x-flv')->muted(true)->autoPlay(true)->src('${src}'))); } /** * 监控历史视频 */ public function monitorVideoList() { if ($this->actionOfGetData()) { return $this->response()->success($this->service->list()); } $regionId = request()->input('region_id', 0); if($regionId){ $region = Region::find($regionId); $query = $region->monitorModes()->where('type', MonitorMode::TYPE_MONITOR)->pluck('name','monitor_id'); }else{ $query = MonitorMode::where('type', MonitorMode::TYPE_MONITOR)->pluck('name','id'); } return CRUDTable::make() ->mode('cards') ->hideCheckToggler() ->columnsCount(3) ->perPage(6) ->affixHeader(false) ->filterTogglable(true) ->set('primaryField', $this->service->primaryKey()) ->api(admin_url($this->queryPath . '?_action=getData&_type=' . Device::TYPE_MONITOR . '&_mode=history')) ->footerToolbar(['statistics', 'pagination']) ->headerToolbar([]) ->filter($this->baseFilter()->actions([])->body([ amisMake()->SelectControl('monitor_mode', '点位名称')->size('md')->options($query->toArray())->selectFirst(true), DateRangeControl::make()->name('date')->label('日期')->maxDate('now')->size('md'), Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'), Component::make()->setType('submit')->label(__('admin.search'))->level('primary'), ])) ->actions([]) ->itemClassName('col-sm-4') ->card(Card::make()->header(['title' => '$name'])->body(Video::make()->videoType('video/x-flv')->muted(true)->autoPlay(true)->src('${src}'))); } /** * 气象图表 */ public function meteorologicalChart(){ $regionId = request()->input('region_id', 0); if($regionId){ $region = Region::find($regionId); $options = $region->monitorModes()->where('type', MonitorMode::TYPE_METEOROLOGICAL)->pluck('name','monitor_id')->toArray(); }else{ $options = MonitorMode::where('type', MonitorMode::TYPE_METEOROLOGICAL)->pluck('name','id')->toArray(); } return $this->basePage()->title('')->body([ \amisMake()->grid()->columns([ \amisMake()->Form()->title('搜索条件')->mode('inline')->body([ amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true), \amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'), amis('submit')->label(__('admin.search'))->level('primary'), ])->target('meteorological_chart'), ]), amisMake()->Service()->name('meteorological_chart') ->data([ 'monitor_mode'=>array_key_first($options), 'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y')) ])->schemaApi( admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}') ), ]); } public function deviceChart(Request $request) { $dateRange = $request->date_range ?? ''; list($startTime, $endTime) = explode(',', $dateRange); $startTime = date('Y-m-d', $startTime); $endTime = date('Y-m-d', $endTime); $monitorMode = $request->monitor_mode ?? 0; $monitorMode = MonitorMode::find($monitorMode); $data = $this->service->getMonitorModeDeviceChartConfig($monitorMode, $startTime, $endTime, 2); return $this->response()->success($data); } /** * 水质图表 */ public function waterChart(){ $regionId = request()->input('region_id', 0); if($regionId){ $region = Region::find($regionId); $options = $region->monitorModes()->where('type', MonitorMode::TYPE_WATER_QUALITY)->pluck('name','monitor_id')->toArray(); }else{ $options = MonitorMode::where('type', MonitorMode::TYPE_WATER_QUALITY)->pluck('name','id')->toArray(); } return $this->basePage()->title('')->body([ \amisMake()->grid()->columns([ \amisMake()->Form()->title('搜索条件')->mode('inline')->body([ amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true), \amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'), amis('submit')->label(__('admin.search'))->level('primary'), ])->target('water_chart'), ]), amisMake()->Service()->name('water_chart') ->data([ 'monitor_mode'=>array_key_first($options), 'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y')) ])->schemaApi( admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}') ), ]); } /** * 土壤图表 */ public function soilChart(){ $regionId = request()->input('region_id', 0); if($regionId){ $region = Region::find($regionId); $options = $region->monitorModes()->where('type', MonitorMode::TYPE_SOIL)->pluck('name','monitor_id')->toArray(); }else{ $options = MonitorMode::where('type', MonitorMode::TYPE_SOIL)->pluck('name','id')->toArray(); } return $this->basePage()->title('')->body([ \amisMake()->grid()->columns([ \amisMake()->Form()->title('搜索条件')->mode('inline')->body([ amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true), \amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'), amis('submit')->label(__('admin.search'))->level('primary'), ])->target('soil_chart'), ]), amisMake()->Service()->name('soil_chart') ->data([ 'monitor_mode'=>array_key_first($options), 'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y')) ])->schemaApi( admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}') ), ]); } /** * 空气条件设置 */ public function airDetail(){ return amisMake()->Grid()->columns([ amisMake()->Wrapper()->sm(6)->body([ amisMake()->Panel()->title('智能开关设置') ->labelWidth(100) ->className('Panel--success') ->body([ \amisMake()->Form()->title('')->mode('horizontal')->body([ amisMake()->FieldSetControl()->title('智能开启')->body([ \amisMake()->SwitchControl()->name('open_is_enable')->label('开关'), \amisMake()->ConditionBuilderControl()->label('条件')->fields([ [ 'label' => '温度', 'type'=>'number','step'=>'0.01','name'=>'q', 'operators'=> [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between', // 'is_empty', 'is_not_empty' ] ], [ 'label' => '湿度', 'type'=>'number','step'=>'0.01','name'=>'x', 'operators'=> [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between', // 'is_empty', 'is_not_empty' ] ], ]), ]), amisMake()->FieldSetControl()->title('智能关闭')->body([ \amisMake()->SwitchControl()->name('close_is_enable')->label('开关'), \amisMake()->ConditionBuilderControl()->label('条件')->fields([ [ 'label' => '温度', 'type'=>'number','step'=>'0.01','name'=>'q', 'operators'=> [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between', // 'is_empty', 'is_not_empty' ] ], [ 'label' => '湿度', 'type'=>'number','step'=>'0.01','name'=>'x', 'operators'=> [ 'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between', // 'is_empty', 'is_not_empty' ] ], ]), ]), ]), ]) ]), amisMake()->Wrapper()->sm(6)->body([ amisMake()->Panel()->title('开关记录') ->className('Panel--success') ->body([ \amisMake()->Table()->title('') ->data([ 'items' => [ [ 'name'=> '温度>10℃', 'name1'=> '关闭', 'time1'=> '2023-03-21 10:00:00', ] ] ]) ->columns([ amisMake()->TableColumn()->name('name')->label('触发条件'), amisMake()->TableColumn()->name('name1')->label('状态'), amisMake()->TableColumn()->name('time1')->label('执行时间'), ]) ]) ]), ]); } /** * 喷灌 */ public function wasserstrahlDetail(){ return amisMake()->Grid()->columns([ amisMake()->Wrapper()->sm(6)->body([ amisMake()->Panel()->title('智能喷灌设置') ->subFormMode('horizontal') ->labelWidth(80) ->className('Panel--success') ->body([ \amisMake()->Form()->title('')->mode('horizontal')->body([ amisMake()->FieldSetControl()->title('定时喷灌')->body([ \amisMake()->SwitchControl()->name('is_enable')->label('开关'), \amisMake()->ArrayControl()->name('config')->label('定时')->items([ amisMake()->ComboControl()->items([ \amisMake()->InputTimeRange(), \amisMake()->TextControl()->name('input')->label('喷灌量')->labelWidth(30), ]), ]), ]), ]), ]) ]), amisMake()->Wrapper()->sm(6)->body([ amisMake()->Panel()->title('开关记录') ->className('Panel--success') ->body([ \amisMake()->Table()->title('') ->data([ 'items' => [ [ 'name'=> '定时喷灌', 'name1'=> '关闭', 'time1'=> '2023-03-21 10:00:00', ] ] ]) ->columns([ amisMake()->TableColumn()->name('name')->label('触发条件'), amisMake()->TableColumn()->name('name1')->label('状态'), amisMake()->TableColumn()->name('time1')->label('执行时间'), ]) ]) ]), ]); } }