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