wisdomisite-java/src/main/java/com/zhgd/xmgl/task/BridgeCraneTask.java

389 lines
16 KiB
Java
Raw Normal View History

2025-09-15 09:19:05 +08:00
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
}
}
}