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