fuliqi
2024-08-09 b04753affc29f1042d0eb75b0af87824a0f4a8aa
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.ycl.task;
 
 
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.result.UY.OneMachineFileResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.service.ITMonitorService;
import com.ycl.platform.service.YwPointService;
import com.ycl.system.entity.SysDictData;
import com.ycl.system.service.ISysDictDataService;
import com.ycl.utils.DateUtils;
import constant.RedisConstant;
import enumeration.general.AreaDeptEnum;
import enumeration.general.PointStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
/**
 * 当天晚上 同步mongodb一机一档到数据库
 */
@Slf4j
@Component("monitorTask")
public class MonitorTask {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private ITMonitorService monitorService;
    @Autowired
    private ISysDictDataService dictDataService;
    @Autowired
    private YwPointService ywPointService;
    @Autowired
    private RedisTemplate redisTemplate;
 
    //同步mongodb一机一档到数据库
    public void synchronize() {
        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
        List<OneMachineFileResult> oneMachineFileResults = mongoTemplate.find(query, OneMachineFileResult.class);
        //数据库monitor表数据
        Map<String, TMonitorVO> monitorVOMap = monitorService.selectTMonitorList(null).stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
        //准备插入设备表的数据
        List<TMonitor> monitorList = new ArrayList<>();
        //准备插入点位表的数据
        List<YwPoint> ywPointList = new ArrayList<>();
        //新的数据,原数据库中不存在的数据
        Set<TMonitor> newMonitorList = new HashSet<>();
        //点位数据
        Map<String, YwPoint> pointMap = ywPointService.list(new QueryWrapper<YwPoint>()).stream().collect(Collectors.toMap(YwPoint::getSerialNumber, Function.identity()));
        //重点点位集合字典(解析SXJCJQY字段)
        SysDictData sysDictData = new SysDictData();
        sysDictData.setDictType("platform_important_site");
        List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData);
        List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList());
 
        //TODO:全年留存还是单次留存
        for (OneMachineFileResult result : oneMachineFileResults) {
            TMonitor monitor = getMonitor(result,monitorVOMap);
            YwPoint point = getPoint(result, pointMap, importantSite);
            monitorList.add(monitor);
            ywPointList.add(point);
            //比对筛选出新的数据
            if (!CollectionUtils.isEmpty(monitorVOMap) && !monitorVOMap.containsKey(result.getSBBM())) {
                newMonitorList.add(monitor);
            }
        }
        //插入数据库
        if (!CollectionUtils.isEmpty(monitorList)) {
            monitorService.saveOrUpdateBatch(monitorList);
        }
        if(!CollectionUtils.isEmpty(ywPointList)){
            ywPointService.saveOrUpdateBatch(ywPointList);
        }
        //新的数据放入Redis中等待考核指标任务使用
        redisTemplate.opsForValue().set(RedisConstant.New_Monitor_Set, JSONArray.toJSONString(newMonitorList));
    }
 
    private YwPoint getPoint(OneMachineFileResult result, Map<String, YwPoint> pointMap, List<String> importantSite) {
        YwPoint ywPoint = new YwPoint();
        if (pointMap.containsKey(result.getSBBM())) {
            ywPoint = pointMap.get(result.getSBBM());
        }else {
            ywPoint.setPointName(result.getSBMC());
            ywPoint.setStatus(PointStatus.WAIT.getDesc());
            ywPoint.setSerialNumber(result.getSBBM());
            ywPoint.setImportantTag(Boolean.FALSE);
            ywPoint.setProvinceTag(Boolean.FALSE);
            ywPoint.setCreateTime(new Date());
            ywPoint.setUpdateTime(new Date());
        }
        //比对是否是重点点位
        if (importantSite.contains(result.getSBBM())) {
            ywPoint.setImportantTag(Boolean.TRUE);
        }
        //解析deptId
        //区域行政编码
        String areaCode = result.getSBBM().substring(0, 6);
        AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
        //如果解析不出区域deptId为-1
        Integer deptId = -1;
        if(areaDeptEnum!=null){
            deptId = areaDeptEnum.getDeptId();
        }
        ywPoint.setDeptId(Long.valueOf(deptId + ""));
 
        return ywPoint;
    }
 
    private TMonitor getMonitor(OneMachineFileResult result, Map<String, TMonitorVO> monitorVOMap) {
        TMonitor monitor = new TMonitor();
        if (monitorVOMap.containsKey(result.getSBBM())) {
            monitor.setId(monitorVOMap.get(result.getSBBM()).getId());
        }
        monitor.setSerialNumber(result.getSBBM());
        monitor.setName(result.getSBMC());
        monitor.setSiteType(Long.valueOf(result.getJKDWLX()));
        monitor.setMacAddr(result.getMACDZ());
        monitor.setIp(result.getIP());
        monitor.setCameraFunType(result.getSXJGNLX());
        monitor.setLongitude(result.getJD() + "");
        monitor.setLatitude(result.getWD() + "");
        monitor.setCameraCaptureArea(result.getSXJCJQY());
        monitor.setOnState(Long.valueOf(result.getSBZT()));
        //国标码前八位为行政编码
        monitor.setCivilCode(result.getSBBM().substring(0, 8));
        return monitor;
    }
}