From e29a9f245ff4e57a40bbab1c0acc3cbc31d3ac2b Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期一, 21 四月 2025 11:13:13 +0800 Subject: [PATCH] #出库找待机位优化 --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 277 insertions(+), 14 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java index 66edce3..5041bed 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java @@ -1,19 +1,24 @@ package com.zy.asrs.wcs.core.timer; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.zy.asrs.wcs.core.entity.Loc; -import com.zy.asrs.wcs.core.entity.Task; +import com.zy.asrs.common.utils.HttpHandler; +import com.zy.asrs.framework.common.Cools; +import com.zy.asrs.wcs.core.domain.param.AgvTaskCreateParam; +import com.zy.asrs.wcs.core.domain.param.CreateWcsTaskParam; +import com.zy.asrs.wcs.core.domain.param.ReturnWcsTaskStatisParam; +import com.zy.asrs.wcs.core.entity.*; import com.zy.asrs.wcs.core.model.enums.LocStsType; import com.zy.asrs.wcs.core.model.enums.TaskStsType; -import com.zy.asrs.wcs.core.service.LocService; -import com.zy.asrs.wcs.core.service.TaskService; +import com.zy.asrs.wcs.core.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Slf4j @Component @@ -22,29 +27,229 @@ @Autowired private TaskService taskService; @Autowired + private TaskLogService taskLogService; + @Autowired + private MotionService motionService; + @Autowired + private MotionLogService motionLogService; + @Autowired private LocService locService; + @Autowired + private BasConveyorStaService basConveyorStaService; + //鍑哄簱杞彂agv @Scheduled(cron = "0/1 * * * * ? ") - public synchronized void clearCompletedTask() { + @Transactional + public synchronized void sendOutTaskToAgv() { ArrayList<Long> taskSts = new ArrayList<>(); - taskSts.add(TaskStsType.COMPLETE_INBOUND.sts); taskSts.add(TaskStsType.COMPLETE_OUTBOUND.sts); - taskSts.add(TaskStsType.COMPLETE_CHARGE.sts); - taskSts.add(TaskStsType.COMPLETE_MOVE.sts); - taskSts.add(TaskStsType.COMPLETE_MANUAL.sts); + + BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, 100)); + if (basConveyorSta == null) { + return; + } + if (basConveyorSta.getWorkMode() != 2){ + return; + } + if (basConveyorSta.getTaskNo() == 0){ + return; + } + if (!basConveyorSta.getAutoing().equals("Y") || !basConveyorSta.getLoading().equals("Y")) { + return; + } List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getStatus, 1) .in(Task::getTaskSts, taskSts)); for (Task task : tasks) { - //璁板綍搴撳瓨淇℃伅 - updateRecordLoc(task); + if (Cools.isEmpty(task.getMemo())){ + task.setTaskSts(999L); + taskService.updateById(task); + continue; + }else if (task.getMemo().equals("06YZ0001")){ + HashMap<String, String> mesMap = new HashMap<>(); + mesMap.put("taskNo", task.getWmsTaskNo()); + mesMap.put("contNo",task.getZpallet()); + boolean returnTask4 = toMesHttpRequest(mesMap, "172.18.231.126", "/api/wcs/wcsTaskInfo", "4",task.getZpallet()); + if (returnTask4){ + task.setTaskSts(1001L); + taskService.updateById(task); + log.info("鍑哄簱浠诲姟瀹屾垚鎺ㄩ�乵es"+task.getWmsTaskNo()); + }else { + log.error("鍑哄簱浠诲姟瀹屾垚鎺ㄩ�乵es澶辫触"+task.getWmsTaskNo()); + } + continue; + } + if (task.getTaskNo().equals(basConveyorSta.getTaskNo().toString())) { + //缁戝畾鎵樼洏鐮� + boolean httpRequest1 = agvBindBarcodeHttpRequest("", "", task); + AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); + getOutRequestParam(agvTaskCreateParam,task); + //鍙戦�佸嚭搴撲换鍔� + boolean httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.248:443", "/rcs/rtas/api/robot/controller/task/submit"); + if (httpRequest){ + task.setTaskSts(1000L); + taskService.updateById(task); + log.info("鍑哄簱浠诲姟鎺ㄩ�乺gv"+task.getWmsTaskNo()); + }else { + log.error("鍑哄簱浠诲姟鎺ㄩ�乺gv澶辫触"+task.getWmsTaskNo()); + } + } } + } + private void getOutRequestParam(AgvTaskCreateParam agvTaskCreateParam, Task param){ + List<AgvTaskCreateParam.AgvTaskParam> agvTaskParamList = Arrays.asList( + //璧峰浣� + new AgvTaskCreateParam.AgvTaskParam("SITE","06YZ0001",0,1), + //鐩爣浣� + new AgvTaskCreateParam.AgvTaskParam("SITE",param.getMemo(),1,1) + ); + List<AgvTaskCreateParam.carrierInfoParam> carrierInfoParam = Arrays.asList( + //璧峰浣� + new AgvTaskCreateParam.carrierInfoParam() + + ); + agvTaskCreateParam.setTaskType("F01"); + agvTaskCreateParam.setInitPriority(param.getPriority().toString()); + agvTaskCreateParam.setRobotTaskCode(param.getWmsTaskNo()); + agvTaskCreateParam.setTargetRoute(agvTaskParamList); + agvTaskCreateParam.setCarrierInfo(carrierInfoParam); + + } + private boolean agvBindBarcodeHttpRequest(String url, String path,Task task){ + String response = ""; + boolean success = false; + Map<String, Object> headers = new HashMap<>(); + headers.put("Content-Type", "application/json;charset=UTF-8"); + headers.put("X-lr-request-id", task.getWmsTaskNo()); + headers.put("X-lr-version", 4.1); + headers.put("X-lr-trace-id", "{{$guid}}"); + + Map<String, Object> map = new HashMap<>(); + map.put("carrierCode",task.getZpallet()); + map.put("siteCode","06YZ0001"); + map.put("extra",null); + try { + response = new HttpHandler.Builder() + .setHeaders(headers) + .setUri("172.18.16.248:443") + .setHttps(true) + .setPath("/rcs/rtas/api/robot/controller/carrier/bind") + .setJson(JSONObject.toJSONString(map)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + String code = jsonObject.get("code").toString(); + log.info("agv缁戝畾绠卞彿,璇锋眰浣�:"+JSONObject.toJSONString(map)+",杩斿洖:"+response); + if(code.equals("SUCCESS")){ + success = true; + } + }catch (Exception e){ + log.info("agv缁戝畾绠卞彿璇锋眰鎶ラ敊"+e.getMessage()); + } + return success; + } + + private boolean doHttpRequest(AgvTaskCreateParam requestParam, String url, String path){ + String response = ""; + boolean success = false; + Map<String, Object> map = new HashMap<>(); + map.put("Content-Type", "application/json;charset=UTF-8"); + map.put("X-lr-request-id", requestParam.getRobotTaskCode()); + map.put("X-lr-version", 4.1); + map.put("X-lr-trace-id", "{{$guid}}"); + log.info("杞彂agv璇锋眰鎶ユ枃:"+JSONObject.toJSONString(requestParam)); + try { + response = new HttpHandler.Builder() + .setHeaders(map) + .setUri(url) + .setHttps(true) + .setPath(path) + .setJson(JSONObject.toJSONString(requestParam)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + log.info("杞彂agv璇锋眰杩斿洖:"+response); + String code = jsonObject.get("code").toString(); + if(code.equals("SUCCESS")){ + success = true; + } + + }catch (Exception e){ + log.info("杞彂agv璇锋眰鎶ラ敊"+e.getMessage()); + } + return success; + } + + @Scheduled(cron = "0/1 * * * * ? ") + @Transactional + public synchronized void clearCompletedTask() { + ArrayList<Long> taskSts = new ArrayList<>(); + taskSts.add(TaskStsType.COMPLETE_INBOUND.sts); + + + List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() + .eq(Task::getStatus, 1) + .in(Task::getTaskSts, taskSts)); + for (Task task : tasks) { + + if (Cools.isEmpty(task.getMemo())){ + task.setTaskSts(998L); + taskService.updateById(task); + continue; + } + + HashMap<String, String> mesMap = new HashMap<>(); + mesMap.put("taskNo", task.getWmsTaskNo()); + mesMap.put("contNo",task.getZpallet()); + boolean returnTask4 = toMesHttpRequest(mesMap, "172.18.231.126", "/api/wcs/wcsTaskInfo", "4",task.getMemo()); + if (returnTask4){ + log.info("浠诲姟瀹屾垚鍚庝笂鎶es鎴愬姛锛屼换鍔″彿:"+task.getWmsTaskNo()); + //璁板綍搴撳瓨淇℃伅 + updateRecordLoc(task); + //浠诲姟杞巻鍙叉。 + saveTaskLog(task); + + }else { + log.error("浠诲姟瀹屾垚鍚庤繑鍥瀖es澶辫触"); + } + + } + } + + @Scheduled(cron = "0/1 * * * * ? ") + @Transactional + public synchronized void clearCompletedTask999() { + ArrayList<Long> taskSts = new ArrayList<>(); + taskSts.add(TaskStsType.OUT_TASK_OVER_HAND.sts); + taskSts.add(TaskStsType.OUT_TASK_OVER.sts); + taskSts.add(TaskStsType.COMPLETE_CHARGE.sts); + taskSts.add(TaskStsType.COMPLETE_MOVE.sts); + taskSts.add(TaskStsType.COMPLETE_MANUAL.sts); + taskSts.add(TaskStsType.COMPLETE_LADEN_MOVE.sts); + taskSts.add(TaskStsType.IN_TASK_OVER_HAND.sts); + + + List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() + .eq(Task::getStatus, 1) + .in(Task::getTaskSts, taskSts)); + for (Task task : tasks) { + //璁板綍搴撳瓨淇℃伅 + updateRecordLoc(task); + //浠诲姟杞巻鍙叉。 + saveTaskLog(task); + + } } //鏇存柊搴撳瓨淇℃伅 - private void updateRecordLoc(Task task) { + @Transactional + public void updateRecordLoc(Task task) { + if (task.getRecordLoc() == null) { + return; + } + if (task.getRecordLoc().equals("Y")) {//璁板綍搴撳瓨淇℃伅 //婧愬簱浣� => 绌哄簱 //鐩爣搴撲綅 => 鍦ㄥ簱 @@ -60,6 +265,7 @@ locService.updateById(destLoc); } } else if (task.getRecordLoc().equals("record-dest")) {//鍙褰曠洰鏍囧簱浣嶄俊鎭� + //鐩爣搴撲綅 => 鍦ㄥ簱 Loc destLoc = locService.selectByLocNo(task.getDestLoc()); if (destLoc != null) { destLoc.setLocSts(LocStsType.F.val()); @@ -68,4 +274,61 @@ } } + //鏇存柊鍘嗗彶妗� + @Transactional + public void saveTaskLog(Task task) { + //鍒涘缓鍘嗗彶妗� + TaskLog taskLog = new TaskLog(); + taskLog.sync(task); + taskLog.setUpdateTime(new Date()); + taskLogService.save(taskLog); + + List<Motion> motions = motionService.list(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId())); + for (Motion motion : motions) { + //鍒涘缓鍔ㄤ綔鍘嗗彶妗� + MotionLog motionLog = new MotionLog(); + motionLog.sync(motion); + motionLog.setUpdateTime(new Date()); + motionLogService.save(motionLog); + } + + //鍒犻櫎婧愪换鍔� + taskService.removeById(task.getId()); + //鍒犻櫎鍔ㄤ綔 + motionService.remove(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId())); + } + + private boolean toMesHttpRequest(Map<String,String> map, String url, String path, String code,String localtion){ + Date now = new Date(); + long time = now.getTime()/1000; + ReturnWcsTaskStatisParam returnWcsTaskStatisParam = new ReturnWcsTaskStatisParam(); + returnWcsTaskStatisParam.setRequestPK(map.get("taskNo")); + returnWcsTaskStatisParam.setTrkId(map.get("taskNo")); + returnWcsTaskStatisParam.setContNo(map.get("contNo")); + returnWcsTaskStatisParam.setCode(code); + returnWcsTaskStatisParam.setOperator("wcs"); + returnWcsTaskStatisParam.setOperationTime(time); + returnWcsTaskStatisParam.setTrkType("01"); + returnWcsTaskStatisParam.setCurPos(localtion); + String response = ""; + boolean success = false; + try { + response = new HttpHandler.Builder() + .setUri(url) + .setPath(path) + .setJson(JSONObject.toJSONString(returnWcsTaskStatisParam)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + + String code1 = jsonObject.get("success").toString(); + if(code1.equals("1")){ + success = true; + } + }catch (Exception e){ + return success; + } + return success; + } + } -- Gitblit v1.9.1