From 66fd72f56872591333915c72df1c9b58da4e9415 Mon Sep 17 00:00:00 2001 From: wanghongjun <1445693971@qq.com> Date: Mon, 18 May 2026 10:09:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=A6=E7=89=8C=E8=AF=86=E5=88=AB=E7=8E=87?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Exports/LicensePlateRecognitionExport.php | 56 ++++++++++++++++ .../Admin/EventCalendarController.php | 4 +- .../LicensePlateRecognitionController.php | 67 ++++++++++--------- .../Controllers/Admin/NoticeController.php | 4 +- .../Admin/OperationLogController.php | 4 +- .../Admin/ParkingBehaviorController.php | 19 +----- .../Admin/ParkingCameraController.php | 4 +- .../Admin/ParkingLicensePlateController.php | 4 +- .../Admin/ParkingPatternController.php | 8 ++- .../Admin/ParkingSpaceController.php | 4 +- .../Controllers/Admin/VipListController.php | 4 +- app/Models/LicensePlateRecognition.php | 8 +++ .../LicensePlateRecognitionService.php | 28 ++++++++ app/common.php | 8 +++ ...create_license_plate_recognition_table.php | 2 +- resources/lang/en/exports.php | 9 +++ resources/lang/zh-CN/exports.php | 9 +++ resources/lang/zh-TW/exports.php | 9 +++ routes/admin/api.php | 1 + 19 files changed, 193 insertions(+), 59 deletions(-) create mode 100644 app/Exports/LicensePlateRecognitionExport.php diff --git a/app/Exports/LicensePlateRecognitionExport.php b/app/Exports/LicensePlateRecognitionExport.php new file mode 100644 index 0000000..34f94a6 --- /dev/null +++ b/app/Exports/LicensePlateRecognitionExport.php @@ -0,0 +1,56 @@ +groupBy('time_slot')->select($columns)->get()->each( + function ($item) use (&$data, &$index) { + $countData = (new LicensePlateRecognitionService( + new OperationLogService() + ))->getCount($item['time_slot']); + + $data[] = [ + 'id' => $index, + 'time_slot' => $item['time_slot'], + 'sum_count' => $countData['sum_count'], + 'high_ratio' => $countData['high_ratio'], + 'middle_ratio' => $countData['middle_ratio'], + 'manual_count' => $countData['manual_count'], + 'manual_ratio' => $countData['manual_ratio'] + ]; + $index += 1; + return $item; + } + ); + return $data; + } + + /** + * @return array + */ + public function headings(): array + { + return [ + __('exports.global.index'), + __('exports.license_plate_recognition.time_slot'), + __('exports.license_plate_recognition.sum_count'), + __('exports.license_plate_recognition.high_ratio'), + __('exports.license_plate_recognition.middle_ratio'), + __('exports.license_plate_recognition.manual_count'), + __('exports.license_plate_recognition.manual_ratio') + ]; + } +} diff --git a/app/Http/Controllers/Admin/EventCalendarController.php b/app/Http/Controllers/Admin/EventCalendarController.php index 3cd8586..490f653 100644 --- a/app/Http/Controllers/Admin/EventCalendarController.php +++ b/app/Http/Controllers/Admin/EventCalendarController.php @@ -327,7 +327,9 @@ class EventCalendarController extends BaseController { return Excel::download( new EventCalendarTemplateExport(), - __('exports.event_calendar.list') . time() . '.xlsx' + set_space_underline(__('exports.event_calendar.list')) + . get_datetime('date_') + . '.xlsx' ); } diff --git a/app/Http/Controllers/Admin/LicensePlateRecognitionController.php b/app/Http/Controllers/Admin/LicensePlateRecognitionController.php index 5e4e4a4..be69af2 100644 --- a/app/Http/Controllers/Admin/LicensePlateRecognitionController.php +++ b/app/Http/Controllers/Admin/LicensePlateRecognitionController.php @@ -2,13 +2,32 @@ namespace App\Http\Controllers\Admin; +use App\Exports\LicensePlateRecognitionExport; use App\Models\LicensePlateRecognition; +use App\Services\ApiResponseService; +use App\Services\LicensePlateRecognitionService; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Maatwebsite\Excel\Facades\Excel; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class LicensePlateRecognitionController extends BaseController { + protected LicensePlateRecognitionService $service; + + /** + * 构造函数 + * @param ApiResponseService $responseService + * @param LicensePlateRecognitionService $service + */ + public function __construct( + ApiResponseService $responseService, + LicensePlateRecognitionService $service + ) { + parent::__construct($responseService); + $this->service = $service; + } public function index(Request $request): JsonResponse { @@ -36,7 +55,7 @@ class LicensePlateRecognitionController extends BaseController } $items = $query->groupBy(['time_slot'])->latest('time_slot') ->forPage($page, $perPage)->get()->each(function ($item) { - $countData = $this->getCount($item['time_slot']); + $countData = $this->service->getCount($item['time_slot']); $item['sum_count'] = $countData['sum_count']; $item['high_ratio'] = $countData['high_ratio']; $item['middle_ratio'] = $countData['middle_ratio']; @@ -59,37 +78,6 @@ class LicensePlateRecognitionController extends BaseController } } - protected function getCount($time_slot) - { - $manualWhere = $highWhere = $middleWhere = $where = [ - 'time_slot' => $time_slot - ]; - $where['manual_modification'] = 0; - $sumCount = LicensePlateRecognition::query()->where($where) - ->count(); - $highWhere['recognition'] = 5; - $highCount = LicensePlateRecognition::query()->where( - $highWhere - )->count(); - $middleWhere['recognition'] = 1; - $middleCount = LicensePlateRecognition::query()->where( - $middleWhere - )->count(); - $manualWhere['manual_modification'] = 1; - $manualCount = LicensePlateRecognition::query()->where( - $manualWhere - )->count(); - return [ - 'sum_count' => $sumCount, - 'high_count' => $highCount, - 'middle_count' => $middleCount, - 'manual_count' => $manualCount, - 'high_ratio' => get_ratio($sumCount, $highCount), - 'middle_ratio' => get_ratio($sumCount, $middleCount), - 'manual_ratio' => get_ratio($sumCount, $manualCount) - ]; - } - public function curveGraph(Request $request): JsonResponse { try { @@ -107,7 +95,7 @@ class LicensePlateRecognitionController extends BaseController $items = $query->groupBy(['time_slot'])->latest('time_slot') ->forPage($page, $perPage)->select('time_slot')->get() ->each(function ($item) { - $countData = $this->getCount($item['time_slot']); + $countData = $this->service->getCount($item['time_slot']); $item['high_ratio'] = $countData['high_ratio']; $item['middle_ratio'] = $countData['middle_ratio']; $item['manual_ratio'] = $countData['manual_ratio']; @@ -121,4 +109,17 @@ class LicensePlateRecognitionController extends BaseController ); } } + + /** + * @return BinaryFileResponse + */ + public function export(): BinaryFileResponse + { + return Excel::download( + new LicensePlateRecognitionExport(), + set_space_underline(__('exports.license_plate_recognition.list')) + . get_datetime('date_') + . '.xlsx' + ); + } } diff --git a/app/Http/Controllers/Admin/NoticeController.php b/app/Http/Controllers/Admin/NoticeController.php index 58f1fe1..cf38d4f 100644 --- a/app/Http/Controllers/Admin/NoticeController.php +++ b/app/Http/Controllers/Admin/NoticeController.php @@ -225,7 +225,9 @@ class NoticeController extends BaseController { return Excel::download( new AdminNoticeExport(), - __('exports.notice.list') . time() . '.xlsx' + set_space_underline(__('exports.notice.list')) + . get_datetime('date_') + . '.xlsx' ); } diff --git a/app/Http/Controllers/Admin/OperationLogController.php b/app/Http/Controllers/Admin/OperationLogController.php index e324af9..87b49a6 100644 --- a/app/Http/Controllers/Admin/OperationLogController.php +++ b/app/Http/Controllers/Admin/OperationLogController.php @@ -198,7 +198,9 @@ class OperationLogController extends Controller { return Excel::download( new OperationLogExport(), - __('exports.operation_log.list') . time() . '.xlsx' + set_space_underline(__('exports.operation_log.list')) + . get_datetime('date_') + . '.xlsx' ); } } diff --git a/app/Http/Controllers/Admin/ParkingBehaviorController.php b/app/Http/Controllers/Admin/ParkingBehaviorController.php index 4dd1af2..f19b7fb 100644 --- a/app/Http/Controllers/Admin/ParkingBehaviorController.php +++ b/app/Http/Controllers/Admin/ParkingBehaviorController.php @@ -123,22 +123,9 @@ class ParkingBehaviorController extends BaseController { return Excel::download( new ParkingBehaviorExport(), - __('exports.parking_behavior.list') . time() . '.xlsx' + set_space_underline(__('exports.parking_behavior.list')) + . get_datetime('date_') + . '.xlsx' ); } } -/* - -网站开发 - - - -帮我开发一个后台管理系统,使用后端语言PHP版本大于8.0,前端语言使用vue3,实现前后端分离,用于管理【管理内容】。 -登录要求:包含登录页, -页面要求:1.登录后页面左边展示菜单,右边显示内容,默认展示首页内容,首页显示今日营业数据总览 -2.第1个菜单酒水菜品菜单管理,其中包含二级菜单:分类管理、商品列表。分类管理增删改查菜品分类如大类目增加啤酒、洋酒、小吃,商品列表内容有:新增商品(商品名字、数量、价格、类型)、列表筛选(上架、下架、商品名称搜索、类型选择)、列表(显示商品列表、名称、价格、上架时间、状态等) -3.第2个菜单会员管理页面,其中包含二级菜单:会员信息、会员等级管理、充值配置、充值记录、消费记录 -4.财务管理,其中包含二级菜单:数据概览(今日营收、本月总营收、营收趋势(每日k线)、收入明细(显示最新支付数据:项目、支付时间、金额、支付方式))、营业明细(列表展示今日销售酒水,支付方式、支付时间等) -5.人员管理,新增工作人员(新增或删除操作人员,设置不同的权限、不同岗位的工作人员,可修改员工里面不可查看)、操作记录(记录操作人员新增、删除、修改员工密码的操作记录)、员工销售管理(统计员工销售酒水业绩) - - */ diff --git a/app/Http/Controllers/Admin/ParkingCameraController.php b/app/Http/Controllers/Admin/ParkingCameraController.php index fa974a5..eb7f74a 100644 --- a/app/Http/Controllers/Admin/ParkingCameraController.php +++ b/app/Http/Controllers/Admin/ParkingCameraController.php @@ -339,7 +339,9 @@ class ParkingCameraController extends BaseController { return Excel::download( new ParkingCameraExport(), - __('exports.parking_camera.list') . time() . '.xlsx' + set_space_underline(__('exports.parking_camera.list')) + . get_datetime('date_') + . '.xlsx' ); } } diff --git a/app/Http/Controllers/Admin/ParkingLicensePlateController.php b/app/Http/Controllers/Admin/ParkingLicensePlateController.php index 79c465b..946c37d 100644 --- a/app/Http/Controllers/Admin/ParkingLicensePlateController.php +++ b/app/Http/Controllers/Admin/ParkingLicensePlateController.php @@ -214,7 +214,9 @@ class ParkingLicensePlateController extends BaseController { return Excel::download( new ParkingLicensePlateImportTemplateExport(), - __('exports.license_plate.import_template') . time() .'.xlsx' + set_space_underline(__('exports.license_plate.import_template')) + . get_datetime('date_') + .'.xlsx' ); } diff --git a/app/Http/Controllers/Admin/ParkingPatternController.php b/app/Http/Controllers/Admin/ParkingPatternController.php index 94728de..721a602 100644 --- a/app/Http/Controllers/Admin/ParkingPatternController.php +++ b/app/Http/Controllers/Admin/ParkingPatternController.php @@ -214,7 +214,9 @@ class ParkingPatternController extends BaseController { return Excel::download( new ParkingPatternModelExport(), - __('exports.parking_pattern.create_pattern') . time() . '.xlsx' + set_space_underline(__('exports.parking_pattern.create_pattern')) + . get_datetime('date_') + . '.xlsx' ); } @@ -225,7 +227,9 @@ class ParkingPatternController extends BaseController { return Excel::download( new ParkingPatternSpaceExport(), - __('exports.parking_pattern.spaces_pattern') . time() . '.xlsx' + set_space_underline(__('exports.parking_pattern.spaces_pattern')) + . get_datetime('date_') + . '.xlsx' ); } diff --git a/app/Http/Controllers/Admin/ParkingSpaceController.php b/app/Http/Controllers/Admin/ParkingSpaceController.php index c726823..9518054 100644 --- a/app/Http/Controllers/Admin/ParkingSpaceController.php +++ b/app/Http/Controllers/Admin/ParkingSpaceController.php @@ -238,7 +238,9 @@ class ParkingSpaceController extends BaseController { return Excel::download( new ParkingSpaceExport(), - __('exports.parking_space.list') . time() . '.xlsx' + set_space_underline(__('exports.parking_space.list')) + . get_datetime('date_') + . '.xlsx' ); } diff --git a/app/Http/Controllers/Admin/VipListController.php b/app/Http/Controllers/Admin/VipListController.php index e91ab08..180ee23 100644 --- a/app/Http/Controllers/Admin/VipListController.php +++ b/app/Http/Controllers/Admin/VipListController.php @@ -266,7 +266,9 @@ class VipListController extends BaseController { return Excel::download( new ParkingVipListImportTemplateExport(), - __('exports.vip_list.import_template') . time() .'.xlsx' + set_space_underline(__('exports.vip_list.import_template')) + . get_datetime('date_') + . '.xlsx' ); } diff --git a/app/Models/LicensePlateRecognition.php b/app/Models/LicensePlateRecognition.php index 39be81c..68c1fb2 100644 --- a/app/Models/LicensePlateRecognition.php +++ b/app/Models/LicensePlateRecognition.php @@ -11,6 +11,14 @@ class LicensePlateRecognition extends Model protected $table = 'license_plate_recognition'; + protected $fillable = [ + 'time_slot', + 'manual_modification', + 'license_plate', + 'recognition', + 'capture_images' + ]; + protected $hidden = [ 'updated_at' diff --git a/app/Services/LicensePlateRecognitionService.php b/app/Services/LicensePlateRecognitionService.php index e7ab735..d84a4c9 100644 --- a/app/Services/LicensePlateRecognitionService.php +++ b/app/Services/LicensePlateRecognitionService.php @@ -39,4 +39,32 @@ class LicensePlateRecognitionService extends BaseService return $model; } + public function getCount($time_slot) + { + $manualWhere = $highWhere = $middleWhere = $where = [ + 'time_slot' => $time_slot + ]; + $where['manual_modification'] = 0; + $sumCount = LicensePlateRecognition::query()->where($where) + ->count(); + $highCount = LicensePlateRecognition::query()->where( + $where + )->where('recognition', '>=', 80)->count(); + $middleCount = LicensePlateRecognition::query()->where( + $where + )->where('recognition', '<', 80)->count(); + $manualWhere['manual_modification'] = 1; + $manualCount = LicensePlateRecognition::query()->where( + $manualWhere + )->count(); + return [ + 'sum_count' => $sumCount, + 'high_count' => $highCount, + 'middle_count' => $middleCount, + 'manual_count' => $manualCount, + 'high_ratio' => get_ratio($sumCount, $highCount), + 'middle_ratio' => get_ratio($sumCount, $middleCount), + 'manual_ratio' => get_ratio($sumCount, $manualCount) + ]; + } } diff --git a/app/common.php b/app/common.php index 3c49303..d47b2e1 100644 --- a/app/common.php +++ b/app/common.php @@ -34,6 +34,7 @@ if (!function_exists('get_datetime')) { } $format = match ($type) { 'date' => 'Y-m-d', + 'date_' => 'Y_m_d', 'datetime' => 'Y-m-d H:i:s', 'date_time' => 'Y-m-d H:i' }; @@ -123,3 +124,10 @@ if (!function_exists('get_image_url')) { return $image_url ? env('APP_URL') . $image_url : ''; } } + +if (!function_exists('set_space_underline')) { + function set_space_underline($str): string + { + return str_replace(' ', '_', $str); + } +} diff --git a/database/migrations/2026_04_23_143449_create_license_plate_recognition_table.php b/database/migrations/2026_04_23_143449_create_license_plate_recognition_table.php index e65df92..78152b6 100644 --- a/database/migrations/2026_04_23_143449_create_license_plate_recognition_table.php +++ b/database/migrations/2026_04_23_143449_create_license_plate_recognition_table.php @@ -16,7 +16,7 @@ return new class extends Migration $table->date('time_slot')->comment('时间段'); $table->tinyInteger('manual_modification')->default(0)->comment('手动修改 0无 1有'); $table->string('license_plate', 50)->default('')->comment('车牌号码'); - $table->tinyInteger('recognition')->default(0)->comment('识别度 0无法识别 1低 5高'); + $table->float('recognition',5)->default('0.00')->comment('识别度 0无法识别 1低 5高'); $table->string('capture_images', 255)->default('')->comment('抓取图片'); $table->innoDb(); $table->timestamps(); diff --git a/resources/lang/en/exports.php b/resources/lang/en/exports.php index 6294097..e4fc412 100644 --- a/resources/lang/en/exports.php +++ b/resources/lang/en/exports.php @@ -73,5 +73,14 @@ return [ 'license_plate' => 'license plate number', 'parking_frequency' => 'parking frequency', 'parking_duration' => 'Parking duration(min)' + ], + 'license_plate_recognition' => [ + 'list' => 'License plate recognition rate', + 'time_slot' => 'time period', + 'sum_count' => 'Total recognition times', + 'high_ratio' => 'High license plate recognition accuracy', + 'middle_ratio' => 'Low license plate recognition accuracy', + 'manual_count' => 'Number of manual modifications', + 'manual_ratio' => 'Manually modify the ratio' ] ]; diff --git a/resources/lang/zh-CN/exports.php b/resources/lang/zh-CN/exports.php index 56f621e..7b0509a 100644 --- a/resources/lang/zh-CN/exports.php +++ b/resources/lang/zh-CN/exports.php @@ -73,5 +73,14 @@ return [ 'license_plate' => '车牌号码', 'parking_frequency' => '停车次数', 'parking_duration' => '停车时长(min)' + ], + 'license_plate_recognition' => [ + 'list' => '车牌识别率', + 'time_slot' => '时间段', + 'sum_count' => '总识别次数', + 'high_ratio' => '高车牌识别度', + 'middle_ratio' => '低车牌识别度', + 'manual_count' => '手动修改次数', + 'manual_ratio' => '手动修改比例' ] ]; diff --git a/resources/lang/zh-TW/exports.php b/resources/lang/zh-TW/exports.php index 3765f78..beac9fc 100644 --- a/resources/lang/zh-TW/exports.php +++ b/resources/lang/zh-TW/exports.php @@ -73,5 +73,14 @@ return [ 'license_plate' => '車牌號碼', 'parking_frequency' => '停車次數', 'parking_duration' => '停車時長(min)' + ], + 'license_plate_recognition' => [ + 'list' => '車牌識別率', + 'time_slot' => '時間段', + 'sum_count' => '總識別次數', + 'high_ratio' => '高車牌識別度', + 'middle_ratio' => '低車牌識別度', + 'manual_count' => '手動修改次數', + 'manual_ratio' => '手動修改比例' ] ]; diff --git a/routes/admin/api.php b/routes/admin/api.php index b95bc6f..682f7c1 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -221,4 +221,5 @@ Route::group(['prefix' => 'admin'], function () { 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']); });