package com.qianwen.mdc.collect.utils; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.core.tool.utils.BeanUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.mdc.collect.entity.iotdb.AggregateState; import com.qianwen.mdc.collect.entity.iotdb.DeviceState; import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum; /** * 无反馈得状态聚合 util * */ public class WorkstationStateAggregateNoFeedbackUtils { private static final Logger log = LoggerFactory.getLogger(WorkstationStateAggregateNoFeedbackUtils.class); public static List buildAggregateList(List notSyncWorkstationStates) { List workstationAggregateStateList = new ArrayList<>(); List notSyncWorkstationStates2 = rebuildNotSyncWorkstationStates(notSyncWorkstationStates); if (Func.isNotEmpty(notSyncWorkstationStates2)) { int resultCount = notSyncWorkstationStates2.size(); for (int i = 0; i < notSyncWorkstationStates2.size() - 1; i++) { DeviceState current = notSyncWorkstationStates2.get(i); DeviceState nextState = notSyncWorkstationStates2.get(i + 1); //使用ts的差,构建durationCollect,其余使用current的属性 AggregateState aggState =new AggregateState(); //workstationAggregateStateList.add(AggregateState.builder().ts(current.getTs()).workstationId(current.getWorkstationId()).isDeleted(Boolean.FALSE).valueCollect(current.getValueCollect()).rps(current.getRps()).wcs(current.getWcs()).isPlan(current.getIsPlan()).shiftIndex(current.getShiftIndex()).shiftTimeType(current.getShiftTimeType()).calendarCode(current.getCalendarCode()).factoryDate(current.getFactoryDate()).factoryMonth(current.getFactoryMonth()).factoryWeek(current.getFactoryWeek()).factoryYear(current.getFactoryYear()).durationCollect(Long.valueOf(TimeUnit.MILLISECONDS.toSeconds(nextState.getTs().longValue() - current.getTs().longValue()))).employeeId(current.getEmployeeId()).endTime(nextState.getTs()).build()); aggState.setTime(current.getTime()); aggState.setWorkstationId(current.getWorkstationId()); aggState.setIsDeleted(false); aggState.setValueCollect(current.getValueCollect()); aggState.setRps(current.getRps()); aggState.setWcs(current.getWcs()); aggState.setIsPlan(current.getIsPlan()); aggState.setShiftIndex(current.getShiftIndex()); aggState.setShiftTimeType(current.getShiftTimeType()); aggState.setCalendarCode(current.getCalendarCode()); aggState.setFactoryDate(current.getFactoryDate()); aggState.setFactoryMonth(current.getFactoryMonth()); aggState.setFactoryWeek(current.getFactoryWeek()); aggState.setFactoryYear(current.getFactoryYear()); aggState.setDurationCollect(Long.valueOf(TimeUnit.MILLISECONDS.toSeconds(nextState.getTime().longValue() - current.getTime().longValue()))); aggState.setEmployeeId(current.getEmployeeId()); aggState.setEndTime(nextState.getTime()); workstationAggregateStateList.add(aggState); } //构建最后一条,无durationCollect DeviceState lastNoSyncWorkstationState = notSyncWorkstationStates2.get(resultCount - 1); AggregateState lastAggState = new AggregateState(); //workstationAggregateStateList.add(AggregateState.builder().ts(lastNoSyncWorkstationState.getTime()).workstationId(lastNoSyncWorkstationState.getWorkstationId()).isDeleted(Boolean.FALSE).valueCollect(lastNoSyncWorkstationState.getValueCollect()).rps(lastNoSyncWorkstationState.getRps()).wcs(lastNoSyncWorkstationState.getWcs()).isPlan(lastNoSyncWorkstationState.getIsPlan()).shiftIndex(lastNoSyncWorkstationState.getShiftIndex()).shiftTimeType(lastNoSyncWorkstationState.getShiftTimeType()).calendarCode(lastNoSyncWorkstationState.getCalendarCode()).factoryDate(lastNoSyncWorkstationState.getFactoryDate()).factoryMonth(lastNoSyncWorkstationState.getFactoryMonth()).factoryWeek(lastNoSyncWorkstationState.getFactoryWeek()).factoryYear(lastNoSyncWorkstationState.getFactoryYear()).employeeId(lastNoSyncWorkstationState.getEmployeeId()).build()); lastAggState.setTime(lastNoSyncWorkstationState.getTime()); lastAggState.setWorkstationId(lastNoSyncWorkstationState.getWorkstationId()); lastAggState.setIsDeleted(false); lastAggState.setValueCollect(lastNoSyncWorkstationState.getValueCollect()); lastAggState.setRps(lastNoSyncWorkstationState.getRps()); lastAggState.setWcs(lastNoSyncWorkstationState.getWcs()); lastAggState.setIsPlan(lastNoSyncWorkstationState.getIsPlan()); lastAggState.setShiftIndex(lastNoSyncWorkstationState.getShiftIndex()); lastAggState.setShiftTimeType(lastNoSyncWorkstationState.getShiftTimeType()); lastAggState.setCalendarCode(lastNoSyncWorkstationState.getCalendarCode()); lastAggState.setFactoryDate(lastNoSyncWorkstationState.getFactoryDate()); lastAggState.setFactoryMonth(lastNoSyncWorkstationState.getFactoryMonth()); lastAggState.setFactoryWeek(lastNoSyncWorkstationState.getFactoryWeek()); lastAggState.setFactoryYear(lastNoSyncWorkstationState.getFactoryYear()); lastAggState.setEmployeeId(lastNoSyncWorkstationState.getEmployeeId()); workstationAggregateStateList.add(lastAggState); } return workstationAggregateStateList; } /** * 重新构建未同步状态列表数据 * @param originalDeviceStates * @return */ private static List rebuildNotSyncWorkstationStates(List originalDeviceStates) { List stateList = new ArrayList<>(); if (Func.isNotEmpty(originalDeviceStates)) { List notSyncWorkstationStates = originalDeviceStates.stream().filter(x -> { //含义未选取fixpoint 或者非反馈点,其他类型的采集数据不处理了,我们自己就不用过滤了,因为都是NO_FEED_BACK_POINT,且isFixPoint=false return Boolean.TRUE.equals(x.getIsFixPoint()) || x.getFeedbackPointType() == null || x.getFeedbackPointType().equals(FeedbackTimePointEnum.NO_FEED_BACK_POINT.getValue()); }).map(x2 -> { //固定点,设置wcs,rps=0 if (x2.getIsFixPoint().booleanValue()) { x2.setWcs(0); x2.setRps(0); x2.setIsPlan(null); } return x2; }).collect(Collectors.toList()).stream().sorted(Comparator.comparing(DeviceState::getTime)).collect(Collectors.toList()); notSyncWorkstationStates.forEach(x3 -> { if (x3.getIsFixPoint().booleanValue()) { //是固定点,找出不晚于该固定点的最后一个点,加入stateList;如果没有找到,则将该固定点加入stateList List collect = notSyncWorkstationStates.stream().filter(y -> { //在列表中找出时间不晚于(<=)该固定点(x3)的非固定点(为了获取最后一条的数据) return !y.getIsFixPoint().booleanValue() && y.getTime().longValue() <= x3.getTime().longValue(); }).collect(Collectors.toList()); if (Func.isNotEmpty(collect)) {//除非之前没有过数据,否则这个条件(isNotEmpty)都成立 DeviceState temp = (DeviceState) BeanUtil.copy(x3, DeviceState.class); temp.setValueCollect(collect.get(collect.size() - 1).getValueCollect()); temp.setWcs(collect.get(collect.size() - 1).getWcs()); temp.setRps(collect.get(collect.size() - 1).getRps()); temp.setIsPlan(collect.get(collect.size() - 1).getIsPlan()); stateList.add(temp); return; } stateList.add(x3); return; } //非固定点,直接加入列表 stateList.add(x3); }); } return stateList; } public static List getReallyEffectWorkstationStateAggregateNoFeedbackList(List insertData, List deleteData) { HashMap workstationStateMap = new HashMap<>(); if (Func.isNotEmpty(insertData)) { insertData.forEach(item -> { workstationStateMap.put(item.getTime(), item); }); } if (Func.isNotEmpty(deleteData)) { for (AggregateState state : deleteData) { if (!workstationStateMap.containsKey(state.getTime())) { workstationStateMap.put(state.getTime(), state); } } } return workstationStateMap.values().stream().collect(Collectors.toList()); } }