修改订单分配车辆策略
This commit is contained in:
parent
64adb38fed
commit
d60d6081ac
@ -63,12 +63,12 @@ public class TransportOrderHandler {
|
|||||||
/**
|
/**
|
||||||
* 根据WMS任务创建订单序列和运输订单
|
* 根据WMS任务创建订单序列和运输订单
|
||||||
* @param orderName 订单名称
|
* @param orderName 订单名称
|
||||||
* @param vehicleName 车辆名称
|
// * @param vehicleName 车辆名称
|
||||||
* @param type 订单类型
|
* @param type 订单类型
|
||||||
* @param destinations 位置信息
|
* @param destinations 位置信息
|
||||||
* @return 创建的订单
|
* @return 创建的订单
|
||||||
*/
|
*/
|
||||||
public TransportOrder createWmsTask(String orderName, String vehicleName, String type, List<PostTransportOrderInfoRequestTo> destinations){
|
public TransportOrder createWmsTask(String orderName, String type, List<PostTransportOrderInfoRequestTo> destinations){
|
||||||
|
|
||||||
//订单目标点结构体
|
//订单目标点结构体
|
||||||
List<Destination> destinationsList = new ArrayList<>();
|
List<Destination> destinationsList = new ArrayList<>();
|
||||||
@ -84,9 +84,9 @@ public class TransportOrderHandler {
|
|||||||
postTransportOrderRequestTO.setIncompleteName(false);
|
postTransportOrderRequestTO.setIncompleteName(false);
|
||||||
postTransportOrderRequestTO.setDispensable(false);
|
postTransportOrderRequestTO.setDispensable(false);
|
||||||
postTransportOrderRequestTO.setDeadline(Instant.now());
|
postTransportOrderRequestTO.setDeadline(Instant.now());
|
||||||
if (vehicleName != null) {
|
// if (vehicleName != null) {
|
||||||
postTransportOrderRequestTO.setIntendedVehicle(vehicleName);
|
// postTransportOrderRequestTO.setIntendedVehicle(vehicleName);
|
||||||
}
|
// }
|
||||||
postTransportOrderRequestTO.setType(type);
|
postTransportOrderRequestTO.setType(type);
|
||||||
postTransportOrderRequestTO.setDestinations(destinationsList);
|
postTransportOrderRequestTO.setDestinations(destinationsList);
|
||||||
|
|
||||||
|
@ -18,12 +18,14 @@ 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.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;
|
||||||
@ -373,31 +375,6 @@ public class V1RequestHandler
|
|||||||
IllegalStateException {
|
IllegalStateException {
|
||||||
response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8);
|
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<PostTransportOrderInfoRequestTo> dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class);
|
|
||||||
|
|
||||||
//获取路由成本最低的车辆
|
|
||||||
String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint());
|
|
||||||
|
|
||||||
//创建订单
|
|
||||||
TransportOrder wmsTask = transportOrderHandler.createWmsTask(
|
|
||||||
request.params(":NAME"),
|
|
||||||
executeVehicle,
|
|
||||||
type,
|
|
||||||
dataList
|
|
||||||
);
|
|
||||||
|
|
||||||
//尝试立即将订单分配给意向车辆
|
|
||||||
if (executeVehicle != null) {
|
|
||||||
//todo 有问题需要延时或者分配车辆时过滤已绑定订单的意向车辆
|
|
||||||
orderDispatcherHandler.tryImmediateAssignment(request.params(":NAME"));
|
|
||||||
}
|
|
||||||
|
|
||||||
//构建响应json
|
|
||||||
return jsonBinder.toJson(wmsTask);
|
|
||||||
|
|
||||||
// return jsonBinder.toJson(
|
// return jsonBinder.toJson(
|
||||||
// GetTransportOrderResponseTO.fromTransportOrder(
|
// GetTransportOrderResponseTO.fromTransportOrder(
|
||||||
// transportOrderHandler.createOrder(
|
// transportOrderHandler.createOrder(
|
||||||
@ -406,6 +383,24 @@ public class V1RequestHandler
|
|||||||
// )
|
// )
|
||||||
// )
|
// )
|
||||||
// );
|
// );
|
||||||
|
|
||||||
|
//解析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);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object handlePutTransportOrderIntendedVehicle(Request request, Response response)
|
private Object handlePutTransportOrderIntendedVehicle(Request request, Response response)
|
||||||
|
@ -133,12 +133,12 @@ public class OrderAssigner {
|
|||||||
);
|
);
|
||||||
|
|
||||||
AssignmentState assignmentState = new AssignmentState();
|
AssignmentState assignmentState = new AssignmentState();
|
||||||
if (availableVehicles.size() < availableOrders.size()) {
|
if (availableVehicles.size() < availableOrders.size()) { //车数量 < 订单数
|
||||||
availableVehicles.stream()
|
availableVehicles.stream()
|
||||||
.sorted(vehicleComparator)
|
.sorted(vehicleComparator)
|
||||||
.forEach(vehicle -> tryAssignOrder(vehicle, availableOrders, assignmentState));
|
.forEach(vehicle -> tryAssignOrder(vehicle, availableOrders, assignmentState));
|
||||||
}
|
}
|
||||||
else {
|
else { //车数量 >= 订单数
|
||||||
availableOrders.stream()
|
availableOrders.stream()
|
||||||
.sorted(orderComparator)
|
.sorted(orderComparator)
|
||||||
.forEach(order -> tryAssignVehicle(order, availableVehicles, assignmentState));
|
.forEach(order -> tryAssignVehicle(order, availableVehicles, assignmentState));
|
||||||
@ -227,13 +227,25 @@ public class OrderAssigner {
|
|||||||
)
|
)
|
||||||
.collect(Collectors.partitioningBy(filterResult -> !filterResult.isFiltered()));
|
.collect(Collectors.partitioningBy(filterResult -> !filterResult.isFiltered()));
|
||||||
|
|
||||||
|
// // 调试输出:分组统计结果
|
||||||
|
// System.out.println("Candidate groups: Passed=" + ordersSplitByFilter.get(Boolean.TRUE).size() + ", Filtered=" + ordersSplitByFilter.get(Boolean.FALSE).size());
|
||||||
|
//
|
||||||
|
// // 调试输出:显示所有通过过滤的候选(排序前)
|
||||||
|
// List<AssignmentCandidate> passedCandidates = ordersSplitByFilter.get(Boolean.TRUE).stream()
|
||||||
|
// .map(CandidateFilterResult::getCandidate)
|
||||||
|
// .collect(Collectors.toList());
|
||||||
|
//
|
||||||
|
// passedCandidates.forEach(c -> System.out.println("passedCandidates - order: " + c.getTransportOrder() + ",vehicle:" + c.getVehicle() + ",Costs: " + c.getCompleteRoutingCosts()));
|
||||||
|
|
||||||
ordersSplitByFilter.get(Boolean.FALSE).stream()
|
ordersSplitByFilter.get(Boolean.FALSE).stream()
|
||||||
.map(CandidateFilterResult::toFilterResult)
|
.map(CandidateFilterResult::toFilterResult)
|
||||||
.forEach(filterResult -> assignmentState.addFilteredOrder(filterResult));
|
.forEach(filterResult -> assignmentState.addFilteredOrder(filterResult));
|
||||||
|
|
||||||
|
|
||||||
ordersSplitByFilter.get(Boolean.TRUE).stream()
|
ordersSplitByFilter.get(Boolean.TRUE).stream()
|
||||||
.map(CandidateFilterResult::getCandidate)
|
.map(CandidateFilterResult::getCandidate)
|
||||||
.sorted(vehicleCandidateComparator)
|
// .sorted(vehicleCandidateComparator) 框架原本排序有问题,修改为按照路由成本排序
|
||||||
|
.sorted(Comparator.comparingLong(AssignmentCandidate::getCompleteRoutingCosts))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.ifPresent(candidate -> assignOrder(candidate, assignmentState));
|
.ifPresent(candidate -> assignOrder(candidate, assignmentState));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user