Commit 59473888 LN

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

1 个父辈 da6649eb
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<description>SMF project for Spring Boot</description> <description>SMF project for Spring Boot</description>
<properties> <properties>
<maven.build.timestamp.format>M.ddHHmm</maven.build.timestamp.format> <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> <app.version>${main.version}</app.version>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<jjwt.version>0.11.1</jjwt.version> <jjwt.version>0.11.1</jjwt.version>
......
...@@ -22,6 +22,7 @@ import com.neotel.smfcore.core.device.enums.OP; ...@@ -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.enums.OP_STATUS;
import com.neotel.smfcore.core.device.handler.IDeviceHandler; import com.neotel.smfcore.core.device.handler.IDeviceHandler;
import com.neotel.smfcore.core.device.util.DataCache; 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.manager.IInOutDataManager;
import com.neotel.smfcore.core.inout.service.po.InOutData; import com.neotel.smfcore.core.inout.service.po.InOutData;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
...@@ -895,6 +896,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -895,6 +896,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
if(ObjectUtil.isNotEmpty(statusBean.msgList)&& statusBean.msgList.size()>0) { if(ObjectUtil.isNotEmpty(statusBean.msgList)&& statusBean.msgList.size()>0) {
DevicesStatusUtil.updateClientMsg(statusBean.getCid(), statusBean.msgList); DevicesStatusUtil.updateClientMsg(statusBean.getCid(), statusBean.msgList);
} }
DeviceStateDurationUtil.onStatusUpdate(statusBean);
// //判断是否刚刚上线 // //判断是否刚刚上线
// StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid()); // 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.equipment.handler.impl; package com.neotel.smfcore.core.equipment.handler.impl;
import cn.hutool.core.util.ObjectUtil; 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.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean; import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.enums.EquipmentType; import com.neotel.smfcore.core.equipment.enums.EquipmentType;
...@@ -87,6 +88,7 @@ public class BaseEquipHandler implements IEquipmentHandler { ...@@ -87,6 +88,7 @@ public class BaseEquipHandler implements IEquipmentHandler {
EquipStatusUtil.updateStatusBean(statusBean); EquipStatusUtil.updateStatusBean(statusBean);
DeviceStateDurationUtil.onEquipStatusUpdate(statusBean);
} catch (Exception e) { } catch (Exception e) {
log.error("客户端故障消息处理出错", e); log.error("客户端故障消息处理出错", e);
} }
......
...@@ -23,6 +23,10 @@ public class Equipment extends BasePo implements Serializable { ...@@ -23,6 +23,10 @@ public class Equipment extends BasePo implements Serializable {
*/ */
private String type = EquipmentType.AUTO.name(); private String type = EquipmentType.AUTO.name();
/** /**
* 1=设备联机 2=急停,3=故障,4=警告,5=调试,6=忙碌中
*/
private int status=0;
/**
* 是否可用 * 是否可用
*/ */
private boolean available = true; private boolean available = true;
......
...@@ -6,6 +6,8 @@ import com.neotel.smfcore.common.utils.SecurityUtils; ...@@ -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.MsgInfo;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS; 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.enums.MessageType;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -254,6 +256,7 @@ public class DevicesStatusUtil { ...@@ -254,6 +256,7 @@ public class DevicesStatusUtil {
if (bean.getOfflineTime() == -1 && (bean.timeOut()||bean.getStatus()== BOX_STATUS.OFFLINE)) { if (bean.getOfflineTime() == -1 && (bean.timeOut()||bean.getStatus()== BOX_STATUS.OFFLINE)) {
bean.setOfflineTime(System.currentTimeMillis()); bean.setOfflineTime(System.currentTimeMillis());
DeviceMessageUtil.addOfflineMessage(bean.getCid(), ""); DeviceMessageUtil.addOfflineMessage(bean.getCid(), "");
DeviceStateDurationUtil.deviceOffline(bean.getCid(), DeviceSKind.EQUIPMENT);
} }
} }
} }
......
...@@ -3,11 +3,12 @@ package com.neotel.smfcore.core.system.util; ...@@ -3,11 +3,12 @@ package com.neotel.smfcore.core.system.util;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Maps; 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.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.system.bean.MesInfoDto; import com.neotel.smfcore.core.system.bean.MesInfoDto;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.*; import java.util.*;
@Slf4j @Slf4j
...@@ -75,6 +76,7 @@ public class EquipStatusUtil { ...@@ -75,6 +76,7 @@ public class EquipStatusUtil {
if (bean.getOfflineTime() == -1 && bean.timeOut()) { if (bean.getOfflineTime() == -1 && bean.timeOut()) {
bean.setOfflineTime(System.currentTimeMillis()); bean.setOfflineTime(System.currentTimeMillis());
DeviceMessageUtil.addOfflineMessage(bean.getCid(), ""); DeviceMessageUtil.addOfflineMessage(bean.getCid(), "");
DeviceStateDurationUtil.deviceOffline(bean.getCid(), DeviceSKind.EQUIPMENT);
} }
} }
} }
......
...@@ -71,6 +71,7 @@ public class Micron1053Menu { ...@@ -71,6 +71,7 @@ public class Micron1053Menu {
MenuInit.addMenu(menuLabel,pMenuReport,203, "ErrorLog","errorLog", "report/errorLog/index","errorLog"); 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,204, "ErrorReport","errorReport", "report/errorReport/index","errorReport");
MenuInit.addMenu(menuLabel,pMenuReport,205, "EventLog","eventLog", "report/eventLog/index","eventlog"); MenuInit.addMenu(menuLabel,pMenuReport,205, "EventLog","eventLog", "report/eventLog/index","eventlog");
MenuInit.addMenu(menuLabel,pMenuReport,206, "DeviceSChart","deviceSChart", "report/deviceSChart/index","deviceSChart");
//Help //Help
MenuInit.addMenu(menuLabel,null,999, "Help","helps", "help/helps/index","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; ...@@ -10,6 +10,10 @@ import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; 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.language.util.MessageUtils;
import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto; import com.neotel.smfcore.core.message.rest.bean.dto.MessageDto;
import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto; import com.neotel.smfcore.core.message.rest.bean.dto.MsgCountDto;
...@@ -17,8 +21,10 @@ import com.neotel.smfcore.core.message.rest.bean.mapstruct.MessageMapper; ...@@ -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.rest.bean.query.MessageCriteria;
import com.neotel.smfcore.core.message.service.manager.IMessageManager; import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message; 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.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; 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.custom.micron1053.bean.dto.DeviceUtilizationDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -55,6 +61,13 @@ public class MicronReportController { ...@@ -55,6 +61,13 @@ public class MicronReportController {
private IMessageManager messageManager; private IMessageManager messageManager;
@Autowired @Autowired
private MessageMapper messageMapper; private MessageMapper messageMapper;
@Autowired
private IDeviceStateDurationManager deviceStateDurationManager;
@Autowired
private EquipmentCache equipmentCache;
@ApiOperation("utilization:获取数据列表") @ApiOperation("utilization:获取数据列表")
@GetMapping("/utilization") @GetMapping("/utilization")
@AnonymousAccess @AnonymousAccess
...@@ -344,4 +357,94 @@ public class MicronReportController { ...@@ -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!