312 lines
15 KiB
Java
Raw Normal View History

2024-03-06 16:57:17 +08:00
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"));
}
}
}