From 6d96ea6891790e2e964428340b5c9fbc1507c21c Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 09:59:47 +0800 Subject: [PATCH] update --- .../v1/TransportOrderHandler.java | 47 ++++++++++++ .../servicewebapi/v1/V1RequestHandler.java | 44 ++++++++++-- .../servicewebapi/v1/VehicleHandler.java | 72 +++++++++++++++++++ .../PostTransportOrderInfoRequestTo.java | 39 ++++++++++ .../vehicles/DefaultVehicleController.java | 4 +- 5 files changed, 198 insertions(+), 8 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 56e108d..6f3897a 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 @@ -32,6 +32,7 @@ import org.opentcs.kernel.extensions.servicewebapi.KernelExecutorWrapper; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetTransportOrderResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostOrderSequenceRequestTO; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderInfoRequestTo; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.posttransportorder.Destination; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.shared.Property; @@ -59,6 +60,52 @@ public class TransportOrderHandler { this.executorWrapper = requireNonNull(executorWrapper, "executorWrapper"); } + /** + * 根据WMS任务创建订单序列和运输订单 + * @param sequenceName 序列名称 + * @param vehicleName 车辆名称 + * @param type 订单类型 + * @param destinations 位置信息 + * @return 创建的订单 + */ + public List createWmsTask(String sequenceName, 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<>(); + + //根据传入点位创建订单 + 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; + } + public TransportOrder createOrder(String name, PostTransportOrderRequestTO order) throws ObjectUnknownException, ObjectExistsException, 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 3e45486..7711b25 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 @@ -4,6 +4,7 @@ package org.opentcs.kernel.extensions.servicewebapi.v1; import static java.util.Objects.requireNonNull; +import com.alibaba.fastjson.JSON; import jakarta.inject.Inject; import java.util.List; import java.util.concurrent.ExecutionException; @@ -16,13 +17,12 @@ import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralJobResponseTO; -import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetTransportOrderResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetVehicleAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PlantModelTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostOrderSequenceRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostPeripheralJobRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTopologyUpdateRequestTO; -import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderInfoRequestTo; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO; @@ -370,14 +370,44 @@ public class V1RequestHandler IllegalArgumentException, IllegalStateException { response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); + + //解析data + String type = JSON.parseObject(request.body()).getString("type"); + String destinations = JSON.parseObject(request.body()).getString("destinations"); + List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); + + //获取路由成本最低的车辆 + String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint(), dataList.getLast().getPoint()); + System.out.println("handlePostTransportOrder: " + executeVehicle); + + //定制逻辑 return jsonBinder.toJson( - GetTransportOrderResponseTO.fromTransportOrder( - transportOrderHandler.createOrder( - request.params(":NAME"), - jsonBinder.fromJson(request.body(), PostTransportOrderRequestTO.class) - ) + transportOrderHandler.createWmsTask( + request.params(":NAME"), + executeVehicle, + type, + dataList ) ); +// return jsonBinder.toJson( +// transportOrderHandler.getTransportOrders( +// transportOrderHandler.createWmsTask( +// request.params(":NAME"), +// executeVehicle, +// type, +// dataList +// ) +// ) +// ); + +// return jsonBinder.toJson( +// GetTransportOrderResponseTO.fromTransportOrder( +// transportOrderHandler.createOrder( +// request.params(":NAME"), +// jsonBinder.fromJson(request.body(), PostTransportOrderRequestTO.class) +// ) +// ) +// ); } private Object handlePutTransportOrderIntendedVehicle(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 c554f95..da00aa5 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 @@ -28,6 +28,7 @@ import org.opentcs.data.model.Vehicle.EnergyLevelThresholdSet; import org.opentcs.data.order.Route; import org.opentcs.drivers.vehicle.VehicleCommAdapterDescription; import org.opentcs.drivers.vehicle.management.VehicleAttachmentInformation; +import org.opentcs.drivers.vehicle.management.VehicleProcessModelTO; import org.opentcs.kernel.extensions.servicewebapi.KernelExecutorWrapper; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetVehicleResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesRequestTO; @@ -111,6 +112,77 @@ public class VehicleHandler { } } + /** + * 获取执行成本最低车辆 + * @param sourcePoint 起点 + * @param destinationPoint 目标点 + * @return 车辆名称 + */ + public String getExecuteVehicle(String sourcePoint, String destinationPoint) { + +// System.out.println("sourcePoint: " + sourcePoint + " destinationPoint: " + destinationPoint); + + //获取所有车辆 + Set vehicles = vehicleService.fetchObjects(Vehicle.class); + //设置终点 + List destinationPointList = List.of(destinationPoint); + //记录最低路由成本 + long costs = 0; + //返回的车辆名称 + String vehicleName = null; + + for (Vehicle vehicle : vehicles) { + 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 + ) { + //车辆不能执行任务直接获取下台车辆 + continue; + } + + 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(); + 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; + } + + //比较成本,取成本低车辆名称 + if (vehicleName == null || costs > value.getCosts()) { + //记录数据 + costs = value.getCosts(); + vehicleName = vehicle.getName(); + } + } + } + + if (vehicleName == null) { + throw new IllegalArgumentException("无可用车辆"); +// throw new IllegalArgumentException("No vehicle available."); + } + + //todo 无空闲车辆可能需要创建一个无车辆订单序列 + + return vehicleName; + } + /** * Find all vehicles orders and filters depending on the given parameters. * diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java index 8b70503..688b6c5 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java @@ -1,4 +1,43 @@ package org.opentcs.kernel.extensions.servicewebapi.v1.binding; public class PostTransportOrderInfoRequestTo { + + private String locationName; + + private String point; + + private String operation; + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + @Override + public String toString() { + return "PostTransportOrderInfoRequestTo{" + + "locationName='" + locationName + '\'' + + ", point='" + point + '\'' + + ", operation='" + operation + '\'' + + '}'; + } } diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java index a8d90f4..ba03efd 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java @@ -1052,11 +1052,13 @@ public class DefaultVehicleController case LENGTH_RESPECTED: // Free resources allocated for executed commands, but keep as many as needed for the // vehicle's current length. + long vehicleLeghtRadius = 3700 / 2; //车辆长度半径 + BoundingBox boundingBox = commAdapter.getProcessModel().getBoundingBox().withLength(vehicleLeghtRadius); //长度有问题 int freeableResourceSetCount = ResourceMath.freeableResourceSetCount( SplitResources.from(allocatedResources, Set.of(currentVehiclePosition)) .getResourcesPassed(), - commAdapter.getProcessModel().getBoundingBox().getLength() + boundingBox.getLength() ); for (int i = 0; i < freeableResourceSetCount; i++) { Set> oldResources = allocatedResources.poll();