Projekt

Obecné

Profil

Stáhnout (8.96 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 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
}