zy-asrs-common/src/main/java/com/zy/asrs/common/utils/HttpHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/OKHttpUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/AgvTaskCreateParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/AgvTaskParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateOutTaskParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/HttpHandler.java
@@ -2,7 +2,12 @@ import okhttp3.*; import javax.net.ssl.*; import java.io.IOException; import java.security.KeyStore; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -124,11 +129,14 @@ * @return the HttpHandler instance */ private OkHttpClient getClient(Integer timeout, TimeUnit timeUnit){ return new OkHttpClient .Builder() .connectTimeout(timeout, timeUnit) .readTimeout(timeout, timeUnit) .build(); // return new OkHttpClient // .Builder() // .sslSocketFactory(getSSLSocketFactory(),getX509TrustManager()) // .hostnameVerifier(getHostnameVerifier()) // .connectTimeout(timeout, timeUnit) // .readTimeout(timeout, timeUnit) // .build(); return OKHttpUtil.getInstance(); } /** @@ -208,5 +216,67 @@ } } /** * description 忽略https证书验证 */ private static HostnameVerifier getHostnameVerifier() { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; return hostnameVerifier; } /** * description 忽略https证书验证 */ private static SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, getTrustManager(), new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } private static X509TrustManager getX509TrustManager() { X509TrustManager trustManager = null; try { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); } trustManager = (X509TrustManager) trustManagers[0]; } catch (Exception e) { e.printStackTrace(); } return trustManager; } private static TrustManager[] getTrustManager() { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; return trustAllCerts; } } zy-asrs-common/src/main/java/com/zy/asrs/common/utils/OKHttpUtil.java
New file @@ -0,0 +1,101 @@ package com.zy.asrs.common.utils; import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import java.net.Proxy; import java.security.KeyStore; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.concurrent.TimeUnit; import javax.net.ssl.*; public class OKHttpUtil { private static OkHttpClient okHttpClient; public static ConnectionPool connectionPool = new ConnectionPool(10, 5, TimeUnit.MINUTES); public static OkHttpClient getInstance() { if (okHttpClient == null) { //加同步安全 synchronized (OkHttpClient.class) { if (okHttpClient == null) { //okhttp可以缓存数据....指定缓存路径 okHttpClient = new OkHttpClient.Builder()//构建器 .proxy(Proxy.NO_PROXY) //来屏蔽系统代理 .connectionPool(connectionPool) .sslSocketFactory(getSSLSocketFactory(), getX509TrustManager()) .hostnameVerifier(getHostnameVerifier()) .connectTimeout(10, TimeUnit.SECONDS)//连接超时 .writeTimeout(600, TimeUnit.SECONDS)//写入超时 .readTimeout(600, TimeUnit.SECONDS)//读取超时 .build(); okHttpClient.dispatcher().setMaxRequestsPerHost(200); okHttpClient.dispatcher().setMaxRequests(200); } } } return okHttpClient; } /** * description 忽略https证书验证 */ private static HostnameVerifier getHostnameVerifier() { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }; return hostnameVerifier; } /** * description 忽略https证书验证 */ private static SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, getTrustManager(), new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } private static X509TrustManager getX509TrustManager() { X509TrustManager trustManager = null; try { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); } trustManager = (X509TrustManager) trustManagers[0]; } catch (Exception e) { e.printStackTrace(); } return trustManager; } private static TrustManager[] getTrustManager() { TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; return trustAllCerts; } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
@@ -1,7 +1,9 @@ package com.zy.asrs.wcs.core.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; @@ -24,11 +26,10 @@ import com.zy.asrs.wcs.system.controller.BaseController; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import java.util.*; @@ -40,6 +41,7 @@ @RequestMapping("/openapi") public class OpenController extends BaseController { private static final Logger log = LoggerFactory.getLogger(OpenController.class); @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired @@ -62,6 +64,29 @@ private BasConveyorStaService basConveyorStaService; @PostMapping("/agvPickupComplete") public Map<String, Object> agvPickupComplete(@RequestBody AgvTaskParam agvTaskParam) { HashMap<String, Object> map = new HashMap<>(); map.put("code","0"); map.put("message","成功"); map.put("reqCode", ""); log.info("agv请求取货完成,wms任务号:"+JSON.toJSONString(agvTaskParam)); return map; } @PostMapping("/agvTaskComplete") public Map<String, Object> agvTaskComplete(@RequestBody AgvTaskParam agvTaskParam) { HashMap<String, Object> map = new HashMap<>(); map.put("code","0"); map.put("message","成功"); map.put("reqCode", ""); log.info("agv请求任务完成,wms任务号:"+JSON.toJSONString(agvTaskParam)); return map; } //取消wcs任务 @PostMapping("/cancelWcsTask") public HashMap<String,Object> cancelWcsTask(@RequestBody CreateWcsTaskParam param){ HashMap<String, Object> map = new HashMap<>(); @@ -154,6 +179,20 @@ ArrayList<String> outlist = new ArrayList<>(); outlist.add("2");outlist.add("9"); if (inlist.contains(param.getTrkType())){ try { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); getInRequestParam(agvTaskCreateParam,param); boolean httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.248:443", "/rcs/rtas/api/robot/controller/task/submit"); if (!httpRequest){ map.put("success", "0"); map.put("message", "转发AGV任务出错"); map.put("result", ""); map.put("requestPK", param.getRequestPK()); return map; } }catch (Exception e){ } CreateInTaskParam createInTaskParam = new CreateInTaskParam(); createInTaskParam.setTaskNo(param.getRequestPK()); createInTaskParam.setDestLoc(getWMStoWCSLocNo(param.getToPos())); @@ -184,12 +223,31 @@ } } } else if (outlist.contains(param.getTrkType())) { // try { // AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); // getOutRequestParam(agvTaskCreateParam,param); // boolean httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.94:8001", "/api/robot/controller/task/submit"); // if (!httpRequest){ // map.put("success", "0"); // map.put("message", "转发AGV任务出错"); // map.put("result", ""); // map.put("requestPK", param.getRequestPK()); // return map; // } // }catch (Exception e){ // map.put("success", "0"); // map.put("message", "转发AGV任务出错"); // map.put("result", ""); // map.put("requestPK", param.getRequestPK()); // return map; // } CreateOutTaskParam createOutTaskParam = new CreateOutTaskParam(); createOutTaskParam.setTaskNo(param.getRequestPK()); createOutTaskParam.setOriginLoc(getWMStoWCSLocNo(param.getFrmPos())); createOutTaskParam.setOriginSite("101"); createOutTaskParam.setDestSite("100"); createOutTaskParam.setPriority(Integer.valueOf(param.getTrkPrty())); createOutTaskParam.setEndSite(param.getToPos()); R outTask = null; try { outTask = createOutTask(createOutTaskParam); @@ -229,6 +287,54 @@ int lev = Integer.parseInt(loc.substring(10,12)); locNo = row +"-"+bay+"-"+lev; return locNo; } private void getInRequestParam(AgvTaskCreateParam agvTaskCreateParam,CreateWcsTaskParam param){ List<AgvTaskCreateParam.AgvTaskParam> agvTaskParamList = Arrays.asList( //起始位 new AgvTaskCreateParam.AgvTaskParam("SITE",param.getFrmPos(),0,1), //目标位 new AgvTaskCreateParam.AgvTaskParam("SITE","06YZ0001",1,1) ); List<AgvTaskCreateParam.carrierInfoParam> carrierInfoParam = Arrays.asList( //起始位 new AgvTaskCreateParam.carrierInfoParam() ); agvTaskCreateParam.setTaskType("F01"); agvTaskCreateParam.setInitPriority(param.getTrkPrty()); agvTaskCreateParam.setRobotTaskCode(param.getRequestPK()); agvTaskCreateParam.setTargetRoute(agvTaskParamList); agvTaskCreateParam.setCarrierInfo(carrierInfoParam); } 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}}"); try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(url) .setHttps(true) .setPath(path) .setJson(JSONObject.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); String code = jsonObject.get("code").toString(); if(code.equals("SUCCESS")){ success = true; } log.info("转发agv任务:请求体:"+JSONObject.toJSONString(requestParam)+",返回值:"+jsonObject); }catch (Exception e){ } return success; } //生成入库任务 @@ -472,7 +578,7 @@ task.setIoTime(new Date()); task.setStartTime(new Date()); task.setStatus(1); task.setMemo(""); task.setMemo(param.getEndSite()); task.setShuttleNo(null);//等待主线程分配小车 task.setRecordLoc("Y");//记录库存信息 task.setHostId(hostId);//临时控制只允许host为1 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/AgvTaskCreateParam.java
New file @@ -0,0 +1,39 @@ package com.zy.asrs.wcs.core.domain.param; import lombok.Data; import java.lang.reflect.Array; import java.util.List; @Data public class AgvTaskCreateParam { private String robotTaskCode; private String taskType; private String initPriority; private List<AgvTaskParam> targetRoute; private List<carrierInfoParam> carrierInfo; @Data public static class AgvTaskParam { private String type; private String code; private Integer seq; private Integer autoStart; public AgvTaskParam(String type, String code, Integer seq, Integer autoStart) { this.type = type; this.code = code; this.seq = seq; this.autoStart = autoStart; } } @Data public static class carrierInfoParam{ private String carrierType = "2"; private String carrierCode = "2"; } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/AgvTaskParam.java
New file @@ -0,0 +1,40 @@ package com.zy.asrs.wcs.core.domain.param; import lombok.Data; import java.util.List; @Data public class AgvTaskParam { private String robotTaskCode; private String singleRobotCode; private Integer currentSeq; private extras extra; @Data public static class extras{ private String async; private valuess values; } @Data public static class valuess{ private String slotName; private String carrierCategory; private String method; private String carrierCode; private Integer x; private String carrierType; private Integer y; private String slotCategory; private String mapCode; private Integer pileCount; private String slotCode; private String orgCode; private String amrCategory; private String amrType; private String amrCode; private String carrierDir; } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateOutTaskParam.java
@@ -19,5 +19,7 @@ //优先级 private Integer priority; //agv放货站 private String endSite; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
@@ -1,7 +1,11 @@ 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.common.utils.HttpHandler; import com.zy.asrs.wcs.core.domain.param.AgvTaskCreateParam; import com.zy.asrs.wcs.core.domain.param.CreateWcsTaskParam; 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; @@ -12,9 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.*; @Slf4j @Component @@ -30,13 +32,103 @@ private MotionLogService motionLogService; @Autowired private LocService locService; @Autowired private BasConveyorStaService basConveyorStaService; @Scheduled(cron = "0/1 * * * * ? ") @Transactional public synchronized void sendOutTaskToAgv() { ArrayList<Long> taskSts = new ArrayList<>(); taskSts.add(TaskStsType.COMPLETE_OUTBOUND.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) { if (task.getTaskNo().equals(basConveyorSta.getTaskNo().toString())) { 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); }else { log.error("出库任务推送rgv失败"+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 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}}"); try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(url) .setHttps(true) .setPath(path) .setJson(JSONObject.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); String code = jsonObject.get("code").toString(); if(code.equals("SUCCESS")){ success = true; } }catch (Exception e){ } return success; } @Scheduled(cron = "0/1 * * * * ? ") @Transactional public synchronized void clearCompletedTask() { ArrayList<Long> taskSts = new ArrayList<>(); taskSts.add(TaskStsType.COMPLETE_INBOUND.sts); taskSts.add(TaskStsType.COMPLETE_OUTBOUND.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);