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.spring.annotation.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 = "PT60S", lockAtLeastFor = "PT60S") @RequestMapping("getBridgeCraneDataTask") public void getBridgeCraneDataTask() { if (StrUtil.isBlank(rzdqjToken)) { return; } List addDatas = new ArrayList<>(); Map devMap = bridgeCraneDevService.list(new LambdaQueryWrapper()).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 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 } } }