From 05b57adb20382ff1ceb99cea676fe3dce7908514 Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期四, 25 九月 2025 16:20:04 +0800 Subject: [PATCH] # --- src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 182 ++++++++++++++++++++++++++++++++++++++------- 1 files changed, 152 insertions(+), 30 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 f2292f5..dda1f5e 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.common.SpringUtils; import com.zy.asrs.domain.enums.NotifyMsgType; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; @@ -75,6 +76,8 @@ private DeviceConfigService deviceConfigService; @Autowired private LiftDispatchUtils liftDispatchUtils; + @Autowired + private BasShuttleService basShuttleService; /** * 鍒濆鍖栧疄鏃跺湴鍥� @@ -99,7 +102,7 @@ } //灏嗘暟鎹簱鍦板浘鏁版嵁瀛樺叆redis - redisUtil.set(RedisKeyType.MAP.key + lev, JSON.toJSONString(basMap)); + redisUtil.set(RedisKeyType.MAP.key + lev, lists); } } @@ -299,12 +302,12 @@ } if (liftSta.getHasCar()) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣瀛樺湪灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftSta.getStaNo()); + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣瀛樺湪灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftSta.getSiteId()); return false; } if (liftSta.getHasTray()) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getStaNo()); + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getSiteId()); return false; } @@ -424,7 +427,7 @@ assignCommand.setCommands(commands); wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN.sts);//灏忚溅鎼繍涓� 101.鐢熸垚鍑哄簱浠诲姟 ==> 102.灏忚溅鎼繍涓� - wrkMast.setSourceStaNo(liftSta.getStaNo()); + wrkMast.setSourceStaNo(liftSta.getSiteId()); wrkMast.setModiTime(new Date()); wrkMast.setSystemMsg("");//娓呯┖娑堟伅 if (wrkMastService.updateById(wrkMast)) { @@ -501,6 +504,12 @@ //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅 if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) { + //浠诲姟琚伩闅滃彇娑� + Object cancelLock = redisUtil.get(RedisKeyType.TRAFFIC_CONTROL_SHUTTLE_OBSTACLE_CANCEL_TASK_LOCK.key + wrkMast.getShuttleNo()); + if(cancelLock != null) { + return false; + } + //灏忚溅鏈埌杈惧彇璐т綅缃� shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐� News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞︽湭鍒拌揪鍙栬揣浣嶇疆", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); @@ -608,18 +617,13 @@ //1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑 if (wrkMast.getWrkSts() == WrkStsType.NEW_INBOUND.sts) { //鑾峰彇鐩爣杈撻�佺珯 - ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); + LiftStaProtocol liftSta = LiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); if (liftSta == null) { return false;//鎵句笉鍒扮珯鐐� } if (liftSta.getHasTray()) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏", wrkMast.getWrkNo()); - return false; - } - - if (liftSta.getHasCar()) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪灏忚溅", wrkMast.getWrkNo()); return false; } @@ -765,13 +769,8 @@ return false; } - if (liftSta.getHasCar()) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣瀛樺湪灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftSta.getStaNo()); - return false; - } - if (!liftSta.getHasTray()) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏃犳墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getStaNo()); + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏃犳墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getSiteId()); return false; } @@ -1094,8 +1093,26 @@ } //鍒ゆ柇褰撳墠灏忚溅鏄惁婊¤冻闇�瑕佸厖鐢佃姹� - if (!shuttleThread.isRequireCharge()) { - continue; + if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.NONE)) { + continue;//鏃犻渶鍏呯數 + } + + boolean forceCharge = true; + if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.SUGGEST_CHARGE)) { + BasShuttle basShuttle = basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", device.getDeviceNo())); + if (basShuttle != null) { + Integer suggestChargeLine = basShuttle.getSuggestChargeLine(); + boolean chargeSuggestResult = Integer.parseInt(shuttleProtocol.getBatteryPower()) < suggestChargeLine; + if (chargeSuggestResult) { + //妫�娴嬬郴缁熸槸鍚︽湁浠诲姟 + List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 1, 101, 201)); + if (wrkMasts.isEmpty()) { + forceCharge = false; + }else { + continue; + } + } + } } WrkMast wrkMast1 = wrkMastService.selectShuttleWorking(shuttleProtocol.getShuttleNo()); @@ -1171,7 +1188,7 @@ wrkMast.setIoPri((double) 999); wrkMast.setLocNo(chargeLocNo); wrkMast.setShuttleNo(device.getDeviceNo()); - wrkMast.setMemo("charge"); + wrkMast.setMemo(forceCharge ? "forceCharge" : "suggestCharge"); wrkMast.setAppeTime(new Date()); if (!wrkMastService.insert(wrkMast)) { News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo()); @@ -1321,7 +1338,7 @@ List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, true); assignCommand.setCommands(commands);//杩愯鍛戒护 - wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_WORKING.sts); + wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_START_CHARGING.sts); wrkMast.setModiTime(new Date()); if (!wrkMastService.updateById(wrkMast)) { return false; @@ -1338,7 +1355,7 @@ //灏忚溅鍋滄鍏呯數 private synchronized boolean executeShuttleChargeStepStopCharge(WrkMast wrkMast) { - if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) { + if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) { ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); if (shuttleThread == null) { return false; @@ -1348,7 +1365,21 @@ return false; } - if (!shuttleThread.isChargingCompleted()) { + boolean stopCharge = false; + if (wrkMast.getMemo().equals("suggestChargeTaskStop")) { + stopCharge = true; + }else { + if (shuttleThread.isChargingCompleted()) { + stopCharge = true; + } + } + + if (!stopCharge) { + return false; + } + + Object limitObj = redisUtil.get(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo()); + if (limitObj != null) { return false; } @@ -1364,6 +1395,7 @@ //涓嬪彂浠诲姟 shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); + redisUtil.set(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo(), "limit", 10); return false; } return true; @@ -1371,7 +1403,7 @@ //灏忚溅绂诲紑鍏呯數妗� private synchronized boolean executeShuttleChargeStepLeaveCharge(WrkMast wrkMast) { - if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts) { + if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts) { ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); if (shuttleThread == null) { return false; @@ -1510,8 +1542,8 @@ //灏忚溅宸插湪杩戠偣浣嶇疆鏃犻渶鍓嶅線 if (shuttleProtocol.getCurrentLocNo().equals(endLocation)) { wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY_COMPLETE.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 303.灏忚溅绉诲姩鑷宠繎鐐瑰畬鎴� - wrkMast.setSourceStaNo(recentLiftStation.getStaNo()); - wrkMast.setStaNo(targetLiftSta.getStaNo()); + wrkMast.setSourceStaNo(recentLiftStation.getSiteId()); + wrkMast.setStaNo(targetLiftSta.getSiteId()); wrkMast.setModiTime(now); wrkMast.setSystemMsg("");//娓呯┖娑堟伅 wrkMastService.updateById(wrkMast); @@ -1536,8 +1568,8 @@ assignCommand.setCommands(commands); wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷宠繎鐐逛腑 - wrkMast.setSourceStaNo(recentLiftStation.getStaNo()); - wrkMast.setStaNo(targetLiftSta.getStaNo()); + wrkMast.setSourceStaNo(recentLiftStation.getSiteId()); + wrkMast.setStaNo(targetLiftSta.getSiteId()); wrkMast.setModiTime(now); wrkMast.setSystemMsg("");//娓呯┖娑堟伅 if (wrkMastService.updateById(wrkMast)) { @@ -1630,7 +1662,13 @@ int targetLev = Utils.getLev(shuttleProtocol.getCurrentLocNo()); if (object == null || liftProtocol.getLev() != targetLev) { //鑾峰彇鎻愬崌鏈哄懡浠� - LiftCommand liftCommand = liftThread.getMoveCommand(wrkMast.getWrkNo(), liftProtocol.getLev(), targetLev); + LiftStaProtocol startSta = LiftUtils.getLiftStaByLev(liftProtocol.getLiftNo(), liftProtocol.getLev()); + LiftStaProtocol targetSta = LiftUtils.getLiftStaByLev(liftProtocol.getLiftNo(), targetLev); + if (startSta == null || targetSta == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛岀珯鐐规暟鎹笉瀛樺湪", wrkMast.getWrkNo(), wrkMast.getLiftNo()); + return false; + } + LiftCommand liftCommand = liftThread.getMoveCommand(commonService.getWorkNo(WrkIoType.PREVIEW_LIFT_MOVE.id), startSta.getSiteId(), targetSta.getSiteId()); ArrayList<LiftCommand> commands = new ArrayList<>(); commands.add(liftCommand); @@ -1644,6 +1682,12 @@ liftAction.assignWork(wrkMast.getLiftNo(), assignCommand); News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満鍦▄}灞傦紝鎻愬崌鏈轰笉鍦ㄥ皬杞﹀眰锛岃皟搴︾Щ鍔ㄤ腑", wrkMast.getWrkNo(), liftProtocol.getLev(), wrkMast.getLiftNo()); redisUtil.set(RedisKeyType.LIFT_MOVE_TO_SHUTTLE_LIMIT.key + wrkMast.getWrkNo(), "lift_moving", 60 * 3); + redisUtil.set(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo(), "lock", 8); + return false; + } + + Object limitObj = redisUtil.get(RedisKeyType.TASK_RUN_LIMIT.key + wrkMast.getWrkNo()); + if (limitObj != null) { return false; } @@ -1720,7 +1764,7 @@ } //鑾峰彇鎻愬崌鏈哄懡浠� - LiftCommand liftCommand = liftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getLev(), liftSta.getLev()); + LiftCommand liftCommand = liftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getSiteId(), liftSta.getSiteId()); ArrayList<LiftCommand> commands = new ArrayList<>(); commands.add(liftCommand); @@ -1795,7 +1839,14 @@ return false; } - String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 2); + //灏忚溅鍑烘彁鍗囨満杩戠偣璺濈 + int shuttleOutLiftLocationDistance = 2; + Config shuttleOutLiftLocationDistanceConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleOutLiftLocationDistance")); + if (shuttleOutLiftLocationDistanceConfig != null) { + shuttleOutLiftLocationDistance = Integer.parseInt(shuttleOutLiftLocationDistanceConfig.getValue()); + } + + String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, shuttleOutLiftLocationDistance); if (targetLocNo == null) {//鍑烘彁鍗囨満杩戠偣璁$畻澶辫触 News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽嚭鎻愬崌鏈鸿繎鐐硅绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); return false; @@ -1894,4 +1945,75 @@ return true; } + //鑷姩鍒囨崲鍑哄叆搴撴ā寮� + public void autoSwitchLiftIOMode() { + List<DeviceConfig> liftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>() + .eq("device_type", String.valueOf(SlaveType.Lift))); + for (DeviceConfig device : liftList) { + Integer liftNo = device.getDeviceNo(); + LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo); + if (liftThread == null) { + continue; + } + LiftProtocol liftProtocol = liftThread.getStatus(); + if (liftProtocol == null) { + continue; + } + + List<Integer> liftAllStaNo = LiftUtils.getLiftAllStaNo(liftNo); + if (liftAllStaNo.isEmpty()) { + continue; + } + + List<Integer> conveyorBindLiftAllStaNo = LiftUtils.getConveyorBindLiftAllStaNo(liftNo); + if (conveyorBindLiftAllStaNo.isEmpty()) { + continue; + } + + //鑾峰彇鍏ュ簱浠诲姟 + List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() + .in("sta_no", liftAllStaNo) + .in("wrk_sts" + , WrkStsType.NEW_INBOUND.sts + , WrkStsType.INBOUND_DEVICE_RUN.sts + , WrkStsType.INBOUND_LIFT_RUN.sts + , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts + , WrkStsType.INBOUND_SHUTTLE_RUN.sts + , WrkStsType.INBOUND_SHUTTLE_RUN_COMPLETE.sts + )); + + //鑾峰彇鍑哄簱浠诲姟 + List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() + .in("sta_no", conveyorBindLiftAllStaNo) + .in("wrk_sts" + , WrkStsType.NEW_OUTBOUND.sts + , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts + , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts + , WrkStsType.OUTBOUND_LIFT_RUN.sts + , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts + )); + + if (liftProtocol.getIOModeType().equals(LiftIoModeType.NONE)) { + //鏈煡妯″紡 + if (!inWrkMasts.isEmpty()) { + liftThread.switchIOMode(LiftIoModeType.IN); + } else if (!outWrkMasts.isEmpty()) { + liftThread.switchIOMode(LiftIoModeType.OUT); + }else { + liftThread.switchIOMode(LiftIoModeType.IN); + } + } else if (liftProtocol.getIOModeType().equals(LiftIoModeType.IN)) { + //鍏ュ簱妯″紡 + if (inWrkMasts.isEmpty() && !outWrkMasts.isEmpty()) { + liftThread.switchIOMode(LiftIoModeType.OUT); + } + } else if (liftProtocol.getIOModeType().equals(LiftIoModeType.OUT)) { + //鍑哄簱妯″紡 + if (outWrkMasts.isEmpty() && !inWrkMasts.isEmpty()) { + liftThread.switchIOMode(LiftIoModeType.IN); + } + } + } + } + } -- Gitblit v1.9.1