Poprawki statystyk

This commit is contained in:
2022-06-27 21:32:00 +02:00
parent b91e58f9af
commit 4e80e73949
10 changed files with 172 additions and 137 deletions
+15 -7
View File
@@ -8,31 +8,32 @@
</h2> </h2>
<div class="loading" v-if="!store.dispatcherStatsData">Ładowanie...</div> <div class="loading" v-if="!store.dispatcherStatsData">Ładowanie...</div>
<div class="loading" v-else-if="!store.dispatcherStatsData._count._all">Ten dyżurny nie ma jeszcze szczegółowych statystyk!</div>
<div v-else> <div v-else>
<h3>STATYSTYKI WYSTAWIONYCH ROZKŁADÓW</h3> <h3>STATYSTYKI WYSTAWIONYCH ROZKŁADÓW</h3>
<div class="info-stats"> <div class="info-stats" v-if="store.dispatcherStatsData._count._all">
<span class="stat-badge"> <span class="stat-badge">
<span>LICZBA</span> <span>LICZBA</span>
<span>{{ store.dispatcherStatsData.count }}</span> <span>{{ store.dispatcherStatsData._count._all }}</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>SUMA (KM)</span> <span>SUMA (KM)</span>
<span>{{ store.dispatcherStatsData.sumDistance.toFixed(2) }}km</span> <span>{{ store.dispatcherStatsData._sum.routeDistance.toFixed(2) }}km</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>NAJDŁUŻSZY</span> <span>NAJDŁUŻSZY</span>
<span>{{ store.dispatcherStatsData.maxTimetableDistance }}km</span> <span>{{ store.dispatcherStatsData._max.routeDistance.toFixed(2) }}km</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>ŚREDNIO</span> <span>ŚREDNIO</span>
<span>{{ store.dispatcherStatsData.avgTimetableDistance }}km</span> <span>{{ store.dispatcherStatsData._avg.routeDistance.toFixed(2) }}km</span>
</span> </span>
</div> </div>
<h3>OSTATNIE WYSTAWIONE ROZKŁADY</h3> <h3>OSTATNIE WYSTAWIONE ROZKŁADY</h3>
<div class="last-timetables"> <div class="last-timetables">
<div class="timetable-row" v-for="timetable in store.dispatcherStatsData.timetables"> <div class="timetable-row" v-for="timetable in timetables">
<span>#{{ timetable.timetableId }}</span> <span>#{{ timetable.timetableId }}</span>
<span>{{ timetable.routeDistance }}km</span> <span>{{ timetable.routeDistance }}km</span>
<span> <span>
@@ -49,6 +50,7 @@
<script lang="ts"> <script lang="ts">
import { DispatcherStatsAPIData } from '@/scripts/interfaces/api/DispatcherStatsAPIData'; import { DispatcherStatsAPIData } from '@/scripts/interfaces/api/DispatcherStatsAPIData';
import { TimetableHistory } from '@/scripts/interfaces/api/TimetablesAPIData';
import { URLs } from '@/scripts/utils/apiURLs'; import { URLs } from '@/scripts/utils/apiURLs';
import { useStore } from '@/store/store'; import { useStore } from '@/store/store';
import axios from 'axios'; import axios from 'axios';
@@ -67,6 +69,7 @@ export default defineComponent({
data() { data() {
return { return {
lastDispatcherName: '', lastDispatcherName: '',
timetables: [] as TimetableHistory[],
}; };
}, },
@@ -82,7 +85,12 @@ export default defineComponent({
await axios.get(`${URLs.stacjownikAPI}/api/getDispatcherInfo?name=${this.store.dispatcherStatsName}`) await axios.get(`${URLs.stacjownikAPI}/api/getDispatcherInfo?name=${this.store.dispatcherStatsName}`)
).data; ).data;
this.store.dispatcherStatsData = statsData.response; const timetables: TimetableHistory[] = await (
await axios.get(`${URLs.stacjownikAPI}/api/getTimetables?authorName=${this.store.dispatcherStatsName}`)
).data;
this.timetables = timetables;
this.store.dispatcherStatsData = statsData;
}, },
closeCard() { closeCard() {
+12 -9
View File
@@ -10,36 +10,39 @@
<div class="loading" v-if="!store.driverStatsData">Ładowanie...</div> <div class="loading" v-if="!store.driverStatsData">Ładowanie...</div>
<div v-else> <div v-else>
<div class="info-stats"> <div class="info-stats" v-if="store.driverStatsData._sum.routeDistance != null">
<span class="stat-badge"> <span class="stat-badge">
<span>PRZEBYTO</span> <span>PRZEBYTO</span>
<span>{{ store.driverStatsData.confirmedDistance.toFixed(2) }}km</span> <span>{{ store.driverStatsData._sum.routeDistance.toFixed(2) }}km</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>PORZUCONO</span> <span>PORZUCONO</span>
<span> <span>
{{ (store.driverStatsData.totalDistance - store.driverStatsData.confirmedDistance).toFixed(2) }}km {{ (store.driverStatsData._sum.routeDistance - store.driverStatsData._sum.currentDistance).toFixed(2) }}km
</span> </span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>WYPEŁNIONO</span> <span>WYPEŁNIONO</span>
<span>{{ store.driverStatsData.fulfilled }} RJ</span> <span>{{ store.driverStatsData._count.fulfilled }} RJ</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>PORZUCONO</span> <span>PORZUCONO</span>
<span>{{ store.driverStatsData.abandoned }} RJ</span> <span>{{ store.driverStatsData._count._all - store.driverStatsData._count.fulfilled }} RJ</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>ZATWIERDZONO</span> <span>ZATWIERDZONO</span>
<span>{{ store.driverStatsData.confirmedStops }} stacji</span> <span>{{ store.driverStatsData._sum.confirmedStopsCount }} stacji</span>
</span> </span>
<span class="stat-badge"> <span class="stat-badge">
<span>PORZUCONO</span> <span>PORZUCONO</span>
<span>{{ store.driverStatsData.totalStops - store.driverStatsData.confirmedStops }} stacji</span> <span>
{{ store.driverStatsData._sum.allStopsCount - store.driverStatsData._sum.confirmedStopsCount }}
stacji
</span>
</span> </span>
</div> </div>
</div> </div>
@@ -87,10 +90,10 @@ export default defineComponent({
).data; ).data;
const recentTimetablesData: TimetableHistory[] = await ( const recentTimetablesData: TimetableHistory[] = await (
await axios.get(`${URLs.stacjownikAPI}/api/getTimetables?driver=${this.store.driverStatsName}`) await axios.get(`${URLs.stacjownikAPI}/api/getTimetables?driverName=${this.store.driverStatsName}`)
).data; ).data;
this.store.driverStatsData = statsData.response; this.store.driverStatsData = statsData;
this.lastTimetables = recentTimetablesData || []; this.lastTimetables = recentTimetablesData || [];
}, },
@@ -14,7 +14,7 @@
:filters="journalTimetableFilters" :filters="journalTimetableFilters"
/> />
<button <!-- <button
class="btn btn--option" class="btn btn--option"
:disabled="store.driverStatsName == ''" :disabled="store.driverStatsName == ''"
@click="() => (statsCardOpen = !statsCardOpen)" @click="() => (statsCardOpen = !statsCardOpen)"
@@ -23,7 +23,7 @@
Statystyki maszynisty <b>{{ store.driverStatsName }}</b> Statystyki maszynisty <b>{{ store.driverStatsName }}</b>
</span> </span>
<span v-else>Statystyki maszynisty niedostępne</span> <span v-else>Statystyki maszynisty niedostępne</span>
</button> </button> -->
</div> </div>
<div class="journal-list"> <div class="journal-list">
+16 -3
View File
@@ -9,8 +9,8 @@
v-model="option.value" v-model="option.value"
@change="handleChange" @change="handleChange"
/> />
<span :class="option.section + (option.value ? ' checked' : '')" <span v-if="option.id != 'troll'" :class="option.section + (option.value ? ' checked' : '')"
>{{ $t(`filters.${option.id}`) }} >{{ option.id != 'troll' ? $t(`filters.${option.id}`) : 'ARKADIA ZDRÓJ' }}
</span> </span>
</label> </label>
</div> </div>
@@ -37,6 +37,11 @@ export default defineComponent({
emits: ['optionChange'], emits: ['optionChange'],
methods: { methods: {
handleChange() { handleChange() {
if (this.option.name == 'troll') {
location.href = 'https://www.youtube.com/watch?v=HIcSWuKMwOw';
return;
}
this.$emit('optionChange', { this.$emit('optionChange', {
name: this.option.name, name: this.option.name,
value: this.option.value, value: this.option.value,
@@ -50,7 +55,7 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../styles/option.scss"; @import '../../styles/option.scss';
$accessCol: #e03b07; $accessCol: #e03b07;
$controlCol: #0085ff; $controlCol: #0085ff;
@@ -110,6 +115,14 @@ $routesCol: #9049c0;
} }
} }
&.troll {
background-color: firebrick;
&::before {
box-shadow: 0 0 6px 1px firebrick;
}
}
&.mode { &.mode {
background-color: lightgreen; background-color: lightgreen;
color: black; color: black;
+77 -61
View File
@@ -1,5 +1,6 @@
{ {
"options": [{ "options": [
{
"id": "default", "id": "default",
"name": "default", "name": "default",
"iconName": "td2", "iconName": "td2",
@@ -32,12 +33,12 @@
"defaultValue": true "defaultValue": true
}, },
{ {
"id": "non-public", "id": "non-public",
"name": "nonPublic", "name": "nonPublic",
"iconName": "user", "iconName": "user",
"section": "access", "section": "access",
"value": true, "value": true,
"defaultValue": true "defaultValue": true
}, },
{ {
"id": "unavailable", "id": "unavailable",
@@ -47,7 +48,7 @@
"value": false, "value": false,
"defaultValue": false "defaultValue": false
}, },
{ {
"id": "abandoned", "id": "abandoned",
"name": "abandoned", "name": "abandoned",
"iconName": "user", "iconName": "user",
@@ -162,7 +163,7 @@
"value": true, "value": true,
"defaultValue": true "defaultValue": true
}, },
{ {
"id": "endingStatus", "id": "endingStatus",
"name": "endingStatus", "name": "endingStatus",
"iconName": "", "iconName": "",
@@ -181,25 +182,35 @@
"defaultValue": true "defaultValue": true
}, },
{ {
"id": "noSpaceStatus", "id": "noSpaceStatus",
"name": "noSpaceStatus", "name": "noSpaceStatus",
"iconName": "", "iconName": "",
"section": "status", "section": "status",
"value": true, "value": true,
"defaultValue": true "defaultValue": true
}, },
{ {
"id": "unavailableStatus", "id": "unavailableStatus",
"name": "unavailableStatus", "name": "unavailableStatus",
"iconName": "", "iconName": "",
"section": "status", "section": "status",
"value": true, "value": true,
"defaultValue": true "defaultValue": true
} },
{
"id": "troll",
"name": "troll",
"iconName": "",
"section": "troll",
"value": true,
"defaultValue": true
}
], ],
"sliders": [{ "sliders": [
{
"id": "min-lvl", "id": "min-lvl",
"name": "minLevel", "name": "minLevel",
"minRange": 0, "minRange": 0,
@@ -248,39 +259,44 @@
"defaultValue": 0 "defaultValue": 0
} }
], ],
"modes": [{ "modes": [
"id": "include-selected", {
"name": "include-selected", "id": "include-selected",
"iconName": "", "name": "include-selected",
"section": "mode", "iconName": "",
"value": true, "section": "mode",
"defaultValue": true "value": true,
}, { "defaultValue": true
"id": "save", },
"name": "save", {
"iconName": "", "id": "save",
"section": "mode", "name": "save",
"value": true, "iconName": "",
"defaultValue": true "section": "mode",
}], "value": true,
"regions": [{ "defaultValue": true
"id": "eu", }
"value": "PL1" ],
}, "regions": [
{ {
"id": "cae", "id": "eu",
"value": "PL2" "value": "PL1"
}, },
{ {
"id": "usw", "id": "cae",
"value": "DE" "value": "PL2"
}, },
{ {
"id": "us", "id": "usw",
"value": "CZE" "value": "DE"
}, },
{ {
"id": "ru", "id": "us",
"value": "ENG" "value": "CZE"
}] },
} {
"id": "ru",
"value": "ENG"
}
]
}
@@ -1,40 +1,27 @@
export interface DispatcherTimetable { export interface Sum {
timetableId: number;
trainNo: number;
trainCategoryCode: string;
driverId: number;
driverName: string;
route: string;
twr: boolean;
skr: boolean;
sceneriesString: string;
routeDistance: number; routeDistance: number;
currentDistance: number;
confirmedStopsCount: number;
allStopsCount: number;
beginDate: Date;
endDate: Date;
scheduledBeginDate: Date;
scheduledEndDate: Date;
terminated: boolean;
fulfilled: boolean;
authorName?: string;
authorId?: number;
} }
export interface DispatcherStatsResponse { export interface Max {
dispatcherName?: string; routeDistance: number;
lastSceneryName?: string; }
maxTimetableDistance: number;
minTimetableDistance: number; export interface Min {
avgTimetableDistance: number; routeDistance: number;
count: number; }
sumDistance: number;
timetables?: DispatcherTimetable[]; export interface Avg {
routeDistance: number;
}
export interface Count {
_all: number;
} }
export interface DispatcherStatsAPIData { export interface DispatcherStatsAPIData {
response: DispatcherStatsResponse; _sum: Sum;
errorMessage?: string; _max: Max;
_min: Min;
_avg: Avg;
_count: Count;
} }
@@ -1,20 +1,27 @@
export interface DriverStatsResponse { export interface Sum {
driverName: string; routeDistance: number;
confirmedStopsCount: number;
allStopsCount: number;
currentDistance: number;
}
export interface Count {
fulfilled: number; fulfilled: number;
abandoned: number; terminated: number;
totalDistance: number; _all: number;
confirmedDistance: number; }
totalStops: number;
confirmedStops: number; export interface Max {
maxServiceDuration: number; routeDistance: number;
avgServiceDuration: number; }
maxDistance: number;
avgDistance: number; export interface Avg {
maxDelay: number; routeDistance: number;
avgDelay: number;
} }
export interface DriverStatsAPIData { export interface DriverStatsAPIData {
response?: DriverStatsResponse; _sum: Sum;
errorMessage?: string; _count: Count;
_max: Max;
_avg: Avg;
} }
+2 -2
View File
@@ -1,7 +1,7 @@
export const URLs = { export const URLs = {
stacjownikAPI2: 'https://stacjownik.eu-4.evennode.com', stacjownikAPI2: 'https://stacjownik.eu-4.evennode.com',
stacjownikAPI: 'http://localhost:3000', stacjownikAPI: 'http://stacjownik-dev.eu-4.evennode.com',
stacjownikAPIDev: 'http://localhost:3000', stacjownikAPIDev: 'http://stacjownik-dev.eu-4.evennode.com',
// trains: "https://api.td2.info.pl:9640/?method=getTrainsOnline", // trains: "https://api.td2.info.pl:9640/?method=getTrainsOnline",
// getTimetableURL: (trainNo: string | number, region = "eu") => `https://api.td2.info.pl:9640/?method=readFromSWDR&value=getTimetable%3B${trainNo}%3B${region}` // getTimetableURL: (trainNo: string | number, region = "eu") => `https://api.td2.info.pl:9640/?method=readFromSWDR&value=getTimetable%3B${trainNo}%3B${region}`
}; };
+2 -1
View File
@@ -62,7 +62,7 @@ export const useStore = defineStore('store', {
if (!trains) return []; if (!trains) return [];
this.trainList = trains this.trainList = trains
.filter((train) => train.region === this.region.id && train.online) .filter((train) => train.region === this.region.id)
.map((train) => { .map((train) => {
const stock = train.stockString.split(';'); const stock = train.stockString.split(';');
const locoType = stock ? stock[0] : train.stockString; const locoType = stock ? stock[0] : train.stockString;
@@ -206,6 +206,7 @@ export const useStore = defineStore('store', {
const prevDispatcherStatuses: StoreState['lastDispatcherStatuses'] = []; const prevDispatcherStatuses: StoreState['lastDispatcherStatuses'] = [];
this.apiData.stations?.forEach((stationAPIData) => { this.apiData.stations?.forEach((stationAPIData) => {
if (stationAPIData.region !== this.region.id || !stationAPIData.isOnline) return; if (stationAPIData.region !== this.region.id || !stationAPIData.isOnline) return;
const station = this.stationList.find((s) => s.name === stationAPIData.stationName); const station = this.stationList.find((s) => s.name === stationAPIData.stationName);
+4 -4
View File
@@ -1,6 +1,6 @@
import { DataStatus } from '@/scripts/enums/DataStatus'; import { DataStatus } from '@/scripts/enums/DataStatus';
import { DispatcherStatsResponse } from '@/scripts/interfaces/api/DispatcherStatsAPIData'; import { DispatcherStatsAPIData } from '@/scripts/interfaces/api/DispatcherStatsAPIData';
import { DriverStatsResponse } from '@/scripts/interfaces/api/DriverStatsAPIData'; import { DriverStatsAPIData } from '@/scripts/interfaces/api/DriverStatsAPIData';
import StationAPIData from '@/scripts/interfaces/api/StationAPIData'; import StationAPIData from '@/scripts/interfaces/api/StationAPIData';
import TrainAPIData from '@/scripts/interfaces/api/TrainAPIData'; import TrainAPIData from '@/scripts/interfaces/api/TrainAPIData';
import Station from '@/scripts/interfaces/Station'; import Station from '@/scripts/interfaces/Station';
@@ -25,10 +25,10 @@ export interface StoreState {
webSocket?: Socket; webSocket?: Socket;
dispatcherStatsName: string; dispatcherStatsName: string;
dispatcherStatsData?: DispatcherStatsResponse; dispatcherStatsData?: DispatcherStatsAPIData;
driverStatsName: string; driverStatsName: string;
driverStatsData?: DriverStatsResponse; driverStatsData?: DriverStatsAPIData;
dataStatuses: { dataStatuses: {
connection: DataStatus; connection: DataStatus;