From 15356da6eeca013fafc9bb6ed2d2a4a12422ce04 Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期三, 02 四月 2025 16:41:52 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java | 329 +++++++++++++++++++++--------------------------------- 1 files changed, 126 insertions(+), 203 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java index c3ea2f0..71a47fc 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java @@ -8,25 +8,16 @@ import com.zy.asrs.common.domain.param.SearchLocParam; import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.framework.common.Cools; -import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.common.SnowflakeIdWorker; -import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.core.action.LiftAction; -import com.zy.asrs.wcs.core.domain.dto.MatDto; import com.zy.asrs.wcs.core.domain.dto.RedisMapDto; import com.zy.asrs.wcs.core.domain.dto.StaDto; -import com.zy.asrs.wcs.core.domain.param.CreateInTaskParam; import com.zy.asrs.wcs.core.entity.*; import com.zy.asrs.wcs.core.kernel.AnalyzeService; import com.zy.asrs.wcs.core.model.MapNode; -import com.zy.asrs.wcs.core.model.command.LiftAssignCommand; -import com.zy.asrs.wcs.core.model.command.LiftCommand; import com.zy.asrs.wcs.core.model.enums.*; import com.zy.asrs.wcs.core.service.*; -import com.zy.asrs.wcs.core.utils.OpenUtils; -import com.zy.asrs.wcs.core.utils.RedisUtil; -import com.zy.asrs.wcs.core.utils.ShuttleDispatcher; -import com.zy.asrs.wcs.core.utils.Utils; +import com.zy.asrs.wcs.core.utils.*; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.cache.SlaveConnection; import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; @@ -34,7 +25,6 @@ import com.zy.asrs.wcs.rcs.model.command.LedCommand; import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; -import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; import com.zy.asrs.wcs.rcs.service.DeviceService; @@ -45,7 +35,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.*; /** @@ -95,6 +84,10 @@ private OpenUtils openUtils; @Autowired private LiftAction liftAction; + @Autowired + private LiftDispatcher liftDispatcher; + @Autowired + private ShuttleStandbyService shuttleStandbyService; /** * 缁勬墭 @@ -172,6 +165,11 @@ && staProtocol.isPakMk() ) { + Object object = redisUtil.get(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo()); + if (object != null) { + continue; + } + // 鑾峰彇鏉$爜鎵弿浠俊鎭� DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); if(deviceBarcode == null) { @@ -184,7 +182,6 @@ String barcode = barcodeThread.getBarcode(); if (!Cools.isEmpty(barcode)) { News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", deviceBarcode.getId(), barcode); - } // 鍒ゆ柇閲嶅宸ヤ綔妗� @@ -195,7 +192,7 @@ if (task1 != null) { News.error("宸ヤ綔妗e凡瀛樺湪,宸ヤ綔鍙�={}", task1.getTaskNo()); if (staProtocol.getWorkNo().intValue() != Integer.parseInt(task1.getTaskNo())) { - devpThread.writeWorkSta(staProtocol.getSiteId(), Short.parseShort(task1.getTaskNo()), Short.parseShort(task1.getDestSite())); + devpThread.writeWorkSta(staProtocol.getSiteId(), Short.parseShort(task1.getTaskNo()), Short.parseShort(task1.getOriginSite())); devpThread.setPakMk(staProtocol.getSiteId(), false); News.info("杈撻�佺嚎鍏ュ簱鍛戒护涓嬪彂锛屼换鍔℃暟鎹�={}", JSON.toJSON(task1)); } @@ -228,37 +225,38 @@ if (code.equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); - String wmsLocNo = dto.getLocNo(); - int row = Integer.parseInt(wmsLocNo.substring(0, 2)); - int bay = Integer.parseInt(wmsLocNo.substring(2, 5)); - int lev = Integer.parseInt(wmsLocNo.substring(5, 7)); - String wcsLocNo = Utils.getLocNo(row, bay, lev); +// String wmsLocNo = dto.getLocNo(); +// int row = Integer.parseInt(wmsLocNo.substring(0, 2)); +// int bay = Integer.parseInt(wmsLocNo.substring(2, 5)); +// int lev = Integer.parseInt(wmsLocNo.substring(5, 7)); +// String wcsLocNo = Utils.getLocNo(row, bay, lev); +// +// CreateInTaskParam createInTaskParam = new CreateInTaskParam(); +// createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo())); +// createInTaskParam.setDestLoc(wcsLocNo); +// createInTaskParam.setOriginSite(dto.getSourceStaNo().toString()); +// createInTaskParam.setDestSite(dto.getStaNo().toString()); +// createInTaskParam.setPriority(11); +// createInTaskParam.setBarcode(barcode); +// +// R result = openUtils.createInTask(createInTaskParam); +// News.info("鍒涘缓鍏ュ簱浠诲姟锛屼换鍔℃暟鎹�={}锛學MS鍝嶅簲={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject), JSON.toJSON(result)); +// try{ +// String msg = ""; +// HashMap<String, String> hashMap = new HashMap<>(); +// hashMap.put("msg", msg); +// hashMap.put("sta", inSta.getStaNo().toString()); +// new HttpHandler.Builder() +// .setUri(wmsUrl) +// .setPath("/rpc/led/getError") +// .setJson(JSON.toJSONString(hashMap)) +// .build() +// .doPost(); +// }catch (Exception e){ +// +// } - CreateInTaskParam createInTaskParam = new CreateInTaskParam(); - createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo())); - createInTaskParam.setDestLoc(wcsLocNo); - createInTaskParam.setOriginSite(dto.getSourceStaNo().toString()); - createInTaskParam.setDestSite(dto.getStaNo().toString()); - createInTaskParam.setPriority(11); - createInTaskParam.setBarcode(barcode); - - R result = openUtils.createInTask(createInTaskParam); - News.info("鍒涘缓鍏ュ簱浠诲姟锛屼换鍔℃暟鎹�={}锛學MS鍝嶅簲={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject), JSON.toJSON(result)); - try{ - String msg = ""; - HashMap<String, String> hashMap = new HashMap<>(); - hashMap.put("msg", msg); - hashMap.put("sta", inSta.getStaNo().toString()); - new HttpHandler.Builder() - .setUri(wmsUrl) - .setPath("/rpc/led/getError") - .setJson(JSON.toJSONString(hashMap)) - .build() - .doPost(); - }catch (Exception e){ - - } - + redisUtil.set(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo(), "in", 10); }else { String msg = jsonObject.getString("msg"); HashMap<String, String> hashMap = new HashMap<>(); @@ -275,134 +273,6 @@ } catch (Exception e) { e.printStackTrace(); } - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * 鍏ュ簱-鎵樼洏杩涘簱 - */ - public synchronized void palletInbound() { - try { - // 鏍规嵁杈撻�佺嚎plc閬嶅巻 - List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() - .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val()) - .eq(Device::getStatus, 1)); - for (Device devp : list) { - BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getDeviceId, devp.getId()).eq(BasConveyor::getHostId, devp.getHostId())); - // 閬嶅巻鍏ュ簱鍙� - for (StaDto inSta : JSON.parseArray(basConveyor.getInSta(), StaDto.class)) { - BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getDeviceStaNo().toString()); - if(basConveyorSta == null) { - continue; - } - - // 鑾峰彇鍏ュ簱绔欎俊鎭� - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); - StaProtocol staProtocol = devpThread.getStation().get(inSta.getDeviceStaNo()); - if (staProtocol == null) { - continue; - } else { - staProtocol = staProtocol.clone(); - } - int workNo = staProtocol.getWorkNo().intValue(); - - // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢 - if (staProtocol.isAutoing() - && staProtocol.isLoading() - && staProtocol.isInEnable() - && (workNo >= 0) - && staProtocol.isPakMk() - ) { - Object object = redisUtil.get(DeviceRedisConstant.LIFT_PALLET_INBOUND + workNo); - if (object != null) { - continue; - } - - Task task = taskService.getOne(new LambdaQueryWrapper<Task>() - .eq(Task::getDestSite, inSta.getDeviceStaNo()) - .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts) - .eq(Task::getTaskNo, workNo)); - if (task != null) { - int lev = Utils.getLev(task.getDestLoc()); - Integer targetSite = null; - if (lev == 1) { - targetSite = 31006; - }else if (lev == 2) { - targetSite = 31007; - }else if (lev == 3) { - targetSite = 31008; - } - if(targetSite == null) { - throw new CoolException(lev + "灞傜珯鐐逛俊鎭笉瀛樺湪"); - } - - StaProtocol staProtocol1 = devpThread.getStation().get(targetSite); - if (staProtocol1 == null) { - break; - } - if (!staProtocol1.isAutoing()) { - break; - } - if (staProtocol1.isLoading()) { - break; - } - if (staProtocol1.getWorkNo().intValue() != 0) { - break; - } - - LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, inSta.getLiftNo()); - if (liftThread == null) { - break; - } - - LiftProtocol liftProtocol = liftThread.getStatus(); - if (liftProtocol == null) { - break; - } - - if (!liftThread.isIdle()) { - break; - } - - if (motionService.count(new LambdaQueryWrapper<Motion>() - .eq(Motion::getDeviceCtg, DeviceCtgType.LIFT.val()) - .eq(Motion::getDevice, inSta.getLiftNo()) - .eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) { - break; - } - - //妫�娴嬫彁鍗囨満鏄惁鏈変换鍔$粦瀹� - boolean liftResult = Utils.checkLiftHasBinding(liftProtocol.getLiftNo(), String.valueOf(workNo)); - if (liftResult) { - //瀛樺湪浠诲姟锛岀姝㈡墽琛� - break; - } - - //姣忔鎵ц鎻愬崌鏈烘寚浠ら兘缁戝畾鎻愬崌鏈� - task.setLiftNo(liftProtocol.getLiftNo()); - task.setUpdateTime(new Date()); - if (!taskService.updateById(task)) { - break; - } - - List<LiftCommand> command = liftThread.getPalletInOutCommand(workNo, 1, lev, inSta.getDeviceStaNo(), targetSite, LiftCommandModeType.PALLET_INOUT); - - LiftAssignCommand assignCommand = new LiftAssignCommand(); - assignCommand.setLiftNo(liftProtocol.getLiftNo()); - assignCommand.setTaskNo(workNo); - assignCommand.setDeviceTaskNo(liftThread.generateDeviceTaskNo(workNo, MotionCtgType.LIFT_WITH_GOODS)); - assignCommand.setCommands(command); - liftAction.assignWork(liftThread.getDevice(), assignCommand); - - redisUtil.set(DeviceRedisConstant.LIFT_PALLET_INBOUND + workNo, "send", 60 * 60 * 6); - break; - } - } } } @@ -633,20 +503,51 @@ } } + //鑾峰彇璺濈鐩爣浣嶇疆鏈�杩戠殑鍙崲灞傛彁鍗囨満(鍙兘涓嶇┖闂�) + LiftThread liftThread = liftDispatcher.searchLift(task.getDestLoc(), task.getHostId(), true); + if (liftThread == null) { + continue; + } + Device transferLiftDevice = liftThread.getDevice(); + //鑾峰彇灏忚溅寰呮満搴撲綅 ==> 杩涙彁鍗囨満 + ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>() + .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) + .eq(ShuttleStandby::getDeviceLev, Utils.getLev(task.getDestLoc())) + .eq(ShuttleStandby::getStatus, 1)); + //绌挎杞﹁繘鎻愬崌鏈哄簱浣嶅彿 + String liftLocNoTo = shuttleStandbyTo.getDeviceLoc(); + //绌挎杞﹁繘鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙� 杈撻�佺嚎浣嶇疆 + String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc(); + + //涓嶈蛋鎻愬崌鏈� + if (staProtocol.getSiteId() == 1015 || staProtocol.getSiteId() == 1026) { + standbyLocNoTo = staProtocol.getLocNo(); + } + if (Cools.isEmpty(task.getShuttleNo())) { //鍒嗛厤灏忚溅 - //鎼滅储绌洪棽杞� - ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); - if (shuttleThread == null) { + //璋冨害绌洪棽杞﹀幓鍙栬揣寰呮満浣� + Device shuttleDevice = shuttleDispatcher.dispatchShuttle(task, standbyLocNoTo); + if (shuttleDevice == null) { News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo()); continue; } - task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿 + task.setShuttleNo(Integer.valueOf(shuttleDevice.getDeviceNo()));//淇濆瓨绌挎杞﹀彿 task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo()); } + continue; + } + + //鍒ゆ柇灏忚溅鏄惁鍒拌揪鍙栬揣寰呮満浣嶇疆 + String shuttleLocNo = shuttleDispatcher.findShuttleLocNo(task.getShuttleNo(), task.getHostId()); + if (shuttleLocNo == null) { + continue; + } + + if (!standbyLocNoTo.equals(shuttleLocNo)) { continue; } @@ -838,23 +739,6 @@ // 瑙f瀽灏忚溅绉诲姩宸ヤ綔妗� public synchronized void analyzeMoveTask() { for (Task task : taskService.selectWaitAnalyzeMoveTask()) { - if (Cools.isEmpty(task.getShuttleNo())) { - //鍒嗛厤灏忚溅 - //鎼滅储绌洪棽杞� - ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); - if (shuttleThread == null) { - News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo()); - continue; - } - - task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿 - task.setUpdateTime(new Date()); - if (!taskService.updateById(task)) { - News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo()); - } - continue; - } - // generate motion list List<Motion> motionList = analyzeService.generateShuttleMoveMotion(task); if (motionList.isEmpty()) { @@ -864,6 +748,54 @@ // 鏇存柊宸ヤ綔涓绘。 task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts); // 宸ヤ綔鐘舵�� + task.setUpdateTime(new Date()); + if (!taskService.updateById(task)) { + News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); + } + } + } + + // 瑙f瀽灏忚溅鍏呯數宸ヤ綔妗� + public synchronized void analyzeChargeTask() { + List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.NEW_CHARGE.sts)); + for (Task task : list) { + String locNo = task.getDestLoc(); + + Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>() + .eq(Device::getDeviceNo, task.getShuttleNo()) + .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) + .eq(Device::getHostId, task.getHostId()) + .eq(Device::getStatus, 1)); + if (shuttleDevice == null) { + continue; + } + + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue()); + if (shuttleThread == null) { + continue; + } + + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { + continue; + } + String shuttleLocNo = task.getOriginLoc(); + + if (Utils.getLev(locNo) != Utils.getLev(shuttleLocNo)) { + shuttleDispatcher.dispatchShuttle(task, task.getDestLoc()); + continue; + } + + // generate motion list + List<Motion> motionList = analyzeService.generateChargeMotion(task); + if (Cools.isEmpty(motionList)) { + News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", task.getTaskNo()); + continue; + } + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); + + // 鏇存柊宸ヤ綔涓绘。 + task.setTaskSts(TaskStsType.ANALYZE_CHARGE.sts); task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); @@ -998,15 +930,6 @@ task.setMemo("charge"); task.setShuttleNo(Integer.valueOf(device.getDeviceNo())); - // generate motion list - List<Motion> motionList = analyzeService.generateChargeMotion(task); - if (Cools.isEmpty(motionList)) { - News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo()); - continue; - } - motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); - - task.setTaskSts(TaskStsType.ANALYZE_CHARGE.sts); if (!taskService.save(task)) { News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo()); continue; @@ -1088,7 +1011,7 @@ task.setTaskCtg(taskCtg.getId()); task.setPriority(10); task.setOriginSite(null); - task.setOriginLoc(null); + task.setOriginLoc(shuttleProtocol.getCurrentLocNo()); task.setDestSite(null); task.setDestLoc(standByLocNo); // 閬胯浣嶇疆 task.setIoTime(new Date()); -- Gitblit v1.9.1