Browse Source

获取灯控30天内的每天亮灯曲线图数据

zhj 9 months atrás
parent
commit
ed56ba87a0

+ 1 - 3
src/main/java/com/welampiot/controller/LampController.java

@@ -1846,9 +1846,7 @@ public class LampController {
         if (lampVO.getId() == null || lampVO.getId() == 0)
             return toolUtils.response(InterfaceResultEnum.LACK_PARAM_ERROR, version);
 
-        LampInfoLogDTO beforeDTO = lampInfoLogService.getBeforeTodayLampInfoLog(lampVO.getId());
-        int lightTime = beforeDTO == null ? 0 : beforeDTO.getWorkTimeTotal();
-        LampLogVO lampLogVO = lampInfoLogService.getNowDayLightTimeLogList(lampVO.getId(), lightTime);
+        LampLogVO lampLogVO = lampInfoLogService.getMonthLightTimeLogList(lampVO.getId());
         return toolUtils.response(InterfaceResultEnum.OPERATION_SUCCESS, version, lampLogVO);
     }
 }

+ 2 - 0
src/main/java/com/welampiot/dao/LampInfoLogDao.java

@@ -21,4 +21,6 @@ public interface LampInfoLogDao {
     LampInfoLogDTO getNowDayLampInfoLog(@Param("lampId") Integer lampId);
     LampInfoLogDTO getBeforeTodayLampInfoLog(@Param("lampId") Integer lampId);
     List<LampInfoLogDTO> getNowDayLampInfoLogList(@Param("lampId") Integer lampId);
+    List<LampInfoLogDTO> getMonthLampInfoLogList(@Param("lampId") Integer lampId);
+    LampInfoLogDTO getBeforeMonthLampInfoLog(@Param("lampId") Integer lampId);
 }

+ 1 - 0
src/main/java/com/welampiot/service/LampInfoLogService.java

@@ -20,4 +20,5 @@ public interface LampInfoLogService {
     LampInfoLogDTO getNowDayLampInfoLog(Integer lampId);
     LampInfoLogDTO getBeforeTodayLampInfoLog(Integer lampId);
     LampLogVO getNowDayLightTimeLogList(Integer lampId, Integer lastLightTime);
+    LampLogVO getMonthLightTimeLogList(Integer lampId);
 }

+ 52 - 0
src/main/java/com/welampiot/service/impl/LampInfoLogServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.DecimalFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -120,6 +121,57 @@ public class LampInfoLogServiceImpl implements LampInfoLogService {
         return lampLogVO;
     }
 
+    @Override
+    public LampLogVO getMonthLightTimeLogList(Integer lampId) {
+        LampInfoLogDTO beforeLog = lampInfoLogDao.getBeforeMonthLampInfoLog(lampId);
+        List<LampInfoLogDTO> logList = lampInfoLogDao.getMonthLampInfoLogList(lampId);
+
+        // 按时间分组,取每一天的最后一笔记录
+        Map<LocalDate, LampInfoLogDTO> logs = logList.stream()
+                .collect(Collectors.toMap(
+                        log -> parseLocalDate(log.getUpdateTime(), "yyyy-MM-dd HH:mm:ss"),
+                        log -> log,
+                        (existing, replacement) -> existing.getUpdateTime().compareTo(replacement.getUpdateTime()) > 0 ? existing : replacement
+                ));
+
+        // 初始化 dataList 和 dateList
+        List<Object> dataList = new ArrayList<>();
+        List<Object> dateList = new ArrayList<>();
+
+        String endDate = ToolUtils.getNowDate();
+        String startDate = ToolUtils.getNowDate(System.currentTimeMillis() - 29L * 24 * 3600 * 1000);
+        LocalDate first = parseLocalDate(startDate, "yyyy-MM-dd");
+        LocalDate end = parseLocalDate(endDate, "yyyy-MM-dd");
+
+
+        Integer lightTime = beforeLog == null ? 0 : beforeLog.getWorkTimeTotal();
+        DecimalFormat df = new DecimalFormat("0.##");
+        for (LocalDate date = first; !date.isAfter(end); date = date.plusDays(1)) {
+            LampInfoLogDTO current = logs.get(date);
+
+            if (current != null) {
+                int value = current.getWorkTimeTotal() - lightTime;
+                if (value < 0) value = current.getWorkTimeTotal();
+                dataList.add(df.format(value / 60.0));
+                lightTime = current.getWorkTimeTotal();
+            } else {
+                dataList.add("0");
+            }
+            String timeStr = date.toString();
+            dateList.add(timeStr);
+        }
+
+        LampLogVO lampLogVO = new LampLogVO();
+        lampLogVO.setDateList(dateList);
+        lampLogVO.setDataList(dataList);
+        return lampLogVO;
+    }
+
+    private static LocalDate parseLocalDate(String dateStr, String format) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
+        return LocalDate.parse(dateStr, formatter);
+    }
+
     private static LocalDateTime parseLocalDateTime(String dateStr) {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         return LocalDateTime.parse(dateStr, formatter).withMinute(0).withSecond(0);

+ 8 - 0
src/main/java/com/welampiot/utils/ToolUtils.java

@@ -2172,6 +2172,14 @@ System.out.println(res);
         return sdf.format(new Date());
     }
 
+    /**
+     * 获取当前日期
+     */
+    public static String getNowDate(long l) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(l);
+    }
+
     public static int getSeq() {
         Random random = new Random();
         int min = 1;

+ 23 - 0
src/main/resources/mapper/LampInfoLogMapper.xml

@@ -184,4 +184,27 @@
         ORDER BY l.updatetime
     </select>
 
+<!--  获取某灯控最近三十天内的数据  -->
+    <select id="getMonthLampInfoLogList" resultType="LampInfoLogDTO">
+        SELECT l.work_time_total AS workTimeTotal,
+               DATE_ADD( l.updatetime, INTERVAL 8 HOUR ) AS updateTime
+        FROM lamp_info_log l
+        WHERE l.lampid = #{lampId}
+          AND DATE(DATE_ADD( l.updatetime, INTERVAL 8 HOUR ))
+        BETWEEN DATE_SUB( CURDATE(), INTERVAL 29 DAY ) AND CURDATE()
+        ORDER BY l.updatetime
+    </select>
+
+    <!--  获取某灯控最近三十天之前的最新一条数据  -->
+    <select id="getBeforeMonthLampInfoLog" resultType="LampInfoLogDTO">
+        SELECT l.work_time_total AS workTimeTotal,
+               DATE_ADD( l.updatetime, INTERVAL 8 HOUR ) AS updateTime
+        FROM lamp_info_log l
+        WHERE l.lampid = #{lampId}
+          AND DATE(DATE_ADD( l.updatetime, INTERVAL 8 HOUR ))
+            <![CDATA[ < ]]> DATE_SUB( CURDATE(), INTERVAL 29 DAY )
+        ORDER BY l.updatetime DESC
+        LIMIT 1
+    </select>
+
 </mapper>