diff --git a/src/main/java/com/zhgd/xmgl/modules/bigdevice/entity/TowerCurrentData.java b/src/main/java/com/zhgd/xmgl/modules/bigdevice/entity/TowerCurrentData.java index 1d0d3a8ec..1065d34c7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/bigdevice/entity/TowerCurrentData.java +++ b/src/main/java/com/zhgd/xmgl/modules/bigdevice/entity/TowerCurrentData.java @@ -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 = "多机防撞组网序号") diff --git a/src/main/java/com/zhgd/xmgl/task/TowerTask.java b/src/main/java/com/zhgd/xmgl/task/TowerTask.java new file mode 100644 index 000000000..53708dd4e --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/task/TowerTask.java @@ -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 projects = projectMapper.selectList(new LambdaQueryWrapper() + .isNotNull(Project::getXiwonAppId) + .isNotNull(Project::getXiwonAppSecret) + ); + for (Project project : projects) { + // 获取设备列表 + List devList = towerMapper.selectList(new LambdaQueryWrapper() + .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().eq(TowerCurrentData::getDevSn, devSn).orderByDesc(TowerCurrentData::getXiewenId).last("limit 1")); + // 请求参数 + Map 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().eq(TowerWorkCycle::getDevSn, devSn).orderByDesc(TowerWorkCycle::getEndTime).last("limit 1")); + // 请求参数 + Map 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")); + } + } + + +} diff --git a/src/main/java/com/zhgd/xmgl/task/dto/TowerCycleDataDto.java b/src/main/java/com/zhgd/xmgl/task/dto/TowerCycleDataDto.java new file mode 100644 index 000000000..ffbc9bf40 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/task/dto/TowerCycleDataDto.java @@ -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; + +} diff --git a/src/main/java/com/zhgd/xmgl/task/dto/TowerDataDto.java b/src/main/java/com/zhgd/xmgl/task/dto/TowerDataDto.java new file mode 100644 index 000000000..7d0833be4 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/task/dto/TowerDataDto.java @@ -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; +} diff --git a/src/main/java/com/zhgd/xmgl/util/NumberUtils.java b/src/main/java/com/zhgd/xmgl/util/NumberUtils.java index ba19eec39..27eed3999 100644 --- a/src/main/java/com/zhgd/xmgl/util/NumberUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/NumberUtils.java @@ -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; + } + }