Files
aiot-document/开发者文档/02-Ops领域/02-工单队列系统.md

81 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 02-工单队列系统
工单队列系统是 AIOT 平台 Ops 领域的公共基础设施,用于管理工单的排队与分配。
## 一、队列状态机 (`OrderQueueStatusEnum`)
工单队列的生命周期状态:
| 队列状态 | 说明 | 对应工单状态 |
|---------|------|-------------|
| `WAITING` | 等待中 | `QUEUED` |
| `PROCESSING` | 处理中 | `DISPATCHED`/`CONFIRMED`/`ARRIVED` |
| `PAUSED` | 暂停中 | `PAUSED` |
| `REMOVED` | 已移除 | `COMPLETED`/`CANCELLED` |
## 二、队列数据结构 (`OrderQueueDTO`)
核心字段:
- `userId`执行人员ID
- `opsOrderId`工单ID
- `deviceId`工牌设备ID
- `priority`优先级0=P0, 1=P1, 2=P2, 3=P3
- `queueScore`:队列分数 = 优先级分数 + 时间戳
- `enqueueTime`:入队时间
- `queueStatus`:队列状态
## 三、区域模型 (`OpsBusAreaDO`)
区域层级(`AreaTypeEnum`
- `PARK`:园区
- `BUILDING`:楼栋
- `FLOOR`:楼层
- `FUNCTION`:功能区域
核心字段:
- `parentId`/`parentPath`:区域树
- `floorNo`:楼层号
- `areaLevel`区域等级HIGH/MEDIUM/LOW
- `standardDuration`:标准保洁时长(分钟)
## 四、派单策略 (`BadgeDeviceAreaAssignStrategy`)
**当前启用的策略**:工牌设备区域优先分配
### 派单流程
1. 查询该区域的工牌设备(`listBadgesByArea`
2. 过滤在线设备(`isOnline`
3. 选择最佳设备:
- P0紧急优先`canAcceptNewOrder`IDLE、电量充足、心跳最新
- 普通任务优先IDLE无IDLE则选等待队列少的BUSY设备
### 推荐评分
- 基础分50
- 状态分:可接单+30忙碌+10
- 电量分:>80%+15>50%+10>20%+5
- 心跳分5分钟内+5
### 出队策略(按楼层动态重算)
*注意:该逻辑属于业务设计,当前 `OrderQueueServiceEnhanced` 代码实现中仍待补充完整落地。*
在派单引擎分配等待任务时,为了提高同楼层作业效率,系统需要引入动态算分逻辑:
1. **基础排序**:队列内默认按 `queueScore`(优先级分数 + 时间戳)排队。
2. **同楼层加权(出队重算)**:当系统准备把任务出队并派发给保洁员时,如果当前任务的区域所在的 `floorNo` 与保洁员当前所在楼层(或上一个刚完成工单的楼层)一致,则该工单在本次出队评估时获得临时加分/权重优先。
3. **目的**:避免保洁员在完成当前任务后,跨楼层去处理另一个只早入队几秒钟的普通任务,而是优先扫尾同一楼层内的积压任务。
## 五、核心操作 (`OrderQueueService`)
- `enqueue`:入队
- `dequeue`:出队
- `startExecution`:开始执行
- `pauseTask`/`resumeTask`:暂停/恢复
- `adjustPriority`:调整优先级
- `getWaitingTasksByUserId`:获取等待中任务
## 六、优先级 (`PriorityEnum`)
| 优先级 | 描述 | 可打断 |
|--------|------|--------|
| P0 | 紧急任务 | 是 |
| P1 | 重要任务 | 否 |
| P2 | 普通任务 | 否 |
| P3 | 低优任务 | 否 |