19 changed files with 597 additions and 7 deletions
@ -0,0 +1,153 @@ |
|||
<?php |
|||
|
|||
namespace App\Http\Controllers\Admin; |
|||
|
|||
use App\Models\ParkingGateControl; |
|||
use App\Models\ParkingLicensePlate; |
|||
use App\Models\ParkingSpaceType; |
|||
use App\Services\ApiResponseService; |
|||
use App\Services\ParkingGateControlService; |
|||
use Exception; |
|||
use Illuminate\Http\JsonResponse; |
|||
use Illuminate\Http\Request; |
|||
|
|||
class ParkingGateControlController extends BaseController |
|||
{ |
|||
|
|||
protected string $menuUri = 'gateControl'; |
|||
|
|||
/** |
|||
* @var ParkingGateControlService |
|||
*/ |
|||
protected ParkingGateControlService $service; |
|||
|
|||
/** |
|||
* 构造函数 |
|||
* @param ApiResponseService $responseService |
|||
* @param ParkingGateControlService $service |
|||
*/ |
|||
public function __construct( |
|||
ApiResponseService $responseService, |
|||
ParkingGateControlService $service |
|||
) { |
|||
parent::__construct($responseService); |
|||
$this->service = $service; |
|||
} |
|||
|
|||
/** |
|||
* @param Request $request |
|||
* @return JsonResponse |
|||
*/ |
|||
public function index(Request $request): JsonResponse |
|||
{ |
|||
try { |
|||
$query = ParkingGateControl::query(); |
|||
|
|||
if ($request->has('license_plate')) { |
|||
$license_plate = $request->input('license_plate'); |
|||
if ($license_plate) { |
|||
$license_plate_id = ParkingLicensePlate::getValueId( |
|||
$license_plate |
|||
); |
|||
if ($license_plate_id) { |
|||
$query->where('license_plate_id', $license_plate_id); |
|||
} else { |
|||
$query->where('id', 0); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($request->has('member_type')) { |
|||
$member_type = $request->input('member_type'); |
|||
if ($member_type) { |
|||
$query->where('member_type', $member_type); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('enter_at')) { |
|||
$enter_at = $request->input('enter_at'); |
|||
if ($enter_at) { |
|||
$query->where('enter_at', '>=', $enter_at); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('leave_at')) { |
|||
$leave_at = $request->input('leave_at'); |
|||
if ($leave_at) { |
|||
$query->where('leave_at', '<=', $leave_at); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('customer_id')) { |
|||
$customer_id = $request->input('customer_id'); |
|||
if ($customer_id) { |
|||
$query->where('customer_id', $customer_id); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('member_id')) { |
|||
$member_id = $request->input('member_id'); |
|||
if ($member_id) { |
|||
$query->where('member_id', $member_id); |
|||
} |
|||
} |
|||
|
|||
// 分页 |
|||
$page = $request->input('page', 1); |
|||
$perPage = $request->input('per_page', 10); |
|||
|
|||
$total = $query->count(); |
|||
$items = $query->latest()->forPage($page, $perPage)->get()->each( |
|||
function ($item) { |
|||
return $this->service->getItem($item); |
|||
} |
|||
); |
|||
|
|||
return $this->responseService->success([ |
|||
'items' => $items, |
|||
'total' => $total, |
|||
'page' => $page, |
|||
'per_page' => $perPage, |
|||
'last_page' => ceil($total / $perPage), |
|||
]); |
|||
} catch (Exception $e) { |
|||
$m_prefix = __('exception.exception_handler.resource'); |
|||
return $this->responseService->systemError( |
|||
$m_prefix . ':' . $e->getMessage() |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 列表搜索数据 |
|||
* @return JsonResponse |
|||
*/ |
|||
public function search(): JsonResponse |
|||
{ |
|||
try { |
|||
$data = [ |
|||
'member_type_list' => ParkingSpaceType::getData() |
|||
]; |
|||
return $this->responseService->success($data); |
|||
} catch (Exception $e) { |
|||
$m_prefix = __('exception.exception_handler.resource'); |
|||
return $this->responseService->systemError( |
|||
$m_prefix . ':' . $e->getMessage() |
|||
); |
|||
} |
|||
} |
|||
|
|||
public function show(string $id): JsonResponse |
|||
{ |
|||
try { |
|||
$data = ParkingGateControl::query()->find($id); |
|||
return $this->responseService->success($this->service->getItem($data)); |
|||
} catch (Exception $e) { |
|||
return $this->responseService->systemError( |
|||
__('exception.get_data_failed') . ':' . $e->getMessage() |
|||
); |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,119 @@ |
|||
<?php |
|||
|
|||
namespace App\Http\Controllers\Admin; |
|||
|
|||
use App\Models\Parking; |
|||
use App\Models\ParkingLicensePlate; |
|||
use App\Models\ParkingProhibitedPassage; |
|||
use App\Services\ApiResponseService; |
|||
use App\Services\ProhibitedPassageService; |
|||
use Exception; |
|||
use Illuminate\Http\JsonResponse; |
|||
use Illuminate\Http\Request; |
|||
|
|||
class ProhibitedPassageController extends BaseController |
|||
{ |
|||
protected string $menuUri = 'prohibitedPassage'; |
|||
|
|||
/** |
|||
* @var ProhibitedPassageService |
|||
*/ |
|||
protected ProhibitedPassageService $service; |
|||
|
|||
/** |
|||
* 构造函数 |
|||
* @param ApiResponseService $responseService |
|||
* @param ProhibitedPassageService $service |
|||
*/ |
|||
public function __construct( |
|||
ApiResponseService $responseService, |
|||
ProhibitedPassageService $service |
|||
) { |
|||
parent::__construct($responseService); |
|||
$this->service = $service; |
|||
} |
|||
|
|||
/** |
|||
* @param Request $request |
|||
* @return JsonResponse |
|||
*/ |
|||
public function index(Request $request): JsonResponse |
|||
{ |
|||
try { |
|||
$query = ParkingProhibitedPassage::query(); |
|||
|
|||
if ($request->has('license_plate')) { |
|||
$license_plate = $request->input('license_plate'); |
|||
if ($license_plate) { |
|||
$license_plate_id = ParkingLicensePlate::getValueId( |
|||
$license_plate |
|||
); |
|||
if ($license_plate_id) { |
|||
$query->where('license_plate_id', $license_plate_id); |
|||
} else { |
|||
$query->where('id', 0); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ($request->has('parking_id')) { |
|||
$parking_id = $request->input('parking_id'); |
|||
if ($parking_id) { |
|||
$query->where('parking_id', $parking_id); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('start_date')) { |
|||
$start_date = $request->input('start_date'); |
|||
if ($start_date) { |
|||
$query->where( |
|||
'identify_at', |
|||
'>=', |
|||
$start_date . ' 00:00:00' |
|||
); |
|||
} |
|||
} |
|||
|
|||
if ($request->has('end_date')) { |
|||
$end_date = $request->input('end_date'); |
|||
if ($end_date) { |
|||
$query->where('identify_at', '<=', $end_date . ' 23:59:59'); |
|||
} |
|||
} |
|||
$typeArr = $this->service->getType(); |
|||
$remarkArr = $this->service->getRemark(); |
|||
// 分页 |
|||
$page = $request->input('page', 1); |
|||
$perPage = $request->input('per_page', 10); |
|||
|
|||
$total = $query->count(); |
|||
$items = $query->latest()->forPage($page, $perPage)->get()->each( |
|||
function ($item) use ($typeArr, $remarkArr) { |
|||
$item['license_plate'] = ParkingLicensePlate::getNumber( |
|||
$item['license_plate_id'] |
|||
); |
|||
$item['parking'] = Parking::getName($item['parking_id']); |
|||
$item['type_str'] = $typeArr[$item['type']]; |
|||
$item['remark'] = $remarkArr[$item['remark']]; |
|||
$item['snapshot_img'] = get_image_url($item['snapshot_img']); |
|||
unset($item['parking_id'], $item['license_plate_id']); |
|||
return $item; |
|||
} |
|||
); |
|||
|
|||
return $this->responseService->success([ |
|||
'items' => $items, |
|||
'total' => $total, |
|||
'page' => $page, |
|||
'per_page' => $perPage, |
|||
'last_page' => ceil($total / $perPage), |
|||
]); |
|||
} catch (Exception $e) { |
|||
$m_prefix = __('exception.exception_handler.resource'); |
|||
return $this->responseService->systemError( |
|||
$m_prefix . ':' . $e->getMessage() |
|||
); |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
<?php |
|||
|
|||
namespace App\Models; |
|||
|
|||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
|||
use Illuminate\Database\Eloquent\Model; |
|||
|
|||
class ParkingGateControl extends Model |
|||
{ |
|||
use HasFactory; |
|||
|
|||
protected $table = 'parking_gate_control'; |
|||
|
|||
protected $fillable |
|||
= [ |
|||
'license_plate_id', |
|||
'channel_id', |
|||
'enter_at', |
|||
'leave_at', |
|||
'leave_type', |
|||
'enter_img', |
|||
'leave_img' |
|||
]; |
|||
|
|||
protected $hidden |
|||
= [ |
|||
'created_at', |
|||
'updated_at' |
|||
]; |
|||
|
|||
public function getEnterAtAttribute($value): string |
|||
{ |
|||
return $value ? date("Y-m-d H:i:s", strtotime($value)) : $value; |
|||
} |
|||
|
|||
public function getLeaveAtAttribute($value): string |
|||
{ |
|||
return $value ? date("Y-m-d H:i:s", strtotime($value)) : ''; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
<?php |
|||
|
|||
namespace App\Models; |
|||
|
|||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
|||
use Illuminate\Database\Eloquent\Model; |
|||
|
|||
class ParkingProhibitedPassage extends Model |
|||
{ |
|||
use HasFactory; |
|||
|
|||
protected $table = 'parking_prohibited_passage'; |
|||
|
|||
protected $fillable |
|||
= [ |
|||
'license_plate_id', |
|||
'parking_id', |
|||
'type', |
|||
'identify_at', |
|||
'remark', |
|||
'snapshot_img' |
|||
]; |
|||
|
|||
protected $hidden |
|||
= [ |
|||
'created_at', |
|||
'updated_at' |
|||
]; |
|||
|
|||
public function getIdentifyAtAttribute($value): string |
|||
{ |
|||
return $value ? date("Y-m-d H:i:s", strtotime($value)) : $value; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,58 @@ |
|||
<?php |
|||
|
|||
namespace App\Services; |
|||
|
|||
use App\Models\Parking; |
|||
use App\Models\ParkingChannel; |
|||
use App\Models\ParkingLicensePlate; |
|||
use App\Models\ParkingReservation; |
|||
use App\Models\ParkingSpaceType; |
|||
|
|||
class ParkingGateControlService extends BaseService |
|||
{ |
|||
protected string $menuTitle = 'gate_control'; |
|||
|
|||
public static array $typeArr = [ |
|||
1 => 'automatic', |
|||
2 => 'manual' |
|||
]; |
|||
|
|||
/** |
|||
* @return array|string[] |
|||
*/ |
|||
public function getType(): array |
|||
{ |
|||
$typeArr = self::$typeArr; |
|||
foreach ($typeArr as $key => $value) { |
|||
$typeArr[$key] = __service($this->menuTitle . '.' . $value); |
|||
} |
|||
return $typeArr; |
|||
} |
|||
|
|||
public function getItem($item) |
|||
{ |
|||
$typeArr = $this->getType(); |
|||
$date = date("Y-m-d", strtotime($item['enter_at'])); |
|||
$item['reserve_id'] = ParkingReservation::query()->where( |
|||
'license_plate_id', |
|||
$item['license_plate_id'] |
|||
)->where('date', $date)->value('reserve_id'); |
|||
$item['member_type'] = ParkingSpaceType::getName($item['member_type']); |
|||
$item['license_plate'] = ParkingLicensePlate::getNumber($item['license_plate_id']); |
|||
$ParkingChannel = ParkingChannel::getFirst($item['channel_id']); |
|||
$item['channel'] = ''; |
|||
$item['parking'] = ''; |
|||
if ($ParkingChannel) { |
|||
$item['channel'] = $ParkingChannel['name']; |
|||
$item['parking'] = Parking::getName($ParkingChannel['parking_id']); |
|||
} |
|||
$item['enter_type_str'] = $typeArr[$item['enter_type']]; |
|||
$item['leave_type_str'] = $typeArr[$item['leave_type']] ?? ''; |
|||
$item['dwell_time'] = get_time_difference_str($item['enter_at'], $item['leave_at']); |
|||
|
|||
$item['enter_img'] = get_image_url($item['enter_img']); |
|||
$item['leave_img'] = get_image_url($item['leave_img']); |
|||
unset($item['license_plate_id'], $item['channel_id']); |
|||
return $item; |
|||
} |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
<?php |
|||
|
|||
namespace App\Services; |
|||
|
|||
class ProhibitedPassageService extends BaseService |
|||
{ |
|||
protected string $menuTitle = 'prohibited_passage'; |
|||
|
|||
public array $typeArr = [ |
|||
1 => 'entrance', |
|||
2 => 'export' |
|||
]; |
|||
|
|||
public array $remarkArr = [ |
|||
1 => 'remark1', |
|||
2 => 'remark2', |
|||
3 => 'remark3' |
|||
]; |
|||
|
|||
/** |
|||
* @return array|string[] |
|||
*/ |
|||
public function getType(): array |
|||
{ |
|||
$typeArr = $this->typeArr; |
|||
foreach ($typeArr as $key => $value) { |
|||
$typeArr[$key] = __service('channel_management.' . $value); |
|||
} |
|||
return $typeArr; |
|||
} |
|||
|
|||
/** |
|||
* @return array|string[] |
|||
*/ |
|||
public function getRemark(): array |
|||
{ |
|||
$typeArr = $this->remarkArr; |
|||
foreach ($typeArr as $key => $value) { |
|||
$typeArr[$key] = __service($this->menuTitle . '.' . $value); |
|||
} |
|||
return $typeArr; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,40 @@ |
|||
<?php |
|||
|
|||
use Illuminate\Database\Migrations\Migration; |
|||
use Illuminate\Database\Schema\Blueprint; |
|||
use Illuminate\Support\Facades\Schema; |
|||
|
|||
return new class extends Migration |
|||
{ |
|||
/** |
|||
* Run the migrations. |
|||
*/ |
|||
public function up(): void |
|||
{ |
|||
Schema::create('parking_gate_control', function (Blueprint $table) { |
|||
$table->id(); |
|||
$table->integer('license_plate_id')->comment('车牌号码'); |
|||
$table->integer('channel_id')->comment('入场通道'); |
|||
$table->timestamp('enter_at')->comment('入场时间'); |
|||
$table->timestamp('leave_at')->nullable()->comment('出场时间'); |
|||
$table->tinyInteger('enter_type')->default(1)->comment('入场类型'); |
|||
$table->tinyInteger('leave_type')->default(0)->comment('出场类型'); |
|||
$table->string('enter_img', 255)->default('')->comment('入场图片'); |
|||
$table->string('leave_img', 255)->default('')->comment('出场图片'); |
|||
$table->integer('member_type')->default(0)->comment('客户类型'); |
|||
$table->string('customer_id', 50)->default('')->comment('客户id'); |
|||
$table->string('member_id', 50)->default('')->comment('会员id'); |
|||
$table->timestamps(); |
|||
$table->innoDb(); |
|||
$table->comment('停车场闸机进出记录'); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Reverse the migrations. |
|||
*/ |
|||
public function down(): void |
|||
{ |
|||
Schema::dropIfExists('parking_gate_control'); |
|||
} |
|||
}; |
|||
@ -0,0 +1,35 @@ |
|||
<?php |
|||
|
|||
use Illuminate\Database\Migrations\Migration; |
|||
use Illuminate\Database\Schema\Blueprint; |
|||
use Illuminate\Support\Facades\Schema; |
|||
|
|||
return new class extends Migration |
|||
{ |
|||
/** |
|||
* Run the migrations. |
|||
*/ |
|||
public function up(): void |
|||
{ |
|||
Schema::create('parking_prohibited_passage', function (Blueprint $table) { |
|||
$table->id(); |
|||
$table->integer('license_plate_id')->comment('车牌号码'); |
|||
$table->integer('parking_id')->comment('停车场'); |
|||
$table->tinyInteger('type')->default(1)->comment('1 进/ 2 出'); |
|||
$table->timestamp('identify_at')->comment('识别时间'); |
|||
$table->tinyInteger('remark')->default(1)->comment('原因'); |
|||
$table->string('snapshot_img', 255)->default('')->comment('抓拍图片'); |
|||
$table->timestamps(); |
|||
$table->innoDb(); |
|||
$table->comment('违禁通行记录'); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Reverse the migrations. |
|||
*/ |
|||
public function down(): void |
|||
{ |
|||
Schema::dropIfExists('parking_prohibited_passage'); |
|||
} |
|||
}; |
|||
Loading…
Reference in new issue