package com.qianwen.mdc.collect.service; import java.util.Arrays; import java.util.Date; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.qianwen.mdc.collect.cache.WorkstationCache; import com.qianwen.mdc.collect.dto.WorkstationDTO; import com.qianwen.mdc.collect.entity.iotdb.DeviceState; import com.qianwen.mdc.collect.entity.iotdb.ProcessParam; import com.qianwen.mdc.collect.enums.FeedbackTimePointEnum; import com.qianwen.mdc.collect.mapper.iotdb.ProcessParamMapper; import com.qianwen.mdc.collect.vo.FactoryDataVO; import cn.hutool.core.util.ObjectUtil; /** * 设备离线处理服务,超过一定时间无采集数据判定为离线,插入离线状态数据 */ @Service public class DeviceOfflineCheckService{ private static final Logger log = LoggerFactory.getLogger(DeviceOfflineCheckService.class); /** * 离线判定时长,默认5分钟 */ @Value("${offlineConfigDuration:3000000}") private long offlineConfigDuration; public static final String OFFLINE_VALUE = "4";//离线状态值 @Autowired private ProcessParamService paramService; @Autowired private WorkstationCache workstationCache; @Autowired private ProcessParamMapper processParamMapper; @Autowired private FactoryDataService factoryDataService; /** * 保存状态固定点数据(state_{workstationId}) * @param workstationIdList */ public void checkOffline() { //将数据按照工位id分组 Map workstationsMap = workstationCache.getWorkstations(); if (ObjectUtil.isEmpty(workstationsMap)) { log.info("缓存无设备数据,退出"); return; } Set workstationIds = workstationsMap.keySet(); log.info("离线检查工位总数:{}",workstationsMap.size()); for(String workstationId :workstationIds) { log.info("开始检查工位{}的离线状态",workstationId); Long wid = Long.parseLong(workstationId); handleWorkstationOffline(wid); } } /** * 检查一个工位是否离线,离线则填充离线状态数据 * @param workstationId */ public void handleWorkstationOffline(long workstationId) { ProcessParam lastParam = processParamMapper.lastParamByWorstationId(workstationId); long nowMills = System.currentTimeMillis(); long onlineRange = nowMills - offlineConfigDuration; if(lastParam != null && lastParam.getTime()> onlineRange) { //有数据,且在判定时间内-》在线 return; } //TODO 这里一直离线是什么数据 //时间段内无参数,说明设备没采集数据判定为离线,插入状态,然后发送realTime消息给mdc ProcessParam statusParam = new ProcessParam(); statusParam.setTime(nowMills); statusParam.setN("DeviceStatus"); statusParam.setV(OFFLINE_VALUE); statusParam.setWorkstationId(workstationId); if(lastParam == null || !lastParam.getN().equals("DeviceStatus")) { //之前无任何采集的数据(或者上一条不是状态数据),新加一条离线状态数据 paramService.insertProcessParam(statusParam); } //通知mdc更新实时状态 paramService.sendRealtimeDataMsg(statusParam); } }