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 oneMachineFileResults = mongoTemplate.find(query, OneMachineFileResult.class); //数据库monitor表数据 Map monitorVOMap = monitorService.selectTMonitorList(null).stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); //准备插入设备表的数据 List monitorList = new ArrayList<>(); //准备插入点位表的数据 List ywPointList = new ArrayList<>(); //新的数据,原数据库中不存在的数据 Set newMonitorList = new HashSet<>(); //点位数据 Map pointMap = ywPointService.list(new QueryWrapper()).stream().collect(Collectors.toMap(YwPoint::getSerialNumber, Function.identity())); //重点点位集合字典(解析SXJCJQY字段) SysDictData sysDictData = new SysDictData(); sysDictData.setDictType("platform_important_site"); List DictDataList = dictDataService.selectDictDataList(sysDictData); List 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 pointMap, List 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 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; } }