feat(ops): add confirm event DTO and update audit DTO
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user