本文目录导读:

在PHP项目中实现设备巡检功能,通常需要结合前端界面、后端逻辑和数据库设计,以下是实现该功能的核心步骤、技术选型及代码示例。
核心业务流程
- 巡检任务创建:管理员创建巡检计划(周期、设备、负责人)。
- 设备扫描:使用二维码/条形码或NFC标签识别设备。
- 数据采集:填写巡检项(温度、运行状态、照片等)。
- 异常上报:检测到异常时触发告警。
- 报表生成:巡检记录统计与分析。
数据库设计(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协议接收设备遥测数据