diff --git a/src/main/java/com/xydl/cac/model/ConditionModel.java b/src/main/java/com/xydl/cac/model/ConditionModel.java index 954cee2..94f3b05 100644 --- a/src/main/java/com/xydl/cac/model/ConditionModel.java +++ b/src/main/java/com/xydl/cac/model/ConditionModel.java @@ -29,4 +29,7 @@ public class ConditionModel { Integer pageNum; @ApiModelProperty("每页数量") Integer pageSize; + @ApiModelProperty("每天最大数量") + Integer numPerDay; + } diff --git a/src/main/java/com/xydl/cac/service/DataService.java b/src/main/java/com/xydl/cac/service/DataService.java index a1d273c..0d1f9e9 100644 --- a/src/main/java/com/xydl/cac/service/DataService.java +++ b/src/main/java/com/xydl/cac/service/DataService.java @@ -4,6 +4,7 @@ package com.xydl.cac.service; import com.xydl.cac.entity.*; import com.xydl.cac.model.*; +import java.text.ParseException; import java.util.List; import java.util.Map; @@ -13,7 +14,9 @@ public interface DataService { List getDataTableColumns(String tableName) throws Exception; - OnePage> getDate(NSensor sensor, List points, ConditionModel model); + OnePage> getData(NSensor sensor, List points, ConditionModel model); + + OnePage> getDataByDate(NSensor sensor, List points, ConditionModel model, int dayPerPage) throws Exception; void clearAllBind(); } diff --git a/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java index be2f835..0c72734 100644 --- a/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java @@ -7,6 +7,7 @@ import com.xydl.cac.model.OnePage; import com.xydl.cac.repository.ModevTypeRepository; import com.xydl.cac.service.DataService; import com.xydl.cac.util.DataTable; +import com.xydl.cac.util.DataUtil; import com.xydl.cac.util.DateUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -16,7 +17,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.text.ParseException; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; @@ -83,7 +87,7 @@ public class DataServiceImpl implements DataService { } @Override - public OnePage> getDate(NSensor sensor, List points, ConditionModel model) { + public OnePage> getData(NSensor sensor, List points, ConditionModel model) { String devField = DataTable.getDevidField(sensor.getTableName()); String timeField = DataTable.getTimeField(sensor.getTableName()); OnePage result = new OnePage(); @@ -122,6 +126,54 @@ public class DataServiceImpl implements DataService { return result; } + @Override + public OnePage> getDataByDate(NSensor sensor, List points, ConditionModel model, int dayPerPage) throws Exception { + + // 处理开始和结束时间 + Date end = model.getEndTime(); + if (end == null) { + end = new Date(); + } + end = DateUtil.addDay(end, 1); + end = DateUtil.getDayZero(end); + model.setEndTime(end); + + Date start = model.getStartTime(); + if (start == null) { + start = DateUtil.addMonth(new Date(), -1); + } + start = DateUtil.getDayZero(start); + model.setStartTime(start); + + long daysBetweenDates = DateUtil.getDifferenceInDays(start, end); + + // 本次查询的时间范围 + ConditionModel newmodel = new ConditionModel(); + if (daysBetweenDates > dayPerPage) { + if (model.getPageNum() > 1) { + int p = model.getPageNum() - 1; + end = DateUtil.addDay(end, -dayPerPage * p); + } + newmodel.setEndTime(end); + start = DateUtil.addDay(end, -dayPerPage); + if (start.compareTo(model.getStartTime()) > 0) { + newmodel.setStartTime(start); + } else { + newmodel.setStartTime(model.getStartTime()); + } + } + OnePage> page = this.getData(sensor, points, newmodel); + + // 从数据里每天抽取num条 + List> content = DataUtil.pickNumPerDay(page.getContent(), model.getNumPerDay()); + page.setContent(content); + + page.setPageNum(model.getPageNum()); + page.setPageSize(model.getPageSize()); + page.setTotal(daysBetweenDates * model.getPageSize()); + return page; + } + @Override public void clearAllBind() { String sql = "UPDATE n_sensor SET icd_id=null"; diff --git a/src/main/java/com/xydl/cac/service/impl/NSensorServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/NSensorServiceImpl.java index b4c66a7..816bc92 100644 --- a/src/main/java/com/xydl/cac/service/impl/NSensorServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/NSensorServiceImpl.java @@ -166,11 +166,12 @@ public class NSensorServiceImpl implements NSensorService { throw new BusinessException("该装置类型" + sensor.getTypeName() + "未配置属性点信息"); } + // 获取数据 SensorDetail> result = this.getData(sensor, points, model); return result; } - public SensorDetail> getData(NSensor sensor, List points, ConditionModel model) { + public SensorDetail> getData(NSensor sensor, List points, ConditionModel model) throws Exception { List pointList = new ArrayList<>(); for (ModevTypePoint point : points) { if (StringUtils.isNotBlank(point.getField())) { @@ -180,8 +181,18 @@ public class NSensorServiceImpl implements NSensorService { SensorDetail> result = new SensorDetail(); result.setSensor(sensor); - OnePage> page = dataService.getDate(sensor, pointList, model); - result.initFrom(page); + + + if (model.getNumPerDay() != null && model.getPageSize() > model.getNumPerDay()) { + // 按每页几天取数据 + int dayPerPage = model.getPageSize() / model.getNumPerDay(); + OnePage> page = dataService.getDataByDate(sensor, pointList, model, dayPerPage); + result.initFrom(page); + } else { + // 按全量取数据 + OnePage> page = dataService.getData(sensor, pointList, model); + result.initFrom(page); + } for (ModevTypePoint point : pointList) { List dataList = new ArrayList<>(); diff --git a/src/main/java/com/xydl/cac/util/DataUtil.java b/src/main/java/com/xydl/cac/util/DataUtil.java new file mode 100644 index 0000000..a22ca43 --- /dev/null +++ b/src/main/java/com/xydl/cac/util/DataUtil.java @@ -0,0 +1,69 @@ +package com.xydl.cac.util; + +import java.util.*; + +public class DataUtil { + + // 从数据里每天抽取num条 + public static List> pickNumPerDay(List> source, Integer numPerDay) throws Exception { + + // 按天划分 + LinkedHashMap>> map = new LinkedHashMap<>(); + for (Map item : source) { + String time = (String) item.get("acquisitionTime"); + Date date = DateUtil.parse(time); + String day = DateUtil.format(date, "yyyy-MM-dd"); + + List> list = map.get(day); + if (list == null) { + list = new ArrayList<>(); + list.add(item); + map.put(day, list); + } else { + list.add(item); + } + } + + // 过滤多余 + for (List> list : map.values()) { + if (list.size() > numPerDay) { + reduceOneDaySize(list, numPerDay); + } + } + + // 合并返回 + List> result = new ArrayList<>(); + for (List> list : map.values()) { + result.addAll(list); + } + return result; + } + + private static void reduceOneDaySize(List> list, Integer numPerDay) { + int m = list.size() / numPerDay; + int x = list.size() - numPerDay; + if (m == 1) { + if (x == 1) { + list.remove(0); + } else { + int idx = 0; + while (list.size() > numPerDay) { + if (idx >= list.size()) { + idx = 0; + } + list.remove(idx); + idx++; + } + } + } else { + List> newlist = new ArrayList<>(); + for (int i = 0; i < numPerDay; i++) { + int idx = m * (i + 1) - 1; + Map item = list.get(idx); + newlist.add(item); + } + list.clear(); + list.addAll(newlist); + } + } +} diff --git a/src/main/java/com/xydl/cac/util/DateUtil.java b/src/main/java/com/xydl/cac/util/DateUtil.java index fabb0ce..d9f5b1d 100644 --- a/src/main/java/com/xydl/cac/util/DateUtil.java +++ b/src/main/java/com/xydl/cac/util/DateUtil.java @@ -2,6 +2,9 @@ package com.xydl.cac.util; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.Calendar; import java.util.Date; @@ -57,6 +60,12 @@ public class DateUtil { return df.parse(str); } + public static Date getDayZero(Date date) throws ParseException { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String str = df.format(date); + return df.parse(str); + } + public static Date getMonthZero() throws ParseException { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM"); String str = df.format(new Date()); @@ -80,4 +89,10 @@ public class DateUtil { return cal.getTime(); } + public static long getDifferenceInDays(Date startDate, Date endDate) { + LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + return ChronoUnit.DAYS.between(startLocalDate, endLocalDate); + } + }