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,136 @@
package com.viewsh.module.ops.api.badge;
import com.viewsh.module.ops.enums.BadgeDeviceStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 工牌设备状态 DTO
* <p>
* 用于跨模块传输工牌设备状态数据
*
* @author lzh
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BadgeDeviceStatusDTO {
/**
* 工牌设备ID
*/
private Long deviceId;
/**
* 工牌设备编码
*/
private String deviceCode;
/**
* 设备状态
*/
private BadgeDeviceStatusEnum status;
/**
* 电量0-100
*/
private Integer batteryLevel;
/**
* 当前所在区域ID
*/
private Long currentAreaId;
/**
* 当前所在区域名称
*/
private String currentAreaName;
/**
* 当前正在执行的工单ID
*/
private Long currentOpsOrderId;
/**
* 最后心跳时间(时间戳)
*/
private Long lastHeartbeatTime;
/**
* 状态变更时间
*/
private LocalDateTime statusChangeTime;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
// ========== 便捷方法 ==========
/**
* 判断是否在线非OFFLINE状态
*/
public boolean isOnline() {
return status != null && status.isActive();
}
/**
* 判断是否可接新单
*/
public boolean canAcceptNewOrder() {
return status != null && status.isCanAcceptNewOrder();
}
/**
* 判断是否正在执行工单
*/
public boolean isBusy() {
return status == BadgeDeviceStatusEnum.BUSY;
}
/**
* 判断是否已暂停
*/
public boolean isPaused() {
return status == BadgeDeviceStatusEnum.PAUSED;
}
/**
* 判断是否有当前工单
*/
public boolean hasCurrentOrder() {
return currentOpsOrderId != null;
}
/**
* 获取状态代码
*/
public String getStatusCode() {
return status != null ? status.getCode() : null;
}
/**
* 判断心跳是否超时(超过指定分钟数)
*
* @param thresholdMinutes 超时阈值(分钟)
* @return 是否超时
*/
public boolean isHeartbeatTimeout(int thresholdMinutes) {
if (lastHeartbeatTime == null) {
return true;
}
long thresholdMillis = System.currentTimeMillis() - (thresholdMinutes * 60L * 1000L);
return lastHeartbeatTime < thresholdMillis;
}
}

View File

@@ -0,0 +1,126 @@
package com.viewsh.module.ops.enums;
import com.viewsh.framework.common.core.ArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 工牌设备<E8AEBE><E5A487>态枚举
* <p>
* 与 CleanerStatusEnum 保持一致,用于工牌设备状态管理
*
* @author lzh
*/
@AllArgsConstructor
@Getter
public enum BadgeDeviceStatusEnum implements ArrayValuable<String> {
/**
* 空闲 - 可接新单
*/
IDLE("idle", "空闲", true),
/**
* 忙碌 - 正在执行工单
*/
BUSY("busy", "忙碌", false),
/**
* 暂停 - 临时离开或被P0打断
*/
PAUSED("paused", "暂停", false),
/**
* 离线 - 设备无心跳
*/
OFFLINE("offline", "离线", false);
public static final String[] ARRAYS = Arrays.stream(values()).map(BadgeDeviceStatusEnum::getCode).toArray(String[]::new);
/**
* 状态代码
*/
private final String code;
/**
* 状态描述
*/
private final String description;
/**
* 是否可接新单
*/
private final boolean canAcceptNewOrder;
@Override
public String[] array() {
return ARRAYS;
}
/**
* 获取状态代码
*/
public String getStatus() {
return code;
}
/**
* 检查是否为活跃状态非OFFLINE
*/
public boolean isActive() {
return this != OFFLINE;
}
/**
* 检查是否可以转换到目标状态
*
* @param target 目标状态
* @return 是否可以转换
*/
public boolean canTransitionTo(BadgeDeviceStatusEnum target) {
return switch (this) {
case OFFLINE -> target == IDLE;
case IDLE -> target == BUSY || target == OFFLINE;
case BUSY -> target == PAUSED || target == IDLE || target == OFFLINE;
case PAUSED -> target == BUSY || target == IDLE || target == OFFLINE;
};
}
/**
* 根据code获取枚举
*
* @param code 状态代码
* @return 枚举实例未找到返回OFFLINE
*/
public static BadgeDeviceStatusEnum fromCode(String code) {
if (code == null) {
return OFFLINE;
}
return Arrays.stream(values())
.filter(e -> e.getCode().equals(code))
.findFirst()
.orElse(OFFLINE);
}
/**
* 从保洁员状态枚举转换
*
* @param cleanerStatus 保洁员状态枚举
* @return 工牌设备状态枚举
*/
public static BadgeDeviceStatusEnum fromCleanerStatus(CleanerStatusEnum cleanerStatus) {
if (cleanerStatus == null) {
return OFFLINE;
}
return fromCode(cleanerStatus.getCode());
}
/**
* 转换为保洁员状态枚举
*/
public CleanerStatusEnum toCleanerStatus() {
return CleanerStatusEnum.fromCode(code);
}
}