yangys
2025-05-09 e0d3490c2c785a9e94b3ef5128be97da2978956f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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:300000}")
    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);
        
    }
    
}