From a41372ed5327e3fcd5f8ed02e657d7b0249bfffd Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期四, 07 十一月 2024 16:28:44 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java | 810 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 728 insertions(+), 82 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 e7c5592..9e4f317 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 @@ -1,27 +1,41 @@ package com.zy.asrs.wcs.core.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zy.asrs.common.domain.dto.StartupDto; +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.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.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.MapNode; +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.rcs.News; import com.zy.asrs.wcs.rcs.cache.SlaveConnection; +import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; import com.zy.asrs.wcs.rcs.entity.Device; -import com.zy.asrs.wcs.rcs.entity.DeviceType; +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.ShuttleProtocol; import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; import com.zy.asrs.wcs.rcs.service.DeviceService; -import com.zy.asrs.wcs.rcs.service.DeviceTypeService; +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.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; @@ -29,10 +43,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import java.util.*; /** * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔� @@ -52,8 +64,6 @@ @Autowired private DeviceService deviceService; @Autowired - private DeviceTypeService deviceTypeService; - @Autowired private LocCtgService locCtgService; @Autowired private LocService locService; @@ -65,24 +75,440 @@ private DictService dictService; @Autowired private ShuttleDispatcher shuttleDispatcher; + @Autowired + private RedisUtil redisUtil; + @Autowired + private BasConveyorService basConveyorService; + @Autowired + private BasConveyorStaService basConveyorStaService; + @Autowired + private BasConveyorPathService basConveyorPathService; + @Autowired + private BasLedService basLedService; + @Autowired + private DeviceBarcodeService deviceBarcodeService; + @Autowired + private ShuttleChargeStaService shuttleChargeStaService; + @Autowired + private OpenUtils openUtils; /** * 缁勬墭 * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗o紝宸ヤ綔鐘舵�� 2 */ public synchronized void generateInboundWrk() { + 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.getStaNo().toString()); + if(basConveyorSta == null) { + continue; + } + // 鑾峰彇鍏ュ簱绔欎俊鎭� + 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(); + } + Short workNo = staProtocol.getWorkNo(); + // 灏哄妫�娴嬪紓甯� + boolean back = false; + String errMsg = "寮傚父锛�"; + if (staProtocol.isFrontErr()) { + errMsg = errMsg + "鍓嶈秴闄愶紱"; + back = true; + } + if (staProtocol.isBackErr()) { + errMsg = errMsg + "鍚庤秴闄�"; + back = true; + } + if (staProtocol.isHighErr()) { + errMsg = errMsg + "楂樿秴闄�"; + back = true; + } + if (staProtocol.isLeftErr()) { + errMsg = errMsg + "宸﹁秴闄�"; + back = true; + } + if (staProtocol.isRightErr()) { + errMsg = errMsg + "鍙宠秴闄�"; + back = true; + } + if (staProtocol.isWeightErr()) { + errMsg = errMsg + "瓒呴噸"; + back = true; + } + if (staProtocol.isBarcodeErr()) { + errMsg = errMsg + "鎵爜澶辫触"; + back = true; + } + // 閫�鍥� + if (back) { + // led 寮傚父鏄剧ず + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); + if (ledThread != null) { + ledThread.error(errMsg); + } + continue; + } + + // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢 + if (staProtocol.isAutoing() && staProtocol.isLoading() + && staProtocol.isInEnable() + && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) + && staProtocol.isPakMk() + ) { + + // 鑾峰彇鏉$爜鎵弿浠俊鎭� + 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); + + 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; + } + } + + // 鍒ゆ柇閲嶅宸ヤ綔妗� + Task task1 = taskService.getOne(new LambdaQueryWrapper<Task>() + .eq(Task::getOriginSite, inSta.getStaNo()) + .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.getDestSite())); + devpThread.setPakMk(staProtocol.getSiteId(), false); + News.info("杈撻�佺嚎鍏ュ簱鍛戒护涓嬪彂锛屼换鍔℃暟鎹�={}", JSON.toJSON(task1)); + } + continue; + } + + try { + //鑾峰彇WMS鍦板潃 + Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "WMS_URL").eq(Dict::getStatus, 1)); + if (dict == null) { + News.error("WMS鍦板潃鏈厤缃�"); + continue; + } + String wmsUrl = dict.getValue(); + + SearchLocParam param = new SearchLocParam(); + param.setBarcode(barcode); + param.setIoType(1); + param.setSourceStaNo(inSta.getStaNo()); + param.setLocType1(staProtocol.getLocType1().shortValue()); + String response = new HttpHandler.Builder() + .setUri(wmsUrl) + .setPath("/rpc/pakin/loc/v1") + .setJson(JSON.toJSONString(param)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); + Integer code = jsonObject.getInteger("code"); + 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)); + row -= 16; + String wcsLocNo = Utils.getLocNo(row, bay, lev); + + CreateInTaskParam createInTaskParam = new CreateInTaskParam(); + createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo())); + createInTaskParam.setDestLoc(wcsLocNo); + createInTaskParam.setOriginSite("31002"); + createInTaskParam.setDestSite("31004"); + createInTaskParam.setPriority(11); + createInTaskParam.setBarcode(barcode); + + R result = openUtils.createInTask(createInTaskParam); + News.info("鍒涘缓鍏ュ簱浠诲姟锛屼换鍔℃暟鎹�={}锛學MS鍝嶅簲={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject), JSON.toJSON(result)); + }else { + News.error("鍏ュ簱鐢宠澶辫触锛屼换鍔℃暟鎹�={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 鍒濆鍖栧疄鏃跺湴鍥� + */ + public synchronized void initRealtimeBasMap() { + try { + List<Dict> dicts = dictService.list(new LambdaQueryWrapper<Dict>() + .like(Dict::getFlag, "map-") + .eq(Dict::getStatus, 1)); + + TreeMap<Integer, ArrayList<ArrayList<MapNode>>> levData = new TreeMap<>(); + for (Dict dict : dicts) { + String[] split = dict.getFlag().split("-"); + int lev = Integer.parseInt(split[1]); + + Object data = redisUtil.get(DeviceRedisConstant.MAP + lev); + if (data != null) { + continue; + } + + TreeMap<Integer, List<JSONObject>> rows = new TreeMap<>(); + //鎺掑簭Row + JSONArray value = JSON.parseArray(dict.getValue()); + for (Object o : value) { + JSONObject item = JSON.parseObject(o.toString()); + if (item.getString("type").equals("SHELF")) { + JSONObject property = JSON.parseObject(item.getString("property")); + Integer row1 = property.getInteger("row"); + ArrayList<JSONObject> bays = new ArrayList<>(); + if (rows.containsKey(row1)) { + bays.addAll(rows.get(row1)); + } + bays.add(property); + rows.put(row1, bays); + } + } + + ArrayList<ArrayList<MapNode>> list = new ArrayList<>(); + //鎺掑簭Bay + for (Map.Entry<Integer, List<JSONObject>> entry : rows.entrySet()) { + ArrayList<MapNode> nodes = new ArrayList<>(); + for (JSONObject object : entry.getValue()) { + MapNode mapNode = new MapNode(); + mapNode.setValue(object.getInteger("shelfType")); + mapNode.setTop(object.getInteger("top")); + mapNode.setBottom(object.getInteger("bottom")); + mapNode.setLeft(object.getInteger("left")); + mapNode.setRight(object.getInteger("right")); + mapNode.setRow(object.getInteger("row")); + mapNode.setBay(object.getInteger("bay")); + 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); + } + + Collections.sort(nodes, new Comparator<MapNode>() { + @Override + public int compare(MapNode o1, MapNode o2) { + return Integer.compare(o1.getBay(), o2.getBay()); + } + }); + + ArrayList<MapNode> sortNodes = new ArrayList<>(); + int defaultBay = 1;//榛樿浠�1鍒楀紑濮� + for (MapNode node : nodes) { + if (node.getBay() == defaultBay) { + defaultBay++; + sortNodes.add(node); + continue; + } + + //瀛樺湪绌虹己鑺傜偣锛岃嚜鍔ㄨˉ瓒� + for (int i = defaultBay; i < node.getBay(); i++) { + MapNode mapNode = new MapNode(); + mapNode.setValue(MapNodeType.DISABLE.id); + mapNode.setTop(1000); + mapNode.setBottom(1000); + mapNode.setLeft(1000); + mapNode.setRight(1000); + mapNode.setRow(node.getRow()); + mapNode.setBay(i); + mapNode.setNo(node.getRow() + "-" + i); + mapNode.setXBase(0); + mapNode.setYBase(0); + sortNodes.add(mapNode); + } + + defaultBay = node.getBay() + 1; + sortNodes.add(node); + } + + list.add(sortNodes); + } + + levData.put(lev, list); + } + + for (Map.Entry<Integer, ArrayList<ArrayList<MapNode>>> entry : levData.entrySet()) { + ArrayList<ArrayList<MapNode>> lists = entry.getValue();//鑾峰彇鍦板浘 + + MapNode mapNode = new MapNode(); + mapNode.setValue(MapNodeType.DISABLE.id); + mapNode.setTop(1000); + mapNode.setBottom(1000); + mapNode.setLeft(1000); + mapNode.setRight(1000); + mapNode.setRow(0); + mapNode.setBay(0); + mapNode.setNo("0-0"); + mapNode.setXBase(0); + mapNode.setYBase(0); + + //鑾峰彇鏈�闀縭ow + int row = 0; + //缁欐瘡涓猺ow棣栧熬澧炲姞-1鑺傜偣 + for (ArrayList<MapNode> list : lists) { + if (list.size() > row) { + row = list.size(); + } + + list.add(0, mapNode.clone()); + list.add(mapNode.clone()); + } + + //鏈�鍚庝竴娆℃娴嬪湴鍥捐妭鐐规槸鍚﹀畬鏁达紝鍦板浘鐭╅樀row鍧囪杈惧埌鏈�闀縭ow + for (ArrayList<MapNode> list : lists) { + int len = (row + 2);//row+2鏄洜涓哄ご鑺傜偣鍜屽熬鑺傜偣瀛樺湪浜轰负娣诲姞鐨�-1鑺傜偣 + if (list.size() == len) { + continue; + } + //鑺傜偣闀垮害涓嶆弧瓒筹紝杩涜琛ヨ冻 + for (int i = list.size(); i < len; i++) { + list.add(mapNode.clone()); + } + } + + + ArrayList<MapNode> headNodes = new ArrayList<>(); + ArrayList<MapNode> footerNodes = new ArrayList<>(); + for (int i = 0; i < row+2; i++) { + headNodes.add(mapNode.clone()); + footerNodes.add(mapNode.clone()); + } + + lists.add(0, headNodes); + lists.add(footerNodes); + + Integer lev = entry.getKey(); + Date now = new Date(); + RedisMapDto map = new RedisMapDto(); + map.setData(JSON.toJSONString(lists)); + map.setCreateTime(now); + map.setUpdateTime(now); + map.setLev(lev); + + //灏嗗湴鍥炬暟鎹瓨鍏edis + redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(map)); + } + } catch (Exception e) { + e.printStackTrace(); + } } // 瑙f瀽鍏ュ簱宸ヤ綔妗� public synchronized void analyzeInBoundTask() { 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; + } + + + 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())); + motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); // 鏇存柊宸ヤ綔涓绘。 task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵�� @@ -96,35 +522,38 @@ /** * 鍑哄簱 ====>> 鍚屼竴鏃堕棿涓�鍙扮┛姊溅鍙兘鏈変竴涓嚭搴撲换鍔� */ - public synchronized void generateOutboundWrkMast() { + public synchronized void analyzeOutBoundTask() { List<Task> tasks = taskService.selectPakOut(); if (tasks.isEmpty()) { return; } for (Task task : tasks) { - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); + BasConveyorSta originStaObj = basConveyorStaService.selectBySiteNo(task.getOriginSite());//鑾峰彇婧愮珯 + if (originStaObj == null) { + continue; + } + + BasConveyor basConveyor = basConveyorService.getById(originStaObj.getConveyorId()); + if(basConveyor == null) { + continue; + } + + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getOriginSite()));//婧愮珯 - StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔� - if (staProtocol == null || staProtocol1 == null) { +// StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔� + if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); - staProtocol1 = staProtocol1.clone(); +// staProtocol1 = staProtocol1.clone(); } -// // 鏌ヨ绔欑偣璇︾粏淇℃伅 -// BasDevp staDetl = basDevpService.selectById(outSta.getStaNo()); -// if (staDetl == null) { -// log.error("鍑哄簱 ===>> 绔欑偣鍦ㄦ暟鎹簱涓嶅瓨鍦�, 绔欑偣缂栧彿={}", outSta.getStaNo()); -// continue; -// } - // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵�� + // 鍒ゆ柇鍑哄簱绔欑姸鎬� if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { - - if (!(staProtocol1.isAutoing() && !staProtocol1.isLoading() && staProtocol1.getWorkNo() == 0 && staProtocol1.isOutEnable())) { - continue; - } +// if (!(staProtocol1.isAutoing() && !staProtocol1.isLoading() && staProtocol1.getWorkNo() == 0 && staProtocol1.isOutEnable())) { +// continue; +// } // //鍚屽簱浣嶇粍鏍¢獙 // List<String> outerLoc = Utils.getGroupOuterLoc(wrkMast.getSourceLocNo()); @@ -134,13 +563,30 @@ // 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 (Cools.isEmpty(motionList)) { log.error("鍑哄簱 ===>> 鏆傛椂娌℃湁绌洪棽灏忚溅, 浠诲姟鍙�={}", 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); // 宸ヤ綔鐘舵�� @@ -153,35 +599,56 @@ } } + // 瑙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()) { + continue; + } + 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()); + } + } + } + /** * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 鍙戣捣鍏呯數 */ 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; } - DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>() - .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle)) - .eq(DeviceType::getStatus, 1)); - if (deviceType == null) { - return; - } - List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() - .eq(Device::getDeviceType, deviceType.getId()) + .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) .eq(Device::getStatus, 1)); for (Device device : list) { //鑾峰彇鍥涘悜绌挎杞︾嚎绋� @@ -199,23 +666,26 @@ continue; } + if (!shuttleThread.isRequireCharge()) { + continue; + } + 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); } @@ -226,24 +696,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;//鏈壘鍒板厖鐢垫々 } @@ -264,7 +744,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"))); @@ -288,7 +768,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_CHARGE.sts); if (!taskService.save(task)) { @@ -304,36 +784,26 @@ * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 婊$數鍚庡洖鍒板緟鏈轰綅 */ 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; } - DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>() - .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle)) - .eq(DeviceType::getStatus, 1)); - if (deviceType == null) { - return; - } - List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() - .eq(Device::getDeviceType, deviceType.getId()) + .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) .eq(Device::getStatus, 1)); for (Device device : list) { //鑾峰彇鍥涘悜绌挎杞︾嚎绋� ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); if (shuttleThread == null) { + continue; + } + + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + if (shuttleProtocol == null) { continue; } @@ -359,8 +829,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())); @@ -385,7 +868,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); @@ -400,4 +883,167 @@ } } + /** + * 鍑哄簱 ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣� + */ + public void ledExecute() { + // 閬嶅巻LED + List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() + .eq(Device::getDeviceType, DeviceCtgType.LED.val()) + .eq(Device::getStatus, 1)); + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .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, basConveyor.getDeviceId().intValue()); + // 鍛戒护闆嗗悎 + List<LedCommand> commands = new ArrayList<>(); + // 宸ヤ綔妗i泦鍚� + List<Task> tasks = new ArrayList<>(); + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { + continue; + } else { + staProtocol = staProtocol.clone(); + } + // 鑾峰彇宸ヤ綔妗f暟鎹� + Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, staProtocol.getWorkNo())); + if (null == task) { + continue; + } + + 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())); + + try { + //鑾峰彇WMS鍦板潃 + Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "WMS_URL").eq(Dict::getStatus, 1)); + if (dict != null) { + String wmsUrl = dict.getValue(); + + HashMap<String, Object> param = new HashMap<>(); + param.put("taskNo", task.getTaskNo()); + String response = new HttpHandler.Builder() + .setUri(wmsUrl) + .setPath("/queryTask") + .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); + } + } + } + + /** + * 鍏朵粬 ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅 + */ + public void ledReset() { + // 鏍规嵁杈撻�佺嚎plc閬嶅巻 + List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() + .eq(Device::getDeviceType, DeviceCtgType.LED.val()) + .eq(Device::getStatus, 1)); + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .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, basConveyor.getDeviceId().intValue()); + // 鍛戒护闆嗗悎 + boolean reset = true; + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (staProtocol == null) { + continue; + } + if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) { + reset = false; + break; + } + } + // 鑾峰彇led绾跨▼ + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); + // led鏄剧ず榛樿鍐呭 + if (reset && !ledThread.isLedMk()) { + ledThread.errorReset(); + ledThread.setLedMk(true); + } + } + + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .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, basConveyor.getDeviceId().intValue()); + // 鍛戒护闆嗗悎 + boolean reset = true; + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (staProtocol == null) { continue; } + if (staProtocol.getWorkNo() != 0) { + reset = false; + break; + } + } + // 鑾峰彇led绾跨▼ + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); + // led鏄剧ず榛樿鍐呭 + if (reset && !ledThread.isLedMk()) { + ledThread.reset(); + ledThread.setLedMk(true); + } + } + } + } -- Gitblit v1.9.1