From 7b269be1ccc6c738b4ffe9416004e09c6fd8e9c6 Mon Sep 17 00:00:00 2001
From: whyclxw <810412026@qq.com>
Date: 星期六, 15 六月 2024 15:38:56 +0800
Subject: [PATCH] 电池告警历史实时

---
 src/main/java/com/whyc/mapper/BattAlarmHisMapper.java      |    6 
 src/main/java/com/whyc/service/SubTableService.java        |   64 +++
 src/main/java/com/whyc/pojo/BattAlarm.java                 |    2 
 src/main/java/com/whyc/service/BattAlarmHisService.java    |   26 +
 src/main/java/com/whyc/pojo/BattAlarmHis.java              |   20 
 src/main/java/com/whyc/util/MathUtil.java                  |  303 ++++++++++++++
 src/main/java/com/whyc/util/DateUtil.java                  |  664 +++++++++++++++++++++++++++++++
 src/main/java/com/whyc/controller/BattAlarmController.java |   14 
 src/main/java/com/whyc/util/SubTablePageInfoUtil.java      |  148 +++++++
 9 files changed, 1,244 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/whyc/controller/BattAlarmController.java b/src/main/java/com/whyc/controller/BattAlarmController.java
index 13f17ba..9741443 100644
--- a/src/main/java/com/whyc/controller/BattAlarmController.java
+++ b/src/main/java/com/whyc/controller/BattAlarmController.java
@@ -1,6 +1,7 @@
 package com.whyc.controller;
 
 import com.whyc.dto.Response;
+import com.whyc.service.BattAlarmHisService;
 import com.whyc.service.BattAlarmService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -10,6 +11,8 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.text.ParseException;
+
 
 @RestController
 @Api(tags = "鐢垫睜瀹炴椂鍛婅")
@@ -17,6 +20,9 @@
 public class BattAlarmController {
     @Autowired
     private BattAlarmService service;
+
+    @Autowired
+    private BattAlarmHisService hisService;
 
     @ApiOperation("鏌ヨ鐢垫睜鍛婅")
     @GetMapping("getBattAlarm")
@@ -38,4 +44,12 @@
         Response res=service.cancleAlarm(num);
         return res;
     }
+
+    @ApiOperation("鏌ヨ鐢垫睜缁勫巻鍙叉椂闂村憡璀�")
+    @GetMapping("getHisAlatm")
+    public Response getHisAlatm(@RequestParam int binfId,@RequestParam String startTime,@RequestParam String endTime
+            , @RequestParam int pageNum, @RequestParam int pageSize) throws ParseException, InterruptedException {
+        Response res=hisService.getHisAlatm(binfId,startTime,endTime,pageNum,pageSize);
+        return res;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BattAlarmHisMapper.java b/src/main/java/com/whyc/mapper/BattAlarmHisMapper.java
new file mode 100644
index 0000000..7e30d2c
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BattAlarmHisMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.BattAlarmHis;
+
+public interface BattAlarmHisMapper extends CustomMapper<BattAlarmHis>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/pojo/BattAlarm.java b/src/main/java/com/whyc/pojo/BattAlarm.java
index 614fa83..3a9e0cc 100644
--- a/src/main/java/com/whyc/pojo/BattAlarm.java
+++ b/src/main/java/com/whyc/pojo/BattAlarm.java
@@ -24,7 +24,7 @@
 
     @TableField("binf_id")
     @ApiModelProperty("鐢垫睜缁刬d")
-    private String binfId;
+    private Integer binfId;
 
     @TableField("alm_start_time")
     @ApiModelProperty("鍛婅寮�濮嬫椂闂�")
diff --git a/src/main/java/com/whyc/pojo/BattAlarmHis.java b/src/main/java/com/whyc/pojo/BattAlarmHis.java
index fc2ef64..cdc7702 100644
--- a/src/main/java/com/whyc/pojo/BattAlarmHis.java
+++ b/src/main/java/com/whyc/pojo/BattAlarmHis.java
@@ -22,13 +22,13 @@
 
     @TableField("binf_id")
     @ApiModelProperty("鐢垫睜缁刬d")
-    private String binfId;
+    private Integer binfId;
 
     @TableField("alm_start_time")
     @ApiModelProperty("鍛婅寮�濮嬫椂闂�")
     private Date almStartTime;
     @TableField("alm_end_time")
-    @ApiModelProperty("鍛婅寮�濮嬫椂闂�")
+    @ApiModelProperty("鍛婅缁撴潫鏃堕棿")
     private Date almEndTime;
 
     @TableField("mon_num")
@@ -43,8 +43,24 @@
     @ApiModelProperty("鍛婅绛夌骇")
     private Integer almLevel;
 
+    @TableField("alm_value")
+    @ApiModelProperty("鍛婅鍊�")
+    private Float almValue;
+
 
     @TableField(exist = false)
     @ApiModelProperty("鐢垫睜缁勫悕绉�")
     private String binfName;
+
+    @TableField(exist = false)
+    @ApiModelProperty("琛ㄥ悕瀛楁嫾鎺�")
+    private String recordYear;
+
+    @TableField(exist = false)
+    @ApiModelProperty("鍒嗛〉寮�濮嬩綅缃�")
+    private Integer limitStart;
+
+    @TableField(exist = false)
+    @ApiModelProperty("鍒嗛〉缁撴潫浣嶇疆")
+    private Integer limitEnd;
 }
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BattAlarmHisService.java b/src/main/java/com/whyc/service/BattAlarmHisService.java
new file mode 100644
index 0000000..2bf2bce
--- /dev/null
+++ b/src/main/java/com/whyc/service/BattAlarmHisService.java
@@ -0,0 +1,26 @@
+package com.whyc.service;
+
+import com.github.pagehelper.PageInfo;
+import com.whyc.dto.Response;
+import com.whyc.pojo.BattAlarmHis;
+import com.whyc.util.SubTablePageInfoUtil;
+import com.whyc.util.ThreadLocalUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+
+@Service
+public class BattAlarmHisService {
+    @Autowired
+    private SubTablePageInfoUtil util;
+
+    //鏌ヨ鐢垫睜缁勫巻鍙叉椂闂村憡璀�
+    public Response getHisAlatm(int binfId, String startTime, String endTime,int pageNum,int pageSize)throws ParseException, InterruptedException  {
+        BattAlarmHis his=new BattAlarmHis();
+        his.setBinfId(binfId);
+        PageInfo pageInfo=util.getPageInfoByMonthTable(pageNum,pageSize, ThreadLocalUtil.parse(startTime,1),ThreadLocalUtil.parse(endTime,1)
+        ,"db_alarm","batt_alarm",his);
+        return new Response().setII(1,pageInfo.getList()!=null,pageInfo,"鏌ヨ鐢垫睜缁勫巻鍙叉椂闂村憡璀�");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/SubTableService.java b/src/main/java/com/whyc/service/SubTableService.java
index 61a33c3..6f2d1e2 100644
--- a/src/main/java/com/whyc/service/SubTableService.java
+++ b/src/main/java/com/whyc/service/SubTableService.java
@@ -1,13 +1,16 @@
 package com.whyc.service;
 
 import com.whyc.mapper.CallBack;
+import com.whyc.pojo.BattAlarmHis;
 import com.whyc.pojo.BattTestInfData;
+import com.whyc.util.ThreadLocalUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 @Service
@@ -48,4 +51,65 @@
         });
         return list;
     }
+    //鍛婅鍘嗗彶瀹炴椂璁$畻姣忓紶琛ㄦ煡璇㈡�绘暟
+    public int getBattHisCount(BattAlarmHis battAlarmHis) {
+        String sql="SELECT  count(*) as number FROM db_alarm."+battAlarmHis.getRecordYear()+" history " +
+                " where history.binf_id="+battAlarmHis.getBinfId() ;
+        if(battAlarmHis.getAlmStartTime()!=null){
+            sql+=" and alm_start_time  >='"+ ThreadLocalUtil.format(battAlarmHis.getAlmStartTime(),1)+"' ";
+        }
+        if(battAlarmHis.getAlmEndTime()!=null){
+            sql+=" and alm_start_time  <='"+ThreadLocalUtil.format(battAlarmHis.getAlmEndTime(),1)+"' ";
+        }
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                LinkedList<Object> temp = new LinkedList<>();
+                try {
+                    while (rs.next())
+                        temp.add(rs.getInt("number"));
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+                return temp;
+            }
+        });
+        int num =0;
+        if(list!=null){
+            num= (int) list.get(0);
+        }
+        return num;
+    }
+    //鍛婅鍘嗗彶瀹炴椂
+    public List<BattAlarmHis> getBattHisList(BattAlarmHis battAlarmHis) {
+        String sql="SELECT * FROM db_alarm."+battAlarmHis.getRecordYear()+" history " +
+                " where history.binf_id="+battAlarmHis.getBinfId() ;
+        if(battAlarmHis.getAlmStartTime()!=null){
+            sql+=" and alm_start_time  >='"+ ThreadLocalUtil.format(battAlarmHis.getAlmStartTime(),1)+"' ";
+        }
+        if(battAlarmHis.getAlmEndTime()!=null){
+            sql+=" and alm_start_time  <='"+ThreadLocalUtil.format(battAlarmHis.getAlmEndTime(),1)+"' ";
+        }
+        sql+="  ORDER BY alm_start_time asc  limit "+battAlarmHis.getLimitStart()+","+battAlarmHis.getLimitEnd()+" ";
+        List<BattAlarmHis> list=sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                List list=new ArrayList();
+                while (rs.next()){
+                    BattAlarmHis data=new BattAlarmHis();
+                    data.setNum(rs.getInt("num"));
+                    data.setBinfId(rs.getInt("binf_id"));
+                    data.setAlmStartTime(rs.getTimestamp("alm_start_time"));
+                    data.setAlmEndTime(rs.getTimestamp("alm_end_time"));
+                    data.setMonNum(rs.getInt("mon_num"));
+                    data.setAlmId(rs.getInt("alm_id"));
+                    data.setAlmLevel(rs.getInt("alm_level"));
+                    data.setAlmValue(rs.getFloat("alm_value"));
+                    list.add(data);
+                }
+                return list;
+            }
+        });
+        return list;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/whyc/util/DateUtil.java b/src/main/java/com/whyc/util/DateUtil.java
new file mode 100644
index 0000000..aef26cb
--- /dev/null
+++ b/src/main/java/com/whyc/util/DateUtil.java
@@ -0,0 +1,664 @@
+package com.whyc.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Description : 鏃堕棿宸ュ叿绫�
+ * @date 2020/10/15
+ **/
+public class DateUtil {
+
+    public static SimpleDateFormat YYYY_MM_DD_HH_MM_SS=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    public static SimpleDateFormat YYYY_MM_DD_HH_MM_SS_UNION=new SimpleDateFormat("yyyyMMddHHmmss");
+	public static SimpleDateFormat YYYY_MM_DD=new SimpleDateFormat("yyyy-MM-dd");
+	public static SimpleDateFormat YYYY_MM=new SimpleDateFormat("yyyy-MM");
+	public static SimpleDateFormat YYYY_MM_TABLE=new SimpleDateFormat("yyyy_MM");
+
+	public static int compare(String date1Str,String date2Str) throws ParseException {
+        Date date1 = YYYY_MM_DD_HH_MM_SS.parse(date1Str);
+        Date date2 = YYYY_MM_DD_HH_MM_SS.parse(date2Str);
+        if(date1.compareTo(date2)>0){
+            return 1;
+        }else if(date1.compareTo(date2) == 0){
+            return 0;
+        }else{
+            return -1;
+        }
+    }
+
+    public static Date getMaxTime(String date1Str,String date2Str,String date3Str) {
+	    try {
+            Date date1 = YYYY_MM_DD_HH_MM_SS.parse(date1Str);
+            Date date2 = YYYY_MM_DD_HH_MM_SS.parse(date2Str);
+            Date date3 = YYYY_MM_DD_HH_MM_SS.parse(date3Str);
+
+            Date maxTime = date1;
+            if (maxTime.compareTo(date2) < 0) {
+                maxTime = date2;
+            }
+            if (maxTime.compareTo(date3) < 0) {
+                maxTime = date3;
+            }
+            return maxTime;
+        }catch (ParseException e){
+	        return null;
+        }
+    }
+
+    public static List<List<Date>> getMonthTime(Date startTimeDate,Date endTimeDate) throws ParseException {
+        List<List<Date>> timeList = new LinkedList<>();
+
+        Calendar startTimeCalendar = Calendar.getInstance();
+        startTimeCalendar.setTime(startTimeDate);
+
+        Calendar endTimeCalendar = Calendar.getInstance();
+        endTimeCalendar.setTime(endTimeDate);
+
+        //鎸夋湀浠藉垏鍒嗘椂娈�
+        int startY = startTimeCalendar.get(Calendar.YEAR);
+        int startM = startTimeCalendar.get(Calendar.MONTH)+1;
+
+        int endY = endTimeCalendar.get(Calendar.YEAR);
+        int endM = endTimeCalendar.get(Calendar.MONTH)+1;
+
+       int Y = endY - startY;
+       int len = Y*12+(endM-startM)+1;
+
+        Calendar dateTemp = Calendar.getInstance();
+        for (int i = 0; i < len; i++) {
+            List<Date> SEList = new LinkedList<>();
+            //dateTemp.setTime(YYYY_MM_DD_HH_MM_SS.parse(startY+"-"+startM+"-01 00:00:00"));
+            dateTemp.setTime(ThreadLocalUtil.parse(startY+"-"+startM+"-01 00:00:00",1));
+            Date recordTime,recordTime1;
+
+            dateTemp.add(Calendar.MONTH,i);
+            recordTime = dateTemp.getTime();
+
+            int lastDay = dateTemp.getActualMaximum(Calendar.DAY_OF_MONTH);
+            dateTemp.set(Calendar.DAY_OF_MONTH,lastDay);
+            dateTemp.set(Calendar.HOUR_OF_DAY,23);
+            dateTemp.set(Calendar.MINUTE,59);
+            dateTemp.set(Calendar.SECOND,59);
+            recordTime1 = dateTemp.getTime();
+
+            if(i==0){
+                recordTime = startTimeDate;
+            }
+            if(i==len-1){
+                recordTime1 = endTimeDate;
+            }
+            SEList.add(recordTime);
+            SEList.add(recordTime1);
+
+            timeList.add(SEList);
+        }
+        return timeList;
+    }
+
+    /**
+     * 鍦ㄥ垎琛ㄧ殑鎯呭喌涓嬩娇鐢�,鎸夊勾鍒嗚〃,鏌ヨ闇�瑕佸垏鍓叉煡璇娇鐢�
+     * <p>
+     * 鏍规嵁浼犲叆鐨勮捣姝㈡椂闂�,鎸夌収骞村垏鍓叉垚涓嶅悓鏃堕棿娈�
+     *
+     * @param startTime 2021-01-01 10:00:00
+     * @param endTime   2023-05-01 10:10:10
+     * @return 绀轰緥[2021, 2022, 2023]
+     * 浣跨敤鏂规硶:
+     * 鏍规嵁杩斿洖鐨勭涓�涓暟鎹�,濡傛灉瀛樺湪琛�,鍒欐煡璇㈢瓫閫夋潯浠朵负>=杈撳叆鐨勮捣濮嬫椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勮捣濮嬫椂闂�
+     * 鏍规嵁杩斿洖鐨勬渶鍚庝釜鏁版嵁,濡傛灉琛ㄥ瓨鍦�,鍒欐煡璇㈢瓫閫夋潯浠朵负<=杈撳叆鐨勭粓姝㈡椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勭粓姝㈡椂闂�
+     * 杩斿洖鐨勯潪绗竴鏈�鍚庢暟鎹�,鏌ヨ鍏ㄨ〃
+     */
+    public static Map<String,List<Date>> getYearList(Date startTime,Date endTime) throws ParseException {
+        Map<String,List<Date>> result = new LinkedHashMap<>();
+        Calendar startTimeC = Calendar.getInstance();
+        startTimeC.setTime(startTime);
+        int startYear = startTimeC.get(Calendar.YEAR);
+
+        Calendar endTimeC = Calendar.getInstance();
+        endTimeC.setTime(endTime);
+        int endYear = endTimeC.get(Calendar.YEAR);
+        int yearSize = endYear - startYear + 1;
+        for (int i = startYear; i <= endYear; i++) {
+            List<Date> dateList = new LinkedList<>();
+            if(yearSize == 1){ //璧锋鏃堕棿娌℃湁璺ㄥ勾
+                dateList.add(startTime);
+                dateList.add(endTime);
+            }
+            else if(i==startYear){ //绗竴骞�
+                dateList.add(startTime);
+
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMaximum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+            }
+            else if(i== endYear){ //灏惧勾
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                dateList.add(endTime);
+            }else{
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                Calendar instance2 = Calendar.getInstance();
+                instance2.set(Calendar.YEAR,i);
+                instance2.set(Calendar.MONTH,instance2.getActualMaximum(Calendar.MONTH));
+                instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE));
+                instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance2.getTime());
+
+            }
+            result.put(String.valueOf(i),dateList);
+        }
+        return result;
+    }
+
+    /**
+     *
+     * 鍦ㄥ垎琛ㄧ殑鎯呭喌涓嬩娇鐢�,鎸夋湀鍒嗚〃,鏌ヨ闇�瑕佸垏鍓叉煡璇娇鐢�
+     *
+     * 鏍规嵁浼犲叆鐨勮捣姝㈡椂闂�,鎸夌収鏈堝垏鍓叉垚涓嶅悓鏃堕棿娈�
+     * @param startTimeStr 2022-11-01 10:00:00
+     * @param endTimeStr 2023-05-01 10:10:10
+     * @return  绀轰緥[2022_12,2023_1,2023_2,2023_3,2023_4,2023_5] TODO 杩欎釜杩斿洖瀵硅薄鏍煎紡 闇�瑕佹牴鎹笟鍔¢渶瑕佽繘琛岃皟鏁�
+     * 浣跨敤鏂规硶:
+     *   鏍规嵁杩斿洖鐨勭涓�涓暟鎹�,濡傛灉瀛樺湪琛�,鍒欐煡璇㈢瓫閫夋潯浠朵负>=杈撳叆鐨勮捣濮嬫椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勮捣濮嬫椂闂�
+     *   鏍规嵁杩斿洖鐨勬渶鍚庝釜鏁版嵁,濡傛灉琛ㄥ瓨鍦�,鍒欐煡璇㈢瓫閫夋潯浠朵负<=杈撳叆鐨勭粓姝㈡椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勭粓姝㈡椂闂�
+     *   杩斿洖鐨勯潪绗竴鏈�鍚庢暟鎹�,鏌ヨ鍏ㄨ〃
+     *
+     */
+    public static List<String> getMonthList(String startTimeStr,String endTimeStr) throws ParseException {
+        Calendar startTimeCalendar = Calendar.getInstance();
+        //Date startTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(startTimeStr);
+        Date startTime = ThreadLocalUtil.parse(startTimeStr,1);
+        startTimeCalendar.setTime(startTime);
+
+        Calendar endTimeCalendar = Calendar.getInstance();
+        //Date endTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(endTimeStr);
+        Date endTime = ThreadLocalUtil.parse(endTimeStr,1);
+        endTimeCalendar.setTime(endTime);
+
+        /*String[] startTimeSplit = startTimeStr.split("-");
+        int startYear = Integer.parseInt(startTimeSplit[0]);
+        int startMonth = Integer.parseInt(startTimeSplit[1]);
+
+        String[] endTimeSplit = endTimeStr.split("-");
+        int endYear = Integer.parseInt(endTimeSplit[0]);
+        int endMonth = Integer.parseInt(endTimeSplit[1]);*/
+
+        List<String> yearMonthList = new LinkedList<>();
+        while (!startTimeCalendar.after(endTimeCalendar)){ //璧峰鏃堕棿澶т簬缁堟鏃堕棿鍒欏仠姝�
+            yearMonthList.add(startTimeCalendar.get(Calendar.YEAR)+"_"+(startTimeCalendar.get(Calendar.MONTH)+1));
+            startTimeCalendar.add(Calendar.MONTH,1);
+        }
+        return yearMonthList;
+    }
+
+    /**
+     *  鏌ヨ浣跨敤鏃�,闇�瑕佸鐞� 榛樿琛ㄦ煡璇㈢殑闂
+     *  绀轰緥:
+     *  <p>
+     * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]}
+     * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]}
+     * {2022=[Sat Jan 01 00:00:00 CST 2022, Tue Nov 29 09:12:22 CST 2022]}
+     * 鎴�
+     * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]}
+     * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]}
+     * {2022=[Sat Jan 01 00:00:00 CST 2022, Thu Dec 29 09:12:22 CST 2022]}
+     * {default=[Wed Dec 14 15:27:13 CST 2022, Thu Dec 29 09:12:22 CST 2022]}
+     * </p>
+     * key涓烘暟瀛�,琛ㄧず骞村害鍒嗚〃;default涓洪粯璁よ〃
+     * @param startTimeDate 璧峰鏃堕棿
+     * @param endTimeDate 缁堟鏃堕棿
+     * @return 闇�瑕佹煡璇㈢殑琛ㄥ強鏌ヨ鏃堕棿
+     * @throws ParseException
+     */
+    public static Map<String,List<Date>> getQueryTimeForSubTables(Date startTimeDate,Date endTimeDate) throws ParseException {
+        //鏍规嵁绛涢�夌殑鏃堕棿娈�,鏌ヨ鍑虹鍚堣姹傜殑鍚勫垎琛ㄨ褰曟暟
+        //棣栧厛,濡傛灉褰撳墠鏃堕棿瓒呰繃7鏈�,榛樿琛ㄤ腑鍙湁鏈勾搴︾殑;濡傛灉娌¤秴杩�7鏈�,榛樿琛ㄨ繕瀛樺湪涓婁竴骞村害鐨勮褰�
+        Calendar instance = Calendar.getInstance();
+        if(endTimeDate.compareTo(instance.getTime())>0){ //鏍¢獙浼樺寲鏈�澶ф煡璇㈡椂闂�
+            endTimeDate = instance.getTime();
+        }
+        int nowYear = instance.get(Calendar.YEAR);
+        instance.add(Calendar.MONTH,-6);
+        int beforeYear = instance.get(Calendar.YEAR);
+        Date beforeYearTime = instance.getTime();
+        instance.setTime(endTimeDate);
+        int endTimeYear = instance.get(Calendar.YEAR);
+
+        Calendar startTime = Calendar.getInstance();
+        startTime.setTime(startTimeDate);
+
+        Map<String,List<Date>> yearTimeMap = DateUtil.getYearList(startTimeDate, endTimeDate);;
+        if(nowYear == beforeYear){ //榛樿琛ㄥ彧鏈夋湰骞村害鐨�(瓒呰繃浜嗗崐骞�,榛樿琛ㄨ褰曞叏閮ㄥ彧鏈夋湰骞村害鐨�,鍚屾椂浼氱敓鎴愪簡褰撳墠骞村害鐨勫垎琛�)
+            //濡傛灉鏌ヨ鏃堕棿鑼冨洿鍖呭惈褰撳墠骞村害,鍒欓渶瑕佹煡璇㈤粯璁よ〃
+            if(startTime.get(Calendar.YEAR) >= nowYear && endTimeYear <= nowYear){
+                //寮�濮嬫椂闂磋缃勾搴﹀垵濮嬫椂闂�
+                Calendar defaultTableStartTime = Calendar.getInstance();
+                defaultTableStartTime.set(Calendar.YEAR,nowYear);
+                defaultTableStartTime.set(Calendar.MONTH,defaultTableStartTime.getActualMinimum(Calendar.MONTH));
+                defaultTableStartTime.set(Calendar.DAY_OF_MONTH,defaultTableStartTime.getActualMinimum(Calendar.DAY_OF_MONTH));
+                defaultTableStartTime.set(Calendar.HOUR_OF_DAY,defaultTableStartTime.getActualMinimum(Calendar.HOUR_OF_DAY));
+                defaultTableStartTime.set(Calendar.MINUTE,defaultTableStartTime.getActualMinimum(Calendar.MINUTE));
+                defaultTableStartTime.set(Calendar.SECOND,defaultTableStartTime.getActualMinimum(Calendar.SECOND));
+                //缁堟鏃堕棿璁剧疆涓哄綋鍓嶆椂闂�
+                List<Date> defaultDateList = new LinkedList<>();
+                defaultDateList.add(defaultTableStartTime.getTime());
+                defaultDateList.add(endTimeDate);
+
+                yearTimeMap.put("default",defaultDateList);
+
+            }
+
+        }else{ //鏌ヨ鏃堕棿鑼冨洿涓嶅湪褰撳墠骞村害
+            //榛樿琛ㄤ腑瀛樺湪涓婁竴骞村害鐨勮褰�.涓婁竴骞寸殑鏈�鏃╂椂闂翠负beforeYearTime-涓婁竴骞寸殑骞存湯
+            //鍒ゆ柇鏌ヨ鏃堕棿鑼冨洿鏄惁鍖呭惈榛樿琛ㄤ腑涓婁竴骞村害鐨勬椂闂�
+            if(instance.getTime().compareTo(beforeYearTime)>0){ //鏌ヨ鏃堕棿澶т簬榛樿琛ㄤ腑涓婁竴骞村害鏃堕棿,璇存槑鏌ヨ璁板綍涔熷寘鍚湪榛樿琛ㄤ腑
+                //璧峰鏃堕棿
+                //缁堟鏃堕棿
+                List<Date> defaultDateList = new LinkedList<>();
+                defaultDateList.add(beforeYearTime);
+                defaultDateList.add(endTimeDate);
+
+                yearTimeMap.put("default",defaultDateList);
+            }
+        }
+        return yearTimeMap;
+    }
+
+    /**
+     * 鍦ㄥ垎琛ㄧ殑鎯呭喌涓嬩娇鐢�,鎸夊勾鍒嗚〃,鏌ヨ闇�瑕佸垏鍓叉煡璇娇鐢� 鏃堕棿鍊掑簭
+     * <p>
+     * 鏍规嵁浼犲叆鐨勮捣姝㈡椂闂�,鎸夌収骞村垏鍓叉垚涓嶅悓鏃堕棿娈�
+     *
+     * @param startTime 2021-01-01 10:00:00
+     * @param endTime   2023-05-01 10:10:10
+     * @return 绀轰緥
+     * 浣跨敤鏂规硶:
+     * 鏍规嵁杩斿洖鐨勭涓�涓暟鎹�,濡傛灉瀛樺湪琛�,鍒欐煡璇㈢瓫閫夋潯浠朵负>=杈撳叆鐨勮捣濮嬫椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勮捣濮嬫椂闂�
+     * 鏍规嵁杩斿洖鐨勬渶鍚庝釜鏁版嵁,濡傛灉琛ㄥ瓨鍦�,鍒欐煡璇㈢瓫閫夋潯浠朵负<=杈撳叆鐨勭粓姝㈡椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勭粓姝㈡椂闂�
+     * 杩斿洖鐨勯潪绗竴鏈�鍚庢暟鎹�,鏌ヨ鍏ㄨ〃
+     */
+    public static Map<String,List<Date>> getYearListDesc(Date startTime,Date endTime) throws ParseException {
+        Map<String,List<Date>> result = new LinkedHashMap<>();
+        Calendar startTimeC = Calendar.getInstance();
+        startTimeC.setTime(startTime);
+        int startYear = startTimeC.get(Calendar.YEAR);
+
+        Calendar endTimeC = Calendar.getInstance();
+        endTimeC.setTime(endTime);
+        int endYear = endTimeC.get(Calendar.YEAR);
+        int yearSize = endYear - startYear + 1;
+        for (int i = endYear; i >= startYear; i--) {
+            List<Date> dateList = new LinkedList<>();
+            if(yearSize == 1){ //璧锋鏃堕棿娌℃湁璺ㄥ勾
+                dateList.add(startTime);
+                dateList.add(endTime);
+            }
+            else if(i==startYear){ //绗竴骞�
+                dateList.add(startTime);
+
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMaximum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+            }
+            else if(i== endYear){ //灏惧勾
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                dateList.add(endTime);
+            }else{
+                Calendar instance = Calendar.getInstance();
+                instance.set(Calendar.YEAR,i);
+                instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH));
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                Calendar instance2 = Calendar.getInstance();
+                instance2.set(Calendar.YEAR,i);
+                instance2.set(Calendar.MONTH,instance2.getActualMaximum(Calendar.MONTH));
+                instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE));
+                instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance2.getTime());
+
+            }
+            result.put(String.valueOf(i),dateList);
+        }
+        return result;
+    }
+
+    /**
+     * 鍦ㄥ垎琛ㄧ殑鎯呭喌涓嬩娇鐢�,鎸夋湀鍒嗚〃,鏌ヨ闇�瑕佸垏鍓叉煡璇娇鐢� 鏃堕棿鍊掑簭
+     * <p>
+     * 鏍规嵁浼犲叆鐨勮捣姝㈡椂闂�,鎸夌収骞村垏鍓叉垚涓嶅悓鏃堕棿娈�
+     *
+     * @param startTime 2023-01-01 10:00:00
+     * @param endTime   2023-05-01 10:10:10
+     * @return 绀轰緥
+     * {
+     *  2023_04=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]
+     *  2023_03=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021],
+     *  2023_02=[Sat Jan 01 00:00:00 CST 2022, Sat Dec 31 23:59:59 CST 2022],
+     *  2023_01=[Sun Jan 01 00:00:00 CST 2023, Tue Jan 24 16:45:22 CST 2023],
+     *
+     * }
+     * 浣跨敤鏂规硶:
+     * 鏍规嵁杩斿洖鐨勭涓�涓暟鎹�,濡傛灉瀛樺湪琛�,鍒欐煡璇㈢瓫閫夋潯浠朵负>=杈撳叆鐨勮捣濮嬫椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勮捣濮嬫椂闂�
+     * 鏍规嵁杩斿洖鐨勬渶鍚庝釜鏁版嵁,濡傛灉琛ㄥ瓨鍦�,鍒欐煡璇㈢瓫閫夋潯浠朵负<=杈撳叆鐨勭粓姝㈡椂闂�;涓嶅瓨鍦ㄥ垯寮冪敤杈撳叆鐨勭粓姝㈡椂闂�
+     * 杩斿洖鐨勯潪绗竴鏈�鍚庢暟鎹�,鏌ヨ鍏ㄨ〃
+     */
+    public static Map<String,List<Date>> getMonthListDesc(Date startTime,Date endTime) throws ParseException {
+        Map<String,List<Date>> result = new LinkedHashMap<>();
+        Calendar startTimeC = Calendar.getInstance();
+        startTimeC.setTime(startTime);
+        int startYear = startTimeC.get(Calendar.YEAR);
+        int startMonth = startTimeC.get(Calendar.MONTH);
+
+        Calendar endTimeC = Calendar.getInstance();
+        endTimeC.setTime(endTime);
+        int endYear = endTimeC.get(Calendar.YEAR);
+        int endMonth = endTimeC.get(Calendar.MONTH);
+
+        //鐩稿樊鐨勬湀浠�
+        int monthCount = endYear*12+endMonth-(startYear*12+startMonth);
+
+        for (int i = monthCount; i >= 0; i--) {
+            List<Date> dateList = new LinkedList<>();
+            if(monthCount == 0 ){ //璧锋鏃堕棿娌℃湁璺ㄦ湀
+                dateList.add(startTime);
+                dateList.add(endTime);
+            }
+            else if(i==0){ //绗竴鏈�
+                dateList.add(startTime);
+
+                Calendar instance = Calendar.getInstance();
+                instance.setTime(startTime);
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+            }
+            else if(i== monthCount){ //灏炬湀
+                Calendar instance = Calendar.getInstance();
+                instance.setTime(endTime);
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                dateList.add(endTime);
+            }else{
+                Calendar instance = Calendar.getInstance();
+                instance.setTime(startTime);
+                instance.add(Calendar.MONTH,i);
+                instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH));
+                instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY));
+                instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE));
+                instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND));
+                dateList.add(instance.getTime());
+
+                Calendar instance2 = Calendar.getInstance();
+                instance2.setTime(startTime);
+                instance2.add(Calendar.MONTH,i);
+                instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH));
+                instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY));
+                instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE));
+                instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND));
+                dateList.add(instance2.getTime());
+
+            }
+            //result.put(DateUtil.YYYY_MM_TABLE.format(dateList.get(0)),dateList);
+            result.put(ThreadLocalUtil.format(dateList.get(0),2),dateList);
+        }
+        return result;
+    }
+
+    /**
+     *  鏌ヨ浣跨敤鏃�,闇�瑕佸鐞� 榛樿琛ㄦ煡璇㈢殑闂 鍊掑簭
+     *  绀轰緥:
+     *  <p>
+     * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]}
+     * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]}
+     * {2022=[Sat Jan 01 00:00:00 CST 2022, Tue Nov 29 09:12:22 CST 2022]}
+     * 鎴�
+     * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]}
+     * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]}
+     * {2022=[Sat Jan 01 00:00:00 CST 2022, Thu Dec 29 09:12:22 CST 2022]}
+     * {default=[Wed Dec 14 15:27:13 CST 2022, Thu Dec 29 09:12:22 CST 2022]}
+     * </p>
+     * key涓烘暟瀛�,琛ㄧず骞村害鍒嗚〃;default涓洪粯璁よ〃
+     * @param startTimeDate 璧峰鏃堕棿
+     * @param endTimeDate 缁堟鏃堕棿
+     * @return 闇�瑕佹煡璇㈢殑琛ㄥ強鏌ヨ鏃堕棿
+     * @throws ParseException
+     */
+    public static Map<String,List<Date>> getQueryTimeForSubTablesDesc(Date startTimeDate,Date endTimeDate) throws ParseException {
+        //鏍规嵁绛涢�夌殑鏃堕棿娈�,鏌ヨ鍑虹鍚堣姹傜殑鍚勫垎琛ㄨ褰曟暟
+        //棣栧厛,濡傛灉褰撳墠鏃堕棿瓒呰繃7鏈�,榛樿琛ㄤ腑鍙湁鏈勾搴︾殑;濡傛灉娌¤秴杩�7鏈�,榛樿琛ㄨ繕瀛樺湪涓婁竴骞村害鐨勮褰�
+        Calendar now = Calendar.getInstance();
+        if(endTimeDate.compareTo(now.getTime())>0){ //鏍¢獙浼樺寲鏈�澶ф煡璇㈡椂闂�
+            endTimeDate = now.getTime();
+        }
+        Calendar timeBefore7Month = Calendar.getInstance();
+        timeBefore7Month.add(Calendar.MONTH,-7);
+
+        LinkedHashMap<String,List<Date>> yearTimeMap = (LinkedHashMap<String, List<Date>>) DateUtil.getYearListDesc(startTimeDate, endTimeDate);
+        Map<String,List<Date>> yearTimeDescMap = new LinkedHashMap<>();
+        boolean existDefaultYear = false;
+        /*if(nowYear == beforeYear){ //榛樿琛ㄥ彧鏈夋湰骞村害鐨�(瓒呰繃浜嗗崐骞�,榛樿琛ㄨ褰曞叏閮ㄥ彧鏈夋湰骞村害鐨�,鍚屾椂浼氱敓鎴愪簡褰撳墠骞村害鐨勫垎琛�)
+            //濡傛灉鏌ヨ鏃堕棿鑼冨洿鍖呭惈褰撳墠骞村害,鍒欓渶瑕佹煡璇㈤粯璁よ〃
+            if(startTime.get(Calendar.YEAR) >= nowYear && endTimeYear <= nowYear){
+                //寮�濮嬫椂闂磋缃勾搴﹀垵濮嬫椂闂�
+                Calendar defaultTableStartTime = Calendar.getInstance();
+                defaultTableStartTime.set(Calendar.YEAR,nowYear);
+                defaultTableStartTime.set(Calendar.MONTH,defaultTableStartTime.getActualMinimum(Calendar.MONTH));
+                defaultTableStartTime.set(Calendar.DAY_OF_MONTH,defaultTableStartTime.getActualMinimum(Calendar.DAY_OF_MONTH));
+                defaultTableStartTime.set(Calendar.HOUR_OF_DAY,defaultTableStartTime.getActualMinimum(Calendar.HOUR_OF_DAY));
+                defaultTableStartTime.set(Calendar.MINUTE,defaultTableStartTime.getActualMinimum(Calendar.MINUTE));
+                defaultTableStartTime.set(Calendar.SECOND,defaultTableStartTime.getActualMinimum(Calendar.SECOND));
+                //缁堟鏃堕棿璁剧疆涓哄綋鍓嶆椂闂�
+                List<Date> defaultDateList = new LinkedList<>();
+                //defaultDateList.add(defaultTableStartTime.getTime());
+                defaultDateList.add(startTimeDate);
+                defaultDateList.add(endTimeDate);
+
+                yearTimeMap.put("default",defaultDateList);
+                existDefaultYear = true;
+
+            }
+
+        }else{ //鏌ヨ鏃堕棿鑼冨洿涓嶅湪褰撳墠骞村害
+            //榛樿琛ㄤ腑瀛樺湪涓婁竴骞村害鐨勮褰�.涓婁竴骞寸殑鏈�鏃╂椂闂翠负beforeYearTime-涓婁竴骞寸殑骞存湯
+            //鍒ゆ柇鏌ヨ鏃堕棿鑼冨洿鏄惁鍖呭惈榛樿琛ㄤ腑涓婁竴骞村害鐨勬椂闂�
+            if(instance.getTime().compareTo(beforeYearTime)>0){ //鏌ヨ鏃堕棿澶т簬榛樿琛ㄤ腑涓婁竴骞村害鏃堕棿,璇存槑鏌ヨ璁板綍涔熷寘鍚湪榛樿琛ㄤ腑
+                //璧峰鏃堕棿
+                //缁堟鏃堕棿
+                List<Date> defaultDateList = new LinkedList<>();
+                defaultDateList.add(startTimeDate);
+                defaultDateList.add(endTimeDate);
+
+                yearTimeMap.put("default",defaultDateList);
+                existDefaultYear = true;
+            }
+        }*/
+        if(startTimeDate.before(now.getTime()) || endTimeDate.after(timeBefore7Month.getTime())){
+            List<Date> defaultDateList = new LinkedList<>();
+            defaultDateList.add(startTimeDate);
+            defaultDateList.add(endTimeDate);
+
+            yearTimeMap.put("default",defaultDateList);
+            existDefaultYear = true;
+        }
+        //璋冩暣涓嬮『搴�,灏哾efault璋冩暣鍒伴浣�
+        if(existDefaultYear){
+            List<Date> defaultTimeList = yearTimeMap.get("default");
+            yearTimeDescMap.put("default",defaultTimeList);
+        }
+        Set<String> yearSet = yearTimeMap.keySet();
+        for (String year : yearSet) {
+            if(!year.equals("default")){
+                yearTimeDescMap.put(year,yearTimeMap.get(year));
+            }
+        }
+
+        return yearTimeDescMap;
+    }
+
+    /**
+     * 鎸夊勾鍒掑垎
+     * 浼樺寲getQueryTimeForSubTablesDesc,寰呮祴璇�
+     * 鏇存柊default琛ㄦ槸鍚︽煡璇㈢殑閫昏緫,鏀箌|涓�&&
+     *
+     */
+    public static Map<String,List<Date>> getQueryTimeForSubTablesDesc2(Date startTimeDate,Date endTimeDate) throws ParseException {
+        //鏍规嵁绛涢�夌殑鏃堕棿娈�,鏌ヨ鍑虹鍚堣姹傜殑鍚勫垎琛ㄨ褰曟暟
+        //棣栧厛,濡傛灉褰撳墠鏃堕棿瓒呰繃7鏈�,榛樿琛ㄤ腑鍙湁鏈勾搴︾殑;濡傛灉娌¤秴杩�7鏈�,榛樿琛ㄨ繕瀛樺湪涓婁竴骞村害鐨勮褰�
+        Calendar now = Calendar.getInstance();
+        if(endTimeDate.compareTo(now.getTime())>0){ //鏍¢獙浼樺寲鏈�澶ф煡璇㈡椂闂�
+            endTimeDate = now.getTime();
+        }
+        Calendar timeBefore7Month = Calendar.getInstance();
+        timeBefore7Month.add(Calendar.MONTH,-7);
+
+        LinkedHashMap<String,List<Date>> yearTimeMap = (LinkedHashMap<String, List<Date>>) DateUtil.getYearListDesc(startTimeDate, endTimeDate);
+        Map<String,List<Date>> yearTimeDescMap = new LinkedHashMap<>();
+        boolean existDefaultYear = false;
+        //鏌ヨ鐨勫紑濮嬫椂闂� 灏忎簬鐜板湪
+        //鏌ヨ鐨勭粨鏉熸椂闂� 澶т簬 涓冧釜鏈堝墠
+        if(startTimeDate.before(now.getTime()) && endTimeDate.after(timeBefore7Month.getTime())){
+            List<Date> defaultDateList = new LinkedList<>();
+            defaultDateList.add(startTimeDate);
+            defaultDateList.add(endTimeDate);
+
+            yearTimeMap.put("default",defaultDateList);
+            existDefaultYear = true;
+        }
+        //璋冩暣涓嬮『搴�,灏哾efault璋冩暣鍒伴浣�
+        if(existDefaultYear){
+            List<Date> defaultTimeList = yearTimeMap.get("default");
+            yearTimeDescMap.put("default",defaultTimeList);
+        }
+        Set<String> yearSet = yearTimeMap.keySet();
+        for (String year : yearSet) {
+            if(!year.equals("default")){
+                yearTimeDescMap.put(year,yearTimeMap.get(year));
+            }
+        }
+
+        return yearTimeDescMap;
+    }
+
+    /**
+     * 鎸夋湀鍒掑垎,鏃堕棿鍊掑簭
+     * 鍦ㄥ師鏉ユ寜璧锋鏃堕棿鑾峰彇鏈堜唤鍒掑垎闆嗗悎鐨勫熀纭�涓�,鍔犲叆瀹為檯瀛愯〃閫昏緫,褰撳墠鏈堝唴鐨�,鍦╠efault琛�
+     * */
+    public static Map<String,List<Date>> getQueryTimeForSubTablesByMonthDesc(Date startTimeDate,Date endTimeDate) throws ParseException {
+        //鏍规嵁绛涢�夌殑鏃堕棿娈�,鏌ヨ鍑虹鍚堣姹傜殑鍚勫垎琛ㄨ褰曟暟
+        //棣栧厛,濡傛灉褰撳墠鏃堕棿瓒呰繃7鏈�,榛樿琛ㄤ腑鍙湁鏈勾搴︾殑;濡傛灉娌¤秴杩�7鏈�,榛樿琛ㄨ繕瀛樺湪涓婁竴骞村害鐨勮褰�
+        Calendar now = Calendar.getInstance();
+        if(endTimeDate.compareTo(now.getTime())>0){ //鏍¢獙浼樺寲鏈�澶ф煡璇㈡椂闂�
+            endTimeDate = now.getTime();
+        }
+        LinkedHashMap<String,List<Date>> yearTimeMap = (LinkedHashMap<String, List<Date>>) DateUtil.getMonthListDesc(startTimeDate, endTimeDate);
+        Map<String,List<Date>> yearTimeDescMap = new LinkedHashMap<>();
+        boolean existDefaultYear = false;
+        //鏌ヨ鐨勭粨鏉熸椂闂� 鍦ㄥ綋鏈�,鍒欐湁default琛�
+        //鍚屾椂,鎶瑰幓鏈堜唤闆嗗悎閲岀殑褰撴湀
+        //if(DateUtil.YYYY_MM_TABLE.format(endTimeDate).equals(DateUtil.YYYY_MM_TABLE.format(now.getTime()))){
+        if(ThreadLocalUtil.format(endTimeDate,2).equals(ThreadLocalUtil.format(now.getTime(),2))){
+            List<Date> defaultDateList = new LinkedList<>();
+            defaultDateList.add(startTimeDate);
+            defaultDateList.add(endTimeDate);
+
+            yearTimeMap.put("default",defaultDateList);
+            existDefaultYear = true;
+
+            //yearTimeMap.remove(DateUtil.YYYY_MM_TABLE.format(endTimeDate));
+            yearTimeMap.remove(ThreadLocalUtil.format(endTimeDate,2));
+        }
+        //璋冩暣涓嬮『搴�,灏哾efault璋冩暣鍒伴浣�
+        if(existDefaultYear){
+            List<Date> defaultTimeList = yearTimeMap.get("default");
+            yearTimeDescMap.put("default",defaultTimeList);
+        }
+        Set<String> yearSet = yearTimeMap.keySet();
+        for (String year : yearSet) {
+            if(!year.equals("default")){
+                yearTimeDescMap.put(year,yearTimeMap.get(year));
+            }
+        }
+
+        return yearTimeDescMap;
+    }
+
+
+    public static void main(String[] args) throws ParseException {
+        //Date d1 = YYYY_MM_DD_HH_MM_SS.parse("2023-01-22 14:12:22");
+        //Date d2 = YYYY_MM_DD_HH_MM_SS.parse("2023-08-24 16:45:22");
+        //Map<String, List<Date>> monthListDesc = getQueryTimeForSubTablesByMonthDesc(d1, d2);
+        //
+        //Set<Map.Entry<String, List<Date>>> entries = monthListDesc.entrySet();
+        //for (Map.Entry<String, List<Date>> entry : entries) {
+        //    System.out.println(entry);
+        //}
+        //Map<String,String> map = new HashMap<>();
+        //map.put("2022_01","");
+        //map.put("2022_02","");
+        //map.put("2022_10","");
+        //map.put("2022_12","");
+        //map.put("2021_03","");
+        //map.put("2023_01","");
+        //map.put("2023_05","");
+        //map.put("2021_10","");
+        //Set<String> keySet = map.keySet();
+        //List<String> keySetDesc = keySet.stream().sorted(Comparator.comparing(String::hashCode).reversed()).collect(Collectors.toList());
+        String t1 = "2024-01-25 12:22:29";
+        String t2 = "2024-01-25 12:32:24";
+        String t3 = "2024-01-25 12:42:26";
+        Date maxTime = getMaxTime(t1, t2, t3);
+        System.out.println(maxTime.toString());
+
+
+    }
+
+}
diff --git a/src/main/java/com/whyc/util/MathUtil.java b/src/main/java/com/whyc/util/MathUtil.java
new file mode 100644
index 0000000..e2effbe
--- /dev/null
+++ b/src/main/java/com/whyc/util/MathUtil.java
@@ -0,0 +1,303 @@
+package com.whyc.util;
+
+import com.whyc.dto.Response;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.util.*;
+
+/**
+ * 璁$畻宸ュ叿绫�
+ */
+public class MathUtil {
+
+    public static final Integer TYPE_FLOAT = 1;
+    public static final Integer TYPE_FLOAT_100 = 2;
+    public static final Integer TYPE_FLOAT_PERCENT = 3;
+    /**
+     * 鎻愬彇鍏叡鏂规硶,鐩搁櫎鑾峰彇姣斾緥,杩斿洖鍙�塖tring鎴栬�匜loat
+     * @param type 1琛ㄧず灏忔暟,2琛ㄧず闄ゅ幓%鐨勬瘮渚�,3琛ㄧず%鐨勬瘮渚�
+     * @return Object String鎴栬�匜loat绫诲瀷
+     * */
+    public static Object divide(Object num,Object num2,Integer type){
+        float res = 0;
+        double num2Double=Double.parseDouble(num2.toString());
+        if(num2Double!=0){
+
+            if (num instanceof Integer) {
+                res = BigDecimal.valueOf((Integer) num).divide(BigDecimal.valueOf((Integer) num2), 2, RoundingMode.HALF_UP).floatValue();
+            }
+            if (num instanceof Float) {
+                res = BigDecimal.valueOf((Float) num).divide(BigDecimal.valueOf((Float) num2), 2, RoundingMode.HALF_UP).floatValue();
+            }
+            if (num instanceof Double) {
+                res = BigDecimal.valueOf((Double) num).divide(BigDecimal.valueOf((Double) num2), 2, RoundingMode.HALF_UP).floatValue();
+            }
+        }
+        //0.05
+        if (type == 1) {
+            return res;
+        }
+        //5
+        else if (type == 2) {
+            return (int) (res * 100);
+        }
+        //5%
+        return (int) (res * 100) + "%";
+    }
+
+    /**
+     * 鎻愬彇鍏叡鏂规硶,鐩搁櫎鑾峰彇姣斾緥,杩斿洖鍙�塖tring鎴栬�匜loat
+     * @param type 1琛ㄧず灏忔暟,2琛ㄧず闄ゅ幓%鐨勬瘮渚�,3琛ㄧず%鐨勬瘮渚�
+     * @return Object String鎴栬�匜loat绫诲瀷
+     * */
+    public static Object divide(Object num, Object num2, Integer type, Integer scale){
+        Object res = 0;
+        double num2Double=Double.parseDouble(num2.toString());
+        double numDouble=Double.parseDouble(num.toString());
+        if(num2Double!=0){
+            //0.05
+            if (type == 1) {
+                res = BigDecimal.valueOf(numDouble).divide(BigDecimal.valueOf(num2Double), scale, RoundingMode.HALF_UP).floatValue();
+            }
+            //5
+            else {
+                BigDecimal multiply = BigDecimal.valueOf(numDouble).multiply(BigDecimal.valueOf(100));
+                BigDecimal divide = multiply.divide(BigDecimal.valueOf(num2Double), scale, RoundingMode.HALF_UP);
+                if (type == 2) {
+                    res = divide.floatValue()+"";
+                }
+                //5%
+                else{
+                    res = divide.floatValue()+"%";
+                }
+            }
+            return res;
+        }else{
+            if(type == 1){
+                return 0.0;
+            }else{
+                if(type==2){
+                    return "0";
+                }else{
+                    return "0%";
+                }
+            }
+        }
+    }
+
+    public static float multiply(float num,float num2,int scale){
+        return BigDecimal.valueOf(num).multiply(BigDecimal.valueOf(num2)).setScale(2,RoundingMode.HALF_UP).floatValue();
+    }
+
+    /**
+     * 姹傝嚜鍙橀噺X,鍥犲彉閲廦鐨勭嚎鎬у洖褰� @PerryHsu
+     * y = ax+b
+     *
+     * a = 鈭慪i(Xi-X鐨勫钩鍧囧��)/鈭�(Xi^2)-1/n*(鈭�(Xi^2)
+     *
+     * b = 1/n*鈭�(Yi-aXi)
+     *
+     * */
+    public static Response linearRegressionUnary(List<Double> listX, List<Double> listY,Double x) {
+        List<Double> resList = new LinkedList<>();
+
+        int sizeX = listX.size();
+        int sizeY = listY.size();
+        DecimalFormat df = new DecimalFormat("0.##");
+
+        if (sizeX != sizeY) {
+            return new Response<>().set(1,false,"鍒嗗瓙鍒嗘瘝鏁伴噺涓嶄竴鑷淬��");
+        }
+
+        Double sum = 0d;
+        for (Double xi : listX) {
+            sum += xi;
+        }
+        double avgX = sum/ sizeY;
+
+        //a鐨勫垎瀛�
+        double aMolecule = 0;
+        for (int i = 0; i < sizeX; i++) {
+            aMolecule += listY.get(i) * (listX.get(i) - avgX);
+        }
+
+        //a鐨勫垎姣�
+        double aDenominator = 0;
+        int aDenominatorXi = 0;
+        for (int i = 0; i < sizeX; i++) {
+            aDenominator += Math.pow(listX.get(i), 2);
+            aDenominatorXi += listX.get(i);
+        }
+        aDenominator = aDenominator - (1.0 / sizeX) * (Math.pow(aDenominatorXi, 2));
+
+        //System.out.println("w_denominator:"+w_denominator+" w_denominator_xi:"+w_denominator_xi);
+
+        double a = aMolecule / aDenominator;
+
+        double b = 1.0 / sizeX;
+        double sumYAX = 0;
+        for (int i = 0; i < sizeX; i++) {
+            sumYAX += (listY.get(i) - a * listX.get(i));
+        }
+        b = b * sumYAX;
+
+        String symbol = "+";
+        if (b < 0) {
+            symbol = "";
+        }
+        //System.out.println("y=" + df.format(a) + "x" + symbol + df.format(b));
+
+        Double y = a*x + b;
+        resList.add(a);
+        resList.add(b);
+        resList.add(y);
+        return new Response().setII(1,true,resList,null);
+    }
+
+    public static void main(String[] args) throws ParseException {
+
+        /*List<Double> x = Arrays.asList(5d, 9d, 15d, 19d, 19d, 45d);
+
+        List<Double> y = Arrays.asList(4d, 6d, 12d, 15d, 15d, 37d);*/
+        //鎸夌収骞翠负鍗曚綅涓簒.鍙樺寲宸�间负y
+        /*List<Double> x = Arrays.asList(
+                DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2021-04-13 09:14:36").getTime()*1d,
+                DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2021-10-14 13:46:36").getTime()*1d,
+                DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2022-03-18 11:08:36").getTime()*1d,
+                DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2022-03-18 13:56:36").getTime()*1d);
+
+        List<Double> y = Arrays.asList(
+                99d,
+                80d,
+                71.9d,
+                71d);*/
+        /*long time1 = DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2021-04-13 09:14:36").getTime();
+        long time2 = DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2021-10-14 13:46:36").getTime();
+        long time3 = DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2022-03-18 11:08:36").getTime();
+        long time4 = DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2022-03-18 13:56:36").getTime();
+        long time5 = DateUtil.YYYY_MM_DD_HH_MM_SS.parse("2023-03-12 13:56:36").getTime();*/
+        long time1 = ThreadLocalUtil.parse("2021-04-13 09:14:36",1).getTime();
+        long time2 = ThreadLocalUtil.parse("2021-10-14 13:46:36",1).getTime();
+        long time3 = ThreadLocalUtil.parse("2022-03-18 11:08:36",1).getTime();
+        long time4 = ThreadLocalUtil.parse("2022-03-18 13:56:36",1).getTime();
+        long time5 = ThreadLocalUtil.parse("2023-03-12 13:56:36",1).getTime();
+
+        double c1 = 99d;
+        double c2 = 98d;
+        double c3 = 96.9d;
+        double c4 = 95d;
+
+        List<Double> x = Arrays.asList(
+                0d,
+                (time2-time1)*1d/1000/60/60/24,
+                (time3-time1)*1d/1000/60/60/24,
+                (time4-time1)*1d/1000/60/60/24
+        );
+
+
+        List<Double> y = Arrays.asList(
+                c1,
+                c2,
+                c3,
+                c4
+        );
+        double v = (time5 - time1) * 1d / 1000 / 60 / 60 /24;
+        System.out.println(v);
+        Response response = linearRegressionUnary(x, y, v);
+        System.out.println(response);
+    }
+
+
+    /**
+     *
+     * @param startNum 璧峰鏁�  -1 = limitStart ,鍥犱负limit鏄粠0寮�濮�
+     * @param endNum 缁堟鏁�
+     * @param pageSize 姣忛〉鏉℃暟
+     * @param queryCountMap key-骞翠唤,value-鏁伴噺
+     * @return {"2023",[2,20]}
+     *           琛ㄥ悕,[limit 2,20]
+     */
+    public static Map<String, List<Integer>> getQueryTableAndLimit(int startNum, int endNum, int pageSize, Map<String, Integer> queryCountMap) {
+        Map<String,List<Integer>> resultMap = new LinkedHashMap<>();
+        //瀹氫綅璧峰鏁�,鍦ㄥ摢涓勾浠借寖鍥村唴,璧峰鏁板��;缁堟鏁�,鍦ㄥ摢涓勾浠借寖鍥村唴,缁堟鏁板��
+        Set<String> queryKeySet = queryCountMap.keySet();
+        int sum = 0;
+        int lastSum = 0;
+
+        String limitStartYear = null;
+        int limitStart = 0;
+        String limitEndYear = null;
+        int limitEndSize = pageSize;
+        boolean limitStartFinished = false;
+        for (String queryKey : queryKeySet) {
+            int queryCount  = queryCountMap.get(queryKey);
+            sum+=queryCount;
+            if(!limitStartFinished) {
+                if (startNum <= sum) {
+                    limitStart = startNum - lastSum;
+                    limitStartYear = queryKey;
+                    //瀹屾垚浜唋imit 璧峰鍊肩殑鑾峰彇,鍚庣画涓嶉渶瑕佺户缁墽琛�
+                    limitStartFinished = true;
+                }
+            }
+            if(limitStartFinished) { //limit 璧峰鍊艰幏鍙栧悗,寮�濮嬭绠楃粓姝㈢殑璁板綍鏁伴噺
+                if (endNum <= sum) {
+                    limitEndYear = queryKey;
+
+                    break;
+                }
+                //棣栨,鎵ц璧峰limit鐨勬椂鍊�, limitEndSize(璁板綍棰勭暀鐨勬煡璇釜鏁�)闇�瑕佸噺鍘籰imitStart鍗犵敤鐨�
+                if(limitEndSize == pageSize){
+                    limitEndSize = pageSize - (sum - startNum + 1);
+                }else{ //濡傛灉杩樻病杈惧埌 缁堟鏁板��,闇�瑕佸噺鍘绘湰娆℃煡璇㈡秷鑰楁帀鐨勬暟閲�
+                    limitEndSize = limitEndSize - queryCount;
+                }
+            }
+
+            lastSum = sum;
+        }
+
+        boolean limitStartCompareFlag = true;
+        boolean tableStartFlag = false;
+        for (String queryKey : queryKeySet) {
+            int queryCount  = queryCountMap.get(queryKey);
+            if(queryKey.equals(limitStartYear) && limitStartCompareFlag){
+                tableStartFlag = true;
+                //浠庤繖閲屽紑濮�,鍙栬褰曟暟
+                LinkedList<Integer> limitList = new LinkedList<>();
+                if(queryKey.equals(limitEndYear)) { //鍚屼竴骞�
+                    limitList.add(limitStart-1);
+                    limitList.add(pageSize);
+                    resultMap.put(queryKey,limitList);
+                    break;
+                }else{
+                    limitList.add(limitStart-1);
+                    limitList.add(queryCount);
+                    resultMap.put(queryKey,limitList);
+                }
+                limitStartCompareFlag = false;
+                continue;
+            }
+            //涓嶅悓骞�,缁х画
+            if(tableStartFlag) { //宸茬粡缁忚繃浜嗚捣濮嬪勾,鎵嶅彲浠ュ彇鏁版嵁. 璧峰骞村墠鐨勬暟鎹棤鏁�
+                if (queryKey.equals(limitEndYear)) { //鎵惧埌缁堟骞�
+                    LinkedList<Integer> limitList = new LinkedList<>();
+                    limitList.add(0);
+                    limitList.add(limitEndSize);
+                    resultMap.put(queryKey, limitList);
+                    break;
+                } else { //涓嶆槸缁堟骞�,灞炰簬涓棿骞�
+                    LinkedList<Integer> limitList = new LinkedList<>();
+                    limitList.add(0);
+                    limitList.add(queryCount);
+                    resultMap.put(queryKey, limitList);
+                }
+            }
+        }
+        return resultMap;
+
+    }
+}
diff --git a/src/main/java/com/whyc/util/SubTablePageInfoUtil.java b/src/main/java/com/whyc/util/SubTablePageInfoUtil.java
new file mode 100644
index 0000000..385c238
--- /dev/null
+++ b/src/main/java/com/whyc/util/SubTablePageInfoUtil.java
@@ -0,0 +1,148 @@
+package com.whyc.util;
+
+import com.github.pagehelper.PageInfo;
+import com.whyc.factory.ThreadPoolExecutorFactory;
+import com.whyc.mapper.CommonMapper;
+import com.whyc.pojo.BattAlarmHis;
+import com.whyc.service.SubTableService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+/**
+ * 鏁版嵁閲忔瀬澶х殑琛�,鎸夌収骞翠唤鍒嗚〃,鍒嗛〉鏌ヨ鏃惰幏鍙栨暟鎹�
+ */
+@Component
+public class SubTablePageInfoUtil {
+    @Autowired(required = false)
+    private CommonMapper commonMapper;
+
+    @Autowired
+    private SubTableService service;
+
+    //鎸夊勾鏈堝垎琛�
+    /**鎸夋湀鍒嗚〃,鍒嗛〉鏌ヨ*/
+    public PageInfo<Object> getPageInfoByMonthTable(int pageNum, int pageSize,
+                                                    Date startTime, Date endTime,
+                                                    String dbName, String tablePrefix,
+                                                    Object pojo) throws ParseException, InterruptedException {
+        Map<String, List<Date>> queryTimeForSubTables = DateUtil.getQueryTimeForSubTablesByMonthDesc(startTime, endTime);
+        //鏌ヨ鍒嗚〃鏄惁瀛樺湪,瀛樺湪鍒欐煡璇㈢粨鏋�
+        Map<String,Integer> queryCountMap = new LinkedHashMap<>();
+        Set<String> tableYearKeySet = queryTimeForSubTables.keySet();
+        //浼樺寲1-鏌ヨ鎵�鏈夌殑绗﹀悎鏈堜唤瑙勫垯鐨勮〃鍜屼富琛�
+        List<String> tableNameListDB = getTableList(dbName, tablePrefix, tablePrefix + "(_[0-9]{4}_[0-9]{2})?");
+        List<String> tableYearListInDB = new LinkedList<>(); //鏌ヨ鏃堕棿娈靛唴鐨勫勾鏈堝垎琛ㄩ泦鍚堜笖鍦ㄦ暟鎹簱涓瓨鍦�
+        //杩囨护鎺夋椂闂存鍐呮暟鎹簱涓笉瀛樺湪鐨勫勾鏈堝垎琛�
+        for (String tableYear : tableYearKeySet) {
+            String tableName;
+            if(!tableYear.equals("default")){
+                //鏁板��
+                tableName = tablePrefix+"_"+tableYear;
+                //String existTableName = commonMapper.existTable(dbName, tableName);
+                if(!tableNameListDB.contains(tableName)){ //浼樺寲1-鏁版嵁搴撲腑涓嶅瓨鍦�,鍘婚櫎澶氭鏌ヨ〃,涓�娆℃煡鍑�
+                    continue;
+                }
+            }
+            tableYearListInDB.add(tableYear);
+        }
+        //鏌ヨ骞存湀鍒嗚〃鐨勮褰曟暟
+        //浼樺寲2:澶氱嚎绋嬭鍙�
+        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
+        CountDownLatch latch = new CountDownLatch(tableYearListInDB.size());
+        for (String tableYear : tableYearListInDB) {
+            List<Date> queryTime = queryTimeForSubTables.get(tableYear);
+
+            String tableName;
+            if(!tableYear.equals("default")){
+                //鏁板��
+                tableName = tablePrefix+"_"+tableYear;
+            }else{
+                tableName = tablePrefix;
+            }
+            pool.execute(()-> {
+                //====== 鏍规嵁涓嶅悓绫诲瀷绫诲瀷瀵硅薄瀵瑰簲璋冩暣 ======
+                if (pojo instanceof BattAlarmHis) {
+                    BattAlarmHis battAlarmHis = new BattAlarmHis();
+                    BeanUtils.copyProperties(pojo,battAlarmHis);
+                    battAlarmHis.setAlmStartTime(queryTime.get(0));
+                    battAlarmHis.setAlmEndTime(queryTime.get(1));
+                    battAlarmHis.setRecordYear(tableName);
+                    int currentCount = service.getBattHisCount(battAlarmHis);
+                    queryCountMap.put(tableYear, currentCount);
+                 }
+                latch.countDown();
+            });
+        }
+        latch.await();
+        //鍥犱负澶氱嚎绋嬪悗鏃犲簭,闇�瑕侀噸鎺掑簭
+        List<String> keySetDesc = queryCountMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
+        Map<String,Integer> queryCountMapDesc = new LinkedHashMap<>();
+        for (String key : keySetDesc) {
+            Integer count = queryCountMap.get(key);
+            queryCountMapDesc.put(key,count);
+        }
+        //鍒嗛〉淇℃伅
+        //纭鎬婚〉鏁�,鎬昏褰曟暟
+        PageInfo<Object> pageInfo = new PageInfo<>();
+        int total = 0;
+        Set<String> queryKeySet = queryCountMap.keySet();
+        for (String queryKey : queryKeySet) {
+            int size = queryCountMap.get(queryKey);
+            total+=size;
+        }
+        int pages = (int) Math.ceil(Float.parseFloat(String.valueOf(total))/pageSize);
+        pageInfo.setTotal(total);
+        pageInfo.setPages(pages);
+        pageInfo.setPageNum(pageNum);
+        pageInfo.setPageSize(pageSize);
+        //鏍规嵁褰撳墠椤垫墍闇�璁板綍,鏌ヨ褰撳墠椤佃褰�
+        int startNum = (pageNum-1)*pageSize+1;
+        int endNum = pageNum*pageSize;
+
+        //鏈�鍚庝竴涓畻娉�:涓婇潰涓嶅簲璇ュ厛鏌ヨ鎵�鏈夎褰�,搴旇鍙朿ount. 杩欏悗闈㈠畾浣嶅埌鍝釜琛ㄦ垨鍝嚑寮犺〃鍚�,閲囧彇limit鑾峰彇褰撳墠椤佃褰曟暟;
+        //鏍煎紡:{琛ㄥ悕,[limit 2,20]}
+        Map<String,List<Integer>> tableAndLimitMap = MathUtil.getQueryTableAndLimit(startNum,endNum,pageSize,queryCountMapDesc);
+        Set<String> keySet = tableAndLimitMap.keySet();
+        List<Object> dataList = new LinkedList<>();
+        for (String key : keySet) {
+            List<Date> queryTime = queryTimeForSubTables.get(key);
+            //====== 鏍规嵁涓嶅悓绫诲瀷绫诲瀷瀵硅薄瀵瑰簲璋冩暣 ======
+            String recordYear = key.equals("default") ? tablePrefix : tablePrefix + "_" + key;
+            if(pojo instanceof BattAlarmHis) {
+                BattAlarmHis battAlarmHis = new BattAlarmHis();
+                BeanUtils.copyProperties(pojo,battAlarmHis);
+                battAlarmHis.setAlmStartTime(queryTime.get(0));
+                battAlarmHis.setAlmEndTime(queryTime.get(1));
+                battAlarmHis.setRecordYear(recordYear);
+                List<Integer> limitList = tableAndLimitMap.get(key);
+                battAlarmHis.setLimitStart(limitList.get(0));
+                battAlarmHis.setLimitEnd(limitList.get(1));
+                List<BattAlarmHis> list =  service.getBattHisList(battAlarmHis);
+                dataList.addAll(list);
+            }
+        }
+        pageInfo.setList(dataList);
+        return pageInfo;
+
+    }
+
+    /**鏌ヨ鏄惁鍖呭惈鐗瑰畾瑙勫垯鐨勮〃,瀛樺湪,鍒欒繑鍥炶〃鍚�*/
+    public List<String> getTableList(String dbName,String tableLike,String regex){
+        List<String> resultTableList = new LinkedList<>();
+        List<String> tableList = commonMapper.getTableListLike(dbName,tableLike);
+        for (String tableName : tableList) {
+            boolean matches = Pattern.matches(regex, tableName);
+            if(matches){
+                resultTableList.add(tableName);
+            }
+        }
+        return resultTableList;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1