wisdomisite-java/src/main/java/com/zhgd/xmgl/task/BridgeCraneTask.java
2025-09-15 09:19:05 +08:00

389 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.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zhgd.jeecg.common.util.pass.HttpUtils;
import com.zhgd.xmgl.modules.bridgeCrane.entity.BridgeCraneData;
import com.zhgd.xmgl.modules.bridgeCrane.entity.BridgeCraneDev;
import com.zhgd.xmgl.modules.bridgeCrane.service.IBridgeCraneAlarmService;
import com.zhgd.xmgl.modules.bridgeCrane.service.IBridgeCraneDataService;
import com.zhgd.xmgl.modules.bridgeCrane.service.IBridgeCraneDevService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@RestController
@RequestMapping("xmgl/task")
public class BridgeCraneTask {
@Lazy
@Autowired
private IBridgeCraneDevService bridgeCraneDevService;
/**
* 睿郅盾的桥机token
*/
@Value("${rzdqjToken:}")
private String rzdqjToken;
@Lazy
@Autowired
private IBridgeCraneDataService bridgeCraneDataService;
@Lazy
@Autowired
private IBridgeCraneAlarmService bridgeCraneAlarmService;
/**
* 获取睿郅盾的桥机实时数据
*/
@Scheduled(cron = "0 */5 * * * ?")
@SchedulerLock(name = "getBridgeCraneDataTask", lockAtMostFor = 1000 * 60, lockAtLeastFor = 1000 * 60)
@RequestMapping("getBridgeCraneDataTask")
public void getBridgeCraneDataTask() {
if (StrUtil.isBlank(rzdqjToken)) {
return;
}
List<BridgeCraneData> addDatas = new ArrayList<>();
Map<String, BridgeCraneDev> devMap = bridgeCraneDevService.list(new LambdaQueryWrapper<BridgeCraneDev>()).stream().collect(Collectors.toMap(BridgeCraneDev::getDevId, Function.identity(), (o1, o2) -> o1));
String rqName = "睿郅盾请求桥机实时数据";
String bodyRtStr = HttpUtils.sendPostBodyRtStr(rqName, "http://www.aqjkpt.com:26001/", null, 20000, null);
List<RzdRspBody> rzdRspBodies = JSONArray.parseArray(bodyRtStr, RzdRspBody.class);
for (RzdRspBody body : rzdRspBodies) {
if (StrUtil.isNotBlank(body.getError())) {
log.warn(rqName + "错误:{}", body.getError());
return;
}
BridgeCraneDev dev = null;
if (body.getCurrent() != null) {
String devID = body.getCurrent().getDevID();
dev = devMap.get(devID);
if (dev != null) {
BridgeCraneData data = buildData(body, dev.getProjectSn());
addDatas.add(data);
}
}
if (body.getMetadata() != null && dev != null) {
RzdRspBody.Metadata metadata = body.getMetadata();
dev.setDevModel(metadata.getDeviceModel());
dev.setControlVoltage(Convert.toStr(metadata.getControlVoltage()));
dev.setHoistingHeight(Convert.toStr(metadata.getHoistingHeight()));
dev.setGetUpSpeed(Convert.toStr(metadata.getGetUpSpeed()));
dev.setRunningSpeed(Convert.toStr(metadata.getRunningSpeed()));
dev.setSpan(Convert.toStr(metadata.getSpan()));
dev.setRatedLoad(Convert.toStr(metadata.getRatedLoad()));
bridgeCraneDevService.updateById(dev);
}
}
if (CollUtil.isNotEmpty(addDatas)) {
bridgeCraneDataService.saveBatch(addDatas);
bridgeCraneAlarmService.saveAlarmBatch(addDatas);
}
}
/**
* 睿郅盾响应body构建data
*
* @param body
* @param projectSn
* @return
*/
private BridgeCraneData buildData(RzdRspBody body, String projectSn) {
BridgeCraneData bridgeCraneData = new BridgeCraneData();
bridgeCraneData.setProjectSn(projectSn);
RzdRspBody.Current current = body.getCurrent();
bridgeCraneData.setDevId(current.getDevID());
bridgeCraneData.setDevType(current.getDevType());
bridgeCraneData.setWorkTime(current.getWorkTime());
bridgeCraneData.setCumulativeWorkingTime(current.getCumulativeWorkingTime());
bridgeCraneData.setOperatingCycleNumber(current.getOperatingCycleNumber());
bridgeCraneData.setAcquisitionModulesNumber(current.getAcquisitionModulesNumber());
bridgeCraneData.setNeiweight1(current.getNeiweight1());
bridgeCraneData.setNeiweight2(current.getNeiweight2());
bridgeCraneData.setNeiweight5(current.getNeiweight5());
bridgeCraneData.setDistance1(current.getDistance1());
bridgeCraneData.setDistance2(current.getDistance2());
bridgeCraneData.setDistance5(current.getDistance5());
bridgeCraneData.setDistance6(current.getDistance6());
bridgeCraneData.setDistance7(current.getDistance7());
bridgeCraneData.setDistance10(current.getDistance10());
bridgeCraneData.setDistance11(current.getDistance11());
bridgeCraneData.setDistance12(current.getDistance12());
bridgeCraneData.setDistance13(current.getDistance13());
bridgeCraneData.setDistance14(current.getDistance14());
bridgeCraneData.setSpeed1(current.getSpeed1());
bridgeCraneData.setSpeed2(current.getSpeed2());
bridgeCraneData.setBrbit0(current.getBrbit0());
bridgeCraneData.setBrbit2(current.getBrbit2());
bridgeCraneData.setLi1bit0(current.getLi1bit0());
bridgeCraneData.setLi1bit1(current.getLi1bit1());
bridgeCraneData.setLi1bit2(current.getLi1bit2());
bridgeCraneData.setLi1bit3(current.getLi1bit3());
bridgeCraneData.setLi1bit8(current.getLi1bit8());
bridgeCraneData.setLi1bit10(current.getLi1bit10());
bridgeCraneData.setLi1bit12(current.getLi1bit12());
bridgeCraneData.setLi1bit13(current.getLi1bit13());
bridgeCraneData.setLi2bit0(current.getLi2bit0());
bridgeCraneData.setAl1bit0(current.getAl1bit0());
bridgeCraneData.setAl1bit1(current.getAl1bit1());
bridgeCraneData.setAl1bit4(current.getAl1bit4());
bridgeCraneData.setAl1bit12(current.getAl1bit12());
bridgeCraneData.setAl1bit13(current.getAl1bit13());
bridgeCraneData.setAl2bit0(current.getAl2bit0());
bridgeCraneData.setOp1bit0(current.getOp1bit0());
bridgeCraneData.setOp1bit1(current.getOp1bit1());
bridgeCraneData.setOp1bit6(current.getOp1bit6());
bridgeCraneData.setOp1bit7(current.getOp1bit7());
bridgeCraneData.setOp2bit0(current.getOp2bit0());
bridgeCraneData.setOp2bit1(current.getOp2bit1());
bridgeCraneData.setOp2bit6(current.getOp2bit6());
bridgeCraneData.setOp2bit7(current.getOp2bit7());
bridgeCraneData.setOp3bit0(current.getOp3bit0());
bridgeCraneData.setOp3bit1(current.getOp3bit1());
bridgeCraneData.setTs1bit0(current.getTs1bit0());
bridgeCraneData.setTs1bit1(current.getTs1bit1());
bridgeCraneData.setTs1bit4(current.getTs1bit4());
bridgeCraneData.setTs1bit5(current.getTs1bit5());
bridgeCraneData.setTs1bit9(current.getTs1bit9());
bridgeCraneData.setUploadTime(DateUtil.parseDateTime(body.getTime()));
return bridgeCraneData;
}
/**
* 睿郅盾响应body
*/
@Data
public static class RzdRspBody {
private String error;
private String DevUUID;
/**
* 设备标识
*/
private String uuid;
/**
* 数据采集时间, 格式yyyy-MM-dd HH:mm:ss
*/
private String time;
/**
* 数据采集周期, 即下次数据上传间隔
*/
private String interval;
/**
* 实时数据
*/
private Current current;
/**
* 静态数据
*/
private Metadata metadata;
@Data
public static class Current {
@JsonProperty("DevID")
private String devID; // 设备ID 12位字符串
@JsonProperty("DevType")
private String devType; // 设备类型 QJ
@JsonProperty("WorkTime")
private Float workTime; // 本次工作时间 单位:0.1小时
@JsonProperty("CumulativeWorkingTime")
private Float cumulativeWorkingTime; // 累计工作时间 单位:0.1小时
@JsonProperty("OperatingCycleNumber")
private Integer operatingCycleNumber; // 工作循环次数 单位:次
@JsonProperty("AcquisitionModulesNumber")
private Float acquisitionModulesNumber; // 数采终端数量 单位:个
@JsonProperty("Neiweight1")
private Float neiweight1; // 前天车吊钩重量 单位0.01t
@JsonProperty("Neiweight2")
private Float neiweight2; // 后天车吊钩重量 单位0.01t
@JsonProperty("Neiweight5")
private Float neiweight5; // 总重量 单位0.01t
@JsonProperty("Distance1")
private Float distance1; // 前天车小车行程 单位0.01m
@JsonProperty("Distance2")
private Float distance2; // 后天车小车行程 单位0.01m
@JsonProperty("Distance5")
private Float distance5; // 前天车吊钩高度 单位0.01m
@JsonProperty("Distance6")
private Float distance6; // 后天车吊钩高度 单位0.01m
@JsonProperty("Distance7")
private Float distance7; // 大车行程 单位0.01m
@JsonProperty("Distance10")
private Float distance10; // 前天车前部安全距离 单位0.01m
@JsonProperty("Distance11")
private Float distance11; // 前天车后部安全距离 单位0.01m
@JsonProperty("Distance12")
private Float distance12; // 后天车前部安全距离 单位0.01m
@JsonProperty("Distance13")
private Float distance13; // 后天车后部安全距离 单位0.01m
@JsonProperty("Distance14")
private Float distance14; // 大车偏斜行程 单位0.01m
@JsonProperty("Speed1")
private Float speed1; // 前天车吊钩速度 单位0.01m/s
@JsonProperty("Speed2")
private Float speed2; // 后天车吊钩速度 单位0.01m/s
// 位状态字段
@JsonProperty("BRbit0")
private Integer brbit0; // 前天车吊钩制动 0-制动关闭;1-制动打开
@JsonProperty("BRbit2")
private Integer brbit2; // 后天车吊钩制动 0-制动关闭;1-制动打开
@JsonProperty("LI1bit0")
private Integer li1bit0; // 前天车前限位 0-正常;1-限位到;
@JsonProperty("LI1bit1")
private Integer li1bit1; // 前天车后限位 0-正常;1-限位到;
@JsonProperty("LI1bit2")
private Integer li1bit2; // 后天车前限位 0-正常;1-限位到;
@JsonProperty("LI1bit3")
private Integer li1bit3; // 后天车后限位 0-正常;1-限位到;
@JsonProperty("LI1bit8")
private Integer li1bit8; // 前天车吊钩上限位 0-正常;1-限位到;
@JsonProperty("LI1bit10")
private Integer li1bit10; // 后天车吊钩上限位 0-正常;1-限位到;
@JsonProperty("LI1bit12")
private Integer li1bit12; // 大车左限 0-正常;1-限位到;
@JsonProperty("LI1bit13")
private Integer li1bit13; // 大车右限 0-正常;1-限位到;
@JsonProperty("LI2bit0")
private Integer li2bit0; // 司机室门限位 0-正常;1-限位到;
@JsonProperty("AL1bit0")
private Integer al1bit0; // 前天车吊钩超载 0-正常;1-超载报警;
@JsonProperty("AL1bit1")
private Integer al1bit1; // 后天车吊钩超载 0-正常;1-超载报警;
@JsonProperty("AL1bit4")
private Integer al1bit4; // 整车吊重超载 0-正常;1-超载报警;
@JsonProperty("AL1bit12")
private Integer al1bit12; // 前天车吊钩超速报警 0-正常;1-超速报警;
@JsonProperty("AL1bit13")
private Integer al1bit13; // 后天车吊钩超速报警 0-正常;1-超速报警;
@JsonProperty("AL2bit0")
private Integer al2bit0; // 整车偏斜报警 0-正常;1-偏斜报警;
@JsonProperty("OP1bit0")
private Integer op1bit0; // 前天车上升 0-不动;1-上升
@JsonProperty("OP1bit1")
private Integer op1bit1; // 前天车下降 0-不动;1-下降
@JsonProperty("OP1bit6")
private Integer op1bit6; // 后天车上升 0-不动;1-上升
@JsonProperty("OP1bit7")
private Integer op1bit7; // 后天车下降 0-不动;1-下降
@JsonProperty("OP2bit0")
private Integer op2bit0; // 前天车前移 0-不动;1-前移
@JsonProperty("OP2bit1")
private Integer op2bit1; // 前天车后移 0-不动;1-后移
@JsonProperty("OP2bit6")
private Integer op2bit6; // 后天车前移 0-不动;1-前移
@JsonProperty("OP2bit7")
private Integer op2bit7; // 后天车后移 0-不动;1-后移
@JsonProperty("OP3bit0")
private Integer op3bit0; // 大车左移 0-不动;1-左移
@JsonProperty("OP3bit1")
private Integer op3bit1; // 大车右移 0-不动;1-右移
// 可选的终端状态字段
@JsonProperty("TS1bit0")
private Integer ts1bit0; // 报警终端 0-连接;1-断开
@JsonProperty("TS1bit1")
private Integer ts1bit1; // 风速采集终端 0-连接;1-断开
@JsonProperty("TS1bit4")
private Integer ts1bit4; // 前天车数采终端 0-连接;1-断开
@JsonProperty("TS1bit5")
private Integer ts1bit5; // 后天车数采终端 0-连接;1-断开
@JsonProperty("TS1bit9")
private Integer ts1bit9; // 司机室数采终端 0-连接;1-断开
}
@Data
public static class Metadata {
@JsonProperty("Name")
private String name; // 设备昵称 厂商定义(必须)
@JsonProperty("DeviceModel")
private String deviceModel; // 设备型号 厂商定义(必须)
@JsonProperty("RatedLoad")
private Float ratedLoad; // 额定起重量 单位T
@JsonProperty("ControlVoltage")
private Integer controlVoltage; // 控制电压 单位V
@JsonProperty("HoistingHeight")
private Float hoistingHeight; // 起升高度 单位0.01m
@JsonProperty("GetUpSpeed")
private Float getUpSpeed; // 起升速度 单位0.1m/s
@JsonProperty("RunningSpeed")
private Float runningSpeed; // 运行速度 单位0.1m/s
@JsonProperty("Span")
private Float span; // 跨度 单位0.01m
}
}
}