7 changed files with 244 additions and 0 deletions
@ -0,0 +1,144 @@ |
|||
<?php |
|||
|
|||
namespace App\Http\Controllers\Admin; |
|||
|
|||
use App\Exports\ParkingBehaviorExport; |
|||
use App\Models\ParkingAccessRecord; |
|||
use App\Models\ParkingInformation; |
|||
use App\Models\ParkingLicensePlate; |
|||
use Illuminate\Http\JsonResponse; |
|||
use Illuminate\Http\Request; |
|||
use Exception; |
|||
use Illuminate\Support\Facades\DB; |
|||
use Maatwebsite\Excel\Facades\Excel; |
|||
use Symfony\Component\HttpFoundation\BinaryFileResponse; |
|||
|
|||
class ParkingBehaviorController extends BaseController |
|||
{ |
|||
public function index(Request $request): JsonResponse |
|||
{ |
|||
try { |
|||
$select = " SELECT DATE_FORMAT(FROM_UNIXTIME(enter_time), " |
|||
. "'%Y-%m-%d') AS time_period, `license_plate_id`, " |
|||
. "COUNT(license_plate_id) AS parking_frequency, SUM(COALESCE(" |
|||
. "leave_time, UNIX_TIMESTAMP()) - enter_time) AS parking_duration"; |
|||
$from = " FROM `parking_access_record` "; |
|||
$group = " GROUP BY DATE_FORMAT(FROM_UNIXTIME(enter_time)," |
|||
. " '%Y-%m-%d'), `license_plate_id`"; |
|||
|
|||
$whereArr = []; |
|||
if ($request->has('start_time') && $request->has('end_time')) { |
|||
$start_time = $request->input('start_time'); |
|||
$end_time = $request->input('end_time'); |
|||
if ($start_time && $end_time) { |
|||
$end_times = strtotime($end_time . ' 23:59:59'); |
|||
$start_times = strtotime($start_time . ' 00:00:00'); |
|||
if ($start_times && $end_times) { |
|||
$whereArr[] |
|||
= " enter_time BETWEEN {$start_times} and {$end_times}"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
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) { |
|||
$whereArr[] = " license_plate_id = {$license_plate_id}"; |
|||
} else { |
|||
$whereArr[] = " id = 0"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
$where = $whereArr ? ' WHERE ' . implode(' AND ', $whereArr) : ''; |
|||
|
|||
// 分页 |
|||
$page = $request->input('page', 1); |
|||
$perPage = $request->input('per_page', 10); |
|||
|
|||
$havingArr = []; |
|||
if ($request->has('min_count') && $request->has('max_count')) { |
|||
$min_count = $request->input('min_count'); |
|||
$max_count = $request->input('max_count'); |
|||
if (is_numeric($min_count) && is_numeric($max_count)) { |
|||
$havingArr[] |
|||
= "(parking_frequency >= {$min_count} AND parking_frequency <= {$max_count})"; |
|||
} |
|||
} |
|||
|
|||
if ($request->has('min_times') && $request->has('max_times')) { |
|||
$min_times = $request->input('min_times'); |
|||
$max_times = $request->input('max_times'); |
|||
if (is_numeric($min_times) && is_numeric($max_times)) { |
|||
$havingArr[] |
|||
= "(parking_duration >= {$min_times} AND parking_duration <= {$max_times})"; |
|||
} |
|||
} |
|||
$having = $havingArr ? " HAVING " . implode(' AND ', $havingArr) |
|||
: ''; |
|||
|
|||
$total = 0; |
|||
$all = DB::select($select . $from . $where . $group . $having); |
|||
|
|||
if ($all) { |
|||
$total = count($all); |
|||
} |
|||
$offset = ($page - 1) * $perPage; |
|||
|
|||
$limit = " LIMIT {$offset}, {$perPage}"; |
|||
$items = DB::select( |
|||
$select . $from . $where . $group . $having . $limit |
|||
); |
|||
|
|||
foreach ($items as &$item) { |
|||
$license_plate = ParkingLicensePlate::getNumber( |
|||
$item->license_plate_id |
|||
); |
|||
$item->license_plate = $license_plate; |
|||
unset($item->license_plate_id); |
|||
} |
|||
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 BinaryFileResponse |
|||
*/ |
|||
public function export(): BinaryFileResponse |
|||
{ |
|||
return Excel::download( |
|||
new ParkingBehaviorExport(), |
|||
__('exports.parking_behavior.list') . time() . '.xlsx' |
|||
); |
|||
} |
|||
} |
|||
/* |
|||
|
|||
网站开发 |
|||
|
|||
|
|||
|
|||
帮我开发一个后台管理系统,使用后端语言PHP版本大于8.0,前端语言使用vue3,实现前后端分离,用于管理【管理内容】。 |
|||
登录要求:包含登录页, |
|||
页面要求:1.登录后页面左边展示菜单,右边显示内容,默认展示首页内容,首页显示今日营业数据总览 |
|||
2.第1个菜单酒水菜品菜单管理,其中包含二级菜单:分类管理、商品列表。分类管理增删改查菜品分类如大类目增加啤酒、洋酒、小吃,商品列表内容有:新增商品(商品名字、数量、价格、类型)、列表筛选(上架、下架、商品名称搜索、类型选择)、列表(显示商品列表、名称、价格、上架时间、状态等) |
|||
3.第2个菜单会员管理页面,其中包含二级菜单:会员信息、会员等级管理、充值配置、充值记录、消费记录 |
|||
4.财务管理,其中包含二级菜单:数据概览(今日营收、本月总营收、营收趋势(每日k线)、收入明细(显示最新支付数据:项目、支付时间、金额、支付方式))、营业明细(列表展示今日销售酒水,支付方式、支付时间等) |
|||
5.人员管理,新增工作人员(新增或删除操作人员,设置不同的权限、不同岗位的工作人员,可修改员工里面不可查看)、操作记录(记录操作人员新增、删除、修改员工密码的操作记录)、员工销售管理(统计员工销售酒水业绩) |
|||
|
|||
*/ |
|||
@ -0,0 +1,40 @@ |
|||
<?php |
|||
|
|||
namespace App\Models; |
|||
|
|||
use Illuminate\Database\Eloquent\Factories\HasFactory; |
|||
use Illuminate\Database\Eloquent\Model; |
|||
|
|||
class ParkingAccessRecord extends Model |
|||
{ |
|||
|
|||
use HasFactory; |
|||
|
|||
protected $table = 'parking_access_record'; |
|||
|
|||
protected $fillable |
|||
= [ |
|||
'floor_id', |
|||
'license_plate_id', |
|||
'space_id', |
|||
'status', |
|||
'enter_time', |
|||
'leave_time' |
|||
]; |
|||
|
|||
protected $hidden = [ |
|||
'created_at', |
|||
'updated_at' |
|||
]; |
|||
|
|||
public function getEnterTimeAttribute($value): string |
|||
{ |
|||
return get_datetime('datetime', strtotime($value)); |
|||
} |
|||
|
|||
public function getLeaveTimeAttribute($value): string |
|||
{ |
|||
return $value ? get_datetime('datetime', strtotime($value)) : ''; |
|||
} |
|||
|
|||
} |
|||
@ -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_access_record', function (Blueprint $table) { |
|||
$table->id(); |
|||
$table->integer('floor_id')->comment('楼层id'); |
|||
$table->integer('license_plate_id')->comment('车牌id'); |
|||
$table->integer('space_id')->comment('车位id'); |
|||
$table->tinyInteger('status')->default(1)->comment('状态 0离 1进'); |
|||
$table->integer('enter_time')->comment('进入时间'); |
|||
$table->integer('leave_time')->comment('离开时间'); |
|||
$table->innoDb(); |
|||
$table->index('space_id'); |
|||
$table->comment('停车进出记录'); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Reverse the migrations. |
|||
*/ |
|||
public function down(): void |
|||
{ |
|||
Schema::dropIfExists('parking_access_record'); |
|||
} |
|||
}; |
|||
Loading…
Reference in new issue