Commit 59473888 LN

增加设备状态统计报表:DeviceStateChartDto

1 个父辈 da6649eb
......@@ -16,7 +16,7 @@
<description>SMF project for Spring Boot</description>
<properties>
<maven.build.timestamp.format>M.ddHHmm</maven.build.timestamp.format>
<main.version>5.${maven.build.timestamp}</main.version>
<main.version>6.${maven.build.timestamp}</main.version>
<app.version>${main.version}</app.version>
<java.version>1.8</java.version>
<jjwt.version>0.11.1</jjwt.version>
......
......@@ -22,6 +22,7 @@ import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.deviceState.util.DeviceStateDurationUtil;
import com.neotel.smfcore.core.inout.service.manager.IInOutDataManager;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import com.neotel.smfcore.core.language.util.MessageUtils;
......@@ -895,6 +896,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
if(ObjectUtil.isNotEmpty(statusBean.msgList)&& statusBean.msgList.size()>0) {
DevicesStatusUtil.updateClientMsg(statusBean.getCid(), statusBean.msgList);
}
DeviceStateDurationUtil.onStatusUpdate(statusBean);
// //判断是否刚刚上线
// StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid());
......
package com.neotel.smfcore.core.deviceState.enums;
public class DeviceSKind {
/**
* 设备类型=料仓
*/
public static final String STORAGE = "STORAGE";
/**
* 设备类型=其他设备
*/
public static final String EQUIPMENT = "EQUIPMENT";
/**
* 离线
*/
public static final String OFFLINE = "OFFLINE";
/**
* 设备状态=在线空闲
*/
public static final String IDLE = "IDLE";
/**
* 设备状态=报警中
*/
public static final String ALARM = "ALARM";
/**
* 设备状态=忙碌运行中
*/
public static final String BUSY = "BUSY";
}
package com.neotel.smfcore.core.deviceState.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IDeviceStateDurationDao extends IBaseDao {
}
package com.neotel.smfcore.core.deviceState.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.deviceState.service.dao.IDeviceStateDurationDao;
import com.neotel.smfcore.core.deviceState.service.po.DeviceStateDuration;
import org.springframework.stereotype.Service;
@Service
public class DeviceStateDurationDaoImpl extends AbstractBaseDao implements IDeviceStateDurationDao {
@Override
public Class getEntityClass() {
return DeviceStateDuration.class;
}
}
package com.neotel.smfcore.core.deviceState.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.deviceState.service.po.DeviceStateDuration;
public interface IDeviceStateDurationManager extends IBaseManager<DeviceStateDuration> {
/**
* 根据CID和设备类型查询最后一条记录(按startTime倒序)
*/
DeviceStateDuration findLastByCidAndType(String cid, String type);
}
package com.neotel.smfcore.core.deviceState.service.manager.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.deviceState.service.dao.IDeviceStateDurationDao;
import com.neotel.smfcore.core.deviceState.service.manager.IDeviceStateDurationManager;
import com.neotel.smfcore.core.deviceState.service.po.DeviceStateDuration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class DeviceStateDurationManagerImpl implements IDeviceStateDurationManager {
@Autowired
private IDeviceStateDurationDao deviceStateDurationDao;
@Override
public DeviceStateDuration get(String id) {
return deviceStateDurationDao.findOneById(id);
}
@Override
public DeviceStateDuration save(DeviceStateDuration object) throws ValidateException {
return deviceStateDurationDao.save(object);
}
@Override
public void delete(DeviceStateDuration object) throws ValidateException {
deviceStateDurationDao.removeOneById(object.getId());
}
@Override
public PageData<DeviceStateDuration> findByPage(Query query, Pageable pageable) {
int totalCount = deviceStateDurationDao.countByQuery(query);
List<DeviceStateDuration> list = deviceStateDurationDao.findByQuery(query, pageable);
return new PageData<>(list, totalCount);
}
@Override
public List<DeviceStateDuration> findByQuery(Query query) {
return deviceStateDurationDao.findByQuery(query);
}
@Override
public DeviceStateDuration findLastByCidAndType(String cid, String type) {
Query q = new Query(Criteria.where("cid").is(cid).and("deviceType").is(type));
q.with(Sort.by(Sort.Direction.DESC, "createDate"));
return deviceStateDurationDao.findOne(q);
}
}
package com.neotel.smfcore.core.deviceState.service.po;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Data
@Document
public class DeviceStateDuration extends BasePo {
/**
* 区分设备类型:STORAGE=料仓,EQUIPMENT=其他设备
*/
private String deviceType;
/**
* 设备唯一标识(料仓或其他设备的CID)
*/
private String cid;
/**
* 归类后的状态:OFFLINE/IDLE/ALARM/RUN
*/
private String deviceS;
/**
* 状态开始时间
*/
private Date startTime;
/**
* 状态结束时间(切片结束时写入;当前进行中的切片为null)
*/
private Date endTime;
/**
* 持续时长(毫秒)。进行中的切片为0
*/
private long durationMs;
/**
* 天维度归档(去掉时分秒的日期,用于日统计)
*/
private Date day;
}
package com.neotel.smfcore.core.deviceState.util;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.deviceState.enums.DeviceSKind;
import com.neotel.smfcore.core.deviceState.service.manager.IDeviceStateDurationManager;
import com.neotel.smfcore.core.deviceState.service.po.DeviceStateDuration;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.text.ParseException;
import java.util.*;
@Slf4j
@Component
public class DeviceStateDurationUtil {
//柏拉图显示数据:
//忙碌时间,空闲时间,宕机时间
private static IDeviceStateDurationManager deviceStateDurationManager;
private static List<DeviceStateDuration> lastStorageStatusMap = new ArrayList<>();
@Autowired
public void setDeviceStateDurationManager(IDeviceStateDurationManager manager) {
DeviceStateDurationUtil.deviceStateDurationManager = manager;
}
public static void deviceOffline(String cid,String dType) {
ProcessState(cid,dType, DeviceSKind.OFFLINE );
}
/**
* 料仓状态更新入口(来自 StatusBean)
*/
public static void onStatusUpdate(StatusBean statusBean) {
try {
if (statusBean == null) {
return;
}
String cid = statusBean.getCid();
String newStatus = GetStorageState(statusBean);
ProcessState(cid, DeviceSKind.STORAGE, newStatus);
} catch (Exception ex) {
log.error("onStatusUpdate error :"+ex.toString());
}
}
/**
* 其他设备状态更新入口(来自 EquipStatusBean)
*/
public static void onEquipStatusUpdate(EquipStatusBean statusBean) {
try {
if (statusBean == null) {
return;
}
String cid = statusBean.getCid();
String newStatus = GetEquipState(statusBean);
ProcessState(cid, DeviceSKind.EQUIPMENT,newStatus);
} catch (Exception ex) {
log.error("onEquipStatusUpdate error :"+ex.toString());
}
}
private static void ProcessState(String cid,String dType,String newStatus) {
try {
synchronized (lastStorageStatusMap) {
DeviceStateDuration currentDuration = null;
// 1. 从集合中查找
for (DeviceStateDuration d : lastStorageStatusMap) {
if (cid.equals(d.getCid()) && d.getDeviceType() == dType) {
currentDuration = d;
break;
}
}
// 2. 集合中未找到,从数据库查找
if (currentDuration == null) {
currentDuration = deviceStateDurationManager.findLastByCidAndType(cid, dType);
if (currentDuration != null) {
// 找到后加入集合
lastStorageStatusMap.add(currentDuration);
}
}
long now = System.currentTimeMillis();
// 3. 处理状态
if (currentDuration == null) {
//如果当前离线,不需要保存
if (newStatus.equals(DeviceSKind.OFFLINE)) {
return;
}
// 无历史记录,创建初始切片
DeviceStateDuration newSlice = createOpenSliceObj(cid, newStatus, now, dType);
lastStorageStatusMap.add(newSlice);
deviceStateDurationManager.save(newSlice);
} else {
//判断上个状态是否已经闭合
boolean preIsClosed = currentDuration.getDurationMs() > 0;
// 对比状态
if (currentDuration.getDeviceS() == newStatus && (!preIsClosed)) {
// 状态相同,暂不处理
return;
}
String msg = "";
if (!preIsClosed) {
closeSlice(currentDuration, now);
deviceStateDurationManager.save(currentDuration);
String sTime = DateUtil.toDateTimeString(currentDuration.getStartTime());
String eTime = DateUtil.toDateTimeString(currentDuration.getEndTime());
msg = dType + ",cid=" + cid + ", 旧状态 " + currentDuration.getDeviceS() + "持续时间:" + sTime + "->" + eTime + " ,共 " + currentDuration.getDurationMs() + "ms 新状态=" + newStatus;
}
if (newStatus.equals(DeviceSKind.OFFLINE)) {
// msg = msg + " 不需要保存";
} else {
DeviceStateDuration newSlice = createOpenSliceObj(cid, newStatus, now, dType);
deviceStateDurationManager.save(newSlice);
lastStorageStatusMap.remove(currentDuration);
lastStorageStatusMap.add(newSlice);
msg = msg + " 开始时间" + DateUtil.toDateTimeString(newSlice.getStartTime());
}
if (ObjectUtil.isNotEmpty(msg)) {
log.info("ProcessState" + msg);
}
}
}
} catch (Exception ex) {
log.error("ProcessState " + cid + "," + dType + "," + newStatus + " error :" + ex.toString());
}
}
private static DeviceStateDuration createOpenSliceObj(String cid, String state, long start, String type) throws ParseException {
DeviceStateDuration d = new DeviceStateDuration();
d.setDeviceType(type);
d.setCid(cid);
d.setDeviceS(state);
Date startDate = new Date(start);
d.setStartTime(startDate);
d.setEndTime(null);
d.setDurationMs(0);
d.setDay(DateUtil.toDate(DateUtil.toDateString(startDate)));
return d;
}
private static void closeSlice(DeviceStateDuration d, long end) {
try {
if (d == null) return;
Date endDate = new Date(end);
Date startDate = d.getStartTime();
if (startDate == null) {
d.setEndTime(endDate);
d.setDurationMs(0);
deviceStateDurationManager.save(d);
return;
}
Date startDay = DateUtil.toDate(DateUtil.toDateString(startDate));
Date endDay = DateUtil.toDate(DateUtil.toDateString(endDate));
if (startDay.equals(endDay)) {
d.setEndTime(endDate);
long duration = endDate.getTime() - startDate.getTime();
d.setDurationMs(Math.max(duration, 0));
deviceStateDurationManager.save(d);
return;
}
Date firstEnd = DateUtil.addOneDayNoTime(startDay);
d.setEndTime(firstEnd);
long firstDuration = firstEnd.getTime() - startDate.getTime();
d.setDurationMs(Math.max(firstDuration, 0));
deviceStateDurationManager.save(d);
Date cursorDay = DateUtil.addDays(startDay, 1);
while (cursorDay.before(endDay)) {
DeviceStateDuration mid = new DeviceStateDuration();
mid.setDeviceType(d.getDeviceType());
mid.setCid(d.getCid());
mid.setDeviceS(d.getDeviceS());
Date midStart = cursorDay;
Date midEnd = DateUtil.addOneDayNoTime(cursorDay);
mid.setStartTime(midStart);
mid.setEndTime(midEnd);
mid.setDurationMs(Math.max(midEnd.getTime() - midStart.getTime(), 0));
mid.setDay(cursorDay);
deviceStateDurationManager.save(mid);
cursorDay = DateUtil.addDays(cursorDay, 1);
}
DeviceStateDuration last = new DeviceStateDuration();
last.setDeviceType(d.getDeviceType());
last.setCid(d.getCid());
last.setDeviceS(d.getDeviceS());
Date lastStart = endDay;
last.setStartTime(lastStart);
last.setEndTime(endDate);
long lastDuration = endDate.getTime() - lastStart.getTime();
last.setDurationMs(Math.max(lastDuration, 0));
last.setDay(endDay);
deviceStateDurationManager.save(last);
} catch (Exception exception) {
log.error("closeSlice error :" + exception.toString());
}
}
/**
* 将原始状态码映射为归类状态(OFFLINE/ALARM/IDLE/RUN)
*/
public static String GetEquipState(EquipStatusBean equipment) {
int state = equipment.getStatus();
if (state <= BOX_STATUS.OFFLINE) {
return DeviceSKind.OFFLINE;
}
//1=设备联机 2=急停,3=故障,4=警告,5=调试,6=忙碌中
if (state == 2
|| state == 3
|| state == 4) {
return DeviceSKind.ALARM;
} else if (state == 6) {
return DeviceSKind.BUSY;
} else {
return DeviceSKind.IDLE;
}
}
/**
* 将原始状态码映射为归类状态(OFFLINE/ALARM/IDLE/RUN)
*/
public static String GetStorageState(StatusBean statusBean) {
int state = statusBean.getStatus();
if (state <= BOX_STATUS.OFFLINE) {
return DeviceSKind.OFFLINE;
} else if (state == BOX_STATUS.EMERGENCY
|| state == BOX_STATUS.PROBLEM
|| state == BOX_STATUS.WARNING
|| state == BOX_STATUS.PROBLEM) {
return DeviceSKind.ALARM;
} else if (state == BOX_STATUS.READY || state == BOX_STATUS.DEBUG || state == BOX_STATUS.RESET) {
return DeviceSKind.IDLE;
} else {
return DeviceSKind.BUSY;
}
}
/**
* 服务器启动:关闭历史进行中切片,并为所有设备创建 OFFLINE 进行中切片
*/
@PostConstruct
public void onStartup() {
log.error("onStartup closeOpenSlices ");
closeOpenSlices(new Date());
}
/**
* 服务器关闭:补齐所有进行中切片的结束时间与时长
*/
@PreDestroy
public void onShutdown() {
log.error("onShutdown closeOpenSlices ");
closeOpenSlices(new Date());
}
/**
* 关闭所有进行中切片(endTime 为 null 的记录)
*/
private void closeOpenSlices(Date now) {
try {
Query query = new Query(Criteria.where("endTime").is(null));
for (DeviceStateDuration d : deviceStateDurationManager.findByQuery(query)) {
d.setEndTime(now);
if (d.getStartTime() != null) {
d.setDurationMs(now.getTime() - d.getStartTime().getTime());
} else {
d.setDurationMs(0);
}
deviceStateDurationManager.save(d);
String sTime = DateUtil.toDateTimeString(d.getStartTime());
String eTime = DateUtil.toDateTimeString(d.getEndTime());
log.info("closeOpenSlices: " + d.getDeviceType() + ",cid=" + d.getCid() + ", " + d.getDeviceS() + "持续时间:" + sTime + "->" + eTime + " ,共 " + d.getDurationMs() + "ms ");
}
} catch (Exception ex) {
log.error("closeOpenSlices error: {}", ex.toString());
}
}
}
package com.neotel.smfcore.core.equipment.handler.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.deviceState.util.DeviceStateDurationUtil;
import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
......@@ -87,6 +88,7 @@ public class BaseEquipHandler implements IEquipmentHandler {
EquipStatusUtil.updateStatusBean(statusBean);
DeviceStateDurationUtil.onEquipStatusUpdate(statusBean);
} catch (Exception e) {
log.error("客户端故障消息处理出错", e);
}
......
......@@ -23,6 +23,10 @@ public class Equipment extends BasePo implements Serializable {
*/
private String type = EquipmentType.AUTO.name();
/**
* 1=设备联机 2=急停,3=故障,4=警告,5=调试,6=忙碌中
*/
private int status=0;
/**
* 是否可用
*/
private boolean available = true;
......
......@@ -6,6 +6,8 @@ import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.device.bean.MsgInfo;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.deviceState.enums.DeviceSKind;
import com.neotel.smfcore.core.deviceState.util.DeviceStateDurationUtil;
import com.neotel.smfcore.core.message.enums.MessageType;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import lombok.extern.slf4j.Slf4j;
......@@ -254,6 +256,7 @@ public class DevicesStatusUtil {
if (bean.getOfflineTime() == -1 && (bean.timeOut()||bean.getStatus()== BOX_STATUS.OFFLINE)) {
bean.setOfflineTime(System.currentTimeMillis());
DeviceMessageUtil.addOfflineMessage(bean.getCid(), "");
DeviceStateDurationUtil.deviceOffline(bean.getCid(), DeviceSKind.EQUIPMENT);
}
}
}
......
......@@ -3,11 +3,12 @@ package com.neotel.smfcore.core.system.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Maps;
import com.neotel.smfcore.core.deviceState.enums.DeviceSKind;
import com.neotel.smfcore.core.deviceState.util.DeviceStateDurationUtil;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.system.bean.MesInfoDto;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
@Slf4j
......@@ -75,6 +76,7 @@ public class EquipStatusUtil {
if (bean.getOfflineTime() == -1 && bean.timeOut()) {
bean.setOfflineTime(System.currentTimeMillis());
DeviceMessageUtil.addOfflineMessage(bean.getCid(), "");
DeviceStateDurationUtil.deviceOffline(bean.getCid(), DeviceSKind.EQUIPMENT);
}
}
}
......
......@@ -71,6 +71,7 @@ public class Micron1053Menu {
MenuInit.addMenu(menuLabel,pMenuReport,203, "ErrorLog","errorLog", "report/errorLog/index","errorLog");
MenuInit.addMenu(menuLabel,pMenuReport,204, "ErrorReport","errorReport", "report/errorReport/index","errorReport");
MenuInit.addMenu(menuLabel,pMenuReport,205, "EventLog","eventLog", "report/eventLog/index","eventlog");
MenuInit.addMenu(menuLabel,pMenuReport,206, "DeviceSChart","deviceSChart", "report/deviceSChart/index","deviceSChart");
//Help
MenuInit.addMenu(menuLabel,null,999, "Help","helps", "help/helps/index","help");
......
package com.neotel.smfcore.custom.micron1053.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeviceStateChartDto implements Serializable {
@ApiModelProperty("设备名称")
private String deviceName;
@ApiModelProperty("设备CID")
private String cid;
@ApiModelProperty("日期/天")
private Date day;
@ApiModelProperty("当天空闲时间/毫秒")
private long idleMS;
@ApiModelProperty("当天忙碌时间/毫秒")
private long busyMs;
@ApiModelProperty("当天报警时间/毫秒")
private long alarmMs;
}
......@@ -10,6 +10,10 @@ import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.deviceState.service.manager.IDeviceStateDurationManager;
import com.neotel.smfcore.core.deviceState.service.po.DeviceStateDuration;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
import com.neotel.smfcore.core.equipment.util.EquipmentCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
......@@ -17,8 +21,10 @@ import com.neotel.smfcore.core.message.rest.bean.mapstruct.MessageMapper;
import com.neotel.smfcore.core.message.rest.bean.query.MessageCriteria;
import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.report.rest.query.ReportQuery;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.micron1053.bean.dto.DeviceStateChartDto;
import com.neotel.smfcore.custom.micron1053.bean.dto.DeviceUtilizationDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
......@@ -55,6 +61,13 @@ public class MicronReportController {
private IMessageManager messageManager;
@Autowired
private MessageMapper messageMapper;
@Autowired
private IDeviceStateDurationManager deviceStateDurationManager;
@Autowired
private EquipmentCache equipmentCache;
@ApiOperation("utilization:获取数据列表")
@GetMapping("/utilization")
@AnonymousAccess
......@@ -344,4 +357,94 @@ public class MicronReportController {
}
@ApiOperation("设备状态柏拉图:忙碌时间,空闲时间,宕机时间")
@GetMapping("/deviceStateChart")
@AnonymousAccess
public List<DeviceStateChartDto> deviceStateChart(ReportQuery query,HttpServletRequest servletRequest) {
return getDeviceStateChartList(query,servletRequest.getLocale());
}
private List<DeviceStateChartDto> getDeviceStateChartList(ReportQuery reportQuery,Locale locale) {
List<DeviceStateChartDto> dtos = new ArrayList<>();
try {
Calendar time = Calendar.getInstance();
time.setTime(new Date());
time.add(Calendar.DAY_OF_YEAR, -6);
Date startDay = DateUtil.toDate(DateUtil.toDateString(time.getTime()));
Date endDay = DateUtil.toDate(DateUtil.toDateString(new Date()));
//根据查询条件返回数据
if(reportQuery.getUpdateDate()!=null&&reportQuery.getUpdateDate().getFrom()!=null) {
startDay = reportQuery.getUpdateDate().getFrom();
}
if(reportQuery.getUpdateDate()!=null&&reportQuery.getUpdateDate().getTo()!=null) {
endDay = reportQuery.getUpdateDate().getTo();
}
Criteria criteria = Criteria.where("day").gte(startDay).lte(endDay);
Query query = new Query(criteria);
if(reportQuery.getCidList()!=null){
query.addCriteria(Criteria.where("cid").in(reportQuery.getCidList()));
}
List<DeviceStateDuration> list = deviceStateDurationManager.findByQuery(query);
Map<String, Map<Date, DeviceStateChartDto>> resultMap = new HashMap<>();
for (DeviceStateDuration d : list) {
String cid = d.getCid();
Date day = d.getDay();
Map<Date, DeviceStateChartDto> dayMap = resultMap.get(cid);
if (dayMap == null) {
dayMap = new HashMap<>();
resultMap.put(cid, dayMap);
}
DeviceStateChartDto dto = dayMap.get(day);
if (dto == null) {
String deviceName = cid;
Storage storage = dataCache.getStorage(cid);
if (storage != null) {
deviceName = storage.getName();
} else {
Equipment eq = equipmentCache.getEquipment(cid);
if (eq != null) {
deviceName = eq.getName();
}
}
dto = new DeviceStateChartDto(deviceName, cid, day, 0L, 0L, 0L);
dayMap.put(day, dto);
}
long ms = d.getDurationMs();
String s = d.getDeviceS();
if (com.neotel.smfcore.core.deviceState.enums.DeviceSKind.IDLE.equals(s)) {
dto.setIdleMS(dto.getIdleMS() + ms);
} else if (com.neotel.smfcore.core.deviceState.enums.DeviceSKind.BUSY.equals(s)) {
dto.setBusyMs(dto.getBusyMs() + ms);
} else if (com.neotel.smfcore.core.deviceState.enums.DeviceSKind.ALARM.equals(s)) {
dto.setAlarmMs(dto.getAlarmMs() + ms);
}
}
for (Map<Date, DeviceStateChartDto> m : resultMap.values()) {
dtos.addAll(m.values());
}
Collections.sort(dtos, new Comparator<DeviceStateChartDto>() {
@Override
public int compare(DeviceStateChartDto o1, DeviceStateChartDto o2) {
int c = o1.getDay().compareTo(o2.getDay());
if (c != 0) return c;
return o1.getDeviceName().compareTo(o2.getDeviceName());
}
});
} catch (Exception exception) {
log.error(exception.toString());
}
return dtos;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!