diff --git a/app/Http/Controllers/Admin/ConfigController.php b/app/Http/Controllers/Admin/ConfigController.php index 36d80d3..7305431 100644 --- a/app/Http/Controllers/Admin/ConfigController.php +++ b/app/Http/Controllers/Admin/ConfigController.php @@ -120,6 +120,7 @@ class ConfigController extends BaseController $model->update([ 'content' => $content, + 'user_id' => $this->adminUserId, 'updated_at' => get_datetime() ]); diff --git a/app/Http/Controllers/Admin/NoticeController.php b/app/Http/Controllers/Admin/NoticeController.php index a43f4d3..8321194 100644 --- a/app/Http/Controllers/Admin/NoticeController.php +++ b/app/Http/Controllers/Admin/NoticeController.php @@ -36,6 +36,9 @@ class NoticeController extends BaseController public function index(Request $request): JsonResponse { try { + // 进入自动已读 + $this->service->readModel($this->adminUserId); + $query = AdminNotice::query(); if ($request->has('alarm_type')) { @@ -78,6 +81,7 @@ class NoticeController extends BaseController $columns )->get()->each(function ($item) { $item['alarm_type_index'] = $item['alarm_type']; + $item['msg_type_index'] = $item['msg_type']; return $this->service->getItem($item); }); @@ -162,7 +166,7 @@ class NoticeController extends BaseController if ($validator->fails()) { throw new ValidationException($validator); } - $this->service->updateConfig($data); + $this->service->updateConfig($data, $this->adminUserId); return $this->responseService->success([], __('admin.operation_successful')); } catch (Exception $e) { @@ -184,9 +188,11 @@ class NoticeController extends BaseController 'msg_type', 'space_id', 'floor_id', - 'camera_id' + 'camera_id', + 'pattern_id' ]; $data = AdminNotice::query()->find($id, $columns)->toArray(); + $data['parking_space_id'] = $data['space_id']; $data = $this->service->getItem($data); return $this->responseService->success($data); } catch (Exception $e) { @@ -206,4 +212,23 @@ class NoticeController extends BaseController __('exports.notice.list') . time() . '.xlsx' ); } + + public function message(): JsonResponse + { + try { + $where = [ + 'user_id' => $this->adminUserId, + 'is_read' => 0 + ]; + $data = [ + 'notice_count' => AdminNotice::query()->where($where)->count() + ]; + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } } diff --git a/app/Http/Controllers/Admin/ParkingSpaceAttributesController.php b/app/Http/Controllers/Admin/ParkingSpaceAttributesController.php index 3ff6f4b..99e7c3a 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceAttributesController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceAttributesController.php @@ -131,7 +131,7 @@ class ParkingSpaceAttributesController extends BaseController ->get() ->toArray(); foreach ($data as &$item) { - $item['import_diagram_url'] = env('APP_URL') . $item['import_diagram']; + $item['import_diagram_url'] = get_image_url($item['import_diagram']); } return $this->responseService->success($data); } catch (Exception $e) { diff --git a/app/Http/Controllers/Admin/ParkingSpaceCatMapController.php b/app/Http/Controllers/Admin/ParkingSpaceCatMapController.php index 6740f64..13f6924 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceCatMapController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceCatMapController.php @@ -66,8 +66,7 @@ class ParkingSpaceCatMapController extends BaseController 'deleted_at' )->first(); if ($floorData) { - $floorData['pic_url'] = env('app_url') - . $floorData['image_url']; + $floorData['pic_url'] = get_image_url($floorData['image_url']); unset($floorData['image_url']); } $model = ParkingElectronicMap::query()->where( diff --git a/app/Http/Controllers/Admin/ParkingSpaceController.php b/app/Http/Controllers/Admin/ParkingSpaceController.php index 689aca5..c726823 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceController.php @@ -279,11 +279,12 @@ class ParkingSpaceController extends BaseController } } } + $data['recognition_rate'] = $item['recognition']; $data['recognition'] = $this->service->getRecognition( $item['recognition'] ); $data['berthing_time'] = $item['berthing_time']; - $data['space_url'] = ''; + $data['space_url'] = get_image_url($item['pic_url']); return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); diff --git a/app/Models/AdminConfigs.php b/app/Models/AdminConfigs.php index 0e3486b..c7afc8f 100644 --- a/app/Models/AdminConfigs.php +++ b/app/Models/AdminConfigs.php @@ -11,7 +11,8 @@ class AdminConfigs extends Model use HasFactory, SoftDeletes; protected $fillable = [ - 'content' + 'content', + 'user_id' ]; protected $hidden = [ diff --git a/app/Models/ParkingSpace.php b/app/Models/ParkingSpace.php index 9c5458b..5fa6f58 100644 --- a/app/Models/ParkingSpace.php +++ b/app/Models/ParkingSpace.php @@ -21,7 +21,8 @@ class ParkingSpace extends Model 'recognition', 'status', 'space_type_id', - 'operation_type' + 'operation_type', + 'pic_url' ]; protected $hidden diff --git a/app/Services/AdminFloorService.php b/app/Services/AdminFloorService.php index b0dcb9f..ebb010d 100644 --- a/app/Services/AdminFloorService.php +++ b/app/Services/AdminFloorService.php @@ -192,7 +192,7 @@ class AdminFloorService ->get()->toArray(); foreach ($list as &$item) { if (isset($item['pic_url'])) { - $item['pic_url'] = env('APP_URL') . $item['pic_url']; + $item['pic_url'] = get_image_url($item['pic_url']); } } return $list; @@ -204,7 +204,7 @@ class AdminFloorService $data = AdminFloor::query()->where('id', $id)->get()->toArray(); foreach ($data as &$item) { if (isset($item['image_url'])) { - $item['pic_url'] = env('APP_URL') . $item['image_url']; + $item['pic_url'] = get_image_url($item['image_url']); } } return $data; diff --git a/app/Services/AdminNoticeService.php b/app/Services/AdminNoticeService.php index 080da8d..3cf3ea3 100644 --- a/app/Services/AdminNoticeService.php +++ b/app/Services/AdminNoticeService.php @@ -7,6 +7,7 @@ use App\Models\AdminFloor; use App\Models\AdminNotice; use App\Models\ParkingCamera; use App\Models\ParkingLicensePlate; +use App\Models\ParkingPattern; use App\Models\ParkingSpace; use Exception; use Illuminate\Support\Facades\DB; @@ -16,17 +17,17 @@ class AdminNoticeService extends BaseService private static array $alarmTypeArr = [ - 1 => 'hint', - 2 => 'support' + 1 => 'hint',// 提示信息 + 2 => 'support'// 支援信息 ]; private static array $msgTypeArr = [ - 1 => 'touch', - 2 => 'illegal', - 3 => 'offline', - 4 => 'vip', - 5 => 'task' + 1 => 'touch',// 压线 + 2 => 'illegal',// 违泊 + 3 => 'offline',// 设备离线 + 4 => 'vip',// VIP + 5 => 'task'// 任务切换 ]; public function __construct(OperationLogService $logService) @@ -78,18 +79,33 @@ class AdminNoticeService extends BaseService ); } if (isset($item['floor_id'])) { - $item['floor'] = AdminFloor::getName($item['floor_id']); + $item['floor'] = ''; + if ($item['floor_id']) { + $item['floor'] = AdminFloor::getName($item['floor_id']); + } unset($item['floor_id']); } if (isset($item['camera_id'])) { - $item['camera_number'] = ParkingCamera::getNumber($item['camera_id']); + $item['camera_number'] = ''; + if ($item['camera_id']) { + $item['camera_number'] = ParkingCamera::getNumber($item['camera_id']); + } unset($item['camera_id']); } + if (isset($item['pattern_id'])) { + $item['pattern_name'] = ''; + if ($item['pattern_id']) { + $item['pattern_name'] = ParkingPattern::getName( + $item['pattern_id'] + ); + } + unset($item['pattern_id']); + } unset($item['space_id']); return $item; } - public function updateConfig($data) + public function updateConfig($data, $user_id) { try { DB::beginTransaction(); @@ -103,6 +119,7 @@ class AdminNoticeService extends BaseService $model->update([ 'content' => $content, + 'user_id' => $user_id, 'updated_at' => get_datetime() ]); @@ -116,19 +133,22 @@ class AdminNoticeService extends BaseService } } - public static function createData($data, $user_id) + // 添加切换模式消息 + public static function addChangeModeNotice($pattern_id, $user_id) + { + $data = ['pattern_id' => $pattern_id]; + self::createData(1, 5, $data, $user_id); + } + + public static function createData($alarm_type, $msg_type, $data, $user_id) { - $alarm_type = $data['alarm_type']; - $camera_ip = $data['camera_ip']; - $msg_type = $data['msg_type']; $create = [ - 'alarm_time' => get_datetime(), - 'alarm_type' => $alarm_type, - 'camera_ip' => $camera_ip, - 'msg_type' => $msg_type, - 'is_read' => 0, - 'admin_user_id' => $user_id, - 'created_at' => get_datetime() + 'alarm_time' => get_datetime(), + 'alarm_type' => $alarm_type, + 'msg_type' => $msg_type, + 'is_read' => 0, + 'user_id' => $user_id, + 'created_at' => get_datetime() ]; if (isset($data['space_id']) && $data['space_id']) { $create['space_id'] = $data['space_id']; @@ -142,6 +162,34 @@ class AdminNoticeService extends BaseService if (isset($data['msg_content']) && $data['msg_content']) { $create['msg_content'] = $data['msg_content']; } + if (isset($data['pattern_id']) && $data['pattern_id']) { + $create['pattern_id'] = $data['pattern_id']; + } + if (isset($data['camera_ip']) && $data['camera_ip']) { + $create['camera_ip'] = $data['camera_ip']; + } AdminNotice::query()->create($create); } + + public function readModel($user_id) + { + try { + DB::beginTransaction(); + $where = [ + 'user_id' => $user_id, + 'is_read' => 0 + ]; + $ids = AdminNotice::query()->where($where)->pluck('id'); + if ($ids) { + $update = [ + 'is_read' => 1 + ]; + AdminNotice::query()->whereIn('id', $ids)->update($update); + } + DB::commit(); + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } } diff --git a/app/Services/EventCalendarService.php b/app/Services/EventCalendarService.php index d92f830..01b44ce 100644 --- a/app/Services/EventCalendarService.php +++ b/app/Services/EventCalendarService.php @@ -239,6 +239,9 @@ class EventCalendarService extends BaseService $this->logService->logCreated($model, 'event_calendar.create'); } + // 生成警报信息消息 + AdminNoticeService::addChangeModeNotice($pattern_id, $user_id); + DB::commit(); return $model; } catch (Exception $e) { diff --git a/app/Services/ParkingSpaceService.php b/app/Services/ParkingSpaceService.php index 5c10d0b..48bc022 100644 --- a/app/Services/ParkingSpaceService.php +++ b/app/Services/ParkingSpaceService.php @@ -15,6 +15,7 @@ use Illuminate\Support\Facades\DB; class ParkingSpaceService extends BaseService { + protected int $recognition = 80; /** * @var string[] */ @@ -50,7 +51,8 @@ class ParkingSpaceService extends BaseService public function getRecognition($recognition): string { if ($recognition) { - return __('service.parking_space.' . $recognition); + $str = $recognition >= $this->recognition ? 'high' : 'land'; + return __('service.parking_space.' . $str); } return '-'; } diff --git a/app/common.php b/app/common.php index 3fbc5b3..054ad84 100644 --- a/app/common.php +++ b/app/common.php @@ -116,3 +116,10 @@ if (!function_exists('get_time_difference')) { } } } + +if (!function_exists('get_image_url')) { + function get_image_url(string $image_url): string + { + return $image_url ? env('APP_URL') . $image_url : ''; + } +} diff --git a/database/migrations/2026_02_10_110429_create_admin_configs_table.php b/database/migrations/2026_02_10_110429_create_admin_configs_table.php index 1825fae..3a588da 100644 --- a/database/migrations/2026_02_10_110429_create_admin_configs_table.php +++ b/database/migrations/2026_02_10_110429_create_admin_configs_table.php @@ -17,6 +17,7 @@ return new class extends Migration $table->string('name')->comment('配置标识'); $table->text('content')->nullable()->comment('配置内容'); $table->tinyInteger('status')->default(1)->comment('状态:0禁用 1启用'); + $table->integer('user_id')->default(0)->comment('操作员'); $table->timestamps(); $table->softDeletes(); $table->innoDb(); diff --git a/database/migrations/2026_03_23_143449_create_parking_space_table.php b/database/migrations/2026_03_23_143449_create_parking_space_table.php index 219b1c2..9f0ba46 100644 --- a/database/migrations/2026_03_23_143449_create_parking_space_table.php +++ b/database/migrations/2026_03_23_143449_create_parking_space_table.php @@ -22,6 +22,7 @@ return new class extends Migration $table->tinyInteger('status')->default(0)->comment('状态 0空置 1占用'); $table->integer('space_type_id')->comment('车位类型id'); $table->tinyInteger('operation_type')->default(0)->comment('操作类型'); + $table->string('pic_url', 255)->nullable()->default('')->comment('车位图片'); $table->timestamps(); }); } diff --git a/database/migrations/2026_04_23_143449_create_admin_notice_table.php b/database/migrations/2026_04_23_143449_create_admin_notice_table.php index ae64ef9..91de7a3 100644 --- a/database/migrations/2026_04_23_143449_create_admin_notice_table.php +++ b/database/migrations/2026_04_23_143449_create_admin_notice_table.php @@ -15,14 +15,15 @@ return new class extends Migration $table->id(); $table->timestamp('alarm_time')->comment('信息时间'); $table->tinyInteger('alarm_type')->default(0)->comment('信息类型'); - $table->string('camera_ip', 15)->comment('ip'); + $table->string('camera_ip', 15)->nullable()->comment('ip'); $table->tinyInteger('msg_type')->default(0)->comment('信息内容'); $table->string('msg_content', 255)->default('')->comment('信息内容详情'); $table->integer('space_id')->nullable()->comment('车位id'); $table->integer('floor_id')->nullable()->comment('楼层id'); $table->integer('camera_id')->nullable()->comment('相机设备id'); + $table->integer('pattern_id')->nullable()->comment('模式id'); $table->tinyInteger('is_read')->default(0)->comment('是否已读'); - $table->integer('admin_user_id')->default(0)->comment('操作员'); + $table->integer('user_id')->default(0)->comment('操作员'); $table->timestamps(); $table->innoDb(); $table->index('alarm_type', 'alarm_type'); diff --git a/routes/admin/api.php b/routes/admin/api.php index c2f775c..7280872 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -145,6 +145,7 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/vipAccessRecord/{id}', [VipAccessRecordController::class, 'show']); // 警报&通知 Route::get('/notice', [NoticeController::class, 'index']); + Route::get('/notice/index', [NoticeController::class, 'message']); Route::get('/notice/search', [NoticeController::class, 'search']); Route::get('/notice/setting', [NoticeController::class, 'create']); Route::post('/notice/setting', [NoticeController::class, 'setting']);