|
@@ -5,17 +5,24 @@ import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.StopWatch;
|
|
import cn.hutool.core.date.StopWatch;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import jakarta.annotation.Resource;
|
|
import jakarta.annotation.Resource;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.lang3.time.DateUtils;
|
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
|
|
import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
|
|
|
|
+import vip.xiaonuo.auth.core.util.StpClientUtil;
|
|
import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
|
|
import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
|
|
|
|
+import vip.xiaonuo.coldchain.core.alarm.bean.DataTrendDto;
|
|
|
|
+import vip.xiaonuo.coldchain.core.alarm.bean.DataTrendMapperDto;
|
|
import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
|
|
import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
|
|
import vip.xiaonuo.coldchain.core.alarm.enums.SensorAlarmType;
|
|
import vip.xiaonuo.coldchain.core.alarm.enums.SensorAlarmType;
|
|
import vip.xiaonuo.coldchain.core.alarm.mapper.SensorAlarmMapper;
|
|
import vip.xiaonuo.coldchain.core.alarm.mapper.SensorAlarmMapper;
|
|
@@ -25,6 +32,7 @@ import vip.xiaonuo.coldchain.modular.app.param.MessageType;
|
|
import vip.xiaonuo.coldchain.modular.monitornotice.param.MonitorNoticePageParam;
|
|
import vip.xiaonuo.coldchain.modular.monitornotice.param.MonitorNoticePageParam;
|
|
import vip.xiaonuo.coldchain.modular.monitorsearchhistory.dto.TopWarningDto;
|
|
import vip.xiaonuo.coldchain.modular.monitorsearchhistory.dto.TopWarningDto;
|
|
import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
|
|
import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
|
|
|
|
+import vip.xiaonuo.common.exception.CommonException;
|
|
import vip.xiaonuo.common.page.CommonPageRequest;
|
|
import vip.xiaonuo.common.page.CommonPageRequest;
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
@@ -142,35 +150,150 @@ public class SensorAlarmServiceImpl extends ServiceImpl<SensorAlarmMapper, Senso
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public List<String> getAlarmTypeList(String type) {
|
|
public List<String> getAlarmTypeList(String type) {
|
|
|
|
+ // 1. 获取当前用户信息
|
|
SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
- LambdaQueryWrapper<SensorAlarm> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
- queryWrapper.eq(SensorAlarm::getCreateOrg, loginUser.getOrgId())
|
|
|
|
- .eq(SensorAlarm::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
|
|
|
|
|
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
- Calendar calendar = Calendar.getInstance();
|
|
|
|
- calendar.setTime(new Date());
|
|
|
|
- calendar.add(Calendar.MONTH, -2);
|
|
|
|
- queryWrapper.ge(SensorAlarm::getCreateTime,sdf.format(calendar.getTime()));
|
|
|
|
|
|
+ List<String> alarmTypeList = new ArrayList<>();
|
|
|
|
|
|
- if (type.equals("system")) {
|
|
|
|
- queryWrapper.and(q -> q.eq(SensorAlarm::getType, SensorAlarmType.SENSOR_OFF_LINE.getDeviceCode())
|
|
|
|
- .or().eq(SensorAlarm::getType, SensorAlarmType.SENSOR_ON_LINE.getDeviceCode()));
|
|
|
|
|
|
+ // 3. 根据类型添加条件
|
|
|
|
+ if ("system".equals(type)) {
|
|
|
|
+ alarmTypeList = sensorAlarmMapper.getAlarmTypeList(loginUser.getOrgId(),
|
|
|
|
+ SensorAlarmType.SENSOR_OFF_LINE.getDeviceCode(),
|
|
|
|
+ SensorAlarmType.SENSOR_ON_LINE.getDeviceCode(),
|
|
|
|
+ DateUtils.addMonths(new Date(), -1));
|
|
} else {
|
|
} else {
|
|
- queryWrapper.and(q -> q.eq(SensorAlarm::getType, SensorAlarmType.DATA_ALARM.getDeviceCode())
|
|
|
|
- .or().eq(SensorAlarm::getType, SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode()));
|
|
|
|
|
|
+ alarmTypeList = sensorAlarmMapper.getAlarmTypeList(loginUser.getOrgId(),
|
|
|
|
+ SensorAlarmType.DATA_ALARM.getDeviceCode(),
|
|
|
|
+ SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode(),
|
|
|
|
+ DateUtils.addMonths(new Date(), -1));
|
|
}
|
|
}
|
|
- queryWrapper.groupBy(SensorAlarm::getAlarmType);
|
|
|
|
- return list(queryWrapper).stream().map(SensorAlarm::getAlarmType).collect(Collectors.toList());
|
|
|
|
|
|
+
|
|
|
|
+ return alarmTypeList;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public List<TopWarningDto> topWarning(List<String> types) {
|
|
public List<TopWarningDto> topWarning(List<String> types) {
|
|
SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
|
|
+ Date time = DateUtils.addDays(new Date(), -7);
|
|
|
|
+ return getBaseMapper().getTop10Warning(loginUser.getOrgId(), types, time);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public DataTrendDto getLastWeekDataTrend(String type) {
|
|
|
|
+ SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
+ DataTrendDto dataTrendDto = new DataTrendDto();
|
|
|
|
+
|
|
|
|
+ // 获取最近一周的数据
|
|
Calendar calendar = Calendar.getInstance();
|
|
Calendar calendar = Calendar.getInstance();
|
|
- calendar.setTime(new Date());
|
|
|
|
- calendar.add(Calendar.DAY_OF_MONTH,-7);
|
|
|
|
- return getBaseMapper().getTop10Warning(loginUser.getOrgId(), types, calendar.getTime());
|
|
|
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
+ Date now = calendar.getTime();
|
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, -8);
|
|
|
|
+ Date lastWeek = calendar.getTime();
|
|
|
|
+
|
|
|
|
+ String alarmKeyword = null;
|
|
|
|
+ // 查询超标或过低数据
|
|
|
|
+ if (type.equals("1")) {
|
|
|
|
+ alarmKeyword = "超标";
|
|
|
|
+ } else if (type.equals("2")) {
|
|
|
|
+ alarmKeyword = "过低";
|
|
|
|
+ } else if (type.equals("3")) {
|
|
|
|
+ alarmKeyword = "电量过低";
|
|
|
|
+ } else if (type.equals("4")) {
|
|
|
|
+ alarmKeyword = "设备离线";
|
|
|
|
+ } else {
|
|
|
|
+ throw new CommonException("type参数错误");
|
|
|
|
+ }
|
|
|
|
+ List<DataTrendMapperDto> dataTrendMapperDtos = sensorAlarmMapper.countByType(
|
|
|
|
+ loginUser.getOrgId(), alarmKeyword, sdf.format(lastWeek), sdf.format(now));
|
|
|
|
+
|
|
|
|
+ // 按日期分组统计数据
|
|
|
|
+ Map<String, Map<String, Integer>> dateDataMap = new LinkedHashMap<>();
|
|
|
|
+
|
|
|
|
+ // 准备7天的日期列表(确保包含所有日期)
|
|
|
|
+ List<String> dateList = new ArrayList<>();
|
|
|
|
+ Calendar tempCal = Calendar.getInstance();
|
|
|
|
+ tempCal.setTime(DateUtils.addDays(lastWeek,1));
|
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
|
+ String dateStr = sdf.format(tempCal.getTime());
|
|
|
|
+ dateList.add(dateStr);
|
|
|
|
+ dateDataMap.put(dateStr, new HashMap<>());
|
|
|
|
+ tempCal.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 填充统计数据
|
|
|
|
+ boolean hasTemperature = false;
|
|
|
|
+ boolean hasHumidity = false;
|
|
|
|
+ boolean hasCo2 = false;
|
|
|
|
+ boolean hasBattery = false;
|
|
|
|
+ boolean hasOffline = false;
|
|
|
|
+
|
|
|
|
+ for (DataTrendMapperDto dto : dataTrendMapperDtos) {
|
|
|
|
+ String dateKey = dto.getAlarmTime().substring(0, 10);
|
|
|
|
+ String alarmType = dto.getAlarmType();
|
|
|
|
+ int count = dto.getAlarmCount() != null ? dto.getAlarmCount().intValue() : 0;
|
|
|
|
+
|
|
|
|
+ Map<String, Integer> typeCountMap = dateDataMap.getOrDefault(dateKey, new HashMap<>());
|
|
|
|
+
|
|
|
|
+ if (alarmType.contains("温度")) {
|
|
|
|
+ typeCountMap.put("temperature", typeCountMap.getOrDefault("temperature", 0) + count);
|
|
|
|
+ hasTemperature = true;
|
|
|
|
+ } else if (alarmType.contains("湿度")) {
|
|
|
|
+ typeCountMap.put("humidity", typeCountMap.getOrDefault("humidity", 0) + count);
|
|
|
|
+ hasHumidity = true;
|
|
|
|
+ } else if (alarmType.contains("二氧化碳") || alarmType.contains("CO2")) {
|
|
|
|
+ typeCountMap.put("co2", typeCountMap.getOrDefault("co2", 0) + count);
|
|
|
|
+ hasCo2 = true;
|
|
|
|
+ } else if (alarmType.contains("电量过低")) {
|
|
|
|
+ typeCountMap.put("battery", typeCountMap.getOrDefault("battery", 0) + count);
|
|
|
|
+ hasBattery = true;
|
|
|
|
+ } else if (alarmType.contains("设备离线")) {
|
|
|
|
+ typeCountMap.put("offline", typeCountMap.getOrDefault("offline", 0) + count);
|
|
|
|
+ hasOffline = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dateDataMap.put(dateKey, typeCountMap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 准备返回数据
|
|
|
|
+ List<String> xData = new ArrayList<>();
|
|
|
|
+ List<Integer> yData1 = hasTemperature ? new ArrayList<>() : Collections.emptyList();
|
|
|
|
+ List<Integer> yData2 = hasHumidity ? new ArrayList<>() : Collections.emptyList();
|
|
|
|
+ List<Integer> yData3 = hasCo2 ? new ArrayList<>() : Collections.emptyList();
|
|
|
|
+ List<Integer> yData4 = hasBattery ? new ArrayList<>() : Collections.emptyList();
|
|
|
|
+ List<Integer> yData5 = hasOffline ? new ArrayList<>() : Collections.emptyList();
|
|
|
|
+
|
|
|
|
+ // 按日期顺序填充数据
|
|
|
|
+ for (String date : dateList) {
|
|
|
|
+ xData.add(date);
|
|
|
|
+ Map<String, Integer> counts = dateDataMap.get(date);
|
|
|
|
+
|
|
|
|
+ if (hasTemperature) {
|
|
|
|
+ yData1.add(counts.getOrDefault("temperature", 0));
|
|
|
|
+ }
|
|
|
|
+ if (hasHumidity) {
|
|
|
|
+ yData2.add(counts.getOrDefault("humidity", 0));
|
|
|
|
+ }
|
|
|
|
+ if (hasCo2) {
|
|
|
|
+ yData3.add(counts.getOrDefault("co2", 0));
|
|
|
|
+ }
|
|
|
|
+ if (hasBattery) {
|
|
|
|
+ yData4.add(counts.getOrDefault("battery", 0));
|
|
|
|
+ }
|
|
|
|
+ if (hasOffline) {
|
|
|
|
+ yData5.add(counts.getOrDefault("offline", 0));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 设置返回对象
|
|
|
|
+ dataTrendDto.setXData(xData);
|
|
|
|
+ dataTrendDto.setTemperatureData(yData1);
|
|
|
|
+ dataTrendDto.setHumidityData(yData2);
|
|
|
|
+ dataTrendDto.setCo2Data(yData3);
|
|
|
|
+ dataTrendDto.setBatteryData(yData4);
|
|
|
|
+ dataTrendDto.setOfflineData(yData5);
|
|
|
|
+
|
|
|
|
+ return dataTrendDto;
|
|
}
|
|
}
|
|
|
|
|
|
public Page<SensorAlarm> getSensorAlarmPage(MessagePageParam messagePageParam) {
|
|
public Page<SensorAlarm> getSensorAlarmPage(MessagePageParam messagePageParam) {
|
|
@@ -209,37 +332,56 @@ public class SensorAlarmServiceImpl extends ServiceImpl<SensorAlarmMapper, Senso
|
|
if (StrUtil.isNotBlank(messagePageParam.getAlarmType())) {
|
|
if (StrUtil.isNotBlank(messagePageParam.getAlarmType())) {
|
|
queryWrapper.lambda().eq(SensorAlarm::getAlarmType, messagePageParam.getAlarmType());
|
|
queryWrapper.lambda().eq(SensorAlarm::getAlarmType, messagePageParam.getAlarmType());
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
if (StrUtil.isNotBlank(messagePageParam.getEndTime()) && StrUtil.isNotBlank(messagePageParam.getStartTime())) {
|
|
if (StrUtil.isNotBlank(messagePageParam.getEndTime()) && StrUtil.isNotBlank(messagePageParam.getStartTime())) {
|
|
queryWrapper.lambda().ge(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getStartTime(), "yyyy-MM-dd HH:mm:ss")); // greater than or equal to start time
|
|
queryWrapper.lambda().ge(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getStartTime(), "yyyy-MM-dd HH:mm:ss")); // greater than or equal to start time
|
|
queryWrapper.lambda().le(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getEndTime(), "yyyy-MM-dd HH:mm:ss")); // greater than or equal to start time
|
|
queryWrapper.lambda().le(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getEndTime(), "yyyy-MM-dd HH:mm:ss")); // greater than or equal to start time
|
|
} else {
|
|
} else {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
- Calendar calendar = Calendar.getInstance();
|
|
|
|
calendar.setTime(new Date());
|
|
calendar.setTime(new Date());
|
|
- calendar.add(Calendar.MONTH, -2);
|
|
|
|
|
|
+ calendar.add(Calendar.MONTH, -1);
|
|
queryWrapper.lambda().ge(SensorAlarm::getCreateTime,sdf.format(calendar.getTime()));
|
|
queryWrapper.lambda().ge(SensorAlarm::getCreateTime,sdf.format(calendar.getTime()));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ Date time = DateUtils.addMonths(new Date(), -1);
|
|
|
|
+
|
|
|
|
+ Date startTime = StringUtils.isNotBlank(messagePageParam.getStartTime())
|
|
|
|
+ ? DateUtil.parse(messagePageParam.getStartTime(), "yyyy-MM-dd HH:mm:ss")
|
|
|
|
+ : time;
|
|
|
|
+
|
|
|
|
+ Date endTime = StringUtils.isNotBlank(messagePageParam.getEndTime())
|
|
|
|
+ ? DateUtil.parse(messagePageParam.getEndTime(), "yyyy-MM-dd HH:mm:ss")
|
|
|
|
+ : null;
|
|
|
|
+
|
|
|
|
+ long count = sensorAlarmMapper.countInPage(orgId, typeCodes, startTime, endTime);
|
|
|
|
+
|
|
// 按创建时间降序排序
|
|
// 按创建时间降序排序
|
|
- queryWrapper.lambda().orderByDesc(SensorAlarm::getCreateTime);
|
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(SensorAlarm::getCreateTime).last("limit " + messagePageParam.getSize() * (messagePageParam.getCurrent() - 1) + "," + messagePageParam.getSize() * messagePageParam.getCurrent());
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ List<SensorAlarm> ids = list(queryWrapper);
|
|
// 执行查询,传入分页对象
|
|
// 执行查询,传入分页对象
|
|
- Page<Object> page = CommonPageRequest.defaultPage();
|
|
|
|
|
|
+ Page<SensorAlarm> page = CommonPageRequest.defaultPage();
|
|
page.setOptimizeCountSql(false);
|
|
page.setOptimizeCountSql(false);
|
|
page.setSearchCount(false);
|
|
page.setSearchCount(false);
|
|
- page.setTotal(count(queryWrapper));
|
|
|
|
- Page<SensorAlarm> sensorAlarmPage = this.page(CommonPageRequest.defaultPage(), queryWrapper).setOptimizeCountSql(false);
|
|
|
|
|
|
+ page.setTotal(count);
|
|
|
|
+ page.setCurrent(messagePageParam.getCurrent());
|
|
|
|
+ page.setSize(messagePageParam.getSize());
|
|
|
|
+ page.setRecords(ids);
|
|
|
|
+// Page<SensorAlarm> sensorAlarmPage = this.page(CommonPageRequest.defaultPage(), queryWrapper).setOptimizeCountSql(false);
|
|
stopWatch.stop();
|
|
stopWatch.stop();
|
|
|
|
|
|
List<SensorAlarm> sensorAlarms = new ArrayList<>();
|
|
List<SensorAlarm> sensorAlarms = new ArrayList<>();
|
|
- if (sensorAlarmPage.getRecords().isEmpty()) {
|
|
|
|
- return sensorAlarmPage;
|
|
|
|
|
|
+ if (page.getRecords().isEmpty()) {
|
|
|
|
+ return page;
|
|
} else {
|
|
} else {
|
|
- sensorAlarms = listByIds(sensorAlarmPage.getRecords().stream().map(SensorAlarm::getId).collect(Collectors.toList()));
|
|
|
|
|
|
+ sensorAlarms = listByIds(page.getRecords().stream().map(SensorAlarm::getId).collect(Collectors.toList()));
|
|
}
|
|
}
|
|
- sensorAlarmPage.setRecords(sensorAlarms);
|
|
|
|
|
|
+ page.setRecords(sensorAlarms);
|
|
|
|
|
|
log.info(stopWatch.prettyPrint(TimeUnit.MILLISECONDS));
|
|
log.info(stopWatch.prettyPrint(TimeUnit.MILLISECONDS));
|
|
- return sensorAlarmPage;
|
|
|
|
|
|
+ return page;
|
|
}
|
|
}
|
|
|
|
|
|
private Message convertToMessage(SensorAlarm sensorAlarm) {
|
|
private Message convertToMessage(SensorAlarm sensorAlarm) {
|