mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 05:18:11 +00:00
Poprawki statystyk
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
+23
-7
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"options": [{
|
"options": [
|
||||||
|
{
|
||||||
"id": "default",
|
"id": "default",
|
||||||
"name": "default",
|
"name": "default",
|
||||||
"iconName": "td2",
|
"iconName": "td2",
|
||||||
@@ -197,9 +198,19 @@
|
|||||||
"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,22 +259,26 @@
|
|||||||
"defaultValue": 0
|
"defaultValue": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modes": [{
|
"modes": [
|
||||||
|
{
|
||||||
"id": "include-selected",
|
"id": "include-selected",
|
||||||
"name": "include-selected",
|
"name": "include-selected",
|
||||||
"iconName": "",
|
"iconName": "",
|
||||||
"section": "mode",
|
"section": "mode",
|
||||||
"value": true,
|
"value": true,
|
||||||
"defaultValue": true
|
"defaultValue": true
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
"id": "save",
|
"id": "save",
|
||||||
"name": "save",
|
"name": "save",
|
||||||
"iconName": "",
|
"iconName": "",
|
||||||
"section": "mode",
|
"section": "mode",
|
||||||
"value": true,
|
"value": true,
|
||||||
"defaultValue": true
|
"defaultValue": true
|
||||||
}],
|
}
|
||||||
"regions": [{
|
],
|
||||||
|
"regions": [
|
||||||
|
{
|
||||||
"id": "eu",
|
"id": "eu",
|
||||||
"value": "PL1"
|
"value": "PL1"
|
||||||
},
|
},
|
||||||
@@ -282,5 +297,6 @@
|
|||||||
{
|
{
|
||||||
"id": "ru",
|
"id": "ru",
|
||||||
"value": "ENG"
|
"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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user