From 0ca1adf2a4cc24292a850ce9496f02892f486de7 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 21 Apr 2026 12:32:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor(video):=20P2=20=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=B1=82=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5=20varchar=20?= =?UTF-8?q?=E2=86=92=20datetime=20/=20String=20=E2=86=92=20LocalDateTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SQL 类型优化(应用层生成的业务时间改为标准 datetime): - video_ai_edge_device: last_heartbeat / updated_at - video_ai_config_log: updated_at - video_ai_config_snapshot: created_at - video_ai_algorithm: sync_time - video_ai_alert: received_at - video_media_server: last_keepalive_time DO 字段 String → LocalDateTime 对齐:AiEdgeDevice / AiConfigLog / AiConfigSnapshot / AiAlgorithm / AiAlert / MediaServer 调用点适配: - Service 层 new Date() 字符串格式化赋值统一改为 LocalDateTime.now() - AiAlertController.edgeReport / MqttService.handleAlert 新增 parseEventTime / parseTimestamp 私有方法,外部字符串防御性解析 保留 varchar(本批次暂不动,SIP 协议原生字符串,改动涉及 72+ 处 Mapper 与 SIP 处理器,单独迭代): - video_device.register_time / keepalive_time - video_device_channel.end_time / gps_time - video_device_mobile_position.time - video_stream_push.push_time 编译通过(mvn compile BUILD SUCCESS)。 Co-Authored-By: Claude Opus 4.7 (1M context) --- sql/mysql/video.sql | 14 ++++++------ .../module/video/aiot/bean/AiAlert.java | 4 +++- .../module/video/aiot/bean/AiAlgorithm.java | 4 +++- .../module/video/aiot/bean/AiConfigLog.java | 4 +++- .../video/aiot/bean/AiConfigSnapshot.java | 4 +++- .../module/video/aiot/bean/AiEdgeDevice.java | 6 +++-- .../aiot/controller/AiAlertController.java | 21 +++++++++++++++++- .../video/aiot/dao/AiAlgorithmMapper.java | 3 ++- .../video/aiot/dao/AiEdgeDeviceMapper.java | 3 ++- .../video/aiot/service/MqttService.java | 22 +++++++++++++++++-- .../aiot/service/impl/AiAlertServiceImpl.java | 5 +---- .../service/impl/AiAlgorithmServiceImpl.java | 7 ++---- .../service/impl/AiConfigLogServiceImpl.java | 5 +---- .../impl/AiConfigSnapshotServiceImpl.java | 5 +---- .../service/impl/AiEdgeDeviceServiceImpl.java | 9 +++----- .../module/video/media/bean/MediaServer.java | 4 +++- 16 files changed, 78 insertions(+), 42 deletions(-) diff --git a/sql/mysql/video.sql b/sql/mysql/video.sql index 323f50a4..480f6ac7 100644 --- a/sql/mysql/video.sql +++ b/sql/mysql/video.sql @@ -533,7 +533,7 @@ CREATE TABLE `video_media_server` ( `transcode_suffix` varchar(255) NULL COMMENT '转码指令后缀', `server_id` varchar(50) NULL COMMENT '对应信令服务器ID', `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '媒体服务器在线状态(0离线,1在线)', - `last_keepalive_time` varchar(50) NULL COMMENT '最近心跳时间', + `last_keepalive_time` datetime NULL COMMENT '最近心跳时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -708,7 +708,7 @@ CREATE TABLE `video_ai_alert` ( `image_path` varchar(255) NULL COMMENT '告警图片路径', `duration_minutes` double NULL COMMENT '持续时长(分钟)', `extra_data` text NULL COMMENT 'JSON 扩展', - `received_at` varchar(50) NOT NULL COMMENT '接收时间', + `received_at` datetime NULL COMMENT '接收时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -731,14 +731,14 @@ CREATE TABLE `video_ai_edge_device` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `device_id` varchar(64) NOT NULL COMMENT '设备唯一ID', `status` varchar(20) NOT NULL DEFAULT 'offline' COMMENT '状态:online/offline', - `last_heartbeat` varchar(50) NULL COMMENT '最后心跳时间', + `last_heartbeat` datetime NULL COMMENT '最后心跳时间', `uptime_seconds` bigint NULL COMMENT '运行时长(秒)', `frames_processed` bigint NULL COMMENT '已处理帧数', `alerts_generated` bigint NULL COMMENT '已生成告警数', `stream_stats` text NULL COMMENT '流统计 JSON', `stream_count` int NULL COMMENT '活跃视频流数量', `config_version` varchar(64) NULL COMMENT '当前配置版本', - `updated_at` varchar(50) NULL COMMENT '更新时间', + `updated_at` datetime NULL COMMENT '更新时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -819,7 +819,7 @@ CREATE TABLE `video_ai_config_log` ( `old_value` text NULL COMMENT '变更前 JSON', `new_value` text NULL COMMENT '变更后 JSON', `updated_by` varchar(100) NULL COMMENT '操作人', - `updated_at` varchar(50) NULL COMMENT '操作时间', + `updated_at` datetime NULL COMMENT '操作时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -846,7 +846,7 @@ CREATE TABLE `video_ai_config_snapshot` ( `change_type` varchar(20) NOT NULL COMMENT 'CREATE | UPDATE | DELETE | ROLLBACK | PUSH', `change_desc` varchar(255) NULL COMMENT '变更描述', `created_by` varchar(64) NULL COMMENT '操作人', - `created_at` varchar(50) NOT NULL COMMENT '创建时间', + `created_at` datetime NULL COMMENT '创建时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -897,7 +897,7 @@ CREATE TABLE `video_ai_algorithm` ( `global_params` text NULL COMMENT '用户自定义的全局默认参数 JSON', `description` varchar(500) NULL COMMENT '描述', `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否可用', - `sync_time` varchar(50) NULL COMMENT '最后同步时间', + `sync_time` datetime NULL COMMENT '最后同步时间', `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlert.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlert.java index 63334dc4..e55b1a2d 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlert.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlert.java @@ -9,6 +9,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + @Data @TableName("video_ai_alert") @EqualsAndHashCode(callSuper = true) @@ -64,5 +66,5 @@ public class AiAlert extends ProjectBaseDO { private String extraData; @Schema(description = "接收时间") - private String receivedAt; + private LocalDateTime receivedAt; } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlgorithm.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlgorithm.java index 2dea74a7..59b51ca4 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlgorithm.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiAlgorithm.java @@ -8,6 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + @Data @TableName("video_ai_algorithm") @EqualsAndHashCode(callSuper = true) @@ -40,5 +42,5 @@ public class AiAlgorithm extends TenantBaseDO { private String globalParams; @Schema(description = "最后同步时间") - private String syncTime; + private LocalDateTime syncTime; } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigLog.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigLog.java index 7df3cb0e..7caa4ba3 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigLog.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigLog.java @@ -8,6 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + @Data @TableName("video_ai_config_log") @EqualsAndHashCode(callSuper = true) @@ -34,5 +36,5 @@ public class AiConfigLog extends ProjectBaseDO { private String updatedBy; @Schema(description = "操作时间") - private String updatedAt; + private LocalDateTime updatedAt; } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigSnapshot.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigSnapshot.java index c0c315fb..5428d564 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigSnapshot.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiConfigSnapshot.java @@ -8,6 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + @Data @TableName("video_ai_config_snapshot") @EqualsAndHashCode(callSuper = true) @@ -43,5 +45,5 @@ public class AiConfigSnapshot extends ProjectBaseDO { private String createdBy; @Schema(description = "创建时间(业务字段,记录快照生成时间)") - private String createdAt; + private LocalDateTime createdAt; } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiEdgeDevice.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiEdgeDevice.java index 6a94a0e3..f5399704 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiEdgeDevice.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/bean/AiEdgeDevice.java @@ -8,6 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + @Data @TableName("video_ai_edge_device") @EqualsAndHashCode(callSuper = true) @@ -25,7 +27,7 @@ public class AiEdgeDevice extends ProjectBaseDO { private String status; @Schema(description = "最后心跳时间") - private String lastHeartbeat; + private LocalDateTime lastHeartbeat; @Schema(description = "运行时长(秒)") private Long uptimeSeconds; @@ -46,5 +48,5 @@ public class AiEdgeDevice extends ProjectBaseDO { private String configVersion; @Schema(description = "更新时间(业务字段)") - private String updatedAt; + private LocalDateTime updatedAt; } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java index 510741de..255a412c 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java @@ -13,6 +13,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; @@ -92,7 +94,7 @@ public class AiAlertController { alert.setRoiId((String) body.get("scene_id")); alert.setAlertType((String) body.get("algorithm_code")); alert.setImagePath((String) body.get("snapshot_url")); - alert.setReceivedAt((String) body.get("event_time")); + alert.setReceivedAt(parseEventTime((String) body.get("event_time"))); Object conf = body.get("confidence_score"); if (conf instanceof Number) { @@ -124,4 +126,21 @@ public class AiAlertController { log.info("[AiAlert] Edge 告警结束: alarmId={}, durationMin={}", alarmId, minutes); } } + + /** + * 解析外部上报的事件时间字符串为 LocalDateTime,解析失败返回 null(由 save() 兜底为当前时间) + * 支持格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd'T'HH:mm:ss + */ + private static LocalDateTime parseEventTime(String s) { + if (s == null || s.isEmpty()) { + return null; + } + try { + String normalized = s.replace('T', ' '); + return LocalDateTime.parse(normalized, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } catch (Exception e) { + log.warn("[AiAlert] 无法解析事件时间: {}", s); + return null; + } + } } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiAlgorithmMapper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiAlgorithmMapper.java index 7fdc4ade..a1605497 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiAlgorithmMapper.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiAlgorithmMapper.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; +import java.time.LocalDateTime; import java.util.List; @Mapper @@ -40,5 +41,5 @@ public interface AiAlgorithmMapper extends BaseMapperX { } @Update("UPDATE video_ai_algorithm SET is_active=#{isActive}, update_time=#{updateTime} WHERE id=#{id} AND deleted=0") - int updateActive(@Param("id") Long id, @Param("isActive") Integer isActive, @Param("updateTime") String updateTime); + int updateActive(@Param("id") Long id, @Param("isActive") Integer isActive, @Param("updateTime") LocalDateTime updateTime); } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiEdgeDeviceMapper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiEdgeDeviceMapper.java index 4963619c..2a2c714f 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiEdgeDeviceMapper.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/dao/AiEdgeDeviceMapper.java @@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.time.LocalDateTime; import java.util.List; @Mapper @@ -33,7 +34,7 @@ public interface AiEdgeDeviceMapper extends BaseMapperX { @Update("UPDATE video_ai_edge_device SET status='offline', updated_at=#{now} " + "WHERE status='online' AND last_heartbeat < #{threshold} AND deleted=0") - int markOffline(@Param("threshold") String threshold, @Param("now") String now); + int markOffline(@Param("threshold") LocalDateTime threshold, @Param("now") LocalDateTime now); @Update("UPDATE video_ai_edge_device SET deleted=1 WHERE device_id != #{keepDeviceId} AND deleted=0") int deleteAllExcept(@Param("keepDeviceId") String keepDeviceId); diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/MqttService.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/MqttService.java index aadea5ab..fa40e26a 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/MqttService.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/MqttService.java @@ -18,6 +18,8 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.function.BiConsumer; @Slf4j @@ -145,8 +147,8 @@ public class MqttService { alert.setMessage(json.getString("message")); alert.setImagePath(json.getString("image_path")); alert.setDurationMinutes(json.getDouble("duration_minutes")); - // timestamp → receivedAt - alert.setReceivedAt(json.getString("timestamp")); + // timestamp → receivedAt(防御性解析,失败则由 save() 兜底为当前时间) + alert.setReceivedAt(parseTimestamp(json.getString("timestamp"))); // 其余字段放入extraData JSONObject extra = new JSONObject(); @@ -235,6 +237,22 @@ public class MqttService { return client != null && client.isConnected(); } + /** + * 解析 MQTT 上报的时间戳字符串为 LocalDateTime,解析失败返回 null(由 save() 兜底为当前时间) + * 支持格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd'T'HH:mm:ss + */ + private static LocalDateTime parseTimestamp(String s) { + if (s == null || s.isEmpty()) { + return null; + } + try { + String normalized = s.replace('T', ' '); + return LocalDateTime.parse(normalized, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } catch (Exception e) { + return null; + } + } + @PreDestroy public void destroy() { if (client != null && client.isConnected()) { diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlertServiceImpl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlertServiceImpl.java index 4a07d5ed..2bf243c5 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlertServiceImpl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlertServiceImpl.java @@ -14,7 +14,6 @@ import org.springframework.web.client.RestTemplate; import java.net.URI; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; @Slf4j @@ -27,12 +26,10 @@ public class AiAlertServiceImpl implements IAiAlertService { @Autowired private CosUtil cosUtil; - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Override public void save(AiAlert alert) { if (alert.getReceivedAt() == null) { - alert.setReceivedAt(LocalDateTime.now().format(FORMATTER)); + alert.setReceivedAt(LocalDateTime.now()); } // 防止重复插入(轻量查询,不做 JOIN) if (alertMapper.countByAlertId(alert.getAlertId()) > 0) { diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlgorithmServiceImpl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlgorithmServiceImpl.java index e505eb4d..993c5bb6 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlgorithmServiceImpl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiAlgorithmServiceImpl.java @@ -12,7 +12,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,8 +29,6 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { @Autowired private IAiConfigLogService configLogService; - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - /** * 预置算法定义,启动时自动校正数据库中的乱码数据 * 注意:仅包含边缘端实际实现的算法 @@ -96,7 +93,7 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { @Override public void toggleActive(Long id, Integer isActive) { - String now = LocalDateTime.now().format(FORMATTER); + LocalDateTime now = LocalDateTime.now(); algorithmMapper.updateActive(id, isActive, now); configLogService.addLog("ALGORITHM", String.valueOf(id), null, "{\"is_active\":" + isActive + "}", null); @@ -109,7 +106,7 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { log.warn("AI服务未启用,跳过同步"); return; } - String now = LocalDateTime.now().format(FORMATTER); + LocalDateTime now = LocalDateTime.now(); try { RestTemplate restTemplate = new RestTemplate(); String url = aiServiceConfig.getUrl() + "/api/algorithms"; diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigLogServiceImpl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigLogServiceImpl.java index 60ca80e4..2cd19295 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigLogServiceImpl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigLogServiceImpl.java @@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; @Slf4j @@ -21,8 +20,6 @@ public class AiConfigLogServiceImpl implements IAiConfigLogService { @Autowired private AiConfigLogMapper configLogMapper; - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Override public void addLog(String configType, String configId, String oldValue, String newValue, String updatedBy) { AiConfigLog logEntry = new AiConfigLog(); @@ -31,7 +28,7 @@ public class AiConfigLogServiceImpl implements IAiConfigLogService { logEntry.setOldValue(oldValue); logEntry.setNewValue(newValue); logEntry.setUpdatedBy(updatedBy); - logEntry.setUpdatedAt(LocalDateTime.now().format(FORMATTER)); + logEntry.setUpdatedAt(LocalDateTime.now()); configLogMapper.add(logEntry); } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigSnapshotServiceImpl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigSnapshotServiceImpl.java index c0873854..134b34c7 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigSnapshotServiceImpl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiConfigSnapshotServiceImpl.java @@ -20,7 +20,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; @Slf4j @@ -43,8 +42,6 @@ public class AiConfigSnapshotServiceImpl implements IAiConfigSnapshotService { @Autowired private IAiRedisConfigService redisConfigService; - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Override public AiConfigSnapshot createSnapshot(String scopeType, String scopeId, String cameraId, String snapshot, String changeType, String changeDesc, String createdBy) { @@ -58,7 +55,7 @@ public class AiConfigSnapshotServiceImpl implements IAiConfigSnapshotService { s.setChangeType(changeType); s.setChangeDesc(changeDesc); s.setCreatedBy(createdBy); - s.setCreatedAt(LocalDateTime.now().format(FORMATTER)); + s.setCreatedAt(LocalDateTime.now()); snapshotMapper.add(s); log.info("[AiSnapshot] 创建快照: scope={}/{}, version={}, type={}", scopeType, scopeId, s.getVersion(), changeType); return s; diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiEdgeDeviceServiceImpl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiEdgeDeviceServiceImpl.java index 347a2a6b..441c8685 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiEdgeDeviceServiceImpl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/service/impl/AiEdgeDeviceServiceImpl.java @@ -14,7 +14,6 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,11 +25,9 @@ public class AiEdgeDeviceServiceImpl implements IAiEdgeDeviceService { @Autowired private AiEdgeDeviceMapper deviceMapper; - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - @Override public void saveOrUpdateHeartbeat(String deviceId, String payload) { - String now = LocalDateTime.now().format(FORMATTER); + LocalDateTime now = LocalDateTime.now(); try { JSONObject json = JSON.parseObject(payload); @@ -84,8 +81,8 @@ public class AiEdgeDeviceServiceImpl implements IAiEdgeDeviceService { @Override @Scheduled(fixedRate = 90000) // 每90秒检查一次 public void checkOffline() { - String now = LocalDateTime.now().format(FORMATTER); - String threshold = LocalDateTime.now().minusSeconds(90).format(FORMATTER); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime threshold = LocalDateTime.now().minusSeconds(90); int count = deviceMapper.markOffline(threshold, now); if (count > 0) { log.warn("[AiEdgeDevice] 标记{}台设备为离线", count); diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/bean/MediaServer.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/bean/MediaServer.java index 7a49e12d..b56a8317 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/bean/MediaServer.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/bean/MediaServer.java @@ -10,6 +10,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.util.ObjectUtils; +import java.time.LocalDateTime; + @Schema(description = "流媒体服务信息") @Data @TableName("video_media_server") @@ -95,7 +97,7 @@ public class MediaServer extends BaseDO { private int recordAssistPort; @Schema(description = "上次心跳时间") - private String lastKeepaliveTime; + private LocalDateTime lastKeepaliveTime; @Schema(description = "是否是默认ZLM") private boolean defaultServer;