@geoapify/route-planner-sdk
Version:
A TypeScript SDK for the Geoapify Route Planner API that simplifies route optimization requests, and helps visualize and edit resulting routes.
164 lines (163 loc) • 8.34 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { Utils } from "../utils";
import { RoutePlanner } from "../../route-planner";
import { OptimizeAgentInput } from "./optimize-agent-input";
export class RouteResultEditorBase {
constructor(result) {
this.result = result;
}
optimizeRoute(optimizeAgentInput) {
return __awaiter(this, void 0, void 0, function* () {
let newRawData = Utils.cloneObject(this.result.getRaw().inputData);
newRawData.agents = newRawData.agents.filter(nextAgent => nextAgent.id == optimizeAgentInput.agentId);
newRawData.jobs = newRawData.jobs.filter(nextJob => optimizeAgentInput.agentJobIds.has(nextJob.id));
newRawData.shipments = newRawData.shipments.filter(nextShipment => optimizeAgentInput.agentShipmentIds.has(nextShipment.id));
newRawData.locations = newRawData.locations.filter(nextLocation => optimizeAgentInput.agentLocationIds.has(nextLocation.id));
const planner = new RoutePlanner(this.result.getOptions(), newRawData);
return yield planner.plan();
});
}
updateAgent(newResult) {
let agentId = newResult.getRaw().inputData.agents[0].id;
if (newResult.getUnassignedAgents().length > 0) {
let agentIndex = this.getInitialAgentIndex(agentId);
if (!this.result.getUnassignedAgents().includes(agentIndex)) {
this.result.getRaw().agents = this.result.getRaw().agents.filter(agent => agent.agentId != agentId);
}
this.updateUnassignedItems(newResult);
}
else {
let existingAgentSolution = this.result.getAgentSolution(agentId);
if (existingAgentSolution) {
this.result.getRaw().agents = this.result.getRaw().agents.filter(agent => agent.agentId != agentId);
}
this.result.getRaw().agents.push(newResult.getRaw().agents[0]);
this.updateUnassignedItems(newResult);
}
}
generateOptimizeAgentInput(agentId, existingAgent) {
if (!existingAgent) {
return new OptimizeAgentInput(agentId, [], [], []);
}
let agentJobs = existingAgent.getActions()
.filter(action => action.getJobId() !== undefined)
.map(action => action.getJobId());
let agentShipments = existingAgent.getActions()
.filter(action => action.getShipmentId() !== undefined)
.map(action => action.getShipmentId());
let agentLocations = existingAgent.getActions()
.filter(action => action.getLocationId() !== undefined)
.map(action => action.getLocationId());
return new OptimizeAgentInput(existingAgent.getAgentId(), agentJobs, agentShipments, agentLocations);
}
checkIfArrayIsUnique(myArray) {
return myArray.length === new Set(myArray).size;
}
getInitialAgentIndex(agentId) {
return this.result.getRaw().inputData.agents.findIndex(item => item.id == agentId);
}
getInitialJobIndex(jobId) {
return this.result.getRaw().inputData.jobs.findIndex(item => item.id == jobId);
}
getInitialShipmentIndex(shipmentId) {
return this.result.getRaw().inputData.shipments.findIndex(item => item.id == shipmentId);
}
validateAgent(agentId) {
let agentIndex = this.getInitialAgentIndex(agentId);
if (agentIndex == -1) {
throw new Error(`Agent with id ${agentId} not found`);
}
}
updateUnassignedItems(newResult) {
this.updateUnassignedAgents(newResult);
this.updateUnassignedJobs(newResult);
this.updateUnassignedShipments(newResult);
}
updateUnassignedAgents(newResult) {
let agentId = newResult.getRaw().inputData.agents[0].id;
let agentIndex = this.getInitialAgentIndex(agentId);
if (newResult.getUnassignedAgents().length > 0) {
if (!this.result.getUnassignedAgents().includes(agentIndex)) {
if (!this.result.getRaw().unassignedAgents) {
this.result.getRaw().unassignedAgents = [];
}
this.result.getRaw().unassignedAgents.push(agentIndex);
}
}
else {
if (!this.result.getRaw().unassignedAgents) {
this.result.getRaw().unassignedAgents = [];
}
this.result.getRaw().unassignedAgents =
this.result.getRaw().unassignedAgents.filter(unassignedAgentIndex => unassignedAgentIndex != agentIndex);
}
}
updateUnassignedJobs(newResult) {
let unassignedJobs = this.getUnassignedJobs(newResult);
unassignedJobs.forEach(jobId => {
let initialJobIndex = this.getInitialJobIndex(jobId);
if (!this.result.getUnassignedJobs().includes(initialJobIndex)) {
if (!this.result.getRaw().unassignedJobs) {
this.result.getRaw().unassignedJobs = [];
}
this.result.getRaw().unassignedJobs.push(initialJobIndex);
}
});
if (newResult.getRaw().agents.length > 0) {
let assignedJobs = newResult.getRaw().agents[0].actions.filter(action => action.job_id).map(action => action.job_id);
assignedJobs.forEach(jobId => {
let initialJobIndex = this.getInitialJobIndex(jobId);
if (this.result.getUnassignedJobs().includes(initialJobIndex)) {
if (!this.result.getRaw().unassignedJobs) {
this.result.getRaw().unassignedJobs = [];
}
this.result.getRaw().unassignedJobs =
this.result.getRaw().unassignedJobs.filter(unassignedJobIndex => unassignedJobIndex != initialJobIndex);
}
});
}
}
updateUnassignedShipments(newResult) {
let unassignedShipments = this.getUnassignedShipments(newResult);
unassignedShipments.forEach(shipmentId => {
let initialShipmentIndex = this.getInitialShipmentIndex(shipmentId);
if (!this.result.getUnassignedShipments().includes(initialShipmentIndex)) {
if (!this.result.getRaw().unassignedShipments) {
this.result.getRaw().unassignedShipments = [];
}
this.result.getRaw().unassignedShipments.push(initialShipmentIndex);
}
});
if (newResult.getRaw().agents.length > 0) {
let assignedShipments = newResult.getRaw().agents[0].actions.filter(action => action.shipment_id).map(action => action.shipment_id);
assignedShipments.forEach(shipmentId => {
let initialShipmentIndex = this.getInitialShipmentIndex(shipmentId);
if (this.result.getUnassignedShipments().includes(initialShipmentIndex)) {
if (!this.result.getRaw().unassignedShipments) {
this.result.getRaw().unassignedShipments = [];
}
this.result.getRaw().unassignedShipments =
this.result.getRaw().unassignedShipments.filter(unassignedShipmentIndex => unassignedShipmentIndex != initialShipmentIndex);
}
});
}
}
getUnassignedJobs(result) {
return result.getUnassignedJobs().map((jobIndex) => {
return this.result.getRaw().inputData.jobs[jobIndex].id;
});
}
getUnassignedShipments(result) {
return result.getUnassignedShipments().map((jobIndex) => {
return this.result.getRaw().inputData.shipments[jobIndex].id;
});
}
}