|  |  | 
 |  |  | package com.zy.asrs.wcs.core.utils; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.zy.asrs.framework.common.Cools; | 
 |  |  | import com.zy.asrs.wcs.core.domain.dto.BasLiftLevOffsetDto; | 
 |  |  | import com.zy.asrs.wcs.core.entity.BasLift; | 
 |  |  | import com.zy.asrs.wcs.core.entity.ShuttleStandby; | 
 |  |  | import com.zy.asrs.wcs.core.model.NavigateNode; | 
 |  |  | import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; | 
 |  |  | import com.zy.asrs.wcs.core.model.enums.NavigationMapType; | 
 |  |  | import com.zy.asrs.wcs.core.model.enums.WorkZoneType; | 
 |  |  | import com.zy.asrs.wcs.core.service.BasLiftService; | 
 |  |  | import com.zy.asrs.wcs.core.service.ShuttleStandbyService; | 
 |  |  | import com.zy.asrs.wcs.rcs.cache.SlaveConnection; | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据目标位置搜索空闲提升机 | 
 |  |  |      * transfer: 是否可换层 | 
 |  |  |      */ | 
 |  |  |     public LiftThread searchIdleLift(String locNo, Long hostId) { | 
 |  |  |     public LiftThread searchIdleLift(String locNo, Long hostId, Boolean transfer) { | 
 |  |  |         LiftThread recentLiftThread = null; | 
 |  |  |         Integer finalDistance = Integer.MAX_VALUE; | 
 |  |  |         List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() | 
 |  |  | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (transfer) { | 
 |  |  |                 BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>().eq(BasLift::getLiftNo, device.getDeviceNo()).eq(BasLift::getHostId, hostId)); | 
 |  |  |                 if (basLift == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (basLift.getTransfer() != 1) { | 
 |  |  |                     continue;//提升机被设置成不可换层 | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             ShuttleStandby standby = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>() | 
 |  |  |                     .eq(ShuttleStandby::getDeviceId, device.getId()) | 
 |  |  |                     .eq(ShuttleStandby::getDeviceLev, Utils.getLev(locNo)) | 
 |  |  | 
 |  |  |  | 
 |  |  |             String liftLocNo = Utils.getLocNo(Utils.getRow(standby.getDeviceStandbyLoc()), Utils.getBay(standby.getDeviceStandbyLoc()), Utils.getLev(locNo)); | 
 |  |  |             List<NavigateNode> nodeList = NavigateUtils.calc(locNo, liftLocNo, NavigationMapType.NONE.id, null); | 
 |  |  |             if (nodeList == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             Integer originPathAllDistance = NavigateUtils.getOriginPathAllDistance(nodeList);//总距离 | 
 |  |  |             if (originPathAllDistance < finalDistance) { | 
 |  |  |                 finalDistance = originPathAllDistance; | 
 |  |  | 
 |  |  |         return liftLocNo; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取换层需要锁定的路径 | 
 |  |  |      */ | 
 |  |  |     public List<String> getLockPathByLocNo(LiftThread liftThread, Integer lev) { | 
 |  |  |         Device device = liftThread.getDevice(); | 
 |  |  |         ShuttleStandby standby = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>() | 
 |  |  |                 .eq(ShuttleStandby::getDeviceId, device.getId()) | 
 |  |  |                 .eq(ShuttleStandby::getDeviceLev, lev) | 
 |  |  |                 .eq(ShuttleStandby::getStatus, 1)); | 
 |  |  |         if (standby == null) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return standby.getLockPath$(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Integer getLiftLevOffset(Integer deviceId,Integer lev) { | 
 |  |  |         BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>().eq(BasLift::getDeviceId, deviceId)); | 
 |  |  |         if (basLift != null) { | 
 |  |  |             if(Cools.isEmpty(basLift.getLevOffset())) { | 
 |  |  |                 return lev; | 
 |  |  |             } | 
 |  |  |             List<BasLiftLevOffsetDto> levOffsetDtos = JSON.parseArray(basLift.getLevOffset(), BasLiftLevOffsetDto.class); | 
 |  |  |             for (BasLiftLevOffsetDto offsetDto : levOffsetDtos) { | 
 |  |  |                 if(lev == offsetDto.getLogicLev()){ | 
 |  |  |                     return offsetDto.getRealLev(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return lev; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |