diff --git a/app/Http/Controllers/Admin/ParkingPatternController.php b/app/Http/Controllers/Admin/ParkingPatternController.php index 01f9320..2bb1acf 100644 --- a/app/Http/Controllers/Admin/ParkingPatternController.php +++ b/app/Http/Controllers/Admin/ParkingPatternController.php @@ -231,25 +231,21 @@ class ParkingPatternController extends BaseController } /** - * 创建导入 + * 批量导入 * @param Request $request * @return JsonResponse * @throws ValidationException */ - public function import(Request $request): JsonResponse + public function batchImport(Request $request): JsonResponse { try { // 1. 验证上传的文件 $data = $request->all(); $request->validate([ - 'file' => 'required|mimes:xlsx,xls,csv|max:2048', // 限制文件类型和大小 - 'model_name' => 'required' + 'file' => 'required|mimes:xlsx,xls,csv|max:2048' // 限制文件类型和大小 ]); $validator = Validator::make($data, [ - 'file' => 'required|mimes:xlsx,xls,csv|max:2048', - 'model_name.required' => __( - 'validation.parking_pattern.m_empty' - ), + 'file' => 'required|mimes:xlsx,xls,csv|max:2048' ], [ 'file.required' => __('validation.admin_list_vip.file_empty'), 'file.mimes' => __('validation.admin_list_vip.file_mimes'), @@ -259,8 +255,6 @@ class ParkingPatternController extends BaseController throw new ValidationException($validator); } - $model_name = $data['model_name']; - // 2. 获取上传的文件 $file = $request->file('file'); @@ -270,7 +264,7 @@ class ParkingPatternController extends BaseController // 4. 执行导入(使用存储后的绝对路径) // storage_path('app') 获取 storage/app 的绝对路径 Excel::import( - new ParkingPatternImport($model_name, $this->adminUserId), + new ParkingPatternSpaceImport($this->adminUserId), storage_path('app/' . $path) ); @@ -291,21 +285,26 @@ class ParkingPatternController extends BaseController } /** - * 批量导入 + * 创建导入 * @param Request $request * @return JsonResponse * @throws ValidationException */ - public function batchImport(Request $request): JsonResponse + public function import(Request $request): JsonResponse { try { // 1. 验证上传的文件 $data = $request->all(); $request->validate([ - 'file' => 'required|mimes:xlsx,xls,csv|max:2048' // 限制文件类型和大小 + 'file' => 'required|mimes:xlsx,xls,csv|max:2048', + // 限制文件类型和大小 + 'model_name' => 'required' ]); $validator = Validator::make($data, [ - 'file' => 'required|mimes:xlsx,xls,csv|max:2048' + 'file' => 'required|mimes:xlsx,xls,csv|max:2048', + 'model_name.required' => __( + 'validation.parking_pattern.m_empty' + ), ], [ 'file.required' => __('validation.admin_list_vip.file_empty'), 'file.mimes' => __('validation.admin_list_vip.file_mimes'), @@ -315,6 +314,8 @@ class ParkingPatternController extends BaseController throw new ValidationException($validator); } + $model_name = $data['model_name']; + // 2. 获取上传的文件 $file = $request->file('file'); @@ -324,7 +325,7 @@ class ParkingPatternController extends BaseController // 4. 执行导入(使用存储后的绝对路径) // storage_path('app') 获取 storage/app 的绝对路径 Excel::import( - new ParkingPatternSpaceImport($this->adminUserId), + new ParkingPatternImport($model_name, $this->adminUserId), storage_path('app/' . $path) ); @@ -384,4 +385,58 @@ class ParkingPatternController extends BaseController ); } } + + /** + * 释出 优越 车位 + * @param Request $request + * @return JsonResponse + * @throws ValidationException + */ + public function release(Request $request): JsonResponse + { + try { + $id = $request->get('pattern_id', ''); + $this->validateId($id, ParkingPattern::class); + if ($id) { + throw new Exception( + __('controller.parking_pattern.not_parking_space') + ); + } + $this->service->updateDataModel($id, 'release'); + return $this->responseService->success( + null, + __('admin.operation_successful') + ); + } catch (ValidationException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError($e->getMessage()); + } + } + + /** + * 切换离场显示 + * @param Request $request + * @return JsonResponse + * @throws ValidationException + */ + public function change(Request $request): JsonResponse + { + try { + $id = $request->get('pattern_id', ''); + $this->validateId($id, ParkingPattern::class); + $this->service->updateDataModel($id, 'change'); + return $this->responseService->success( + null, + __('admin.operation_successful') + ); + } catch (ValidationException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError( + __('admin.operation_failed') . ':' + . $e->getMessage() + ); + } + } } diff --git a/app/Models/ParkingPattern.php b/app/Models/ParkingPattern.php index 8fbad3e..a710b2c 100644 --- a/app/Models/ParkingPattern.php +++ b/app/Models/ParkingPattern.php @@ -22,14 +22,27 @@ class ParkingPattern extends Model 'is_default' ]; - protected $hidden = [ - 'created_at', - 'updated_at', - 'deleted_at' - ]; + protected $hidden + = [ + 'created_at', + 'updated_at', + 'deleted_at' + ]; public static function getName($id) { return self::query()->where('id', $id)->value('name'); } + + public static function getData() + { + return self::query()->orderBy('created_at', 'desc')->select( + ['id', 'name as model_name'] + )->get()->toArray(); + } + + public static function getId($name) + { + return self::query()->where('name', $name)->value('id'); + } } diff --git a/app/Services/ParkingPatternService.php b/app/Services/ParkingPatternService.php index 75a1aba..af1f8f2 100644 --- a/app/Services/ParkingPatternService.php +++ b/app/Services/ParkingPatternService.php @@ -242,4 +242,28 @@ class ParkingPatternService extends BaseService ); ParkingPatternSpace::query()->where('camera_id', $pattern_id)->delete(); } + + public function updateDataModel($id, $field) + { + try { + DB::beginTransaction(); + $model = ParkingPatternModel::query()->findOrFail($id); + $oldValues = $model->toArray(); + $update = [ + $field => 1, + 'updated_at' => get_datetime() + ]; + $model->update($update); + $this->logService->logUpdated( + $model, + $oldValues, + 'parking_pattern.update' + ); + DB::commit(); + return $model; + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } } diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 5be3b9b..3f99171 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -57,6 +57,8 @@ return [ 'refresh_succeeded' => 'Refresh succeeded !', 'login_successful' => 'Login successful', 'logout_successful' => 'Logout successful', + 'operation_successful' => 'Operation successful !', + 'operation_failed' => 'Operation failed !', 'choose' => 'Choose', 'choose_file' => 'Select file', 'choose_image' => 'Select image', diff --git a/resources/lang/zh-CN/admin.php b/resources/lang/zh-CN/admin.php index a7f96fa..5d3bfb6 100644 --- a/resources/lang/zh-CN/admin.php +++ b/resources/lang/zh-CN/admin.php @@ -57,6 +57,8 @@ return [ 'refresh_succeeded' => '刷新成功 !', 'login_successful' => '登录成功 !', 'logout_successful' => '登出成功 !', + 'operation_successful' => '操作成功 !', + 'operation_failed' => '操作失败 !', 'choose' => '选择', 'choose_file' => '选择文件', 'choose_image' => '选择图片', diff --git a/resources/lang/zh-CN/controller.php b/resources/lang/zh-CN/controller.php index fe1772d..4ae735a 100644 --- a/resources/lang/zh-CN/controller.php +++ b/resources/lang/zh-CN/controller.php @@ -29,5 +29,8 @@ return [ ], 'license_plate' => [ 'clear_success' => '清除成功' + ], + 'parking_pattern' => [ + 'not_parking_space' => '当前模式没有 [优越] 车位' ] ]; diff --git a/resources/lang/zh-CN/exception.php b/resources/lang/zh-CN/exception.php index 4f52032..bb7abd3 100644 --- a/resources/lang/zh-CN/exception.php +++ b/resources/lang/zh-CN/exception.php @@ -74,5 +74,12 @@ return [ 'create_failed' => '新增失败', 'update_failed' => '更新失败', 'destroy_failed' => '删除失败' + ], + 'event_calendar' => [ + 'create_failed' => '新增活动失败', + 'update_failed' => '更新活动失败', + 'destroy_failed' => '删除活动失败', + 'end_failed' => '结束活动失败', + 'end_succeeded' => '结束活动成功' ] ]; diff --git a/resources/lang/zh-CN/exports.php b/resources/lang/zh-CN/exports.php index c5c51c2..b3b65a7 100644 --- a/resources/lang/zh-CN/exports.php +++ b/resources/lang/zh-CN/exports.php @@ -53,5 +53,8 @@ return [ 'action' => '操作', 'action_str' => '操作类型', 'description' => '操作内容', + ], + 'event_calendar' => [ + 'list' => '活动行事历模板' ] ]; diff --git a/resources/lang/zh-CN/log.php b/resources/lang/zh-CN/log.php index 3b7cad0..e0f9eba 100644 --- a/resources/lang/zh-CN/log.php +++ b/resources/lang/zh-CN/log.php @@ -80,5 +80,11 @@ return [ 'create' => '创建活动模式关联车位', 'update' => '更新活动模式关联车位', 'delete' => '删除活动模式关联车位' + ], + 'event_calendar' => [ + 'create' => '创建活动行事历', + 'update' => '更新活动行事历', + 'delete' => '删除活动行事历', + 'import' => '导入活动行事历' ] ]; diff --git a/resources/lang/zh-CN/service.php b/resources/lang/zh-CN/service.php index 5990d4b..263c6e0 100644 --- a/resources/lang/zh-CN/service.php +++ b/resources/lang/zh-CN/service.php @@ -1,26 +1,26 @@ [ + 'admin_role' => [ 'name_exists' => '角色名称已存在', 'menu_error' => '角色编号参数有误' ], - 'admin_user' => [ + 'admin_user' => [ 'name_exists' => '用户账号已存在' ], - 'admin_translation' => [ + 'admin_translation' => [ 'data_exists' => '翻译配置已存在' ], - 'admin_floor' => [ + 'admin_floor' => [ 'name_exists' => '楼层名称已存在' ], - 'admin_vip_list' => [ + 'admin_vip_list' => [ 'license_exists' => '车牌号码已存在' ], - 'space_attributes' => [ + 'space_attributes' => [ 'attributes_exists' => '车位属性名称已存在' ], - 'space_type' => [ + 'space_type' => [ 'red' => '红色', 'green' => '绿色', 'yellow' => '黄色', @@ -31,18 +31,18 @@ return [ 'name_exists' => '车位类型名称已存在', 'license_exists' => '请先清空车牌,即可删除' ], - 'license_plate' => [ + 'license_plate' => [ 'number_exists' => '车牌号码已存在', 'not_clear' => '没有车牌需要清除' ], - 'reservation' => [ + 'reservation' => [ 'undetermined' => '待确定', 'confirmed' => '已确定', 'canceled' => '已取消', 'yes' => '是', 'no' => '否' ], - 'parking_space' => [ + 'parking_space' => [ 'vacant' => '空置', 'occupy' => '占用', 'high' => '高', @@ -56,14 +56,23 @@ return [ 'parking_information' => [ 'not_default' => '未设置默认车位类型' ], - 'parking_camera' => [ + 'parking_camera' => [ 'number_exists' => '设备编号已存在', 'flat_garage' => '平面车库' ], - 'parking_pattern' => [ - 'name_exists' => '活动模式已存在', - 'space_exists' => '当前模式车位号已存在', + 'parking_pattern' => [ + 'name_exists' => '活动模式已存在', + 'space_exists' => '当前模式车位号已存在', 'space_not_exists' => '当前模式车位号不存在', - 'type_not_exists' => '当前模式车位类型不存在' + 'type_not_exists' => '当前模式车位类型不存在' + ], + 'event_calendar' => [ + 'planned' => '计划中', + 'running' => '运行中', + 'ended' => '已结束', + 'disabled' => '已停用', + 'pattern_exists' => '当前活动模式已存在', + 'error_status' => '当前活动状态不可删除', + 'error_end' => '当前活动状态不可结束' ] ]; diff --git a/resources/lang/zh-CN/validation.php b/resources/lang/zh-CN/validation.php index 9628042..e2beb9f 100644 --- a/resources/lang/zh-CN/validation.php +++ b/resources/lang/zh-CN/validation.php @@ -103,5 +103,10 @@ return [ 'id_empty' => '活动模式编号不能为空', 'space_id_empty' => '模式车位号不能为空', 'type_empty' => '模式车位类型不能为空', + ], + 'event_calendar' => [ + 'p_empty' => '活动模式不能为空', + 's_empty' => '开始时间不能为空', + 'e_empty' => '结束时间不能为空' ] ]; diff --git a/resources/lang/zh-TW/admin.php b/resources/lang/zh-TW/admin.php index 6574ee9..78cf7b5 100644 --- a/resources/lang/zh-TW/admin.php +++ b/resources/lang/zh-TW/admin.php @@ -57,6 +57,8 @@ return [ 'refresh_succeeded' => '成功重新整理!', 'login_successful' => '成功登入!', 'logout_successful' => '成功登出!', + 'operation_successful' => '操作成功 !', + 'operation_failed' => '操作失敗 !', 'choose' => '選擇', 'choose_file' => '選擇檔案', 'choose_image' => '選擇圖片', diff --git a/routes/admin/api.php b/routes/admin/api.php index 8334c2d..2174a04 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -42,6 +42,17 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/menu', [IndexController::class, 'menu']); // 活动行事历 Route::get('/eventCalendar', [EventCalendarController::class, 'index']); + Route::get('/eventCalendar/search', [EventCalendarController::class, 'search']); + Route::post('/eventCalendar/changeMode', [EventCalendarController::class, 'changeMode']); + Route::get('/eventCalendar/create', [EventCalendarController::class, 'create']); + Route::post('/eventCalendar', [EventCalendarController::class, 'store']); + Route::get('/eventCalendar/edit/{id}', [EventCalendarController::class, 'edit']); + Route::put('/eventCalendar/{id}', [EventCalendarController::class, 'update']); + Route::delete('/eventCalendar/{id}', [EventCalendarController::class, 'destroy']); + Route::get('/eventCalendar/end/{id}', [EventCalendarController::class, 'end']); + Route::post('/eventCalendar/import', [EventCalendarController::class, 'import']); + Route::get('/eventCalendar/targetMode', [EventCalendarController::class, 'targetMode']); + // 模式管理 Route::get('/pattern', [ParkingPatternController::class, 'index']); Route::get('/pattern/search', [ParkingPatternController::class, 'search']); @@ -51,6 +62,8 @@ Route::group(['prefix' => 'admin'], function () { Route::post('/pattern/batchImport', [ParkingPatternController::class, 'batchImport']); Route::delete('/pattern/{id}', [ParkingPatternController::class, 'destroy']); Route::get('/pattern/rule', [ParkingPatternController::class, 'rule']); + Route::get('/pattern/release', [ParkingPatternController::class, 'release']); + Route::get('/pattern/change', [ParkingPatternController::class, 'change']); Route::get('/patternSpace', [ParkingPatternSpaceController::class, 'index']); Route::get('/patternSpace/search', [ParkingPatternSpaceController::class, 'search']); Route::get('/patternSpace/create', [ParkingPatternSpaceController::class, 'create']); @@ -184,4 +197,5 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/pattern/modelExport', [ParkingPatternController::class, 'importModelTemplate']); Route::get('/pattern/spacesExport', [ParkingPatternController::class, 'importTemplate']); Route::get('/operationLog/export', [OperationLogController::class, 'export']); + Route::get('/eventCalendar/export', [EventCalendarController::class, 'importTemplate']); });