From 261cb7a7e778c9b6c3814a6110b10608145d0513 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Fri, 27 Jun 2025 11:54:57 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=84=8F=E5=90=91=E8=BD=A6=E8=BE=86=E5=92=8C?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9A=84=E7=AD=89=E7=BA=A7=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E6=9C=89=E5=8F=AF=E6=97=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LoopbackCommunicationAdapter.java | 37 ++--- .../v1/TransportOrderHandler.java | 24 ++-- .../servicewebapi/v1/V1RequestHandler.java | 34 +---- .../servicewebapi/v1/VehicleHandler.java | 130 +++++++++--------- 4 files changed, 105 insertions(+), 120 deletions(-) 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. From dddb5e6b39b85ae5debf0d45d7f8fe42187004da Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Sat, 28 Jun 2025 17:23:12 +0800 Subject: [PATCH 2/6] update --- .../LoopbackCommunicationAdapter.java | 4 +- .../http/service/BaseService.java | 2 +- .../http/service/ExecuteAction.java | 6 +-- .../http/service/ExecuteMove.java | 18 +++++++- .../org/opentcs/manage/AdapterManage.java | 1 + .../opentcs/manage/entity/AgvInfoParams.java | 4 ++ .../v1/TransportOrderHandler.java | 45 ++++++++++++------- 7 files changed, 56 insertions(+), 24 deletions(-) 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 dd45cb3..ff525e8 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 @@ -343,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. @@ -529,7 +529,7 @@ public class LoopbackCommunicationAdapter ACTION_STATUS = true; //下发动作 - ExecuteAction.sendCmd(command.getTransportOrder().getName(), getProcessModel().getName(), getProcessModel().getPosition(), command.getOperation(), getSerialNum()); + ExecuteAction.sendCmd(command.getTransportOrder().getWrappingSequence().getName(), getProcessModel().getName(), getProcessModel().getPosition(), command.getOperation(), getSerialNum()); //进入阻塞 while (ACTION_STATUS) { diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/BaseService.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/BaseService.java index d60e3bf..3b2cf50 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/BaseService.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/BaseService.java @@ -20,7 +20,7 @@ public class BaseService { * 生成进程内唯一的int型ID * 优点:简单高效 * 限制: - * - 重启后可能重复 + * - 重启后可能重复,但数据是内存中存在,重启即销毁 * - 超过21亿后会回绕(正常应用很难达到) */ public static int generate() { diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java index d77b626..42bf4ad 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java @@ -11,13 +11,13 @@ public class ExecuteAction extends BaseService { /** * 下发动作到平台 - * @param orderName 车辆名称 + * @param name 名称 * @param vehicleName 车辆名称 * @param point 当前位置 * @param action 动作 * @param serialNum 序列号 */ - public static void sendCmd(String orderName, String vehicleName, String point, String action, Integer serialNum) { + public static void sendCmd(String name, String vehicleName, String point, String action, Integer serialNum) { String url = getUrl(vehicleName); @@ -27,7 +27,7 @@ public class ExecuteAction extends BaseService { String time = now.format(formatter); RequestAction requestAction = new RequestAction(); - requestAction.setOrder_name(orderName); + requestAction.setOrder_name(name); requestAction.setAction(action); requestAction.setPoint(point); diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java index a500f6f..c567826 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java @@ -169,7 +169,23 @@ public class ExecuteMove extends BaseService { * 获取当前订单ID */ public static Integer getOrderID(String vehicleName) { - return orderInfoMap.get(vehicleName).getId(); + + if (orderInfoMap.containsKey(vehicleName)) { + return orderInfoMap.get(vehicleName).getId(); + } + return null; + } + + /** + * 清理对应订单,实现平台接管后继续执行订单 + */ + public static boolean resetOrder(String vehicleName) { + + if (orderInfoMap.containsKey(vehicleName)) { + orderInfoMap.remove(vehicleName); + } + + return true; } /** diff --git a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java index 6b92260..9e8980f 100644 --- a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java +++ b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java @@ -154,6 +154,7 @@ public class AdapterManage { agvInfoParams.setAgv_model(params.getInteger("agv_model")); agvInfoParams.setCharge_status(params.getInteger("charge_status")); agvInfoParams.setAction_status(params.getInteger("action_status")); + agvInfoParams.setOrder_id(params.getInteger("order_id")); return agvInfoParams; } diff --git a/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvInfoParams.java b/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvInfoParams.java index 9abd558..69c304c 100644 --- a/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvInfoParams.java +++ b/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvInfoParams.java @@ -52,4 +52,8 @@ public class AgvInfoParams { * 执行动作状态:1=完成,2=执行中 */ private Integer action_status; + /** + * 控制器最后执行订单ID,id=0即为未创建任务 + */ + private Integer order_id; } 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 c77f2fb..a9ccd69 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 @@ -63,41 +63,52 @@ public class TransportOrderHandler { /** * 根据WMS任务创建订单序列和运输订单 - * @param orderName 订单名称 + * @param name 订单序列名称 * @param body 结构体 * @return 创建的订单 */ - public TransportOrder createWmsTask(String orderName, String body){ + public List createWmsTask(String name, 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 wrappingSequence = JSON.parseObject(body).getString("wrappingSequence") != null ? JSON.parseObject(body).getString("wrappingSequence") : null; String destinationsStr = JSON.parseObject(body).getString("destinations"); List dataList = JSON.parseArray(destinationsStr, PostTransportOrderInfoRequestTo.class); - //订单目标点结构体 - List destinationsList = new ArrayList<>(); + //构建订单序列 + PostOrderSequenceRequestTO postOrderSequenceRequestTO = new PostOrderSequenceRequestTO(); + postOrderSequenceRequestTO.setIncompleteName(false); + if (intendedVehicle != null) { + postOrderSequenceRequestTO.setIntendedVehicle(intendedVehicle); + } + postOrderSequenceRequestTO.setType(type); + postOrderSequenceRequestTO.setFailureFatal(true); + //根据传入名称创建订单序列 + OrderSequence orderSequence = this.createOrderSequence(name, postOrderSequenceRequestTO); + + //构建订单对象 + PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); + postTransportOrderRequestTO.setIncompleteName(true); + postTransportOrderRequestTO.setDispensable(dispensable); + postTransportOrderRequestTO.setDeadline(Instant.now()); + postTransportOrderRequestTO.setWrappingSequence(orderSequence.getName()); + postTransportOrderRequestTO.setType(type); + //根据传入点位创建多个订单 + List orders = new ArrayList<>(); for (PostTransportOrderInfoRequestTo destination : dataList) { + 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); } - //构建订单对象 - PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); - postTransportOrderRequestTO.setIncompleteName(false); - postTransportOrderRequestTO.setDispensable(dispensable); - postTransportOrderRequestTO.setDeadline(Instant.now()); - if (intendedVehicle != null) { - postTransportOrderRequestTO.setIntendedVehicle(intendedVehicle); - } - postTransportOrderRequestTO.setType(type); - postTransportOrderRequestTO.setDestinations(destinationsList); - - //创建运输订单 - return this.createOrder(orderName, postTransportOrderRequestTO); + return orders; } public TransportOrder createOrder(String name, PostTransportOrderRequestTO order) From ec8e2cb292324d32f74ef082d7dbe71469a4078d Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Mon, 30 Jun 2025 18:18:14 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E7=BB=93=E6=9D=9F=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/servicewebapi/v1/TransportOrderHandler.java | 3 +++ .../kernel/extensions/servicewebapi/v1/V1RequestHandler.java | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) 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 a9ccd69..2c2dbd3 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 @@ -108,6 +108,9 @@ public class TransportOrderHandler { orders.add(order); } + //设置订单序列完整性,自动完成订单 + this.putOrderSequenceComplete(name); + return orders; } 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 90d95a9..ade3e01 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 @@ -371,7 +371,8 @@ public class V1RequestHandler response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); //构建响应json - return jsonBinder.toJson(transportOrderHandler.createWmsTask( + return jsonBinder.toJson( + transportOrderHandler.createWmsTask( request.params(":NAME"), request.body() )); From d60a70483d2ad7d20bfb73ddb62c300496425ae3 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Mon, 30 Jun 2025 18:21:49 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=86=E9=85=8D?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E6=9B=B4=E6=96=B0wms=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E8=BD=A6?= =?UTF-8?q?=E8=BE=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/opentcs/common/GuestUserCredentials.java | 4 ++++ .../strategies/basic/dispatching/TransportOrderUtil.java | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java index cdf25b5..bb3d2ea 100644 --- a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java +++ b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java @@ -23,4 +23,8 @@ public interface GuestUserCredentials { * 内核开放端口 */ Integer PORT = 1099; + /** + * WMS系统地址 + */ + String WMS_URL = "http://192.168.124.114:2004"; } diff --git a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java index 1e739bb..2b2c4b4 100644 --- a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java +++ b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java @@ -356,8 +356,12 @@ public class TransportOrderUtil // vehicle reports the remaining movements as finished. updateTransportOrderState(order.getReference(), TransportOrder.State.WITHDRAWN); - //撤销订单 - ExecuteOperation.cancelOrder(vehicle.getName()); + //撤销订单,获取订单状态 + TransportOrder.State state = order.getState(); + if (state == TransportOrder.State.BEING_PROCESSED) { + //订单执行中,需要撤销下发给控制器的任务 +// ExecuteOperation.cancelOrder(vehicle.getName()); + } VehicleController vehicleController = vehicleControllerPool.getVehicleController(vehicle.getName()); From 4a9c261d05201e9e69496336d25d40b86bf8b024 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Mon, 30 Jun 2025 18:24:26 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=86=E9=85=8D?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E6=9B=B4=E6=96=B0wms=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E8=BD=A6?= =?UTF-8?q?=E8=BE=86-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opentcs/common/GuestUserCredentials.java | 2 +- .../phase/assignment/OrderAssigner.java | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java index bb3d2ea..dc797cc 100644 --- a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java +++ b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java @@ -26,5 +26,5 @@ public interface GuestUserCredentials { /** * WMS系统地址 */ - String WMS_URL = "http://192.168.124.114:2004"; + String WMS_URL = "http://192.168.124.114:2004/api/project.yueda.agv.agv/updateAgvTaskDevice"; } diff --git a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java index 7f79346..eedeed2 100644 --- a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java +++ b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java @@ -7,11 +7,14 @@ import static java.util.Objects.requireNonNull; import jakarta.inject.Inject; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import org.opentcs.common.GuestUserCredentials; +import org.opentcs.communication.http.HttpClient; import org.opentcs.components.kernel.Router; import org.opentcs.components.kernel.services.TCSObjectService; import org.opentcs.data.model.Point; @@ -194,6 +197,22 @@ public class OrderAssigner { .sorted(orderCandidateComparator) .findFirst() .ifPresent(candidate -> assignOrder(candidate, assignmentState)); + + AssignmentCandidate assignmentCandidate = ordersSplitByFilter.get(Boolean.TRUE).stream() + .map(CandidateFilterResult::getCandidate) + .sorted(orderCandidateComparator) + .findFirst().orElse(null); + + if (assignmentCandidate != null + && assignmentCandidate.getTransportOrder().getWrappingSequence() != null) { + //已分配车辆,调用接口告诉wms系统 + HashMap dataMap = new HashMap<>(); + dataMap.put("task_code", assignmentCandidate.getTransportOrder().getWrappingSequence().getName()); + dataMap.put("vehicle_name", vehicle.getName()); + + HttpClient httpClient = new HttpClient(); + httpClient.sendCommand(GuestUserCredentials.WMS_URL, dataMap); + } } private void tryAssignVehicle( @@ -248,6 +267,23 @@ public class OrderAssigner { .sorted(Comparator.comparingLong(AssignmentCandidate::getCompleteRoutingCosts)) .findFirst() .ifPresent(candidate -> assignOrder(candidate, assignmentState)); + + AssignmentCandidate assignmentCandidate = ordersSplitByFilter.get(Boolean.TRUE).stream() + .map(CandidateFilterResult::getCandidate) + .sorted(Comparator.comparingLong(AssignmentCandidate::getCompleteRoutingCosts)) + .findFirst().orElse(null); + + if (assignmentCandidate != null + && assignmentCandidate.getVehicle() != null + && order.getWrappingSequence() != null) { + //已分配车辆,调用接口告诉wms系统 + HashMap dataMap = new HashMap<>(); + dataMap.put("task_code", order.getWrappingSequence().getName()); + dataMap.put("vehicle_name", assignmentCandidate.getVehicle().getName()); + + HttpClient httpClient = new HttpClient(); + httpClient.sendCommand(GuestUserCredentials.WMS_URL, dataMap); + } } private void assignOrder(AssignmentCandidate candidate, AssignmentState assignmentState) { From cccb4e5016648309f597e3c4351902c04a538eb7 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Mon, 30 Jun 2025 18:25:26 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A4=84=E7=90=86=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E6=92=A4=E9=94=80=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategies/basic/dispatching/TransportOrderUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java index 2b2c4b4..4c05221 100644 --- a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java +++ b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/TransportOrderUtil.java @@ -360,7 +360,7 @@ public class TransportOrderUtil TransportOrder.State state = order.getState(); if (state == TransportOrder.State.BEING_PROCESSED) { //订单执行中,需要撤销下发给控制器的任务 -// ExecuteOperation.cancelOrder(vehicle.getName()); + ExecuteOperation.cancelOrder(vehicle.getName()); } VehicleController vehicleController