Newer
Older
newfiber-termite / newfiber-termites / newfiber-termites-dataup / src / main / java / com / newfiber / termite / service / impl / TermiteServiceImpl.java
@xiongkai xiongkai on 2 Jul 16 KB 集成mq
package com.newfiber.termite.service.impl;


import cn.hutool.core.date.DateUtil;
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.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.ITermiteService;
import com.newfiber.termite.service.jingchu.IJingchuDeviceConfigService;
import com.newfiber.termite.service.jingchu.IJingchuProjectConfigService;
import com.newfiber.termite.util.CosUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
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 JingchuResourceConfig jingchuResourceConfig;

    @Resource
    private MongoTemplate mongoTemplate;

//    @Resource
//    private MqttClient mqttClient;

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

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

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

        // 保存历史数据
        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        BeanUtils.copyProperties(termiteDateUpRequest, deviceMonitoringData);
        deviceMonitoringData.setRtpitcu(url);
        deviceMonitoringData.setYesnoant(EExistsAnt.False.getCode());
        deviceMonitoringData.setDruing(EDrugFlag.False.getCode());
        deviceMonitoringData.setUptime(new Date());
        deviceMonitoringData.setDate(DateUtil.formatDateTime(new Date()));
        deviceMonitoringDataService.save(deviceMonitoringData);

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

        // 保存实时数据
        deviceMonitoringDataRealtimeService.deleteBySn(termiteDateUpRequest.getSn());
        DeviceMonitoringDataRealtime deviceMonitoringDataRealtime = new DeviceMonitoringDataRealtime();
        BeanUtils.copyProperties(deviceMonitoringData, deviceMonitoringDataRealtime);
        deviceMonitoringDataRealtimeService.save(deviceMonitoringDataRealtime);

        // 返回是否投药、加热
        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()));
        log.info("站点{}在{}时刻更新识别结果", existedDeviceMonitoringData.getSn(), DateUtil.formatDateTime(new Date()));

        String url = CosUtil.putFile(image);

        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        deviceMonitoringData.setId(Long.parseLong(dataDto.getId()));
        deviceMonitoringData.setYesnoant(dataDto.getYesnoant());
        deviceMonitoringData.setIdenpitcu(url);
        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);

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

        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(status);
            }

            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();
            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){
        // TODO
        DeviceMonitoringData deviceMonitoringData = new DeviceMonitoringData();
        BeanUtils.copyProperties(request, deviceMonitoringData);
        if(EDrugFlag.True.getCode().equals(request.getDruing())){
            deviceMonitoringData.setDruingDatetime(new Date());
        }
        if(EHeatingFlag.True.getCode().equals(request.getHeating())){
            deviceMonitoringData.setHeatingDatetime(new Date());
        }
        deviceMonitoringDataService.updateById(deviceMonitoringData);

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

        // 更新第一次报警时间
        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 List<TermiteInfoResponse> queryhistoryData(TermiteHistoryQueryRequest request){
        // TODO
        return termiteMapper.queryhistoryData(request);
    }

    @Override
    public boolean insertMonitorDevice(TermiteInfoSaveRequest request){
        termiteMapper.insertMonitorDevice(request);
        return true;
    }
    @Override
    public boolean removeMonitorDevice(String id){
        termiteMapper.removeMonitorDevice(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);
        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();
                }
            }else {
                outlineflag.getAndIncrement();
            }
        });
        int onlineflag = deviceInfoList.size()- outlineflag.get();
        SnAlarmStatisticDto snAlarmStatisticDto =new SnAlarmStatisticDto();
        snAlarmStatisticDto.setName("在线");
        snAlarmStatisticDto.setValue(onlineflag);
        result.add(snAlarmStatisticDto);
        SnAlarmStatisticDto snAlarmStatisticDto2 =new SnAlarmStatisticDto();
        snAlarmStatisticDto2.setName("离线");
        snAlarmStatisticDto2.setValue(outlineflag.get());
        result.add(snAlarmStatisticDto2);
        SnAlarmStatisticDto snAlarmStatisticDto3 =new SnAlarmStatisticDto();
        snAlarmStatisticDto3.setName("告警");
        snAlarmStatisticDto3.setValue(deviceInfoList.stream().filter(t -> null != t.getFirstWarnDatetime()).count());
        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());
            mongoTemplate.save(deviceMonitoringDataList, deviceInfo.getSn());

        }
    }

}