feat: 数据查询每天限制最多num条

dev
huangfeng 1 year ago
parent 044c4ae881
commit ef3087d88d

@ -29,4 +29,7 @@ public class ConditionModel {
Integer pageNum;
@ApiModelProperty("每页数量")
Integer pageSize;
@ApiModelProperty("每天最大数量")
Integer numPerDay;
}

@ -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<ColumnModel> getDataTableColumns(String tableName) throws Exception;
OnePage<Map<String, Object>> getDate(NSensor sensor, List<ModevTypePoint> points, ConditionModel model);
OnePage<Map<String, Object>> getData(NSensor sensor, List<ModevTypePoint> points, ConditionModel model);
OnePage<Map<String, Object>> getDataByDate(NSensor sensor, List<ModevTypePoint> points, ConditionModel model, int dayPerPage) throws Exception;
void clearAllBind();
}

@ -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<Map<String, Object>> getDate(NSensor sensor, List<ModevTypePoint> points, ConditionModel model) {
public OnePage<Map<String, Object>> getData(NSensor sensor, List<ModevTypePoint> 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<Map<String, Object>> getDataByDate(NSensor sensor, List<ModevTypePoint> 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<Map<String, Object>> page = this.getData(sensor, points, newmodel);
// 从数据里每天抽取num条
List<Map<String, Object>> 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";

@ -166,11 +166,12 @@ public class NSensorServiceImpl implements NSensorService {
throw new BusinessException("该装置类型" + sensor.getTypeName() + "未配置属性点信息");
}
// 获取数据
SensorDetail<Map<String, Object>> result = this.getData(sensor, points, model);
return result;
}
public SensorDetail<Map<String, Object>> getData(NSensor sensor, List<ModevTypePoint> points, ConditionModel model) {
public SensorDetail<Map<String, Object>> getData(NSensor sensor, List<ModevTypePoint> points, ConditionModel model) throws Exception {
List<ModevTypePoint> pointList = new ArrayList<>();
for (ModevTypePoint point : points) {
if (StringUtils.isNotBlank(point.getField())) {
@ -180,8 +181,18 @@ public class NSensorServiceImpl implements NSensorService {
SensorDetail<Map<String, Object>> result = new SensorDetail();
result.setSensor(sensor);
OnePage<Map<String, Object>> page = dataService.getDate(sensor, pointList, model);
if (model.getNumPerDay() != null && model.getPageSize() > model.getNumPerDay()) {
// 按每页几天取数据
int dayPerPage = model.getPageSize() / model.getNumPerDay();
OnePage<Map<String, Object>> page = dataService.getDataByDate(sensor, pointList, model, dayPerPage);
result.initFrom(page);
} else {
// 按全量取数据
OnePage<Map<String, Object>> page = dataService.getData(sensor, pointList, model);
result.initFrom(page);
}
for (ModevTypePoint point : pointList) {
List<Object> dataList = new ArrayList<>();

@ -0,0 +1,69 @@
package com.xydl.cac.util;
import java.util.*;
public class DataUtil {
// 从数据里每天抽取num条
public static List<Map<String, Object>> pickNumPerDay(List<Map<String, Object>> source, Integer numPerDay) throws Exception {
// 按天划分
LinkedHashMap<String, List<Map<String, Object>>> map = new LinkedHashMap<>();
for (Map<String, Object> item : source) {
String time = (String) item.get("acquisitionTime");
Date date = DateUtil.parse(time);
String day = DateUtil.format(date, "yyyy-MM-dd");
List<Map<String, Object>> list = map.get(day);
if (list == null) {
list = new ArrayList<>();
list.add(item);
map.put(day, list);
} else {
list.add(item);
}
}
// 过滤多余
for (List<Map<String, Object>> list : map.values()) {
if (list.size() > numPerDay) {
reduceOneDaySize(list, numPerDay);
}
}
// 合并返回
List<Map<String, Object>> result = new ArrayList<>();
for (List<Map<String, Object>> list : map.values()) {
result.addAll(list);
}
return result;
}
private static void reduceOneDaySize(List<Map<String, Object>> 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<Map<String, Object>> newlist = new ArrayList<>();
for (int i = 0; i < numPerDay; i++) {
int idx = m * (i + 1) - 1;
Map<String, Object> item = list.get(idx);
newlist.add(item);
}
list.clear();
list.addAll(newlist);
}
}
}

@ -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);
}
}

Loading…
Cancel
Save