From bb878f6dc86bce88a5ec35d754599ac7f8a16296 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 20:22:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=9B=E5=BB=BA=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/TransportOrderHandler.java | 46 ++++++--------- .../servicewebapi/v1/V1RequestHandler.java | 32 ++++++---- .../servicewebapi/v1/VehicleHandler.java | 59 +++++++++---------- 3 files changed, 66 insertions(+), 71 deletions(-) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java index 6f3897a..f5930ec 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java @@ -62,48 +62,36 @@ public class TransportOrderHandler { /** * 根据WMS任务创建订单序列和运输订单 - * @param sequenceName 序列名称 + * @param orderName 订单名称 * @param vehicleName 车辆名称 * @param type 订单类型 * @param destinations 位置信息 * @return 创建的订单 */ - public List createWmsTask(String sequenceName, String vehicleName, String type, List destinations){ + public TransportOrder createWmsTask(String orderName, String vehicleName, String type, List destinations){ - //构建订单序列对象 - PostOrderSequenceRequestTO postOrderSequenceRequestTO = new PostOrderSequenceRequestTO(); - postOrderSequenceRequestTO.setIncompleteName(false); - postOrderSequenceRequestTO.setType(type); - postOrderSequenceRequestTO.setIntendedVehicle(vehicleName); - postOrderSequenceRequestTO.setFailureFatal(true); - //根据传入name,创建订单序列 - this.createOrderSequence(sequenceName, postOrderSequenceRequestTO); - - //构建订单对象 - PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); - postTransportOrderRequestTO.setIncompleteName(true); - postTransportOrderRequestTO.setDispensable(false); - postTransportOrderRequestTO.setDeadline(Instant.now()); - postTransportOrderRequestTO.setIntendedVehicle(vehicleName); -// postTransportOrderRequestTO.setPeripheralReservationToken(""); - postTransportOrderRequestTO.setWrappingSequence(sequenceName); - postTransportOrderRequestTO.setType(type); - - List orders = new ArrayList<>(); - - //根据传入点位创建订单 + //订单目标点结构体 + List destinationsList = new ArrayList<>(); for (PostTransportOrderInfoRequestTo destination : destinations) { - List destinationsList = new ArrayList<>(); Destination newDestination = new Destination(); newDestination.setLocationName(destination.getLocationName()); newDestination.setOperation(destination.getOperation()); destinationsList.add(newDestination); - postTransportOrderRequestTO.setDestinations(destinationsList); - TransportOrder order = this.createOrder("", postTransportOrderRequestTO); - orders.add(order); } - return orders; + //构建订单对象 + PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); + postTransportOrderRequestTO.setIncompleteName(false); + postTransportOrderRequestTO.setDispensable(false); + postTransportOrderRequestTO.setDeadline(Instant.now()); + if (vehicleName != null) { + postTransportOrderRequestTO.setIntendedVehicle(vehicleName); + } + postTransportOrderRequestTO.setType(type); + postTransportOrderRequestTO.setDestinations(destinationsList); + + //创建运输订单 + return this.createOrder(orderName, postTransportOrderRequestTO); } public TransportOrder createOrder(String name, PostTransportOrderRequestTO order) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java index 2e26d97..6d798f9 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java @@ -11,6 +11,7 @@ import java.util.concurrent.ExecutionException; import org.opentcs.access.KernelRuntimeException; import org.opentcs.data.ObjectExistsException; import org.opentcs.data.ObjectUnknownException; +import org.opentcs.data.order.TransportOrder; import org.opentcs.kernel.extensions.servicewebapi.HttpConstants; import org.opentcs.kernel.extensions.servicewebapi.JsonBinder; import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; @@ -292,7 +293,8 @@ public class V1RequestHandler vehicleHandler.postReceiveCallback( request.body() ); - return jsonBinder.toJson(""); + return ""; +// return jsonBinder.toJson(""); } private Object handlePostDispatcherTrigger(Request request, Response response) @@ -377,19 +379,25 @@ public class V1RequestHandler List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); //获取路由成本最低的车辆 - String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint(), dataList.getLast().getPoint()); - System.out.println("handlePostTransportOrder: " + executeVehicle); + String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint()); - //定制逻辑 - return jsonBinder.toJson( - transportOrderHandler.createWmsTask( - request.params(":NAME"), - executeVehicle, - type, - dataList - ) + //创建订单 + TransportOrder wmsTask = transportOrderHandler.createWmsTask( + request.params(":NAME"), + executeVehicle, + type, + dataList ); + //尝试立即将订单分配给意向车辆 + if (executeVehicle != null) { + //todo 有问题需要延时或者分配车辆时过滤已绑定订单的意向车辆 + orderDispatcherHandler.tryImmediateAssignment(request.params(":NAME")); + } + + //构建响应json + return jsonBinder.toJson(wmsTask); + // return jsonBinder.toJson( // GetTransportOrderResponseTO.fromTransportOrder( // transportOrderHandler.createOrder( @@ -449,7 +457,7 @@ public class V1RequestHandler ExecutionException { transportOrderHandler.putOrderSequenceComplete(request.params(":NAME")); response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8); - return ""; + return jsonBinder.toJson(""); } private Object handlePostImmediateAssignment(Request request, Response response) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java index da00aa5..c54f8d0 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java @@ -69,7 +69,7 @@ public class VehicleHandler { * 接收平台异步回调处理 */ public void postReceiveCallback(Object data) { - System.out.println("jsonObject-----ssss: " + data.toString()); +// System.out.println("jsonObject-----ssss: " + data.toString()); //截取平台响应的字符串 String jsonStr; @@ -87,17 +87,21 @@ public class VehicleHandler { throw new ObjectUnknownException("postReceiveCallback Unknown vehicle: " + name); } -// String adapterName = "org.opentcs.virtualvehicle.LoopbackCommunicationAdapterDescription"; -// VehicleCommAdapterDescription newAdapter -// = vehicleService.fetchAttachmentInformation(vehicle.getReference()) -// .getAvailableCommAdapters() -// .stream() -// .filter(description -> description.getClass().getName().equals(adapterName)) -// .findAny() -// .orElseThrow( -// () -> new IllegalArgumentException("Unknown vehicle driver class name: " + adapterName) -// ); -// vehicleService.attachCommAdapter(vehicle.getReference(), newAdapter); + VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); + if (!vehicleProcessModelTO.isCommAdapterEnabled()) { + //未开启通讯适配器,手动选择通讯适配器开启 + String adapterName = "org.opentcs.virtualvehicle.LoopbackCommunicationAdapterDescription"; + VehicleCommAdapterDescription newAdapter + = vehicleService.fetchAttachmentInformation(vehicle.getReference()) + .getAvailableCommAdapters() + .stream() + .filter(description -> description.getClass().getName().equals(adapterName)) + .findAny() + .orElseThrow( + () -> new IllegalArgumentException("Unknown vehicle driver class name: " + adapterName) + ); + vehicleService.attachCommAdapter(vehicle.getReference(), newAdapter); + } //将数据更新到线程安全的集合中,防止线程阻塞 AdapterManage.setAdapterStatus(name); @@ -114,13 +118,10 @@ public class VehicleHandler { /** * 获取执行成本最低车辆 - * @param sourcePoint 起点 * @param destinationPoint 目标点 * @return 车辆名称 */ - public String getExecuteVehicle(String sourcePoint, String destinationPoint) { - -// System.out.println("sourcePoint: " + sourcePoint + " destinationPoint: " + destinationPoint); + public String getExecuteVehicle(String destinationPoint) { //获取所有车辆 Set vehicles = vehicleService.fetchObjects(Vehicle.class); @@ -135,30 +136,28 @@ public class VehicleHandler { VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); boolean commAdapterEnabled = vehicleProcessModelTO.isCommAdapterEnabled(); - //校验车辆:通讯适配器、状态、集成级别 todo 可能需要改,无空闲车辆可能也要分配车辆 + //校验车辆:通讯适配器状态、车辆状态、集成级别、订单 if ( !commAdapterEnabled || vehicle.getState() != Vehicle.State.IDLE || - vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED + vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED || + vehicle.getTransportOrder() != null ) { //车辆不能执行任务直接获取下台车辆 continue; } + //获取车辆当前位置设置为起点 + String sourcePoint = vehicle.getCurrentPosition().getName(); + PostVehicleRoutesRequestTO postVehicleRoutesRequestTO = new PostVehicleRoutesRequestTO(destinationPointList); postVehicleRoutesRequestTO.setSourcePoint(sourcePoint); Map, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO); -// System.out.println("getExecuteVehicle vehicleRoutes: " + vehicleRoutes); - for (Map.Entry, Route> entry : vehicleRoutes.entrySet()) { - TCSObjectReference key = entry.getKey(); +// TCSObjectReference key = entry.getKey(); Route value = entry.getValue(); -// System.out.println("getExecuteVehicle point: " + key); -// System.out.println("getExecuteVehicle route: " + value); -// System.out.println("getExecuteVehicle route costs: " + value.getCosts()); - //判断成本值是否合规(为空或小于0不合规) if (value == null || value.getCosts() < 0) { continue; @@ -173,12 +172,12 @@ public class VehicleHandler { } } - if (vehicleName == null) { - throw new IllegalArgumentException("无可用车辆"); -// throw new IllegalArgumentException("No vehicle available."); - } - //todo 无空闲车辆可能需要创建一个无车辆订单序列 + if (vehicleName == null) { + //无空闲车辆需要创建订单无意向车辆订单 +// throw new IllegalArgumentException("无可用车辆"); + return ""; + } return vehicleName; }