1
|
<?php
|
2
|
/**
|
3
|
* Created by PhpStorm.
|
4
|
* User: Zdenda
|
5
|
* Date: 23.4.2018
|
6
|
* Time: 12:47
|
7
|
*/
|
8
|
|
9
|
namespace App\Model;
|
10
|
|
11
|
use Illuminate\Support\Facades\DB;
|
12
|
|
13
|
|
14
|
/**
|
15
|
* Trida reprezentujici entitu zarizeni v databazi.
|
16
|
* @package App\Model
|
17
|
*/
|
18
|
class Zaznam extends BaseModel
|
19
|
{
|
20
|
protected $table = 'zaznam';
|
21
|
|
22
|
/**
|
23
|
* Vrati posledni datum pro ktere existuji nejake zaznamy.
|
24
|
* @return String Posledni datum pro ktere existuji zaznamy.
|
25
|
*/
|
26
|
public static function lastInsertedDate() {
|
27
|
return DB::table('zaznam_cas')->select(DB::raw('max(date(datetime_od)) as last_day'))->get();
|
28
|
}
|
29
|
|
30
|
/**
|
31
|
* Vrati prumery dopravy v casovem useku podle typu vozidla.
|
32
|
*
|
33
|
* @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
|
34
|
* @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
|
35
|
* @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
|
36
|
* @param String $timeFrom Pocatecni cas. Null znamena 00:00.
|
37
|
* @param String $timeTo Koncovy cas. Null znamena 23:59.
|
38
|
* @param int $direction Pozadovany smer. Null znamena oba smery.
|
39
|
* @return array Prumery dopravy pro casovy usek podle typu vozidla.
|
40
|
*/
|
41
|
public static function averageByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction) {
|
42
|
$dateTimeFrom = null;
|
43
|
$dateTimeTo = null;
|
44
|
$lastDate = null;
|
45
|
$dir = null;
|
46
|
|
47
|
// jedno z omezujicich dat je null => ziskej posledni vlozene datum
|
48
|
if ($dateFrom == null || $dateTo == null) {
|
49
|
$lastDate = Zaznam::lastInsertedDate();
|
50
|
if ($lastDate == null) {
|
51
|
// database is empty
|
52
|
return "no-data";
|
53
|
} else {
|
54
|
$lastDate = $lastDate[0]->last_day;
|
55
|
}
|
56
|
}
|
57
|
$dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
|
58
|
$dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
|
59
|
|
60
|
|
61
|
// vytvoreni query - vsechno to dat dohromady
|
62
|
$query = DB::table('zaznam')
|
63
|
->join('zaznam_cas', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
|
64
|
->join('vozidlo', 'zaznam.vozidlo_id', '=', 'vozidlo.id')
|
65
|
->select(DB::raw("
|
66
|
date_format(zaznam_cas.datetime_od, '%Y-%m-%d') as dateFrom,
|
67
|
date_format(zaznam_cas.datetime_do, '%Y-%m-%d') as dateTo,
|
68
|
date_format(zaznam_cas.datetime_od, '%H:%i:%s') as timeFrom,
|
69
|
date_format(zaznam_cas.datetime_do, '%H:%i:%s') as timeTo,
|
70
|
zaznam_cas.smer as direction,
|
71
|
avg(zaznam.rychlost_prumer) as speedAverage,
|
72
|
sum(zaznam.vozidla_pocet) as numberVehicle,
|
73
|
vozidlo.nazev as typeVehicle,
|
74
|
vozidlo.id as typeVehicleId
|
75
|
"))
|
76
|
->where('zaznam_cas.datetime_od', '>=', $dateTimeFrom)
|
77
|
->where('zaznam_cas.datetime_do', '<=', $dateTimeTo)
|
78
|
->where('zaznam_cas.zarizeni_id', '=', $deviceId)
|
79
|
;
|
80
|
|
81
|
if($direction != null) {
|
82
|
$query = $query->where('zaznam_cas.smer', '=', $direction);
|
83
|
}
|
84
|
|
85
|
// pridat grouping a razeni nakonec
|
86
|
$query = $query
|
87
|
->groupBy('timeFrom', 'timeTo', 'typeVehicleId')
|
88
|
->orderBy('dateFrom','timeFrom', 'typeVehicleId');
|
89
|
|
90
|
return $query->get();
|
91
|
}
|
92
|
|
93
|
/**
|
94
|
* Vrati zaznamy pro urcite zarizeni.
|
95
|
* Typ vozidla je vracen s kazdym zaznamem.
|
96
|
*
|
97
|
* @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
|
98
|
* @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
|
99
|
* @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
|
100
|
* @param String $timeFrom Pocatecni cas. Null znamena 00:00.
|
101
|
* @param String $timeTo Koncovy cas. Null znamena 23:59.
|
102
|
* @param int $direction Pozadovany smer. Null znamena oba smery.
|
103
|
* @return array Zaznamy o doprave v casovem useku pro dane zarizeni.
|
104
|
*/
|
105
|
public static function findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction) {
|
106
|
$dateTimeFrom = null;
|
107
|
$dateTimeTo = null;
|
108
|
$lastDate = null;
|
109
|
$dir = null;
|
110
|
|
111
|
// jedno z omezujicich dat je null => ziskej posledni vlozene datum
|
112
|
if ($dateFrom == null || $dateTo == null) {
|
113
|
$lastDate = Zaznam::lastInsertedDate();
|
114
|
if ($lastDate == null) {
|
115
|
// database is empty
|
116
|
return "no-data";
|
117
|
} else {
|
118
|
$lastDate = $lastDate[0]->last_day;
|
119
|
}
|
120
|
}
|
121
|
$dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
|
122
|
$dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
|
123
|
|
124
|
|
125
|
// vytvoreni query - vsechno to dat dohromady
|
126
|
$query = DB::table('zaznam')
|
127
|
->join('zaznam_cas', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
|
128
|
->join('vozidlo', 'zaznam.vozidlo_id', '=', 'vozidlo.id')
|
129
|
->select('zaznam_cas.datetime_od as datetimeFrom',
|
130
|
'zaznam_cas.datetime_do as datetimeTo',
|
131
|
'zaznam_cas.smer as direction',
|
132
|
'zaznam.rychlost_prumer as speedAverage',
|
133
|
'zaznam.vozidla_pocet as numberVehicle',
|
134
|
'vozidlo.nazev as typeVehicle',
|
135
|
'vozidlo.id as typeVehicleId')
|
136
|
->where('zaznam_cas.datetime_od', '>=', $dateTimeFrom)
|
137
|
->where('zaznam_cas.datetime_do', '<=', $dateTimeTo)
|
138
|
->where('zaznam_cas.zarizeni_id', '=', $deviceId);
|
139
|
|
140
|
if($direction != null) {
|
141
|
$query = $query->where('zaznam_cas.smer', '=', $direction);
|
142
|
}
|
143
|
|
144
|
return $query->get();
|
145
|
}
|
146
|
|
147
|
/**
|
148
|
* Spoji datum a cas. Pokud je jedna ze slozek null,
|
149
|
* pouzije se defaultni hodnota.
|
150
|
*
|
151
|
* Vysledny datovy format: Y-m-d H:i:s
|
152
|
*
|
153
|
* @param String $date Datova slozka.
|
154
|
* @param String $time Casova slozka.
|
155
|
* @param String $defDate Defaultni hodnota pro datovou slozku.
|
156
|
* @param String $defTime Defaultni hodnota pro casovou slozku.
|
157
|
* @return String Spojene datum a cas.
|
158
|
*/
|
159
|
private static function concatDateTime($date, $time, $defDate, $defTime) {
|
160
|
$dateTime = null;
|
161
|
$d = $date == null ? $defDate : $date;
|
162
|
$t = $time == null ? $defTime : $time;
|
163
|
|
164
|
$dateTime = date('Y-m-d H:i:s', strtotime("$d $t"));
|
165
|
return $dateTime;
|
166
|
}
|
167
|
}
|