Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 4877913b

Přidáno uživatelem Cajova-Houba před téměř 7 roky(ů)

refs #6844: Pridana implementace api endpointu pro ziskavani prumeru dopravy v casovem useku podle zarizeni.

Zobrazit rozdíly:

backend/app/Http/Controllers/DeviceController.php
21 21
    const DATE_FROM_PARAM = 'dateFrom';
22 22
    const DATE_TO_PARAM = 'dateTo';
23 23
    const TIME_FROM_PARAM = 'timeFrom';
24
    const TIME_FROM_TO = 'timeTo';
24
    const TIME_TO_PARAM = 'timeTo';
25 25
    const DIRECTION_PARAM = 'direction';
26 26

  
27 27

  
28 28
    public function getDevice(Request $request) {
29 29
        $address = null;
30 30
        $showDirection=0;
31
        if ($request->has(ADDRESS_PARAM)) {
32
            $address = $request->input(ADDRESS_PARAM);
31
        if ($request->has(self::ADDRESS_PARAM)) {
32
            $address = $request->input(self::ADDRESS_PARAM);
33 33
        }
34 34

  
35
        if ($request->has(SHOW_DIRECTION_PARAM) && $request->input(SHOW_DIRECTION_PARAM) == '1') {
35
        if ($request->has(self::SHOW_DIRECTION_PARAM) && $request->input(self::SHOW_DIRECTION_PARAM) == '1') {
36 36
            $showDirection = 1;
37 37
        }
38 38

  
......
59 59
     */
60 60
    public function getDeviceById(Request $request, $id) {
61 61

  
62
        $dateFrom = null;
63
        $dateTo = null;
64
        $timeFrom = null;
65
        $timeTo = null;
66
        $direction = null;
67

  
68 62
        // nacti parametry
69
        if ($request->has(DATE_FROM_PARAM)) {
70
            $dateFrom = $request->input(DATE_FROM_PARAM);
71
        }
72
        if ($request->has(DATE_TO_PARAM)) {
73
            $dateTo = $request->input(DATE_TO_PARAM);
74
        }
75
        if ($request->has(TIME_FROM_PARAM)) {
76
            $timeFrom = $request->input(TIME_FROM_PARAM);
77
        }
78
        if ($request->has(TIME_TO_PARAM)) {
79
            $timeTo = $request->input(TIME_TO_PARAM);
80
        }
81
        if ($request->has(DIRECTION_PARAM)) {
82
            $direction = $request->input(DIRECTION_PARAM);
83
        }
63
        $params = $this->loadDateTimeDirectionConstraints($request);
64
        $dateFrom = $params[self::DATE_FROM_PARAM];
65
        $dateTo = $params[self::DATE_TO_PARAM];
66
        $timeFrom = $params[self::TIME_FROM_PARAM];
67
        $timeTo = $params[self::TIME_TO_PARAM];
68
        $direction = $params[self::DIRECTION_PARAM];
84 69

  
85 70
        $device = Zarizeni::findByIdJoinAddress($id);
86 71
        if ($device != null) {
......
92 77
        return $device;
93 78
    }
94 79

  
80
    public function getTrafficAverageByDevice(Request $request, $id) {
81
        // nacti parametry
82
        $params = $this->loadDateTimeDirectionConstraints($request);
83
        $dateFrom = $params[self::DATE_FROM_PARAM];
84
        $dateTo = $params[self::DATE_TO_PARAM];
85
        $timeFrom = $params[self::TIME_FROM_PARAM];
86
        $timeTo = $params[self::TIME_TO_PARAM];
87
        $direction = $params[self::DIRECTION_PARAM];
88

  
89
        $device = Zarizeni::findByIdJoinAddress($id);
90
        if ($device != null) {
91
            $device[0]->traffic = Zaznam::averageByDevice($id, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction);
92
        } else if ($device == null || count($device) == 0) {
93
            return response('Not found.', 404);
94
        }
95

  
96
        return $device;
97
    }
98

  
95 99
    public function getAll() {
96 100
        return Zarizeni::getAllJoinAddress();
97 101
    }
......
109 113
            return $request->header("jwt");
110 114
        }
111 115
    }
116

  
117
    /**
118
     * Funkce nacte z requestu url parametry dateFrom, dateTo, timeFrom, timeTo, direciton a vrati je jako pole.
119
     * Defaultni hodnoty jsou null.
120
     *
121
     * @param Request $request Request ze ktere budou nacitany parametry.
122
     */
123
    private function loadDateTimeDirectionConstraints(Request $request) {
124
        $params = array();
125
        $params[self::DATE_FROM_PARAM] = null;
126
        $params[self::DATE_TO_PARAM] = null;
127
        $params[self::TIME_FROM_PARAM] = null;
128
        $params[self::TIME_TO_PARAM] = null;
129
        $params[self::DIRECTION_PARAM] = null;
130

  
131
        if ($request->has(self::DATE_FROM_PARAM)) {
132
            $params[self::DATE_FROM_PARAM] = $request->input(self::DATE_FROM_PARAM);
133
        }
134
        if ($request->has(self::DATE_TO_PARAM)) {
135
            $params[self::DATE_TO_PARAM] = $request->input(self::DATE_TO_PARAM);
136
        }
137
        if ($request->has(self::TIME_FROM_PARAM)) {
138
            $params[self::TIME_FROM_PARAM] = $request->input(self::TIME_FROM_PARAM);
139
        }
140
        if ($request->has(self::TIME_TO_PARAM)) {
141
            $params[self::TIME_TO_PARAM] = $request->input(self::TIME_TO_PARAM);
142
        }
143
        if ($request->has(self::DIRECTION_PARAM)) {
144
            $params[self::DIRECTION_PARAM] = $request->input(self::DIRECTION_PARAM);
145
        }
146

  
147
        return $params;
148
    }
112 149
}
backend/app/Http/routes.php
21 21
});
22 22

  
23 23
/**
24
 * Parametry v url:
25
 * address
26
 * showDirection
24
 * Vrati seznam mericich zarizeni.
27 25
 */
28 26
$app->get($apiUrlRoot.'devices', [
29 27
    'middleware' => 'jwtauth',
......
32 30

  
33 31

  
34 32
/**
35
 * Parametry v url:
36
 * dateFrom
37
 * dateTo
38
 * timeFrom
39
 * timeTo
40
 * direction
33
 * Vrati zaznamy o doprav e za casovy usek pro dane zarizeni.
41 34
 */
42 35
$app->get($apiUrlRoot.'devices/{id}', [
43 36
    'middleware' => 'jwtauth',
44 37
    'uses' => 'DeviceController@getDeviceById'
45 38
]);
46 39

  
40
/**
41
 * Vrati prumery dopravy pro danze zarizeni za casovy usek.
42
 */
43
$app->get($apiUrlRoot.'devices/{id}/time-period', [
44
   'middleware' => 'jwtauth',
45
    'uses' => 'DeviceController@getTrafficAverageByDevice'
46
]);
47

  
47 48

  
48 49
/**
49 50
 * Vrati vsechny typy aut.
backend/app/Model/Zarizeni.php
82 82
        return DB::table('zarizeni')
83 83
            ->join('ulice', 'zarizeni.ulice_id', '=', 'ulice.id')
84 84
            ->join('mesto', 'ulice.mesto_id', '=', 'mesto.id')
85
            ->select('zarizeni.id as id', 'zarizeni.smer_popis as name', 'ulice.nazev as street', 'ulice.id as street_id', 'mesto.nazev as town', 'mesto.id as town_id')
85
            ->select('zarizeni.id as id',
86
                'zarizeni.smer_popis as name',
87
                'ulice.nazev as street',
88
                'ulice.id as street_id',
89
                'mesto.nazev as town',
90
                'mesto.id as town_id')
86 91
            ->where('zarizeni.id', '=', $id)
87 92
            ->orderBy('zarizeni.id')
88 93
            ->get();
backend/app/Model/Zaznam.php
21 21

  
22 22
    /**
23 23
     * Vrati posledni datum pro ktere existuji nejake zaznamy.
24
     * @return String Posledni datum pro ktere existuji zaznamy.
24 25
     */
25 26
    public static function lastInsertedDate() {
26 27
        return DB::table('zaznam_cas')->select(DB::raw('max(date(datetime_od)) as last_day'))->get();
27 28
    }
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

  
29 93
    /**
30 94
     * Vrati zaznamy pro urcite zarizeni.
31 95
     * Typ vozidla je vracen s kazdym zaznamem.
32 96
     *
33
     * @param $deviceId Id zarizeni pro ktere budou vraceny zaznamy.
34
     * @param $dateFrom Pocatecni datum. Null znamená poledni vlozeny den.
35
     * @param $dateTo Koncove datum. Null znamena posledni vlozeny den.
36
     * @param $timeFrom Pocatecni cas. Null znamena 00:00.
37
     * @param $timeTo Koncovy cas. Null znamena 23:59.
38
     * @param $direction Pozadovany smer. Null znamena oba smery.
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.
39 104
     */
40 105
    public static function findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction) {
41 106
        $dateTimeFrom = null;
......
48 113
            $lastDate = Zaznam::lastInsertedDate();
49 114
            if ($lastDate == null) {
50 115
                // database is empty
51
                // todo: error codes
52 116
                return "no-data";
53 117
            } else {
54 118
                $lastDate = $lastDate[0]->last_day;
55 119
            }
56 120
        }
57
        if ($dateFrom == null) {
58
            $dateFrom = $lastDate;
59
        }
60
        if ($dateTo == null) {
61
            $dateTo = $lastDate;
62
        }
63
        // omezujici casy
64
        if ($timeFrom == null) {
65
            $timeFrom = '00:00:00';
66
        }
67
        if ($timeTo == null) {
68
            $timeTo = '23:59:59';
69
        }
70
        $dateTimeFrom = date('Y-m-d H:i:s', strtotime("$dateFrom $timeFrom"));
71
        $dateTimeTo = date('Y-m-d H:i:s', strtotime("$dateTo $timeTo"));
121
        $dateTimeFrom = self::concatDateTime($dateFrom, $timeFrom, $lastDate, '00:00:00');
122
        $dateTimeTo = self::concatDateTime($dateTo, $timeTo, $lastDate, '23:59:59');
72 123

  
73 124

  
74 125
        // vytvoreni query - vsechno to dat dohromady
......
92 143

  
93 144
        return $query->get();
94 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
    }
95 167
}

Také k dispozici: Unified diff