Projekt

Obecné

Profil

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