UNPKG

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