Projekt

Obecné

Profil

Stáhnout (6.21 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
     * Vrati posledni datum pro ktere existuji nejake zaznamy.
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 1adda1a9 Cajova-Houba
        return DB::table('datum')->select(DB::raw('max(date(od)) as last_day'))->get();
29 d58f0fda Cajova-Houba
    }
30
31 4877913b Cajova-Houba
    /**
32
     * Vrati prumery dopravy v casovem useku podle typu vozidla.
33
     *
34
     * @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
35
     * @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
36
     * @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
37
     * @param String $timeFrom Pocatecni cas. Null znamena 00:00.
38
     * @param String $timeTo Koncovy cas. Null znamena 23:59.
39
     * @param int $direction Pozadovany smer. Null znamena oba smery.
40
     * @return array Prumery dopravy pro casovy usek podle typu vozidla.
41
     */
42 01f99166 Jan Kohlíček
    public static function averageByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction)
43
    {
44 4877913b Cajova-Houba
        $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
58
        // vytvoreni query - vsechno to dat dohromady
59 01f99166 Jan Kohlíček
        $query = DB::table('zaznam_cas')
60
            ->join('zaznam', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
61 1adda1a9 Cajova-Houba
            ->join('datum', 'zaznam_cas.datum_id', '=', 'datum.id')
62 4877913b Cajova-Houba
            ->select(DB::raw("
63 1adda1a9 Cajova-Houba
                date_format(datum.od, '%H:%i') as timeFrom,
64
                date_format(datum.do, '%H:%i') as timeTo,
65 01f99166 Jan Kohlíček
                ROUND(avg(zaznam.rychlost_prumer),0) as speedAverage,
66
                CAST(sum(zaznam.vozidla_pocet) as UNSIGNED) as numberVehicle,
67
                ROUND(avg(zaznam.vozidla_pocet),0) as numberVehicleAverage,
68
                zaznam.vozidlo_id as typeVehicleId
69 4877913b Cajova-Houba
            "))
70 1adda1a9 Cajova-Houba
            ->whereDate('datum.od', '>=', $dateFrom == null ? $lastDate : $dateFrom)
71
            ->whereDate('datum.do', '<=', $dateTo == null ? $lastDate : $dateTo)
72
            ->whereTime('datum.od', '>=', $timeFrom == null ? '08:00:00' : $timeFrom)
73 a86222c9 Cajova-Houba
            ->whereTime('datum.od', '<=', $timeTo == null ? '23:59:59' : $timeTo)
74 01f99166 Jan Kohlíček
            ->where('zaznam_cas.zarizeni_id', '=', $deviceId);
75 4877913b Cajova-Houba
76 01f99166 Jan Kohlíček
        if ($direction != null) {
77 4877913b Cajova-Houba
            $query = $query->where('zaznam_cas.smer', '=', $direction);
78
        }
79
80
        // pridat grouping a razeni nakonec
81
        $query = $query
82 cd5a5e83 Cajova-Houba
            ->groupBy('timeFrom', 'zaznam.vozidlo_id')
83
            ->orderBy('timeFrom', 'asc')
84 01f99166 Jan Kohlíček
            ->orderBy('zaznam.vozidlo_id', 'asc');
85 4877913b Cajova-Houba
86
        return $query->get();
87
    }
88
89 d58f0fda Cajova-Houba
    /**
90
     * Vrati zaznamy pro urcite zarizeni.
91
     * Typ vozidla je vracen s kazdym zaznamem.
92
     *
93 4877913b Cajova-Houba
     * @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
94
     * @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
95
     * @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
96
     * @param String $timeFrom Pocatecni cas. Null znamena 00:00.
97
     * @param String $timeTo Koncovy cas. Null znamena 23:59.
98
     * @param int $direction Pozadovany smer. Null znamena oba smery.
99
     * @return array Zaznamy o doprave v casovem useku pro dane zarizeni.
100 d58f0fda Cajova-Houba
     */
101 01f99166 Jan Kohlíček
    public static function findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction)
102
    {
103 d58f0fda Cajova-Houba
        $dateTimeFrom = null;
104
        $dateTimeTo = null;
105
        $lastDate = null;
106
        $dir = null;
107
108
        // jedno z omezujicich dat je null => ziskej posledni vlozene datum
109
        if ($dateFrom == null || $dateTo == null) {
110
            $lastDate = Zaznam::lastInsertedDate();
111
            if ($lastDate == null) {
112
                // database is empty
113
                return "no-data";
114
            } else {
115
                $lastDate = $lastDate[0]->last_day;
116
            }
117
        }
118 4877913b Cajova-Houba
        $dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
119
        $dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
120 d58f0fda Cajova-Houba
121
122
        // vytvoreni query - vsechno to dat dohromady
123
        $query = DB::table('zaznam')
124
            ->join('zaznam_cas', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
125
            ->join('vozidlo', 'zaznam.vozidlo_id', '=', 'vozidlo.id')
126 1adda1a9 Cajova-Houba
            ->join('datum', 'zaznam_cas.datum_id', '=', 'datum.id')
127
            ->select(
128
                'datum.od as datetimeFrom',
129
                'datum.do as datetimeTo',
130 d58f0fda Cajova-Houba
                'zaznam_cas.smer as direction',
131
                'zaznam.rychlost_prumer as speedAverage',
132 1ae1ecb8 Cajova-Houba
                'zaznam.vozidla_pocet as numberVehicle',
133 d58f0fda Cajova-Houba
                'vozidlo.nazev as typeVehicle',
134 1ae1ecb8 Cajova-Houba
                'vozidlo.id as typeVehicleId')
135 1adda1a9 Cajova-Houba
            ->where('datum.od', '>=', $dateTimeFrom)
136
            ->where('datum.do', '<=', $dateTimeTo)
137 d58f0fda Cajova-Houba
            ->where('zaznam_cas.zarizeni_id', '=', $deviceId);
138
139 01f99166 Jan Kohlíček
        if ($direction != null) {
140 d58f0fda Cajova-Houba
            $query = $query->where('zaznam_cas.smer', '=', $direction);
141
        }
142
143 36c6c78d Cajova-Houba
        $query = $query->orderBy('datetimeFrom', 'asc');
144
145 d58f0fda Cajova-Houba
        return $query->get();
146
    }
147 4877913b Cajova-Houba
148
    /**
149
     * Spoji datum a cas. Pokud je jedna ze slozek null,
150
     * pouzije se defaultni hodnota.
151
     *
152
     * Vysledny datovy format: Y-m-d H:i:s
153
     *
154
     * @param String $date Datova slozka.
155
     * @param String $time Casova slozka.
156
     * @param String $defDate Defaultni hodnota pro datovou slozku.
157
     * @param String $defTime Defaultni hodnota pro casovou slozku.
158
     * @return String Spojene datum a cas.
159
     */
160 01f99166 Jan Kohlíček
    private static function concatDateTime($date, $time, $defDate, $defTime)
161
    {
162 4877913b Cajova-Houba
        $dateTime = null;
163
        $d = $date == null ? $defDate : $date;
164
        $t = $time == null ? $defTime : $time;
165
166
        $dateTime = date('Y-m-d H:i:s', strtotime("$d $t"));
167
        return $dateTime;
168
    }
169 01f99166 Jan Kohlíček
170 d58f0fda Cajova-Houba
}