File size: 1,694 Bytes
f6213fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { buildPreview } from './preview.mjs';

export function clonePlan(plan) {
  return JSON.parse(JSON.stringify(plan));
}

export function refreshPlan(plan) {
  const normalized = normalizePlan(clonePlan(plan));
  normalized.viewState = normalized.viewState || {};
  normalized.viewState.preview = buildPreview(normalized);
  return normalized;
}

export function refreshServerPlan(plan) {
  const normalized = normalizePlan(clonePlan(plan));
  normalized.viewState = normalized.viewState || {};
  if (!normalized.viewState.preview) {
    normalized.viewState.preview = buildPreview(normalized);
  }
  return normalized;
}

export function normalizePlan(plan) {
  const normalized = clonePlan(plan);
  normalized.deliveries = normalized.deliveries || [];
  normalized.vehicles = normalized.vehicles || [];
  normalized.viewState = normalized.viewState || {};

  const oldToNew = new Map();
  normalized.deliveries = normalized.deliveries.map((delivery, index) => {
    oldToNew.set(delivery.id, index);
    return {
      kind: 'other',
      demand: 1,
      minStartTime: 0,
      maxEndTime: 24 * 3600,
      serviceDuration: 0,
      ...delivery,
      id: index,
    };
  });

  normalized.vehicles = normalized.vehicles.map((vehicle, index) => ({
    ...vehicle,
    name: vehicle.name || `Vehicle ${index + 1}`,
    capacity: Number(vehicle.capacity || 0),
    homeLat: Number(vehicle.homeLat || 0),
    homeLng: Number(vehicle.homeLng || 0),
    departureTime: Number(vehicle.departureTime || 0),
    deliveryOrder: (vehicle.deliveryOrder || [])
      .map((oldId) => oldToNew.get(oldId))
      .filter((value) => value !== undefined),
    id: index,
  }));

  return normalized;
}