Browse Source

导入报名单返回错误,通道改车道,岗亭改展位

master
wanghongjun 1 day ago
parent
commit
40a39f52ba
  1. 11
      app/Http/Controllers/Admin/ParkingWhitelistController.php
  2. 28
      app/Imports/ParkingWhitelistImport.php
  3. 2
      resources/lang/en/exports.php
  4. 6
      resources/lang/en/imports.php
  5. 16
      resources/lang/en/log.php
  6. 4
      resources/lang/en/service.php
  7. 22
      resources/lang/en/validation.php
  8. 2
      resources/lang/zh-CN/exports.php
  9. 6
      resources/lang/zh-CN/imports.php
  10. 18
      resources/lang/zh-CN/log.php
  11. 4
      resources/lang/zh-CN/service.php
  12. 22
      resources/lang/zh-CN/validation.php
  13. 2
      resources/lang/zh-TW/exports.php
  14. 6
      resources/lang/zh-TW/imports.php
  15. 18
      resources/lang/zh-TW/log.php
  16. 4
      resources/lang/zh-TW/service.php
  17. 22
      resources/lang/zh-TW/validation.php

11
app/Http/Controllers/Admin/ParkingWhitelistController.php

@ -272,18 +272,25 @@ class ParkingWhitelistController extends BaseController
// 4. 执行导入(使用存储后的绝对路径) // 4. 执行导入(使用存储后的绝对路径)
// storage_path('app') 获取 storage/app 的绝对路径 // storage_path('app') 获取 storage/app 的绝对路径
$model = new ParkingWhitelistImport($this->adminUserId);
Excel::import( Excel::import(
new ParkingWhitelistImport($this->adminUserId), $model,
storage_path('app/' . $path) storage_path('app/' . $path)
); );
// 5. (可选)导入完成后删除临时文件 // 5. (可选)导入完成后删除临时文件
Storage::delete($path); Storage::delete($path);
// 6. 返回错误行
$error_arr = $model->errorArr();
if ($error_arr) {
throw new CustomException(implode("<br>", $error_arr));
}
return $this->responseService->success( return $this->responseService->success(
__('controller.import.success') __('controller.import.success')
); );
} catch (ValidationException $e) { } catch (ValidationException|CustomException $e) {
throw $e; throw $e;
} catch (Exception $e) { } catch (Exception $e) {
return $this->responseService->systemError( return $this->responseService->systemError(

28
app/Imports/ParkingWhitelistImport.php

@ -12,8 +12,9 @@ use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithChunkReading; use Maatwebsite\Excel\Concerns\WithChunkReading;
class ParkingWhitelistImport implements ToModel, WithChunkReading class ParkingWhitelistImport implements ToModel, WithChunkReading
{ {
protected int $index = 1; protected int $index = 0;
protected int $user_id; protected int $user_id;
protected array $error = [];
public function __construct($admin_user_id) public function __construct($admin_user_id)
{ {
@ -22,27 +23,32 @@ class ParkingWhitelistImport implements ToModel, WithChunkReading
public function model(array $row) public function model(array $row)
{ {
if ($this->index == 1) { if (!$this->index) {
$this->index += 1; $this->index += 1;
return; return;
} }
$license_plate = $row[1]; $this->index += 1;
$license_plate = $row[1] ?? '';
if (empty($license_plate)) { if (empty($license_plate)) {
$this->error[] = imports_error($this->index, 'import33');
return; return;
} }
$parking_name = $row[2]; $parking_name = $row[2] ?? '';
if (empty($parking_name)) { if (empty($parking_name)) {
$this->error[] = imports_error($this->index, 'import20');
return; return;
} }
$parking_id = Parking::getValueId($parking_name); $parking_id = Parking::getValueId($parking_name);
if (empty($parking_id)) { if (empty($parking_id)) {
$parking_id = AdminTranslationService::getTypeId(3, $parking_name); $parking_id = AdminTranslationService::getTypeId(3, $parking_name);
if (!$parking_id) { if (!$parking_id) {
$this->error[] = imports_error($this->index, 'import24');
return; return;
} }
} }
$channel_name = $row[3]; $channel_name = $row[3] ?? '';
if (empty($channel_name)) { if (empty($channel_name)) {
$this->error[] = imports_error($this->index, 'import34');
return; return;
} }
$channel_arr = explode(',', $channel_name); $channel_arr = explode(',', $channel_name);
@ -56,14 +62,16 @@ class ParkingWhitelistImport implements ToModel, WithChunkReading
} }
} }
if (!$channelIds) { if (!$channelIds) {
$this->error[] = imports_error($this->index, 'import35');
return; return;
} }
} }
$reason = $row[4]; $reason = $row[4] ?? '';
if (empty($reason)) { if (empty($reason)) {
$this->error[] = imports_error($this->index, 'import36');
return; return;
} }
$type_str = $row[5]; $type_str = $row[5] ?? '';
$space_type_id = 0; $space_type_id = 0;
if (!empty($type_str)) { if (!empty($type_str)) {
$space_type_id = ParkingSpaceType::getValueId($type_str) ?? 0; $space_type_id = ParkingSpaceType::getValueId($type_str) ?? 0;
@ -83,11 +91,15 @@ class ParkingWhitelistImport implements ToModel, WithChunkReading
$service = new ParkingWhitelistService(new OperationLogService()); $service = new ParkingWhitelistService(new OperationLogService());
$service->createModel($data); $service->createModel($data);
$this->index += 1;
} }
public function chunkSize(): int public function chunkSize(): int
{ {
return 1000; // 设置每次处理的行数,有助于避免内存问题并可能改善表头解析 return 1000; // 设置每次处理的行数,有助于避免内存问题并可能改善表头解析
} }
public function errorArr(): array
{
return $this->error;
}
} }

2
resources/lang/en/exports.php

@ -94,7 +94,7 @@ return [
'list' => 'White List Import Template', 'list' => 'White List Import Template',
'export_list' => 'Whitelist Vehicle List', 'export_list' => 'Whitelist Vehicle List',
'parking' => 'Parking Lot', 'parking' => 'Parking Lot',
'channel' => 'Access Channel', 'channel' => 'Traffic Lanes',
'reason' => 'Reason For Passage', 'reason' => 'Reason For Passage',
'member_type' => 'Identity Type' 'member_type' => 'Identity Type'
], ],

6
resources/lang/en/imports.php

@ -32,5 +32,9 @@ return [
'import29' => 'The repair start time cannot be empty.', 'import29' => 'The repair start time cannot be empty.',
'import30' => 'Repair start time data error', 'import30' => 'Repair start time data error',
'import31' => 'The repair end time cannot be empty.', 'import31' => 'The repair end time cannot be empty.',
'import32' => 'Repair end time data error' 'import32' => 'Repair end time data error',
'import33' => 'License plate number cannot be empty',
'import34' => 'The lane cannot be empty.',
'import35' => 'Lane does not exist',
'import36' => 'The reason for passage cannot be empty.'
]; ];

16
resources/lang/en/log.php

@ -107,14 +107,14 @@ return [
'delete' => 'Delete parking lot administrator' 'delete' => 'Delete parking lot administrator'
], ],
'channel_management' => [ 'channel_management' => [
'create' => 'Create channel', 'create' => 'Create lane',
'update' => 'Update channel', 'update' => 'Update lane',
'delete' => 'Delete channel' 'delete' => 'Delete Lane'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'create' => 'Create a booth', 'create' => 'Create a booth',
'update' => 'Update the booth', 'update' => 'Update booth',
'delete' => 'Delete the booth' 'delete' => 'Deleting booth'
], ],
'departure_management' => [ 'departure_management' => [
'create' => 'Create exit reason', 'create' => 'Create exit reason',
@ -122,9 +122,9 @@ return [
'delete' => 'Delete exit reason' 'delete' => 'Delete exit reason'
], ],
'channel_permissions' => [ 'channel_permissions' => [
'create' => 'Create channel permissions', 'create' => 'Create lane access',
'update' => 'Update channel permissions', 'update' => 'Update lane access',
'delete' => 'Delete channel permissions' 'delete' => 'Delete lane access'
], ],
'equipment_management' => [ 'equipment_management' => [
'create' => 'Create device', 'create' => 'Create device',

4
resources/lang/en/service.php

@ -111,10 +111,10 @@ return [
'export' => 'Export', 'export' => 'Export',
'on-site' => 'On-site', 'on-site' => 'On-site',
'off-site' => 'Off-site', 'off-site' => 'Off-site',
'name_exists' => 'The channel name already exists' 'name_exists' => 'Lane name already exists'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'name_exists' => 'The booth name already exists' 'name_exists' => 'The booth name already exists.'
], ],
'departure_management' => [ 'departure_management' => [
'reason_exists' => 'Reason for departure already exists' 'reason_exists' => 'Reason for departure already exists'

22
resources/lang/en/validation.php

@ -144,27 +144,27 @@ return [
'n_max' => 'The maximum length of the region name is 50 characters' 'n_max' => 'The maximum length of the region name is 50 characters'
], ],
'channel_management' => [ 'channel_management' => [
'n_empty' => 'Channel name cannot be empty', 'n_empty' => 'Lane names cannot be empty.',
't_empty' => 'Channel type cannot be empty', 't_empty' => 'Lane type cannot be empty',
'po_empty' => 'The channel position cannot be empty', 'po_empty' => 'Lane positions cannot be empty.',
'pa_empty' => 'The affiliated parking lot cannot be empty', 'pa_empty' => 'The affiliated parking lot cannot be empty',
'g_empty' => 'The affiliated booth cannot be empty' 'g_empty' => 'The booth cannot be empty.'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'n_empty' => 'The booth name cannot be empty', 'n_empty' => 'Booth name cannot be empty',
], ],
'departure_management' => [ 'departure_management' => [
'n_empty' => 'Reason for departure cannot be empty', 'n_empty' => 'Reason for departure cannot be empty',
], ],
'channel_permissions' => [ 'channel_permissions' => [
'm_empty' => 'Member type cannot be empty', 'm_empty' => 'Member type cannot be empty',
'c_empty' => 'Allow channel not to be empty', 'c_empty' => 'Lanes cannot be empty.',
'c_array' => 'Allow channel data to be an array' 'c_array' => 'Lane data must be an array'
], ],
'equipment_management' => [ 'equipment_management' => [
'n_empty' => 'The device name cannot be empty', 'n_empty' => 'The device name cannot be empty',
't_empty' => 'The device type cannot be empty', 't_empty' => 'The device type cannot be empty',
'ch_empty' => 'Binding channel cannot be empty', 'ch_empty' => 'The bound lane cannot be empty.',
'pu_empty' => 'The purpose of the device cannot be empty', 'pu_empty' => 'The purpose of the device cannot be empty',
'ip_empty' => 'The device IP cannot be empty', 'ip_empty' => 'The device IP cannot be empty',
'ip' => 'Device IP format error', 'ip' => 'Device IP format error',
@ -174,8 +174,8 @@ return [
'l_empty' => 'The license plate number cannot be empty', 'l_empty' => 'The license plate number cannot be empty',
'pa_empty' => 'The parking lot cannot be empty', 'pa_empty' => 'The parking lot cannot be empty',
'n_empty' => 'The reason for passage cannot be empty', 'n_empty' => 'The reason for passage cannot be empty',
'c_empty' => 'The passage cannot be empty', 'c_empty' => 'The traffic lanes cannot be empty.',
'c_array' => 'The passage channel data must be an array', 'c_array' => 'The traffic lane data must be an array.',
], ],
'parking_repair_list' => [ 'parking_repair_list' => [
'psn_empty' => 'The parking number cannot be empty', 'psn_empty' => 'The parking number cannot be empty',
@ -188,7 +188,7 @@ return [
'gate_control' => [ 'gate_control' => [
'n_empty' => 'Order number or license plate number cannot be empty', 'n_empty' => 'Order number or license plate number cannot be empty',
'et_empty' => 'The entry time cannot be empty', 'et_empty' => 'The entry time cannot be empty',
'channel_id' => 'Channel cannot be empty', 'channel_id' => 'The lane cannot be empty.',
'lp_empty' => 'The license plate number cannot be empty', 'lp_empty' => 'The license plate number cannot be empty',
'lt_empty' => 'Departure time cannot be empty' 'lt_empty' => 'Departure time cannot be empty'
] ]

2
resources/lang/zh-CN/exports.php

@ -94,7 +94,7 @@ return [
'list' => '白名单导入模板', 'list' => '白名单导入模板',
'export_list' => '白名单车辆列表', 'export_list' => '白名单车辆列表',
'parking' => '停车场', 'parking' => '停车场',
'channel' => '通行道', 'channel' => '通行道',
'reason' => '通行原因', 'reason' => '通行原因',
'member_type' => '身份类型' 'member_type' => '身份类型'
], ],

6
resources/lang/zh-CN/imports.php

@ -32,5 +32,9 @@ return [
'import29' => '维修开始时间不能为空', 'import29' => '维修开始时间不能为空',
'import30' => '维修开始时间数据错误', 'import30' => '维修开始时间数据错误',
'import31' => '维修结束时间不能为空', 'import31' => '维修结束时间不能为空',
'import32' => '维修结束时间数据错误' 'import32' => '维修结束时间数据错误',
'import33' => '车牌号码不能为空',
'import34' => '车道不能为空',
'import35' => '车道不存在',
'import36' => '通行原因不能为空'
]; ];

18
resources/lang/zh-CN/log.php

@ -107,14 +107,14 @@ return [
'delete' => '删除停车场管理员' 'delete' => '删除停车场管理员'
], ],
'channel_management' => [ 'channel_management' => [
'create' => '创建道', 'create' => '创建道',
'update' => '更新道', 'update' => '更新道',
'delete' => '删除道' 'delete' => '删除道'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'create' => '创建岗亭', 'create' => '创建展位',
'update' => '更新岗亭', 'update' => '更新展位',
'delete' => '删除岗亭' 'delete' => '删除展位'
], ],
'departure_management' => [ 'departure_management' => [
'create' => '创建离场原因', 'create' => '创建离场原因',
@ -122,9 +122,9 @@ return [
'delete' => '删除离场原因' 'delete' => '删除离场原因'
], ],
'channel_permissions' => [ 'channel_permissions' => [
'create' => '创建通道权限', 'create' => '创建车道接入',
'update' => '更新通道权限', 'update' => '更新车道接入',
'delete' => '删除通道权限' 'delete' => '删除车道接入'
], ],
'equipment_management' => [ 'equipment_management' => [
'create' => '创建设备', 'create' => '创建设备',

4
resources/lang/zh-CN/service.php

@ -111,10 +111,10 @@ return [
'export' => '出口', 'export' => '出口',
'on-site' => '场内', 'on-site' => '场内',
'off-site' => '场外', 'off-site' => '场外',
'name_exists' => '道名称已存在' 'name_exists' => '道名称已存在'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'name_exists' => '岗亭名称已存在' 'name_exists' => '展位名称已存在'
], ],
'departure_management' => [ 'departure_management' => [
'reason_exists' => '离场原因已存在' 'reason_exists' => '离场原因已存在'

22
resources/lang/zh-CN/validation.php

@ -144,27 +144,27 @@ return [
'n_max' => '区域名称最多50个字符' 'n_max' => '区域名称最多50个字符'
], ],
'channel_management' => [ 'channel_management' => [
'n_empty' => '道名称不能为空', 'n_empty' => '道名称不能为空',
't_empty' => '道类型不能为空', 't_empty' => '道类型不能为空',
'po_empty' => '道位置不能为空', 'po_empty' => '道位置不能为空',
'pa_empty' => '所属车场不能为空', 'pa_empty' => '所属车场不能为空',
'g_empty' => '所属岗亭不能为空' 'g_empty' => '所属展位不能为空'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'n_empty' => '岗亭名称不能为空', 'n_empty' => '展位名称不能为空',
], ],
'departure_management' => [ 'departure_management' => [
'n_empty' => '离场原因不能为空', 'n_empty' => '离场原因不能为空',
], ],
'channel_permissions' => [ 'channel_permissions' => [
'm_empty' => '会员类型不能为空', 'm_empty' => '会员类型不能为空',
'c_empty' => '允许道不能为空', 'c_empty' => '允许道不能为空',
'c_array' => '允许道数据必须是数组' 'c_array' => '允许道数据必须是数组'
], ],
'equipment_management' => [ 'equipment_management' => [
'n_empty' => '设备名称不能为空', 'n_empty' => '设备名称不能为空',
't_empty' => '设备类型不能为空', 't_empty' => '设备类型不能为空',
'ch_empty' => '绑定道不能为空', 'ch_empty' => '绑定道不能为空',
'pu_empty' => '设备用途不能为空', 'pu_empty' => '设备用途不能为空',
'ip_empty' => '设备IP不能为空', 'ip_empty' => '设备IP不能为空',
'ip' => '设备IP格式错误', 'ip' => '设备IP格式错误',
@ -174,8 +174,8 @@ return [
'l_empty' => '车牌号码不能为空', 'l_empty' => '车牌号码不能为空',
'pa_empty' => '停车场不能为空', 'pa_empty' => '停车场不能为空',
'n_empty' => '通行原因不能为空', 'n_empty' => '通行原因不能为空',
'c_empty' => '通行道不能为空', 'c_empty' => '通行道不能为空',
'c_array' => '通行道数据必须是数组', 'c_array' => '通行道数据必须是数组',
], ],
'parking_repair_list' => [ 'parking_repair_list' => [
'psn_empty' => '车位号码不能为空', 'psn_empty' => '车位号码不能为空',
@ -188,7 +188,7 @@ return [
'gate_control' => [ 'gate_control' => [
'n_empty' => '订单号码或车牌号码不能为空', 'n_empty' => '订单号码或车牌号码不能为空',
'et_empty' => '入场时间不能为空', 'et_empty' => '入场时间不能为空',
'channel_id' => '道不能为空', 'channel_id' => '道不能为空',
'lp_empty' => '车牌号码不能为空', 'lp_empty' => '车牌号码不能为空',
'lt_empty' => '离场时间不能为空' 'lt_empty' => '离场时间不能为空'
] ]

2
resources/lang/zh-TW/exports.php

@ -94,7 +94,7 @@ return [
'list' => '白名單導入範本', 'list' => '白名單導入範本',
'export_list' => '白名單車輛清單', 'export_list' => '白名單車輛清單',
'parking' => '停車場', 'parking' => '停車場',
'channel' => '通行道', 'channel' => '通行道',
'reason' => '通行原因', 'reason' => '通行原因',
'member_type' => '身份類型' 'member_type' => '身份類型'
], ],

6
resources/lang/zh-TW/imports.php

@ -32,5 +32,9 @@ return [
'import29' => '維修開始時間不能為空', 'import29' => '維修開始時間不能為空',
'import30' => '維修開始時間數據錯誤', 'import30' => '維修開始時間數據錯誤',
'import31' => '維修結束時間不能為空', 'import31' => '維修結束時間不能為空',
'import32' => '維修結束時間數據錯誤' 'import32' => '維修結束時間數據錯誤',
'import33' => '車牌號碼不能為空',
'import34' => '車道不能為空',
'import35' => '車道不存在',
'import36' => '通行原因不能為空'
]; ];

18
resources/lang/zh-TW/log.php

@ -107,14 +107,14 @@ return [
'delete' => '删除停車場管理員' 'delete' => '删除停車場管理員'
], ],
'channel_management' => [ 'channel_management' => [
'create' => '創建道', 'create' => '創建道',
'update' => '更新道', 'update' => '更新道',
'delete' => '删除通道' 'delete' => '刪除車道'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'create' => '創建崗亭', 'create' => '創建展位',
'update' => '更新崗亭', 'update' => '更新展位',
'delete' => '删除崗亭' 'delete' => '刪除展位'
], ],
'departure_management' => [ 'departure_management' => [
'create' => '創建離場原因', 'create' => '創建離場原因',
@ -122,9 +122,9 @@ return [
'delete' => '删除離場原因' 'delete' => '删除離場原因'
], ],
'channel_permissions' => [ 'channel_permissions' => [
'create' => '創建通道許可權', 'create' => '創建車道接入',
'update' => '更新通道許可權', 'update' => '更新車道接入',
'delete' => '删除通道許可權' 'delete' => '刪除車道接入'
], ],
'equipment_management' => [ 'equipment_management' => [
'create' => '創建設備', 'create' => '創建設備',

4
resources/lang/zh-TW/service.php

@ -111,10 +111,10 @@ return [
'export' => '出口', 'export' => '出口',
'on-site' => '場內', 'on-site' => '場內',
'off-site' => '場外', 'off-site' => '場外',
'name_exists' => '道名稱已存在' 'name_exists' => '道名稱已存在'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'name_exists' => '崗亭名稱已存在' 'name_exists' => '展位名稱已存在'
], ],
'departure_management' => [ 'departure_management' => [
'reason_exists' => '離場原因已存在' 'reason_exists' => '離場原因已存在'

22
resources/lang/zh-TW/validation.php

@ -144,27 +144,27 @@ return [
'n_max' => '區域名稱最多50個字元' 'n_max' => '區域名稱最多50個字元'
], ],
'channel_management' => [ 'channel_management' => [
'n_empty' => '道名稱不能為空', 'n_empty' => '道名稱不能為空',
't_empty' => '道類型不能為空', 't_empty' => '道類型不能為空',
'po_empty' => '道位置不能為空', 'po_empty' => '道位置不能為空',
'pa_empty' => '所屬車場不能為空', 'pa_empty' => '所屬車場不能為空',
'g_empty' => '所屬崗亭不能為空' 'g_empty' => '所屬展位不能為空'
], ],
'guard_booth_management' => [ 'guard_booth_management' => [
'n_empty' => '崗亭名稱不能為空', 'n_empty' => '展位名稱不能為空',
], ],
'departure_management' => [ 'departure_management' => [
'n_empty' => '離場原因不能為空', 'n_empty' => '離場原因不能為空',
], ],
'channel_permissions' => [ 'channel_permissions' => [
'm_empty' => '會員類型不能為空', 'm_empty' => '會員類型不能為空',
'c_empty' => '允許道不能為空', 'c_empty' => '允許道不能為空',
'c_array' => '允許道數據必須是數組' 'c_array' => '允許道數據必須是數組'
], ],
'equipment_management' => [ 'equipment_management' => [
'n_empty' => '設備名稱不能為空', 'n_empty' => '設備名稱不能為空',
't_empty' => '設備類型不能為空', 't_empty' => '設備類型不能為空',
'ch_empty' => '綁定道不能為空', 'ch_empty' => '綁定道不能為空',
'pu_empty' => '設備用途不能為空', 'pu_empty' => '設備用途不能為空',
'ip_empty' => '設備IP不能為空', 'ip_empty' => '設備IP不能為空',
'ip' => '設備IP格式錯誤', 'ip' => '設備IP格式錯誤',
@ -174,8 +174,8 @@ return [
'l_empty' => '車牌號碼不能為空', 'l_empty' => '車牌號碼不能為空',
'pa_empty' => '停車場不能為空', 'pa_empty' => '停車場不能為空',
'n_empty' => '通行原因不能為空', 'n_empty' => '通行原因不能為空',
'c_empty' => '通行道不能為空', 'c_empty' => '通行道不能為空',
'c_array' => '通行道數據必須是數組', 'c_array' => '通行道數據必須是數組',
], ],
'parking_repair_list' => [ 'parking_repair_list' => [
'psn_empty' => '車位號碼不能為空', 'psn_empty' => '車位號碼不能為空',
@ -188,7 +188,7 @@ return [
'gate_control' => [ 'gate_control' => [
'n_empty' => '訂單號碼或車牌號碼不能為空', 'n_empty' => '訂單號碼或車牌號碼不能為空',
'et_empty' => '入場時間不能為空', 'et_empty' => '入場時間不能為空',
'channel_id' => '道不能為空', 'channel_id' => '道不能為空',
'lp_empty' => '車牌號碼不能為空', 'lp_empty' => '車牌號碼不能為空',
'lt_empty' => '離場時間不能為空' 'lt_empty' => '離場時間不能為空'
] ]

Loading…
Cancel
Save