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 &gt;= #{startTime} AND time &lt;= #{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