From 3df03c486fde77ab36b9298a94bdbb0aa065a7e2 Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期二, 08 四月 2025 09:07:40 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java | 657 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 480 insertions(+), 177 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 e3860e7..ce2f0fd 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 @@ -9,20 +9,15 @@ import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.SnowflakeIdWorker; -import com.zy.asrs.framework.exception.CoolException; -import com.zy.asrs.wcs.core.domain.dto.MatDto; +import com.zy.asrs.wcs.core.action.LiftAction; import com.zy.asrs.wcs.core.domain.dto.RedisMapDto; import com.zy.asrs.wcs.core.domain.dto.StaDto; 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.enums.DeviceCtgType; -import com.zy.asrs.wcs.core.model.enums.MotionStsType; -import com.zy.asrs.wcs.core.model.enums.TaskStsType; +import com.zy.asrs.wcs.core.model.enums.*; import com.zy.asrs.wcs.core.service.*; -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; @@ -33,17 +28,13 @@ 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; -import com.zy.asrs.wcs.rcs.thread.BarcodeThread; -import com.zy.asrs.wcs.rcs.thread.DevpThread; -import com.zy.asrs.wcs.rcs.thread.LedThread; -import com.zy.asrs.wcs.rcs.thread.ShuttleThread; +import com.zy.asrs.wcs.rcs.thread.*; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import lombok.extern.slf4j.Slf4j; 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.*; /** @@ -82,7 +73,21 @@ @Autowired private BasConveyorStaService basConveyorStaService; @Autowired + private BasConveyorPathService basConveyorPathService; + @Autowired private BasLedService basLedService; + @Autowired + private DeviceBarcodeService deviceBarcodeService; + @Autowired + private ShuttleChargeStaService shuttleChargeStaService; + @Autowired + private OpenUtils openUtils; + @Autowired + private LiftAction liftAction; + @Autowired + private LiftDispatcher liftDispatcher; + @Autowired + private ShuttleStandbyService shuttleStandbyService; /** * 缁勬墭 @@ -98,6 +103,11 @@ 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.getStaNo().toString()); + if(basConveyorSta == null) { + continue; + } + // 鑾峰彇鍏ュ簱绔欎俊鎭� DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); @@ -152,45 +162,45 @@ if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) + && staProtocol.isPakMk() ) { - // 鑾峰彇鏉$爜鎵弿浠俊鎭� - BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); - if (barcodeThread == null) { + Object object = redisUtil.get(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo()); + if (object != null) { continue; } - String barcode = barcodeThread.getBarcode(); + +// // 鑾峰彇鏉$爜鎵弿浠俊鎭� +// DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); +// if(deviceBarcode == null) { +// continue; +// } +// BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId())); +// if (barcodeThread == null) { +// continue; +// } +// String barcode = barcodeThread.getBarcode(); +// if (!Cools.isEmpty(barcode)) { +// News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", deviceBarcode.getId(), barcode); +// } + + String barcode = staProtocol.getBarcode(); if (!Cools.isEmpty(barcode)) { - News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode); - if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode) || "00000000".equals(barcode)) { - staProtocol.setWorkNo((short) 32002); - staProtocol.setStaNo(inSta.getBackSta().shortValue()); - devpThread.setPakMk(staProtocol.getSiteId(), false); - devpThread.writeWorkSta(staProtocol.getSiteId(), (short) 32002, inSta.getBackSta().shortValue()); - - // led 寮傚父鏄剧ず - LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); - if (ledThread != null) { - String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯"; - ledThread.error(errorMsg); - } - continue; - } + News.info("鏉$爜鎵弿鍣ㄦ娴嬫潯鐮佷俊鎭細{}", barcode); } - - //鑾峰彇鍏ュ簱浠诲姟绫诲瀷 - TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() - .eq(TaskCtg::getFlag, "IN") - .eq(TaskCtg::getStatus, 1)); // 鍒ゆ柇閲嶅宸ヤ綔妗� Task task1 = taskService.getOne(new LambdaQueryWrapper<Task>() .eq(Task::getOriginSite, inSta.getStaNo()) - .eq(Task::getTaskCtg, taskCtg.getId()) - .in(Task::getTaskSts, 1, 2, 3) + .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts, TaskStsType.ANALYZE_INBOUND.sts, TaskStsType.EXECUTE_INBOUND.sts) .eq(Task::getZpallet, barcode)); 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.getOriginSite())); + devpThread.setPakMk(staProtocol.getSiteId(), false); + News.info("杈撻�佺嚎鍏ュ簱鍛戒护涓嬪彂锛屼换鍔℃暟鎹�={}", JSON.toJSON(task1)); + } continue; } @@ -210,7 +220,7 @@ param.setLocType1(staProtocol.getLocType1().shortValue()); String response = new HttpHandler.Builder() .setUri(wmsUrl) - .setPath("/rpc/pakin/loc/v2") + .setPath("/rpc/pakin/loc/v1") .setJson(JSON.toJSONString(param)) .build() .doPost(); @@ -219,34 +229,54 @@ Integer code = jsonObject.getInteger("code"); if (code.equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); - devpThread.writeWorkSta(staProtocol.getSiteId(), dto.getWorkNo().shortValue(), dto.getStaNo().shortValue()); - devpThread.setPakMk(staProtocol.getSiteId(), false); - } else if (code == 500) { - if (ledThread != null) { - String errorMsg = jsonObject.getString("msg"); - if (!Cools.isEmpty(errorMsg)) { - ledThread.error(errorMsg); - ledThread.setLedMk(false); - } - } - News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response); - } else if (code == 700) { -// staProtocol.setWorkNo((short) 32002); -// staProtocol.setRollback102(1);//102绔欏洖閫�淇″彿 -// devpThread.setPakMk(staProtocol.getSiteId(), false); -// MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(5, staProtocol)); +// 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){ +// +// } - // led 寮傚父鏄剧ず - if (ledThread != null) { - String errorMsg = barcode + "鎵樼洏璇嗗埆寮傚父锛岃鍏堣繘琛岀粍鎵橈紒"; - ledThread.error(errorMsg); - ledThread.setLedMk(false); - } + redisUtil.set(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo(), "in", 10); + }else { + String msg = jsonObject.getString("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(); + News.error("鍏ュ簱鐢宠澶辫触锛屼换鍔℃暟鎹�={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject)); } } catch (Exception e) { e.printStackTrace(); - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } @@ -308,6 +338,17 @@ mapNode.setNo(object.getString("row") + "-" + object.getString("bay")); mapNode.setXBase(object.getInteger("refx")); mapNode.setYBase(object.getInteger("refy")); + + if(mapNode.getValue() == MapNodeType.CONVEYOR.id) { + //杈撻�佺嚎,鍒ゆ柇灏忚溅鏄惁鍙蛋 + if (object.containsKey("conveyorHasGo")) { + if(object.getBoolean("conveyorHasGo")) { + //灏忚溅鍙蛋 + mapNode.setValue(MapNodeType.CONVEYOR_CAR_GO.id); + } + } + } + nodes.add(mapNode); } @@ -330,7 +371,7 @@ //瀛樺湪绌虹己鑺傜偣锛岃嚜鍔ㄨˉ瓒� for (int i = defaultBay; i < node.getBay(); i++) { MapNode mapNode = new MapNode(); - mapNode.setValue(-1); + mapNode.setValue(MapNodeType.DISABLE.id); mapNode.setTop(1000); mapNode.setBottom(1000); mapNode.setLeft(1000); @@ -357,7 +398,7 @@ ArrayList<ArrayList<MapNode>> lists = entry.getValue();//鑾峰彇鍦板浘 MapNode mapNode = new MapNode(); - mapNode.setValue(-1); + mapNode.setValue(MapNodeType.DISABLE.id); mapNode.setTop(1000); mapNode.setBottom(1000); mapNode.setLeft(1000); @@ -413,6 +454,7 @@ //灏嗗湴鍥炬暟鎹瓨鍏edis redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(map)); + redisUtil.set(DeviceRedisConstant.BASE_MAP + lev, JSON.toJSONString(map)); } } catch (Exception e) { e.printStackTrace(); @@ -421,21 +463,203 @@ // 瑙f瀽鍏ュ簱宸ヤ綔妗� public synchronized void analyzeInBoundTask() { - for (Task task : taskService.selectWaitAnalyzeInBoundTask()) { - // generate motion list - List<Motion> motionList = analyzeService.generateMotion(task); - if (motionList.isEmpty()) { - continue; - } - motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo())); + 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.getDeviceInSta(), StaDto.class)) { + BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getStaNo().toString()); + if(basConveyorSta == null) { + continue; + } - // 鏇存柊宸ヤ綔涓绘。 - task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵�� - task.setUpdateTime(new Date()); - if (!taskService.updateById(task)) { - News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); + // 鑾峰彇鍏ュ簱绔欎俊鎭� + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); + StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); + if (staProtocol == null) { + continue; + } else { + staProtocol = staProtocol.clone(); + } + int workNo = staProtocol.getWorkNo().intValue(); + + // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢 + if (staProtocol.isAutoing() + && staProtocol.isLoading() + && staProtocol.isInEnable() + && (workNo >= 0) +// && staProtocol.isPakMk() + ) { + + Task task = taskService.getOne(new LambdaQueryWrapper<Task>() + .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts) + .eq(Task::getTaskNo, workNo)); + if (task != null) { + if (!Cools.isEmpty(task.getLiftNo())) { + if (task.getLiftNo() > 0) { + task.setLiftNo(0); + task.setUpdateTime(new Date()); + if (!taskService.updateById(task)) { + News.info("{}浠诲姟鏇存柊閲婃斁鎻愬崌鏈哄け璐�", task.getTaskNo()); + } + } + } + + //鑾峰彇璺濈鐩爣浣嶇疆鏈�杩戠殑鍙崲灞傛彁鍗囨満(鍙兘涓嶇┖闂�) + 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())) { + //鍒嗛厤灏忚溅 + //璋冨害绌洪棽杞﹀幓鍙栬揣寰呮満浣� + Device shuttleDevice = shuttleDispatcher.dispatchShuttle(task, standbyLocNoTo); + if (shuttleDevice == null) { + News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo()); + continue; + } + + 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; + } + + // generate motion list + List<Motion> motionList = analyzeService.generateMotion(task); + if (motionList.isEmpty()) { + continue; + } + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); + + // 鏇存柊宸ヤ綔涓绘。 + task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵�� + task.setUpdateTime(new Date()); + if (!taskService.updateById(task)) { + News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); + } + break; + } + + } + } } + } catch (Exception e) { + e.printStackTrace(); } + +// for (Task task : taskService.selectWaitAnalyzeInBoundTask()) { +// BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, task.getDestSite())); +// if (basConveyorSta == null) { +// continue; +// } +// BasConveyor basConveyor = basConveyorService.getById(basConveyorSta.getConveyorId()); +// if (basConveyor == null) { +// continue; +// } +//// DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); +//// if (deviceBarcode == null) { +//// continue; +//// } +//// BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId())); +//// if (barcodeThread == null) { +//// continue; +//// } +//// if (!barcodeThread.getBarcode().equals(task.getZpallet())) { +//// continue; +//// } +// if (Cools.isEmpty(basConveyorSta.getTaskNo())){ +// continue; +// } +// if (!basConveyorSta.getTaskNo().toString().equals(task.getTaskNo())){ +// continue; +// } +// DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); +// if (devpThread == null) { +// continue; +// } +// StaProtocol staProtocol = devpThread.getStation().get(basConveyorSta.getSiteNo()); +// if (staProtocol == null) { +// continue; +// } +// if (!(staProtocol.isAutoing() +// && staProtocol.isLoading() +// && staProtocol.isInEnable())) { +// continue; +// } +// +// //瑙f瀽鍓嶅垽鏂唴閮ㄧ洰鏍囧�兼槸鍚︽湁鐗� 鏈夊伐浣滃彿 +// StaProtocol staProtocolInside = devpThread.getStation().get(Utils.getStaByLev(Utils.getLev(task.getDestLoc()))); +// if (staProtocolInside == null) { +// continue; +// } +// if (staProtocolInside.isLoading() || staProtocolInside.getWorkNo() !=0) { +// continue; +// } +// +// 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.generateMotion(task); +// if (motionList.isEmpty()) { +// continue; +// } +// motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); +// +// // 鏇存柊宸ヤ綔涓绘。 +// task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵�� +// task.setUpdateTime(new Date()); +// if (!taskService.updateById(task)) { +// News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); +// } +// } } /** @@ -448,35 +672,26 @@ } for (Task task : tasks) { - BasConveyorSta originStaObj = basConveyorStaService.selectBySiteNo(task.getOriginSite());//鑾峰彇婧愮珯 - if (originStaObj == null) { + BasConveyorSta destStaObj = basConveyorStaService.selectBySiteNo(task.getDestSite());//鑾峰彇鐩爣绔� + if (destStaObj == null) { continue; } - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, originStaObj.getConveyorId().intValue()); - StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getOriginSite()));//婧愮珯 - StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔� - if (staProtocol == null || staProtocol1 == null) { + BasConveyor basConveyor = basConveyorService.getById(destStaObj.getConveyorId()); + if(basConveyor == null) { + continue; + } + + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); + StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔� + if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); - staProtocol1 = staProtocol1.clone(); } - // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵�� + // 鍒ゆ柇鍑哄簱绔欑姸鎬� if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { - if (!(staProtocol1.isAutoing() && !staProtocol1.isLoading() && staProtocol1.getWorkNo() == 0 && staProtocol1.isOutEnable())) { - continue; - } - -// //鍚屽簱浣嶇粍鏍¢獙 -// List<String> outerLoc = Utils.getGroupOuterLoc(wrkMast.getSourceLocNo()); -// List<LocMast> outerLocMasts = locMastService.selectNotEmptyLocNos(outerLoc); -// if (!outerLocMasts.isEmpty()) { -// News.info("{}浠诲姟锛屾祬搴撲綅瀛樺湪璐х墿锛岀郴缁熺瓑寰呬腑", wrkMast.getWrkNo()); -// continue;//娴呭簱浣嶅瓨鍦ㄦ湭鎵ц浠诲姟 -// } - if (Cools.isEmpty(task.getShuttleNo())) { //鍒嗛厤灏忚溅 //鎼滅储绌洪棽杞� @@ -497,10 +712,10 @@ // generate motion list List<Motion> motionList = analyzeService.generateMotion(task); if (Cools.isEmpty(motionList)) { - log.error("鍑哄簱 ===>> 鏆傛椂娌℃湁绌洪棽灏忚溅, 浠诲姟鍙�={}", task.getTaskNo()); + log.error("鍑哄簱 ===>> 浠诲姟瑙f瀽澶辫触, 浠诲姟鍙�={}", task.getTaskNo()); continue; } - motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo())); + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); // 鏇存柊宸ヤ綔涓绘。 task.setTaskSts(TaskStsType.ANALYZE_OUTBOUND.sts); // 宸ヤ綔鐘舵�� @@ -517,14 +732,62 @@ public synchronized void analyzeMoveTask() { for (Task task : taskService.selectWaitAnalyzeMoveTask()) { // generate motion list - List<Motion> motionList = analyzeService.generateMotion(task); + List<Motion> motionList = analyzeService.generateShuttleMoveMotion(task); if (motionList.isEmpty()) { continue; } - motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo())); + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); // 鏇存柊宸ヤ綔涓绘。 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()); @@ -536,17 +799,9 @@ * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 鍙戣捣鍏呯數 */ public synchronized void loopShuttleCharge() { - // 鑾峰彇鍏呯數妗╁簱浣嶇被鍨� - LocCtg locCtg = locCtgService.getOne(new LambdaQueryWrapper<LocCtg>() - .eq(LocCtg::getFlag, "CHARGE") - .eq(LocCtg::getStatus, 1)); - if (locCtg == null) { - return; - } - //鑾峰彇鍏呯數浠诲姟绫诲瀷 TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() - .eq(TaskCtg::getFlag, "CHARGE") + .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.CHARGE)) .eq(TaskCtg::getStatus, 1)); if (taskCtg == null) { return; @@ -578,20 +833,19 @@ String currentLocNo = shuttleProtocol.getCurrentLocNo(); int lev = Utils.getLev(currentLocNo);//鑾峰彇灏忚溅妤煎眰 //鎼滅储灏忚溅褰撳墠妤煎眰鍏呯數妗� - ArrayList<Loc> allChargeLoc = new ArrayList<>(); - List<Loc> list1 = locService.list(new LambdaQueryWrapper<Loc>() - .eq(Loc::getLocCtg, locCtg.getId()) - .eq(Loc::getStatus, 1) - .eq(Loc::getLev, lev)); + ArrayList<ShuttleChargeSta> allChargeLoc = new ArrayList<>(); + + List<ShuttleChargeSta> list1 = shuttleChargeStaService.list(new LambdaQueryWrapper<ShuttleChargeSta>() + .eq(ShuttleChargeSta::getDeviceLev, lev) + .eq(ShuttleChargeSta::getStatus, 1)); if (!list1.isEmpty()) { allChargeLoc.addAll(list1); } //鎼滅储鍏朵粬妤煎眰鍏呯數妗� - List<Loc> list2 = locService.list(new LambdaQueryWrapper<Loc>() - .eq(Loc::getLocCtg, locCtg.getId()) - .eq(Loc::getStatus, 1) - .notIn(Loc::getLev, lev)); + List<ShuttleChargeSta> list2 = shuttleChargeStaService.list(new LambdaQueryWrapper<ShuttleChargeSta>() + .notIn(ShuttleChargeSta::getDeviceLev, lev) + .eq(ShuttleChargeSta::getStatus, 1)); if (!list2.isEmpty()) { allChargeLoc.addAll(list2); } @@ -602,24 +856,34 @@ } //閫夋嫨绌洪棽鍏呯數妗� - Loc chargeLoc = null; - for (Loc loc : allChargeLoc) { + ShuttleChargeSta chargeSta = null; + for (ShuttleChargeSta shuttleChargeSta : allChargeLoc) { // 鍒ゆ柇鍏呯數浣嶆槸鍚﹁鍗犵敤(杞﹁締浣嶇疆) - if (Utils.hasShuttleInLoc(loc.getLocNo(), device.getId())) { + if (Utils.hasShuttleInLoc(shuttleChargeSta.getDeviceLoc(), device.getId())) { continue; } // 鐩樼偣鍏呯數浣嶆槸鍚﹀瓨鍦ㄤ换鍔℃。 - List<Task> tasks = taskService.hasChargeInLoc(loc.getLocNo()); + List<Task> tasks = taskService.hasChargeInLoc(shuttleChargeSta.getDeviceLoc()); if (!tasks.isEmpty()) { continue; } - chargeLoc = loc; + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getLocNo, shuttleChargeSta.getDeviceLoc())); + if (loc == null) { + continue; + } + + if (!loc.getLocSts().equals(LocStsType.C.val())) { + continue;//搴撲綅涓嶆槸鍏呯數妗� + } + + chargeSta = shuttleChargeSta; break; } - if (chargeLoc == null) { + if (chargeSta == null) { continue;//鏈壘鍒板厖鐢垫々 } @@ -640,7 +904,7 @@ continue; } - String chargeLocNo = chargeLoc.getLocNo(); + String chargeLocNo = chargeSta.getDeviceLoc(); Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); task.setTaskNo(String.valueOf(Utils.getTaskNo("CHARGE"))); @@ -658,15 +922,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.setTaskSts(TaskStsType.ANALYZE_CHARGE.sts); if (!taskService.save(task)) { News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo()); continue; @@ -680,17 +935,9 @@ * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 婊$數鍚庡洖鍒板緟鏈轰綅 */ public synchronized void loopShuttleToStandbyCauseCharge() { - Integer enoughPower = 90; - Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>() - .eq(Dict::getFlag, "chargeMaxValue") - .eq(Dict::getStatus, 1)); - if (dict != null) { - enoughPower = Integer.parseInt(dict.getValue()); - } - //鑾峰彇杩佺Щ浠诲姟绫诲瀷 TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() - .eq(TaskCtg::getFlag, "MOVE") + .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.MOVE)) .eq(TaskCtg::getStatus, 1)); if (taskCtg == null) { return; @@ -733,8 +980,21 @@ continue; } + ShuttleChargeSta chargeSta = shuttleChargeStaService.getOne(new LambdaQueryWrapper<ShuttleChargeSta>() + .eq(ShuttleChargeSta::getDeviceLoc, chargeTask.getDestLoc()) + .eq(ShuttleChargeSta::getStatus, 1)); + if (chargeSta == null) { + continue;//鍏呯數妗╀笉瀛樺湪锛屽紓甯� + } + + String standbyLoc = chargeSta.getStandbyLoc(); + if (standbyLoc == null) { + continue;//閬胯浣嶇疆鏁版嵁涓嶅瓨鍦� + } + List<String> availableLoc = JSON.parseArray(standbyLoc, String.class); + //鑾峰彇閬胯浣嶇疆 - String standByLocNo = shuttleDispatcher.searchStandByLocNo(Integer.valueOf(device.getDeviceNo()), device.getHostId(), shuttleThread.getStatus().getCurrentLocNo()); + String standByLocNo = shuttleDispatcher.searchAvailableLocNo(Integer.valueOf(device.getDeviceNo()), device.getHostId(), shuttleThread.getStatus().getCurrentLocNo(), availableLoc); Task task = new Task(); task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); @@ -743,7 +1003,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()); @@ -759,7 +1019,7 @@ News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", device.getDeviceNo()); continue; } - motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo())); + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts); @@ -788,8 +1048,14 @@ .eq(BasLed::getDeviceId, ledDevice.getId())); List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>() + .eq(BasConveyor::getDeviceId, led.getConveyorId().intValue())); + if (basConveyor == null) { + continue; + } + // 鑾峰彇杈撻�佺嚎plc绾跨▼ - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); // 鍛戒护闆嗗悎 List<LedCommand> commands = new ArrayList<>(); // 宸ヤ綔妗i泦鍚� @@ -797,26 +1063,26 @@ for (Integer staNo : staArr) { // 鑾峰彇鍙夎溅绔欑偣 StaProtocol staProtocol = devpThread.getStation().get(staNo); - if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { + if (null == staProtocol || null == staProtocol.getWorkNo()) { continue; } else { staProtocol = staProtocol.clone(); } - // 鑾峰彇宸ヤ綔妗f暟鎹� - Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, staProtocol.getWorkNo())); - if (null == task) { - continue; - } + String taskNo = "0"; + if (staProtocol.isOutEnable() && staProtocol.getSiteId() == 31001 ){ + if (0 != staProtocol.getWorkNo()){ + Motion motion = motionService.getOne(new LambdaQueryWrapper<Motion>().eq(Motion::getMotionCtg, 9).eq(Motion::getTemp, staProtocol.getWorkNo())); + // 鑾峰彇宸ヤ綔妗f暟鎹� + Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, motion.getTaskNo())); + if (null == task) { + continue; + } + taskNo = task.getWmsTaskNo(); + } - tasks.add(task); - // 缁勮鍛戒护 - LedCommand ledCommand = new LedCommand(); - ledCommand.setWorkNo(task.getTaskNo()); - ledCommand.setIoType(task.getTaskCtg().intValue()); - ledCommand.setTitle(task.getTaskCtg$()); - ledCommand.setSourceLocNo(task.getOriginLoc()); - ledCommand.setLocNo(task.getDestLoc()); - ledCommand.setStaNo(Integer.parseInt(task.getDestSite())); + } else if (staProtocol.isInEnable() && staProtocol.getSiteId() == 31002) { + taskNo = staProtocol.getStaNo().toString(); + } try { //鑾峰彇WMS鍦板潃 @@ -825,32 +1091,24 @@ String wmsUrl = dict.getValue(); HashMap<String, Object> param = new HashMap<>(); - param.put("taskNo", task.getTaskNo()); + param.put("taskNo", taskNo); + param.put("sta",staNo); String response = new HttpHandler.Builder() .setUri(wmsUrl) - .setPath("/queryTask") + .setPath("/rpc/led/getTask") .setJson(JSON.toJSONString(param)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); Integer code = jsonObject.getInteger("code"); if (code.equals(200)) { - List<MatDto> matDtos = JSON.parseArray(jsonObject.getString("data"), MatDto.class); - ledCommand.setMatDtos(matDtos); + } } } catch (Exception e) { e.printStackTrace(); } - commands.add(ledCommand); - } - // 鑾峰彇LED绾跨▼ - LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); - // 鍛戒护涓嬪彂 ------------------------------------------------------------------------------- - if (!commands.isEmpty()) { - ledThread.write(commands); - ledThread.setLedMk(false); } } } @@ -869,8 +1127,13 @@ .eq(BasLed::getDeviceId, ledDevice.getId())); List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + BasConveyor basConveyor = basConveyorService.getById(led.getConveyorId().intValue()); + if (basConveyor == null) { + continue; + } + // 鑾峰彇杈撻�佺嚎plc绾跨▼ - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); // 鍛戒护闆嗗悎 boolean reset = true; for (Integer staNo : staArr) { @@ -899,8 +1162,13 @@ .eq(BasLed::getDeviceId, ledDevice.getId())); List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + BasConveyor basConveyor = basConveyorService.getById(led.getConveyorId()); + if (basConveyor == null) { + continue; + } + // 鑾峰彇杈撻�佺嚎plc绾跨▼ - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); // 鍛戒护闆嗗悎 boolean reset = true; for (Integer staNo : staArr) { @@ -922,4 +1190,39 @@ } } + // 瑙f瀽灏忚溅杞借揣绉诲姩宸ヤ綔妗� + public synchronized void analyzeLadenMoveTask() { + for (Task task : taskService.selectWaitAnalyzeLadenMoveTask()) { + 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.generateShuttleLadenMoveMotion(task); + if (motionList.isEmpty()) { + continue; + } + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); + + // 鏇存柊宸ヤ綔涓绘。 + task.setTaskSts(TaskStsType.ANALYZE_LADEN_MOVE.sts); // 宸ヤ綔鐘舵�� + task.setUpdateTime(new Date()); + if (!taskService.updateById(task)) { + News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo()); + } + } + } } -- Gitblit v1.9.1