package com.zy.asrs.wcs.core.map.websocket; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.wcs.core.entity.BasShuttle; import com.zy.asrs.wcs.core.map.entity.MapWsShuttleVo; import com.zy.asrs.wcs.core.map.entity.MapWsVo; import com.zy.asrs.wcs.core.model.NavigateNode; import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; import com.zy.asrs.wcs.core.service.BasShuttleService; import com.zy.asrs.wcs.core.utils.NavigateMapUtils; import com.zy.asrs.wcs.core.utils.Utils; import com.zy.asrs.wcs.rcs.cache.SlaveConnection; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.service.DeviceService; import com.zy.asrs.wcs.rcs.service.DeviceTypeService; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; /** * Created by vincent on 4/11/2024 */ @Component public class MapRealTimeDataScheduler { @Autowired private DeviceTypeService deviceTypeService; @Autowired private DeviceService deviceService; @Autowired private BasShuttleService basShuttleService; @Autowired private DictService dictService; @Autowired private NavigateMapUtils navigateMapUtils; @Scheduled(cron = "0/1 * * * * ? ") public void sync() { MapWsVo wsVo = new MapWsVo(); // shuttle wsVo.setShuttleVos(syncShuttle()); wsVo.setLockPath(getMapLocPath()); MapWebSocket.broadcast(JSON.toJSONString(wsVo)); } private List syncShuttle() { List shuttleVos = new ArrayList<>(); List deviceList = deviceService.list(new LambdaQueryWrapper().eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())); for (Device device : deviceList) { MapWsShuttleVo shuttleVo = new MapWsShuttleVo(); shuttleVos.add(shuttleVo); shuttleVo.setShuttleNo(device.getDeviceNo()); Consumer consumer = new Consumer() { @Override public void accept(Device device) { BasShuttle basShuttle = basShuttleService.getOne(new LambdaQueryWrapper().eq(BasShuttle::getDeviceId, device.getId())); if (null != basShuttle && !Cools.isEmpty(basShuttle.getProtocol())) { ShuttleProtocol protocol = JSON.parseObject(basShuttle.getProtocol(), ShuttleProtocol.class); shuttleVo.setCurLocNo(protocol.getCurrentLocNo()); } } }; ShuttleThread thread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); if (null == thread) { consumer.accept(device); continue; } ShuttleProtocol protocol = thread.getStatus(); if (null == protocol) { consumer.accept(device); continue; } shuttleVo.setCurLocNo(protocol.getCurrentLocNo()); List moveAdvancePath = thread.getMoveAdvancePath(); if (!Cools.isEmpty(moveAdvancePath)) { shuttleVo.setTravelPath(moveAdvancePath.stream() .map(path -> Utils.getLocNo(path.getX(), path.getY(), path.getZ())) .collect(Collectors.toList())); } } return shuttleVos; } private List getMapLocPath() { List navigateNodes = new ArrayList<>(); Dict dict = dictService.getOne(new LambdaQueryWrapper() .eq(Dict::getFlag, "floor-list") .eq(Dict::getStatus, 1)); if (dict != null) { for (Object o : JSON.parseArray(dict.getValue())) { JSONObject jsonObject = JSON.parseObject(o.toString()); Integer lev = jsonObject.getInteger("value"); List path = navigateMapUtils.getLockPath(lev); navigateNodes.addAll(path); } } return navigateNodes; } }