2024-03-25 15:13:09 +08:00

336 lines
16 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.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.bigdevice.service.ITowerCurrentDataService;
import com.zhgd.xmgl.modules.bigdevice.service.ITowerWorkCycleService;
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;
@Autowired
private ITowerCurrentDataService towerCurrentDataService;
@Autowired
private ITowerWorkCycleService towerWorkCycleService;
@Resource
private XiwonUtil xiwonUtil;
/**
* 获取塔吊数据(携稳) 每5分钟触发任务
*/
@SchedulerLock(name = "getTowerData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
@Scheduled(cron = "0 0/5 * * * ?")
@RequestMapping("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 111:
data.setMultiAlarmAll(1);
break;
case 112:
data.setMultiAlarmAll(1);
break;
case 113:
data.setMultiAlarmAll(1);
break;
case 114:
data.setMultiAlarmAll(1);
break;
case 13:
data.setMomentAlarm(1);
break;
case 14:
data.setObliguityAlarm(1);
break;
case 15:
data.setWindSpeedAlarm(1);
break;
case 211:
data.setMultiAlarmAll(1);
break;
case 212:
data.setMultiAlarmAll(1);
break;
case 213:
data.setMultiAlarmAll(1);
break;
case 214:
data.setMultiAlarmAll(1);
break;
case 23:
data.setMomentAlarm(2);
break;
case 24:
data.setObliguityAlarm(2);
break;
case 25:
data.setWindSpeedAlarm(2);
break;
case 201:
data.setMinRangeAlarm(2);
data.setMaxRangeAlarm(2);
break;
case 202:
data.setHeightAlarm(2);
data.setHeightLowerAlarm(2);
break;
case 203:
data.setPosAngleAlarm(2);
data.setNegAngleAlarm(2);
break;
case 101:
data.setMinRangeAlarm(1);
data.setMaxRangeAlarm(1);
break;
case 102:
data.setHeightAlarm(1);
data.setHeightLowerAlarm(1);
break;
case 103:
data.setPosAngleAlarm(1);
data.setNegAngleAlarm(1);
break;
default:
}
if (Objects.equals(craneAlarmReason, 0)) {
data.setNoAlarm(1);
} else {
data.setNoAlarm(0);
}
}
data.setXiewenId(dto.getId());
towerCurrentDataService.saveTowerCurrentData(data);
}
} 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));
}
towerWorkCycleService.addTowerWorkCycle(data);
}
} else {
log.info("塔吊循环设备sn{},当前无数据!", devSn);
}
} else {
log.error("塔吊循环设备sn{}请求失败当前code{}msg{}", devSn, code, realTimeData.getString("msg"));
}
}
}