Newer
Older
newfiber-termite / newfiber-termites / newfiber-termites-dataup / src / main / java / com / newfiber / termite / service / impl / TermiteServiceImpl.java
@xiongkai xiongkai 6 days ago 23 KB 告警功能
package com.newfiber.termite.service.impl;


import cn.hutool.core.date.DateUtil;
import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.newfiber.common.core.enums.EBoolean;
import com.newfiber.common.core.exception.ServiceException;
import com.newfiber.common.core.web.page.PageResult;
import com.newfiber.common.core.web.page.PageSupport;
import com.newfiber.common.core.web.service.BaseServiceImpl;
import com.newfiber.termite.config.JingchuResourceConfig;
import com.newfiber.termite.domain.DeviceInfo;
import com.newfiber.termite.domain.DeviceMonitoringData;
import com.newfiber.termite.domain.DeviceMonitoringDataRealtime;
import com.newfiber.termite.domain.OneByOneNow;
import com.newfiber.termite.domain.Termite;
import com.newfiber.termite.domain.dto.PhotoIdentifyDto;
import com.newfiber.termite.domain.dto.SnAlarmStatisticDto;
import com.newfiber.termite.domain.dto.TermiteDataUpRequest;
import com.newfiber.termite.domain.dto.UnitInfoDto;
import com.newfiber.termite.domain.jingchu.JingChuUpload;
import com.newfiber.termite.domain.jingchu.JingchuDeviceConfig;
import com.newfiber.termite.domain.jingchu.JingchuProjectConfig;
import com.newfiber.termite.domain.request.DeviceInfoUpdateRequest;
import com.newfiber.termite.domain.request.TermiteHistoryQueryRequest;
import com.newfiber.termite.domain.request.TermiteInfoQueryRequest;
import com.newfiber.termite.domain.request.TermiteInfoSaveRequest;
import com.newfiber.termite.domain.request.TermiteInfoUpdateyRequest;
import com.newfiber.termite.domain.request.deviceInfo.DeviceInfoStateSyncRequest;
import com.newfiber.termite.domain.request.deviceMonitoringData.DeviceMonitoringDataQueryRequest;
import com.newfiber.termite.domain.response.DataUpResponse;
import com.newfiber.termite.domain.response.DeviceInfoStateSyncResponse;
import com.newfiber.termite.domain.response.TermiteInfoResponse;
import com.newfiber.termite.enums.EDeviceSyncState;
import com.newfiber.termite.enums.EDrugFlag;
import com.newfiber.termite.enums.EExistsAnt;
import com.newfiber.termite.enums.EHeatingFlag;
import com.newfiber.termite.enums.EIdentColle;
import com.newfiber.termite.mapper.TermiteMapper;
import com.newfiber.termite.service.IMonitoringWarnRecordService;
import com.newfiber.termite.service.ITermiteService;
import com.newfiber.termite.service.jingchu.IJingchuDeviceConfigService;
import com.newfiber.termite.service.jingchu.IJingchuProjectConfigService;
import com.newfiber.termite.service.jingchu.IJingchuUploadRecordService;
import com.newfiber.termite.util.CosUtil;
import com.newfiber.termite.util.FileUploadUtils;
import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
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.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@Service
public class TermiteServiceImpl extends BaseServiceImpl<TermiteMapper, Termite> implements ITermiteService {

    @Resource
    private TermiteMapper termiteMapper;

    @Resource
    private DeviceInfoServiceImpl deviceInfoService;

    @Resource
    private DeviceMonitoringDataServiceImpl deviceMonitoringDataService;

    @Resource
    private DeviceMonitoringDataRealtimeServiceImpl deviceMonitoringDataRealtimeService;

    @Resource
    private IJingchuDeviceConfigService jingchuDeviceConfigService;

    @Resource
    private IJingchuProjectConfigService jingchuProjectConfigService;

    @Resource
    private IJingchuUploadRecordService jingchuUploadRecordService;

    @Resource
    private JingchuResourceConfig jingchuResourceConfig;

    @Resource
    private MongoTemplate mongoTemplate;

//    @Resource
//    private MqttClient mqttClient;

    @Resource
    private IMonitoringWarnRecordService monitoringWarnRecordService;

    private final String JINGCHU_UPLOAD_API = "/waterDataTermites/insertDataBatch";

    CountDownLatch countDownLatch = new CountDownLatch(1);

    private final ExecutorService jingchuExecutorService = Executors.newFixedThreadPool(4);

    Font font = new Font("微软雅黑", Font.BOLD, 50);

    @Transactional(rollbackFor = Exception.class)
    public DataUpResponse termiteDataup(TermiteDataUpRequest termiteDateUpRequest, MultipartFile image){
        String date = DateUtil.formatDateTime(new Date());
        log.info("站点{}在{}时刻上传数据", termiteDateUpRequest.getSn(), date);
        String url = CosUtil.putFile(image);

        // 保存实时数据
        deviceMonitoringDataRealtimeService.deleteBySn(termiteDateUpRequest.getSn());
        DeviceMonitoringDataRealtime deviceMonitoringDataRealtime = new DeviceMonitoringDataRealtime();
        BeanUtils.copyProperties(termiteDateUpRequest, deviceMonitoringDataRealtime);
        deviceMonitoringDataRealtime.setRtpitcu(url);
        deviceMonitoringDataRealtime.setYesnoant(EExistsAnt.False.getCode());
        deviceMonitoringDataRealtime.setDruing(EDrugFlag.False.getCode());
        deviceMonitoringDataRealtime.setUptime(new Date());
        deviceMonitoringDataRealtime.setDate(DateUtil.formatDateTime(new Date()));
        deviceMonitoringDataRealtimeService.save(deviceMonitoringDataRealtime);

        mongoTemplate.save(deviceMonitoringDataRealtime, termiteDateUpRequest.getSn());

        // 保存历史数据
        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        BeanUtils.copyProperties(deviceMonitoringDataRealtime, deviceMonitoringData);
        deviceMonitoringDataService.save(deviceMonitoringData);

        // 返回是否投药、加热
        DeviceMonitoringData lastDrugingDeviceMonitoringData = deviceMonitoringDataService.lastDruging(termiteDateUpRequest.getSn());
        DeviceMonitoringData lastHeatingDeviceMonitoringData = deviceMonitoringDataService.lastHeating(termiteDateUpRequest.getSn());

        // 更新设备状态
        termiteDateUpRequest.setLastPicTime(new Date());
        deviceInfoService.update(termiteDateUpRequest);

//        mqttClient.publish("termite_mqtt", JSONObject.toJSONBytes(deviceMonitoringData), 1, true);

        return new DataUpResponse(url, lastDrugingDeviceMonitoringData, lastHeatingDeviceMonitoringData);
    }

    @Transactional(rollbackFor = Exception.class)
    public String photoIdentify(PhotoIdentifyDto dataDto, MultipartFile image) throws Exception{
        DeviceMonitoringData existedDeviceMonitoringData = deviceMonitoringDataService.selectDetail(Long.parseLong(dataDto.getId()));
        if(null == existedDeviceMonitoringData){
            log.info("监测数据不存在或未关联项目:{}", dataDto.getId());
            return String.format("监测数据不存在或未关联项目:%s", dataDto.getId());
        }
        log.info("站点{}在{}时刻更新识别结果", existedDeviceMonitoringData.getSn(), DateUtil.formatDateTime(new Date()));
        DeviceInfo deviceInfo = deviceInfoService.selectDetail(existedDeviceMonitoringData.getSn());

        String url = uploadFile(dataDto, image, existedDeviceMonitoringData, deviceInfo);

        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        deviceMonitoringData.setId(Long.parseLong(dataDto.getId()));
        deviceMonitoringData.setYesnoant(dataDto.getYesnoant());
        deviceMonitoringData.setIdenpitcu(url);
        deviceMonitoringData.setAntNumber(dataDto.getAntNumber());
        deviceMonitoringData.setOtherAntNumber(dataDto.getOtherAntNumber());
        deviceMonitoringDataService.updateById(deviceMonitoringData);

        Query updateQuery = new Query().addCriteria(Criteria.where("sn").is(existedDeviceMonitoringData.getSn())).
                addCriteria(Criteria.where("date").is(existedDeviceMonitoringData.getDate()));
        Update update = new Update().set("yesnoant", dataDto.getYesnoant()).set("idenpitcu", url);
        mongoTemplate.updateMulti(updateQuery, update, existedDeviceMonitoringData.getSn());

        DeviceMonitoringDataRealtime deviceMonitoringDataRealtime = new DeviceMonitoringDataRealtime();
        BeanUtils.copyProperties(deviceMonitoringData, deviceMonitoringDataRealtime);
        deviceMonitoringDataRealtimeService.updateById(deviceMonitoringDataRealtime);

        // 添加告警记录
        monitoringWarnRecordService.insert(deviceMonitoringDataRealtime, existedDeviceMonitoringData);

        // 上传荆楚平台
        jingchuExecutorService.execute(() -> jingChuUpload(existedDeviceMonitoringData, dataDto.getYesnoant()));

        return url;
    }

    @NotNull
    private String uploadFile(PhotoIdentifyDto dataDto, MultipartFile image, DeviceMonitoringData existedDeviceMonitoringData, DeviceInfo deviceInfo)
            throws IOException {
        String url = "";
        if(EExistsAnt.True.getCode().equals(dataDto.getYesnoant())){
            Image srcImage = ImgUtil.read(image.getInputStream());
            Img img = Img.from(srcImage);
            img.setPositionBaseCentre(false);
            img = img.pressText("项目:" + deviceInfo.getProjectName(), Color.WHITE, font, 0, 900, 1f);
            img = img.pressText("位置:" + deviceInfo.getLocation(), Color.WHITE, font, 0, 1000, 1f);
            img = img.pressText("时间:" + DateUtil.format(existedDeviceMonitoringData.getUptime(), "yyyy-MM-dd HH:mm"), Color.WHITE, font, 0, 1100, 1f);
            url = CosUtil.putFile(ImgUtil.toStream(img.getImg(), FileUtil.extName(image.getName())), FileUploadUtils.extractFilename(image));
        }else{
            url = existedDeviceMonitoringData.getRtpitcu();
        }
        return url;
    }

    private void jingChuUpload(DeviceMonitoringData existedDeviceMonitoringData, String yesnoant) {
        JingchuDeviceConfig jingchuDeviceConfig = jingchuDeviceConfigService.selectDetail(existedDeviceMonitoringData.getSn());
        JingchuProjectConfig jingchuProjectConfig = jingchuProjectConfigService.selectDetail(existedDeviceMonitoringData.getProjectCode());
        if(null != jingchuDeviceConfig && null != jingchuProjectConfig){
            JingChuUpload jingChuUpload = new JingChuUpload();
            jingChuUpload.setMnNo(jingchuProjectConfig.getMnNo());
            jingChuUpload.setObDate(existedDeviceMonitoringData.getDate().replace(" ", "T"));
            jingChuUpload.setObTime(DateUtil.format(DateUtil.parse(existedDeviceMonitoringData.getDate()), "yyMMddHHmm"));
            jingChuUpload.setOrder(jingchuDeviceConfig.getOrder());
            jingChuUpload.setReceiveType(0);
            jingChuUpload.setStationId(jingchuProjectConfig.getStationId());
            jingChuUpload.setStationName(jingchuProjectConfig.getStationName());
            jingChuUpload.setDeviceId(jingchuProjectConfig.getDeviceId());
            jingChuUpload.setDeviceName(jingchuProjectConfig.getDeviceName());

            if(EBoolean.False.getStringValue().equals(jingchuDeviceConfig.getUploadConfirmFlag())){
                jingChuUpload.setStatus(EBoolean.False.getIntValue());
            }else{
//                int status = EExistsAnt.True.getCode().equals(yesnoant) ? 1 : 0;
                jingChuUpload.setStatus(EBoolean.True.getIntValue());
            }

            List<JingChuUpload> jingChuUploadList = new ArrayList<>();
            jingChuUploadList.add(jingChuUpload);
            HttpResponse httpResponse = HttpUtil.createPost(jingchuResourceConfig.getUrl().concat(JINGCHU_UPLOAD_API)).
                    body(JSONObject.toJSONString(jingChuUploadList)).timeout(1000).
                    header("Authorization", jingchuResourceConfig.getToken()).execute();
            jingchuUploadRecordService.insert(jingchuProjectConfig.getProjectCode(), jingchuDeviceConfig.getSn(),
                    jingchuDeviceConfig.getOrder(), JSONObject.toJSONString(jingChuUpload), httpResponse.body());
//            log.info("同步荆楚监测数据.请求:{},响应:{}", JSONObject.toJSONString(jingChuUpload), httpResponse.body());
        }
    }

    @Override
    public DeviceInfoStateSyncResponse syncDeviceState(DeviceInfoStateSyncRequest request) {
        String date = DateUtil.formatDateTime(new Date());
        log.info("站点{}在{}时刻同步设备数据", request.getSn(), date);

        try {
            DeviceInfo deviceInfo = deviceInfoService.selectDetail(request.getSn());

            // 返回是否投药、加热
            DeviceMonitoringData lastDrugingDeviceMonitoringData = deviceMonitoringDataService.lastDruging(request.getSn());
            DeviceMonitoringData lastHeatingDeviceMonitoringData = deviceMonitoringDataService.lastHeating(request.getSn());

            // 返回识别结果
            List<DeviceMonitoringData> deviceMonitoringDataList = null;
            if(null != request.getAntStartDate() && null != request.getAntEndDate()){
                deviceMonitoringDataList = deviceMonitoringDataService.selectList(request.getSn(), request.getAntStartDate(), request.getAntEndDate());
            }

            // 更新设备状态
            deviceInfoService.update(request);

            return new DeviceInfoStateSyncResponse(deviceInfo, lastDrugingDeviceMonitoringData, lastHeatingDeviceMonitoringData, deviceMonitoringDataList);
        }catch (Exception e){
            e.printStackTrace();
            deviceInfoService.update(request.getSn(), EDeviceSyncState.fail);
        }

        return new DeviceInfoStateSyncResponse(request.getSn());
    }

    @Override
    public List<TermiteInfoResponse> querytermiteData(TermiteInfoQueryRequest request){
        return termiteMapper.querytermiteData(request);
    }

    @Override
    public boolean updateMonitorData(TermiteInfoUpdateyRequest request){
        DeviceMonitoringDataRealtime deviceMonitoringDataRealtime = new DeviceMonitoringDataRealtime();
        BeanUtils.copyProperties(request, deviceMonitoringDataRealtime);

        Query updateQuery = new Query().addCriteria(Criteria.where("sn").is(request.getSn())).
                addCriteria(Criteria.where("_id").is(request.getId()));
        Update update = new Update();
        for(Field field : ReflectUtil.getFields(request.getClass())){
            if("id".equals(field.getName())){
                continue;
            }
            Object fieldValue = ReflectUtil.getFieldValue(request, field);
            if(null != fieldValue){
                update.set(field.getName(), fieldValue);
            }
        }

        if(EDrugFlag.True.getCode().equals(request.getDruing())){
            deviceMonitoringDataRealtime.setDruingDatetime(new Date());
            update.set("druingDatetime", new Date());
        }
        if(EHeatingFlag.True.getCode().equals(request.getHeating())){
            deviceMonitoringDataRealtime.setHeatingDatetime(new Date());
            update.set("heatingDatetime", new Date());
        }
        deviceMonitoringDataRealtimeService.updateById(deviceMonitoringDataRealtime);
        mongoTemplate.updateMulti(updateQuery, update, deviceMonitoringDataRealtime.getSn());

        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        BeanUtils.copyProperties(deviceMonitoringDataRealtime, deviceMonitoringData);
        deviceMonitoringDataService.updateById(deviceMonitoringData);

        // 更新第一次报警时间
        DeviceInfo deviceInfo = deviceInfoService.selectDetail(request.getSn());
        if(null == deviceInfo.getFirstWarnDatetime() && EIdentColle.True.getCode().equals(request.getIdencolle())){
            DeviceMonitoringDataQueryRequest deviceMonitoringDataQueryRequest = new DeviceMonitoringDataQueryRequest();
            deviceMonitoringDataQueryRequest.setSn(request.getSn());
            deviceMonitoringDataQueryRequest.setYesnoant(EExistsAnt.True.getCode());
            deviceMonitoringDataQueryRequest.setIdencolle(EIdentColle.True.getCode());
            deviceMonitoringDataQueryRequest.setOrderBy("date asc");
            List<DeviceMonitoringData> deviceMonitoringDataList = deviceMonitoringDataService.selectList(deviceMonitoringDataQueryRequest);
            if(deviceMonitoringDataList.size() >= 3){
                deviceInfo.setFirstWarnDatetime(DateUtil.parse(deviceMonitoringDataList.get(0).getDate()));
                deviceInfoService.updateById(deviceInfo);

                // 确认告警后,后续每次数据都传给荆楚
                jingchuDeviceConfigService.updateUploadConfirmFlag(deviceInfo.getSn(), EBoolean.True.getStringValue());
            }
        }
        return true;
    }

    @Override
    public boolean updateMonitorDevice(DeviceInfoUpdateRequest request){
        termiteMapper.updateMonitorDevice(request);
        return true;
    }

    @Override
    public PageResult<List<TermiteInfoResponse>> queryhistoryData(TermiteHistoryQueryRequest request){
//        DeviceInfo deviceInfo = deviceInfoService.selectDetail(request.getSn());
//
//        Query query = new Query().with(Sort.by(Sort.Direction.DESC, "date"));
//        Criteria criteria = new Criteria();
//
//        if (null != request.getStarttime()) {
//            criteria.andOperator(Criteria.where("tt").gte(request.getStarttime()));
//        }
//        if (null != request.getEndtime()) {
//            criteria.andOperator(Criteria.where("tt").lte(request.getEndtime()));
//        }
//        if (null != request.getYesnoant()) {
//            criteria.andOperator(Criteria.where("yesnoant").lte(request.getYesnoant()));
//        }
//        if (null != request.getIdencolle()) {
//            criteria.andOperator(Criteria.where("idencolle").lte(request.getIdencolle()));
//        }
//        if (null != request.getDruing()) {
//            criteria.andOperator(Criteria.where("druing").lte(request.getDruing()));
//        }
//
//        Long countNum = mongoTemplate.count(query, request.getSn());
//
//        PageDomain pageDomain = PageSupport.buildPageRequest();
//        Integer pageNum = pageDomain.getPageNum();
//        Integer pageSize = pageDomain.getPageSize();
//        query.skip((pageNum - 1) * pageSize).limit(pageSize);
//
//        List<TermiteInfoResponse> responseList = new ArrayList<>();
//        List<DeviceMonitoringDataRealtime> deviceMonitoringDataRealtimeList = mongoTemplate.find(query, DeviceMonitoringDataRealtime.class, request.getSn());
//        for(DeviceMonitoringDataRealtime realtime : deviceMonitoringDataRealtimeList){
//            TermiteInfoResponse response = new TermiteInfoResponse();
//            BeanUtils.copyProperties(realtime, response);
//            response.setLocation(deviceInfo.getLocation());
//            responseList.add(response);
//        }
//
//        return new PageResult<>(responseList, countNum);
        return PageSupport.pageResult(termiteMapper.queryhistoryData(request));
    }

    @Override
    public boolean insertMonitorDevice(TermiteInfoSaveRequest request){
        DeviceInfo existDeviceInfo = deviceInfoService.selectDetailByCategory(request.getCategory(), request.getSn());
        if(null != existDeviceInfo){
            throw new ServiceException(String.format("站点%s已存在", request.getSn()));
        }

        DeviceInfo deviceInfo = new DeviceInfo();
        BeanUtils.copyProperties(request, deviceInfo);
        deviceInfoService.save(deviceInfo);
        if(!mongoTemplate.collectionExists(request.getSn())){
            mongoTemplate.createCollection(request.getSn());
        }

        return true;
    }

    @Override
    public boolean removeMonitorDevice(String id){
        deviceInfoService.delete(id);
        return true;
    }

    @Override
    public boolean updateModlefirstData(String sn){
        String newphoto = termiteMapper.querynewphoto(sn);
        termiteMapper.updateModlefirstData(sn,newphoto);
        return true;
    }

    @Override
    public UnitInfoDto queryUnitdata(){
        return termiteMapper.queryUnitdata();
    }

     @Override
    public List<SnAlarmStatisticDto> querySnalarmStatistic(String projectCode){
        List<SnAlarmStatisticDto> result = new ArrayList<>();
        //查询所有站点的数据信息
         List<DeviceInfo> deviceInfoList = deviceInfoService.selectList(projectCode);
         List<DeviceInfo> offlineDeviceList = new ArrayList<>();

        AtomicInteger outlineflag = new AtomicInteger(0);
         deviceInfoList.forEach(e->{
            Date date1 = new Date();
            if(e.getLastPicTime() != null){
                Date date2 =e.getLastPicTime();
                double diff = Math.abs(date1.getTime()-date2.getTime());
                double diffdays = diff/(1000l*60l*60l*24l);
                if(diffdays>1){
                    outlineflag.getAndIncrement();
                    offlineDeviceList.add(e);
                }
            }else {
                outlineflag.getAndIncrement();
                offlineDeviceList.add(e);
            }
        });

         List<DeviceInfo> onlineDeviceList = deviceInfoList.stream().filter(t -> !offlineDeviceList.contains(t)).collect(Collectors.toList());
        int onlineflag = deviceInfoList.size()- outlineflag.get();
        SnAlarmStatisticDto snAlarmStatisticDto =new SnAlarmStatisticDto();
        snAlarmStatisticDto.setName("在线");
        snAlarmStatisticDto.setValue(onlineflag);
        snAlarmStatisticDto.setDeviceInfo(onlineDeviceList);
        result.add(snAlarmStatisticDto);
        SnAlarmStatisticDto snAlarmStatisticDto2 =new SnAlarmStatisticDto();
        snAlarmStatisticDto2.setName("离线");
        snAlarmStatisticDto2.setValue(outlineflag.get());
        snAlarmStatisticDto2.setDeviceInfo(offlineDeviceList);
        result.add(snAlarmStatisticDto2);
        SnAlarmStatisticDto snAlarmStatisticDto3 =new SnAlarmStatisticDto();
        snAlarmStatisticDto3.setName("告警");
        snAlarmStatisticDto3.setValue(deviceInfoList.stream().filter(t -> null != t.getFirstWarnDatetime()).count());
        snAlarmStatisticDto3.setDeviceInfo(deviceInfoList.stream().filter(t -> null != t.getFirstWarnDatetime()).collect(Collectors.toList()));
        result.add(snAlarmStatisticDto3);
        return result;
    }

    @Override
    public Object queryNowWeather(){
        String url = "https://gfapi.mlogcn.com/weather/v001/now?areacode=101201403&key=F2hH0eoTQS99jaKr3v4AIWFQkJwRjMAU&output_type=json";

        String forEntity = HttpUtil.get(url);
        JSONObject object = JSONObject.parseObject(forEntity);
        JSONObject result = JSONObject.parseObject(JSON.toJSONString(object.get("result")));
        OneByOneNow oneByOneHours = JSONObject.parseObject(JSONObject.toJSONString(result.get("realtime")),OneByOneNow.class);
        return oneByOneHours;
    }

    @Override
    public void transferMySql2Mongo() {
        List<DeviceInfo> deviceInfoList = deviceInfoService.list();
        for(DeviceInfo deviceInfo : deviceInfoList){
            if(!mongoTemplate.collectionExists(deviceInfo.getSn())){
                mongoTemplate.createCollection(deviceInfo.getSn());
            }

            List<DeviceMonitoringData> deviceMonitoringDataList = deviceMonitoringDataService.selectList(deviceInfo.getSn());
            for(DeviceMonitoringData deviceMonitoringData : deviceMonitoringDataList){

                Query query = new Query().addCriteria(Criteria.where("date").is(deviceMonitoringData.getDate()));
                if(!mongoTemplate.exists(query, deviceInfo.getSn())){
                    mongoTemplate.save(deviceMonitoringDataList, deviceInfo.getSn());
                }
            }

        }
    }

}