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<String, WorkstationDTO> workstationsMap = workstationCache.getWorkstations();
|
if (ObjectUtil.isEmpty(workstationsMap)) {
|
log.info("缓存无设备数据,退出");
|
return;
|
}
|
|
Set<String> 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);
|
|
}
|
|
}
|