完善设备管理
parent
cfbd28918d
commit
8f8d5ff8ef
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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('推荐'),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace App\Filters\Admin;
|
||||
|
||||
use EloquentFilter\ModelFilter;
|
||||
|
||||
class DeviceFilter extends ModelFilter
|
||||
{
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
public function name($name){
|
||||
return $this->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')");
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\Keyword;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class KeywordSeeder extends Seeder
|
||||
{
|
||||
use WithoutModelEvents;
|
||||
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
Keyword::truncate();
|
||||
$list = [
|
||||
['key' => '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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue