wisdomisite-java/src/main/java/com/zhgd/xmgl/task/ElectricalTask.java
2025-08-15 18:45:55 +08:00

225 lines
10 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.collection.CollUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zhgd.xmgl.modules.electrical.entity.ElectricalData;
import com.zhgd.xmgl.modules.electrical.entity.ElectricalDev;
import com.zhgd.xmgl.modules.electrical.mapper.ElectricalDataMapper;
import com.zhgd.xmgl.modules.electrical.mapper.ElectricalDevMapper;
import com.zhgd.xmgl.modules.electrical.service.IElectricAlarmService;
import com.zhgd.xmgl.modules.electrical.service.IElectricalDataService;
import com.zhgd.xmgl.modules.electrical.service.IElectricalDevService;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.util.XiwonUtil;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock;
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.stereotype.Component;
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.util.*;
import java.util.concurrent.CompletableFuture;
/**
* @author 邱平毅
* @ClassName ElectricalTask
* @date 2022/11/15 14:02
* @Version 1.0
* 电箱定时任务
*/
@Slf4j
@Component
@RestController
public class ElectricalTask {
@Resource
private IElectricalDataService electricalDataService;
@Resource
private ElectricalDataMapper electricalDataMapper;
@Resource
private ProjectMapper projectMapper;
@Autowired
private IElectricAlarmService electricAlarmService;
@Autowired
private ElectricalDevMapper electricalDevMapper;
@Resource
private IElectricalDevService electricalDevService;
@Resource
private XiwonUtil xiwonUtil;
@Value("${sada.host}")
private String sadaHost;
/**
* 获取最新电量使用情况 每5分钟触发任务
*/
@SchedulerLock(name = "getElectricRealTimeData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
@Scheduled(cron = "0 0/5 * * * ?")
@RequestMapping("/xmgl/task/getElectricRealTimeData")
public void getElectricRealTimeData() {
log.info("获取最新电量使用情况 每5分钟触发任务");
List<Project> projectList = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.ne(Project::getXiwonAppId, "")
.isNotNull(Project::getXiwonAppId)
.ne(Project::getXiwonAppSecret, "")
.isNotNull(Project::getXiwonAppSecret)
);
for (Project project : projectList) {
// 获取所有
List<ElectricalDev> devList = electricalDevService.list(new LambdaQueryWrapper<ElectricalDev>().eq(ElectricalDev::getProjectSn, project.getProjectSn()));
devList.forEach(dev -> CompletableFuture.supplyAsync(() -> {
return doGetElectricRealTimeData(dev, project);
}).exceptionally(throwable -> {
log.error("err:", throwable);
return null;
})
);
}
}
/**
* 获取电箱情况 每5分钟触发任务
*/
@Scheduled(cron = "0 30 * * * ?")
@RequestMapping("/xmgl/task/getElectricData")
public void getElectricData() {
log.info("获取设备数据 每1分钟触发任务");
JSONObject obj = getToken();
if (obj == null) {
log.error("获取token失败");
}
String token = obj.getString("token");
String hashId = obj.getJSONObject("account").getJSONObject("currentProject").getString("hashId");
List<String> devList = doGetElectricalData(token, hashId);
devList.forEach(dev -> CompletableFuture.supplyAsync(() -> {
return doAddElectricalData(dev, token);
}).exceptionally(throwable -> {
log.error("err:", throwable);
return null;
})
);
}
private List<String> doGetElectricalData(String token, String hashId) {
HttpRequest post = HttpRequest.get(sadaHost + "/box/project/" + hashId);
post.header("Auth", token);
HttpResponse execute = post.execute();
boolean ok = execute.isOk();
if (ok) {
log.info("电箱数据" + execute.body());
List<String> devList = new ArrayList<>();
JSONObject result = JSONObject.parseObject(execute.body());
JSONArray result1 = result.getJSONArray("result");
for (int i = 0; i < result1.size(); i++) {
devList.add(result1.getJSONObject(i).getString("hashId"));
}
return devList;
}
return null;
}
private boolean doAddElectricalData(String devId, String token) {
HttpRequest post = HttpRequest.get(sadaHost + "/metric/box/" + devId);
post.header("Auth", token);
HttpResponse execute = post.execute();
boolean ok = execute.isOk();
if (ok) {
log.info("电箱实时数据" + execute.body());
JSONObject result = JSONObject.parseObject(execute.body()).getJSONObject("result");
JSONObject metric = result.getJSONObject("metric");
JSONArray jsonArray = result.getJSONArray("temperatures");
if (CollUtil.isNotEmpty(jsonArray)) {
String temperatures = String.format("%.1f", Double.parseDouble(jsonArray.getJSONObject(0).getString("temperature")));
ElectricalData electricalData = new ElectricalData(devId,
metric.getString("modified"),
String.format("%.1f", Double.parseDouble(metric.getString("voltage_a"))),
String.format("%.1f", Double.parseDouble(metric.getString("voltage_b"))),
String.format("%.1f", Double.parseDouble(metric.getString("voltage_c"))),
String.format("%.1f", Double.parseDouble(metric.getString("current_a"))),
String.format("%.1f", Double.parseDouble(metric.getString("current_b"))),
String.format("%.1f", Double.parseDouble(metric.getString("current_c"))),
String.format("%.1f", Double.parseDouble(result.getJSONArray("leakages").getJSONObject(0).getString("leakage"))),
temperatures, temperatures, temperatures,
temperatures);
electricalDataService.saveElectricalData(electricalData);
}
return true;
}
return false;
}
private JSONObject getToken() {
JSONObject param = new JSONObject();
param.put("username", "赤峰智慧工地-zcr");
param.put("password", "IXNOI9mk35");
HttpRequest post = HttpRequest.post(sadaHost + "/v2/api-token-auth");
post.body(JSON.toJSONString(param));
HttpResponse execute = post.execute();
boolean ok = execute.isOk();
if (ok) {
log.info(execute.body());
JSONObject result = JSONObject.parseObject(execute.body());
return result.getJSONObject("result");
}
return null;
}
private boolean doGetElectricRealTimeData(ElectricalDev dev, Project project) {
// 请求参数
Map<String, Object> map = new HashMap<>(4);
map.put("state", 0);
map.put("pageSize", "1");
map.put("pageNum", "1");
// 设备sn
String devSn = dev.getDevSn();
ElectricalData newestData = electricalDataMapper.selectOne(new LambdaQueryWrapper<ElectricalData>().eq(ElectricalData::getDevSn, devSn).orderByDesc(ElectricalData::getUploadTime).last("limit 1"));
// 请求携稳的接口
JSONObject realTimeData = xiwonUtil.postForm("/electric/realTimeData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
if (newestData != null && newestData.getXiewenId() != null) {
map.put("dataId", newestData.getXiewenId());
}
return map.put("deviceSn", devSn);
}));
log.info("携稳接口响应数据(配电箱):{}", JSONArray.toJSONString(realTimeData));
Integer code = realTimeData.getInteger("code");
// code校验是否成功请求
if (code == HttpStatus.OK.value()) {
ElectricalDev tempElectricalDev = new ElectricalDev();
tempElectricalDev.setId(dev.getId());
tempElectricalDev.setRealTime(new Date());
electricalDevMapper.updateById(tempElectricalDev);
JSONArray dataArray = realTimeData.getJSONArray("data");
if (CollUtil.isNotEmpty(dataArray)) {
// 解析请求到的参数,保存到我们的数据库
JSONObject data = dataArray.getJSONObject(0);
ElectricalData electricalData = new ElectricalData(devSn, data.getString("dataTime"), data.getString("voltageA"), data.getString("voltageB"),
data.getString("voltageC"), data.getString("currentA"), data.getString("currentB"), data.getString("currentC"),
data.getString("leakage"), data.getString("temperatureA"), data.getString("temperatureB"), data.getString("temperatureC"), data.getString("temperatureD"));
electricalData.setXiewenId(data.getLong("id"));
electricalDataService.saveElectricalData(electricalData);
electricAlarmService.addAlarm(electricalData, dev);
} else {
log.error("设备sn{},当前无数据!", devSn);
}
} else {
log.error("设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
return true;
}
}