This commit is contained in:
parent
bc072208d7
commit
186ef52518
|
@ -24,7 +24,7 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.optimize = async(addressIds, firstAddressId) => {
|
||||
Self.optimize = async(addressIds, firstAddressId, lastAddressId) => {
|
||||
const models = Self.app.models;
|
||||
try {
|
||||
const osrmConfig = await models.OsrmConfig.findOne();
|
||||
|
@ -53,13 +53,24 @@ module.exports = Self => {
|
|||
}
|
||||
}
|
||||
|
||||
if (lastAddressId) {
|
||||
const firstAddress = await models.Address.findById(lastAddressId);
|
||||
if (firstAddress.latitude && firstAddress.longitude) {
|
||||
coords.push({
|
||||
addressId: firstAddress.id,
|
||||
latitude: firstAddress.latitude.toFixed(6),
|
||||
longitude: firstAddress.longitude.toFixed(6)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!coords.length) throw new UserError('No address has coordinates');
|
||||
|
||||
const concatCoords = coords
|
||||
.map(coord => `${coord.longitude},${coord.latitude}`)
|
||||
.join(';');
|
||||
const response = await axios.post(`
|
||||
${osrmConfig.url}/trip/v1/driving/${concatCoords}?source=first&roundtrip=true
|
||||
${osrmConfig.url}/trip/v1/driving/${concatCoords}?source=first&destination=last&roundtrip=true
|
||||
`);
|
||||
const tolerance = osrmConfig.tolerance;
|
||||
for (waypoint of response.data.waypoints) {
|
||||
|
|
|
@ -396,6 +396,6 @@
|
|||
"Invalid options or too many coordinates": "Opciones invalidas o demasiadas coordenadas",
|
||||
"No address has coordinates": "Ninguna dirección tiene coordenadas",
|
||||
"An item type with the same code already exists": "Un tipo con el mismo código ya existe",
|
||||
"Holidays to past days not available": "Las vacaciones a días pasados no están disponibles"
|
||||
}
|
||||
|
||||
"Holidays to past days not available": "Las vacaciones a días pasados no están disponibles",
|
||||
"All tickets have a route order": "Todos los tickets tienen orden de ruta"
|
||||
}
|
|
@ -71,13 +71,16 @@ module.exports = Self => {
|
|||
}, {});
|
||||
const [mostFrequentZoneId] = Object.entries(zoneFrequency)
|
||||
.reduce((maxEntry, entry) => entry[1] > maxEntry[1] ? entry : maxEntry, [null, 0]);
|
||||
const zone = await models.Zone.findById(mostFrequentZoneId, myOptions);
|
||||
let firstAddress = zone.addressFk;
|
||||
if (!firstAddress) firstAddress = (await models.ZoneConfig.findOne()).defaultAddressFk;
|
||||
|
||||
// Obtenemos los address inicio y fin
|
||||
const maxPosition = Math.max(...ticketAddress.map(g => g.priority));
|
||||
let firstAddress = (await models.Zone.findById(mostFrequentZoneId, myOptions))?.addressFk
|
||||
|| (await models.ZoneConfig.findOne())?.defaultAddressFk;
|
||||
const lastAddress = firstAddress;
|
||||
if (maxPosition) firstAddress = ticketAddress.find(g => g.priority === maxPosition)?.addressId;
|
||||
|
||||
// Revisamos las coincidencias y actualizamos la prioridad en el array
|
||||
const addressPositions = await models.OsrmConfig.optimize(addressIds, firstAddress, myOptions);
|
||||
const maxPosition = Math.max(...ticketAddress.map(g => g.priority));
|
||||
const addressPositions = await models.OsrmConfig.optimize(addressIds, firstAddress, lastAddress, myOptions);
|
||||
await Promise.all(ticketAddress.map(async i => {
|
||||
const foundPosition = addressPositions.coords.find(item => item.addressId === i.addressId);
|
||||
if (foundPosition) i.priority = foundPosition.position + (maxPosition + 1);
|
||||
|
|
Loading…
Reference in New Issue