package com.zy.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.SpringUtils; import com.zy.asrs.utils.Utils; import com.zy.common.model.NavigateNode; import com.zy.common.model.enums.NavigationMapType; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.ForkLiftSlave; import com.zy.core.model.LiftSlave; import com.zy.core.model.protocol.ForkLiftStaProtocol; import com.zy.core.model.protocol.LiftProtocol; import com.zy.core.model.protocol.LiftStaProtocol; import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.ForkLiftThread; import com.zy.core.thread.LiftThread; import com.zy.core.thread.ShuttleThread; import com.zy.core.thread.impl.NyLiftThread; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * 提升机工具类 */ public class LiftUtils { //获取提升机站点 public static LiftStaProtocol getLiftStaByStaNo(Integer staNo) { SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); for (LiftSlave liftSlave : slaveProperties.getLift()) { LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); if (liftThread == null) { return null; } for (LiftStaProtocol liftStaProtocol : liftThread.getLiftStaProtocols()) { if (liftStaProtocol.getStaNo().equals(staNo)) { return liftStaProtocol; } } } return null; } //获取提升机站点 public static LiftStaProtocol getLiftStaByLev(Integer liftNo, Integer lev) { LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo); if (liftThread == null) { return null; } for (LiftStaProtocol liftStaProtocol : liftThread.getLiftStaProtocols()) { if (liftStaProtocol.getLev().equals(lev)) { return liftStaProtocol; } } return null; } //获取提升机输送站及其前一站节点 public static List getLiftStaNodes(Integer staNo) { List targetNodes = new ArrayList<>(); //获取目标站 LiftStaProtocol targetLiftSta = LiftUtils.getLiftStaByStaNo(staNo); if (targetLiftSta == null) { return null;//找不到站点 } NavigateNode targetNode = NavigatePositionConvert.locNoToNode(targetLiftSta.getLocNo());//目标节点 String targetLastLocNo = Utils.getLocNo(Utils.getRow(targetLiftSta.getLocNo()) - 1, Utils.getBay(targetLiftSta.getLocNo()), Utils.getLev(targetLiftSta.getLocNo()));//目标节点前一站 NavigateNode targetLastNode = NavigatePositionConvert.locNoToNode(targetLastLocNo);//目标节点前一站 targetNodes.add(targetNode); targetNodes.add(targetLastNode); return targetNodes; } //通过输送线站号获取对应提升机号 public static Integer getConveyorBindLiftNo(Integer staNo) { ConfigService configService = SpringUtils.getBean(ConfigService.class); if (configService == null) { return null; } Config conveyorLiftBindConfig = configService.selectOne(new EntityWrapper().eq("code", "conveyorLiftBind")); if(conveyorLiftBindConfig == null) { return null; } List list = JSON.parseArray(conveyorLiftBindConfig.getValue(), JSONObject.class); if (list.isEmpty()) { return null; } for (JSONObject data : list) { if(data.getInteger("staNo").equals(staNo)) { return data.getInteger("liftNo"); } } return null; } //请求上级系统,是否允许出库 //查询是否有出库权限 public static boolean queryOutMission(Integer staNo) { ConfigService configService = SpringUtils.getBean(ConfigService.class); if (configService == null) { return false; } Config queryOutMissionPathEnableConfig = configService.selectOne(new EntityWrapper().eq("code", "queryOutMissionPathEnable")); if (queryOutMissionPathEnableConfig != null) { String queryOutMissionPathEnable = queryOutMissionPathEnableConfig.getValue(); if (!queryOutMissionPathEnable.equals("Y")) { return true;//关闭查询出库权限功能 } } Config superSystemUriConfig = configService.selectOne(new EntityWrapper().eq("code", "superSystemUri")); if (superSystemUriConfig == null) { return false; } String superSystemUri = superSystemUriConfig.getValue(); Config queryOutMissionPathConfig = configService.selectOne(new EntityWrapper().eq("code", "queryOutMissionPath")); if (queryOutMissionPathConfig == null) { return false; } String missionPath = queryOutMissionPathConfig.getValue(); try { HashMap data = new HashMap<>(); data.put("staNo", staNo); String response = new HttpHandler.Builder() .setUri(superSystemUri) .setPath(missionPath) .setJson(JSON.toJSONString(data)) .build() .doPost(); if (response.equals("ok")) { return true;//有出库权限 } }catch (Exception e){ e.printStackTrace(); } return false; } //请求上级系统,是否允许入库 //查询是否有入库权限 public static boolean queryInMission(Integer sourceStaNo, Integer liftNo, String superTaskNo) { ConfigService configService = SpringUtils.getBean(ConfigService.class); if (configService == null) { return false; } Config queryInMissionPathEnableConfig = configService.selectOne(new EntityWrapper().eq("code", "queryInMissionPathEnable")); if (queryInMissionPathEnableConfig != null) { String queryInMissionPathEnable = queryInMissionPathEnableConfig.getValue(); if (!queryInMissionPathEnable.equals("Y")) { return true;//关闭查询入库权限功能 } } Config superSystemUriConfig = configService.selectOne(new EntityWrapper().eq("code", "superSystemUri")); if (superSystemUriConfig == null) { return false; } String superSystemUri = superSystemUriConfig.getValue(); Config queryInMissionPathConfig = configService.selectOne(new EntityWrapper().eq("code", "queryInMissionPath")); if (queryInMissionPathConfig == null) { return false; } String missionPath = queryInMissionPathConfig.getValue(); try { HashMap data = new HashMap<>(); data.put("staNo", sourceStaNo); data.put("liftNo", liftNo); data.put("superTaskNo", superTaskNo); String response = new HttpHandler.Builder() .setUri(superSystemUri) .setPath(missionPath) .setJson(JSON.toJSONString(data)) .build() .doPost(); if (response.equals("ok")) { return true;//有入库权限 } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 获取坐标最近且正常的提升机 */ public static LiftThread getRecentLift(String locNo) { SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class); String currentLocNo = locNo; Integer recentAllDistance = 9999999; LiftThread recentLift = null;//最近站点 for (LiftSlave slave : slaveProperties.getLift()) { LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, slave.getId()); if (liftThread == null) { continue; } LiftProtocol liftProtocol = liftThread.getStatus(); if (liftProtocol == null) { continue; } if (!liftThread.isDeviceIdle()) { continue; } //搜索距离小车最近的提升机 String liftLocNo = liftThread.getLiftLocNo(Utils.getLev(locNo)); if (locNo.equals(liftLocNo)) { return liftThread; } //目标地点距离 List currentShuttlePath = navigateUtils.calc(currentLocNo, liftLocNo, NavigationMapType.NORMAL.id, null, null);//使用正常通道地图 if (currentShuttlePath == null) { continue; } Integer currentAllDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离 if (currentAllDistance < recentAllDistance) { //如果当前楼层的路径更小,则更新最近站点 recentLift = liftThread; recentAllDistance = currentAllDistance; } } return recentLift; } }