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