From 8740b1c94ffd20b54b95962df886e43f722911c5 Mon Sep 17 00:00:00 2001 From: lsh <lsh@163.com> Date: 星期四, 24 四月 2025 17:31:12 +0800 Subject: [PATCH] * --- src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 326 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 292 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java index c1c4edb..1fbc07a 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -13,25 +13,24 @@ import com.zy.asrs.mapper.*; import com.zy.asrs.service.*; import com.zy.asrs.utils.CommandUtils; +import com.zy.asrs.utils.RouteUtils; +import com.zy.asrs.utils.TrackRangeUtils; import com.zy.asrs.utils.Utils; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; import com.zy.core.CrnThread; import com.zy.core.DevpThread; -import com.zy.core.cache.MessageQueue; -import com.zy.core.cache.RgvStatusCache; -import com.zy.core.cache.SlaveConnection; +import com.zy.core.cache.*; import com.zy.core.enums.*; import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; -import com.zy.core.model.protocol.CrnProtocol; -import com.zy.core.model.protocol.RgvProtocol; -import com.zy.core.model.protocol.StaProtocol; +import com.zy.core.model.protocol.*; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; +import com.zy.core.thread.RgvThread; import com.zy.core.thread.SiemensDevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +41,7 @@ import java.io.IOException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔� @@ -80,6 +80,8 @@ private CommonService commonService; @Autowired private CrnController crnController; + @Autowired + private BasDevpPositionService basDevpPositionService; @Value("${wms.url}") private String wmsUrl; @@ -99,6 +101,9 @@ @Value("${constant-parameters.trackProportion}") private Long trackProportion; + + @Value("${constant-parameters.avoidDistance}") + private Long avoidDistance; public void generateStoreWrkFile() { try { @@ -1106,25 +1111,63 @@ return taskWrk; } - public boolean deviceDetection(RgvSlave slave){ + public String rgvOtherTaskWrk(RgvSlave slave){ + + RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId()); + TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache(); + ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol(); + if (!allTaskProtocol.isEmpty()){ + for (TaskProtocol taskProtocol : allTaskProtocol.values()){ + if (taskProtocol.getTaskNo() != 0 ){ + return taskProtocol.getTaskNo().toString(); + } + } + } + return "鏃�"; + + } + public boolean rgvDetection(RgvSlave slave){ RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); - if (rgvProtocol == null) { + RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); + + if (rgvProtocol == null || rgvTaskProtocol ==null) { return false; } - if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) + if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L || (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { return false; } RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); + RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); + if (rgvProtocolOther == null) { return false; } if (rgvProtocolOther.statusEnable){ - if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) { + if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) { return false; } } return true; + } + + public TaskWrk deviceDetection(RgvSlave.RgvStn inSta){ + + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId()); + StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); + if (staProtocol == null){ + return null; + } + // 鍒ゆ柇鏄惁婊¤冻鍙栬揣鏉′欢 + if (staProtocol.isAutoing() +// && staProtocol.isLoading() + && staProtocol.getWorkNo()!=0) { + TaskWrk taskWrk = taskWrkService.selectByTaskNo(staProtocol.getWorkNo().toString()); + if (taskWrk!=null){ + return taskWrk; + } + } + return null; } public boolean rgvOtherStatusEnable(RgvSlave slave){ @@ -1134,42 +1177,257 @@ } if (rgvProtocolOther.statusEnable){ // if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) { - return true; + return true; // } } return false; } - - private void sc(){ - - - // 鏍规嵁杈撻�佺嚎plc閬嶅巻 + public synchronized void taskStart() { for (RgvSlave rgvSlave : slaveProperties.getRgv()) { - if (!deviceDetection(rgvSlave)){ - continue; - } - RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId()); + try{ + if (rgvDetection(rgvSlave)){ + String taskNoNow = rgvOtherTaskWrk(rgvSlave); + List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true)); + boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave); + if (basDevpPositions.isEmpty()) { + log.error("鑾峰彇鎵�鏈夌珯鐐逛俊鎭紓甯�"); + continue; + } + List<TaskWrk> taskWrkList = new ArrayList<>(); + List<Integer> staList = new ArrayList<>(); + for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()){ + TaskWrk taskWrk = deviceDetection(inSta); + if (taskWrk!=null){ + if (taskWrk.getTaskNo().equals(taskNoNow)) continue; + taskWrkList.add(taskWrk); + staList.add(inSta.getStaNo()); + } + } - RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId()); + if (taskWrkList.isEmpty() || staList.isEmpty()) continue; - //姹傚嚭褰撳墠杞﹀彲杩愯鑼冨洿 - Long[] farthestPoint = new Long[]{0L,0L}; - if (!rgvProtocolOther.statusEnable){ - farthestPoint = new Long[]{0L,0L}; - } else { - if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){ + boolean sign = false; + if (rgvOtherStatusEnable(rgvSlave)){ + //鍒嗘垚涓婁笅涓ら儴鍒嗕换鍔� + List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions); + List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1]; + List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0]; + //灏辫繎鎺掑簭 + RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId()); + List<Integer> rangeList = RouteUtils.SortNearby(rangeListSou, rgvProtocol.RgvPos, basDevpPositions); + List<Integer> rangeListOther = RouteUtils.SortNearby(rangeListSouOther, rgvProtocol.RgvPos, basDevpPositions); + + //鎵�灞為儴鍒嗗氨杩涘彇璐� + + //绛涢�夎寖鍥村唴浠诲姟 + //灏辫繎鎺掑簭 + RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId()); + //绛涢�夊湪鑼冨洿浠诲姟 + List<Integer> belongToRange = RouteUtils.belongToRange(rangeList, rgvProtocolOther.getRgvPosDestination(), basDevpPositions); + for (Integer staNoNow : belongToRange){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + TaskWrk taskWrk = deviceDetection(rgvStn); + if (taskWrk!=null){ + if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + } + } + break; + } + } + if (sign){ + break; + } + } + if (!sign){ + // 绛涢�夎寖鍥村唴鍙栬揣浠诲姟 + for (Integer staNoNow : belongToRange){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + break; + } + } + if (sign){ + break; + } + } + } + + if (!sign){ + for (Integer staNoNow : rangeList){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + TaskWrk taskWrk = deviceDetection(rgvStn); + if (taskWrk!=null){ + if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + } + } + break; + } + } + if (sign){ + break; + } + } + } + if (!sign){ + // 鍗婅竟鍖哄煙鍐呭彇璐т换鍔� + for (Integer staNoNow : rangeList){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + break; + } + } + if (sign){ + break; + } + } + } + if (!sign){ + // 鍗婅竟鍖哄煙鍐呮斁璐т换鍔� + for (Integer staNoNow : rangeListOther){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + TaskWrk taskWrk = deviceDetection(rgvStn); + if (taskWrk!=null){ + if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + } + } + break; + } + } + if (sign){ + break; + } + } + } + } else { + //鍙敤鍖哄煙灏辫繎鍙栬揣 + //灏辫繎鎺掑簭 + RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId()); + List<Integer> rangeList = RouteUtils.SortNearby(staList, rgvProtocol.RgvPos, basDevpPositions); + // 鍗婅竟鍖哄煙鍐呭彇璐т换鍔� + for (Integer staNoNow : rangeList){ + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNoNow)){ + sign = taskGenerate(rgvSlave,rgvStn,0); + break; + } + } + if (sign){ + break; + } + } + } } - } - - - // 閬嶅巻鍏ュ簱鍙� - for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSStn()) { - + } catch (Exception e){ + log.error("浠诲姟鐢熸垚澶辫触===銆嬪紓甯镐俊鎭細{}",e.getMessage()); } } - } + //鑾峰彇璧风偣涓庣粓鐐瑰璞� + public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave,Integer staNo) { + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(staNo)){ + return rgvStn; + } + } + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){ + if (rgvStn.getStaNo().equals(staNo)){ + return rgvStn; + } + } + return null; + } + + //鑾峰彇璧风偣涓庣粓鐐瑰璞� + public RgvSlave.RgvStn[] getRgvStnAll(RgvSlave rgvSlave,Integer souSta,Integer endSta) { + RgvSlave.RgvStn[] rgvStns = new RgvSlave.RgvStn[2]; + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ + if (rgvStn.getStaNo().equals(souSta)){ + rgvStns[0] = rgvStn; + } + } + for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){ + if (rgvStn.getStaNo().equals(endSta)){ + rgvStns[1] = rgvStn; + } + } + return rgvStns; + } + + public boolean taskGenerate(RgvSlave rgvSlave,RgvSlave.RgvStn rgvStn,Integer sign) { + try{ + RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); + TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache(); + + TaskProtocol issuedTake = new TaskProtocol(); + TaskProtocol issuedPut = new TaskProtocol(); + try{ + ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol(); + if (allTaskProtocol.size() > 0){ + return false; + } + TaskWrk taskWrk = deviceDetection(rgvStn); + if (taskWrk == null){ + return false; + } + Integer targetPointConvert = taskWrk.getTargetPointConvert(); + if (targetPointConvert == null){ + return false; + } + RgvSlave.RgvStn rgvStnEnd = getRgvStnNow(rgvSlave, targetPointConvert); + if (rgvStnEnd == null){ + return false; + } + + BasDevpPosition basDevpPositionSou = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo())); + BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", targetPointConvert)); + //鎵ц + issuedTake.setTaskNo(Long.valueOf(taskWrk.getTaskNo())); + issuedTake.setTaskStatus(1); + issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(),issuedTake.getTaskStatus())); + issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition()); + issuedTake.setIsRunning(1); + issuedTake.setDirection(rgvStn.isDirection()); + + + issuedPut.setTaskNo(Long.valueOf(taskWrk.getTaskNo())); + issuedPut.setTaskStatus(2); + issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(),issuedPut.getTaskStatus())); + issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition()); + issuedPut.setIsRunning(1); + issuedPut.setDirection(rgvStnEnd.isDirection()); + }catch (Exception e){ + log.error("浠诲姟鐢熸垚澶辫触issued1===銆嬪紓甯镐俊鎭細{}",e.getMessage()); + return false; + } + + switch (sign){ + case 1: + taskProtocolCache.updateTaskProtocol(issuedTake); + break; + case 2: + taskProtocolCache.updateTaskProtocol(issuedPut); + break; + default: + taskProtocolCache.updateTaskProtocol(issuedTake); + taskProtocolCache.updateTaskProtocol(issuedPut); + break; + } + } catch (Exception e){ + log.error("浠诲姟鐢熸垚澶辫触issued2===銆嬪紓甯镐俊鎭細{}",e.getMessage()); + } + return true; + } + + } -- Gitblit v1.9.1