创建订单添加字段,支持指定意向车辆和订单的等级为可有可无

This commit is contained in:
xuzhiheng 2025-06-27 11:54:57 +08:00
parent d00b274b49
commit 261cb7a7e7
4 changed files with 105 additions and 120 deletions

View File

@ -162,6 +162,9 @@ public class LoopbackCommunicationAdapter
private final Router router; private final Router router;
//标记是否开启自动回休息点true=开启false=关闭
private final Boolean IS_AUTOMATIC_BREAKS = false;
/** /**
* Creates a new instance. * Creates a new instance.
* *
@ -212,21 +215,23 @@ public class LoopbackCommunicationAdapter
} }
super.initialize(); super.initialize();
// 注册属性变化监听器 if (IS_AUTOMATIC_BREAKS) {
getProcessModel().addPropertyChangeListener(evt -> { // 注册属性变化监听器
if (evt.getPropertyName().equals(VehicleProcessModel.Attribute.ENERGY_LEVEL.name())) { getProcessModel().addPropertyChangeListener(evt -> {
LOG.info("Vehicle energy level changed to: {}", evt.getNewValue()); if (evt.getPropertyName().equals(VehicleProcessModel.Attribute.ENERGY_LEVEL.name())) {
checkChargingNeed(); LOG.info("Vehicle energy level changed to: {}", evt.getNewValue());
} checkChargingNeed();
// 直接检查命令队列状态不依赖特定属性名 }
if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty()) { // 直接检查命令队列状态不依赖特定属性名
LOG.debug("All commands executed, checking for parking position..."); if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty()) {
LOG.info("Found parking positions: {}", findAllParkingPositions().stream() LOG.debug("All commands executed, checking for parking position...");
.map(Point::getName) LOG.info("Found parking positions: {}", findAllParkingPositions().stream()
.collect(Collectors.joining(", "))); .map(Point::getName)
checkAndMoveToParkingPosition(); .collect(Collectors.joining(", ")));
} checkAndMoveToParkingPosition();
}); }
});
}
String initialPos String initialPos
= vehicle.getProperties().get(LoopbackAdapterConstants.PROPKEY_INITIAL_POSITION); = vehicle.getProperties().get(LoopbackAdapterConstants.PROPKEY_INITIAL_POSITION);
@ -338,7 +343,7 @@ public class LoopbackCommunicationAdapter
sourcePoint = cmd.getStep().getSourcePoint().getName(); sourcePoint = cmd.getStep().getSourcePoint().getName();
//下发AGV移动指令 //下发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. // Start the simulation task if we're not in single step mode and not simulating already.

View File

@ -4,6 +4,7 @@ package org.opentcs.kernel.extensions.servicewebapi.v1;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import java.time.Instant; import java.time.Instant;
@ -63,16 +64,21 @@ public class TransportOrderHandler {
/** /**
* 根据WMS任务创建订单序列和运输订单 * 根据WMS任务创建订单序列和运输订单
* @param orderName 订单名称 * @param orderName 订单名称
// * @param vehicleName 车辆名称 * @param body 结构体
* @param type 订单类型
* @param destinations 位置信息
* @return 创建的订单 * @return 创建的订单
*/ */
public TransportOrder createWmsTask(String orderName, String type, List<PostTransportOrderInfoRequestTo> 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<PostTransportOrderInfoRequestTo> dataList = JSON.parseArray(destinationsStr, PostTransportOrderInfoRequestTo.class);
//订单目标点结构体 //订单目标点结构体
List<Destination> destinationsList = new ArrayList<>(); List<Destination> destinationsList = new ArrayList<>();
for (PostTransportOrderInfoRequestTo destination : destinations) { for (PostTransportOrderInfoRequestTo destination : dataList) {
Destination newDestination = new Destination(); Destination newDestination = new Destination();
newDestination.setLocationName(destination.getLocationName()); newDestination.setLocationName(destination.getLocationName());
newDestination.setOperation(destination.getOperation()); newDestination.setOperation(destination.getOperation());
@ -82,11 +88,11 @@ public class TransportOrderHandler {
//构建订单对象 //构建订单对象
PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO();
postTransportOrderRequestTO.setIncompleteName(false); postTransportOrderRequestTO.setIncompleteName(false);
postTransportOrderRequestTO.setDispensable(false); postTransportOrderRequestTO.setDispensable(dispensable);
postTransportOrderRequestTO.setDeadline(Instant.now()); postTransportOrderRequestTO.setDeadline(Instant.now());
// if (vehicleName != null) { if (intendedVehicle != null) {
// postTransportOrderRequestTO.setIntendedVehicle(vehicleName); postTransportOrderRequestTO.setIntendedVehicle(intendedVehicle);
// } }
postTransportOrderRequestTO.setType(type); postTransportOrderRequestTO.setType(type);
postTransportOrderRequestTO.setDestinations(destinationsList); postTransportOrderRequestTO.setDestinations(destinationsList);

View File

@ -4,28 +4,23 @@ package org.opentcs.kernel.extensions.servicewebapi.v1;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import com.alibaba.fastjson.JSON;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import org.opentcs.access.KernelRuntimeException; import org.opentcs.access.KernelRuntimeException;
import org.opentcs.data.ObjectExistsException; import org.opentcs.data.ObjectExistsException;
import org.opentcs.data.ObjectUnknownException; import org.opentcs.data.ObjectUnknownException;
import org.opentcs.data.order.TransportOrder;
import org.opentcs.kernel.extensions.servicewebapi.HttpConstants; import org.opentcs.kernel.extensions.servicewebapi.HttpConstants;
import org.opentcs.kernel.extensions.servicewebapi.JsonBinder; import org.opentcs.kernel.extensions.servicewebapi.JsonBinder;
import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; import org.opentcs.kernel.extensions.servicewebapi.RequestHandler;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; 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.GetPeripheralAttachmentInfoResponseTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralJobResponseTO; 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.GetVehicleAttachmentInfoResponseTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PlantModelTO; 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.PostOrderSequenceRequestTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostPeripheralJobRequestTO; 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.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.PostVehicleRoutesRequestTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesResponseTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO;
@ -375,32 +370,11 @@ public class V1RequestHandler
IllegalStateException { IllegalStateException {
response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); 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<PostTransportOrderInfoRequestTo> dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class);
//获取路由成本最低的车辆
// String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint());
//创建订单
TransportOrder wmsTask = transportOrderHandler.createWmsTask(
request.params(":NAME"),
type,
dataList
);
//构建响应json //构建响应json
return jsonBinder.toJson(wmsTask); return jsonBinder.toJson(transportOrderHandler.createWmsTask(
request.params(":NAME"),
request.body()
));
} }
private Object handlePutTransportOrderIntendedVehicle(Request request, Response response) private Object handlePutTransportOrderIntendedVehicle(Request request, Response response)

View File

@ -116,71 +116,71 @@ public class VehicleHandler {
} }
} }
/** // /**
* 获取执行成本最低车辆 // * 获取执行成本最低车辆
* @param destinationPoint 目标点 // * @param destinationPoint 目标点
* @return 车辆名称 // * @return 车辆名称
*/ // */
public String getExecuteVehicle(String destinationPoint) { // public String getExecuteVehicle(String destinationPoint) {
//
//获取所有车辆 // //获取所有车辆
Set<Vehicle> vehicles = vehicleService.fetchObjects(Vehicle.class); // Set<Vehicle> vehicles = vehicleService.fetchObjects(Vehicle.class);
//设置终点 // //设置终点
List<String> destinationPointList = List.of(destinationPoint); // List<String> destinationPointList = List.of(destinationPoint);
//记录最低路由成本 // //记录最低路由成本
long costs = 0; // long costs = 0;
//返回的车辆名称 // //返回的车辆名称
String vehicleName = null; // String vehicleName = null;
//
for (Vehicle vehicle : vehicles) { // for (Vehicle vehicle : vehicles) {
VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); // VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference());
boolean commAdapterEnabled = vehicleProcessModelTO.isCommAdapterEnabled(); // boolean commAdapterEnabled = vehicleProcessModelTO.isCommAdapterEnabled();
//
//校验车辆通讯适配器状态车辆状态集成级别订单 // //校验车辆通讯适配器状态车辆状态集成级别订单
if ( // if (
!commAdapterEnabled || // !commAdapterEnabled ||
vehicle.getState() != Vehicle.State.IDLE || // vehicle.getState() != Vehicle.State.IDLE ||
vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED || // vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED ||
vehicle.getTransportOrder() != null // vehicle.getTransportOrder() != null
) { // ) {
//车辆不能执行任务直接获取下台车辆 // //车辆不能执行任务直接获取下台车辆
continue; // continue;
} // }
//
//获取车辆当前位置设置为起点 // //获取车辆当前位置设置为起点
String sourcePoint = vehicle.getCurrentPosition().getName(); // String sourcePoint = vehicle.getCurrentPosition().getName();
//
PostVehicleRoutesRequestTO postVehicleRoutesRequestTO = new PostVehicleRoutesRequestTO(destinationPointList); // PostVehicleRoutesRequestTO postVehicleRoutesRequestTO = new PostVehicleRoutesRequestTO(destinationPointList);
postVehicleRoutesRequestTO.setSourcePoint(sourcePoint); // postVehicleRoutesRequestTO.setSourcePoint(sourcePoint);
Map<TCSObjectReference<Point>, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO); // Map<TCSObjectReference<Point>, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO);
//
for (Map.Entry<TCSObjectReference<Point>, Route> entry : vehicleRoutes.entrySet()) { // for (Map.Entry<TCSObjectReference<Point>, Route> entry : vehicleRoutes.entrySet()) {
// TCSObjectReference<Point> key = entry.getKey(); //// TCSObjectReference<Point> key = entry.getKey();
Route value = entry.getValue(); // Route value = entry.getValue();
//
//判断成本值是否合规(为空或小于0不合规) // //判断成本值是否合规(为空或小于0不合规)
if (value == null || value.getCosts() < 0) { // if (value == null || value.getCosts() < 0) {
continue; // continue;
} // }
//
//比较成本取成本低车辆名称 // //比较成本取成本低车辆名称
if (vehicleName == null || costs > value.getCosts()) { // if (vehicleName == null || costs > value.getCosts()) {
//记录数据 // //记录数据
costs = value.getCosts(); // costs = value.getCosts();
vehicleName = vehicle.getName(); // vehicleName = vehicle.getName();
} // }
} // }
} // }
//
//
if (vehicleName == null) { // if (vehicleName == null) {
//无空闲车辆需要创建订单无意向车辆订单 // //无空闲车辆需要创建订单无意向车辆订单
// throw new IllegalArgumentException("无可用车辆"); //// throw new IllegalArgumentException("无可用车辆");
return ""; // return "";
} // }
//
return vehicleName; // return vehicleName;
} // }
/** /**
* Find all vehicles orders and filters depending on the given parameters. * Find all vehicles orders and filters depending on the given parameters.