feat(ops): add confirm event DTO and update audit DTO

This commit is contained in:
lzh
2026-01-19 14:41:05 +08:00
parent a71a29f548
commit eedef70581
7 changed files with 889 additions and 2 deletions

View File

@@ -0,0 +1,229 @@
package com.viewsh.module.ops.core.badge;
import com.viewsh.module.ops.api.badge.BadgeDeviceStatusDTO;
import com.viewsh.module.ops.enums.BadgeDeviceStatusEnum;
import java.util.List;
/**
* 工牌设备状态服务接口
* <p>
* 职责:
* 1. 管理工牌设备状态Redis 存储和查询)
* 2. 处理设备心跳更新
* 3. 状态转换IDLE ↔ BUSY ↔ PAUSED ↔ OFFLINE
* 4. 区域设备查询
* 5. 当前任务关联
* <p>
* 设计原则:
* - 状态存储在 Redis 中,不依赖数据库表
* - 与保洁员状态解耦,只关注设备本身
* - 为调度引擎提供设备状态查询能力
*
* @author lzh
*/
public interface BadgeDeviceStatusService {
// ==================== 状态管理 ====================
/**
* 更新工牌设备状态
* <p>
* 状态转换会记录状态变更时间和操作原因
*
* @param deviceId 设备ID
* @param status 目标状态
* @param operatorId 操作人ID可为null表示系统操作
* @param reason 状态变更原因
*/
void updateBadgeStatus(Long deviceId, BadgeDeviceStatusEnum status, Long operatorId, String reason);
/**
* 批量更新工牌设备状态
*
* @param deviceIds 设备ID列表
* @param status 目标状态
* @param operatorId 操作人ID
* @param reason 状态变更原因
*/
void batchUpdateBadgeStatus(List<Long> deviceIds, BadgeDeviceStatusEnum status, Long operatorId, String reason);
// ==================== 状态查询 ====================
/**
* 获取工牌设备状态
*
* @param deviceId 设备ID
* @return 设备状态DTO不存在返回null
*/
BadgeDeviceStatusDTO getBadgeStatus(Long deviceId);
/**
* 批量获取工牌设备状态
*
* @param deviceIds 设备ID列表
* @return 设备状态DTO列表
*/
List<BadgeDeviceStatusDTO> batchGetBadgeStatus(List<Long> deviceIds);
/**
* 获取指定区域的工牌设备列表
* <p>
* 只返回非 OFFLINE 状态的设备
*
* @param areaId 区域ID
* @return 设备状态DTO列表
*/
List<BadgeDeviceStatusDTO> listBadgesByArea(Long areaId);
/**
* 获取可接单的工牌设备IDLE 状态)
*
* @param areaId 区域ID
* @return 可接单设备列表
*/
List<BadgeDeviceStatusDTO> listAvailableBadges(Long areaId);
/**
* 获取所有活跃的工牌设备非OFFLINE状态
*
* @return 活跃设备列表
*/
List<BadgeDeviceStatusDTO> listActiveBadges();
// ==================== 心跳处理 ====================
/**
* 处理工牌设备心跳
* <p>
* 更新最后心跳时间和电量:
* <ul>
* <li>如果设备之前为 OFFLINE转为 IDLE</li>
* <li>如果设备已存在,更新心跳时间和电量</li>
* <li>如果设备不存在,创建新记录(状态为 IDLE</li>
* </ul>
*
* @param deviceId 设备ID
* @param deviceCode 设备编码
* @param batteryLevel 电量0-100
*/
void handleHeartbeat(Long deviceId, String deviceCode, Integer batteryLevel);
/**
* 处理工牌设备心跳(带区域信息)
*
* @param deviceId 设备ID
* @param deviceCode 设备编码
* @param batteryLevel 电量0-100
* @param areaId 当前所在区域ID
* @param areaName 当前所在区域名称
*/
void handleHeartbeatWithArea(Long deviceId, String deviceCode, Integer batteryLevel,
Long areaId, String areaName);
// ==================== 在线状态检查 ====================
/**
* 检查工牌设备是否在线非OFFLINE状态
*
* @param deviceId 设备ID
* @return 是否在线
*/
boolean isBadgeOnline(Long deviceId);
/**
* 检查工牌设备心跳是否超时
*
* @param deviceId 设备ID
* @param thresholdMinutes 超时阈值(分钟)
* @return 是否超时
*/
boolean isHeartbeatTimeout(Long deviceId, int thresholdMinutes);
/**
* 检查心跳超时并将超时设备设为OFFLINE
* <p>
* 定时任务调用默认超时时间为30分钟
*/
void checkAndMarkOfflineDevices();
// ==================== 工单关联 ====================
/**
* 设置当前工单
*
* @param deviceId 设备ID
* @param orderId 工单ID
*/
void setCurrentOrder(Long deviceId, Long orderId);
/**
* 清除当前工单
*
* @param deviceId 设备ID
*/
void clearCurrentOrder(Long deviceId);
/**
* 获取当前有工单的设备列表
*
* @return 有工单的设备列表
*/
List<BadgeDeviceStatusDTO> listBadgesWithCurrentOrder();
// ==================== 区域管理 ====================
/**
* 更新工牌设备所在区域
*
* @param deviceId 设备ID
* @param areaId 区域ID
* @param areaName 区域名称
*/
void updateBadgeArea(Long deviceId, Long areaId, String areaName);
/**
* 初始化区域设备索引
* <p>
* 从 ops_area_device_relation 表加载 BADGE 类型的设备,
* 建立区域到设备的索引关系
*/
void initAreaDeviceIndex();
/**
* 刷新区域设备索引
* <p>
* 重新从数据库加载区域设备关系
*/
void refreshAreaDeviceIndex();
/**
* 将设备添加到区域索引
*
* @param deviceId 设备ID
* @param areaId 区域ID
*/
void addToAreaIndex(Long deviceId, Long areaId);
/**
* 从区域索引移除设备
*
* @param deviceId 设备ID
* @param areaId 区域ID
*/
void removeFromAreaIndex(Long deviceId, Long areaId);
// ==================== 设备管理 ====================
/**
* 删除工牌设备状态
*
* @param deviceId 设备ID
*/
void deleteBadgeStatus(Long deviceId);
/**
* 清理所有离线设备的状态
*/
void clearOfflineBadges();
}