diff --git a/app/Admin/Components.php b/app/Admin/Components.php index e3b9aa1..307c1d2 100644 --- a/app/Admin/Components.php +++ b/app/Admin/Components.php @@ -2,6 +2,7 @@ namespace App\Admin; +use App\Models\Keyword; use Slowlyo\OwlAdmin\Renderers\BaseRenderer; class Components extends BaseRenderer { @@ -71,4 +72,10 @@ class Components extends BaseRenderer { ->mode($mode) ->onText(__('admin.extensions.status_map.enabled'))->offText(__('admin.extensions.status_map.disabled')); } + + public function keywordsTagControl($name = 'tags', $label= '标签', $typeKey = ''){ + return amisMake()->TagControl() + ->name($name)->label($label) + ->options(Keyword::getByParentKey($typeKey)->pluck('name', 'id')->toArray()); + } } \ No newline at end of file diff --git a/app/Admin/Controllers/DeviceController.php b/app/Admin/Controllers/DeviceController.php index c1712d1..d391457 100644 --- a/app/Admin/Controllers/DeviceController.php +++ b/app/Admin/Controllers/DeviceController.php @@ -10,6 +10,9 @@ use Slowlyo\OwlAdmin\Renderers\CRUDTable; use Slowlyo\OwlAdmin\Controllers\AdminController; use App\Services\Admin\DeviceService; use App\Models\Device; +use App\Models\Keyword; +use App\Admin\Components; +use Slowlyo\OwlAdmin\Renderers\Button; class DeviceController extends AdminController { @@ -25,13 +28,27 @@ class DeviceController extends AdminController $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'), + Components::make()->keywordsTagControl('group_tags', '分组', 'device-group')->size('md'), + Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'), + amis('submit')->label(__('admin.search'))->level('primary'), + ])) + ->quickSaveItemApi(admin_url('quick-edit/devices/$id')) ->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('is_enable')->type('switch')->label('显示')->quickEdit(Components::make()->enableControl('is_enable', '', 'inline')->saveImmediately(true)), + TableColumn::make()->name('is_recommend')->type('switch')->label('推荐')->quickEdit(Components::make()->enableControl('is_recommend', '', 'inline')->saveImmediately(true)), + TableColumn::make()->name('sort')->label(__('admin.order'))->align('center')->quickEdit(Components::make()->sortControl('sort', __('admin.order'))->saveImmediately(true)), TableColumn::make()->name('created_at')->label('创建时间')->type('datetime')->sortable(true), TableColumn::make()->name('updated_at')->label('更新时间')->type('datetime')->sortable(true), - $this->rowActions(true), + $this->rowActions(true, 'lg'), ]); return $this->baseList($crud); @@ -41,8 +58,8 @@ class DeviceController extends AdminController { return $this->baseForm()->body([ TextControl::make()->name('name')->label('名称')->required(true), - TextControl::make()->name('sn')->label('编号'), - \amisMake()->SelectControl()->name('powered_by')->label('厂家')->options(), + 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), //监控设备-额外参数 @@ -57,6 +74,10 @@ class DeviceController extends AdminController \amisMake()->TextControl()->name('extends.back_port')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label('回放端口'), \amisMake()->TextControl()->name('extends.back_channel')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label('回放通道'), ]), + Components::make()->keywordsTagControl('group_tags', '分组', 'device-group'), + Components::make()->sortControl('sort', __('admin.order')), + TextControl::make()->name('is_enable')->type('switch')->default(1)->label('显示'), + TextControl::make()->name('is_recommend')->type('switch')->default(0)->label('推荐'), ]); } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index f82afc8..135721a 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -43,6 +43,7 @@ Route::group([ $router->resource('keywords', \App\Admin\Controllers\KeywordController::class); //设备管理 $router->resource('devices', \App\Admin\Controllers\DeviceController::class); + $router->post('quick-edit/devices/{device}',[\App\Admin\Controllers\DeviceController::class, 'update']); //设备预警 $router->get('warning-setting', '\App\Admin\Controllers\WarningSettingController@settingIndex'); $router->get('warning-notice', '\App\Admin\Controllers\WarningNoticeController@index'); diff --git a/app/Filters/Admin/DeviceFilter.php b/app/Filters/Admin/DeviceFilter.php new file mode 100644 index 0000000..2be4dc0 --- /dev/null +++ b/app/Filters/Admin/DeviceFilter.php @@ -0,0 +1,36 @@ +where('name', 'like', '%'.$name.'%'); + } + + /** + * 厂家 + */ + public function factory($factory){ + return $this->where('powered_by', $factory); + } + + /** + * 类型 + */ + public function type($type){ + return $this->where('type', $type); + } + + /** + * 分组 + */ + public function groupTags($groupTags){ + return $this->whereRaw("FIND_IN_SET(group_tags,'$groupTags')"); + } +} diff --git a/app/Models/Device.php b/app/Models/Device.php index 81706f8..c4f5081 100644 --- a/app/Models/Device.php +++ b/app/Models/Device.php @@ -16,6 +16,7 @@ class Device extends Model public const TYPE_SOIL = 2; //土壤设备 public const TYPE_WATER_QUALITY = 3; //水质设备 public const TYPE_METEOROLOGICAL = 4; //气象设备 + public const TYPE_AIR = 5; //通风设备 public const STATE_DISABLED = 0; public const STATE_ONLINE = 1; @@ -24,18 +25,14 @@ class Device extends Model protected $fillable = [ 'name', 'sn', 'powered_by', 'type', 'model_sn', 'state', 'extends', - 'is_enable', 'sort', 'is_recommend' + 'is_enable', 'sort', 'is_recommend', + 'group_tags' ]; protected function serializeDate(\DateTimeInterface $date){ return $date->format('Y-m-d H:i:s'); } - public function logs(): HasMany - { - return $this->hasMany(DeviceLog::class); - } - public static function typeMap() { return [ @@ -43,6 +40,17 @@ class Device extends Model self::TYPE_SOIL => '土壤设备', self::TYPE_WATER_QUALITY => '水质设备', self::TYPE_METEOROLOGICAL => '气象设备', + self::TYPE_AIR => '通风设备' ]; } + + public function logs(): HasMany + { + return $this->hasMany(DeviceLog::class); + } + + public function factory(){ + return $this->belongsTo(Keyword::class, 'powered_by'); + } + } diff --git a/app/Models/Keyword.php b/app/Models/Keyword.php index 644c10f..e254230 100644 --- a/app/Models/Keyword.php +++ b/app/Models/Keyword.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Builder; class Keyword extends Model { @@ -48,4 +49,9 @@ class Keyword extends Model return $this->hasMany(static::class, 'parent_id'); } + public static function getByParentKey(String $key) + { + return self::query()->where('type_key', $key)->get(); + } + } diff --git a/app/Services/Admin/DeviceService.php b/app/Services/Admin/DeviceService.php index 35d1753..7b7045e 100644 --- a/app/Services/Admin/DeviceService.php +++ b/app/Services/Admin/DeviceService.php @@ -3,13 +3,17 @@ namespace App\Services\Admin; use App\Models\Device; -use Slowlyo\OwlAdmin\Services\AdminService; +use App\Filters\Admin\DeviceFilter; /** * @method Device getModel() * @method Device|\Illuminate\Database\Query\Builder query() */ -class DeviceService extends AdminService +class DeviceService extends BaseService { protected string $modelName = Device::class; + + protected array $withRelationships = ['factory']; + + protected string $modelFilterName = DeviceFilter::class; } diff --git a/database/migrations/2023_03_20_162006_create_devices_table.php b/database/migrations/2023_03_20_162006_create_devices_table.php index b1a0e4b..053c9fd 100644 --- a/database/migrations/2023_03_20_162006_create_devices_table.php +++ b/database/migrations/2023_03_20_162006_create_devices_table.php @@ -25,6 +25,7 @@ return new class extends Migration $table->unsignedTinyInteger('is_recommend')->default(0)->comment('推荐开关'); $table->unsignedTinyInteger('is_enable')->default(1)->comment('显示开关'); $table->unsignedInteger('sort')->default(0)->comment('排序'); + $table->string('group_tags')->nullable()->comment('分组标签'); $table->timestamps(); }); } diff --git a/database/seeders/KeywordSeeder.php b/database/seeders/KeywordSeeder.php new file mode 100644 index 0000000..33534e8 --- /dev/null +++ b/database/seeders/KeywordSeeder.php @@ -0,0 +1,54 @@ + 'device-factory', 'name' => '厂家', 'list' => [ + ['name' => 'LINK-OS', 'key'=>'link-os'] + ]], + ['key' => 'device-group', 'name' => '设备组', 'list' => [ + ['name' => '农机', 'key'=>'machinery'] + ]], + ]; + + foreach ($list as $item) { + $type = Keyword::create(Arr::except($item, 'list')); + + if (isset($item['list'])) { + $keywords = []; + foreach ($item['list'] as $index => $name) { + $template = [ + 'key' => $type->key . ($index + 1), + 'type_key' => $type->key, + 'level' => $type->level + 1, + 'sort' => $index + 1 + ]; + if (is_array($name)) { + $template = array_merge($template, $name); + } else { + $template['name'] = $name; + } + array_push($keywords, $template); + } + $type->children()->createMany($keywords); + } + } + } +}