1 |
d58f0fda
|
Cajova-Houba
|
<?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 |
fadc220b
|
Cajova-Houba
|
* Vrati posledni datum pro ktere existuji zaznamy v tabulce zaznam_cas.
|
24 |
4877913b
|
Cajova-Houba
|
* @return String Posledni datum pro ktere existuji zaznamy.
|
25 |
d58f0fda
|
Cajova-Houba
|
*/
|
26 |
01f99166
|
Jan Kohlíček
|
public static function lastInsertedDate()
|
27 |
|
|
{
|
28 |
fadc220b
|
Cajova-Houba
|
return DB::table('zaznam_cas')
|
29 |
|
|
->join('datum', 'zaznam_cas.datum_id', '=', 'datum.id')
|
30 |
|
|
->select(DB::raw(
|
31 |
|
|
'max(date(datum.od)) as last_day'
|
32 |
|
|
))
|
33 |
|
|
->get();
|
34 |
|
|
}
|
35 |
|
|
|
36 |
|
|
/**
|
37 |
|
|
* Vrati posledni datum pro ktere existuji zaznamy v tabulce zaznam_prum_den.
|
38 |
|
|
* @return String Posledni datum pro ktere existuji zaznamy.
|
39 |
|
|
*/
|
40 |
|
|
public static function lastDayAverageInsertedDate() {
|
41 |
|
|
return DB::table('zaznam_prum_den')
|
42 |
|
|
->join('datum', 'zaznam_prum_den.datum_id', '=', 'datum.id')
|
43 |
|
|
->select(DB::raw('
|
44 |
|
|
max(date(datum.od)) as last_day_from,
|
45 |
|
|
max(date(datum.do)) as last_day_to'
|
46 |
|
|
))
|
47 |
|
|
->get();
|
48 |
d58f0fda
|
Cajova-Houba
|
}
|
49 |
|
|
|
50 |
4877913b
|
Cajova-Houba
|
/**
|
51 |
|
|
* Vrati prumery dopravy v casovem useku podle typu vozidla.
|
52 |
|
|
*
|
53 |
|
|
* @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
|
54 |
|
|
* @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
|
55 |
|
|
* @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
|
56 |
|
|
* @param String $timeFrom Pocatecni cas. Null znamena 00:00.
|
57 |
|
|
* @param String $timeTo Koncovy cas. Null znamena 23:59.
|
58 |
|
|
* @param int $direction Pozadovany smer. Null znamena oba smery.
|
59 |
fadc220b
|
Cajova-Houba
|
* @return \stdClass Prumery dopravy pro casovy usek podle typu vozidla.
|
60 |
4877913b
|
Cajova-Houba
|
*/
|
61 |
01f99166
|
Jan Kohlíček
|
public static function averageByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction)
|
62 |
|
|
{
|
63 |
4877913b
|
Cajova-Houba
|
$lastDate = null;
|
64 |
|
|
$dir = null;
|
65 |
|
|
|
66 |
|
|
// jedno z omezujicich dat je null => ziskej posledni vlozene datum
|
67 |
|
|
if ($dateFrom == null || $dateTo == null) {
|
68 |
|
|
$lastDate = Zaznam::lastInsertedDate();
|
69 |
|
|
if ($lastDate == null) {
|
70 |
|
|
// database is empty
|
71 |
|
|
return "no-data";
|
72 |
|
|
} else {
|
73 |
|
|
$lastDate = $lastDate[0]->last_day;
|
74 |
|
|
}
|
75 |
|
|
}
|
76 |
|
|
|
77 |
|
|
// vytvoreni query - vsechno to dat dohromady
|
78 |
01f99166
|
Jan Kohlíček
|
$query = DB::table('zaznam_cas')
|
79 |
|
|
->join('zaznam', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
|
80 |
1adda1a9
|
Cajova-Houba
|
->join('datum', 'zaznam_cas.datum_id', '=', 'datum.id')
|
81 |
4877913b
|
Cajova-Houba
|
->select(DB::raw("
|
82 |
1adda1a9
|
Cajova-Houba
|
date_format(datum.od, '%H:%i') as timeFrom,
|
83 |
|
|
date_format(datum.do, '%H:%i') as timeTo,
|
84 |
01f99166
|
Jan Kohlíček
|
ROUND(avg(zaznam.rychlost_prumer),0) as speedAverage,
|
85 |
|
|
CAST(sum(zaznam.vozidla_pocet) as UNSIGNED) as numberVehicle,
|
86 |
|
|
ROUND(avg(zaznam.vozidla_pocet),0) as numberVehicleAverage,
|
87 |
|
|
zaznam.vozidlo_id as typeVehicleId
|
88 |
4877913b
|
Cajova-Houba
|
"))
|
89 |
1adda1a9
|
Cajova-Houba
|
->whereDate('datum.od', '>=', $dateFrom == null ? $lastDate : $dateFrom)
|
90 |
|
|
->whereDate('datum.do', '<=', $dateTo == null ? $lastDate : $dateTo)
|
91 |
|
|
->whereTime('datum.od', '>=', $timeFrom == null ? '08:00:00' : $timeFrom)
|
92 |
a86222c9
|
Cajova-Houba
|
->whereTime('datum.od', '<=', $timeTo == null ? '23:59:59' : $timeTo)
|
93 |
01f99166
|
Jan Kohlíček
|
->where('zaznam_cas.zarizeni_id', '=', $deviceId);
|
94 |
4877913b
|
Cajova-Houba
|
|
95 |
01f99166
|
Jan Kohlíček
|
if ($direction != null) {
|
96 |
4877913b
|
Cajova-Houba
|
$query = $query->where('zaznam_cas.smer', '=', $direction);
|
97 |
|
|
}
|
98 |
|
|
|
99 |
|
|
// pridat grouping a razeni nakonec
|
100 |
|
|
$query = $query
|
101 |
cd5a5e83
|
Cajova-Houba
|
->groupBy('timeFrom', 'zaznam.vozidlo_id')
|
102 |
|
|
->orderBy('timeFrom', 'asc')
|
103 |
01f99166
|
Jan Kohlíček
|
->orderBy('zaznam.vozidlo_id', 'asc');
|
104 |
4877913b
|
Cajova-Houba
|
|
105 |
|
|
return $query->get();
|
106 |
|
|
}
|
107 |
|
|
|
108 |
fadc220b
|
Cajova-Houba
|
/**
|
109 |
|
|
* Vrati denni prumery podle typu vozidla.
|
110 |
|
|
*
|
111 |
|
|
* @param integer $deviceId Id Zarizeni.
|
112 |
|
|
* @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
|
113 |
|
|
* @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
|
114 |
|
|
* @param integer $direction Pozadovany smer. Null znamena oba smery.
|
115 |
|
|
* @return \stdClass Denni prumery podle typu vozidla.
|
116 |
|
|
*/
|
117 |
|
|
public static function averageByDay($deviceId, $dateFrom, $dateTo, $direction) {
|
118 |
|
|
$lastDateFrom = null;
|
119 |
|
|
$lastDateTo = null;
|
120 |
|
|
$lastDate = null;
|
121 |
|
|
$dir = null;
|
122 |
|
|
|
123 |
|
|
// jedno z omezujicich dat je null => ziskej posledni vlozene datum
|
124 |
|
|
if ($dateFrom == null || $dateTo == null) {
|
125 |
|
|
$lastDate = Zaznam::lastDayAverageInsertedDate();
|
126 |
|
|
if ($lastDate == null) {
|
127 |
|
|
// database is empty
|
128 |
|
|
return "no-data";
|
129 |
|
|
} else {
|
130 |
|
|
$lastDateFrom = $lastDate[0]->last_day_from;
|
131 |
|
|
$lastDateTo = $lastDate[0]->last_day_to;
|
132 |
|
|
}
|
133 |
|
|
}
|
134 |
|
|
|
135 |
|
|
// vytvoreni query - vsechno to dat dohromady
|
136 |
|
|
$query = DB::table('zaznam_prum_den')
|
137 |
|
|
->join('datum', 'zaznam_prum_den.datum_id', '=', 'datum.id')
|
138 |
|
|
->select(DB::raw("
|
139 |
|
|
date_format(datum.od, '%Y-%m-%d') as date,
|
140 |
|
|
zaznam_prum_den.rychlost_prumer as speedAverage,
|
141 |
|
|
zaznam_prum_den.vozidla_pocet as numberVehicle,
|
142 |
|
|
zaznam_prum_den.vozidlo_id as typeVehicle
|
143 |
|
|
"))
|
144 |
|
|
->whereDate('datum.od', '>=', $dateFrom == null ? $lastDateFrom : $dateFrom)
|
145 |
|
|
->whereDate('datum.do', '<=', $dateTo == null ? $lastDateTo : $dateTo)
|
146 |
|
|
->where('zaznam_prum_den.zarizeni_id', '=', $deviceId);
|
147 |
|
|
|
148 |
|
|
if ($direction != null) {
|
149 |
|
|
$query = $query->where('zaznam_prum_den.smer', '=', $direction);
|
150 |
|
|
}
|
151 |
|
|
|
152 |
|
|
// pridat grouping a razeni nakonec
|
153 |
|
|
$query = $query
|
154 |
|
|
->groupBy('date', 'typeVehicle')
|
155 |
|
|
->orderBy('date', 'asc')
|
156 |
|
|
->orderBy('zaznam_prum_den.vozidlo_id', 'asc');
|
157 |
|
|
|
158 |
|
|
return $query->get();
|
159 |
|
|
|
160 |
|
|
}
|
161 |
|
|
|
162 |
d58f0fda
|
Cajova-Houba
|
/**
|
163 |
|
|
* Vrati zaznamy pro urcite zarizeni.
|
164 |
|
|
* Typ vozidla je vracen s kazdym zaznamem.
|
165 |
|
|
*
|
166 |
4877913b
|
Cajova-Houba
|
* @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
|
167 |
|
|
* @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
|
168 |
|
|
* @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
|
169 |
|
|
* @param String $timeFrom Pocatecni cas. Null znamena 00:00.
|
170 |
|
|
* @param String $timeTo Koncovy cas. Null znamena 23:59.
|
171 |
|
|
* @param int $direction Pozadovany smer. Null znamena oba smery.
|
172 |
|
|
* @return array Zaznamy o doprave v casovem useku pro dane zarizeni.
|
173 |
d58f0fda
|
Cajova-Houba
|
*/
|
174 |
01f99166
|
Jan Kohlíček
|
public static function findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction)
|
175 |
|
|
{
|
176 |
d58f0fda
|
Cajova-Houba
|
$dateTimeFrom = null;
|
177 |
|
|
$dateTimeTo = null;
|
178 |
|
|
$lastDate = null;
|
179 |
|
|
$dir = null;
|
180 |
|
|
|
181 |
|
|
// jedno z omezujicich dat je null => ziskej posledni vlozene datum
|
182 |
|
|
if ($dateFrom == null || $dateTo == null) {
|
183 |
|
|
$lastDate = Zaznam::lastInsertedDate();
|
184 |
|
|
if ($lastDate == null) {
|
185 |
|
|
// database is empty
|
186 |
|
|
return "no-data";
|
187 |
|
|
} else {
|
188 |
|
|
$lastDate = $lastDate[0]->last_day;
|
189 |
|
|
}
|
190 |
|
|
}
|
191 |
4877913b
|
Cajova-Houba
|
$dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
|
192 |
|
|
$dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
|
193 |
d58f0fda
|
Cajova-Houba
|
|
194 |
|
|
|
195 |
|
|
// vytvoreni query - vsechno to dat dohromady
|
196 |
|
|
$query = DB::table('zaznam')
|
197 |
|
|
->join('zaznam_cas', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
|
198 |
|
|
->join('vozidlo', 'zaznam.vozidlo_id', '=', 'vozidlo.id')
|
199 |
1adda1a9
|
Cajova-Houba
|
->join('datum', 'zaznam_cas.datum_id', '=', 'datum.id')
|
200 |
|
|
->select(
|
201 |
|
|
'datum.od as datetimeFrom',
|
202 |
|
|
'datum.do as datetimeTo',
|
203 |
d58f0fda
|
Cajova-Houba
|
'zaznam_cas.smer as direction',
|
204 |
|
|
'zaznam.rychlost_prumer as speedAverage',
|
205 |
1ae1ecb8
|
Cajova-Houba
|
'zaznam.vozidla_pocet as numberVehicle',
|
206 |
d58f0fda
|
Cajova-Houba
|
'vozidlo.nazev as typeVehicle',
|
207 |
1ae1ecb8
|
Cajova-Houba
|
'vozidlo.id as typeVehicleId')
|
208 |
1adda1a9
|
Cajova-Houba
|
->where('datum.od', '>=', $dateTimeFrom)
|
209 |
|
|
->where('datum.do', '<=', $dateTimeTo)
|
210 |
d58f0fda
|
Cajova-Houba
|
->where('zaznam_cas.zarizeni_id', '=', $deviceId);
|
211 |
|
|
|
212 |
01f99166
|
Jan Kohlíček
|
if ($direction != null) {
|
213 |
d58f0fda
|
Cajova-Houba
|
$query = $query->where('zaznam_cas.smer', '=', $direction);
|
214 |
|
|
}
|
215 |
|
|
|
216 |
36c6c78d
|
Cajova-Houba
|
$query = $query->orderBy('datetimeFrom', 'asc');
|
217 |
|
|
|
218 |
d58f0fda
|
Cajova-Houba
|
return $query->get();
|
219 |
|
|
}
|
220 |
4877913b
|
Cajova-Houba
|
|
221 |
|
|
/**
|
222 |
|
|
* Spoji datum a cas. Pokud je jedna ze slozek null,
|
223 |
|
|
* pouzije se defaultni hodnota.
|
224 |
|
|
*
|
225 |
|
|
* Vysledny datovy format: Y-m-d H:i:s
|
226 |
|
|
*
|
227 |
|
|
* @param String $date Datova slozka.
|
228 |
|
|
* @param String $time Casova slozka.
|
229 |
|
|
* @param String $defDate Defaultni hodnota pro datovou slozku.
|
230 |
|
|
* @param String $defTime Defaultni hodnota pro casovou slozku.
|
231 |
|
|
* @return String Spojene datum a cas.
|
232 |
|
|
*/
|
233 |
01f99166
|
Jan Kohlíček
|
private static function concatDateTime($date, $time, $defDate, $defTime)
|
234 |
|
|
{
|
235 |
4877913b
|
Cajova-Houba
|
$dateTime = null;
|
236 |
|
|
$d = $date == null ? $defDate : $date;
|
237 |
|
|
$t = $time == null ? $defTime : $time;
|
238 |
|
|
|
239 |
|
|
$dateTime = date('Y-m-d H:i:s', strtotime("$d $t"));
|
240 |
|
|
return $dateTime;
|
241 |
|
|
}
|
242 |
01f99166
|
Jan Kohlíček
|
|
243 |
d58f0fda
|
Cajova-Houba
|
}
|