fleetmap-reports 1.0.297 → 1.0.301
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/.idea/runConfigurations.xml +10 -0
- package/package.json +1 -1
- package/src/idle-report.js +4 -2
- package/src/kms-report.js +31 -76
- package/src/speeding-report.js +6 -4
- package/src/trip-report.js +22 -15
- package/src/util/trips.js +76 -5
- package/.idea/codeStyles/Project.xml +0 -7
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/jsLibraryMappings.xml +0 -6
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="RunConfigurationProducerService">
|
|
4
|
+
<option name="ignoredProducers">
|
|
5
|
+
<set>
|
|
6
|
+
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
|
|
7
|
+
</set>
|
|
8
|
+
</option>
|
|
9
|
+
</component>
|
|
10
|
+
</project>
|
package/package.json
CHANGED
package/src/idle-report.js
CHANGED
|
@@ -193,8 +193,10 @@ async function exportIdleReportToPDF(userData, reportData) {
|
|
|
193
193
|
footValues.splice(2, 0, '')
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
|
|
197
|
-
|
|
196
|
+
if(timezone === 'Asia/Qatar') {
|
|
197
|
+
doc.addFileToVFS("Amiri-Regular.ttf", AmiriRegular());
|
|
198
|
+
doc.addFont("Amiri-Regular.ttf", "Amiri", "normal");
|
|
199
|
+
}
|
|
198
200
|
|
|
199
201
|
const style = getStyle(getUserPartner(userData.user))
|
|
200
202
|
doc.autoTable({
|
package/src/kms-report.js
CHANGED
|
@@ -8,7 +8,7 @@ const traccar = require("./util/traccar");
|
|
|
8
8
|
const {getDates} = require("./util/utils");
|
|
9
9
|
const trips = require("./util/trips");
|
|
10
10
|
const drivers = require("./util/driver");
|
|
11
|
-
const {isInsideTimetable} = require("./util/trips");
|
|
11
|
+
const { isInsideTimetable, isPartialInsideTimetable} = require("./util/trips");
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
let traccarInstance
|
|
@@ -58,8 +58,8 @@ async function createKmsReportByDevice(from, to) {
|
|
|
58
58
|
console.log('trips:' + tripsData.length)
|
|
59
59
|
|
|
60
60
|
if (tripsData.length > 0) {
|
|
61
|
-
|
|
62
|
-
allData.devices = processDevices(from, to, devicesToProcess,
|
|
61
|
+
trips.checkTripsKms(traccarInstance, from, to, devicesToProcess, {trips: tripsData, route: route})
|
|
62
|
+
allData.devices = processDevices(from, to, devicesToProcess, {trips: tripsData, route: route})
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
return allData
|
|
@@ -75,7 +75,9 @@ async function createKmsReportByDriver(from, to) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
const tripsData = await traccar.getTrips(traccarInstance, from, to, devices)
|
|
78
|
-
|
|
78
|
+
const routeData = await traccar.getTrips(traccarInstance, from, to, devices)
|
|
79
|
+
|
|
80
|
+
return { drivers: processDrivers(from, to, userData.drivers, {trips: tripsData, route: routeData}) }
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
async function createKmsReportByGroup(from, to) {
|
|
@@ -98,8 +100,8 @@ async function createKmsReportByGroup(from, to) {
|
|
|
98
100
|
console.log('trips:' + tripsData.length)
|
|
99
101
|
|
|
100
102
|
if (tripsData.length > 0) {
|
|
101
|
-
|
|
102
|
-
groupData.devices = processDevices(from, to, devices,
|
|
103
|
+
trips.checkTripsKms(traccarInstance, from, to, devices, {trips: tripsData, route: route})
|
|
104
|
+
groupData.devices = processDevices(from, to, devices, {trips: tripsData, route: route})
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
reportData.push(groupData)
|
|
@@ -116,7 +118,10 @@ function processDrivers(from, to, drivers, data) {
|
|
|
116
118
|
console.log(data)
|
|
117
119
|
const driversResult = []
|
|
118
120
|
drivers.forEach(d => {
|
|
119
|
-
const
|
|
121
|
+
const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
|
|
122
|
+
const trips = data.trips.filter(t => t.driverUniqueId === d.uniqueId
|
|
123
|
+
&& (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
|
|
124
|
+
|
|
120
125
|
if (trips.length > 0) {
|
|
121
126
|
const driverData = {
|
|
122
127
|
driver: d
|
|
@@ -149,13 +154,15 @@ function processDrivers(from, to, drivers, data) {
|
|
|
149
154
|
}
|
|
150
155
|
|
|
151
156
|
|
|
152
|
-
function processDevices(from, to, devices,
|
|
157
|
+
function processDevices(from, to, devices, data) {
|
|
153
158
|
const devicesResult = []
|
|
154
159
|
|
|
155
160
|
for (const d of devices) {
|
|
156
|
-
const
|
|
161
|
+
const route = data.route.filter(t => t.deviceId === d.id)
|
|
162
|
+
const deviceTrips = data.trips.filter(t => t.deviceId === d.id
|
|
163
|
+
&& (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
|
|
157
164
|
|
|
158
|
-
|
|
165
|
+
if (deviceTrips.length > 0) {
|
|
159
166
|
if(userData.groupByDay) {
|
|
160
167
|
deviceTrips.forEach(t => t.tripDay = new Date(t.startTime).toISOString().split('T')[0] + ' 12:00 PM')
|
|
161
168
|
const groupedTrips = deviceTrips.reduce(
|
|
@@ -167,82 +174,30 @@ function processDevices(from, to, devices, route, trips) {
|
|
|
167
174
|
|
|
168
175
|
const days = []
|
|
169
176
|
let keys = Array.from(groupedTrips.keys())
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
allDates.forEach(d => {
|
|
178
|
+
const day = d.toISOString().split('T')[0] + ' 12:00 PM'
|
|
179
|
+
if(!keys.includes(day)){
|
|
180
|
+
groupedTrips.set(day, [])
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
keys = Array.from(groupedTrips.keys())
|
|
185
|
+
keys.sort((a,b)=>new Date(a).getTime()-new Date(b).getTime());
|
|
186
|
+
keys.forEach(key => {
|
|
180
187
|
const currentDate = new Date(key)
|
|
181
|
-
|
|
188
|
+
const dayTrips = groupedTrips.get(key)
|
|
182
189
|
const day = {
|
|
183
190
|
date: currentDate,
|
|
184
191
|
kms: 0
|
|
185
192
|
}
|
|
186
193
|
|
|
187
|
-
|
|
188
|
-
day.kms = dayTrips.reduce((a, b) => a + b.distance, 0) || 0
|
|
189
|
-
} else {
|
|
190
|
-
if((currentDate.getDay() === 0 && userData.weekDays.sunday) ||
|
|
191
|
-
(currentDate.getDay() === 1 && userData.weekDays.monday) ||
|
|
192
|
-
(currentDate.getDay() === 2 && userData.weekDays.tuesday) ||
|
|
193
|
-
(currentDate.getDay() === 3 && userData.weekDays.wednesday) ||
|
|
194
|
-
(currentDate.getDay() === 4 && userData.weekDays.thursday) ||
|
|
195
|
-
(currentDate.getDay() === 5 && userData.weekDays.friday) ||
|
|
196
|
-
(currentDate.getDay() === 6 && userData.weekDays.saturday)) {
|
|
197
|
-
|
|
198
|
-
const startDate = new Date(new Date(key).toISOString().split('T')[0] + ' '+userData.dayHours.startTime)
|
|
199
|
-
const endDate = new Date(new Date(key).toISOString().split('T')[0] + ' '+userData.dayHours.endTime)
|
|
200
|
-
|
|
201
|
-
console.log(key, startDate, endDate)
|
|
202
|
-
|
|
203
|
-
if(startDate.getTime() < endDate.getTime()) {
|
|
204
|
-
//Trips inside time period
|
|
205
|
-
const filteredTrips = dayTrips.filter(t => new Date(t.startTime).getTime() > startDate.getTime()
|
|
206
|
-
&& new Date(t.endTime).getTime() < endDate.getTime())
|
|
207
|
-
|
|
208
|
-
day.kms = filteredTrips.reduce((a, b) => a + b.distance, 0) || 0
|
|
209
|
-
console.log('Inside trips:' + day.kms)
|
|
210
|
-
} else {
|
|
211
|
-
//Trips inside time period
|
|
212
|
-
const filteredTrips = dayTrips.filter(t => new Date(t.startTime).getTime() > startDate.getTime()
|
|
213
|
-
|| new Date(t.endTime).getTime() < endDate.getTime())
|
|
214
|
-
|
|
215
|
-
day.kms = filteredTrips.reduce((a, b) => a + b.distance, 0) || 0
|
|
216
|
-
console.log('Inside trips:' + day.kms)
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
//Trip starts outside time period and ends inside time period
|
|
220
|
-
const startIncompleteTrip = dayTrips.filter(t => new Date(t.startTime).getTime() < startDate.getTime()
|
|
221
|
-
&& new Date(t.endTime).getTime() > startDate.getTime())
|
|
222
|
-
|
|
223
|
-
//Trip starts inside time period and ends outside time period
|
|
224
|
-
const endIncompleteTrip = dayTrips.filter(t => new Date(t.startTime).getTime() < endDate.getTime()
|
|
225
|
-
&& new Date(t.endTime).getTime() > endDate.getTime())
|
|
226
|
-
|
|
227
|
-
if (startIncompleteTrip.length) {
|
|
228
|
-
const routeInside = route.filter(p => new Date(p.fixTime).getTime() > startDate.getTime() && new Date(p.fixTime).getTime() < new Date(startIncompleteTrip[0].endTime).getTime())
|
|
229
|
-
day.kms = day.kms + (routeInside.reduce((a, b) => a + b.distance, 0) || 0)
|
|
230
|
-
console.log('startIncompleteTrip:' + day.kms)
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (endIncompleteTrip.length) {
|
|
234
|
-
const routeInside = route.filter(p => new Date(p.fixTime).getTime() < endDate.getTime() && new Date(p.fixTime).getTime() > new Date(endIncompleteTrip[0].startTime).getTime())
|
|
235
|
-
day.kms = day.kms + (routeInside.reduce((a, b) => a + b.distance, 0) || 0)
|
|
236
|
-
console.log('endIncompleteTrip:' + day.kms)
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
194
|
+
day.kms = dayTrips.reduce((a, b) => a + b.distance, 0)
|
|
240
195
|
|
|
241
196
|
days.push(day)
|
|
242
197
|
})
|
|
243
198
|
devicesResult.push({
|
|
244
|
-
|
|
245
|
-
|
|
199
|
+
device: d,
|
|
200
|
+
days: days
|
|
246
201
|
})
|
|
247
202
|
} else {
|
|
248
203
|
devicesResult.push({
|
package/src/speeding-report.js
CHANGED
|
@@ -346,7 +346,7 @@ async function exportSpeedingReportToPDF(userData, reportData) {
|
|
|
346
346
|
|
|
347
347
|
if (overspeedData) {
|
|
348
348
|
let first = true
|
|
349
|
-
const doc = new jsPDF.jsPDF('l');
|
|
349
|
+
const doc = new jsPDF.jsPDF('l',undefined, undefined, true);
|
|
350
350
|
await headerFromUser(doc, translations.report.titleSpeedingReport, userData.user)
|
|
351
351
|
|
|
352
352
|
overspeedData.forEach(d => {
|
|
@@ -402,8 +402,10 @@ async function exportSpeedingReportToPDF(userData, reportData) {
|
|
|
402
402
|
footValues.splice(2, 0, '')
|
|
403
403
|
}
|
|
404
404
|
|
|
405
|
-
|
|
406
|
-
|
|
405
|
+
if(timezone === 'Asia/Qatar') {
|
|
406
|
+
doc.addFileToVFS("Amiri-Regular.ttf", AmiriRegular());
|
|
407
|
+
doc.addFont("Amiri-Regular.ttf", "Amiri", "normal");
|
|
408
|
+
}
|
|
407
409
|
|
|
408
410
|
const style = getStyle(getUserPartner(userData.user))
|
|
409
411
|
doc.autoTable({
|
|
@@ -428,7 +430,7 @@ async function exportSpeedingReportToPDF(userData, reportData) {
|
|
|
428
430
|
fontSize: 9
|
|
429
431
|
},
|
|
430
432
|
startY: space+35 });
|
|
431
|
-
|
|
433
|
+
} catch (e) {
|
|
432
434
|
console.error(e, 'moving on...')
|
|
433
435
|
}
|
|
434
436
|
})
|
package/src/trip-report.js
CHANGED
|
@@ -9,7 +9,7 @@ const {headerFromUser, addTable} = require("./util/pdfDocument")
|
|
|
9
9
|
const {getStyle} = require("./reportStyle")
|
|
10
10
|
const traccar = require("./util/traccar")
|
|
11
11
|
const trips = require("./util/trips");
|
|
12
|
-
const {isInsideTimetable, addNearestPOIs} = require("./util/trips");
|
|
12
|
+
const {isInsideTimetable, addNearestPOIs, isPartialInsideTimetable} = require("./util/trips");
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
let traccarInstance
|
|
@@ -51,14 +51,15 @@ async function createTripReportByDevice(from, to) {
|
|
|
51
51
|
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
52
52
|
|
|
53
53
|
const devicesToSlice = devices.slice()
|
|
54
|
-
const
|
|
54
|
+
const tripsData = await traccar.getTrips(traccarInstance, from, to, devicesToSlice)
|
|
55
55
|
const stopsData = await traccar.getStops(traccarInstance, from, to, devicesToSlice)
|
|
56
|
+
const routeData = await traccar.getRoute(traccarInstance, from, to, devicesToSlice)
|
|
56
57
|
|
|
57
|
-
console.log('Trips:' +
|
|
58
|
+
console.log('Trips:' + tripsData.length)
|
|
58
59
|
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
allData.devices = processDevices(from, to, devices,
|
|
60
|
+
if (tripsData.length > 0) {
|
|
61
|
+
trips.checkTripsKms(traccarInstance, from, to, devices, {trips: tripsData, route: routeData})
|
|
62
|
+
allData.devices = processDevices(from, to, devices, {trips: tripsData, stops: stopsData, route: routeData})
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
return allData
|
|
@@ -82,11 +83,14 @@ async function createTripReportByGroup(from, to) {
|
|
|
82
83
|
const stopsResponse = await traccarInstance.reports.reportsStopsGet(from, to, null, [g.id])
|
|
83
84
|
const stopsData = stopsResponse.data
|
|
84
85
|
|
|
86
|
+
const routeResponse = await traccarInstance.reports.reportsRouteGet(from, to, null, [g.id])
|
|
87
|
+
const routeData = routeResponse.data
|
|
88
|
+
|
|
85
89
|
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
86
90
|
|
|
87
91
|
if (tripsData.length > 0) {
|
|
88
92
|
console.log('Trips:' + tripsData.length)
|
|
89
|
-
groupData.devices = processDevices(from, to, devices, tripsData, stopsData,
|
|
93
|
+
groupData.devices = processDevices(from, to, devices, {trips: tripsData, stops: stopsData, route: routeData})
|
|
90
94
|
|
|
91
95
|
reportData.push(groupData)
|
|
92
96
|
}
|
|
@@ -112,17 +116,19 @@ async function createTripReportByDriver(from, to){
|
|
|
112
116
|
}
|
|
113
117
|
|
|
114
118
|
const tripsData = await traccar.getTrips(traccarInstance, from, to, devices)
|
|
119
|
+
const routeData = await traccar.getRoute(traccarInstance, from, to, devices)
|
|
115
120
|
|
|
116
|
-
return { drivers: processDrivers(from, to, userData.drivers, tripsData)}
|
|
121
|
+
return { drivers: processDrivers(from, to, userData.drivers, {trips: tripsData, route: routeData})}
|
|
117
122
|
}
|
|
118
123
|
|
|
119
|
-
function processDevices(from, to, devices, data
|
|
124
|
+
function processDevices(from, to, devices, data) {
|
|
120
125
|
const devicesResult = []
|
|
121
126
|
|
|
122
127
|
devices.forEach(d => {
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
const route = data.route.filter(t => t.deviceId === d.id)
|
|
129
|
+
const trips = data.trips.filter(t => t.deviceId === d.id
|
|
130
|
+
&& (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
|
|
131
|
+
const stops = data.stops.filter(s => s.deviceId === d.id)
|
|
126
132
|
|
|
127
133
|
addNearestPOIs(trips, userData)
|
|
128
134
|
|
|
@@ -136,7 +142,7 @@ function processDevices(from, to, devices, data, stopsData) {
|
|
|
136
142
|
}
|
|
137
143
|
|
|
138
144
|
const stop = getStop(new Date(trip.startTime), stops)
|
|
139
|
-
if (stop) {
|
|
145
|
+
if (stop && !trip.endTimeIsOut) {
|
|
140
146
|
trip.stopDuration = (new Date(stop.endTime) - new Date(stop.startTime))
|
|
141
147
|
trip.stopEngineHours = stop.engineHours
|
|
142
148
|
} else {
|
|
@@ -173,8 +179,9 @@ function processDrivers(from, to, drivers, data) {
|
|
|
173
179
|
console.log(data)
|
|
174
180
|
const driversResult = []
|
|
175
181
|
drivers.forEach(d => {
|
|
176
|
-
const
|
|
177
|
-
|
|
182
|
+
const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
|
|
183
|
+
const trips = data.trips.filter(t => t.driverUniqueId === d.uniqueId
|
|
184
|
+
&& (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
|
|
178
185
|
|
|
179
186
|
trips.sort((a,b)=>new Date(a.startTime).getTime()-new Date(b.startTime).getTime())
|
|
180
187
|
|
package/src/util/trips.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const traccar = require("./traccar");
|
|
2
1
|
const {coordsDistance} = require("./utils");
|
|
3
2
|
|
|
4
3
|
const minDistance = 0
|
|
@@ -25,15 +24,14 @@ function addNearestPOIs(trips, userData){
|
|
|
25
24
|
})
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
function checkTripsKms(traccarInstance, from, to, devices, data) {
|
|
29
28
|
console.log('checkTripsKms')
|
|
30
|
-
const trips =
|
|
29
|
+
const trips = data.trips.filter(t => t.distance === minDistance && t.averageSpeed > minAvgSpeed)
|
|
31
30
|
if(trips.length > 0) {
|
|
32
31
|
//Vehicles with imported positions. calculate trip distance with route positions
|
|
33
|
-
const route = routeData.length === 0 ? await traccar.getRoute(traccarInstance, from, to, devices) : routeData
|
|
34
32
|
trips.forEach(t => {
|
|
35
33
|
if(t.distance === minDistance && t.averageSpeed > minAvgSpeed) {
|
|
36
|
-
const tripRoute = route.filter(p => p.deviceId === t.deviceId
|
|
34
|
+
const tripRoute = data.route.filter(p => p.deviceId === t.deviceId
|
|
37
35
|
&& new Date(p.fixTime).getTime() >= new Date(t.startTime).getTime()
|
|
38
36
|
&& new Date(p.fixTime).getTime() <= new Date(t.endTime).getTime())
|
|
39
37
|
t.distance = tripRoute.reduce((a, b) => a + b.attributes.distance, 0)
|
|
@@ -42,6 +40,70 @@ async function checkTripsKms(traccarInstance, from, to, routeData, tripsData, de
|
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
|
|
43
|
+
function isPartialInsideTimetable(t, userData, route){
|
|
44
|
+
const tripStart = new Date(t.startTime)
|
|
45
|
+
let isPartialInside = false
|
|
46
|
+
|
|
47
|
+
if((tripStart.getDay() === 0 && userData.weekDays.sunday) ||
|
|
48
|
+
(tripStart.getDay() === 1 && userData.weekDays.monday) ||
|
|
49
|
+
(tripStart.getDay() === 2 && userData.weekDays.tuesday) ||
|
|
50
|
+
(tripStart.getDay() === 3 && userData.weekDays.wednesday) ||
|
|
51
|
+
(tripStart.getDay() === 4 && userData.weekDays.thursday) ||
|
|
52
|
+
(tripStart.getDay() === 5 && userData.weekDays.friday) ||
|
|
53
|
+
(tripStart.getDay() === 6 && userData.weekDays.saturday)) {
|
|
54
|
+
|
|
55
|
+
const startDate = new Date(new Date(tripStart).toISOString().split('T')[0] + ' '+userData.dayHours.startTime)
|
|
56
|
+
const endDate = new Date(new Date(tripStart).toISOString().split('T')[0] + ' '+userData.dayHours.endTime)
|
|
57
|
+
|
|
58
|
+
if(startDate.getTime() > endDate.getTime()){
|
|
59
|
+
//Trip starts outside time period and ends inside time period
|
|
60
|
+
if (new Date(t.startTime).getTime() < endDate.getTime()
|
|
61
|
+
&& new Date(t.endTime).getTime() > endDate.getTime()) {
|
|
62
|
+
//Trip starts inside time period and ends outside time period
|
|
63
|
+
const routeInside = route.filter(p => new Date(p.fixTime).getTime() < endDate.getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
|
|
64
|
+
updateTrip(t, routeInside)
|
|
65
|
+
t.endTime = endDate.toISOString()
|
|
66
|
+
t.endTimeIsOut = true
|
|
67
|
+
isPartialInside = true
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (new Date(t.startTime).getTime() < startDate.getTime()
|
|
71
|
+
&& new Date(t.endTime).getTime() > startDate.getTime()) {
|
|
72
|
+
|
|
73
|
+
//Trip starts outside time period and ends inside time period
|
|
74
|
+
const routeInside = route.filter(p => new Date(p.fixTime).getTime() > startDate.getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
|
|
75
|
+
updateTrip(t, routeInside)
|
|
76
|
+
t.startTime = startDate.toISOString()
|
|
77
|
+
t.startTimeIsOut = true
|
|
78
|
+
isPartialInside = true
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
} else {
|
|
82
|
+
if (new Date(t.startTime).getTime() < startDate.getTime()
|
|
83
|
+
&& new Date(t.endTime).getTime() > startDate.getTime()) {
|
|
84
|
+
//Trip starts outside time period and ends inside time period
|
|
85
|
+
const routeInside = route.filter(p => new Date(p.fixTime).getTime() > startDate.getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
|
|
86
|
+
updateTrip(t, routeInside)
|
|
87
|
+
t.startTime = startDate.toISOString()
|
|
88
|
+
t.startTimeIsOut = true
|
|
89
|
+
isPartialInside = true
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (new Date(t.startTime).getTime() < endDate.getTime()
|
|
93
|
+
&& new Date(t.endTime).getTime() > endDate.getTime()) {
|
|
94
|
+
//Trip starts inside time period and ends outside time period
|
|
95
|
+
const routeInside = route.filter(p => new Date(p.fixTime).getTime() < endDate.getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
|
|
96
|
+
updateTrip(t, routeInside)
|
|
97
|
+
t.endTime = endDate.toISOString()
|
|
98
|
+
t.endTimeIsOut = true
|
|
99
|
+
isPartialInside = true
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return isPartialInside
|
|
105
|
+
}
|
|
106
|
+
|
|
45
107
|
function isInsideTimetable(t, userData){
|
|
46
108
|
const tripStart = new Date(t.startTime)
|
|
47
109
|
const tripEnd = new Date(t.endTime)
|
|
@@ -71,6 +133,15 @@ function isInsideTimetable(t, userData){
|
|
|
71
133
|
return false
|
|
72
134
|
}
|
|
73
135
|
|
|
136
|
+
function updateTrip(t, route){
|
|
137
|
+
const distance = route[route.length-1].attributes.totalDistance - route[0].attributes.totalDistance
|
|
138
|
+
t.distance = distance
|
|
139
|
+
t.duration = new Date(route[route.length-1].fixTime).getTime() - new Date(route[0].fixTime).getTime()
|
|
140
|
+
t.maxSpeed = route.reduce((a, b) => Math.max(a, b.speed), 0)
|
|
141
|
+
t.averageSpeed = distance > 0 ? ((route.reduce((a, b) => a + b.speed, 0)) / route.length) : 0
|
|
142
|
+
}
|
|
143
|
+
|
|
74
144
|
exports.checkTripsKms = checkTripsKms
|
|
75
145
|
exports.isInsideTimetable = isInsideTimetable
|
|
146
|
+
exports.isPartialInsideTimetable = isPartialInsideTimetable
|
|
76
147
|
exports.addNearestPOIs = addNearestPOIs
|