POST https://${serverName}:${port}/api/machines-effectivity/raw/${dateFrom}/${dateTo}
Accept: application/json
Content-Type: application/json
Cookie: securityToken=CARD:123456789
[193, 194, 196]
| Část | Typ | Popis |
|---|---|---|
| dateFrom, dateTo | path, yyyy-MM-dd |
Období včetně obou dní. Maximální rozsah 365 dní; dateTo se ořízne na dnešek, pokud je v budoucnosti. |
| tělo požadavku | JSON: long[] |
Pole ID strojů, např. [193, 194, 196]. |
| odpověď | application/json |
Objekt se 3 seznamy (níže). |
Každý záznam v machineEffectivityIntervals patří do jednoho kalendářního dne. Záznam, který běží přes půlnoc, se rozdělí na víc řádků (jeden za každý den) — čas se ořízne na daný den a hodnotová pole se rozdělí poměrně podle času.
Díky tomu jde libovolná denní metrika spočítat přes GROUP BY (machineId, den) + SUM, bez ručního dělení přes půlnoc na straně klienta. Součet částí odpovídá původnímu celku.
| Pole | Typ | Obsah |
|---|---|---|
| machineEffectivityIntervals | Interval[] |
Detailní záznamy (práce, stavy strojů, aktivity, odstávky), každý v rámci jednoho dne. |
| nonconformities | Nonconformity[] |
Nepodařky jako bodové události (jeden časový okamžik). Pro výpočet kvality. |
| machines | Machine[] |
Číselník strojů: pracovní hodiny a režim pracovních dní. Pro výpočet plánovaného/dostupného času. |
Obsahuje 4 podtypy řádků rozlišené přítomností polí. Společný základ: machineId (long), startedAt, finishedAt (yyyy-MM-dd HH:mm, vždy v rámci jednoho dne).
Pracovní záznam (přítomné stageId, batchId, goodsId):
| Sloupec | Typ | Jedn. | Význam |
|---|---|---|---|
| personId / personName | long / string | — | Operátor. |
| stageId / stageName | long / string | — | Výrobní operace. |
| batchId / batchQuantity | long / long | — | Dávka a její množství. |
| goodsId / goodsName | long / string | — | Vyráběné zboží. |
| workDurationSeconds | number | s | Reálný čas práce operátora (Čas pracovníka [min]) (rozdělený na den). |
| machineWorkDurationSeconds | number | s | Doba práce stroje ze záznamu práce (Čas stroje [min]) (rozdělená na den). |
| quotaSeconds | number | s | Normočas/kvóta (rozdělený na den). |
| workRecordQuantity | number | ks | Vyrobené množství = dobré kusy (rozdělené na den). |
| effectivityPct | number | % | 100 × quotaSeconds / workDurationSeconds. |
Aktivita (přítomné activityId):
| Sloupec | Typ | Význam |
|---|---|---|
| personId / personName | long / string | Operátor. |
| activityId / activityName | long / string | Aktivita (např. „čeká na mistra“). |
Odstávka (přítomné outageId):
| Sloupec | Typ | Význam |
|---|---|---|
| personId / personName | long / string | Zadavatel. |
| outageId | long | ID odstávky. |
| outageKind | enum | PLANNED / UNPLANNED / … |
| outageState | string | Stav odstávky. |
Stav stroje (přítomné running):
| Sloupec | Typ | Význam |
|---|---|---|
| running | boolean | Zda stroj běžel. Čas běhu = součet trvání řádků s running=true. |
| downtimeReasons | string[] | Důvody prostoje (prázdné, když běžel). Pro rozpad prostojů. |
Rozdělení přes půlnoc — např. odstávka
2026-06-15 → 2026-06-19se vrátí jako 4 řádky (15., 16., 17., 18.), každý oříznutý na svůj den. Díky tomu denní součty vždy sedí.
Bodové události — každý nepodařek má jeden časový okamžik, takže už patří do jednoho dne (nedělí se).
| Sloupec | Typ | Jedn. | Význam |
|---|---|---|---|
| machineId | long | — | Stroj. |
| time | datetime | — | Kdy nepodařek vznikl (yyyy-MM-dd HH:mm). |
| count | number | ks | Počet zmetků = nok. |
Pro každý požadovaný stroj. Z toho se dopočítá plánovaný/dostupný čas.
| Sloupec | Typ | Jedn. | Význam |
|---|---|---|---|
| machineId | long | — | Stroj. |
| name | string | — | Název stroje. |
| workingHours | number | h/den | Pracovní hodiny stroje za pracovní den. |
| workingDays | enum | — | WORKING_DAYS = běží v pracovní dny, NON_STOP = běží každý den. |
Dostupné hodiny za den = workingHours, pokud je daný den pro stroj pracovní, jinak 0. U
NON_STOPje pracovní každý den; uWORKING_DAYSjsou to běžné pracovní dny (Po–Pá mimo svátků) podle kalendáře klienta.
Nejprve se denní vstupy seskupí přes GROUP BY (machineId, den):
workedSeconds = Σ trvání řádků stavu, kde running = true
machineWorkSeconds = Σ machineWorkDurationSeconds (pracovní záznamy)
quotaSeconds = min(Σ quotaSeconds, Σ machineWorkDurationSeconds) (pracovní záznamy)
okQty = Σ workRecordQuantity (pracovní záznamy)
nokQty = Σ count (nonconformities)
availableHours = workingHours × (pracovní den? 1 : 0) // z číselníku machines
A z nich metriky:
availability = workedHours / availableHours (max 1)
performance = quotaSeconds / machineWorkSeconds (max 1)
quality = okQty / (okQty + nokQty) (1, pokud nejsou kusy)
teepAvailability = workedHours / (24 × dní × počet strojů) (max 1)
OEE = availability × performance × quality
TEEP = teepAvailability × performance × quality
Protože jsou všechny záznamy ohraničené na jeden den, tyto součty i metriky fungují stejně za den, za stroj i za celé období — mění se jen úroveň seskupení.
Stroj 193, den 2026-06-02. Z odpovědi se pro tuto dvojici (stroj, den) nejprve seskupí vstupy:
| Vstup | Odkud | Hodnota |
|---|---|---|
| workedSeconds | intervaly, kde running = true → Σ trvání |
25 200 s (= 7,0 h) |
| machineWorkSeconds | pracovní záznamy -> Σ machineWorkDurationSeconds |
23 800 s |
| quotaSeconds | pracovní záznamy → Σ quotaSeconds |
20 230 s |
| okQty | pracovní záznamy → Σ workRecordQuantity |
40 ks |
| nokQty | nonconformities → Σ count |
2 ks |
| availableHours | machines: workingHours (2. 6. je pracovní den) |
8 h |
A dosadí se do vzorců:
availability = 7,0 / 8 = 0,875
performance = 20 230 / 23 800 = 0,850
quality = 40 / (40 + 2) = 0,952
OEE = 0,875 × 0,850 × 0,952 = 0,708 → 71,0 %
POST machines-effectivity/raw/2026-05-18/2026-06-17 · tělo [193,194,196]
{
"machineEffectivityIntervals": [
// pracovní záznam
{ "startedAt": "2026-06-13 13:19", "finishedAt": "2026-06-13 13:19", "machineId": 190,
"personId": 2154, "personName": "…", "stageId": 183, "stageName": "…",
"batchId": 498576, "batchQuantity": 1, "goodsId": 134501, "goodsName": "…",
"workDurationSeconds": 7.947, "machineWorkDurationSeconds": 7.5, "quotaSeconds": 1.1315,
"workRecordQuantity": 1, "effectivityPct": 14.2386 },
// aktivita
{ "startedAt": "2026-06-08 09:01", "finishedAt": "2026-06-08 10:43", "machineId": 196,
"personId": 1466, "personName": "…", "activityId": 39862, "activityName": "…" },
// odstávka (jeden den z rozdělené 15.–19.)
{ "startedAt": "2026-06-15 00:00", "finishedAt": "2026-06-16 00:00", "machineId": 193,
"personId": 1, "personName": "…", "outageId": 57, "outageState": "…", "outageKind": "PLANNED" },
// stav stroje
{ "startedAt": "2026-06-09 14:42", "finishedAt": "2026-06-09 17:15", "machineId": 73,
"running": true, "downtimeReasons": [] }
],
"nonconformities": [
{ "machineId": 193, "time": "2026-05-21 11:42", "count": 2 }
],
"machines": [
{ "machineId": 193, "name": "…", "workingHours": 8, "workingDays": "WORKING_DAYS" }
]
}
To samé jako SQL-like dotaz nad třemi seznamy (pro všechny stroje a dny naráz):
WITH worked AS ( -- čas běhu ze stavů
SELECT machineId, date(startedAt) AS day,
SUM(EXTRACT(EPOCH FROM finishedAt - startedAt)) AS workedSeconds
FROM intervals WHERE running = true
GROUP BY machineId, date(startedAt)
),
prod AS ( -- kvóta (stropovaná dobou práce stroje) a dobré kusy z pracovních záznamů
SELECT machineId,
date(startedAt) AS day,
LEAST(SUM(quotaSeconds), SUM(machineWorkDurationSeconds)) AS quotaSeconds,
SUM(machineWorkDurationSeconds) AS machineWorkSeconds,
SUM(workRecordQuantity) AS okQty
FROM intervals WHERE stageId IS NOT NULL
GROUP BY machineId, date(startedAt)
),
nok AS ( -- nepodařky
SELECT machineId, date(time) AS day, SUM(count) AS nokQty
FROM nonconformities GROUP BY machineId, date(time)
)
SELECT w.machineId, w.day,
(w.workedSeconds/3600.0) / m.workingHours AS availability,
p.quotaSeconds / w.machineWorkSeconds AS performance,
p.okQty / (p.okQty + COALESCE(n.nokQty,0)) AS quality,
(w.workedSeconds/3600.0)/m.workingHours
* p.quotaSeconds/w.workedSeconds
* p.okQty/(p.okQty+COALESCE(n.nokQty,0)) AS oee
FROM worked w
JOIN machines m ON m.machineId = w.machineId
LEFT JOIN prod p ON p.machineId = w.machineId AND p.day = w.day
LEFT JOIN nok n ON n.machineId = w.machineId AND n.day = w.day;
Pro souhrn za stroj nebo za celé období stačí vynechat day ze seskupení. availableHours = workingHours × počet pracovních dní stroje v daném rozsahu (u NON_STOP každý den).