From 23855599412c4d61b38d78f0f3abd3430a48b5b1 Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期三, 25 六月 2025 11:51:38 +0800 Subject: [PATCH] Merge branch 'mdc_hyjs_master' --- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java | 1232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,232 insertions(+), 0 deletions(-) diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java new file mode 100644 index 0000000..5db88df --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentRunningSectionServiceImpl.java @@ -0,0 +1,1232 @@ +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.EquFaultRecord; +import org.jeecg.modules.mdc.vo.MdcAlarmAnalyzeQueryVo; +import org.jeecg.modules.mdc.vo.MdcEquipmentRunningSectionVo; +import org.jeecg.modules.mdc.vo.TimeInterval; +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.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description: 璁惧杩愯鏃舵鐘舵�佽〃 + * @Author: LiuS + * @Date: 2023-04-13 + * @Version: V1.0 + */ +@Service +public class MdcEquipmentRunningSectionServiceImpl extends ServiceImpl<MdcEquipmentRunningSectionMapper, MdcEquipmentRunningSection> 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<MdcEquipmentRunningSectionDto> logList(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) { + + if (StringUtils.isBlank(equipmentRunningSectionVo.getCollectTimeStr()) || StringUtils.isBlank(equipmentRunningSectionVo.getEquipmentId())) { + return null; + } + List<MdcEquipmentRunningSectionDto> dtos = new ArrayList<>(); + //鏌ヨ杩愯鏁版嵁 + List<MdcEquipmentRunningSection> running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); + //鏌ヨ鎶ヨ鏁版嵁 + List<MdcEquipmentRunningSection> errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); + //鏌ヨ鏁呴殰鏁版嵁 + List<MdcEquipmentRunningSection> faults = loadEquipmentFaultTrace(equipmentRunningSectionVo.getEquipmentId(), equipmentRunningSectionVo.getCollectTimeStr()); + Equipment equip = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().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())) { + List<EquipmentMachingDto> 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> mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper<MdcAlarmInfo>().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()); + } + } + } + dtos.add(dto); + } + } + + List<MdcEquipmentRunningSectionDto> 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); + } + + if (faults != null && !faults.isEmpty()) { + MdcEquipmentRunningSectionDto dto; + for (MdcEquipmentRunningSection entity : faults) { + dto = new MdcEquipmentRunningSectionDto(); + BeanUtils.copyProperties(entity, dto); + result.add(dto); + } + } + + return result; + } + + private List<MdcEquipmentRunningSection> loadEquipmentFaultTrace(String equipmentId, String collectTimeStr) { + List<MdcEquipmentRunningSection> result = new ArrayList<>(); + Date startTime = DateUtils.getShortDate(collectTimeStr); + Date now = DateUtils.removeTime(DateUtils.getNow()); + long second = DateUtils.differentSecond(startTime, now); + Date endTime = DateUtils.plusTime(startTime, 1); + if (collectTimeStr.equals(LocalDate.now().toString())) { + endTime = DateUtils.getNow(); + } + if (second < 0) { + return Collections.emptyList(); + } else { + List<EquFaultRecord> equFaultRecordList = this.baseMapper.findFaultList(equipmentId, startTime, endTime); + if (equFaultRecordList != null && !equFaultRecordList.isEmpty()) { + + // 淇璁板綍鏃堕棿 + List<EquFaultRecord> correctedRecords = correctRecordTimes(equFaultRecordList, DateUtils.convertToLocalDateTime(startTime), DateUtils.convertToLocalDateTime(endTime)); + + // 鎸夊紑濮嬫椂闂存帓搴� + correctedRecords.sort(Comparator.comparing(EquFaultRecord::getStartTime)); + + // 鍚堝苟閲嶅彔鏃堕棿娈� + List<TimeInterval> mergedIntervals = mergeIntervals(correctedRecords); + + for (TimeInterval mergedInterval : mergedIntervals) { + MdcEquipmentRunningSection mdcEquipmentRunningSection = new MdcEquipmentRunningSection(25, equipmentId, DateUtils.convertToDate(mergedInterval.getStart()), DateUtils.convertToDate(mergedInterval.getEnd()), DateUtils.convertToDate(mergedInterval.getStart()).getTime(), DateUtils.convertToDate(mergedInterval.getEnd()).getTime()); + mdcEquipmentRunningSection.setDuration(DateUtils.differentSecond(mdcEquipmentRunningSection.getStartTime(), mdcEquipmentRunningSection.getEndTime())); + result.add(mdcEquipmentRunningSection); + } + } + } + return result; + } + + private static List<EquFaultRecord> correctRecordTimes(List<EquFaultRecord> records, LocalDateTime startTime, LocalDateTime endTime) { + return records.stream() + .map(record -> { + LocalDateTime recordStart = DateUtils.convertToLocalDateTime(record.getStartTime()); + LocalDateTime recordEnd = record.getEndTime() != null ? + DateUtils.convertToLocalDateTime(record.getEndTime()) : null; + + // 淇寮�濮嬫椂闂� + LocalDateTime correctedStart = recordStart.isBefore(startTime) ? + startTime : recordStart; + + // 淇缁撴潫鏃堕棿 + LocalDateTime correctedEnd = recordEnd == null || recordEnd.isAfter(endTime) ? + endTime : recordEnd; + + // 鍒涘缓淇鍚庣殑璁板綍 + return new EquFaultRecord( + record.getEquipmentId(), + DateUtils.convertToDate(correctedStart), + DateUtils.convertToDate(correctedEnd) + ); + }) + .collect(Collectors.toList()); + } + + private static List<TimeInterval> mergeIntervals(List<EquFaultRecord> records) { + List<TimeInterval> intervals = records.stream() + .map(record -> new TimeInterval( + DateUtils.convertToLocalDateTime(record.getStartTime()), + DateUtils.convertToLocalDateTime(record.getEndTime()))) + .collect(Collectors.toList()); + + if (intervals.isEmpty()) { + return Collections.emptyList(); + } + + List<TimeInterval> merged = new ArrayList<>(); + TimeInterval current = intervals.get(0); + + for (int i = 1; i < intervals.size(); i++) { + TimeInterval next = intervals.get(i); + if (next.getStart().isBefore(current.getEnd()) || next.getStart().equals(current.getEnd())) { + // 鏈夐噸鍙狅紝鍚堝苟鍖洪棿 + current.setEnd(current.getEnd().isAfter(next.getEnd()) ? current.getEnd() : next.getEnd()); + } else { + // 鏃犻噸鍙狅紝娣诲姞褰撳墠鍖洪棿骞舵洿鏂板綋鍓嶅尯闂� + merged.add(current); + current = next; + } + } + merged.add(current); // 娣诲姞鏈�鍚庝竴涓尯闂� + + return merged; + } + + /** + * 鏌ヨ杩愯鏁版嵁 + */ + private List<MdcEquipmentRunningSection> loadEquipmentRunningTrace(String equipmentId, String collectTimeStr) { + Date startTime = DateUtils.getShortDate(collectTimeStr); + Date now = DateUtils.removeTime(DateUtils.getNow()); + long second = DateUtils.differentSecond(startTime, now); + List<MdcEquipmentRunningSection> list = new ArrayList<>(); + Date endTime = DateUtils.plusTime(startTime, 1); + if (second < 0) { + return Collections.emptyList(); + } else { + LambdaQueryWrapper<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> loadEquipmentErrorTrace(String equipmentId, String collectTimeStr) { + List<MdcEquipmentRunningSection> list = new ArrayList<>(); + List<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> convertEquipmentErrorTrace(List<MdcEquipmentRunningSection> list, Date startTime, Date endTime) { + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + List<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> equipmentRunningTracesCurrentErrorLog(String equipmentId) { + //鑾峰彇鏈�杩戠殑璁惧杩愯杞ㄨ抗缁撴潫鏃堕棿 + MdcEquipmentRunningSection nearestDate = this.baseMapper.getMaxError(equipmentId); + Date now = DateUtils.getNow(); + List<EquipmentLog> 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<MdcEquipmentRunningSection> erts = new ArrayList<MdcEquipmentRunningSection>(0); + MdcEquipmentRunningSection ert; + int length = logList.size(); + //瀵瑰彧鏈変竴涓姸鎬佺殑瑙f瀽 + 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; + } + //瑙f瀽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); + } + } + } + //瑙f瀽鏈�鍚庝竴鏉¤褰� + 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<MdcEquipmentRunningSection> equipmentRunningTracesCurrentLog(String equipmentId) { + //鑾峰彇鏈�杩戠殑璁惧杩愯鏁版嵁缁撴潫鏃堕棿 + MdcEquipmentRunningSection nearestDate = this.baseMapper.getMaxNormal(equipmentId); + Date now = new Date(); + List<EquipmentLog> 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<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> 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); + } + //瑙e喅鏈�鍚庢椂闂磏earestDate涓哄涓浉鍚屾椂闂寸殑鏁版嵁锛屽鑷寸殑鏌ヨ閿欒鐨勯棶棰� + 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) { + //褰撴墍鏈夋煡璇㈠嚭鐨刲og璁板綍鐨勬椂闂撮兘鏄湪鍚屼竴鏃堕棿鐐逛笂锛屽仛浠ヤ笅澶勭悊 + List<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> erts = new ArrayList<>(); + int length = logList.size(); + MdcEquipmentRunningSection ert; + //瑙f瀽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<MdcEquipmentRunningSection> convertEquipmentRunningTrace(List<MdcEquipmentRunningSection> list, Date startTime, Date endTime) { + //杩囨护涓嶅湪鍖洪棿鐨勬暟鎹� + List<MdcEquipmentRunningSection> 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(); + } + //瑙f瀽棣栧熬鏃堕棿 + 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<MdcEquipmentRunningSection> 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<Equipment> equipmentList = equipmentService.list(); + for (Equipment equipment : equipmentList) { + //鑾峰彇running杩愯鐨勬棩蹇楄褰� + List<MdcEquipmentRunningSection> list = this.equipmentRunningTracesLog(equipment.getEquipmentid()); + if (list != null && !list.isEmpty()) { +// List<MdcEquipmentRunningSection> equipList = addSequenceNumber(list); //娣诲姞绋嬪簭鍙� + this.ergodicTrim(list); + super.saveBatch(list); + } + //鑾峰彇鎶ヨ鐨勬棩蹇楄褰� + List<MdcEquipmentRunningSection> errorList = this.equipmentRunningTracesErrorLog(equipment.getEquipmentid()); + if (errorList != null && !errorList.isEmpty()) { + this.ergodicTrim(errorList); + //save errorList + super.saveBatch(errorList); + } + List<DictModel> 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<MdcEquipmentRunningSection> addSequenceNumber(List<MdcEquipmentRunningSection> 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<Equipment>().eq(Equipment::getEquipmentid, e.getEquipmentId())); + if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("FANUC")) { + List<EquipmentMachingDto> esList = equipmentWorkLineService.getEquipProgramNum(equip.getDrivetype(), equip.getEquipmentid(), + e.getStartTime(), e.getEndTime()); + if (esList != null && esList.size() > 1) { + e.setSequenceNumber(esList.get(0).getProgramnumber()); + } + } else if (StringUtils.isNotBlank(equip.getDrivetype()) && equip.getDrivetype().startsWith("SIEMENS")) { + List<EquipmentMachingDto> 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<MdcEquipmentRunningSection> list, List<MdcEquipmentRunningSection> errorList) { + // 鏁版嵁杞崲 + List<EquipmentRunningTrace> 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<MdcEquipmentRunningSection> listForEquipmentStatisticalInfo(String equipmentId, Date startDate, Date endDate) { + return this.baseMapper.listForEquipmentStatisticalInfo(equipmentId, startDate, endDate); + } + + /** + * 鏌ヨ璁惧鍘嗗彶杩愯鐘舵�佽褰曟暟鎹� + */ + @Override + public List<Map<String, Object>> logChart(MdcEquipmentRunningSectionVo equipmentRunningSectionVo) { + List<Map<String, Object>> result = new ArrayList<>(); + List<String> dateList = DateUtils.getDatesStringList(DateUtils.getShortDate(equipmentRunningSectionVo.getStartTime()), DateUtils.getShortDate(equipmentRunningSectionVo.getEndTime())); + for (String date : dateList) { + Map<String, Object> map = new HashMap<>(); + map.put("date", date); + Map<String, List<MdcEquipmentRunningSectionDto>> logCharts = this.logCharts(equipmentRunningSectionVo, date); + map.put("value", logCharts); + result.add(map); + } + return result; + } + + /** + * 璁$畻涓�娈垫椂闂村唴鐨勬暟鎹� + */ + @Override + public List<MdcEquipmentRunningSection> listEquipmentRunningSection(String equipmentid, long start, long end) { + return this.baseMapper.listEquipmentRunningSection(equipmentid, start, end); + } + + @Override + public List<MdcEquipmentRunningSection> 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<EquipmentLog> logList = new ArrayList<>(); + EquipmentLog equipmentOne = new EquipmentLog(); + equipmentOne.setEquipmentId(equipmentid); + equipmentOne.setOporation(equipmentLog.getOporation()); + equipmentOne.setCollectTime(startTime); + logList.add(equipmentOne); + List<EquipmentLog> 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<MdcEquipmentRunningSection> erts = parseLogToRunningTrace(logList); + if (erts.isEmpty()) { + return Collections.emptyList(); + } + //鏁村悎鍔犲伐鍜屽緟鏈烘椂闂村皬浜巒绉掔殑鏁版嵁 + erts = mergeLessMinTimeRecords(erts, null); + List<MdcEquipmentRunningSection> running = mergeRunningTrace(erts); + if (running != null && !running.isEmpty()) { + this.ergodicTrim(running); + } + return running; + } + + @Override + public List<MdcEquipmentRunningSection> listEquipmentRunningSectionRun(String equipmentid, long start, long end) { + return this.baseMapper.listEquipmentRunningSectionRun(equipmentid, start, end); + } + + @Override + public List<MdcEquipmentRunningSection> listEquipmentRunningSectionError(String equipmentid, long start, long end) { + return this.baseMapper.listEquipmentRunningSectionError(equipmentid, start, end); + } + + @Override + public List<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> selectRunningData(String equipmentId, Date startDate, Date endDate) { + return this.baseMapper.selectRunningData(equipmentId, startDate, endDate); + } + + @Override + public List<MdcAlarmListDto> selectAlarmList(MdcAlarmAnalyzeQueryVo mdcAlarmAnalyzeQueryVo, String startDate, String endDate) { + return this.baseMapper.selectAlarmList(mdcAlarmAnalyzeQueryVo, startDate, endDate); + } + + @Override + public List<Integer> getDataList(String equipmentId, Date date) { + return this.baseMapper.getDataList(equipmentId, date); + } + + @Override + public List<MdcEquipmentWaitSectionDto> findWaitList(String date) { + return this.baseMapper.findWaitList(date); + } + + @Override + public MdcEquipmentRunningSection getFirstRecord() { + return this.baseMapper.getFirstRecord(); + } + + private Map<String, List<MdcEquipmentRunningSectionDto>> logCharts(MdcEquipmentRunningSectionVo equipmentRunningSectionVo, String date) { + Map<String, List<MdcEquipmentRunningSectionDto>> map = new HashMap<>(); + List<MdcEquipmentRunningSectionDto> normal = new ArrayList<>(); + List<MdcEquipmentRunningSectionDto> waring = new ArrayList<>(); + List<MdcEquipmentRunningSectionDto> fault = new ArrayList<>(); + //杩愯 + List<MdcEquipmentRunningSection> running = loadEquipmentRunningTrace(equipmentRunningSectionVo.getEquipmentId(), date); + //鎶ヨ + List<MdcEquipmentRunningSection> errs = loadEquipmentErrorTrace(equipmentRunningSectionVo.getEquipmentId(), date); + //鏁呴殰 + List<MdcEquipmentRunningSection> faults = loadEquipmentFaultTrace(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); + } + + if (!faults.isEmpty()) { + MdcEquipmentRunningSectionDto dto; + for (MdcEquipmentRunningSection mdcEquipmentRunningSection : faults) { + dto = new MdcEquipmentRunningSectionDto(); + BeanUtils.copyProperties(mdcEquipmentRunningSection, dto); + fault.add(dto); + } + } else { + map.put("fault", null); + } + + map.put("normal", normal); + map.put("waring", waring); + map.put("fault", fault); + + return map; + } + + private void ergodicTrim(List<MdcEquipmentRunningSection> list) { + for (MdcEquipmentRunningSection temp : list) { + temp.setStartLong(temp.getStartTime().getTime()); + temp.setEndLong(temp.getEndTime().getTime()); + } + } + + /** + * 鑾峰彇鏈В鏋愮殑log鎶ヨ鏃ュ織 + */ + private List<MdcEquipmentRunningSection> equipmentRunningTracesErrorLog(String equipmentId) { + //鑾峰彇鏈�杩戠殑璁惧杩愯杞ㄨ抗缁撴潫鏃堕棿 + MdcEquipmentRunningSection mdcEquipmentRunningSection = this.baseMapper.getMaxError(equipmentId); + Date endTime = null; + if (mdcEquipmentRunningSection != null) { + endTime = mdcEquipmentRunningSection.getEndTime(); + } + //鏌ユ壘璁惧鏃ュ織 + List<EquipmentLog> 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<MdcEquipmentRunningSection> erts = parseLogToErrorRunningTrace(logList); + if (erts == null || erts.isEmpty()) { + return Collections.emptyList(); + } + return mergeErrorRunningTrace(erts); + } + + /** + * 鍚堝苟杩炵画鏃堕棿鐨勬姤璀︽暟鎹� + */ + private List<MdcEquipmentRunningSection> mergeErrorRunningTrace(List<MdcEquipmentRunningSection> list) { + List<MdcEquipmentRunningSection> 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<EquipmentAlarm> list = equipmentAlarmService.findEquipmentAlarmByDate(ert.getEquipmentId(), ert.getStartTime(), ert.getEndTime()); + if (list != null && !list.isEmpty()) { + Set<TmpEquipmentAlarm> 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; + } + + /** + * 瑙f瀽鎶ヨ鏃ュ織 + * 宸ュ叿鏂规硶 + */ + private List<MdcEquipmentRunningSection> parseLogToErrorRunningTrace(List<EquipmentLog> logList) { + List<MdcEquipmentRunningSection> erts = new ArrayList<>(); + MdcEquipmentRunningSection ert; + int length = logList.size(); + //瑙f瀽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<MdcEquipmentRunningSection> equipmentRunningTracesLog(String equipmentId) { + //鑾峰彇璁$畻娈垫椂闂村悗鐨勬渶鍚庝竴鏉¤褰� + MdcEquipmentRunningSection mdcEquipmentRunningSection = this.baseMapper.getMaxNormal(equipmentId); + List<EquipmentLog> 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灏忔椂 瓒呰繃鍐欏叆鐘舵�佹暟鎹甦ifferentSecond + 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<MdcEquipmentRunningSection> erts = parseLogToRunningTrace(logList); + if (erts.isEmpty()) { + return Collections.emptyList(); + } + //鏁村悎鍔犲伐鍜屽緟鏈烘椂闂村皬浜巒绉掔殑鏁版嵁 + erts = mergeLessMinTimeRecords(erts, mdcEquipmentRunningSection); + + return mergeRunningTrace(erts); + } + + /** + * 鐐规暟鎹浆涓烘鏁版嵁 + */ + private List<MdcEquipmentRunningSection> parseLogToRunningTrace(List<EquipmentLog> logList) { + List<MdcEquipmentRunningSection> erts = new ArrayList<>(0); + int length = logList.size(); + //瑙f瀽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; + } + + /** + * 鏁村悎鍔犲伐鍜屽緟鏈烘椂闂村皬浜巒绉掔殑鏁版嵁 + * 鍒ゆ柇鐘舵�佹椂闀挎槸鍚﹀皬浜庢渶灏忛棿闅� + * 濡傛灉灏忎簬鍜屼笂鏉℃暟鎹綔姣旇緝锛屽皢涓婃潯鏁版嵁鐨勭姸鎬佸鍒跺埌褰撳墠鏁版嵁 + */ + private List<MdcEquipmentRunningSection> mergeLessMinTimeRecords(List<MdcEquipmentRunningSection> erts, MdcEquipmentRunningSection mdcEquipmentRunningSection) { + if (erts == null || erts.isEmpty() || erts.size() == 1) { + return null; + } + Integer processMinTime = 10; + Integer waitMinTime = 10; + List<MdcEquipmentRunningSection> 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<MdcEquipmentRunningSection> mergeRunningTrace(List<MdcEquipmentRunningSection> list) { + if (list == null || list.isEmpty() || list.size() == 1) { + return list; + } + List<MdcEquipmentRunningSection> 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; + } + +} -- Gitblit v1.9.3