Projekt

Obecné

Profil

Stáhnout (6.32 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','timeFrom', 'typeVehicleId');
89

    
90
        return $query->get();
91
    }
92

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

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

    
124

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

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

    
144
        return $query->get();
145
    }
146

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

    
164
        $dateTime = date('Y-m-d H:i:s', strtotime("$d $t"));
165
        return $dateTime;
166
    }
167
}
(6-6/6)