Projekt

Obecné

Profil

Stáhnout (6.44 KB) Statistiky
| Větev: | Revize:
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', 'asc')
89
                ->orderBy('timeFrom', 'asc')
90
                ->orderBy('typeVehicleId', 'asc');
91

    
92
        return $query->get();
93
    }
94

    
95
    /**
96
     * Vrati zaznamy pro urcite zarizeni.
97
     * Typ vozidla je vracen s kazdym zaznamem.
98
     *
99
     * @param String $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
100
     * @param String $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
101
     * @param String $dateTo Koncove datum. Null znamena posledni vlozeny den.
102
     * @param String $timeFrom Pocatecni cas. Null znamena 00:00.
103
     * @param String $timeTo Koncovy cas. Null znamena 23:59.
104
     * @param int $direction Pozadovany smer. Null znamena oba smery.
105
     * @return array Zaznamy o doprave v casovem useku pro dane zarizeni.
106
     */
107
    public static function findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction) {
108
        $dateTimeFrom = null;
109
        $dateTimeTo = null;
110
        $lastDate = null;
111
        $dir = null;
112

    
113
        // jedno z omezujicich dat je null => ziskej posledni vlozene datum
114
        if ($dateFrom == null || $dateTo == null) {
115
            $lastDate = Zaznam::lastInsertedDate();
116
            if ($lastDate == null) {
117
                // database is empty
118
                return "no-data";
119
            } else {
120
                $lastDate = $lastDate[0]->last_day;
121
            }
122
        }
123
        $dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
124
        $dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
125

    
126

    
127
        // vytvoreni query - vsechno to dat dohromady
128
        $query = DB::table('zaznam')
129
            ->join('zaznam_cas', 'zaznam.zaznam_cas_id', '=', 'zaznam_cas.id')
130
            ->join('vozidlo', 'zaznam.vozidlo_id', '=', 'vozidlo.id')
131
            ->select('zaznam_cas.datetime_od as datetimeFrom',
132
                'zaznam_cas.datetime_do as datetimeTo',
133
                'zaznam_cas.smer as direction',
134
                'zaznam.rychlost_prumer as speedAverage',
135
                'zaznam.vozidla_pocet as numberVehicle',
136
                'vozidlo.nazev as typeVehicle',
137
                'vozidlo.id as typeVehicleId')
138
            ->where('zaznam_cas.datetime_od', '>=', $dateTimeFrom)
139
            ->where('zaznam_cas.datetime_do', '<=', $dateTimeTo)
140
            ->where('zaznam_cas.zarizeni_id', '=', $deviceId);
141

    
142
        if($direction != null) {
143
            $query = $query->where('zaznam_cas.smer', '=', $direction);
144
        }
145

    
146
        $query = $query->orderBy('datetimeFrom', 'asc');
147

    
148
        return $query->get();
149
    }
150

    
151
    /**
152
     * Spoji datum a cas. Pokud je jedna ze slozek null,
153
     * pouzije se defaultni hodnota.
154
     *
155
     * Vysledny datovy format: Y-m-d H:i:s
156
     *
157
     * @param String $date Datova slozka.
158
     * @param String $time Casova slozka.
159
     * @param String $defDate Defaultni hodnota pro datovou slozku.
160
     * @param String $defTime Defaultni hodnota pro casovou slozku.
161
     * @return String Spojene datum a cas.
162
     */
163
    private static function concatDateTime($date, $time, $defDate, $defTime) {
164
        $dateTime = null;
165
        $d = $date == null ? $defDate : $date;
166
        $t = $time == null ? $defTime : $time;
167

    
168
        $dateTime = date('Y-m-d H:i:s', strtotime("$d $t"));
169
        return $dateTime;
170
    }
171
}
(6-6/6)