diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index 7c05c1a..dd45cb3 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -162,6 +162,9 @@ public class LoopbackCommunicationAdapter private final Router router; + //标记是否开启自动回休息点:true=开启,false=关闭 + private final Boolean IS_AUTOMATIC_BREAKS = false; + /** * Creates a new instance. * @@ -212,21 +215,23 @@ public class LoopbackCommunicationAdapter } super.initialize(); - // 注册属性变化监听器 - getProcessModel().addPropertyChangeListener(evt -> { - if (evt.getPropertyName().equals(VehicleProcessModel.Attribute.ENERGY_LEVEL.name())) { - LOG.info("Vehicle energy level changed to: {}", evt.getNewValue()); - checkChargingNeed(); - } - // 直接检查命令队列状态,不依赖特定属性名 - if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty()) { - LOG.debug("All commands executed, checking for parking position..."); - LOG.info("Found parking positions: {}", findAllParkingPositions().stream() - .map(Point::getName) - .collect(Collectors.joining(", "))); - checkAndMoveToParkingPosition(); - } - }); + if (IS_AUTOMATIC_BREAKS) { + // 注册属性变化监听器 + getProcessModel().addPropertyChangeListener(evt -> { + if (evt.getPropertyName().equals(VehicleProcessModel.Attribute.ENERGY_LEVEL.name())) { + LOG.info("Vehicle energy level changed to: {}", evt.getNewValue()); + checkChargingNeed(); + } + // 直接检查命令队列状态,不依赖特定属性名 + if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty()) { + LOG.debug("All commands executed, checking for parking position..."); + LOG.info("Found parking positions: {}", findAllParkingPositions().stream() + .map(Point::getName) + .collect(Collectors.joining(", "))); + checkAndMoveToParkingPosition(); + } + }); + } String initialPos = vehicle.getProperties().get(LoopbackAdapterConstants.PROPKEY_INITIAL_POSITION); @@ -338,7 +343,7 @@ public class LoopbackCommunicationAdapter sourcePoint = cmd.getStep().getSourcePoint().getName(); //下发AGV移动指令 - ExecuteMove.sendCmd(getProcessModel().getName(), cmd, getSerialNum()); +// ExecuteMove.sendCmd(getProcessModel().getName(), cmd, getSerialNum()); } // Start the simulation task if we're not in single step mode and not simulating already. 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 1ee2c32..c77f2fb 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 @@ -4,6 +4,7 @@ package org.opentcs.kernel.extensions.servicewebapi.v1; import static java.util.Objects.requireNonNull; +import com.alibaba.fastjson.JSON; import jakarta.annotation.Nullable; import jakarta.inject.Inject; import java.time.Instant; @@ -63,16 +64,21 @@ public class TransportOrderHandler { /** * 根据WMS任务创建订单序列和运输订单 * @param orderName 订单名称 -// * @param vehicleName 车辆名称 - * @param type 订单类型 - * @param destinations 位置信息 + * @param body 结构体 * @return 创建的订单 */ - public TransportOrder createWmsTask(String orderName, String type, List destinations){ + public TransportOrder createWmsTask(String orderName, String body){ + + //解析data + String type = JSON.parseObject(body).getString("type"); + String intendedVehicle = JSON.parseObject(body).getString("intendedVehicle") != null ? JSON.parseObject(body).getString("intendedVehicle") : null; + Boolean dispensable = JSON.parseObject(body).getBoolean("dispensable") != null ? JSON.parseObject(body).getBoolean("dispensable") : false; + String destinationsStr = JSON.parseObject(body).getString("destinations"); + List dataList = JSON.parseArray(destinationsStr, PostTransportOrderInfoRequestTo.class); //订单目标点结构体 List destinationsList = new ArrayList<>(); - for (PostTransportOrderInfoRequestTo destination : destinations) { + for (PostTransportOrderInfoRequestTo destination : dataList) { Destination newDestination = new Destination(); newDestination.setLocationName(destination.getLocationName()); newDestination.setOperation(destination.getOperation()); @@ -82,11 +88,11 @@ public class TransportOrderHandler { //构建订单对象 PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); postTransportOrderRequestTO.setIncompleteName(false); - postTransportOrderRequestTO.setDispensable(false); + postTransportOrderRequestTO.setDispensable(dispensable); postTransportOrderRequestTO.setDeadline(Instant.now()); -// if (vehicleName != null) { -// postTransportOrderRequestTO.setIntendedVehicle(vehicleName); -// } + if (intendedVehicle != null) { + postTransportOrderRequestTO.setIntendedVehicle(intendedVehicle); + } postTransportOrderRequestTO.setType(type); postTransportOrderRequestTO.setDestinations(destinationsList); 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 0fd8408..90d95a9 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,28 +4,23 @@ 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; 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; 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.PostTransportOrderInfoRequestTo; -import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; 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; @@ -375,32 +370,11 @@ public class V1RequestHandler IllegalStateException { response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); -// return jsonBinder.toJson( -// GetTransportOrderResponseTO.fromTransportOrder( -// transportOrderHandler.createOrder( -// request.params(":NAME"), -// jsonBinder.fromJson(request.body(), PostTransportOrderRequestTO.class) -// ) -// ) -// ); - - //解析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()); - - //创建订单 - TransportOrder wmsTask = transportOrderHandler.createWmsTask( - request.params(":NAME"), - type, - dataList - ); - //构建响应json - return jsonBinder.toJson(wmsTask); + return jsonBinder.toJson(transportOrderHandler.createWmsTask( + request.params(":NAME"), + request.body() + )); } 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 c54f8d0..640e95d 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 @@ -116,71 +116,71 @@ public class VehicleHandler { } } - /** - * 获取执行成本最低车辆 - * @param destinationPoint 目标点 - * @return 车辆名称 - */ - public String getExecuteVehicle(String 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(); - - //校验车辆:通讯适配器状态、车辆状态、集成级别、订单 - if ( - !commAdapterEnabled || - vehicle.getState() != Vehicle.State.IDLE || - 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); - - for (Map.Entry, Route> entry : vehicleRoutes.entrySet()) { -// TCSObjectReference key = entry.getKey(); - Route value = entry.getValue(); - - //判断成本值是否合规(为空或小于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("无可用车辆"); - return ""; - } - - return vehicleName; - } +// /** +// * 获取执行成本最低车辆 +// * @param destinationPoint 目标点 +// * @return 车辆名称 +// */ +// public String getExecuteVehicle(String 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(); +// +// //校验车辆:通讯适配器状态、车辆状态、集成级别、订单 +// if ( +// !commAdapterEnabled || +// vehicle.getState() != Vehicle.State.IDLE || +// 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); +// +// for (Map.Entry, Route> entry : vehicleRoutes.entrySet()) { +//// TCSObjectReference key = entry.getKey(); +// Route value = entry.getValue(); +// +// //判断成本值是否合规(为空或小于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("无可用车辆"); +// return ""; +// } +// +// return vehicleName; +// } /** * Find all vehicles orders and filters depending on the given parameters.