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