171 lines
4.0 KiB
Vue
171 lines
4.0 KiB
Vue
<script setup lang="ts">
|
||
import { EditOutlined } from '@ant-design/icons-vue';
|
||
import {EchartsUI, type EchartsUIType, useEcharts} from "@vben/plugins/echarts";
|
||
import {onMounted, ref} from "vue";
|
||
import {statisticsByTime} from "#/api/property/reportStatistics";
|
||
|
||
const orderLineRef = ref<EchartsUIType>();
|
||
const { renderEcharts } = useEcharts(orderLineRef);
|
||
const xAxisData = ref<any[]>([]);
|
||
const seriesData = ref<any[]>([]);
|
||
async function fetchOrderTrend() {
|
||
const res = await statisticsByTime({ timeUnit: 1 });
|
||
xAxisData.value = res?.time ?? [];
|
||
seriesData.value = res?.counts ?? [];
|
||
renderEcharts({
|
||
title: { text: '客户续租率趋势' },
|
||
tooltip: { trigger: 'axis' },
|
||
xAxis: {
|
||
type: 'category',
|
||
data: xAxisData.value,
|
||
boundaryGap: false,
|
||
},
|
||
yAxis: { type: 'value', axisLabel: { formatter: (value) => `${value * 100}%` } },
|
||
series: [
|
||
{
|
||
name: '订单趋势',
|
||
type: 'line',
|
||
data: seriesData.value || [],
|
||
smooth: true,
|
||
},
|
||
],
|
||
});
|
||
}
|
||
onMounted(async () => {
|
||
await fetchOrderTrend();
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<div class="panel">
|
||
|
||
<div class="bulletin-board">
|
||
<div class="bulletin-board-title">工单看板</div>
|
||
<div class="bulletin-board-content">
|
||
<div>
|
||
<div>
|
||
<div>工单总数:</div>
|
||
<div>56</div>
|
||
<div style="color: #1890FF">点击前往工单池</div>
|
||
</div>
|
||
<div class="icon-edit"><EditOutlined /></div>
|
||
</div>
|
||
<div>
|
||
<div>
|
||
<div>待派工单数:</div>
|
||
<div>56</div>
|
||
<div style="color: #1890FF">点击前往工单待办</div>
|
||
</div>
|
||
<div class="icon-edit"><EditOutlined /></div>
|
||
</div>
|
||
<div>
|
||
<div>
|
||
<div>未办结超时工单:</div>
|
||
<div>56</div>
|
||
<div>处理中的工单数:<span style="color: green">5</span></div>
|
||
</div>
|
||
<div class="icon-edit"><EditOutlined /></div>
|
||
</div>
|
||
<div>
|
||
<div>
|
||
<div>当月工单超时率:</div>
|
||
<div>56</div>
|
||
<div>超时工单数:<span style="color: red">0</span></div>
|
||
</div>
|
||
<div class="icon-edit"><EditOutlined /></div>
|
||
</div>
|
||
<div>
|
||
<div>
|
||
<div>当月满意度:</div>
|
||
<div>100%</div>
|
||
<div>满意度:5</div>
|
||
</div>
|
||
<div class="icon-edit"><EditOutlined /></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="chart">
|
||
<div class="chart-one">
|
||
<div>
|
||
<EchartsUI
|
||
ref="orderLineRef"
|
||
height="350px"
|
||
width="100%"
|
||
style="background: #fff; border-radius: 8px"
|
||
/>
|
||
</div>
|
||
<div style="background-color: red"></div>
|
||
</div>
|
||
<div class="chart-two">
|
||
<div>
|
||
<EchartsUI
|
||
ref="orderLineRef"
|
||
height="350px"
|
||
width="100%"
|
||
style="background: #fff; border-radius: 8px"
|
||
/>
|
||
</div>
|
||
<div style="background-color: red"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<style scoped lang="scss">
|
||
.panel{
|
||
width: 100%;
|
||
padding: 40px;
|
||
box-sizing: border-box;
|
||
|
||
.bulletin-board{
|
||
|
||
.bulletin-board-title{
|
||
font-size: 25px;
|
||
font-weight: bold;
|
||
margin-bottom: 20px;
|
||
}
|
||
.bulletin-board-content{
|
||
display: grid;
|
||
grid-template-columns: repeat(5, 1fr);
|
||
gap: 40px;
|
||
|
||
> div{
|
||
height: auto;
|
||
background-color: #FFFFFF;
|
||
padding: 18px;
|
||
border-radius: 10px;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
|
||
> div:first-child {
|
||
line-height: 32px;
|
||
|
||
div:nth-child(2) {
|
||
font-size: 20px;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
.icon-edit{
|
||
font-size: 30px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.chart{
|
||
|
||
.chart-one{
|
||
margin-top:40px;
|
||
display: grid;
|
||
grid-template-columns: 2fr 1fr;
|
||
gap: 40px;
|
||
}
|
||
.chart-two{
|
||
margin-top:40px;
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 40px;
|
||
}
|
||
}
|
||
}
|
||
</style>
|