fleetmap-reports 1.0.246 → 1.0.250
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/workspace.xml +75 -23
- package/package.json +1 -1
- package/src/index.js +2 -2
- package/src/index.test.js +23 -1
- package/src/kms-report.js +88 -27
- package/src/speeding-report.js +110 -63
- package/src/trip-report.js +49 -47
- package/src/util/driver.js +3 -9
- package/src/util/traccar.js +14 -0
- package/src/util/utils.js +16 -0
- package/.idea/shelf/Uncommitted_changes_before_Update_at_25_11_2021,_13_06_[Changes]/shelved.patch +0 -302
- package/.idea/shelf/Uncommitted_changes_before_Update_at_25_11_2021,_13_10_[Changes]/shelved.patch +0 -233
- package/.idea/shelf/Uncommitted_changes_before_Update_at_25_11_2021__13_06__Changes_.xml +0 -4
- package/.idea/shelf/Uncommitted_changes_before_Update_at_25_11_2021__13_10__Changes_.xml +0 -4
package/src/speeding-report.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const automaticReports = require("./automaticReports")
|
|
2
1
|
const messages = require('../lang')
|
|
3
2
|
const jsPDF = require('jspdf')
|
|
4
3
|
const {convertMS} = require("./util/utils")
|
|
@@ -14,16 +13,18 @@ const {getUserPartner} = require("fleetmap-partners");
|
|
|
14
13
|
const traccar = require("./util/traccar");
|
|
15
14
|
|
|
16
15
|
let traccarInstance
|
|
16
|
+
let userData
|
|
17
17
|
|
|
18
18
|
const fileName = 'SpeedingReport'
|
|
19
19
|
|
|
20
|
-
async function createSpeedingReport(from, to,
|
|
20
|
+
async function createSpeedingReport(from, to, reportUserData, traccar) {
|
|
21
21
|
traccarInstance = traccar
|
|
22
|
-
|
|
22
|
+
userData = reportUserData
|
|
23
|
+
console.log('createSpeedingReport', from, to, userData, traccar)
|
|
23
24
|
const reportData = []
|
|
24
25
|
|
|
25
26
|
if(userData.byDriver){
|
|
26
|
-
const allData = await createSpeedingReportByDriver(from, to
|
|
27
|
+
const allData = await createSpeedingReportByDriver(from, to)
|
|
27
28
|
reportData.push(allData)
|
|
28
29
|
}
|
|
29
30
|
else if(userData.byGroup){
|
|
@@ -38,76 +39,76 @@ async function createSpeedingReport(from, to, userData, traccar, roadSpeedLimits
|
|
|
38
39
|
xpert: devices.filter(d => d.attributes.xpert).length > 0
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
const
|
|
42
|
+
const eventTypes = ['deviceOverspeed']
|
|
43
|
+
const events = await traccar.getEvents(traccarInstance, from, to, devices, eventTypes)
|
|
44
|
+
const routes = userData.useVehicleSpeedLimit ? [] : await traccar.getRoute(traccarInstance, from, to, devices)
|
|
42
45
|
|
|
43
46
|
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
44
47
|
|
|
45
|
-
if (
|
|
46
|
-
groupData.devices = await processDevices(from, to, devices,
|
|
48
|
+
if (events.length > 0) {
|
|
49
|
+
groupData.devices = await processDevices(from, to, devices, events, routes)
|
|
47
50
|
reportData.push(groupData)
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
54
|
|
|
52
|
-
const withoutGroupData = await createSpeedingReportByDevice(from, to
|
|
55
|
+
const withoutGroupData = await createSpeedingReportByDevice(from, to)
|
|
53
56
|
reportData.push(withoutGroupData)
|
|
54
57
|
} else {
|
|
55
|
-
const allData = await createSpeedingReportByDevice(from, to
|
|
58
|
+
const allData = await createSpeedingReportByDevice(from, to)
|
|
56
59
|
reportData.push(allData)
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
return reportData
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
async function createSpeedingReportByDevice(from, to
|
|
65
|
+
async function createSpeedingReportByDevice(from, to) {
|
|
63
66
|
const groupIds = userData.groups.map(g => g.id)
|
|
64
67
|
const withoutGroupDevices = userData.byGroup ? userData.devices.filter(d => !groupIds.includes(d.groupId)) : userData.devices
|
|
65
68
|
|
|
66
69
|
withoutGroupDevices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
67
70
|
|
|
68
|
-
const
|
|
69
|
-
const
|
|
71
|
+
const eventTypes = ['deviceOverspeed']
|
|
72
|
+
const events = await traccar.getEvents(traccarInstance, from, to, withoutGroupDevices, eventTypes)
|
|
73
|
+
const routes = userData.useVehicleSpeedLimit ? [] : await traccar.getRoute(traccarInstance, from, to, withoutGroupDevices)
|
|
70
74
|
|
|
71
75
|
const allData = { devices: [] }
|
|
72
76
|
|
|
73
|
-
if(
|
|
74
|
-
allData.devices = await processDevices(from, to, withoutGroupDevices,
|
|
77
|
+
if(events.length > 0 || userData.roadSpeedLimits) {
|
|
78
|
+
allData.devices = await processDevices(from, to, withoutGroupDevices, events, routes)
|
|
75
79
|
allData.xpert = withoutGroupDevices.filter(d => d && d.attributes && d.attributes.xpert).length > 0
|
|
76
80
|
}
|
|
77
81
|
|
|
78
82
|
return allData
|
|
79
83
|
}
|
|
80
84
|
|
|
81
|
-
async function createSpeedingReportByDriver(from, to
|
|
85
|
+
async function createSpeedingReportByDriver(from, to) {
|
|
82
86
|
const deviceIds = await drivers.devicesByDriver(traccarInstance, from, to, userData.drivers, userData.devices)
|
|
83
|
-
console.log(deviceIds.length)
|
|
87
|
+
console.log('Devices with driver',deviceIds.length)
|
|
84
88
|
|
|
85
89
|
let eventsData = []
|
|
86
90
|
if(deviceIds.length > 0) {
|
|
87
|
-
console.log('getReportData', deviceIds.length)
|
|
88
91
|
const devices = userData.devices.filter(d => deviceIds.includes(d.id))
|
|
89
|
-
eventsData = await
|
|
92
|
+
eventsData = await traccar.getEvents(traccarInstance, from, to, devices,['deviceOverspeed'])
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
const allData = {
|
|
93
96
|
drivers: []
|
|
94
97
|
}
|
|
95
|
-
|
|
96
98
|
console.log(eventsData.length)
|
|
97
99
|
|
|
98
|
-
await getEventsPosition(from , to, userData.devices,
|
|
99
|
-
|
|
100
|
-
allData.drivers = await processDrivers(from, to, userData.drivers, eventsData)
|
|
100
|
+
await getEventsPosition(from , to, userData.devices, eventsData)
|
|
101
|
+
allData.drivers = await processDrivers(from, to, eventsData)
|
|
101
102
|
console.log(allData.drivers.length)
|
|
102
103
|
return allData
|
|
103
104
|
}
|
|
104
105
|
|
|
105
|
-
async function processDrivers(from, to,
|
|
106
|
+
async function processDrivers(from, to, data) {
|
|
106
107
|
console.log(data)
|
|
107
108
|
const driversResult = []
|
|
108
109
|
const alertsWithPosition = data.filter(a => a.position)
|
|
109
110
|
|
|
110
|
-
drivers.forEach(d => {
|
|
111
|
+
userData.drivers.forEach(d => {
|
|
111
112
|
const alerts = alertsWithPosition.filter(e => e.position.attributes.driverUniqueId === d.uniqueId)
|
|
112
113
|
|
|
113
114
|
if (alerts.length > 0) {
|
|
@@ -127,62 +128,83 @@ async function processDrivers(from, to, drivers, data) {
|
|
|
127
128
|
return driversResult
|
|
128
129
|
}
|
|
129
130
|
|
|
130
|
-
async function
|
|
131
|
-
const types = ['deviceOverspeed']
|
|
132
|
-
let data = []
|
|
133
|
-
const arrayOfArrays = automaticReports.sliceArray(devices)
|
|
134
|
-
for (const a of arrayOfArrays) {
|
|
135
|
-
try {
|
|
136
|
-
const devices = a.map(d => d.id)
|
|
137
|
-
console.log('reportsEventsGet', from, to, devices, null, types)
|
|
138
|
-
const response = await traccarInstance.reports.reportsEventsGet(from, to, devices, null, types)
|
|
139
|
-
data = data.concat(response.data)
|
|
140
|
-
} catch (e) {
|
|
141
|
-
console.error(e)
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
console.log('Alerts:', data.length)
|
|
145
|
-
return data
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async function processDevices(from, to, devices, geofences, drivers, data, roadSpeedLimits) {
|
|
131
|
+
async function processDevices(from, to, devices, events, routes) {
|
|
149
132
|
const devicesResult = []
|
|
150
133
|
|
|
151
|
-
|
|
134
|
+
if(userData.useVehicleSpeedLimit) {
|
|
135
|
+
await getEventsPosition(from, to, devices, events)
|
|
152
136
|
|
|
153
|
-
|
|
154
|
-
const alerts = data.filter(t => t.deviceId === d.id)
|
|
137
|
+
console.log(events)
|
|
155
138
|
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
139
|
+
for (const d of devices) {
|
|
140
|
+
const deviceEvents = events.filter(t => t.deviceId === d.id)
|
|
141
|
+
|
|
142
|
+
if (deviceEvents.length > 0) {
|
|
143
|
+
const alertsWithPosition = deviceEvents.filter(a => a.position).sort((a, b) => a.positionId - b.positionId)
|
|
144
|
+
devicesResult.push({
|
|
145
|
+
device: d,
|
|
146
|
+
from: from,
|
|
147
|
+
to: to,
|
|
148
|
+
alerts: alertsWithPosition,
|
|
149
|
+
maxSpeed: alertsWithPosition.reduce((a, b) => {
|
|
150
|
+
return a > (b && b.attributes && b.attributes.maxSpeed) ? a : (b && b.attributes && b.attributes.maxSpeed)
|
|
151
|
+
}, 0),
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
for (const d of devices) {
|
|
157
|
+
const positions = routes.filter(t => t.deviceId === d.id)
|
|
158
|
+
const maxSpeed = userData.customSpeed / 1.85200
|
|
159
|
+
|
|
160
|
+
const alerts = []
|
|
161
|
+
for(let pIndex = 0; pIndex < positions.length ; pIndex++){
|
|
162
|
+
const position = positions[pIndex]
|
|
163
|
+
if(position.speed > maxSpeed){
|
|
164
|
+
const alert = {
|
|
165
|
+
position: position,
|
|
166
|
+
attributes: {
|
|
167
|
+
speedLimit: maxSpeed,
|
|
168
|
+
speed: position.speed
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
pIndex = calculateEventData(positions, pIndex, alert)
|
|
173
|
+
|
|
174
|
+
alerts.push(alert)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if(alerts.length > 0){
|
|
178
|
+
devicesResult.push({
|
|
179
|
+
device: d,
|
|
180
|
+
from: from,
|
|
181
|
+
to: to,
|
|
182
|
+
alerts: alerts,
|
|
183
|
+
maxSpeed: alerts.reduce((a, b) => {
|
|
184
|
+
return a > (b && b.attributes && b.attributes.maxSpeed) ? a : (b && b.attributes && b.attributes.maxSpeed)
|
|
185
|
+
}, 0),
|
|
186
|
+
})
|
|
187
|
+
}
|
|
167
188
|
}
|
|
168
189
|
}
|
|
169
190
|
|
|
170
191
|
return devicesResult
|
|
171
192
|
}
|
|
172
193
|
|
|
173
|
-
async function getEventsPosition(from, to, devices,
|
|
194
|
+
async function getEventsPosition(from, to, devices, events){
|
|
174
195
|
|
|
175
196
|
const deviceIds = [...new Set(events.map(e => e.deviceId))]
|
|
176
|
-
console.log('deviceIds',deviceIds)
|
|
177
197
|
const routeData = await traccar.getRoute(traccarInstance, from, to, deviceIds.map(id => { return { id: id } } ))
|
|
178
198
|
|
|
199
|
+
console.log(events)
|
|
200
|
+
|
|
179
201
|
for (const d of devices) {
|
|
180
202
|
let alerts = events.filter(t => t.deviceId === d.id)
|
|
181
203
|
|
|
182
|
-
if (alerts.length > 0 || roadSpeedLimits) {
|
|
204
|
+
if (alerts.length > 0 || userData.roadSpeedLimits) {
|
|
183
205
|
const positions = routeData.filter(p => p.deviceId === d.id)
|
|
184
206
|
|
|
185
|
-
if (roadSpeedLimits && positions.length) {
|
|
207
|
+
if (userData.roadSpeedLimits && positions.length) {
|
|
186
208
|
try {
|
|
187
209
|
const results = await here.routeMatch(positions)
|
|
188
210
|
const hereAlerts = results.map(r => {
|
|
@@ -220,7 +242,7 @@ async function getEventsPosition(from, to, devices, geofences, drivers, events,
|
|
|
220
242
|
let geofence = null
|
|
221
243
|
|
|
222
244
|
if (a.geofenceId) {
|
|
223
|
-
geofence = geofences.find(g => g.id === a.geofenceId)
|
|
245
|
+
geofence = userData.geofences.find(g => g.id === a.geofenceId)
|
|
224
246
|
if (geofence) {
|
|
225
247
|
a.geofenceName = geofence.name + ' (' + Math.round(a.attributes.speedLimit * 1.85200) + ' Km/h)'
|
|
226
248
|
}
|
|
@@ -248,7 +270,7 @@ async function getEventsPosition(from, to, devices, geofences, drivers, events,
|
|
|
248
270
|
}
|
|
249
271
|
|
|
250
272
|
if (a.position.attributes.driverUniqueId) {
|
|
251
|
-
const driver = drivers.find(d => d.uniqueId === a.position.attributes.driverUniqueId)
|
|
273
|
+
const driver = userData.drivers.find(d => d.uniqueId === a.position.attributes.driverUniqueId)
|
|
252
274
|
a.driver = driver && driver.name
|
|
253
275
|
}
|
|
254
276
|
|
|
@@ -261,6 +283,31 @@ async function getEventsPosition(from, to, devices, geofences, drivers, events,
|
|
|
261
283
|
}
|
|
262
284
|
}
|
|
263
285
|
|
|
286
|
+
function calculateEventData(positions, pIndex, a, geofence){
|
|
287
|
+
let endEventPosition = a.position
|
|
288
|
+
let maxSpeed = a.position.speed
|
|
289
|
+
let dist = 0
|
|
290
|
+
while (pIndex + 1 < positions.length) {
|
|
291
|
+
pIndex++
|
|
292
|
+
|
|
293
|
+
dist += distance(point([endEventPosition.longitude, endEventPosition.latitude]),
|
|
294
|
+
point([positions[pIndex].longitude, positions[pIndex].latitude]))
|
|
295
|
+
endEventPosition = positions[pIndex]
|
|
296
|
+
if (endEventPosition.speed <= a.attributes.speedLimit || (geofence && isOutsideGeofence(geofence, endEventPosition))) {
|
|
297
|
+
a.eventTime = new Date(endEventPosition.fixTime) - new Date(a.position.fixTime)
|
|
298
|
+
a.attributes.maxSpeed = maxSpeed
|
|
299
|
+
a.distance = dist
|
|
300
|
+
break
|
|
301
|
+
} else {
|
|
302
|
+
if (maxSpeed < endEventPosition.speed) {
|
|
303
|
+
maxSpeed = endEventPosition.speed
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return pIndex
|
|
309
|
+
}
|
|
310
|
+
|
|
264
311
|
function isOutsideGeofence(geofence, endEventPosition) {
|
|
265
312
|
const v = turf.feature(turf.flip(parse(geofence.area)))
|
|
266
313
|
const point = turf.point([endEventPosition.longitude, endEventPosition.latitude])
|
package/src/trip-report.js
CHANGED
|
@@ -5,9 +5,10 @@ const {convertMS} = require("./util/utils")
|
|
|
5
5
|
require('jspdf-autotable')
|
|
6
6
|
const {coordsDistance} = require("./util/utils")
|
|
7
7
|
const drivers = require("./util/driver")
|
|
8
|
-
const {getUserPartner} = require("fleetmap-partners")
|
|
8
|
+
const {getUserPartner} = require("fleetmap-partners")
|
|
9
9
|
const {headerFromUser} = require("./util/pdfDocument")
|
|
10
10
|
const {getStyle} = require("./reportStyle")
|
|
11
|
+
const traccar = require("./util/traccar")
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
let traccarInstance
|
|
@@ -16,7 +17,6 @@ const fileName = 'TripReport'
|
|
|
16
17
|
|
|
17
18
|
async function createTripReport(from, to, userData, traccar) {
|
|
18
19
|
console.log('Create TripReport')
|
|
19
|
-
|
|
20
20
|
traccarInstance = traccar
|
|
21
21
|
const reportData = []
|
|
22
22
|
|
|
@@ -26,72 +26,74 @@ async function createTripReport(from, to, userData, traccar) {
|
|
|
26
26
|
}
|
|
27
27
|
else if(userData.byGroup){
|
|
28
28
|
console.log("ByGroup")
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
console.log(g.name + ' devices:' + devices.length)
|
|
32
|
-
if(devices.length > 0) {
|
|
33
|
-
const groupData = {
|
|
34
|
-
devices: [],
|
|
35
|
-
group: g,
|
|
36
|
-
xpert: devices.filter(d => d.attributes.xpert).length > 0
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const response = await traccarInstance.reports.reportsTripsGet(from, to, null, [g.id])
|
|
40
|
-
const data = response.data
|
|
41
|
-
|
|
42
|
-
const stopsResponse = await traccarInstance.reports.reportsStopsGet(from, to, null, [g.id])
|
|
43
|
-
const stopsData = stopsResponse.data
|
|
44
|
-
|
|
45
|
-
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
46
|
-
|
|
47
|
-
if (data.length > 0) {
|
|
48
|
-
|
|
49
|
-
console.log('Trips:' + data.length)
|
|
50
|
-
groupData.devices = processDevices(from, to, devices, data, stopsData)
|
|
51
|
-
|
|
52
|
-
reportData.push(groupData)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
29
|
+
const allData = await createTripReportByGroup(from, to, userData)
|
|
30
|
+
reportData.push(...allData)
|
|
56
31
|
}
|
|
57
32
|
|
|
58
33
|
const groupIds = userData.groups.map(g => g.id)
|
|
59
34
|
const withoutGroupDevices = userData.byGroup ? userData.devices.filter(d => !groupIds.includes(d.groupId)) : userData.devices
|
|
60
35
|
|
|
36
|
+
const allData = await createTripReportByDevice(from, to, userData, withoutGroupDevices)
|
|
37
|
+
reportData.push(allData)
|
|
38
|
+
|
|
39
|
+
return reportData
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function createTripReportByDevice(from, to, userData, devices) {
|
|
61
43
|
const allData = {
|
|
62
44
|
devices: [],
|
|
63
|
-
xpert:
|
|
45
|
+
xpert: devices.filter(d => d.attributes.xpert).length > 0
|
|
64
46
|
}
|
|
65
47
|
|
|
66
|
-
|
|
67
|
-
const devicesToSlice = withoutGroupDevices.slice()
|
|
68
|
-
|
|
69
|
-
const arrayOfArrays = automaticReports.sliceArray(devicesToSlice)
|
|
70
|
-
let data = []
|
|
71
|
-
let stopsData = []
|
|
72
|
-
for (const a of arrayOfArrays) {
|
|
73
|
-
const response = await traccarInstance.reports.reportsTripsGet(from, to, a.map(d => d.id))
|
|
74
|
-
data = data.concat(response.data)
|
|
48
|
+
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
75
49
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
50
|
+
const devicesToSlice = devices.slice()
|
|
51
|
+
const data = await traccar.getTrips(traccarInstance, from, to, devicesToSlice)
|
|
52
|
+
const stopsData = await traccar.getStops(traccarInstance, from, to, devicesToSlice)
|
|
79
53
|
|
|
80
54
|
console.log('Trips:' + data.length)
|
|
81
55
|
|
|
82
|
-
if (data.length
|
|
83
|
-
|
|
56
|
+
if (data.length > 0) {
|
|
57
|
+
allData.devices = processDevices(from, to, devices, data, stopsData, userData)
|
|
58
|
+
|
|
84
59
|
}
|
|
85
60
|
|
|
86
|
-
allData
|
|
61
|
+
return allData
|
|
62
|
+
}
|
|
87
63
|
|
|
88
|
-
|
|
64
|
+
async function createTripReportByGroup(from, to, userData) {
|
|
65
|
+
const reportData = []
|
|
66
|
+
for (const g of userData.groups) {
|
|
67
|
+
const devices = userData.devices.filter(d => d.groupId === g.id)
|
|
68
|
+
console.log(g.name + ' devices:' + devices.length)
|
|
69
|
+
if(devices.length > 0) {
|
|
70
|
+
const groupData = {
|
|
71
|
+
devices: [],
|
|
72
|
+
group: g,
|
|
73
|
+
xpert: devices.filter(d => d.attributes.xpert).length > 0
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const response = await traccarInstance.reports.reportsTripsGet(from, to, null, [g.id])
|
|
77
|
+
const data = response.data
|
|
89
78
|
|
|
79
|
+
const stopsResponse = await traccarInstance.reports.reportsStopsGet(from, to, null, [g.id])
|
|
80
|
+
const stopsData = stopsResponse.data
|
|
81
|
+
|
|
82
|
+
devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
|
|
83
|
+
|
|
84
|
+
if (data.length > 0) {
|
|
85
|
+
|
|
86
|
+
console.log('Trips:' + data.length)
|
|
87
|
+
groupData.devices = processDevices(from, to, devices, data, stopsData, userData)
|
|
88
|
+
|
|
89
|
+
reportData.push(groupData)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
90
93
|
return reportData
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
async function createTripReportByDriver(from, to, userData){
|
|
94
|
-
|
|
95
97
|
const deviceIds = await drivers.devicesByDriver(traccarInstance, from, to, userData.drivers, userData.devices)
|
|
96
98
|
console.log(deviceIds.length)
|
|
97
99
|
|
package/src/util/driver.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
const
|
|
1
|
+
const traccar = require("./traccar");
|
|
2
2
|
|
|
3
3
|
//get devices used by each driver between two dates
|
|
4
|
-
async function devicesByDriver(
|
|
5
|
-
|
|
6
|
-
let tripsData = []
|
|
7
|
-
const arrayOfArrays = automaticReports.sliceArray(devices)
|
|
8
|
-
for (const a of arrayOfArrays) {
|
|
9
|
-
const response = await traccar.reports.reportsEventsGet(from, to, a.map(d => d.id), null, ['driverChanged'])
|
|
10
|
-
eventsData = eventsData.concat(response.data)
|
|
11
|
-
}
|
|
4
|
+
async function devicesByDriver(traccarInstance, from, to, drivers, devices){
|
|
5
|
+
const eventsData = traccar.getEvents(traccarInstance, from, to , devices, ['driverChanged'])
|
|
12
6
|
|
|
13
7
|
const deviceIds = []
|
|
14
8
|
for(const d of drivers) {
|
package/src/util/traccar.js
CHANGED
|
@@ -27,6 +27,19 @@ async function getTrips(traccar, from, to, devices){
|
|
|
27
27
|
return result.map(r => r.data).flat()
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
async function getStops(traccar, from, to, devices){
|
|
31
|
+
const devicesToSlice = devices.slice()
|
|
32
|
+
const arrayOfArrays = automaticReports.sliceArray(devicesToSlice)
|
|
33
|
+
let requests = []
|
|
34
|
+
for (const a of arrayOfArrays) {
|
|
35
|
+
const promise = traccar.reports.reportsStopsGet(from, to, a.map(d => d.id))
|
|
36
|
+
requests = requests.concat(promise)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const result = await Promise.all(requests)
|
|
40
|
+
return result.map(r => r.data).flat()
|
|
41
|
+
}
|
|
42
|
+
|
|
30
43
|
async function getEvents(traccar, from, to, devices, events){
|
|
31
44
|
const devicesToSlice = devices.slice()
|
|
32
45
|
const arrayOfArrays = automaticReports.sliceArray(devicesToSlice)
|
|
@@ -41,4 +54,5 @@ async function getEvents(traccar, from, to, devices, events){
|
|
|
41
54
|
|
|
42
55
|
exports.getRoute = getRoute
|
|
43
56
|
exports.getTrips = getTrips
|
|
57
|
+
exports.getStops = getStops
|
|
44
58
|
exports.getEvents = getEvents
|
package/src/util/utils.js
CHANGED
|
@@ -29,6 +29,21 @@ function coordsDistance(lon1, lat1, lon2, lat2) {
|
|
|
29
29
|
return (turf.distance(from, to, 'meters'))
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
function getDates(startDate, endDate) {
|
|
33
|
+
const dates = []
|
|
34
|
+
let currentDate = startDate
|
|
35
|
+
const addDays = function (days) {
|
|
36
|
+
const date = new Date(this.valueOf())
|
|
37
|
+
date.setDate(date.getDate() + days)
|
|
38
|
+
return date
|
|
39
|
+
}
|
|
40
|
+
while (currentDate <= endDate) {
|
|
41
|
+
dates.push(currentDate)
|
|
42
|
+
currentDate = addDays.call(currentDate, 1)
|
|
43
|
+
}
|
|
44
|
+
return dates
|
|
45
|
+
}
|
|
46
|
+
|
|
32
47
|
async function getImgFromUrl(hostname) {
|
|
33
48
|
try {
|
|
34
49
|
const img = new Image()
|
|
@@ -43,4 +58,5 @@ async function getImgFromUrl(hostname) {
|
|
|
43
58
|
exports.getImgFromUrl = getImgFromUrl
|
|
44
59
|
exports.convertMS = convertMS
|
|
45
60
|
exports.coordsDistance = coordsDistance
|
|
61
|
+
exports.getDates = getDates
|
|
46
62
|
|