From 11d4be720620abf502d35000e2ed40d30c4023bf Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期一, 24 十一月 2025 16:33:34 +0800
Subject: [PATCH] 修复离线时间展示
---
collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java | 4
collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java | 3
collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java | 2
collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java | 2
collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.xml | 8 ++
collect/src/main/java/com/qianwen/mdc/collect/service/DeviceOfflineCheckService.java | 120 ++++++++++++++++++++++++++++++++++-----
collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml | 2
7 files changed, 117 insertions(+), 24 deletions(-)
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java
index 7f28a5c..5ed0d79 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.java
@@ -114,4 +114,6 @@
* @return
*/
List<DeviceState> workstationFixPointStatesInTimeRange(@Param("workstationId")Long workstationId, @Param("startTime")Long startTime, @Param("endTime")Long endTime);
+
+ DeviceState lastNoFixedState(@Param("workstationId")long workstationId);
}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
index 25aa371..38b7062 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.java
@@ -11,9 +11,8 @@
/**
* 鏌ヨ宸ヤ綅鍦ㄦ渶杩慸uration姣鍐呮渶鍚庝竴涓弬鏁�
* @param workstationId
- * @param duration
* @return
*/
- ProcessParam lastParamByWorstationId(@Param("workstationId") Long workstationId);
+ ProcessParam lastParamByWorkstationId(@Param("workstationId") Long workstationId);
}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceOfflineCheckService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceOfflineCheckService.java
index 83dc80d..088b8d7 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceOfflineCheckService.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/DeviceOfflineCheckService.java
@@ -1,10 +1,22 @@
package com.qianwen.mdc.collect.service;
-import java.util.Arrays;
-import java.util.Date;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.Collections;
import java.util.Map;
import java.util.Set;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.google.common.collect.Sets;
+import com.qianwen.mdc.collect.cache.TimeSliceCache;
+import com.qianwen.mdc.collect.constants.CommonConstant;
+import com.qianwen.mdc.collect.dto.CacheBuildDTO;
+import com.qianwen.mdc.collect.dto.CalendarShiftTimeSlicesDTO;
+import com.qianwen.mdc.collect.mapper.iotdb.DeviceStateMapper;
+import com.qianwen.mdc.collect.utils.LocalDateTimeUtils;
+import com.xxl.job.core.log.XxlJobLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,9 +27,7 @@
import com.qianwen.mdc.collect.dto.WorkstationDTO;
import com.qianwen.mdc.collect.entity.iotdb.DeviceState;
import com.qianwen.mdc.collect.entity.iotdb.ProcessParam;
-import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum;
import com.qianwen.mdc.collect.mapper.iotdb.ProcessParamMapper;
-import com.qianwen.mdc.collect.vo.FactoryDataVO;
import cn.hutool.core.util.ObjectUtil;
/**
@@ -41,10 +51,13 @@
private ProcessParamMapper processParamMapper;
@Autowired
- private FactoryDataService factoryDataService;
+ private DeviceStateService deviceStateService;
+ @Autowired
+ private TimeSliceCache timeSliceCache;
+ @Autowired
+ private DeviceStateMapper deviceStateMapper;
/**
* 淇濆瓨鐘舵�佸浐瀹氱偣鏁版嵁(state_{workstationId})
- * @param workstationIdList
*/
public void checkOffline() {
//灏嗘暟鎹寜鐓у伐浣峣d鍒嗙粍
@@ -67,34 +80,109 @@
}
/**
* 妫�鏌ヤ竴涓伐浣嶆槸鍚︾绾匡紝绂荤嚎鍒欏~鍏呯绾跨姸鎬佹暟鎹�
- * @param workstationId
+ * @param workstationId 宸ヤ綅id
*/
public void handleWorkstationOffline(long workstationId) {
- ProcessParam lastParam = processParamMapper.lastParamByWorstationId(workstationId);
-
- long nowMills = System.currentTimeMillis();
- long onlineRange = nowMills - offlineConfigDuration;
+ long nowMills = System.currentTimeMillis();
+ long lastOnlineTime = nowMills - offlineConfigDuration;
+ /*
+ ProcessParam lastParam = processParamMapper.lastParamByWorkstationId(workstationId);
+
if(lastParam != null && lastParam.getTime()> onlineRange) {
//鏈夋暟鎹紝涓斿湪鍒ゅ畾鏃堕棿鍐�-銆嬪湪绾�
return;
- }
+ }*/
+ DeviceState lastState = deviceStateMapper.lastNoFixedState(workstationId);
+ if(lastState != null && lastState.getTime() > lastOnlineTime) {
+ //鏈夋暟鎹紝涓斿湪鍒ゅ畾鏃堕棿鍐�-銆嬪湪绾�
+ return;
+ }
//TODO 杩欓噷涓�鐩寸绾挎槸浠�涔堟暟鎹�
-
+
+ XxlJobLogger.log("绂荤嚎"+workstationId);
//鏃堕棿娈靛唴鏃犲弬鏁帮紝璇存槑璁惧娌¢噰闆嗘暟鎹垽瀹氫负绂荤嚎锛屾彃鍏ョ姸鎬侊紝鐒跺悗鍙戦�乺ealTime娑堟伅缁檓dc
-
+
+ //浣滀负瀹炴椂鏁版嵁鍙戦��
ProcessParam statusParam = new ProcessParam();
statusParam.setTime(nowMills);
statusParam.setN("DeviceStatus");
statusParam.setV(OFFLINE_VALUE);
statusParam.setWorkstationId(workstationId);
- if(lastParam == null || !lastParam.getN().equals("DeviceStatus")) {
+
+ //if(lastState == null || !lastParam.getN().equals("DeviceStatus")) {
+ if(lastState == null || lastState.getTime() <= lastOnlineTime) {
//涔嬪墠鏃犱换浣曢噰闆嗙殑鏁版嵁(鎴栬�呬笂涓�鏉′笉鏄姸鎬佹暟鎹�)锛屾柊鍔犱竴鏉$绾跨姸鎬佹暟鎹�
- paramService.insertProcessParam(statusParam);
+ //paramService.insertProcessParam(statusParam);
+
+ //鎻掑叆鐘舵�佽〃
+ DeviceState offLineState = new DeviceState();
+ offLineState.setTime(nowMills);
+
+ String calendarCode = workstationCache.getWorkstationCalendarCodeForDate(workstationId, DateUtil.formatDate(DateUtil.date(nowMills)));
+ offLineState.setCalendarCode(calendarCode);//111
+ this.fillCalendar(offLineState);
+
+ offLineState.setValueCollect(Integer.parseInt(OFFLINE_VALUE));
+ offLineState.setWcs(offLineState.getValueCollect());
+ offLineState.setWorkstationId(workstationId);
+ offLineState.setIsFixPoint(false);
+ offLineState.setIsDeleted(false);
+ offLineState.setIsSync(false);
+
+
+ deviceStateService.saveDeviceStates(Collections.singletonList(offLineState));
+ XxlJobLogger.log("淇濆瓨绂荤嚎鐘舵��"+workstationId);
}
//閫氱煡mdc鏇存柊瀹炴椂鐘舵��
paramService.sendRealtimeDataMsg(statusParam);
}
+
+ /**
+ * 濉厖鏁版嵁鏃ュ巻
+ * @param state 鐘舵�佸璞�
+ */
+ void fillCalendar(DeviceState state){
+ if (ObjectUtil.isEmpty(state.getCalendarCode())) {
+ state.setCalendarCode(CommonConstant.DEFAULT_CODE);
+ }
+
+ java.util.Date collectTime = new java.util.Date(state.getTime());
+
+ boolean isDefaultCalendar = true;
+ if (!CommonConstant.DEFAULT_CODE.equals(state.getCalendarCode())) {
+ CalendarShiftTimeSlicesDTO calendarShiftTimeSlicesDTO = timeSliceCache.getTimeSliceShift(state.getCalendarCode(), collectTime);//浠巖edis涓幏寰楁棩鍘嗙殑鏃堕棿鍒囩墖
+ if (ObjectUtil.isEmpty(calendarShiftTimeSlicesDTO)) {
+ LocalDate targetDate = Instant.ofEpochMilli(state.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate();
+ CacheBuildDTO cacheBuildDTO = CacheBuildDTO.builder().tenantIds(Sets.newHashSet(new String[]{"000000"})).calendarCode(state.getCalendarCode()).targetDate(targetDate).build();
+ timeSliceCache.build(cacheBuildDTO);
+ calendarShiftTimeSlicesDTO = timeSliceCache.getTimeSliceShift(state.getCalendarCode(), collectTime);
+ }
+
+ if (ObjectUtil.isNotEmpty(calendarShiftTimeSlicesDTO)) {
+ state.setShiftIndex(calendarShiftTimeSlicesDTO.getShiftIndex());
+ state.setShiftTimeType(Integer.valueOf(calendarShiftTimeSlicesDTO.getShiftTimeType()));
+ state.setFactoryDate(Integer.valueOf(calendarShiftTimeSlicesDTO.getFactoryDate().replaceAll("-", "")));
+ state.setFactoryWeek(calendarShiftTimeSlicesDTO.getFactoryWeek());
+ state.setFactoryMonth(calendarShiftTimeSlicesDTO.getFactoryMonth());
+ state.setFactoryYear(calendarShiftTimeSlicesDTO.getFactoryYear());
+ isDefaultCalendar = false;
+ }
+ }
+
+ //鏃犳棩鍘嗗垏鐗囷紝浣跨敤閲囬泦鏃堕棿濉厖factoryYear锛宮onth锛宒ate锛寃eek鍑犱釜灞炴��
+ if (isDefaultCalendar) {
+ log.info("绂荤嚎妫�鏌ユ棤鏃ュ巻鍒囩墖");
+ LocalDate localDate = Instant.ofEpochMilli(state.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate();
+ state.setFactoryDate(Integer.valueOf(DatePattern.PURE_DATE_FORMAT.format(collectTime)));
+ state.setFactoryYear(DateUtil.year(collectTime));
+ state.setFactoryWeek(LocalDateTimeUtils.getWeek(localDate));
+ state.setFactoryMonth(DateUtil.month(collectTime) + 1);
+ state.setShiftIndex(CommonConstant.DEFAULT_SHIFT_INDEX);
+ state.setShiftTimeType(CommonConstant.DEFAULT_SHIFT_TYPE);
+ }
+ }
+
}
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
index 31b7301..a8a67b7 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/IOTMqttReceiveService.java
@@ -31,7 +31,7 @@
/**
* 澶勭悊鏀跺埌鐨勬秷鎭�,瀵瑰簲TelemetryDataPostingConsumer
- * @param payload
+ * @param payload 鏁版嵁锛宩son鏍煎紡
*/
public void handle(String payload) {
//瑙f瀽娑堟伅
diff --git a/collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java b/collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java
index d53dc1f..d6c4986 100644
--- a/collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java
+++ b/collect/src/main/java/com/qianwen/mdc/collect/service/PackedDataService.java
@@ -126,13 +126,13 @@
//telemetryData.setCalendarCode(calendarCode);
} else {
//telemetryData.setCalendarCode("#default#");
- pdata.setCalendarCode("#default#");
+ pdata.setCalendarCode(CommonConstant.DEFAULT_CODE);
}
// TelemetryPropertyWrapper涓璸ackWorkstationCalendarInfo
//------------start
boolean isDefaultCalendar = true;
- if (!"#default#".equals(pdata.getCalendarCode())) {
+ if (!CommonConstant.DEFAULT_CODE.equals(pdata.getCalendarCode())) {
CalendarShiftTimeSlicesDTO calendarShiftTimeSlicesDTO = timeSliceCache.getTimeSliceShift(pdata.getCalendarCode(), collectTime);//浠巖edis涓幏寰楁棩鍘嗙殑鏃堕棿鍒囩墖
if (ObjectUtil.isEmpty(calendarShiftTimeSlicesDTO)) {//濡傛灉娌℃湁鏃堕棿鍒囩墖锛屽垯浣跨敤TimeSliceCache.build(cacheBuildDTO);鏋勫缓
LocalDate targetDate = Instant.ofEpochMilli(pdata.getTime()).atZone(ZoneOffset.systemDefault()).toLocalDate();
diff --git a/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.xml b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.xml
index 668b060..a24fd99 100644
--- a/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.xml
+++ b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/DeviceStateMapper.xml
@@ -188,7 +188,11 @@
select <include refid="all_columns" /> FROM root.f2.state_${workstationId}
where is_fix_point=true and is_deleted=false and time >= #{startTime} AND time <= #{endTime}
</select>
-
-
+ <select id="lastNoFixedState" resultType="com.qianwen.mdc.collect.entity.iotdb.DeviceState">
+ select <include refid="all_columns" /> FROM root.f2.state_${workstationId}
+ where is_fix_point=false and is_deleted=false order by time desc limit 1
+ </select>
+
+
</mapper>
diff --git a/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml
index cbe1a03..778a314 100644
--- a/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml
+++ b/collect/src/main/resources/com/qianwen/mdc/collect/mapper/iotdb/ProcessParamMapper.xml
@@ -12,7 +12,7 @@
</resultMap>
<!-- n,v,workstation_id -->
- <select id="lastParamByWorstationId" resultType="com.qianwen.mdc.collect.entity.iotdb.ProcessParam">
+ <select id="lastParamByWorkstationId" resultType="com.qianwen.mdc.collect.entity.iotdb.ProcessParam">
select n as n,v as v,workstation_id as workstationId from root.f2.process_param_${workstationId}_* order by time desc limit 1 align by device
</select>
--
Gitblit v1.9.3