Commit 7716085e by Wolfgang Berndt

Push to public repo.

parents
File added
# Oxygen.Q Wartezeiten API
Um Ihren Kunden jederzeit die aktuelle Wartesituation direkt auf Ihrer Webseite anzeigen zu können, bietet Oxygen.Q ein einfaches REST-API an.
## Funktionsprinzip
![Schema](assets/schema.png)
## Voraussetzungen
1. Ihr System muss mit dem Internet verbunden sein.
2. Sie benötigen ein Zugriffstoken für Ihr System. Sollten Ihnen das Token noch nicht übermittelt worden sein, wenden Sie sich bitte an support@doohmedia.net.
## Schnittstellenbeschreibung
### Endpunkt
| **Methode** | **URL** | **Parameter** |
|-----------|-------|-------------|
| GET | https://public.oxygenq.com/statistics | Query-String-Parameter `token` mit dem Zugriffstoken.
Beispiel: `https://public.oxygenq.com/statistics?token=LIiWrwb7IsfhIY51apY4`
Das hier aufgeführte Token zeigt auf ein internes Demosystem und kann für Tests verwendet werden.
### Rückgabe
Die Antwort des Servers erfolgt immer als JSON-Body (Content-Type: `application/json; charset=utf-8`).
Im Erfolgsfall sieht das zurück gegebene JSON-Objekt folgendermaßen aus:
```
{
"last_seen_date": "2019-09-06T11:21:54.806Z",
"queue_stats": [
{
"name": "Bürgerbüro",
"ticket_num_today": 2,
"ticket_num_open": 1,
"ticket_num_in_call": 0,
"median_duration_till_call": 681,
"median_duration_till_close": 782.5
},
{
"name": "KFZ Meldestelle",
"ticket_num_today": 11,
"ticket_num_open": 2,
"ticket_num_in_call": 1,
"median_duration_till_call": 595,
"median_duration_till_close": 996
}
]
}
```
| Feld | Datentyp | Beschreibung |
|------|----------|--------------|
| last_seen_date | ISO 8601 Zeitstempel | Uhrzeit der letzten Datenübertragung vom System. |
| queue_stats | Array | Array mit der jeweiligen Wartesituation pro Rufzone/Anliegen. Wenn Ihr System keine Rufzonen benutzt, hat dieses Array nur ein einziges Element. |
| queue_stats.name | String | Name der jeweiligen Rufzone. Wenn Ihr Systen keine Rufzonen benutzt, ist dieser Wert `null`. |
| queue_stats.ticket_num_today | Number | Anzahl aller Tickets in dieser Rufzone seit Beginn des Tages (00:00 Uhr). |
| queue_stats.ticket_num_open | Number | Anzahl aller aktuell offenen/wartenden Tickets in dieser Rufzone. |
| queue_stats.ticket_num_in_call | Number | Anzahl aller momentan aufgerufenen Tickets in dieser Rufzone. |
| queue_stats.median_duration_till_call | Number | Mediane Wartezeit bis zum 1. Aufruf in dieser Rufzone. Der Wert wird über alle Tickets der letzten 24h berechnet (d.h. früh morgens bezieht dieser Wert die Wartezeiten der Tickets vom Vortag mit ein). |
| queue_stats.median_duration_till_close | Number | Mediane Bearbeitungszeit von Ticketerstellung bis -abschluß in dieser Rufzone. Auch dieser Wert wird über alle Tickets der letzten 24h berechnet. |
#### Fehlerbehandlung
Im Fehlerfall wird ein 4xx/5xx-Header gesetzt und der Rückgabewert enthält ein `error`-Feld mit näheren Informationen:
```
{
"error": "parameter error"
}
```
## Beispiel
Die unter `examples/index.html` abgelegte Webseite zeigt eine rudimentäre, clientseitige Abfrage der aktuellen Wartesituation mit JavaScript. Da das Token ausschließlich zur Abfrage der obigen Werte verwendet wird, spricht aus Sicherheitsgründen nichts gegen diesen clientseitigen Ansatz.
Eine serverseitiges Abfrage ist natürlich ebenfalls möglich, die Hintergrund-Aktualisierung der Daten obliegt dann der jeweiligen Kundenimplementierung.
\ No newline at end of file
<html>
<head>
<title>Wartezeiten</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1>Aktuelle Wartezeiten</h1>
<hr>
<table class="table table-bordered">
<thead>
<tr>
<th>Rufzone</th>
<th>Aktuell wartend</th>
<th>Aktuell in Bearbeitung</th>
<th>Wartezeit</th>
</tr>
</thead>
<tbody id="zones">
</tbody>
</table>
<small id="last_update"></small>
</div>
<script>
// individuelles Zugriffstoken
var token = "LIiWrwb7IsfhIY51apY4";
// Holt aktuelle Wartezeitinformationen vom Server und zeigt diese in der Tabelle an
function updateStatistics() {
$.ajax({
url: "https://public.oxygenq.com/statistics?token=" + token,
success: function (data) {
if (!(data && data.queue_stats)) return;
// aktuellen Tabelleninhalt löschen
$('#zones').empty();
// Zeitangabe aktualisieren
$('#last_update').text("Stand vom " + new Date(data.last_seen_date).toLocaleString());
// für jede Rufzone eine Tabellenzeile hinzufügen
data.queue_stats.forEach(function (stat) {
var waiting_time = Math.round(stat.ticket_num_open * stat.median_duration_till_call / 60);
$('#zones').append("<tr><td>" +
stat.name + "</td><td>" +
stat.ticket_num_open + "</td><td>" +
stat.ticket_num_in_call + "</td><td>" +
waiting_time + " Minuten</td></tr>");
});
}
});
}
$(document).ready(function() {
// Daten alle 20 Sekunden aktualisieren
setInterval(function () { updateStatistics(); }, 20*1000);
// und 1x sofort beim Start
updateStatistics();
});
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment