bug修复

This commit is contained in:
guo 2024-03-06 16:57:17 +08:00
parent 3e0eca85bf
commit bc64525d95
5 changed files with 424 additions and 0 deletions

View File

@ -405,6 +405,9 @@ public class TowerCurrentData implements Serializable {
@Excel(name = "回转状态 0:停止回转 1:向右回转 2:向左回转", width = 15)
@ApiModelProperty(value = "回转状态 0:停止回转 1:向右回转 2:向左回转")
private java.lang.Integer angleDirection;
@ApiModelProperty(value = "携稳id")
private Long xiewenId;
@TableField(exist = false)
@ApiModelProperty(value = "多机防撞组网序号")

View File

@ -0,0 +1,311 @@
package com.zhgd.xmgl.task;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
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.gexin.fastjson.JSON;
import com.zhgd.xmgl.modules.bigdevice.entity.Tower;
import com.zhgd.xmgl.modules.bigdevice.entity.TowerCurrentData;
import com.zhgd.xmgl.modules.bigdevice.entity.TowerWorkCycle;
import com.zhgd.xmgl.modules.bigdevice.mapper.TowerCurrentDataMapper;
import com.zhgd.xmgl.modules.bigdevice.mapper.TowerMapper;
import com.zhgd.xmgl.modules.bigdevice.mapper.TowerWorkCycleMapper;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.task.dto.TowerCycleDataDto;
import com.zhgd.xmgl.task.dto.TowerDataDto;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
@RestController
@RequestMapping("/xmgl/task/")
public class TowerTask {
@Autowired
private ProjectMapper projectMapper;
@Autowired
private TowerMapper towerMapper;
@Autowired
private TowerCurrentDataMapper towerCurrentDataMapper;
@Autowired
private TowerWorkCycleMapper towerWorkCycleMapper;
@Resource
private XiwonUtil xiwonUtil;
/**
* 获取塔吊数据(携稳) 每5分钟触发任务
*/
@SchedulerLock(name = "getTowerData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
@Scheduled(cron = "0 0/5 * * * ?")
@GetMapping("tower")
public void getEnvironmentDustData() {
log.info("获取塔吊数据(携稳)开始任务");
List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.isNotNull(Project::getXiwonAppId)
.isNotNull(Project::getXiwonAppSecret)
);
for (Project project : projects) {
// 获取设备列表
List<Tower> devList = towerMapper.selectList(new LambdaQueryWrapper<Tower>()
.eq(Tower::getProjectSn, project.getProjectSn()));
devList.forEach(dev -> CompletableFuture.runAsync(() -> {
doGetTowerData(dev, project);
doGetTowerCycleData(dev, project);
}).exceptionally(throwable -> {
log.error("err", throwable);
return null;
})
);
}
}
private void doGetTowerData(Tower dev, Project project) {
// 设备sn
String devSn = dev.getDevSn();
log.info("doGetTowerData设备sn{}", devSn);
TowerCurrentData newestData = towerCurrentDataMapper.selectOne(new LambdaQueryWrapper<TowerCurrentData>().eq(TowerCurrentData::getDevSn, devSn).orderByDesc(TowerCurrentData::getXiewenId).last("limit 1"));
// 请求参数
Map<String, Object> map = new HashMap<>(4);
map.put("pageSize", "10");
map.put("pageNum", "1");
JSONObject realTimeData = xiwonUtil.postForm("/tower/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) {
TowerDataDto dto = BeanUtil.toBean(o, TowerDataDto.class);
TowerCurrentData data = new TowerCurrentData();
data.setDevSn(devSn);
data.setDevName(dev.getDevName());
data.setProjectSn(dev.getProjectSn());
data.setReciveTime(DateUtil.parse(dto.getCraneTime()));
data.setStartTime(DateUtil.parse(dto.getCraneTime()));
data.setLoading(Convert.toStr(dto.getCraneElevatingCapacity()));
data.setLoadRatio(Convert.toStr(dto.getCraneWeightPercentage()));
data.setTorque(null);
data.setTorqueRatio(Convert.toStr(dto.getCraneTorquePercentage()));
if (dto.getCraneTiltAngle() != null) {
data.setAngle(Convert.toStr(dto.getCraneTiltAngle() / 10));
}
if (dto.getCraneRange() != null) {
data.setRanger(Convert.toStr(dto.getCraneRange() / 10));
}
if (dto.getCraneHeight() != null) {
data.setHeight(Convert.toStr(dto.getCraneHeight() / 10));
}
if (dto.getCraneWindSpeed() != null) {
data.setWindspeed(Convert.toStr(dto.getCraneWindSpeed() / 10));
}
if (dto.getCraneTiltAngle() != null) {
data.setObliguity(Convert.toStr(dto.getCraneTiltAngle() / 10));
}
data.setRate(null);
data.setDriverName(null);
data.setDriverIdCard(null);
data.setObliguityX(null);
data.setObliguityY(null);
data.setRealFlag("0");
Integer craneAlarmReason = dto.getCraneAlarmReason();
if (craneAlarmReason != null) {
switch (craneAlarmReason) {
/*
0 正常 111 112 113 114碰撞报警 12 13 14 15 重量 力矩 倾斜 风速报警
211 212 213 214碰撞预警 22 23 24 25 重量 力矩 倾斜 风速预警 201幅度限位预警 202高度限位预警 203回转限位预警
101幅度限位报警 102高度限位报警 103回转限位报警 118酒精报警 218酒精预警 119重量违章报警 219重量违章预警
*/
//data.setNoError();
//data.setWeightError();
//data.setWindSpeedError();
//data.setRangeError();
//data.setHeightError();
//data.setAngleError();
//data.setObliguityError();
//data.setGpsError();
//data.setIdError();
case 0:
case 111:
data.setMultiAlarmAll(1);
case 112:
data.setMultiAlarmAll(1);
case 113:
data.setMultiAlarmAll(1);
case 114:
data.setMultiAlarmAll(1);
case 12:
case 13:
data.setMomentAlarm(1);
case 14:
data.setObliguityAlarm(1);
case 15:
data.setWindSpeedAlarm(1);
case 211:
data.setMultiAlarmAll(1);
case 212:
data.setMultiAlarmAll(1);
case 213:
data.setMultiAlarmAll(1);
case 214:
data.setMultiAlarmAll(1);
case 22:
case 23:
data.setMomentAlarm(2);
case 24:
data.setObliguityAlarm(2);
case 25:
data.setWindSpeedAlarm(2);
case 201:
data.setMinRangeAlarm(2);
data.setMaxRangeAlarm(2);
case 202:
data.setHeightAlarm(2);
data.setHeightLowerAlarm(2);
case 203:
data.setPosAngleAlarm(2);
data.setNegAngleAlarm(2);
case 101:
data.setMinRangeAlarm(1);
data.setMaxRangeAlarm(1);
case 102:
data.setHeightAlarm(1);
data.setHeightLowerAlarm(1);
case 103:
data.setPosAngleAlarm(1);
data.setNegAngleAlarm(1);
case 118:
case 218:
case 119:
case 219:
default:
}
if (Objects.equals(craneAlarmReason, 0)) {
data.setNoAlarm(1);
} else {
data.setNoAlarm(0);
}
}
data.setXiewenId(dto.getId());
}
} else {
log.info("塔吊设备sn{},当前无数据!", devSn);
}
} else {
log.error("塔吊设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
}
private void doGetTowerCycleData(Tower dev, Project project) {
// 设备sn
String devSn = dev.getDevSn();
log.info("doGetTowerCycleData设备sn{}", devSn);
TowerWorkCycle newestData = towerWorkCycleMapper.selectOne(new LambdaQueryWrapper<TowerWorkCycle>().eq(TowerWorkCycle::getDevSn, devSn).orderByDesc(TowerWorkCycle::getEndTime).last("limit 1"));
// 请求参数
Map<String, Object> map = new HashMap<>(4);
map.put("pageSize", "10");
map.put("pageNum", "1");
JSONObject realTimeData = xiwonUtil.postForm("/tower/workCycle", project.getXiwonAppId(), project.getXiwonAppSecret(), map, JSONObject.class, (() -> {
map.put("deviceSn", devSn);
if (newestData != null && newestData.getEndTime() != null) {
map.put("startTime", DateUtil.formatDateTime(DateUtil.offsetSecond(newestData.getEndTime(), 1)));
}
map.put("endTime", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
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) {
TowerCycleDataDto dto = BeanUtil.toBean(o, TowerCycleDataDto.class);
TowerWorkCycle data = new TowerWorkCycle();
data.setDevSn(dev.getDevSn());
data.setDevName(dev.getDevName());
data.setProjectSn(dev.getProjectSn());
data.setStartTime(DateUtil.parse(dto.getStartTime()));
data.setEndTime(DateUtil.parse(dto.getEndTime()));
data.setAddTime(DateUtil.parse(dto.getSystemTime()));
data.setWorkTime(String.valueOf(DateUtil.between(data.getStartTime(), data.getEndTime(), DateUnit.SECOND)));
data.setLoading(Convert.toStr(dto.getCycleMaximumWeight()));
data.setWorkMaxForce(Convert.toStr(dto.getCycleMaximumTorque()));
Long maximumHeight = dto.getMaximumHeight();
if (maximumHeight != null) {
data.setMaxHeight(Convert.toStr(maximumHeight / 10));
}
Long minimumHeight = dto.getMinimumHeight();
if (minimumHeight != null) {
data.setMinHeight(Convert.toStr(minimumHeight / 10));
}
Long maximumRange = dto.getMaximumRange();
if (maximumRange != null) {
data.setMaxRange(Convert.toStr(maximumRange / 10));
}
Long minimumRange = dto.getMinimumRange();
if (minimumRange != null) {
data.setMinRange(Convert.toStr(minimumRange / 10));
}
Long liftingPointAngle = dto.getLiftingPointAngle();
if (liftingPointAngle != null) {
data.setSlingStartRotation(Convert.toStr(liftingPointAngle / 10));
}
Long unloadingPointAngle = dto.getUnloadingPointAngle();
if (unloadingPointAngle != null) {
data.setSlingEndRotation(Convert.toStr(unloadingPointAngle / 10));
}
Long liftingPointRange = dto.getLiftingPointRange();
if (liftingPointRange != null) {
data.setSlingStartRange(Convert.toStr(liftingPointRange / 10));
}
Long unloadingPointRange = dto.getUnloadingPointRange();
if (unloadingPointRange != null) {
data.setSlingEndRange(Convert.toStr(unloadingPointRange / 10));
}
Long liftingPointHeight = dto.getLiftingPointHeight();
if (liftingPointHeight != null) {
data.setSlingStartHeight(Convert.toStr(liftingPointHeight / 10));
}
Long unloadingPointHeight = dto.getUnloadingPointRange();
if (unloadingPointHeight != null) {
data.setSlingEndHeight(Convert.toStr(unloadingPointHeight / 10));
}
}
} else {
log.info("塔吊循环设备sn{},当前无数据!", devSn);
}
} else {
log.error("塔吊循环设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
}
}

View File

@ -0,0 +1,45 @@
package com.zhgd.xmgl.task.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class TowerCycleDataDto {
@JsonProperty("blackBoxId")
private String blackBoxId;
@JsonProperty("towerCraneId")
private Long towerCraneId;
@JsonProperty("craneManufacturerAndDeviceType")
private Long craneManufacturerAndDeviceType;
@JsonProperty("startTime")
private String startTime;
@JsonProperty("endTime")
private String endTime;
@JsonProperty("systemTime")
private String systemTime;
@JsonProperty("cycleMaximumWeight")
private Long cycleMaximumWeight;
@JsonProperty("cycleMaximumTorque")
private Long cycleMaximumTorque;
@JsonProperty("maximumHeight")
private Long maximumHeight;
@JsonProperty("minimumHeight")
private Long minimumHeight;
@JsonProperty("maximumRange")
private Long maximumRange;
@JsonProperty("minimumRange")
private Long minimumRange;
@JsonProperty("liftingPointAngle")
private Long liftingPointAngle;
@JsonProperty("liftingPointRange")
private Long liftingPointRange;
@JsonProperty("liftingPointHeight")
private Long liftingPointHeight;
@JsonProperty("unloadingPointAngle")
private Long unloadingPointAngle;
@JsonProperty("unloadingPointRange")
private Long unloadingPointRange;
@JsonProperty("unloadingPointHeight")
private Long unloadingPointHeight;
}

View File

@ -0,0 +1,53 @@
package com.zhgd.xmgl.task.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class TowerDataDto {
@JsonProperty("id")
private Long id;
@JsonProperty("blackBoxId")
private String blackBoxId;
@JsonProperty("towerCraneId")
private Long towerCraneId;
@JsonProperty("craneProtocolVersion")
private Long craneProtocolVersion;
@JsonProperty("craneTime")
private String craneTime;
@JsonProperty("craneManufacturerAndDeviceType")
private Long craneManufacturerAndDeviceType;
@JsonProperty("craneHeight")
private Long craneHeight;
@JsonProperty("craneRange")
private Long craneRange;
@JsonProperty("craneRotation")
private Long craneRotation;
@JsonProperty("craneElevatingCapacity")
private Long craneElevatingCapacity;
@JsonProperty("craneWindSpeed")
private Long craneWindSpeed;
@JsonProperty("craneTiltAngle")
private Long craneTiltAngle;
@JsonProperty("craneWeightPercentage")
private Long craneWeightPercentage;
@JsonProperty("craneTorquePercentage")
private Long craneTorquePercentage;
@JsonProperty("craneWindSpeedPercentage")
private Long craneWindSpeedPercentage;
@JsonProperty("craneTiltPercentage")
private Long craneTiltPercentage;
@JsonProperty("craneBrakingState")
private Long craneBrakingState;
@JsonProperty("brakingState")
private String brakingState;
@JsonProperty("realTimeOrAlarm")
private Long realTimeOrAlarm;
@JsonProperty("craneAlarmReason")
private Integer craneAlarmReason;
@JsonProperty("alarmReason")
private String alarmReason;
@JsonProperty("beaufortScale")
private Integer beaufortScale;
}

View File

@ -70,4 +70,16 @@ public class NumberUtils {
return String.format("%0" + digit + "d", num);
}
/**
* 相乘
*
* @return
*/
public static Double multiply(Double b1, Double b2) {
if (b1 != null && b2 != null) {
return b1 * b2;
}
return null;
}
}