refactor(data): align entity state table with lease-based timeout design doc

Rename driver_id to parent_entity_id, ttl_seconds to timeout_seconds.
Add last_state_flag, last_heartbeat_time, last_alarm_id,
timeout_source_flag, and state_ext fields to EntityStateDO.
Add TimeoutSourceFlagEnum for timeout source classification.
This commit is contained in:
pnoker
2026-05-22 01:35:41 +08:00
parent 9007cbc22c
commit 439330f3ff
2 changed files with 128 additions and 8 deletions
@@ -0,0 +1,88 @@
/*
* Copyright 2016-present the IoT DC3 original author or authors.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package io.github.pnoker.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
/**
* Enumeration of timeout source flags.
*
* @author pnoker
* @version 2026.5.22
* @since 2026.5.22
*/
@Getter
@AllArgsConstructor
public enum TimeoutSourceFlagEnum {
/**
* System
*/
SYSTEM((byte) 0, "system", "System"),
/**
* Driver
*/
DRIVER((byte) 1, "driver", "Driver"),
/**
* Device
*/
DEVICE((byte) 2, "device", "Device"),
/**
* Profile
*/
PROFILE((byte) 3, "profile", "Profile"),
;
@EnumValue
private final Byte index;
private final String code;
private final String remark;
public static TimeoutSourceFlagEnum ofIndex(Byte index) {
Optional<TimeoutSourceFlagEnum> any = Arrays.stream(TimeoutSourceFlagEnum.values())
.filter(type -> type.getIndex().equals(index))
.findFirst();
return any.orElse(null);
}
public static TimeoutSourceFlagEnum ofCode(String code) {
Optional<TimeoutSourceFlagEnum> any = Arrays.stream(TimeoutSourceFlagEnum.values())
.filter(type -> type.getCode().equals(code))
.findFirst();
return any.orElse(null);
}
public static TimeoutSourceFlagEnum ofName(String name) {
try {
return valueOf(name);
} catch (IllegalArgumentException e) {
return null;
}
}
}
@@ -22,6 +22,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import io.github.pnoker.common.entity.ext.JsonExt;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -38,13 +40,13 @@ import java.time.LocalDateTime;
* query services read this table as the authoritative source of truth.
*
* @author pnoker
* @version 2026.5.21
* @version 2026.5.22
* @since 2026.5.21
*/
@Getter
@Setter
@ToString
@TableName("dc3_entity_state")
@TableName(value = "dc3_entity_state", autoResultMap = true)
public class EntityStateDO implements Serializable {
@Serial
@@ -66,10 +68,10 @@ public class EntityStateDO implements Serializable {
private Long entityId;
/**
* Driver ID. For driver entries same as entity_id; for device entries the owning driver.
* Parent entity ID. For driver entries same as entity_id; for device entries the owning driver.
*/
@TableField("driver_id")
private Long driverId;
@TableField("parent_entity_id")
private Long parentEntityId;
/**
* Current status index (DriverStatusEnum / DeviceStatusEnum index)
@@ -77,6 +79,12 @@ public class EntityStateDO implements Serializable {
@TableField("state_flag")
private Byte stateFlag;
/**
* Last state flag, default OFFLINE (1)
*/
@TableField("last_state_flag")
private Byte lastStateFlag;
/**
* Monotonic version incremented on each heartbeat renewal
*/
@@ -90,10 +98,34 @@ public class EntityStateDO implements Serializable {
private LocalDateTime expireTime;
/**
* TTL in seconds used for this entry
* Timeout in seconds used for this entry
*/
@TableField("ttl_seconds")
private Integer ttlSeconds;
@TableField("timeout_seconds")
private Integer timeoutSeconds;
/**
* Latest heartbeat time
*/
@TableField("last_heartbeat_time")
private LocalDateTime lastHeartbeatTime;
/**
* Latest alarm ID, default 0
*/
@TableField("last_alarm_id")
private Long lastAlarmId;
/**
* Timeout source (TimeoutSourceFlagEnum), default 0
*/
@TableField("timeout_source_flag")
private Byte timeoutSourceFlag;
/**
* JSON extension payload
*/
@TableField(value = "state_ext", typeHandler = JacksonTypeHandler.class)
private JsonExt stateExt;
@TableField("tenant_id")
private Long tenantId;