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

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;
//标记是否开启自动回休息点true=开启false=关闭
private final Boolean IS_AUTOMATIC_BREAKS = false;
/**
* Creates a new instance.
*
@ -212,6 +215,7 @@ public class LoopbackCommunicationAdapter
}
super.initialize();
if (IS_AUTOMATIC_BREAKS) {
// 注册属性变化监听器
getProcessModel().addPropertyChangeListener(evt -> {
if (evt.getPropertyName().equals(VehicleProcessModel.Attribute.ENERGY_LEVEL.name())) {
@ -227,6 +231,7 @@ public class LoopbackCommunicationAdapter
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.

View File

@ -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<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<>();
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);

View File

@ -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<PostTransportOrderInfoRequestTo> 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)

View File

@ -116,71 +116,71 @@ public class VehicleHandler {
}
}
/**
* 获取执行成本最低车辆
* @param destinationPoint 目标点
* @return 车辆名称
*/
public String getExecuteVehicle(String destinationPoint) {
//获取所有车辆
Set<Vehicle> vehicles = vehicleService.fetchObjects(Vehicle.class);
//设置终点
List<String> 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<TCSObjectReference<Point>, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO);
for (Map.Entry<TCSObjectReference<Point>, Route> entry : vehicleRoutes.entrySet()) {
// TCSObjectReference<Point> 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<Vehicle> vehicles = vehicleService.fetchObjects(Vehicle.class);
// //设置终点
// List<String> 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<TCSObjectReference<Point>, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO);
//
// for (Map.Entry<TCSObjectReference<Point>, Route> entry : vehicleRoutes.entrySet()) {
//// TCSObjectReference<Point> 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.