fleetmap-reports 1.0.674 → 1.0.676
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 +50 -30
package/package.json
CHANGED
package/src/zone-report.js
CHANGED
|
@@ -71,9 +71,8 @@ async function createZoneReport (from, to, userData, traccar) {
|
|
|
71
71
|
const route = filterPositions(data.route)
|
|
72
72
|
const alerts = getInAndOutEvents(slice, route, userData)
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
74
|
+
allData.devices.push(...await processDevices(from, to, devices, userData, { alerts, route }))
|
|
75
|
+
|
|
77
76
|
deviceCount = deviceCount + slice.length
|
|
78
77
|
}
|
|
79
78
|
|
|
@@ -97,11 +96,11 @@ async function processDevices (from, to, devices, userData, data) {
|
|
|
97
96
|
const alerts = data.alerts.filter(t => t.deviceId === d.id)
|
|
98
97
|
const deviceRoute = data.route.filter(p => p.deviceId === d.id)
|
|
99
98
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
: analyseAlerts(alerts, deviceRoute, userData)
|
|
99
|
+
const zoneInOutData = userData.groupByDay
|
|
100
|
+
? analyseAlertsGroupGeofences(alerts, deviceRoute, from, to)
|
|
101
|
+
: analyseAlerts(alerts, deviceRoute, userData)
|
|
104
102
|
|
|
103
|
+
if (zoneInOutData.length > 0) {
|
|
105
104
|
const result = userData.onlyWithStop ? zoneInOutData.filter(d => d.stopped) : zoneInOutData
|
|
106
105
|
|
|
107
106
|
if (userData.groupByDay) {
|
|
@@ -272,6 +271,15 @@ function analyseAlertsGroupGeofences (alerts, deviceRoute, from, to) {
|
|
|
272
271
|
})
|
|
273
272
|
}
|
|
274
273
|
|
|
274
|
+
if (!zoneInOutData.length) {
|
|
275
|
+
const geofenceIn = alerts.find(a => a.type === 'geofenceIn')
|
|
276
|
+
zoneInOutData.push({
|
|
277
|
+
distanceIn: geofenceIn ? calculateDistance(deviceRoute) : 0,
|
|
278
|
+
distanceOut: !geofenceIn ? calculateDistance(deviceRoute) : 0,
|
|
279
|
+
totalTime: to.getTime() - from.getTime()
|
|
280
|
+
})
|
|
281
|
+
}
|
|
282
|
+
|
|
275
283
|
return zoneInOutData
|
|
276
284
|
}
|
|
277
285
|
|
|
@@ -344,40 +352,50 @@ function analyseAlerts (alerts, deviceRoute, userData) {
|
|
|
344
352
|
}
|
|
345
353
|
|
|
346
354
|
function checkGeofenceEnter (p1, p2, g) {
|
|
355
|
+
return !checkGeofenceIn(p1, g) && checkGeofenceIn(p2, g)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function checkGeofenceExit (p1, p2, g) {
|
|
359
|
+
return checkGeofenceEnter(p2, p1, g)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function checkGeofenceIn (p, g) {
|
|
347
363
|
switch (g.geometry.type) {
|
|
348
364
|
case 'Polygon':
|
|
349
|
-
return
|
|
365
|
+
return booleanPointInPolygon.default(p, g)
|
|
350
366
|
case 'Point':
|
|
351
|
-
return distance.default(
|
|
352
|
-
distance.default(p2, g, { units: 'meters' }) < g.properties.distance
|
|
367
|
+
return distance.default(p, g, { units: 'meters' }) >= g.properties.distance
|
|
353
368
|
case 'LineString':
|
|
354
|
-
return pointToLineDistance.default(
|
|
355
|
-
pointToLineDistance.default(p2, g, { units: 'meters' }) <= (g.properties.geofence.attributes.polylineDistance || 25)
|
|
369
|
+
return pointToLineDistance.default(p, g, { units: 'meters' }) > (g.properties.geofence.attributes.polylineDistance || 25)
|
|
356
370
|
}
|
|
357
371
|
}
|
|
358
372
|
|
|
359
|
-
function checkGeofenceExit (p1, p2, g) {
|
|
360
|
-
return checkGeofenceEnter(p2, p1, g)
|
|
361
|
-
}
|
|
362
|
-
|
|
363
373
|
function getInAndOutEvents (devices, route, userData) {
|
|
364
374
|
const events = []
|
|
365
375
|
devices.forEach(d => {
|
|
366
376
|
const deviceRoute = route.filter(p => p.deviceId === d.id)
|
|
367
377
|
const routePoints = deviceRoute.sort(sortPositions).map(p => convertPositionToFeature(p))
|
|
368
378
|
const geofencesFeatures = userData.geofences.map(g => convertToFeature(g))
|
|
369
|
-
|
|
379
|
+
const deviceEvents = []
|
|
370
380
|
routePoints.filter(p => p.properties.position.valid).forEach((p, i, array) => {
|
|
371
|
-
if (!i) {
|
|
381
|
+
if (!i) {
|
|
382
|
+
for (const g of geofencesFeatures) {
|
|
383
|
+
if (checkGeofenceIn(p, g)) {
|
|
384
|
+
deviceEvents.push(createEvent('geofenceIn', d.id, p, g))
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return
|
|
388
|
+
}
|
|
372
389
|
const previous = array[i - 1]
|
|
373
390
|
for (const g of geofencesFeatures) {
|
|
374
391
|
if (checkGeofenceEnter(previous, p, g)) {
|
|
375
|
-
|
|
392
|
+
deviceEvents.push(createEvent('geofenceEnter', d.id, p, g))
|
|
376
393
|
} else if (checkGeofenceExit(previous, p, g)) {
|
|
377
|
-
|
|
394
|
+
deviceEvents.push(createEvent('geofenceExit', d.id, p, g))
|
|
378
395
|
}
|
|
379
396
|
}
|
|
380
397
|
})
|
|
398
|
+
events.push(...deviceEvents)
|
|
381
399
|
})
|
|
382
400
|
return events
|
|
383
401
|
}
|
|
@@ -447,10 +465,10 @@ async function exportZoneReportToPDF (userData, reportData) {
|
|
|
447
465
|
convertToLocaleDateString(a.date, userData.user.attributes.lang, userData.user.attributes.timezone),
|
|
448
466
|
a.firstIn ? convertToLocaleTimeString(a.firstIn, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
|
|
449
467
|
a.lastOut ? convertToLocaleTimeString(a.lastOut, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
|
|
450
|
-
a.distanceIn.
|
|
451
|
-
|
|
452
|
-
a.distanceOut.
|
|
453
|
-
|
|
468
|
+
a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
469
|
+
convertMS(a.timeIn, false),
|
|
470
|
+
a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
471
|
+
convertMS(a.timeOut, false)
|
|
454
472
|
]
|
|
455
473
|
data.push(temp)
|
|
456
474
|
})
|
|
@@ -460,8 +478,8 @@ async function exportZoneReportToPDF (userData, reportData) {
|
|
|
460
478
|
geofenceExit(userData.user, a),
|
|
461
479
|
a.stopped ? translations.report.yes : translations.report.no,
|
|
462
480
|
a.totalTime ? convertMS(a.totalTime * 1000, true) : '',
|
|
463
|
-
a.distanceIn && a.distanceIn.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits:
|
|
464
|
-
a.distanceOut && a.distanceOut.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits:
|
|
481
|
+
a.distanceIn && a.distanceIn.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
482
|
+
a.distanceOut && a.distanceOut.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
465
483
|
a.geofenceName,
|
|
466
484
|
a.driverName
|
|
467
485
|
]
|
|
@@ -472,9 +490,9 @@ async function exportZoneReportToPDF (userData, reportData) {
|
|
|
472
490
|
? [
|
|
473
491
|
'Total:' + d.days.length,
|
|
474
492
|
'', '',
|
|
475
|
-
d.days.reduce((a, b) => a + b.distanceIn, 0).
|
|
493
|
+
d.days.reduce((a, b) => a + b.distanceIn, 0).toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
476
494
|
'',
|
|
477
|
-
d.days.reduce((a, b) => a + b.distanceOut, 0).
|
|
495
|
+
d.days.reduce((a, b) => a + b.distanceOut, 0).toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 })
|
|
478
496
|
]
|
|
479
497
|
: [
|
|
480
498
|
'Total:' + d.geofences.length
|
|
@@ -550,8 +568,8 @@ function exportZoneReportToExcel (userData, reportData) {
|
|
|
550
568
|
date: convertToLocaleDateString(a.date, userData.user.attributes.lang, userData.user.attributes.timezone),
|
|
551
569
|
firstIn: a.firstIn ? convertToLocaleTimeString(a.firstIn, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
|
|
552
570
|
lastOut: a.lastOut ? convertToLocaleTimeString(a.lastOut, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
|
|
553
|
-
distanceIn: a.distanceIn.
|
|
554
|
-
distanceOut: a.distanceOut.
|
|
571
|
+
distanceIn: a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
572
|
+
distanceOut: a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
555
573
|
timeIn: convertMS(a.timeIn),
|
|
556
574
|
timeOut: convertMS(a.timeOut)
|
|
557
575
|
}
|
|
@@ -564,6 +582,8 @@ function exportZoneReportToExcel (userData, reportData) {
|
|
|
564
582
|
exit: geofenceExit(userData.user, a),
|
|
565
583
|
stopped: a.stopped ? translations.report.yes : translations.report.no,
|
|
566
584
|
duration: a.totalTime ? convertMS(a.totalTime * 1000, true) : '',
|
|
585
|
+
distanceIn: a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
586
|
+
distanceOut: a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
|
|
567
587
|
zone: a.geofenceName,
|
|
568
588
|
driver: a.driverName
|
|
569
589
|
}
|