怎样在PHP项目中实现设备巡检?

wen java案例 2

本文目录导读:

怎样在PHP项目中实现设备巡检?

  1. 核心业务流程
  2. 数据库设计(MySQL示例)
  3. PHP后端核心代码
  4. 前端实现建议
  5. 高级功能扩展
  6. 安全与性能优化
  7. 完整文件结构示例

在PHP项目中实现设备巡检功能,通常需要结合前端界面、后端逻辑和数据库设计,以下是实现该功能的核心步骤、技术选型及代码示例。

核心业务流程

  1. 巡检任务创建:管理员创建巡检计划(周期、设备、负责人)。
  2. 设备扫描:使用二维码/条形码或NFC标签识别设备。
  3. 数据采集:填写巡检项(温度、运行状态、照片等)。
  4. 异常上报:检测到异常时触发告警。
  5. 报表生成:巡检记录统计与分析。

数据库设计(MySQL示例)

-- 设备表
CREATE TABLE `devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_code` varchar(50) NOT NULL COMMENT '设备编号',
  `device_name` varchar(100) NOT NULL,
  `location` varchar(200) DEFAULT NULL,
  `qr_code` varchar(255) DEFAULT NULL COMMENT '二维码图片路径',
  `created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `device_code` (`device_code`)
);
-- 巡检项模板表
CREATE TABLE `inspection_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_name` varchar(100) NOT NULL COMMENT '巡检项名称',
  `item_type` enum('text','number','select','photo') DEFAULT 'text' COMMENT '数据类型',
  `options` json DEFAULT NULL COMMENT '下拉选项JSON',
  `required` tinyint(1) DEFAULT 1,
  `sort_order` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
);
-- 巡检记录表
CREATE TABLE `inspection_records` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `inspection_time` datetime NOT NULL COMMENT '巡检时间',
  `result` enum('normal','abnormal') DEFAULT 'normal',
  `remark` text,
  `photo_paths` json DEFAULT NULL COMMENT '现场照片路径JSON数组',
  `created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `device_id` (`device_id`),
  KEY `user_id` (`user_id`)
);
-- 巡检项值表(EAV模式)
CREATE TABLE `inspection_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `record_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `value` text,
  `is_abnormal` tinyint(1) DEFAULT 0 COMMENT '当前项是否异常',
  PRIMARY KEY (`id`),
  KEY `record_id` (`record_id`),
  KEY `item_id` (`item_id`)
);

PHP后端核心代码

1 创建巡检任务(Laravel示例)

// InspectionController.php
use App\Models\InspectionTask;
use App\Models\Device;
use Carbon\Carbon;
public function createTask(Request $request)
{
    $validated = $request->validate([
        'device_ids' => 'required|array',
        'user_ids' => 'required|array',
        'start_time' => 'required|date',
        'end_time' => 'required|date|after:start_time',
        'frequency' => 'required|in:daily,weekly,monthly',
    ]);
    // 创建周期性任务
    $task = InspectionTask::create([
        'start_time' => $validated['start_time'],
        'end_time' => $validated['end_time'],
        'frequency' => $validated['frequency'],
        'status' => 'active',
    ]);
    // 关联设备和负责人(多对多关系)
    $task->devices()->attach($validated['device_ids']);
    $task->users()->attach($validated['user_ids']);
    return response()->json(['message' => 'Task created', 'task_id' => $task->id], 201);
}

2 提交巡检数据

public function submitInspection(Request $request)
{
    $validated = $request->validate([
        'device_id' => 'required|exists:devices,id',
        'items' => 'required|array',
        'items.*.item_id' => 'required|exists:inspection_items,id',
        'items.*.value' => 'required',
        'items.*.is_abnormal' => 'boolean',
        'remark' => 'nullable|string',
        'photos' => 'nullable|array',
        'photos.*' => 'image|max:5120', // 5MB图片
    ]);
    DB::beginTransaction();
    try {
        // 创建主记录
        $record = InspectionRecord::create([
            'device_id' => $validated['device_id'],
            'user_id' => auth()->id(),
            'inspection_time' => now(),
            'result' => collect($validated['items'])->pluck('is_abnormal')->contains(true) ? 'abnormal' : 'normal',
            'remark' => $validated['remark'] ?? null,
        ]);
        // 保存照片
        if ($request->has('photos')) {
            $photoPaths = [];
            foreach ($validated['photos'] as $photo) {
                $path = $photo->store('inspection_photos', 'public');
                $photoPaths[] = $path;
            }
            $record->photo_paths = $photoPaths;
            $record->save();
        }
        // 保存巡检项值
        foreach ($validated['items'] as $item) {
            InspectionValue::create([
                'record_id' => $record->id,
                'item_id' => $item['item_id'],
                'value' => $item['value'],
                'is_abnormal' => $item['is_abnormal'] ?? false,
            ]);
            // 如果异常,触发告警
            if ($item['is_abnormal']) {
                $this->triggerAlert($record, $item);
            }
        }
        DB::commit();
        return response()->json(['message' => 'Inspection submitted', 'record_id' => $record->id], 201);
    } catch (\Exception $e) {
        DB::rollback();
        return response()->json(['error' => $e->getMessage()], 500);
    }
}
private function triggerAlert($record, $item)
{
    // 发送通知给管理员(邮件/短信/Push)
    // ...
}

前端实现建议

1 移动端扫码巡检(H5 + JS)

<!-- 扫码页面 -->
<input type="text" id="deviceCode" readonly placeholder="扫描二维码">
<button onclick="scanQR()">扫描设备</button>
<script>
// 使用 html5-qrcode 库
function scanQR() {
    const scanner = new Html5QrcodeScanner("reader", { fps: 10, qrbox: 250 });
    scanner.render((decodedText) => {
        document.getElementById('deviceCode').value = decodedText;
        // 自动加载该设备的巡检模板
        loadInspectionForm(decodedText);
        scanner.clear();
    });
}
async function loadInspectionForm(deviceCode) {
    const response = await fetch(`/api/inspection/form?device_code=${deviceCode}`);
    const data = await response.json();
    // 渲染动态表单
    renderForm(data.items, data.device_name);
}
</script>

2 离线巡检支持(IndexedDB + Service Worker)

// 离线缓存巡检任务
const taskCache = new Map();
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js').then(reg => {
        // 缓存最新任务数据
        reg.sync.register('sync-inspection');
    });
}
// 离线提交时保存到本地
function saveOfflineInspection(data) {
    const request = indexedDB.open('InspectionDB', 1);
    request.onsuccess = (event) => {
        const db = event.target.result;
        const tx = db.transaction('pending', 'readwrite');
        const store = tx.objectStore('pending');
        store.add({ data, timestamp: Date.now() });
    };
}
// 网络恢复后自动同步
navigator.addEventListener('online', () => {
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.ready.then(reg => {
            reg.sync.register('sync-inspection');
        });
    }
});

高级功能扩展

功能 实现方案
NFC识别 使用Web NFC API扫描设备Tag
语音录入 Web Speech API 或 第三方语音转文字
实时监控 WebSocket推送异常信息到监控中心
GPS定位 使用Geolocation API记录巡检位置
签名确认 Canvas绘制签名并保存为图片

安全与性能优化

  • 防重提交:使用幂等性Token(每个设备每次巡检唯一Token)
  • 图片压缩:前端使用Canvas压缩后再上传
  • 数据缓存:Redis缓存设备信息和巡检模板
  • 权限控制:基于角色的访问控制(RBAC)
  • 审计日志:记录所有巡检修改操作

完整文件结构示例

project/
├── app/
│   ├── Http/Controllers/Api/
│   │   └── InspectionController.php
│   ├── Models/
│   │   ├── Device.php
│   │   ├── InspectionRecord.php
│   │   └── InspectionValue.php
│   └── Services/
│       └── InspectionService.php
├── database/
│   └── migrations/
│       └── inspection_tables.php
├── resources/
│   ├── js/
│   │   ├── qr-scanner.js
│   │   └── offline-sync.js
│   └── views/
│       └── inspection/
│           ├── device-form.blade.php
│           └── report.blade.php
└── routes/
    └── api.php

通过结构化数据库设计、标准化API接口和前端工程化实现,可以在PHP项目中构建完整的设备巡检系统,建议结合具体业务场景选择:

  • 简单场景:MySQL + CodeIgniter/Laravel
  • 高并发:Redis缓存 + 消息队列处理图片上传
  • 物联网场景:集成MQTT协议接收设备遥测数据

抱歉,评论功能暂时关闭!