xiangpei
2024-08-16 983b100e79431dea9a471168dae451d2f7399b76
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OneMachineFileResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.mapper.TMonitorMapper;
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 com.ycl.utils.StringUtils;
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.transaction.annotation.Transactional;
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 TMonitorMapper monitorMapper;
    @Autowired
    private ISysDictDataService dictDataService;
    @Autowired
    private YwPointService ywPointService;
    @Autowired
    private RedisTemplate redisTemplate;
 
    //同步mongodb一机一档到数据库
    @Transactional
    public void synchronize() {
        // 获取Calendar实例,默认使用当前时区和语言环境
        Calendar calendar = Calendar.getInstance();
        // 清除Calendar中的所有字段值,以避免它们对当前日期时间有影响
        calendar.clear();
        // 设置年份、月份(注意:月份是从0开始的,所以8月是7)、日期
        calendar.set(Calendar.YEAR, 2024);
        calendar.set(Calendar.MONTH, Calendar.AUGUST);
        calendar.set(Calendar.DAY_OF_MONTH, 13);
        // Calendar.getTime()方法返回一个表示此Calendar时间值的Date对象
        Date date = calendar.getTime();
        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
//        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
        //数据库monitor表数据
        Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().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());
 
        //全年留存
        for (MonitorQualifyResult 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.getSerialNumber().getValue())) {
                newMonitorList.add(monitor);
            }
        }
        log.info("result集合{},设备集合{},点位集合{}", oneMachineFileResults.size(), monitorList.size(), ywPointList.size());
        //插入数据库
        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(MonitorQualifyResult result, Map<String, YwPoint> pointMap, List<String> importantSite) {
        YwPoint ywPoint = new YwPoint();
        if (pointMap.containsKey(result.getSerialNumber().getValue())) {
            ywPoint = pointMap.get(result.getSerialNumber().getValue());
        } else {
            ywPoint.setPointName(result.getName().getValue());
            ywPoint.setStatus(PointStatus.WAIT.getDesc());
            ywPoint.setSerialNumber(result.getSerialNumber().getValue());
            ywPoint.setImportantTag(Boolean.FALSE);
            ywPoint.setProvinceTag(Boolean.FALSE);
            ywPoint.setCreateTime(new Date());
            ywPoint.setUpdateTime(new Date());
        }
        //比对是否是重点点位
        if (importantSite.contains(result.getSerialNumber().getValue())) {
            ywPoint.setImportantTag(Boolean.TRUE);
        }
        //解析deptId
        //区域行政编码
        String serialNumber = result.getSerialNumber().getValue();
        Integer deptId = -1;
        if (!StringUtils.isEmpty(serialNumber)) {
            String areaCode = serialNumber.substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            //如果解析不出区域deptId为-1
            if (areaDeptEnum != null) {
                deptId = areaDeptEnum.getDeptId();
            }
        }
        ywPoint.setDeptId(Long.valueOf(deptId + ""));
        return ywPoint;
    }
 
    private TMonitor getMonitor(MonitorQualifyResult result, Map<String, TMonitorVO> monitorVOMap) {
        TMonitor monitor = new TMonitor();
        if (monitorVOMap.containsKey(result.getSerialNumber().getValue())) {
            monitor.setId(monitorVOMap.get(result.getSerialNumber().getValue()).getId());
        }
        monitor.setSerialNumber(result.getSerialNumber().getValue());
        monitor.setName(result.getName().getValue());
        String siteType = result.getJkdwlx().getValue();
        if (!StringUtils.isEmpty(siteType)) {
            monitor.setSiteType(Long.valueOf(siteType));
        }
        monitor.setMacAddr(result.getMacdz().getValue());
        monitor.setIp(result.getIp().getValue());
        monitor.setCameraFunType(result.getSxjgnlx().getValue());
        monitor.setLongitude(result.getLongitude().getValue());
        monitor.setLatitude(result.getLatitude().getValue() + "");
        monitor.setCameraCaptureArea(result.getSxjcjqy().getValue());
        String onState = result.getSbzt().getValue();
        if (!StringUtils.isEmpty(onState)) {
            monitor.setOnState(Long.valueOf(onState));
        }
        //国标码前八位为行政编码
        String serialNumber = result.getSerialNumber().getValue();
        if (!StringUtils.isEmpty(serialNumber)) {
            monitor.setCivilCode(serialNumber.substring(0, 8));
        }
        return monitor;
    }
}