定时获取卸料平台数据

This commit is contained in:
guo 2024-01-20 10:18:46 +08:00
parent 328bb2d700
commit 5c26e5edd6
7 changed files with 201 additions and 60 deletions

View File

@ -267,12 +267,6 @@ public class Project implements Serializable {
private String jzgProjectCode; private String jzgProjectCode;
@ApiModelProperty(value = "金筑工访问host") @ApiModelProperty(value = "金筑工访问host")
private String jzgHost; private String jzgHost;
/**
* 弃用使用xiwonUrl
*/
@Deprecated
@ApiModelProperty(value = "携稳扬尘url")
private String xiwonDustUrl;
@ApiModelProperty(value = "'携稳的appId'") @ApiModelProperty(value = "'携稳的appId'")
private String xiwonAppId; private String xiwonAppId;
@ApiModelProperty(value = "'携稳的appSecret'") @ApiModelProperty(value = "'携稳的appSecret'")

View File

@ -14,6 +14,7 @@ import com.zhgd.xmgl.modules.foundation.entity.DeepExcavationSensor;
import com.zhgd.xmgl.modules.foundation.mapper.DeepExcavationSensorMapper; import com.zhgd.xmgl.modules.foundation.mapper.DeepExcavationSensorMapper;
import com.zhgd.xmgl.modules.foundation.service.IDeepExcavationCurrentDataService; import com.zhgd.xmgl.modules.foundation.service.IDeepExcavationCurrentDataService;
import lombok.extern.log4j.Log4j; import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock; import net.javacrumbs.shedlock.core.SchedulerLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
@ -30,7 +31,7 @@ import java.util.stream.Collectors;
* @Version 1.0 * @Version 1.0
* 基坑定时器 * 基坑定时器
*/ */
@Log4j @Slf4j
@Component @Component
public class DevExcavationTask { public class DevExcavationTask {
@Autowired @Autowired

View File

@ -0,0 +1,125 @@
package com.zhgd.xmgl.task;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
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.gexin.fastjson.JSON;
import com.zhgd.xmgl.modules.discharging.entity.DischargingPlatformCurrentData;
import com.zhgd.xmgl.modules.discharging.entity.DischargingPlatformDev;
import com.zhgd.xmgl.modules.discharging.mapper.DischargingPlatformCurrentDataMapper;
import com.zhgd.xmgl.modules.discharging.mapper.DischargingPlatformDevMapper;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.task.dto.DischargingPlatformCurrentDataDto;
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.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.RestController;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
@RestController
public class DischargingPlatformCurrentDataTask {
@Autowired
DischargingPlatformCurrentDataMapper dischargingPlatformCurrentDataMapper;
@Autowired
DischargingPlatformDevMapper dischargingPlatformDevMapper;
@Autowired
private ProjectMapper projectMapper;
@Resource
private XiwonUtil xiwonUtil;
/**
* 定时获取卸料平台数据
*/
@SchedulerLock(name = "getDischargingPlatformCurrentData", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5)
@Scheduled(cron = "0 0/5 * * * ?")
@GetMapping("/xmgl/task/getDischargingPlatformCurrentData")
public void getDischargingPlatformCurrentData() {
log.info("获取卸料平台数据开始任务");
List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.isNotNull(Project::getXiwonAppId)
.isNotNull(Project::getXiwonAppSecret)
.ne(Project::getXiwonAppId, "")
.ne(Project::getXiwonAppSecret, "")
);
Date now = new Date();
for (Project project : projects) {
// 获取设备列表
List<DischargingPlatformDev> devList = dischargingPlatformDevMapper.selectList(new LambdaQueryWrapper<DischargingPlatformDev>()
.eq(DischargingPlatformDev::getProjectSn, project.getProjectSn()));
devList.forEach(dev -> CompletableFuture.runAsync(() -> {
doGetDischargingPlatformCurrentData(dev, project, now);
}).exceptionally(throwable -> {
log.error("err", throwable);
return null;
})
);
}
}
private void doGetDischargingPlatformCurrentData(DischargingPlatformDev dev, Project project, Date now) {
// 设备sn
String devSn = dev.getDevSn();
log.info("doGetDischargingPlatformCurrentData设备sn{}", devSn);
// 请求参数
Map<String, Object> map = new HashMap<>(4);
map.put("pageSize", "10");
map.put("pageNum", "1");
map.put("startTime", DateUtil.formatDateTime(DateUtil.offsetMinute(now, -5)));
map.put("endTime", DateUtil.formatDateTime(now));
JSONObject realTimeData = xiwonUtil.postForm("/unload/listRealUnloadData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
map.put("deviceSn", devSn);
return map;
}));
log.info("doGetDischargingPlatformCurrentData携稳接口响应数据扬尘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)) {
DischargingPlatformDev platformDev = dischargingPlatformDevMapper.selectOne(new LambdaQueryWrapper<DischargingPlatformDev>()
.eq(DischargingPlatformDev::getDevSn, dev));
// 解析请求到的参数保存到我们的数据库
for (Object o : dataArray) {
DischargingPlatformCurrentDataDto dto = BeanUtil.toBean(o, DischargingPlatformCurrentDataDto.class);
DischargingPlatformCurrentData data = new DischargingPlatformCurrentData();
data.setDevSn(devSn);
data.setProjectSn(platformDev.getProjectSn());
data.setReciveTime(dto.getCreateTime());
data.setLoading(String.valueOf(dto.getRealLoad() / 1000.0));
data.setDisplacement(null);
data.setXDipAngle(String.valueOf(dto.getInclinationX() / 10.0));
data.setYDipAngle(String.valueOf(dto.getInclinationY() / 10.0));
dischargingPlatformCurrentDataMapper.insert(data);
platformDev.setRealTime(new Date());
dischargingPlatformDevMapper.updateById(platformDev);
}
} else {
log.info("设备sn{},当前无数据!", devSn);
}
} else {
log.error("设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
}
}

View File

@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zhgd.xmgl.modules.electrical.entity.ElectricalData; import com.zhgd.xmgl.modules.electrical.entity.ElectricalData;
import com.zhgd.xmgl.modules.electrical.entity.ElectricalDev; import com.zhgd.xmgl.modules.electrical.entity.ElectricalDev;
import com.zhgd.xmgl.modules.electrical.mapper.ElectricalDataMapper; import com.zhgd.xmgl.modules.electrical.mapper.ElectricalDataMapper;
@ -15,8 +14,6 @@ import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.util.XiwonUtil; import com.zhgd.xmgl.util.XiwonUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock; import net.javacrumbs.shedlock.core.SchedulerLock;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -50,9 +47,6 @@ public class ElectricalTask {
@Resource @Resource
private IElectricalDevService electricalDevService; private IElectricalDevService electricalDevService;
@Value("${xiwon.url:}")
private String url;
@Resource @Resource
private XiwonUtil xiwonUtil; private XiwonUtil xiwonUtil;
@ -64,7 +58,6 @@ public class ElectricalTask {
@GetMapping("/xmgl/task/getElectricRealTimeData") @GetMapping("/xmgl/task/getElectricRealTimeData")
public void getElectricRealTimeData() { public void getElectricRealTimeData() {
log.info("获取最新电量使用情况 每5分钟触发任务"); log.info("获取最新电量使用情况 每5分钟触发任务");
if (StringUtils.isNotBlank(url)) {
List<Project> projectList = projectMapper.selectList(new LambdaQueryWrapper<Project>() List<Project> projectList = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.ne(Project::getXiwonAppId, "") .ne(Project::getXiwonAppId, "")
.isNotNull(Project::getXiwonAppId) .isNotNull(Project::getXiwonAppId)
@ -88,19 +81,19 @@ public class ElectricalTask {
); );
} }
} }
}
private boolean doGetElectricRealTimeData(Map<String, Object> map, ElectricalDev dev, Project project) { private boolean doGetElectricRealTimeData(Map<String, Object> map, ElectricalDev dev, Project project) {
// 设备sn // 设备sn
String devSn = dev.getDevSn(); String devSn = dev.getDevSn();
ElectricalData newestData = electricalDataMapper.selectOne(new LambdaQueryWrapper<ElectricalData>().eq(ElectricalData::getDevSn, devSn).orderByDesc(ElectricalData::getUploadTime).last("limit 1")); ElectricalData newestData = electricalDataMapper.selectOne(new LambdaQueryWrapper<ElectricalData>().eq(ElectricalData::getDevSn, devSn).orderByDesc(ElectricalData::getUploadTime).last("limit 1"));
// 请求携稳的接口 // 请求携稳的接口
JSONObject realTimeData = xiwonUtil.postForm(url + "electric/realTimeData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> { JSONObject realTimeData = xiwonUtil.postForm("/electric/realTimeData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
if (newestData != null && newestData.getXiewenId() != null) { if (newestData != null && newestData.getXiewenId() != null) {
map.put("dataId", newestData.getXiewenId()); map.put("dataId", newestData.getXiewenId());
} }
return map.put("deviceSn", devSn); return map.put("deviceSn", devSn);
})); }));
log.info("携稳接口响应数据(配电箱):{}", JSONArray.toJSONString(realTimeData)); log.info("携稳接口响应数据(配电箱):{}", JSONArray.toJSONString(realTimeData));
Integer code = realTimeData.getInteger("code"); Integer code = realTimeData.getInteger("code");
// code校验是否成功请求 // code校验是否成功请求

View File

@ -26,8 +26,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@ -139,7 +137,6 @@ public class EnvironmentDevTask {
public void getEnvironmentDustData() { public void getEnvironmentDustData() {
log.info("获取扬尘数据(携稳)开始任务"); log.info("获取扬尘数据(携稳)开始任务");
List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>() List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.isNotNull(Project::getXiwonDustUrl)
.isNotNull(Project::getXiwonAppId) .isNotNull(Project::getXiwonAppId)
.isNotNull(Project::getXiwonAppSecret) .isNotNull(Project::getXiwonAppSecret)
); );
@ -167,7 +164,7 @@ public class EnvironmentDevTask {
Map<String, Object> map = new HashMap<>(4); Map<String, Object> map = new HashMap<>(4);
map.put("pageSize", "10"); map.put("pageSize", "10");
map.put("pageNum", "1"); map.put("pageNum", "1");
JSONObject realTimeData = xiwonUtil.postDustForm(project.getXiwonDustUrl(), project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> { JSONObject realTimeData = xiwonUtil.postForm("/dust/realTimeData", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
map.put("deviceSn", devSn); map.put("deviceSn", devSn);
if (newestData != null && newestData.getXiewenId() != null) { if (newestData != null && newestData.getXiewenId() != null) {
map.put("dataId", newestData.getXiewenId()); map.put("dataId", newestData.getXiewenId());

View File

@ -0,0 +1,37 @@
package com.zhgd.xmgl.task.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class DischargingPlatformCurrentDataDto {
@JsonProperty("id")
private Long id;
@JsonProperty("deviceSn")
private String deviceSn;
@JsonProperty("realLoad")
private Integer realLoad;
@JsonProperty("weightPercentage")
private Integer weightPercentage;
@JsonProperty("inclinationX")
private Integer inclinationX;
@JsonProperty("inclinationXPercentage")
private Integer inclinationXPercentage;
@JsonProperty("inclinationY")
private Integer inclinationY;
@JsonProperty("inclinationYPercentage")
private Integer inclinationYPercentage;
@JsonProperty("batteryVoltage")
private Integer batteryVoltage;
@JsonProperty("weightStatus")
private Integer weightStatus;
@JsonProperty("inclinationXStatus")
private Integer inclinationXStatus;
@JsonProperty("inclinationYStatus")
private Integer inclinationYStatus;
@JsonProperty("systemTime")
private String systemTime;
@JsonProperty("createTime")
private String createTime;
}

View File

@ -33,7 +33,17 @@ public class XiwonUtil {
return SecureUtil.md5(xiwonAppId + xiwonAppSecret + requestTime); return SecureUtil.md5(xiwonAppId + xiwonAppSecret + requestTime);
} }
public <T> T postForm(String url, String xiwonAppId, String xiwonAppSecret, Map<String, Object> map, Class<T> returnClass, Supplier supplier) { /**
* @param uri /unload/listRealUnloadData
* @param xiwonAppId
* @param xiwonAppSecret
* @param map
* @param returnClass
* @param supplier
* @param <T>
* @return
*/
public <T> T postForm(String uri, String xiwonAppId, String xiwonAppSecret, Map<String, Object> map, Class<T> returnClass, Supplier supplier) {
HttpHeaders requestHeaders = new HttpHeaders(); HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("appId", xiwonAppId); requestHeaders.set("appId", xiwonAppId);
long currentTimeMillis = System.currentTimeMillis(); long currentTimeMillis = System.currentTimeMillis();
@ -45,24 +55,8 @@ public class XiwonUtil {
supplier.get(); supplier.get();
} }
String sendUrl = url + "?" + MapUtil.join(map, "&", "="); String sendUrl = "http://openapi.xiwon588.com" + uri + "?" + MapUtil.join(map, "&", "=");
log.info("postForm:url:{}", sendUrl); log.info("postForm: url:{}, appId:{}, appSecret:{}", sendUrl, xiwonAppId, xiwonAppSecret);
return restTemplate.postForObject(sendUrl, requestEntity, returnClass);
}
public <T> T postDustForm(String url, String appId, String appSecret, Map<String, Object> map, Class<T> returnClass, Supplier supplier) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("appId", appId);
long currentTimeMillis = System.currentTimeMillis();
requestHeaders.set("requestTime", currentTimeMillis + "");
requestHeaders.set("sign", SecureUtil.md5(appId + appSecret + currentTimeMillis));
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestHeaders);
if (supplier != null) {
supplier.get();
}
String sendUrl = url + "?" + MapUtil.join(map, "&", "=");
log.info("postForm: url:{}, appId:{}, appSecret:{}", sendUrl, appId, appSecret);
return restTemplate.postForObject(sendUrl, requestEntity, returnClass); return restTemplate.postForObject(sendUrl, requestEntity, returnClass);
} }