package org.jeecg.modules.mdc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.system.vo.DictModel; import org.jeecg.modules.mdc.dto.EquipmentMachingDto; import org.jeecg.modules.mdc.dto.MdcAlarmListDto; import org.jeecg.modules.mdc.dto.MdcEquipmentRunningSectionDto; import org.jeecg.modules.mdc.dto.MdcEquipmentWaitSectionDto; import org.jeecg.modules.mdc.entity.*; import org.jeecg.modules.mdc.mapper.MdcEquipmentRunningSectionMapper; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.util.TimeFieldUtils; import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo; import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo; import org.jeecg.modules.system.service.ISysDictService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** * @Description: 设备运行时段状态表 * @Author: LiuS * @Date: 2023-04-13 * @Version: V1.0 */ @Service public class MdcEquipmentRunningSectionServiceImpl extends ServiceImpl implements IMdcEquipmentRunningSectionService { @Resource private IEquipmentService equipmentService; @Resource private IEquipmentLogService equipmentLogService; @Resource private IEquipmentAlarmService equipmentAlarmService; @Resource private IEquipmentWorkLineService equipmentWorkLineService; @Resource private ISysDictService sysDictService; @Resource private IEquipmentRunningTraceService equipmentRunningTraceService; @Resource private IMdcAlarmInfoService mdcAlarmInfoService; @Override public List logList(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) { if (StringUtils.isBlank(equipmentRunningSectionVo.getCollectTimeStr()) || StringUtils.isBlank(equipmentRunningSectionVo.getEquipmentId())) { return null; } List dtos = new ArrayList<>(); //查询运行数据 List running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); //查询报警数据 List errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); Equipment equip = equipmentService.getOne(new LambdaQueryWrapper().eq(Equipment::getEquipmentid, equipmentRunningSectionVo.getEquipmentId())); if (!running.isEmpty()) { MdcEquipmentRunningSectionDto dto; String tableName = ""; Boolean isTableExist = false; if (equip != null) { if (StringUtils.isNotBlank(equip.getDrivetype())) { tableName = equip.getDrivetype() + "_" + equip.getEquipmentid(); isTableExist = equipmentWorkLineService.isTableExist(tableName); } } for (MdcEquipmentRunningSection entity : running) { dto = new MdcEquipmentRunningSectionDto(); BeanUtils.copyProperties(entity, dto); if (entity.getStatus() == 3 && StringUtils.isBlank(entity.getSequenceNumber()) && isTableExist && !"ZUOLAN".equals(equip.getDrivetype())) { //FANUC获取程序名特殊处理 if (equip.getDrivetype().startsWith("FANUC")) { List esList = equipmentWorkLineService.getEquipProgramNum(equip.getDrivetype(), equip.getEquipmentid(), entity.getStartTime(), entity.getEndTime()); if (esList != null && esList.size() > 1) { dto.setSequenceNumber(esList.get(0).getProductName()); } }else { List esList = equipmentWorkLineService.getEquipmentSequencenumber(tableName, entity.getStartTime(), entity.getEndTime()); if (esList != null && esList.size() > 1) { dto.setSequenceNumber(esList.get(0).getSequencenumber()); } } } dtos.add(dto); } } if (!errs.isEmpty()) { MdcEquipmentRunningSectionDto dto; for (MdcEquipmentRunningSection entity : errs) { dto = new MdcEquipmentRunningSectionDto(); BeanUtils.copyProperties(entity, dto); if (entity.getStatus() == 22) { if (equip != null) { List mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper().eq(MdcAlarmInfo::getDriveType, equip.getDrivetype()).eq(MdcAlarmInfo::getAlarmCode, entity.getAlarm()).eq(MdcAlarmInfo::getIsUse, 0)); if (mdcAlarmInfo != null && !mdcAlarmInfo.isEmpty()) { dto.setAlarmContent(mdcAlarmInfo.get(0).getAlarmContent()); } } } // Set set = entity.getTmpEquipmentAlarmSet(); // if (entity.getStatus() == 22 && set != null && !set.isEmpty()) { // Iterator iterator = entity.getTmpEquipmentAlarmSet().iterator(); // //获取报警编号相同的报警信息 // while (iterator.hasNext()) { // TmpEquipmentAlarm next = iterator.next(); // if (StringUtils.isNotBlank(next.getAlarmNo()) && next.getAlarmNo().equals(entity.getStatus())) { // dto.setAlarmContent(next.getAlarmContent()); // } // } // } dtos.add(dto); } } List result = new ArrayList<>(); //合并相同状态数据 for (int i = 0; i < dtos.size() - 1; i++) { MdcEquipmentRunningSectionDto mdcEquipmentRunningSectionDto = dtos.get(i); MdcEquipmentRunningSectionDto next = dtos.get(i + 1); if (mdcEquipmentRunningSectionDto.getStatus().equals(next.getStatus()) && mdcEquipmentRunningSectionDto.getEndTime().equals(next.getStartTime())) { MdcEquipmentRunningSectionDto equipmentRunningSectionDto = new MdcEquipmentRunningSectionDto(); BeanUtils.copyProperties(mdcEquipmentRunningSectionDto, equipmentRunningSectionDto); equipmentRunningSectionDto.setEndTime(next.getEndTime()); equipmentRunningSectionDto.setDuration(mdcEquipmentRunningSectionDto.getDuration() + next.getDuration()); result.add(equipmentRunningSectionDto); i++; } else { result.add(mdcEquipmentRunningSectionDto); } } if (dtos.size() > 1) { MdcEquipmentRunningSectionDto a = dtos.get(dtos.size() - 2); MdcEquipmentRunningSectionDto b = dtos.get(dtos.size() - 1); if (!a.getStatus().equals(b.getStatus()) && a.getEndTime().equals(b.getStartTime())) { result.add(dtos.get(dtos.size() - 1)); } } else if (dtos.size() == 1){ result.addAll(dtos); } return result; } /** * 查询运行数据 */ private List loadEquipmentRunningTrace(String equipmentId, String collectTimeStr) { Date startTime = DateUtils.getShortDate(collectTimeStr); Date now = DateUtils.removeTime(DateUtils.getNow()); long second = DateUtils.differentSecond(startTime, now); List list = new ArrayList<>(); Date endTime = DateUtils.plusTime(startTime, 1); if (second < 0) { return Collections.emptyList(); } else { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MdcEquipmentRunningSection::getEquipmentId, equipmentId); queryWrapper.ne(MdcEquipmentRunningSection::getStatus, 22); queryWrapper.ge(MdcEquipmentRunningSection::getEndTime, startTime); queryWrapper.le(MdcEquipmentRunningSection::getStartTime, endTime); queryWrapper.orderByAsc(MdcEquipmentRunningSection::getStartTime); list = this.baseMapper.selectList(queryWrapper); if (list == null || list.isEmpty()) { list = equipmentRunningTracesCurrentLog(equipmentId); } else { //当查询的时间段不是完整的一天 if (list.get(list.size() - 1).getEndTime().getTime() < endTime.getTime()) { List notExcuteData = equipmentRunningTracesCurrentLog(equipmentId); if (notExcuteData != null && !notExcuteData.isEmpty()) { list.addAll(notExcuteData); } } } } if (list == null || list.isEmpty()) { return Collections.emptyList(); } return convertEquipmentRunningTrace(list, startTime, endTime); } private List loadEquipmentErrorTrace(String equipmentId, String collectTimeStr) { List list = new ArrayList<>(); List notExecuteData; Date startTime = DateUtils.getShortDate(collectTimeStr); Date endTime = DateUtils.plusTime(startTime, 1); Date now = DateUtils.removeTime(new Date()); if (startTime.compareTo(now) > 0) { return Collections.emptyList(); } else if (startTime.compareTo(now) == 0) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MdcEquipmentRunningSection::getEquipmentId, equipmentId); queryWrapper.eq(MdcEquipmentRunningSection::getStatus, 22); queryWrapper.ge(MdcEquipmentRunningSection::getEndTime, startTime); queryWrapper.le(MdcEquipmentRunningSection::getStartTime, endTime); queryWrapper.orderByAsc(MdcEquipmentRunningSection::getStartTime); list = this.baseMapper.selectList(queryWrapper); notExecuteData = equipmentRunningTracesCurrentErrorLog(equipmentId); if (list == null || list.isEmpty()) { if (notExecuteData != null && !notExecuteData.isEmpty()) { list = notExecuteData; } } else { if (notExecuteData != null && !notExecuteData.isEmpty()) { list.addAll(notExecuteData); } } } else { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MdcEquipmentRunningSection::getEquipmentId, equipmentId); queryWrapper.eq(MdcEquipmentRunningSection::getStatus, 22); queryWrapper.ge(MdcEquipmentRunningSection::getEndTime, startTime); queryWrapper.le(MdcEquipmentRunningSection::getStartTime, endTime); queryWrapper.orderByAsc(MdcEquipmentRunningSection::getStartTime); list = this.baseMapper.selectList(queryWrapper); } if (list == null || list.isEmpty()) { return Collections.emptyList(); } return convertEquipmentErrorTrace(list, startTime, endTime); } private List convertEquipmentErrorTrace(List list, Date startTime, Date endTime) { if (list == null || list.isEmpty()) { return Collections.emptyList(); } List errorTraces = new ArrayList<>(); MdcEquipmentRunningSection ert; for (int i = 0; i < list.size(); i++) { ert = list.get(i); if (ert.getEndTime().getTime() <= startTime.getTime() || ert.getStartTime().getTime() >= endTime.getTime()) { continue; } if (ert.getStartTime().getTime() < startTime.getTime()) { ert.setStartTime(startTime); ert.setDuration(TimeFieldUtils.duration(ert.getStartTime(), ert.getEndTime())); } if (ert.getEndTime().getTime() > endTime.getTime()) { ert.setEndTime(endTime); ert.setDuration(TimeFieldUtils.duration(ert.getStartTime(), ert.getEndTime())); } if (ert.getDuration() > 0) { errorTraces.add(ert); } } return errorTraces; } /** * 日志查询使用 * 获取未解析的log报警日志 */ private List equipmentRunningTracesCurrentErrorLog(String equipmentId) { //获取最近的设备运行轨迹结束时间 MdcEquipmentRunningSection nearestDate = this.baseMapper.getMaxError(equipmentId); Date now = DateUtils.getNow(); List logList; //查找设备日志 if (nearestDate == null) { logList = equipmentLogService.findEquipmentLogByErrorEndTime(equipmentId, null); } else { //TODO /*待验证*/ Date endTime = nearestDate.getEndTime(); logList = equipmentLogService.findEquipmentLogByErrorEndTime(equipmentId, endTime); } //设备日志不存在或只有一条记录无法解析 if (logList == null || logList.size() < 1) { return null; } List erts = new ArrayList(0); MdcEquipmentRunningSection ert; int length = logList.size(); //对只有一个状态的解析 if (length == 1 && logList.get(0).getOporation() == 22) { MdcEquipmentRunningSection notEcut = new MdcEquipmentRunningSection(); notEcut.setEquipmentId(logList.get(0).getEquipmentId()); notEcut.setAlarm(logList.get(0).getAlarm()); notEcut.setStatus(logList.get(0).getOporation()); notEcut.setStartTime(logList.get(0).getCollectTime()); notEcut.setEndTime(new Date()); notEcut.setDuration(TimeFieldUtils.duration(notEcut.getStartTime(), notEcut.getEndTime())); erts.add(notEcut); return erts; } else if (length == 1 && logList.get(0).getOporation() != 22) { return null; } //解析EquipmentLog数据 for (int i = 0; i < length - 1; i++) { if (logList.get(i).getOporation() != 22) { continue; } else { ert = new MdcEquipmentRunningSection(); ert.setStartTime(logList.get(i).getCollectTime()); ert.setStatus(logList.get(i).getOporation()); ert.setEquipmentId(logList.get(i).getEquipmentId()); ert.setAlarm(logList.get(i).getAlarm()); ert.setEndTime(logList.get(i + 1).getCollectTime()); ert.setDuration(TimeFieldUtils.duration(ert.getStartTime(), ert.getEndTime())); if (ert.getDuration() > 0) { erts.add(ert); } } } //解析最后一条记录 if (logList.get(length - 1).getOporation() == 22 && logList.get(length - 1).getCollectTime().getTime() < now.getTime()) { ert = new MdcEquipmentRunningSection(); ert.setStartTime(logList.get(length - 1).getCollectTime()); ert.setStatus(logList.get(length - 1).getOporation()); ert.setEquipmentId(logList.get(length - 1).getEquipmentId()); ert.setAlarm(logList.get(length - 1).getAlarm()); ert.setEndTime(now); ert.setDuration(TimeFieldUtils.duration(ert.getStartTime(), ert.getEndTime())); if (ert.getDuration() > 0) { erts.add(ert); } } if (erts.isEmpty()) { return null; } return mergeErrorRunningTrace(erts); } /** * 获取未解析的设备日志 */ private List equipmentRunningTracesCurrentLog(String equipmentId) { //获取最近的设备运行数据结束时间 MdcEquipmentRunningSection nearestDate = this.baseMapper.getMaxNormal(equipmentId); Date now = new Date(); List logList; //查找设备日志 if (nearestDate == null) { logList = equipmentLogService.findEquipmentLogByEndTime(equipmentId, null); } else { Date endTime = nearestDate.getEndTime(); logList = equipmentLogService.findEquipmentLogByEndTime(equipmentId, endTime); } //设备日志不存在或只有一条记录无法解析 if (logList.size() < 1 && nearestDate != null) { List result = new ArrayList<>(); MdcEquipmentRunningSection one = new MdcEquipmentRunningSection(); one.setStatus(nearestDate.getStatus()); one.setEquipmentId(equipmentId); one.setStartTime(nearestDate.getEndTime()); one.setEndTime(DateUtils.getNow()); one.setDuration(TimeFieldUtils.duration(one.getStartTime(), one.getEndTime())); if (one.getDuration() > 0) { result.add(one); return result; } else { return Collections.emptyList(); } } else if (logList.size() == 1) { List result = new ArrayList<>(); EquipmentLog eql = logList.get(0); MdcEquipmentRunningSection one = new MdcEquipmentRunningSection(); one.setStatus(eql.getOporation()); one.setEquipmentId(equipmentId); one.setStartTime(eql.getCollectTime()); one.setEndTime(DateUtils.getNow()); one.setDuration(TimeFieldUtils.duration(one.getStartTime(), one.getEndTime())); if (one.getDuration() > 0) { result.add(one); return result; } return null; } else if (nearestDate != null) { EquipmentLog eql = new EquipmentLog(); eql.setCollectTime(nearestDate.getEndTime()); eql.setOporation(nearestDate.getStatus()); eql.setEquipmentId(nearestDate.getEquipmentId()); logList.add(0, eql); } //解决最后时间nearestDate为多个相同时间的数据,导致的查询错误的问题 if (logList.size() > 1) { boolean flag = true; for (int i = 0; i < logList.size() - 1; i++) { if (logList.get(i).getCollectTime().getTime() != logList.get(i + 1).getCollectTime().getTime()) { flag = false; } } if (flag) { //当所有查询出的log记录的时间都是在同一时间点上,做以下处理 List result = new ArrayList<>(); EquipmentLog eql = null; for (EquipmentLog e : logList) { //获取几个相同时间的状态选取 优先级 if (e.getOporation() == 0) { eql = e; break; } if (eql == null) { eql = e; } else { if ((eql.getOporation() == 1 && e.getOporation() == 2) || (eql.getOporation() == 1 && e.getOporation() == 3) || (eql.getOporation() == 2 && e.getOporation() == 3)) { eql = e; } } } MdcEquipmentRunningSection one = new MdcEquipmentRunningSection(); one.setStatus(eql.getOporation()); one.setEquipmentId(equipmentId); one.setStartTime(eql.getCollectTime()); one.setEndTime(DateUtils.getNow()); one.setDuration(TimeFieldUtils.duration(one.getStartTime(), one.getEndTime())); if (one.getDuration() > 0) { result.add(one); return result; } return null; } } List erts = new ArrayList<>(); int length = logList.size(); MdcEquipmentRunningSection ert; //解析EquipmentLog数据 if (length > 1) { for (int i = 0; i < length - 1; i++) { ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(equipmentId); ert.setStatus(logList.get(i).getOporation() == 1 ? 2 : logList.get(i).getOporation()); ert.setStartTime(logList.get(i).getCollectTime()); ert.setEndTime(logList.get(i + 1).getCollectTime()); ert.setDuration(TimeFieldUtils.duration(logList.get(i).getCollectTime(), logList.get(i + 1).getCollectTime())); if (ert.getDuration() > 0) { erts.add(ert); } } if (logList.get(length - 1).getCollectTime().getTime() < now.getTime()) { ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(equipmentId); ert.setStatus(logList.get(length - 1).getOporation() == 1 ? 2 : logList.get(length - 1).getOporation()); ert.setStartTime(logList.get(length - 1).getCollectTime()); ert.setEndTime(now); ert.setDuration(TimeFieldUtils.duration(logList.get(length - 1).getCollectTime(), now)); if (ert.getDuration() > 0) { erts.add(ert); } } } return mergeRunningTrace(erts); } private List convertEquipmentRunningTrace(List list, Date startTime, Date endTime) { //过滤不在区间的数据 List newList = new ArrayList<>(); for (MdcEquipmentRunningSection trace : list) { if (trace.getEndTime().getTime() < startTime.getTime() || trace.getStartTime().getTime() > endTime.getTime()) { continue; } newList.add(trace); } list = newList; if (list.isEmpty()) { return Collections.emptyList(); } //解析首尾时间 MdcEquipmentRunningSection first = list.get(0); MdcEquipmentRunningSection end = list.get(list.size() - 1); Date now = new Date(); if (first.getStartTime().getTime() < startTime.getTime()) { first.setStartTime(startTime); first.setDuration(TimeFieldUtils.duration(startTime, first.getEndTime())); } else if (first.getStartTime().getTime() > startTime.getTime()) { //list 集合首部添加一条记录 MdcEquipmentRunningSection newStart = new MdcEquipmentRunningSection(); newStart.setEquipmentId(first.getEquipmentId()); newStart.setEndTime(first.getStartTime()); newStart.setStartTime(startTime); newStart.setDuration(TimeFieldUtils.duration(startTime, first.getStartTime())); MdcEquipmentRunningSection stats = getEndTimeInfoRunningLastDate(first.getEquipmentId(), first.getStartTime()); if (stats != null) { newStart.setStatus(stats.getStatus()); } if (newStart.getDuration() > 0) { list.add(0, newStart); } } if (end.getEndTime().getTime() > endTime.getTime()) { end.setEndTime(endTime); end.setDuration(TimeFieldUtils.duration(end.getStartTime(), endTime)); } else if (end.getEndTime().getTime() < endTime.getTime()) { if (endTime.getTime() <= now.getTime()) { end.setEndTime(endTime); end.setDuration(TimeFieldUtils.duration(end.getStartTime(), endTime)); } else { end.setEndTime(now); end.setDuration(TimeFieldUtils.duration(end.getStartTime(), now)); } } return mergeRunningTrace(list); } private MdcEquipmentRunningSection getEndTimeInfoRunningLastDate(String equipmentId, Date endTime) { if (StringUtils.isBlank(equipmentId) || endTime == null) { return null; } List list = this.baseMapper.listForEquipmentStatisticalInfo(equipmentId, endTime, DateUtils.plusTime(endTime, 1)); if (list.size() > 0) { return list.get(0); } else { return null; } } /** * 设备运行状态点时间转为段时间 */ @Override @Transactional(rollbackFor = Exception.class) public void runningAllEquipmentTraceProcess() { //获取所有设备 List equipmentList = equipmentService.list(); for (Equipment equipment : equipmentList) { //获取running运行的日志记录 List list = this.equipmentRunningTracesLog(equipment.getEquipmentid()); if (list != null && !list.isEmpty()) { List equipList = addSequenceNumber(list); //添加程序号 this.ergodicTrim(equipList); super.saveBatch(equipList); } //获取报警的日志记录 List errorList = this.equipmentRunningTracesErrorLog(equipment.getEquipmentid()); if (errorList != null && !errorList.isEmpty()) { this.ergodicTrim(errorList); //save errorList super.saveBatch(errorList); } List dictList = sysDictService.queryDictItemsByCode("data_synchronization_flag"); if (dictList != null && !dictList.isEmpty() && "0".equals(dictList.get(0).getValue())) { this.dataSynchronizationHandler(list, errorList); } } } /** * 设备运行日志添加程序号 * * @param list * @return */ public List addSequenceNumber(List list) { if (list == null || list.size() < 1) { return Collections.emptyList(); } Equipment equip = null; for (MdcEquipmentRunningSection e : list) { if (e.getStatus() == 3) { equip = equipmentService.getOne(new LambdaQueryWrapper().eq(Equipment::getEquipmentid, e.getEquipmentId())); if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("FANUC")) { List esList = equipmentWorkLineService.getEquipProgramNum(equip.getDrivetype(), equip.getEquipmentid(), e.getStartTime(), e.getEndTime()); if (esList != null && esList.size() > 1) { e.setSequenceNumber(esList.get(0).getProductName()); } } else if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("SIEMENS")) { List esList = equipmentWorkLineService.getEquipmentSequencenumber(equip.getDrivetype() + "_" + equip.getEquipmentid(), e.getStartTime(), e.getEndTime()); if (esList != null && esList.size() > 1) { e.setSequenceNumber(esList.get(0).getSequencenumber()); } } } } return list; } /** * 数据同步处理 * @param list * @param errorList */ private void dataSynchronizationHandler(List list, List errorList) { // 数据转换 List equipList = new ArrayList<>(); if (list != null && !list.isEmpty()) { list.forEach(item -> { EquipmentRunningTrace equipmentRunningSection = new EquipmentRunningTrace(); equipmentRunningSection.setEquipment(item.getEquipmentId()); equipmentRunningSection.setAlarm(item.getAlarm()); equipmentRunningSection.setCreateTime(item.getCreateTime()); equipmentRunningSection.setDuration(item.getDuration()); equipmentRunningSection.setEndTime(item.getEndTime()); equipmentRunningSection.setStartTime(item.getStartTime()); equipmentRunningSection.setStatus(item.getStatus()); equipmentRunningSection.setSequencenumber(item.getSequenceNumber()); equipList.add(equipmentRunningSection); }); } if (errorList != null && !errorList.isEmpty()) { errorList.forEach(item -> { EquipmentRunningTrace equipmentRunningSection = new EquipmentRunningTrace(); equipmentRunningSection.setEquipment(item.getEquipmentId()); equipmentRunningSection.setAlarm(item.getAlarm()); equipmentRunningSection.setCreateTime(item.getCreateTime()); equipmentRunningSection.setDuration(item.getDuration()); equipmentRunningSection.setEndTime(item.getEndTime()); equipmentRunningSection.setStartTime(item.getStartTime()); equipmentRunningSection.setStatus(item.getStatus()); equipmentRunningSection.setSequencenumber(item.getSequenceNumber()); equipList.add(equipmentRunningSection); }); } equipmentRunningTraceService.saveBatch(equipList); } /** * 获取设备运行记录最早的数据 */ @Override public MdcEquipmentRunningSection getFirstData(String equipmentId) { return this.baseMapper.getFirstData(equipmentId); } /** * 查询设备单日运行状态时间段记录 */ @Override public List listForEquipmentStatisticalInfo(String equipmentId, Date startDate, Date endDate) { return this.baseMapper.listForEquipmentStatisticalInfo(equipmentId, startDate, endDate); } /** * 查询设备历史运行状态记录数据 */ @Override public List> logChart(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) { List> result = new ArrayList<>(); List dateList = DateUtils.getDatesStringList(DateUtils.getShortDate(equipmentRunningSectionVo.getStartTime()), DateUtils.getShortDate(equipmentRunningSectionVo.getEndTime())); for (String date : dateList) { Map map = new HashMap<>(); map.put("date", date); Map> logCharts = this.logCharts(equipmentRunningSectionVo, date); map.put("value", logCharts); result.add(map); } return result; } /** * 计算一段时间内的数据 */ @Override public List listEquipmentRunningSection(String equipmentid, long start, long end) { return this.baseMapper.listEquipmentRunningSection(equipmentid, start, end); } @Override public List listRunningSectionFromLog(String equipmentid, long start, long end) { if (StringUtils.isBlank(equipmentid) || start <= 0 || end <= 0) { return null; } Date startTime = DateUtils.toDate(DateUtils.longToDate(start), DateUtils.STR_DATE_TIME_SMALL); Date endTime = DateUtils.toDate(DateUtils.longToDate(end), DateUtils.STR_DATE_TIME_SMALL); EquipmentLog equipmentLog = equipmentLogService.getRow(equipmentid, startTime); if (equipmentLog == null) { return null; } List logList = new ArrayList<>(); EquipmentLog equipmentOne = new EquipmentLog(); equipmentOne.setEquipmentId(equipmentid); equipmentOne.setOporation(equipmentLog.getOporation()); equipmentOne.setCollectTime(startTime); logList.add(equipmentOne); List logListLast = equipmentLogService.findEquipmentLogByEndTime(equipmentid, startTime); if (logListLast == null || logListLast.isEmpty()) { EquipmentLog two = new EquipmentLog(); two.setEquipmentId(equipmentid); two.setOporation(equipmentLog.getOporation()); two.setCollectTime(endTime); logList.add(two); } else { for (EquipmentLog log : logListLast) { if (log.getCollectTime().getTime() <= endTime.getTime()) { logList.add(log); } } } if (logList.get(logList.size() - 1).getCollectTime().getTime() < endTime.getTime()) { EquipmentLog two = new EquipmentLog(); two.setEquipmentId(equipmentid); two.setOporation(logList.get(logList.size() - 1).getOporation()); two.setCollectTime(endTime); logList.add(two); } //点数据转为段数据 List erts = parseLogToRunningTrace(logList); if (erts.isEmpty()) { return Collections.emptyList(); } //整合加工和待机时间小于n秒的数据 erts = mergeLessMinTimeRecords(erts, null); List running = mergeRunningTrace(erts); if (running != null && !running.isEmpty()) { this.ergodicTrim(running); } return running; } @Override public List listEquipmentRunningSectionRun(String equipmentid, long start, long end) { return this.baseMapper.listEquipmentRunningSectionRun(equipmentid, start, end); } @Override public List listEquipmentRunningSectionError(String equipmentid, long start, long end) { return this.baseMapper.listEquipmentRunningSectionError(equipmentid, start, end); } @Override public List findAlarmList(MdcAlarmAnalyzeQueryVo vo) { return this.baseMapper.findAlarmList(vo); } @Override public Integer findAlarmCount(String equipmentId, String startDate, String endDate, String alarmCode) { return this.baseMapper.findAlarmCount(equipmentId, startDate, endDate, alarmCode); } @Override public Integer findAlarmCountByDate(String startDate, String endDate, MdcAlarmAnalyzeQueryVo vo) { return this.baseMapper.findAlarmCountByDate(startDate, endDate, vo); } @Override public List selectRunningData(String equipmentId, Date startDate, Date endDate) { return this.baseMapper.selectRunningData(equipmentId, startDate, endDate); } @Override public List selectAlarmList(MdcAlarmAnalyzeQueryVo mdcAlarmAnalyzeQueryVo, String startDate, String endDate) { return this.baseMapper.selectAlarmList(mdcAlarmAnalyzeQueryVo, startDate, endDate); } @Override public List getDataList(String equipmentId, Date date) { return this.baseMapper.getDataList(equipmentId, date); } @Override public List findWaitList(String date) { return this.baseMapper.findWaitList(date); } @Override public MdcEquipmentRunningSection getFirstRecord() { return this.baseMapper.getFirstRecord(); } private Map> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) { Map> map = new HashMap<>(); List normal = new ArrayList<>(); List waring = new ArrayList<>(); //运行 List running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), date); //报警 List errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), date); if (running != null && !running.isEmpty()) { MdcEquipmentRunningSectionDto dto; for (MdcEquipmentRunningSection mdcEquipmentRunningSection : running) { dto = new MdcEquipmentRunningSectionDto(); BeanUtils.copyProperties(mdcEquipmentRunningSection, dto); normal.add(dto); } } else { map.put("normal", null); } if (errs != null && !errs.isEmpty()) { MdcEquipmentRunningSectionDto dto; for (MdcEquipmentRunningSection mdcEquipmentRunningSection : errs) { dto = new MdcEquipmentRunningSectionDto(); BeanUtils.copyProperties(mdcEquipmentRunningSection, dto); waring.add(dto); } } else { map.put("waring", null); } map.put("normal", normal); map.put("waring", waring); return map; } private void ergodicTrim(List list) { for (MdcEquipmentRunningSection temp : list) { temp.setStartLong(temp.getStartTime().getTime()); temp.setEndLong(temp.getEndTime().getTime()); } } /** * 获取未解析的log报警日志 */ private List equipmentRunningTracesErrorLog(String equipmentId) { //获取最近的设备运行轨迹结束时间 MdcEquipmentRunningSection mdcEquipmentRunningSection = this.baseMapper.getMaxError(equipmentId); Date endTime = null; if (mdcEquipmentRunningSection != null) { endTime = mdcEquipmentRunningSection.getEndTime(); } //查找设备日志 List logList = equipmentLogService.findEquipmentLogByErrorEndTime(equipmentId, endTime); //设备日志不存在或只有一条记录无法解析 if (logList == null || logList.isEmpty()) { return null; } else if (logList.size() == 1) { EquipmentLog traceLog = logList.get(0); long differentSecond = DateUtils.differentSecond(traceLog.getCollectTime(), new Date()); if (differentSecond > 30 * 60) { MdcEquipmentRunningSection ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(traceLog.getEquipmentId()); ert.setStatus(traceLog.getOporation() == 1 ? 2 : traceLog.getOporation()); ert.setStartTime(traceLog.getCollectTime()); Calendar cal = Calendar.getInstance(); cal.setTime(ert.getStartTime()); cal.add(Calendar.MINUTE, 30); ert.setEndTime(cal.getTime()); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); } } List erts = parseLogToErrorRunningTrace(logList); if (erts == null || erts.isEmpty()) { return Collections.emptyList(); } return mergeErrorRunningTrace(erts); } /** * 合并连续时间的报警数据 */ private List mergeErrorRunningTrace(List list) { List nErts = new ArrayList<>(); MdcEquipmentRunningSection ert; for (int j = 0; j < list.size(); j++) { ert = list.get(j); if (j < list.size() - 1) { if (ert.getEndTime().getTime() == list.get(j + 1).getStartTime().getTime()) { ert.setEndTime(list.get(j + 1).getEndTime()); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); j++; } nErts.add(setTmpEquipmentAlarm(ert)); } if (j == list.size() - 1) { if (list.size() > 1) { MdcEquipmentRunningSection section = setTmpEquipmentAlarm(ert); if (section != null && nErts.size() > 0 && section.getStartTime().getTime() != nErts.get(nErts.size() - 1).getStartTime().getTime()) { nErts.add(section); } } else { MdcEquipmentRunningSection section = setTmpEquipmentAlarm(ert); nErts.add(section); } } } return nErts; } private MdcEquipmentRunningSection setTmpEquipmentAlarm(MdcEquipmentRunningSection ert) { //获取相应时间段报警信息 List list = equipmentAlarmService.findEquipmentAlarmByDate(ert.getEquipmentId(), ert.getStartTime(), ert.getEndTime()); if (list != null && !list.isEmpty()) { Set alarmSet = new HashSet<>(); for (EquipmentAlarm alarm : list) { TmpEquipmentAlarm entity = new TmpEquipmentAlarm(); entity.setEquipmentID(alarm.getEquipmentid()); entity.setCollectTime(alarm.getCollecttime()); entity.setAlarmContent(alarm.getAlarmContent()); entity.setAlarmNo(alarm.getAlarmNo()); alarmSet.add(entity); } ert.setTmpEquipmentAlarmSet(alarmSet); } return ert; } /** * 解析报警日志 * 工具方法 */ private List parseLogToErrorRunningTrace(List logList) { List erts = new ArrayList<>(); MdcEquipmentRunningSection ert; int length = logList.size(); //解析EquipmentLog数据 for (int i = 0; i < length - 1; i++) { if (logList.get(i).getOporation() != 22) { continue; } else { ert = new MdcEquipmentRunningSection(); ert.setStartTime(logList.get(i).getCollectTime()); ert.setStatus(logList.get(i).getOporation()); ert.setEquipmentId(logList.get(i).getEquipmentId()); ert.setAlarm(logList.get(i).getAlarm()); ert.setEndTime(logList.get(i + 1).getCollectTime()); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); if (ert.getEndTime() != null && ert.getDuration() > 0) { erts.add(ert); } } } if (erts.isEmpty()) { return null; } return erts; } /** * 获取running运行的日志记录 */ private List equipmentRunningTracesLog(String equipmentId) { //获取计算段时间后的最后一条记录 MdcEquipmentRunningSection mdcEquipmentRunningSection = this.baseMapper.getMaxNormal(equipmentId); List logList = new ArrayList<>(); Date maxDate = null; if (mdcEquipmentRunningSection != null) { maxDate = mdcEquipmentRunningSection.getEndTime(); } logList = equipmentLogService.findEquipmentLogByEndTime(equipmentId, maxDate); if (mdcEquipmentRunningSection != null) { EquipmentLog traceLog = new EquipmentLog(); traceLog.setCollectTime(mdcEquipmentRunningSection.getEndTime()); traceLog.setEquipmentId(equipmentId); traceLog.setOporation(mdcEquipmentRunningSection.getStatus()); logList.add(0, traceLog); } //判断最后的记录是否超过24小时 超过写入状态数据differentSecond if (logList == null || logList.isEmpty() || logList.size() == 1) { return null; } else { long differentSecond = DateUtils.differentSecond(logList.get(logList.size() - 1).getCollectTime(), new Date()); /*86400 */ if (differentSecond >= 3600) { EquipmentLog traceLog = new EquipmentLog(); traceLog.setCollectTime(new Date()); traceLog.setEquipmentId(equipmentId); traceLog.setOporation(logList.get(logList.size() - 1).getOporation()); logList.add(traceLog); } } //点数据转为段数据 List erts = parseLogToRunningTrace(logList); if (erts.isEmpty()) { return Collections.emptyList(); } //整合加工和待机时间小于n秒的数据 erts = mergeLessMinTimeRecords(erts, mdcEquipmentRunningSection); return mergeRunningTrace(erts); } /** * 点数据转为段数据 */ private List parseLogToRunningTrace(List logList) { List erts = new ArrayList<>(0); int length = logList.size(); //解析EquipmentLog数据 for (int i = 0; i < length - 1; i++) { EquipmentLog equipmentLog = logList.get(i); EquipmentLog nextEquipmentLog = logList.get(i + 1); long differentSecond = DateUtils.differentSecond(equipmentLog.getCollectTime(), nextEquipmentLog.getCollectTime()); if (differentSecond <= 86400) { MdcEquipmentRunningSection ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(logList.get(i).getEquipmentId()); ert.setStatus(logList.get(i).getOporation() == 1 ? 2 : logList.get(i).getOporation()); ert.setStartTime(logList.get(i).getCollectTime()); ert.setEndTime(logList.get(i + 1).getCollectTime()); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); // if (ert.getDuration() > 0) { erts.add(ert); // } } else { long count = differentSecond / 86400; if (count % 86400 > 0) { count = count + 1; } Date start = equipmentLog.getCollectTime(); Date end = nextEquipmentLog.getCollectTime(); for (int j = 0; j < count; j++) { if (j == 0) { MdcEquipmentRunningSection ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(equipmentLog.getEquipmentId()); ert.setStatus(equipmentLog.getOporation() == 1 ? 2 : equipmentLog.getOporation()); ert.setStartTime(start); long tmp = 86400000 - start.getTime() % 86400000 + start.getTime(); ert.setEndTime(new Date(tmp)); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); erts.add(ert); start = ert.getEndTime(); } else if (j == count - 1) { MdcEquipmentRunningSection ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(equipmentLog.getEquipmentId()); ert.setStatus(equipmentLog.getOporation() == 1 ? 2 : equipmentLog.getOporation()); ert.setStartTime(start); ert.setEndTime(end); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); erts.add(ert); } else { MdcEquipmentRunningSection ert = new MdcEquipmentRunningSection(); ert.setEquipmentId(equipmentLog.getEquipmentId()); ert.setStatus(equipmentLog.getOporation() == 1 ? 2 : equipmentLog.getOporation()); ert.setStartTime(start); ert.setEndTime(new Date(start.getTime() + 86400000)); ert.setDuration(DateUtils.differentSecond(ert.getStartTime(), ert.getEndTime())); erts.add(ert); start = ert.getEndTime(); } } } } return erts; } /** * 整合加工和待机时间小于n秒的数据 * 判断状态时长是否小于最小间隔 * 如果小于和上条数据作比较,将上条数据的状态复制到当前数据 */ private List mergeLessMinTimeRecords(List erts, MdcEquipmentRunningSection mdcEquipmentRunningSection) { if (erts == null || erts.isEmpty() || erts.size() == 1) { return null; } Integer processMinTime = 10; Integer waitMinTime = 10; List resultList = new ArrayList<>(); MdcEquipmentRunningSection ert = erts.get(0); if (ert.getStatus() == 2 && ert.getDuration() < waitMinTime) { if (mdcEquipmentRunningSection != null && mdcEquipmentRunningSection.getStatus() == 3) { ert.setStatus(3); } resultList.add(ert); } else if (ert.getStatus() == 3 && ert.getDuration() < processMinTime) { if (mdcEquipmentRunningSection != null && mdcEquipmentRunningSection.getStatus() == 2) { ert.setStatus(2); } resultList.add(ert); } else { resultList.add(ert); } MdcEquipmentRunningSection previous = null; for (int i = 1; i < erts.size(); i++) { ert = erts.get(i); if (ert.getStatus() == 2 && ert.getDuration() < waitMinTime) { previous = resultList.get(resultList.size() - 1); if (previous.getStatus() == 3) { previous.setEndTime(ert.getEndTime()); previous.setDuration(DateUtils.differentSecond(previous.getStartTime(), previous.getEndTime())); } else { resultList.add(ert); } } else if (ert.getStatus() == 3 && ert.getDuration() < processMinTime) { previous = resultList.get(resultList.size() - 1); if (previous.getStatus() == 2) { previous.setEndTime(ert.getEndTime()); previous.setDuration(DateUtils.differentSecond(previous.getStartTime(), previous.getEndTime())); } else { resultList.add(ert); } } else { resultList.add(ert); } } return resultList; } /** * 合并相同状态的数据 */ private List mergeRunningTrace(List list) { if (list == null || list.isEmpty() || list.size() == 1) { return list; } List nErts = new ArrayList<>(); boolean flag = false; MdcEquipmentRunningSection fErt = null; MdcEquipmentRunningSection ert; for (int i = 0; i < list.size(); i++) { do { if (i < list.size()) { ert = list.get(i); if (i != 0) { if (fErt.getStatus() == ert.getStatus()) { flag = true; //不合并跨天数据 if (DateUtils.differentSecond(fErt.getStartTime(), ert.getEndTime()) >= 86400) { flag = false; } } else { flag = false; } } if (flag) { fErt.setEndTime(ert.getEndTime()); fErt.setDuration(DateUtils.differentSecond(fErt.getStartTime(), fErt.getEndTime())); i++; } else { if (fErt != null) { fErt.setAlarm(ert.getAlarm()); nErts.add(fErt); } fErt = ert; } } else { flag = false; } } while (flag); } nErts.add(fErt); return nErts; } }