wisdomisite-java/src/main/java/com/zhgd/xmgl/task/EnvironmentDevTask.java
2024-03-16 14:00:57 +08:00

263 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.zhgd.xmgl.task;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gexin.fastjson.JSON;
import com.zhgd.redis.lock.RedisRepository;
import com.zhgd.xmgl.modules.environment.entity.DustNoiseData;
import com.zhgd.xmgl.modules.environment.entity.EnvironmentDev;
import com.zhgd.xmgl.modules.environment.mapper.DustNoiseDataMapper;
import com.zhgd.xmgl.modules.environment.mapper.EnvironmentDevMapper;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.modules.sprayrt.entity.SprayRtDev;
import com.zhgd.xmgl.modules.sprayrt.mapper.SprayRtDevMapper;
import com.zhgd.xmgl.modules.sprayrt.service.ISprayRtDevService;
import com.zhgd.xmgl.modules.sprayrt.service.impl.SprayRtDevServiceImpl;
import com.zhgd.xmgl.task.dto.EnvironmentDustDataDto;
import com.zhgd.xmgl.util.EnvironmentUtils;
import com.zhgd.xmgl.util.WindDirectionUtils;
import com.zhgd.xmgl.util.XiwonUtil;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
* @program: wisdomSite
* @description: 环境设备实时数据
* @author: Mr.Peng
* @create: 2021-07-12 13:41
**/
@Slf4j
@RestController
@RequestMapping("/xmgl/task")
public class EnvironmentDevTask {
@Autowired
private EnvironmentDevMapper environmentDevMapper;
@Autowired
private SprayRtDevMapper sprayRtDevMapper;
@Autowired
private DustNoiseDataMapper dustNoiseDataMapper;
@Autowired
private RedisRepository redisRepository;
@Autowired
private ISprayRtDevService sprayRtDevService;
@Value("${isGetEnvironmentData}")
private boolean isGetEnvironmentData;
@Autowired
private ProjectMapper projectMapper;
@Resource
private XiwonUtil xiwonUtil;
/**
* 定时调用外部接口拉取设备实时数据
*/
@Scheduled(cron = "0 0/2 * * * ?")
@SchedulerLock(name = "getEnvironmentData", lockAtMostFor = 1000 * 60 * 2, lockAtLeastFor = 1000 * 60 * 1)
public void getStandardData() {
if (isGetEnvironmentData) {
try {
QueryWrapper<EnvironmentDev> queryWrapper = new QueryWrapper<>();
List<EnvironmentDev> list = environmentDevMapper.selectList(queryWrapper);
if (list != null && list.size() > 0) {
JSONArray array = EnvironmentUtils.getDeviceData("");
for (EnvironmentDev dev : list) {
List<Double> pm10List = new ArrayList<>();
List<Double> pm25List = new ArrayList<>();
if (array != null && array.size() > 0) {
for (int i = 0; i < array.size(); i++) {
JSONObject obj = array.getJSONObject(i);
if (dev.getDeviceId().equals(obj.getString("deviceAddr"))) {
//判断设备是否在线
if ("2".equals(obj.getString("deviceStatus"))) {
JSONArray jsonArray = obj.getJSONArray("realTimeData");
if (jsonArray != null && jsonArray.size() > 0) {
for (int a = 0; a < jsonArray.size(); a++) {
JSONObject obj2 = jsonArray.getJSONObject(a);
if (obj2.getString("dataName").indexOf("PM10") >= 0) {
if (StringUtils.isNotEmpty(obj2.getString("dataValue")) && obj2.getDouble("dataValue") != 0d) {
pm10List.add(Double.valueOf(obj2.getString("dataValue")));
}
} else if (obj2.getString("dataName").indexOf("PM2.5") >= 0) {
if (StringUtils.isNotEmpty(obj2.getString("dataValue")) && obj2.getDouble("dataValue") != 0d) {
pm25List.add(Double.valueOf(obj2.getString("dataValue")));
}
}
}
}
}
}
}
//没有数据不插入
if (pm10List.size() > 0 || pm10List.size() > 0) {
DecimalFormat df = new DecimalFormat("#.00");
DustNoiseData dustNoiseData = new DustNoiseData();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dustNoiseData.setUploadDate(sdf.format(new Date()));
dustNoiseData.setProjectSn(dev.getProjectSn());
dustNoiseData.setDeviceId(dev.getDeviceId());
if (pm10List.size() > 0) {
//计算pm10平均值
double avg = pm10List.stream().collect(Collectors.averagingDouble(n -> n));
dustNoiseData.setPm10(Double.valueOf(df.format(avg)));
}
if (pm25List.size() > 0) {
//计算pm2.5平均值
double avg = pm25List.stream().collect(Collectors.averagingDouble(n -> n));
dustNoiseData.setPm25(Double.valueOf(df.format(avg)));
}
dustNoiseDataMapper.insert(dustNoiseData);
EnvironmentDev tempEnvironmentDev = new EnvironmentDev();
tempEnvironmentDev.setId(dev.getId());
tempEnvironmentDev.setRealTime(new Date());
environmentDevMapper.updateById(tempEnvironmentDev);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 获取扬尘数据(携稳) 每5分钟触发任务
*/
@SchedulerLock(name = "getEnvironmentDustData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
@Scheduled(cron = "0 0/5 * * * ?")
@RequestMapping("dustData")
public void getEnvironmentDustData() {
log.info("获取扬尘数据(携稳)开始任务");
List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.isNotNull(Project::getXiwonAppId)
.isNotNull(Project::getXiwonAppSecret)
);
for (Project project : projects) {
// 获取设备列表
List<EnvironmentDev> devList = environmentDevMapper.selectList(new LambdaQueryWrapper<EnvironmentDev>()
.eq(EnvironmentDev::getProjectSn, project.getProjectSn()));
devList.forEach(dev -> CompletableFuture.runAsync(() -> {
doGetEnvironmentDustData(dev, project);
}).exceptionally(throwable -> {
log.error("err", throwable);
return null;
})
);
}
}
private void doGetEnvironmentDustData(EnvironmentDev dev, Project project) {
// 设备sn
String devSn = dev.getDeviceId();
log.info("doGetEnvironmentDustData设备sn{}", devSn);
DustNoiseData newestData = dustNoiseDataMapper.selectOne(new LambdaQueryWrapper<DustNoiseData>().eq(DustNoiseData::getDeviceId, devSn).orderByDesc(DustNoiseData::getXiewenId).last("limit 1"));
// 请求参数
Map<String, Object> map = new HashMap<>(4);
map.put("pageSize", "10");
map.put("pageNum", "1");
JSONObject realTimeData = xiwonUtil.postForm("/dust/realTimeData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
map.put("deviceSn", devSn);
if (newestData != null && newestData.getXiewenId() != null) {
map.put("dataId", newestData.getXiewenId());
}
return map;
}));
log.info("携稳接口响应数据扬尘devSn:{}rs:{}", devSn, JSON.toJSONString(realTimeData));
Integer code = realTimeData.getInteger("code");
// code校验是否成功请求
if (code == HttpStatus.OK.value()) {
JSONArray dataArray = realTimeData.getJSONArray("data");
if (CollUtil.isNotEmpty(dataArray)) {
// 解析请求到的参数,保存到我们的数据库
for (Object o : dataArray) {
EnvironmentDustDataDto dto = BeanUtil.toBean(o, EnvironmentDustDataDto.class);
DustNoiseData data = new DustNoiseData();
data.setProjectSn(dev.getProjectSn());
data.setDeviceId(devSn);
data.setUploadDate(dto.getTime());
data.setPm10(dto.getPmTen() != null ? Double.valueOf(dto.getPmTen()) : null);
data.setPm25(dto.getPmTah() != null ? Double.valueOf(dto.getPmTah()) : null);
data.setNoise(dto.getNoise() != null ? Double.valueOf(dto.getNoise()) : null);
if (Objects.equals(project.getProjectSn(), "EEDD6F22AA774F2BBF6C8BE26C6E9953")) {
data.setTsp(13D);
} else {
data.setTsp(dto.getTsp() != null ? Double.valueOf(dto.getTsp()) : null);
}
data.setTemperature(dto.getTemperature() != null ? Double.valueOf(dto.getTemperature()) : null);
data.setHumidity(dto.getHumidity() != null ? Double.valueOf(dto.getHumidity()) : null);
data.setWindspeed(dto.getWindSpeed() != null ? Double.valueOf(dto.getWindSpeed()) : null);
data.setWinddirection(dto.getWindDirection() != null ? WindDirectionUtils.getWindDirectionName(String.valueOf(dto.getWindDirection())) : null);
data.setPressure(StringUtils.isNotBlank(dto.getPressure()) ? NumberUtils.toDouble(dto.getPressure()) : null);
data.setXiewenId(Long.valueOf(dto.getId()));
dustNoiseDataMapper.insert(data);
environmentDevMapper.updateEnvironmentDevRealTimeById(dev.getId());
}
} else {
log.info("设备sn{},当前无数据!", devSn);
}
} else {
log.error("设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
}
/**
* 喷淋自动关闭超时10分钟扬尘不报警
*/
@SchedulerLock(name = "sprayAutoClose", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
@Scheduled(cron = "0 0/1 * * * ?")
@RequestMapping("sprayAutoClose")
public void sprayAutoClose() {
List<SprayRtDev> sprayDevList = sprayRtDevMapper.selectList(null);
if (CollUtil.isNotEmpty(sprayDevList)) {
for (SprayRtDev sprayDev : sprayDevList) {
try {
//过期时间
String key = SprayRtDevServiceImpl.SPRAY_FREFIX_AUTO_CLOSE + sprayDev.getId();
String time = (String) redisRepository.get(key);
if (time != null) {
long between = DateUtil.between(DateUtil.parse(time), DateUtil.date(), DateUnit.MINUTE);
if (between > 10) {
redisRepository.del(key);
if (Objects.equals(sprayDev.getSprayMode(), 2)) {
sprayDev.setSwitchStatus(1);
sprayRtDevMapper.updateById(sprayDev);
}
}
}
} catch (Exception e) {
log.error("喷淋自动关闭异常:" + e);
}
}
}
}
public static void main(String[] args) {
System.out.println(DateUtil.date());
}
}