Browse Source

车牌识别率下载导出

master
wanghongjun 4 weeks ago
parent
commit
66fd72f568
  1. 56
      app/Exports/LicensePlateRecognitionExport.php
  2. 4
      app/Http/Controllers/Admin/EventCalendarController.php
  3. 67
      app/Http/Controllers/Admin/LicensePlateRecognitionController.php
  4. 4
      app/Http/Controllers/Admin/NoticeController.php
  5. 4
      app/Http/Controllers/Admin/OperationLogController.php
  6. 19
      app/Http/Controllers/Admin/ParkingBehaviorController.php
  7. 4
      app/Http/Controllers/Admin/ParkingCameraController.php
  8. 4
      app/Http/Controllers/Admin/ParkingLicensePlateController.php
  9. 8
      app/Http/Controllers/Admin/ParkingPatternController.php
  10. 4
      app/Http/Controllers/Admin/ParkingSpaceController.php
  11. 4
      app/Http/Controllers/Admin/VipListController.php
  12. 8
      app/Models/LicensePlateRecognition.php
  13. 28
      app/Services/LicensePlateRecognitionService.php
  14. 8
      app/common.php
  15. 2
      database/migrations/2026_04_23_143449_create_license_plate_recognition_table.php
  16. 9
      resources/lang/en/exports.php
  17. 9
      resources/lang/zh-CN/exports.php
  18. 9
      resources/lang/zh-TW/exports.php
  19. 1
      routes/admin/api.php

56
app/Exports/LicensePlateRecognitionExport.php

@ -0,0 +1,56 @@
<?php
namespace App\Exports;
use App\Models\LicensePlateRecognition;
use App\Services\LicensePlateRecognitionService;
use App\Services\OperationLogService;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
class LicensePlateRecognitionExport implements FromArray, WithHeadings
{
public function array(): array
{
$data = [];
$index = 1;
$query = LicensePlateRecognition::query();
$columns = ['time_slot'];
$query->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')
];
}
}

4
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'
);
}

67
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'
);
}
}

4
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'
);
}

4
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'
);
}
}

19
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.人员管理,新增工作人员(新增或删除操作人员,设置不同的权限、不同岗位的工作人员,可修改员工里面不可查看)、操作记录(记录操作人员新增、删除、修改员工密码的操作记录)、员工销售管理(统计员工销售酒水业绩)
*/

4
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'
);
}
}

4
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'
);
}

8
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'
);
}

4
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'
);
}

4
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'
);
}

8
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'

28
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)
];
}
}

8
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);
}
}

2
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();

9
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'
]
];

9
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' => '手动修改比例'
]
];

9
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' => '手動修改比例'
]
];

1
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']);
});

Loading…
Cancel
Save