diff --git a/app/Exports/EventCalendarTemplateExport.php b/app/Exports/EventCalendarTemplateExport.php index 96b5b45..41a91ab 100644 --- a/app/Exports/EventCalendarTemplateExport.php +++ b/app/Exports/EventCalendarTemplateExport.php @@ -10,20 +10,20 @@ class EventCalendarTemplateExport implements FromArray { return [ [ - 'No.', - 'Mode Name', - 'Start Date', - 'Start Time', - 'End Date', - 'End Time' + __exports('global.index'), + __exports('event_calendar.export1'), + __exports('event_calendar.export2'), + __exports('event_calendar.export3'), + __exports('event_calendar.export4'), + __exports('event_calendar.export5') ], [ '1', 'Raceday - Major Raceday', - ' 2026-10-01', - '10:30:00', - ' 2026-10-01', - '18:30:00' + '2026-10-01', + '10:30', + '2026-10-01', + '18:30' ] ]; } diff --git a/app/Imports/EventCalendarImport.php b/app/Imports/EventCalendarImport.php index f2b6617..d4f10a4 100644 --- a/app/Imports/EventCalendarImport.php +++ b/app/Imports/EventCalendarImport.php @@ -4,14 +4,15 @@ namespace App\Imports; use App\Models\EventCalendar; use App\Models\ParkingPattern; +use App\Services\AdminTranslationService; use App\Services\OperationLogService; use Maatwebsite\Excel\Concerns\ToModel; -use Maatwebsite\Excel\Concerns\WithHeadingRow; -class EventCalendarImport implements ToModel, WithHeadingRow +class EventCalendarImport implements ToModel { protected string $user_id; protected OperationLogService $logService; + protected int $index = 1; public function __construct(string $user_id) { @@ -26,17 +27,24 @@ class EventCalendarImport implements ToModel, WithHeadingRow */ public function model(array $row) { - $pattern_name = $row['mode_name']; - $start_date = $row['start_date']; - $start_time = $row['start_time']; - $end_date = $row['end_date']; - $end_time = $row['end_time']; + if ($this->index == 1) { + $this->index += 1; + return; + } + $pattern_name = $row[1]; + $start_date = $row[2]; + $start_time = $row[3]; + $end_date = $row[4]; + $end_time = $row[5]; if (empty($pattern_name)) { return ; } $pattern_id = ParkingPattern::getId($pattern_name); if (!$pattern_id) { - return ; + $pattern_id = AdminTranslationService::getTypeId(10, $pattern_name); + if (!$pattern_id) { + return; + } } if (EventCalendar::query()->whereIn('status', [0, 1])->where( 'pattern_id', @@ -66,12 +74,25 @@ class EventCalendarImport implements ToModel, WithHeadingRow $start_time = date("H:i:s", $start_times); $end_date_time = date("Y-m-d", $end_date_times); $end_time = date("H:i:s", $end_times); + $save_start_time = $start_date . ' ' . $start_time; + $save_end_time = $end_date_time . ' ' . $end_time; + + // 开始时间不能大于结束时间 + if (strtotime($save_start_time) > strtotime($save_end_time)) { + return; + } + // 开始时间 和 结束时间段 存在活动不允许上传 + $start_time_exists = $this->validateDate($save_start_time); + $end_time_exists = $this->validateDate($save_end_time); + if ($start_time_exists || $end_time_exists) { + return; + } $create = [ 'pattern_id' => $pattern_id, 'admin_user_id' => $this->user_id, - 'start_time' => $start_date . ' ' . $start_time, - 'end_time' => $end_date_time . ' ' . $end_time, + 'start_time' => $save_start_time, + 'end_time' => $save_end_time, 'status' => 0, 'created_at' => get_datetime() ]; @@ -80,4 +101,16 @@ class EventCalendarImport implements ToModel, WithHeadingRow $this->logService->logCreated($model, 'event_calendar.import'); } + + protected function validateDate($datetime) + { + $model = EventCalendar::query(); + return $model->whereIn('status', [0, 1]) + ->where(function ($query) use ($datetime) { + $query->whereRaw( + "'{$datetime}' BETWEEN start_time AND end_time" + ); + }) + ->exists(); + } } diff --git a/app/Services/AdminTranslationService.php b/app/Services/AdminTranslationService.php index 0465c96..9b8c705 100644 --- a/app/Services/AdminTranslationService.php +++ b/app/Services/AdminTranslationService.php @@ -231,4 +231,17 @@ class AdminTranslationService $tr_name = self::getTranslationName($type_id, $type); return $tr_name ?: $name; } + + // 查询关联翻译信息 + public static function getTypeId($type, $name) + { + return AdminTranslation::query()->where('type', $type)->where( + function ($query) use ($name) { + $query->orWhere('en', $name); + $query->orWhere('zh_cn', $name); + $query->orWhere('zh_tw', $name); + } + )->value('type_id'); + + } } diff --git a/resources/lang/en/exports.php b/resources/lang/en/exports.php index 2896bb9..0627d10 100644 --- a/resources/lang/en/exports.php +++ b/resources/lang/en/exports.php @@ -57,7 +57,12 @@ return [ 'description' => 'Operation content', ], 'event_calendar' => [ - 'list' => 'Activity Calendar Template' + 'list' => 'Activity Calendar Template', + 'export1' => 'Mode Name', + 'export2' => 'Start Date', + 'export3' => 'Start Time', + 'export4' => 'End Date', + 'export5' => 'End Time' ], 'notice' => [ 'list' => 'Alerts_Notifications', diff --git a/resources/lang/en/middleware.php b/resources/lang/en/middleware.php index f1a42b5..c10c331 100644 --- a/resources/lang/en/middleware.php +++ b/resources/lang/en/middleware.php @@ -3,7 +3,7 @@ return [ 'auth' => [ 'token_exists' => 'Lack of authentication token', - 'token_invalid' => 'Invalid authentication token', + 'token_invalid' => 'Login authentication failed', 'user_disabled' => 'The user has been disabled', 'use_json' => 'The request must be in JSON format', 'login_invalid' => 'Login expired' diff --git a/resources/lang/zh-CN/exports.php b/resources/lang/zh-CN/exports.php index f0f8fe9..5b13b46 100644 --- a/resources/lang/zh-CN/exports.php +++ b/resources/lang/zh-CN/exports.php @@ -57,7 +57,12 @@ return [ 'description' => '操作内容', ], 'event_calendar' => [ - 'list' => '活动行事历模板' + 'list' => '活动行事历模板', + 'export1' => '模式名称', + 'export2' => '开始日期', + 'export3' => '开始时间', + 'export4' => '结束日期', + 'export5' => '结束时间' ], 'notice' => [ 'list' => '警报通知', diff --git a/resources/lang/zh-CN/middleware.php b/resources/lang/zh-CN/middleware.php index 0b5a01f..f188b52 100644 --- a/resources/lang/zh-CN/middleware.php +++ b/resources/lang/zh-CN/middleware.php @@ -3,7 +3,7 @@ return [ 'auth' => [ 'token_exists' => '缺少认证令牌', - 'token_invalid' => '认证令牌无效', + 'token_invalid' => '登录认证失效', 'user_disabled' => '用户已被禁用', 'use_json' => '请求必须使用 JSON 格式', 'login_invalid' => '登录失效' diff --git a/resources/lang/zh-TW/exports.php b/resources/lang/zh-TW/exports.php index f70207c..413124d 100644 --- a/resources/lang/zh-TW/exports.php +++ b/resources/lang/zh-TW/exports.php @@ -57,7 +57,12 @@ return [ 'description' => '操作内容', ], 'event_calendar' => [ - 'list' => '活動行事曆範本' + 'list' => '活動行事曆範本', + 'export1' => '模式名稱', + 'export2' => '開始日期', + 'export3' => '開始時間', + 'export4' => '結束日期', + 'export5' => '結束時間' ], 'notice' => [ 'list' => '警報通知', diff --git a/resources/lang/zh-TW/middleware.php b/resources/lang/zh-TW/middleware.php index a810112..443540a 100644 --- a/resources/lang/zh-TW/middleware.php +++ b/resources/lang/zh-TW/middleware.php @@ -3,7 +3,7 @@ return [ 'auth' => [ 'token_exists' => '缺少認證權杖', - 'token_invalid' => '認證權杖無效', + 'token_invalid' => '登入認證失效', 'user_disabled' => '用戶已被禁用', 'use_json' => '請求必須使用JSON格式', 'login_invalid' => '登入失效' diff --git a/routes/admin/api.php b/routes/admin/api.php index 851c9ba..25b53c4 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -76,6 +76,7 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/eventCalendar/rule', [EventCalendarController::class, 'rule']); Route::get('/eventCalendar/index', [EventCalendarController::class, 'calendarList']); Route::post('/eventCalendar/index', [EventCalendarController::class, 'calendarDayList']); + Route::get('/eventCalendar/export', [EventCalendarController::class, 'importTemplate']); // 模式管理 Route::get('/pattern', [ParkingPatternController::class, 'index']); @@ -370,7 +371,6 @@ 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']); Route::get('/notice/export', [NoticeController::class, 'export']); Route::get('/parkingBehavior/export', [ParkingBehaviorController::class, 'export']); Route::get('/licensePlateRecognition/export', [LicensePlateRecognitionController::class, 'export']);