refactor(driver): improved rolling stock analysis with TWR/TN/PN support

This commit is contained in:
2026-05-04 22:40:48 +02:00
parent a1f227e3a3
commit 326d9d3cb3
2 changed files with 136 additions and 21 deletions
+121 -13
View File
@@ -45,20 +45,61 @@
<div class="no-propositions" v-else>{{ t('trains.number-propositions-empty') }}</div> <div class="no-propositions" v-else>{{ t('trains.number-propositions-empty') }}</div>
<div class="cargo-warnings" v-if="getCargoWarnings.size > 0"> <div class="cargo-warnings" v-if="Object.values(cargoWarnings).length > 0">
<hr /> <hr />
<h3>{{ t('cargo-warnings.title') }}</h3> <h3>{{ t('cargo-warnings.title') }}</h3>
<div class="warnings-container"> <div class="warnings-container">
<div <div
v-for="warning in getCargoWarnings" v-for="(_, warningKey) of cargoWarnings"
class="train-badge" class="train-badge"
:class="`${warning.split('-')[0]}`" :class="warningKey.split('-')[2]"
> >
{{ t('cargo-warnings.' + warning) }} {{ t('cargo-warnings.' + warningKey) }}
</div> </div>
</div> </div>
</div> </div>
<div class="analysis">
<hr />
<div>
<h3>Analiza (PL):</h3>
<div v-if="Object.values(cargoWarnings).length > 0" v-html="analysisString"></div>
<!-- <div v-if="Object.keys(cargoWarnings).some((k) => k.includes('-twr'))">
{{ t('cargo-warnings.has-twr') }},
</div>
<div v-if="Object.keys(cargoWarnings).some((k) => k.includes('-tn'))">
{{ t('cargo-warnings.has-tn') }},
</div>
<div>
<i v-if="cargoWarnings['zags-loaded-twr'] || cargoWarnings['zags-empty-tn']">
33UN1965 {{ cargoWarnings['zags-loaded-twr'] }} /
{{ cargoWarnings['zags-empty-tn'] }} Zags
</i>
</div>
<div>
<i v-if="cargoWarnings['zans-loaded-tn'] || cargoWarnings['zans-empty-tn']">
33UN1203 {{ cargoWarnings['zans-loaded-tn'] }} /
{{ cargoWarnings['zans-empty-tn'] }} Zans
</i>
</div>
<div v-if="Object.keys(cargoWarnings).some((k) => k.includes('-pn'))">
{{ t('cargo-warnings.has-pn') }}:
<i v-if="cargoWarnings['innofreight-all-pn']"> Innofreight - przekroczona skrajnia </i>
<i v-if="cargoWarnings['military-all-pn']"> transport wojskowy </i>
</div> -->
</div>
</div>
<div class="actions">
<button class="btn btn--action btn-copy">SKOPIUJ ANALIZĘ</button>
</div>
</div> </div>
</template> </template>
@@ -160,22 +201,41 @@ const chosenCategory = computed(() => {
return availableCategories.value[chosenCategoryIndex.value]; return availableCategories.value[chosenCategoryIndex.value];
}); });
const getCargoWarnings = computed(() => { const cargoWarnings = computed(() => {
const stockList = props.chosenTrain.stockList; const stockList = props.chosenTrain.stockList;
let warnings: Set<string> = new Set(); let warnings: Record<string, number> = {};
stockList.forEach((stockVehicle) => { stockList.forEach((stockVehicle) => {
const [vehicleName, vehicleCargo] = stockVehicle.split(':'); const [vehicleName, vehicleCargo] = stockVehicle.split(':');
if (vehicleName.startsWith('WB117')) warnings.add(vehicleCargo ? 'twr-un1965' : 'tn-un1965'); if (/^WB117/.test(vehicleName)) {
else if (vehicleName.startsWith('445Rb')) if (vehicleCargo) {
warnings.add(vehicleCargo ? 'tn-un1202' : 'tn-un1202-empty'); // warnings.add('twr-un1965');
else if (vehicleName.startsWith('EDK80')) warnings.add('pn-edk80'); warnings['zags-loaded-twr'] = (warnings['zags-loaded-twr'] || 0) + 1;
} else {
// warnings.add('tn-un1965');
warnings['zags-empty-tn'] = (warnings['zags-empty-tn'] || 0) + 1;
}
} else if (/^445Rb/.test(vehicleName)) {
if (vehicleCargo) {
// warnings.add(vehicleCargo ? 'tn-un1202' : 'tn-un1202-empty');
warnings['zans-loaded-tn'] = (warnings['zans-loaded-tn'] || 0) + 1;
} else {
// warnings.add(vehicleCargo ? 'tn-un1202' : 'tn-un1202-empty');
warnings['zans-empty-tn'] = (warnings['zans-empty-tn'] || 0) + 1;
}
} else if (/^EDK80/.test(vehicleName)) {
// warnings.add('pn-edk80');
warnings['edk80-all-pn'] = (warnings['edk80-all-pn'] || 0) + 1;
}
if (vehicleCargo) { if (/^wt_20/.test(vehicleCargo)) {
if (vehicleCargo.startsWith('wt_20')) warnings.add('pn-innofreight'); warnings['innofreight-all-pn'] = (warnings['innofreight-all-pn'] || 0) + 1;
else if (/^(tank|vehicles_01|truck)/.test(vehicleCargo)) warnings.add('pn-military'); }
if (/^(tank|vehicles_01|truck)/.test(vehicleCargo)) {
warnings['military-all-pn'] = (warnings['military-all-pn'] || 0) + 1;
} }
}); });
@@ -254,6 +314,42 @@ function selectCategory(i: number) {
chosenCategoryIndex.value = i; chosenCategoryIndex.value = i;
generateNumberPropositions(); generateNumberPropositions();
} }
const analysisString = computed(() => {
let analysisStr = 'Analiza: ';
analysisStr = `<i>$number</i>, <b>${chosenCategory.value}</b> (${props.chosenTrain.stockList[0]}, ${(props.chosenTrain.mass / 1000).toFixed(1)}t, ${props.chosenTrain.length}m)`;
if (Object.keys(cargoWarnings.value).length > 0) {
if (Object.keys(cargoWarnings.value).some((k) => k.includes('-twr')))
analysisStr += `<br>${t('cargo-warnings.has-twr')}`;
if (Object.keys(cargoWarnings.value).some((k) => k.includes('-tn')))
analysisStr += `<br>${t('cargo-warnings.has-tn')}`;
if (cargoWarnings.value['zags-loaded-twr'] || cargoWarnings.value['zags-empty-tn']) {
analysisStr += `<br><i>33UN1965 ${cargoWarnings.value['zags-loaded-twr'] || 0}/${cargoWarnings.value['zags-empty-tn'] || 0} Zags</i>`;
}
if (cargoWarnings.value['zans-loaded-tn'] || cargoWarnings.value['zans-empty-tn']) {
analysisStr += `<br><i>33UN1203 ${cargoWarnings.value['zans-loaded-tn'] || 0}/${cargoWarnings.value['zans-empty-tn'] || 0} Zans</i>`;
}
if (Object.keys(cargoWarnings.value).some((k) => k.includes('-pn'))) {
analysisStr += `${t('cargo-warnings.has-pn')}:`;
if (cargoWarnings.value['innofreight-all-pn']) {
analysisStr += `<br> - Innofreight - przekroczona skrajnia`;
}
if (cargoWarnings.value['military-all-pn']) {
analysisStr += `<br> - transport wojskowy`;
}
}
}
return analysisStr;
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -309,6 +405,18 @@ function selectCategory(i: number) {
gap: 0.5em; gap: 0.5em;
} }
.analysis {
margin-top: 0.5em;
h3 {
margin: 0.5em 0;
}
}
.actions {
margin-top: 0.5em;
}
@include responsive.smallScreen { @include responsive.smallScreen {
.driver-propositions { .driver-propositions {
text-align: center; text-align: center;
+15 -8
View File
@@ -46,7 +46,7 @@
"creator-message": "Twórca projektu Stacjownik" "creator-message": "Twórca projektu Stacjownik"
}, },
"warnings": { "warnings": {
"TWR": "Pociąg z towarami niebezpiecznymi wysokiego ryzyka", "TWR": "Pociąg z towarami niebezpiecznymi wysokiego ryzyka (TWR)",
"SKR": "Pociąg z przekroczoną skrajnią", "SKR": "Pociąg z przekroczoną skrajnią",
"PN": "Pociąg z przesyłkami nadzwyczajnymi", "PN": "Pociąg z przesyłkami nadzwyczajnymi",
"TN": "Pociąg z towarami niebezpiecznymi", "TN": "Pociąg z towarami niebezpiecznymi",
@@ -437,13 +437,20 @@
}, },
"cargo-warnings": { "cargo-warnings": {
"title": "Dodatkowe uwagi przewozowe:", "title": "Dodatkowe uwagi przewozowe:",
"pn-innofreight": "PN: Innofreight C45: przekroczona skrajnia", "zags-loaded-twr": "TWR: UN1965 (LPG)",
"twr-un1965": "TWR: UN1965 (LPG)", "zags-empty-tn": "TN: brudne cysterny po UN1965",
"tn-un1965": "TN: brudne cysterny po UN1965", "zans-tn": "TN: UN1202 (olej napędowy)",
"tn-un1202": "TN: UN1202 (olej napędowy)", "zans-empty-tn": "TN: brudne cysterny po UN1202",
"tn-un1202-empty": "TN: brudne cysterny po UN1202", "military-all-pn": "PN: transport wojskowy",
"pn-military": "PN: transport wojskowy", "edk80-all-pn": "PN: żuraw kolejowy EDK80",
"pn-edk80": "PN: żuraw kolejowy EDK80" "innofreight-all-pn": "PN: Innofreight C45: przekroczona skrajnia",
"has-pn": "* przejazd z przesyłkami nadzwyczajnymi (PN)",
"has-tn": "* przewozi towary niebezpieczne (TN)",
"has-twr": "* przewozi towary niebezpieczne wysokiego ryzyka (TWR)",
"empty": "puste",
"loaded": "pełne"
}, },
"train-stats": { "train-stats": {
"stats-button": "STATYSTYKI", "stats-button": "STATYSTYKI",