fuliqi
2025-01-07 e23edcf2619ad46fd77a710fca6c21de78234bc0
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
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.mongodb.client.result.DeleteResult;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OneMachineFileResult;
import com.ycl.platform.domain.result.UY.OsdCheckResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.YwPointMapper;
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.ApiConstants;
import constant.CheckConstants;
import constant.RedisConstant;
import enumeration.general.AreaDeptEnum;
import enumeration.general.PointStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
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 YwPointMapper ywPointMapper;
    @Autowired
    private RedisTemplate redisTemplate;
 
    //同步点位在线率到mongo(弃用)
//    public void siteOnline() {
//        log.info("开始同步点位在线率到mongo");
//        List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(null);
//        if (!CollectionUtils.isEmpty(tMonitorResults)) {
//            //如果存在之前的数据先删除
//            Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
//            DeleteResult result = mongoTemplate.remove(query, TMonitorResult.class);
//            //存放在mongo中
//            mongoTemplate.insertAll(tMonitorResults);
//            log.info("结束同步点位在线率到mongo");
//        }
//    }
 
    //同步mongodb一机一档到数据库
    @Transactional(rollbackFor = Exception.class)
    public void synchronize() {
        log.info("开始同步mongodb一机一档到数据库");
//        Date yesterday = DateUtils.addDays(new Date(), -1);
        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);
        if(!CollectionUtils.isEmpty(oneMachineFileResults)) {
            //mongo品牌数据
            Query OSDQuery = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
            Map<String, OsdCheckResult> osdMap = mongoTemplate.find(query, OsdCheckResult.class).stream().collect(Collectors.toMap(OsdCheckResult::getDeviceNo, Function.identity()));
            //数据库monitor表数据
            Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
            //点位数据
            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());
 
            //准备插入设备表的数据
            List<TMonitor> monitorList = new ArrayList<>();
            //准备插入点位表的数据
            List<YwPoint> ywPointList = new ArrayList<>();
 
            //全年留存
            for (MonitorQualifyResult result : oneMachineFileResults) {
                TMonitor monitor = getMonitor(result, monitorVOMap, osdMap);
                YwPoint point = getPoint(result, pointMap, importantSite);
                monitorList.add(monitor);
                ywPointList.add(point);
            }
            //添加老数据
            List<String> numbers = CollectionUtils.isEmpty(monitorList) ? new ArrayList<>() : monitorList.stream().map(TMonitor::getSerialNumber).collect(Collectors.toList());
            monitorVOMap.forEach((key, value) -> {
                if (!numbers.contains(key)) {
                    TMonitor monitor = new TMonitor();
                    BeanUtils.copyProperties(value, monitor);
                    //填补品牌
                    OsdCheckResult osdCheckResult = osdMap.get(key);
                    if (osdCheckResult != null) {
                        monitor.setDeviceType(osdCheckResult.getDeviceBrand());
                    }
 
                    monitorList.add(monitor);
                }
            });
            List<String> points = CollectionUtils.isEmpty(ywPointList) ? new ArrayList<>() : ywPointList.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
            pointMap.forEach((key, value) -> {
                //老设备状态改为不参与考核
                if (!points.contains(key)) {
                    value.setExamineStatus(Boolean.FALSE);
                    //单位设置为空
                    value.setUnitId(null);
                    ywPointList.add(value);
                }
            });
 
            log.info("result集合{},设备集合{},点位集合{}", oneMachineFileResults.size(), monitorList.size(), ywPointList.size());
            //插入数据库
            if (!CollectionUtils.isEmpty(monitorList)) {
                monitorMapper.deleteAll();
                monitorService.saveBatch(monitorList);
            }
            if (!CollectionUtils.isEmpty(ywPointList)) {
                ywPointMapper.deleteAll();
                ywPointService.saveBatch(ywPointList);
            }
            //新的数据放入Redis中等待考核指标任务使用(弃用,改为标签形式)
//        redisTemplate.opsForValue().set(RedisConstant.New_Monitor_Set, JSONArray.toJSONString(newMonitorList));
        }
        log.info("结束同步mongodb一机一档到数据库");
    }
 
    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.setProvinceTagVideo(Boolean.FALSE);
            ywPoint.setProvinceTagCar(Boolean.FALSE);
            ywPoint.setProvinceTagFace(Boolean.FALSE);
            ywPoint.setImportantCommandImageTag(Boolean.FALSE);
            ywPoint.setCreateTime(new Date());
            ywPoint.setUpdateTime(new Date());
            ywPoint.setOnline(ApiConstants.UY_OnlineSite_Unknown);
        }
        //状态设置为考核设备
        ywPoint.setExamineStatus(Boolean.TRUE);
        //比对是否是重点点位
        if (importantSite.contains(result.getSxjcjqy().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, Map<String, OsdCheckResult> osdMap) {
        TMonitor monitor = new TMonitor();
        if (monitorVOMap.containsKey(result.getSerialNumber().getValue())) {
            monitor.setId(monitorVOMap.get(result.getSerialNumber().getValue()).getId());
            //更新品牌
            OsdCheckResult osdCheckResult = osdMap.get(result.getSerialNumber().getValue());
            if (osdCheckResult != null) {
                monitor.setDeviceType(osdCheckResult.getDeviceBrand());
            }
        }
 
        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;
    }
}