package com.zhgd.xmgl.task; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.gexin.fastjson.JSON; import com.gexin.fastjson.JSONArray; import com.gexin.fastjson.JSONObject; import com.zhgd.xmgl.modules.bigdevice.entity.GantryCrane; import com.zhgd.xmgl.modules.bigdevice.entity.GantryCraneCurrentData; import com.zhgd.xmgl.modules.bigdevice.entity.GantryCraneWorkCycle; import com.zhgd.xmgl.modules.bigdevice.mapper.GantryCraneCurrentDataMapper; import com.zhgd.xmgl.modules.bigdevice.mapper.GantryCraneMapper; import com.zhgd.xmgl.modules.bigdevice.mapper.GantryCraneWorkCycleMapper; import com.zhgd.xmgl.task.dto.GantryCraneCurrentDataDto; import com.zhgd.xmgl.util.NumberUtils; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; import java.util.List; import java.util.Objects; /** * 龙门吊定时任务 */ @Slf4j @Component @RestController @Api(tags = "定时任务") @RequestMapping("/xmgl/task") public class GantryCraneTask { @Autowired GantryCraneCurrentDataMapper gantryCraneCurrentDataMapper; @Autowired GantryCraneWorkCycleMapper gantryCraneWorkCycleMapper; @Autowired GantryCraneMapper gantryCraneMapper; /** * 定时获取实时数据 */ @SchedulerLock(name = "getGantryCraneTaskData", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0/5 * * * ?") @RequestMapping("/getGantryCraneTaskData") public void getGantryCraneTaskData() { log.info("getGantryCraneTaskData任务执行"); List gantryCranes = gantryCraneMapper.selectList(new LambdaQueryWrapper() .ne(GantryCrane::getRzdToken, "") .isNotNull(GantryCrane::getRzdToken) ); for (GantryCrane gantryCrane : gantryCranes) { String url = "http://www.aqjkpt.com:26001"; log.info("url:{}", url); String rs = HttpRequest.post(url) .header("Authorization", gantryCrane.getRzdToken()) .execute().body(); log.info("rs:{}", rs); //3秒一次 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } try { JSONArray rsJa = JSON.parseArray(rs); JSONObject rsJaJo = rsJa.getJSONObject(0); if (rsJaJo.containsKey("current")) { GantryCraneCurrentDataDto dto = rsJaJo.getObject("current", GantryCraneCurrentDataDto.class); insert(dto, gantryCrane); } else { log.error("龙门吊定时任务定时获取实时数据出错"); } } catch (Exception e) { e.printStackTrace(); } } } /** * 插入数据 * * @param dto * @param gantryCrane */ private void insert(GantryCraneCurrentDataDto dto, GantryCrane gantryCrane) { GantryCraneCurrentData data = new GantryCraneCurrentData(); Date now = new Date(); String devSn = gantryCrane.getDevSn(); data.setDevSn(devSn); data.setProjectSn(gantryCrane.getProjectSn()); data.setReciveTime(now); data.setRunTime(null); data.setWindSpeed(Convert.toStr(dto.getWind1())); data.setWindSpeedState(getWindSpeedState(dto.getAL1bit5())); //data.setAngleXAxis(null); //data.setAngleYAxis(null); data.setLargeCraneRange(Convert.toStr(dto.getDistance7())); data.setLargeCraneSpeed(Convert.toStr(dto.getSpeed1())); //data.setSmallCraneRange(null); data.setSmallCraneSpeed(Convert.toStr(dto.getSpeed1())); //data.setSecondSmallCraneRange(null); data.setSecondSmallCraneSpeed(Convert.toStr(dto.getSpeed2())); data.setSmallCraneMainHookLoad(Convert.toStr(dto.getNeiweight1())); data.setSmallCraneMainHookHeight(dto.getDistance5()); //data.setSmallCraneAuxiliaryHookLoad(Convert.toStr(dto.getDistance6())); //data.setSmallCraneAuxiliaryHookHeight(null); data.setSecondSmallCraneMainHookLoad(Convert.toStr(dto.getNeiweight2())); data.setSecondSmallCraneMainHookHeight(Convert.toStr(dto.getDistance6())); //data.setSecondSmallCraneAuxiliaryHookLoad(null); //data.setSecondSmallCraneAuxiliaryHookHeight(null); //data.setMainHookCurrent(null); //data.setMainHookVoltage(null); //data.setSecondMainHookCurrent(null); //data.setSecondMainHookVoltage(null); //data.setSmallCraneRangeState(null); //data.setSecondSmallCraneRangeState(null); //data.setLargeCraneDistanceState(null); //data.setMainHookWeightState(null); //data.setSecondMainHookWeightState(null); //data.setAuxiliaryHookWeightState(null); //data.setSecondAuxiliaryHookWeightState(null); //data.setMainHookHeightState(null); //data.setSecondMainHookHeightState(null); //data.setAuxiliaryHookHeightState(null); //data.setSecondAuxiliaryHookHeightState(null); //data.setAngleXState(null); //data.setAngleYState(null); //data.setGatedState(null); //data.setAntiWindAndNonslipState(null); //data.setCableReelStatus(null); //data.setLargeCarSafeStatus(null); //data.setLargeCarRunStatus(null); //data.setSmallCarRunStatus(null); //data.setSecondSmallCarRunStatus(null); data.setMasterHookRunStatus(getMasterHookRunStatus(dto)); data.setSecondMasterHookRunStatus(getSecondMasterHookRunStatus(dto)); //data.setSubHookRunStatus(null); //data.setSecondSubHookRunStatus(null); //data.setDriverName(null); //data.setDriverIdCard(null); data.setTotalDay(getTotalDay(dto.getCumulativeWorkingTime())); data.setTotalTimes(getTotalTimes(dto.getCumulativeWorkingTime())); data.setPowerOnDay(Convert.toStr(dto.getWorkTime())); data.setPowerOnTimes(Convert.toStr(dto.getWorkTime())); data.setOperatingCycleNumber(Convert.toInt(dto.getOperatingCycleNumber())); gantryCraneCurrentDataMapper.insert(data); //插入循环数据,我们需要获取每次的工作循环的开始和结束时间和吊重,通过“工作循环次数”是否增加,判断是否进行一次循环,然后取这次的实时的数据的工作时间减去上次(“工作循环次数”-1)的工作时间时间,得到每次的工作循环的开始和结束时间,吊重就取这段时间内最大的吊重,可以这样 GantryCraneCurrentData lastNewData = gantryCraneCurrentDataMapper.selectOne(new LambdaQueryWrapper() .eq(GantryCraneCurrentData::getDevSn, devSn) .orderByDesc(GantryCraneCurrentData::getReciveTime) .last("limit 1")); if (lastNewData != null) { if (NumberUtils.gt(data.getOperatingCycleNumber() + "", lastNewData.getOperatingCycleNumber() + "")) { log.info("插入龙门吊的工作循环数据>>>"); GantryCraneWorkCycle cycle = new GantryCraneWorkCycle(); cycle.setDevSn(devSn); cycle.setProjectSn(gantryCrane.getProjectSn()); cycle.setStartTime(DateUtil.formatDateTime(lastNewData.getReciveTime())); cycle.setEndTime(DateUtil.formatDateTime(now)); cycle.setWorkTime(Convert.toStr(DateUtil.between(lastNewData.getReciveTime(), now, DateUnit.SECOND))); cycle.setAddTime(now); //cycle.setDriverName(); //cycle.setDriverIdCard(); cycle.setMasterHookWorkStartHeight(Convert.toStr(lastNewData.getSmallCraneMainHookHeight())); cycle.setMasterHookWorkEndHeight(Convert.toStr(data.getSmallCraneMainHookHeight())); cycle.setMasterHookWorkMaxWeight(NumberUtils.getMaxStr(data.getSmallCraneMainHookLoad(), lastNewData.getSmallCraneMainHookLoad())); cycle.setMasterHookWorkOperation(getMasterHookRunStatus(dto)); //cycle.setSubHookWorkStartHeight(Convert.toStr(lastNewData.getSmallCraneAuxiliaryHookLoad())); //cycle.setSubHookWorkEndHeight(Convert.toStr(dto.getDistance6())); cycle.setSubHookWorkMaxWeight(NumberUtils.getMaxStr(data.getSmallCraneMainHookLoad(), lastNewData.getSmallCraneMainHookLoad())); //cycle.setSubHookWorkOperation(getSecondMasterHookRunStatus(dto)); cycle.setSecondMasterHookWorkStartHeight(lastNewData.getSecondSmallCraneMainHookHeight()); //cycle.setSecondMasterHookWorkEndHeight(); cycle.setSecondMasterHookWorkMaxWeight(NumberUtils.getMaxStr(data.getSecondSmallCraneMainHookLoad(), lastNewData.getSecondSmallCraneMainHookLoad())); cycle.setSecondMasterHookWorkOperation(getMasterHookRunStatus(dto)); //cycle.setSecondSubHookWorkStartHeight(); //cycle.setSecondSubHookWorkEndHeight(); //cycle.setSecondSubHookWorkMaxWeight(); //cycle.setSecondSubHookWorkOperation(getSecondMasterHookRunStatus(dto)); //cycle.setLargeCarWorkStartRange(); //cycle.setLargeCarWorkEndRange(); cycle.setLargeCarWorkMaxSpeed(NumberUtils.getMaxStr(data.getLargeCraneSpeed(), lastNewData.getLargeCraneSpeed())); //cycle.setLargeCarWorkOperation(); //cycle.setSmallCarWorkStartRange(); //cycle.setSmallCarWorkEndRange(); //cycle.setSmallCarWorkMaxSpeed(); //cycle.setSmallCarWorkOperation(); //cycle.setSecondSmallCarWorkStartRange(); //cycle.setSecondSmallCarWorkEndRange(); cycle.setSecondSmallCarWorkMaxSpeed(NumberUtils.getMaxStr(data.getSecondSmallCraneSpeed(), lastNewData.getSecondSmallCraneSpeed())); //cycle.setSecondSmallCarWorkOperation(); cycle.setWorkType(0); //cycle.setMaxDipX(); //cycle.setMaxDipY(); cycle.setMaxWindSpeed(NumberUtils.getMaxStr(lastNewData.getWindSpeed(), data.getWindSpeed())); //cycle.setMasterHookWorkAlarm(); //cycle.setSubHookWorkAlarm(); //cycle.setSecondMasterHookWorkAlarm(); //cycle.setSecondSubHookWorkAlarm(); //cycle.setLargeCarSpeedWorkAlarm(); //cycle.setSmallCarSpeedWorkAlarm(); //cycle.setSecondSmallCarSpeedWorkAlarm(); //cycle.setDipXWorkAlarm(); //cycle.setDipYWorkAlarm(); //cycle.setWindSpeedWorkAlarm(); //cycle.setWorkSafeStatus(); gantryCraneWorkCycleMapper.insert(cycle); } } } private String getTotalTimes(Double d) { if (d == null) { return null; } //HH:MM:SS int second = (int) (d * 0.1 * 3600); int h = second / 3600; int min = (second % 3600) / 60; int s = (second % 3600) % 60; return (h == 0 ? "00" : NumberUtils.fillZero(h, 2)) + ":" + (min == 0 ? "00" : NumberUtils.fillZero(min, 2)) + ":" + (s == 0 ? "00" : NumberUtils.fillZero(s, 2)); } private String getTotalDay(Double d) { if (d == null) { return null; } return Convert.toStr(NumberUtil.round(d * 0.1 / 24, 2)); } private Integer getSecondMasterHookRunStatus(GantryCraneCurrentDataDto dto) { //小车2主钩运行状态 0:停止 1:上升 2:下降 3:故障 if (Objects.equals(dto.getOP1bit6(), 0) || Objects.equals(dto.getOP1bit7(), 0)) { return 0; } else if (Objects.equals(dto.getOP1bit6(), 1)) { return 1; } else if (Objects.equals(dto.getOP1bit7(), 1)) { return 2; } return null; } private Integer getMasterHookRunStatus(GantryCraneCurrentDataDto dto) { //主钩运行状态 0:停止 1:上升 2:下降 3:故障 if (Objects.equals(dto.getOP1bit0(), 0) || Objects.equals(dto.getOP1bit1(), 0)) { return 0; } else if (Objects.equals(dto.getOP1bit0(), 1)) { return 1; } else if (Objects.equals(dto.getOP1bit1(), 1)) { return 2; } return null; } private Integer getWindSpeedState(String al1bit5) { if (StrUtil.isBlank(al1bit5)) { return null; } switch (al1bit5) { case "0": return 0; case "1": return 2; } return null; } }