2025-01-12 20:55:46 +01:00
|
|
|
|
@extends('base')
|
|
|
|
|
@section('body-class', 'region')
|
|
|
|
|
@section('header')
|
|
|
|
|
<nav>
|
|
|
|
|
<strong>{{ $region[0]['region_name'] }}</strong>
|
|
|
|
|
<ul>
|
|
|
|
|
<li><a href="/">Start</a></li>
|
|
|
|
|
@foreach($regions as $r)
|
|
|
|
|
@if($r['region_id'] != $region_id)
|
|
|
|
|
<li><a href="/region/{{ $r['region_id'] }}">{{ $r['region_name'] }}</a></li>
|
|
|
|
|
@endif
|
|
|
|
|
@endforeach
|
|
|
|
|
</ul>
|
|
|
|
|
</nav>
|
|
|
|
|
@endsection
|
|
|
|
|
@section('main')
|
|
|
|
|
<article style="grid-area: timeline;">
|
|
|
|
|
<div id="timeline"></div>
|
|
|
|
|
</article>
|
2025-01-13 17:06:54 +01:00
|
|
|
|
<article class="header" style="grid-area: chart6;">
|
|
|
|
|
<header>
|
|
|
|
|
<h2 id="prediction-title">Auslastung Vorhersage</h2>
|
|
|
|
|
</header>
|
|
|
|
|
<div id="chart-prediction"></div>
|
|
|
|
|
</article>
|
2025-01-12 20:55:46 +01:00
|
|
|
|
<article class="header" style="grid-area: chart1;">
|
|
|
|
|
<header>
|
2025-01-13 17:06:54 +01:00
|
|
|
|
<h2 id="belegung-title">Gesamtauslastung</h2>
|
2025-01-12 20:55:46 +01:00
|
|
|
|
</header>
|
|
|
|
|
<div id="chart-heatmap"></div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="header" style="grid-area: chart3;">
|
|
|
|
|
<header>
|
|
|
|
|
<h2>
|
|
|
|
|
Auslastung nach Monat am 2024-04-15T07:06:22
|
|
|
|
|
</h2>
|
|
|
|
|
</header>
|
|
|
|
|
<div id="chart-capacity-monthly">
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="header" style="grid-area: chart2;">
|
|
|
|
|
<header>
|
|
|
|
|
<h2>
|
|
|
|
|
Entwicklung der Auslastung
|
|
|
|
|
</h2>
|
|
|
|
|
<button popovertarget="chart-capacity-popover"></button>
|
|
|
|
|
<div id="chart-capacity-popover" popover>
|
|
|
|
|
<h2>Erkläung zum Diagramm «Entwicklung der Auslastung»</h2>
|
|
|
|
|
<p>Das Liniendiagramm zeigt die Auslastung von Regionen. 100 % = die Region ist kaum ausgelastet; 100 % der Mietobjekte sind verfügbar. 0 % = Die Region ist komplett ausgelastet; Es stehen keine Mietangebote zur Verfügung.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
<div id="chart-capacity"></div>
|
|
|
|
|
</article>
|
|
|
|
|
<article class="header" style="grid-area: chart4;">
|
|
|
|
|
<header>
|
|
|
|
|
<h2>
|
|
|
|
|
Auslastung Tage für Monat
|
|
|
|
|
</h2>
|
|
|
|
|
</header>
|
|
|
|
|
<div id="chart-capacity-daily">
|
|
|
|
|
</article>
|
|
|
|
|
|
|
|
|
|
<script type="module">
|
|
|
|
|
|
|
|
|
|
const sharedOptions = {
|
|
|
|
|
basic: {
|
2025-01-13 17:06:54 +01:00
|
|
|
|
color: ['#9ecae1','#6baed6','#4292c6','#2171b5','#084594'],
|
2025-01-12 20:55:46 +01:00
|
|
|
|
grid: {
|
|
|
|
|
top: 20,
|
|
|
|
|
left: 60,
|
|
|
|
|
right: 0,
|
|
|
|
|
bottom: 50
|
|
|
|
|
},
|
|
|
|
|
name: (opt) => {
|
|
|
|
|
return {
|
|
|
|
|
name: opt.name,
|
|
|
|
|
nameLocation: opt.location,
|
|
|
|
|
nameGap: 24,
|
|
|
|
|
nameTextStyle: {
|
|
|
|
|
fontWeight: 'bold',
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const chartCapacity = document.getElementById('chart-capacity');
|
|
|
|
|
const cCapacity = echarts.init(chartCapacity);
|
|
|
|
|
|
|
|
|
|
const cCapacityOptions = {
|
|
|
|
|
legend: {
|
|
|
|
|
data: ['Auslastung Region', 'Auslastung alle Regionen']
|
|
|
|
|
},
|
|
|
|
|
tooltip: {
|
|
|
|
|
trigger: 'axis',
|
|
|
|
|
valueFormatter: (value) => value.toFixed(2)+' %'
|
|
|
|
|
},
|
|
|
|
|
grid: {
|
|
|
|
|
top: 20,
|
|
|
|
|
left: 25,
|
|
|
|
|
right: 10,
|
|
|
|
|
bottom: 20,
|
|
|
|
|
containLabel: true
|
|
|
|
|
},
|
|
|
|
|
xAxis: {
|
|
|
|
|
type: 'category',
|
|
|
|
|
boundaryGap: false,
|
|
|
|
|
data: {!! json_encode($regionCapacities[1]['dates']) !!},
|
|
|
|
|
name: 'Zeitpunkt Scraping',
|
|
|
|
|
nameLocation: 'center',
|
|
|
|
|
nameGap: 24,
|
|
|
|
|
nameTextStyle: {
|
|
|
|
|
fontWeight: 'bold',
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
yAxis: {
|
|
|
|
|
type: 'value',
|
|
|
|
|
min: 0,
|
|
|
|
|
max: 100,
|
|
|
|
|
name: 'Auslastung in Prozent',
|
|
|
|
|
nameLocation: 'center',
|
|
|
|
|
nameGap: 38,
|
|
|
|
|
nameTextStyle: {
|
|
|
|
|
fontWeight: 'bold',
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
series: [{
|
|
|
|
|
name: 'Auslastung alle Regionen',
|
|
|
|
|
type: 'line',
|
|
|
|
|
symbolSize: 7,
|
|
|
|
|
data: {!! json_encode($regionCapacities[0]['capacities']) !!}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'Auslastung Region',
|
|
|
|
|
type: 'line',
|
|
|
|
|
symbolSize: 7,
|
|
|
|
|
data: {!! json_encode($regionCapacities[1]['capacities']) !!}
|
|
|
|
|
}]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cCapacity.setOption(cCapacityOptions);
|
|
|
|
|
|
2025-01-13 17:06:54 +01:00
|
|
|
|
const chartPrediction = document.getElementById('chart-prediction');
|
|
|
|
|
const cPrediction = echarts.init(chartPrediction);
|
|
|
|
|
|
|
|
|
|
const cPredictionOptions = {
|
|
|
|
|
legend: {
|
|
|
|
|
data: ['Moving Average', 'Earlier', 'Later']
|
|
|
|
|
},
|
|
|
|
|
tooltip: {
|
|
|
|
|
trigger: 'axis',
|
|
|
|
|
valueFormatter: (value) => value.toFixed(2)+' %'
|
|
|
|
|
},
|
|
|
|
|
grid: {
|
|
|
|
|
top: 20,
|
|
|
|
|
left: 25,
|
|
|
|
|
right: 10,
|
|
|
|
|
bottom: 20,
|
|
|
|
|
containLabel: true
|
|
|
|
|
},
|
|
|
|
|
xAxis: {
|
|
|
|
|
type: 'category',
|
|
|
|
|
boundaryGap: false,
|
|
|
|
|
data: {!! json_encode($prediction['dates']) !!},
|
|
|
|
|
name: 'Zeitpunkt Scraping',
|
|
|
|
|
nameLocation: 'center',
|
|
|
|
|
nameGap: 24,
|
|
|
|
|
nameTextStyle: {
|
|
|
|
|
fontWeight: 'bold',
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
yAxis: {
|
|
|
|
|
type: 'value',
|
|
|
|
|
min: 0,
|
|
|
|
|
max: 1,
|
|
|
|
|
name: 'Auslastung in Prozent',
|
|
|
|
|
nameLocation: 'center',
|
|
|
|
|
nameGap: 38,
|
|
|
|
|
nameTextStyle: {
|
|
|
|
|
fontWeight: 'bold',
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
series: [{
|
|
|
|
|
name: 'Moving Average',
|
|
|
|
|
type: 'line',
|
|
|
|
|
symbolSize: 7,
|
|
|
|
|
data: {!! json_encode($prediction['movAvg']) !!}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'Earlier',
|
|
|
|
|
type: 'line',
|
|
|
|
|
symbolSize: 7,
|
|
|
|
|
data: {!! json_encode($prediction['cap_earlierTimeframe']) !!}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: 'Later',
|
|
|
|
|
type: 'line',
|
|
|
|
|
symbolSize: 7,
|
|
|
|
|
data: {!! json_encode($prediction['cap_laterTimeframe']) !!}
|
|
|
|
|
}]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cPrediction.setOption(cPredictionOptions);
|
|
|
|
|
|
|
|
|
|
|
2025-01-12 20:55:46 +01:00
|
|
|
|
const chartHeatmap = document.getElementById('chart-heatmap');
|
|
|
|
|
const cHeatmap = echarts.init(chartHeatmap);
|
|
|
|
|
const cHeatmapOptions = {
|
2025-01-13 17:06:54 +01:00
|
|
|
|
animation: false,
|
2025-01-12 20:55:46 +01:00
|
|
|
|
tooltip: {
|
|
|
|
|
position: 'top'
|
|
|
|
|
},
|
|
|
|
|
grid: {
|
|
|
|
|
top: 30,
|
2025-01-13 17:06:54 +01:00
|
|
|
|
right: 45,
|
|
|
|
|
bottom: 50,
|
|
|
|
|
left: 5
|
2025-01-12 20:55:46 +01:00
|
|
|
|
},
|
|
|
|
|
dataZoom: [{
|
2025-01-13 17:06:54 +01:00
|
|
|
|
type: 'slider'
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'slider',
|
|
|
|
|
show: true,
|
|
|
|
|
yAxisIndex: 0,
|
|
|
|
|
}],
|
2025-01-12 20:55:46 +01:00
|
|
|
|
xAxis: {
|
|
|
|
|
show: false,
|
|
|
|
|
name: 'Kurzzeitmietobjekt',
|
|
|
|
|
type: 'category',
|
|
|
|
|
data: {!! json_encode($regionPropertiesCapacities['scrapeDates']) !!},
|
|
|
|
|
splitArea: {
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
axisLabel: {
|
|
|
|
|
show: true,
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
yAxis: {
|
|
|
|
|
show: false,
|
|
|
|
|
type: 'category',
|
|
|
|
|
data: {!! json_encode($regionPropertiesCapacities['property_ids']) !!},
|
|
|
|
|
splitArea: {
|
|
|
|
|
show: true
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
visualMap: {
|
|
|
|
|
type: 'piecewise',
|
|
|
|
|
min: 0,
|
|
|
|
|
max: 100,
|
|
|
|
|
calculable: true,
|
|
|
|
|
orient: 'horizontal',
|
|
|
|
|
left: 'center',
|
|
|
|
|
top: 0,
|
|
|
|
|
formatter: (v1, v2) => {
|
|
|
|
|
return `${v1} – ${v2} %`;
|
|
|
|
|
},
|
|
|
|
|
inRange: {
|
|
|
|
|
color: sharedOptions.basic.color,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
series: [
|
|
|
|
|
{
|
|
|
|
|
name: 'Auslastung',
|
|
|
|
|
type: 'heatmap',
|
|
|
|
|
blurSize: 0,
|
|
|
|
|
data: {!! json_encode($regionPropertiesCapacities['values']) !!},
|
|
|
|
|
label: {
|
|
|
|
|
show: false
|
|
|
|
|
},
|
|
|
|
|
tooltip: {
|
|
|
|
|
formatter: (data) => {
|
2025-01-13 17:06:54 +01:00
|
|
|
|
return `Kurzzeitmietobjekte-ID: ${data.data[1]}<br />Datum Scraping: ${data.data[0]}<br/>Auslastung: ${data.data[2].toFixed(2)} %`
|
2025-01-12 20:55:46 +01:00
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
emphasis: {
|
|
|
|
|
itemStyle: {
|
|
|
|
|
borderColor: '#000',
|
|
|
|
|
borderWidth: 2
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cHeatmap.setOption(cHeatmapOptions);
|
|
|
|
|
</script>
|
|
|
|
|
@endsection
|