fleetmap-reports 1.0.679 → 1.0.680
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/zone-report.js +77 -68
package/package.json
CHANGED
package/src/zone-report.js
CHANGED
|
@@ -97,91 +97,91 @@ async function processDevices (from, to, devices, userData, data) {
|
|
|
97
97
|
|
|
98
98
|
const zoneInOutData = analyseAlerts(alerts, deviceRoute, userData, from, to).filter(d => !userData.onlyWithStop || d.stopped)
|
|
99
99
|
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
const dates = getDates(from, to)
|
|
100
|
+
if (userData.groupByDay) {
|
|
101
|
+
const dates = getDates(from, to)
|
|
103
102
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
const geofencesData = []
|
|
104
|
+
for (const geofence of userData.geofences) {
|
|
105
|
+
const filteredByGeofence = zoneInOutData.filter(d => d.geofenceId === geofence.id)
|
|
107
106
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
const dataByDay = []
|
|
108
|
+
for (const date of dates) {
|
|
109
|
+
const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
|
|
110
|
+
const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
|
|
112
111
|
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
const dayRoute = deviceRoute.filter(p => new Date(p.fixTime) >= fromByDay && new Date(p.fixTime) < toByDay)
|
|
113
|
+
const zoneInOutDayData = filteredByGeofence.filter(z => (!z.inTime || (new Date(z.inTime.fixTime) < toByDay)) &&
|
|
115
114
|
(!z.outTime || (new Date(z.outTime.fixTime) > fromByDay)))
|
|
116
115
|
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
const firstIn = zoneInOutDayData.find(z => z.inTime && new Date(z.inTime.fixTime) > fromByDay)
|
|
117
|
+
const lastOut = zoneInOutDayData.slice().reverse().find(z => z.outTime && new Date(z.outTime.fixTime) < toByDay)
|
|
119
118
|
|
|
120
|
-
|
|
119
|
+
let timeIn = zoneInOutDayData.length ? zoneInOutDayData.reduce((a, b) => a + (b.totalInTime || 0), 0) : 0
|
|
121
120
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
121
|
+
let distanceIn = zoneInOutDayData.length && dayRoute.length ? zoneInOutDayData.reduce((a, b) => a + (b.distanceIn || 0), 0) : 0
|
|
122
|
+
let distanceOut = 0
|
|
123
|
+
if (zoneInOutDayData.length) {
|
|
124
|
+
distanceOut = zoneInOutDayData.reduce((a, b) => a + (b.distanceOut || 0), 0) - zoneInOutDayData[zoneInOutDayData.length - 1].distanceOut
|
|
125
|
+
} else {
|
|
126
|
+
distanceOut = calculateDistance(deviceRoute.filter(p => new Date(p.fixTime) >= fromByDay && new Date(p.fixTime) < toByDay))
|
|
127
|
+
}
|
|
129
128
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
if (zoneInOutDayData.length) {
|
|
130
|
+
// Check if the first entry starts only on the day before
|
|
131
|
+
if (!zoneInOutDayData[0].inTime || new Date(zoneInOutDayData[0].inTime.fixTime) < fromByDay) {
|
|
132
|
+
const inTime = zoneInOutDayData[0].inTime ? new Date(zoneInOutDayData[0].inTime.fixTime) : from
|
|
133
|
+
timeIn = timeIn - (fromByDay.getTime() - inTime.getTime())
|
|
134
|
+
const routeDayBefore = deviceRoute.filter(p => (!zoneInOutDayData[0].inTime || new Date(p.fixTime) >= new Date(zoneInOutDayData[0].inTime.fixTime)) &&
|
|
136
135
|
new Date(p.fixTime) < fromByDay)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
136
|
+
distanceIn = distanceIn - calculateDistance(routeDayBefore)
|
|
137
|
+
} else {
|
|
138
|
+
// Add distanceOut before the first entry
|
|
139
|
+
const routeOut = deviceRoute.filter(p =>
|
|
140
|
+
new Date(p.fixTime).getTime() < new Date(zoneInOutDayData[0].inTime.fixTime).getTime() &&
|
|
142
141
|
new Date(p.fixTime).getTime() >= fromByDay.getTime()
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
)
|
|
143
|
+
distanceOut = distanceOut + calculateDistance(routeOut)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check if the last entry ends only on the next day
|
|
147
|
+
if (!zoneInOutDayData[zoneInOutDayData.length - 1].outTime || new Date(zoneInOutDayData[zoneInOutDayData.length - 1].outTime.fixTime) > toByDay) {
|
|
148
|
+
const outTime = zoneInOutDayData[zoneInOutDayData.length - 1].outTime ? new Date(zoneInOutDayData[zoneInOutDayData.length - 1].outTime.fixTime) : to
|
|
149
|
+
timeIn = timeIn - (outTime.getTime() - (toByDay.getTime() + 1000))
|
|
150
|
+
const routeDayAfter = deviceRoute.filter(p => new Date(p.fixTime) <= outTime && new Date(p.fixTime) > toByDay)
|
|
151
|
+
distanceIn = distanceIn - calculateDistance(routeDayAfter)
|
|
152
|
+
} else {
|
|
153
|
+
const routeOut = deviceRoute.filter(p =>
|
|
154
|
+
new Date(p.fixTime) >= new Date(zoneInOutDayData[zoneInOutDayData.length - 1].outTime.fixTime).getTime() &&
|
|
156
155
|
new Date(p.fixTime) < toByDay.getTime())
|
|
157
|
-
|
|
158
|
-
}
|
|
156
|
+
distanceOut = distanceOut + calculateDistance(routeOut)
|
|
159
157
|
}
|
|
160
|
-
dataByDay.push({
|
|
161
|
-
date,
|
|
162
|
-
firstIn: firstIn ? firstIn.inTime.fixTime : undefined,
|
|
163
|
-
lastOut: lastOut ? lastOut.outTime.fixTime : undefined,
|
|
164
|
-
distanceIn: distanceIn > 0 ? distanceIn : 0,
|
|
165
|
-
distanceOut,
|
|
166
|
-
totalInTime: timeIn,
|
|
167
|
-
totalOutTime: (24 * 60 * 60 * 1000) - timeIn
|
|
168
|
-
})
|
|
169
158
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
159
|
+
dataByDay.push({
|
|
160
|
+
date,
|
|
161
|
+
firstIn: firstIn ? firstIn.inTime.fixTime : undefined,
|
|
162
|
+
lastOut: lastOut ? lastOut.outTime.fixTime : undefined,
|
|
163
|
+
distanceIn: distanceIn > 0 ? distanceIn : 0,
|
|
164
|
+
distanceOut,
|
|
165
|
+
totalInTime: timeIn,
|
|
166
|
+
totalOutTime: (24 * 60 * 60 * 1000) - timeIn
|
|
174
167
|
})
|
|
175
168
|
}
|
|
176
169
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
to,
|
|
181
|
-
groupByDay: true,
|
|
182
|
-
geofences: geofencesData
|
|
170
|
+
geofencesData.push({
|
|
171
|
+
geofenceName: geofence.name,
|
|
172
|
+
days: dataByDay
|
|
183
173
|
})
|
|
184
|
-
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
devicesResult.push({
|
|
177
|
+
device: d,
|
|
178
|
+
from,
|
|
179
|
+
to,
|
|
180
|
+
groupByDay: true,
|
|
181
|
+
geofences: geofencesData
|
|
182
|
+
})
|
|
183
|
+
} else {
|
|
184
|
+
if (zoneInOutData.length > 0) {
|
|
185
185
|
devicesResult.push({
|
|
186
186
|
device: d,
|
|
187
187
|
from,
|
|
@@ -281,6 +281,15 @@ function analyseAlerts (alerts, deviceRoute, userData, from, to) {
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
|
|
284
|
+
if (!zoneInOutData.length && userData.groupByDay) {
|
|
285
|
+
const geofenceIn = alerts.find(a => a.type === 'geofenceIn')
|
|
286
|
+
zoneInOutData.push({
|
|
287
|
+
distanceIn: geofenceIn ? calculateDistance(deviceRoute) : 0,
|
|
288
|
+
distanceOut: !geofenceIn ? calculateDistance(deviceRoute) : 0,
|
|
289
|
+
totalTime: to.getTime() - from.getTime()
|
|
290
|
+
})
|
|
291
|
+
}
|
|
292
|
+
|
|
284
293
|
return zoneInOutData
|
|
285
294
|
}
|
|
286
295
|
|