forked from drone/command-center-dashboard

shuishen
2025-04-17 61557492d824f3b0dc64d7fbfb2a8c63fb1f7468
feat:任务事件概况参数补充
1 files modified
404 ■■■■ changed files
src/views/SignMachineNest/MachineLeft/InspectionRaskDetails.vue 404 ●●●● patch | view | raw | blame | history
src/views/SignMachineNest/MachineLeft/InspectionRaskDetails.vue
@@ -1,228 +1,230 @@
<!-- 任务事件概况 -->
<template>
    <common-title title="任务事件概况" :style="{ marginLeft: pxToRem(14) }"></common-title>
    <div class="inspection-rask-details">
        <CommonDateTime :style="{ top: pxToRem(14),marginLeft: pxToRem(10) }" v-model="newTime" @change="getData"></CommonDateTime>
        <div class="chart-container" ref="chartRef"></div>
        <div class="pie-container" ref="pieRef"></div>
    </div>
    <common-title title="任务事件概况" :style="{ marginLeft: pxToRem(14) }"></common-title>
    <div class="inspection-rask-details">
        <CommonDateTime
            :style="{ top: pxToRem(14), marginLeft: pxToRem(10) }"
            v-model="newTime"
            @change="getData"
        ></CommonDateTime>
        <div class="chart-container" ref="chartRef"></div>
        <div class="pie-container" ref="pieRef"></div>
    </div>
</template>
<script setup>
import * as echarts from 'echarts';
import dayjs from 'dayjs';
import { pxToRem } from '@/utils/rem';
import CommonTitle from '@/components/CommonTitle.vue';
import CommonDateTime from '@/components/CommonDateTime.vue';
import * as echarts from 'echarts'
import dayjs from 'dayjs'
import { pxToRem } from '@/utils/rem'
import CommonTitle from '@/components/CommonTitle.vue'
import CommonDateTime from '@/components/CommonDateTime.vue'
import { jobNumBar, eventNumPie } from '@/api/home'
import useEchartsResize from '@/hooks/useEchartsResize'
import { useStore } from 'vuex'
const store = useStore()
// 单个机巢信息
const singleUavHome = computed(() => store.state.home.singleUavHome)
// 日期
const currenDate = dayjs().format('YYYY-MM-DD');
const newTime = ref([currenDate, currenDate]);
const currenDate = dayjs().format('YYYY-MM-DD')
const newTime = ref([currenDate, currenDate])
// 统计图
const chartRef = ref(null);
const chartRef = ref(null)
let { chart } = useEchartsResize(chartRef)
const pieRef = ref(null);
const pieRef = ref(null)
let { chart: pieChart } = useEchartsResize(pieRef)
const option = {
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'shadow'
        }
    },
    grid: {
        top: '15%',
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    legend: {
        data: ['任务', '事件'],
        textStyle: {
            color: '#fff'
        }
    },
    xAxis: {
        type: 'category',
        // data: ['1月', '2月', '3月', '4月', '5月', '6月'],
        axisLine: {
            lineStyle: {
                color: '#fff'
            }
        },
        axisLabel: {
            color: '#fff'
        }
    },
    yAxis: {
        type: 'value',
        axisLine: {
            lineStyle: {
                color: '#fff'
            }
        },
        splitLine: {
            lineStyle: {
                color: 'rgba(255, 255, 255, 0.1)'
            }
        },
        axisLabel: {
            color: '#fff'
        }
    },
    series: [
        {
            name: '任务',
            type: 'bar',
            barWidth: '20%',
            // data: [10, 15, 20, 25, 30, 35],
            itemStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    { offset: 0, color: '#1EE7E7' },
                    { offset: 1, color: 'rgba(30, 231, 231, 0.1)' }
                ])
            }
        },
        {
            name: '事件',
            type: 'bar',
            barWidth: '20%',
            // data: [15, 20, 25, 30, 35, 40],
            itemStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    { offset: 0, color: '#0070FF' },
                    { offset: 1, color: 'rgba(0, 112, 255, 0.1)' }
                ])
            }
        }
    ]
};
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'shadow',
        },
    },
    grid: {
        top: '15%',
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true,
    },
    legend: {
        data: ['任务', '事件'],
        textStyle: {
            color: '#fff',
        },
    },
    xAxis: {
        type: 'category',
        // data: ['1月', '2月', '3月', '4月', '5月', '6月'],
        axisLine: {
            lineStyle: {
                color: '#fff',
            },
        },
        axisLabel: {
            color: '#fff',
        },
    },
    yAxis: {
        type: 'value',
        axisLine: {
            lineStyle: {
                color: '#fff',
            },
        },
        splitLine: {
            lineStyle: {
                color: 'rgba(255, 255, 255, 0.1)',
            },
        },
        axisLabel: {
            color: '#fff',
        },
    },
    series: [
        {
            name: '任务',
            type: 'bar',
            barWidth: '20%',
            // data: [10, 15, 20, 25, 30, 35],
            itemStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    { offset: 0, color: '#1EE7E7' },
                    { offset: 1, color: 'rgba(30, 231, 231, 0.1)' },
                ]),
            },
        },
        {
            name: '事件',
            type: 'bar',
            barWidth: '20%',
            // data: [15, 20, 25, 30, 35, 40],
            itemStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    { offset: 0, color: '#0070FF' },
                    { offset: 1, color: 'rgba(0, 112, 255, 0.1)' },
                ]),
            },
        },
    ],
}
// chart.setOption(option);
const pieOption = {
    tooltip: {
        trigger: 'item',
        formatter: '{b}: {c} ({d}%)'
    },
    legend: {
        orient: 'vertical',
        right: '5%',
        top: 'middle',
        textStyle: {
            color: '#fff',
            fontSize: 12
        },
        itemWidth: 10,
        itemHeight: 10,
        itemGap: 10,
        formatter: function(name) {
            let data = pieOption.series[0].data;
            let total = 0;
            let tarValue = 0;
            for (let i = 0; i < data.length; i++) {
                total += data[i].value;
                if (data[i].name === name) {
                    tarValue = data[i].value;
                }
            }
            let percentage = ((tarValue / total) * 100).toFixed(1);
            return `${name} ${percentage}%`;
        }
    },
    series: [
        {
            name: '任务状态',
            type: 'pie',
            radius: ['10%', '90%'],
            center: ['35%', '50%'],  // 将图表向左偏移
            roseType: 'radius',
            itemStyle: {
                borderRadius: 4
            },
            label: {
                show: true,
                position: 'inside',
                formatter: '{c}%',
                fontSize: 12,
                color: '#fff'
            },
            data: [
                { value: 0, name: '待审核', itemStyle: { color: '#1860EC' } },
                { value: 0, name: '待处理', itemStyle: { color: '#47D107' } },
                { value: 0, name: '已完成', itemStyle: { color: '#F29509' } },
                // { value: 0, name: '待分拨', itemStyle: { color: '#E9C81A' } },
                { value: 0, name: '处理中', itemStyle: { color: '#0FC1E8' } },
                { value: 0, name: '已完结', itemStyle: { color: '#FE577F' } }
            ]
        }
    ]
};
    tooltip: {
        trigger: 'item',
        formatter: '{b}: {c} ({d}%)',
    },
    legend: {
        orient: 'vertical',
        right: '5%',
        top: 'middle',
        textStyle: {
            color: '#fff',
            fontSize: 12,
        },
        itemWidth: 10,
        itemHeight: 10,
        itemGap: 10,
        formatter: function (name) {
            let data = pieOption.series[0].data
            let total = 0
            let tarValue = 0
            for (let i = 0; i < data.length; i++) {
                total += data[i].value
                if (data[i].name === name) {
                    tarValue = data[i].value
                }
            }
            let percentage = ((tarValue / total) * 100).toFixed(1)
            return `${name} ${percentage}%`
        },
    },
    series: [
        {
            name: '任务状态',
            type: 'pie',
            radius: ['10%', '90%'],
            center: ['35%', '50%'], // 将图表向左偏移
            roseType: 'radius',
            itemStyle: {
                borderRadius: 4,
            },
            label: {
                show: true,
                position: 'inside',
                formatter: '{c}%',
                fontSize: 12,
                color: '#fff',
            },
            data: [
                { value: 0, name: '待审核', itemStyle: { color: '#1860EC' } },
                { value: 0, name: '待处理', itemStyle: { color: '#47D107' } },
                { value: 0, name: '已完成', itemStyle: { color: '#F29509' } },
                // { value: 0, name: '待分拨', itemStyle: { color: '#E9C81A' } },
                { value: 0, name: '处理中', itemStyle: { color: '#0FC1E8' } },
                { value: 0, name: '已完结', itemStyle: { color: '#FE577F' } },
            ],
        },
    ],
}
// TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR
const getData = (value,date_enum) => {
    const params = {
        device_sn: '',
        date_enum,
        // start_date: newTime.value[0],
        // end_date: newTime.value[1]
    };
    // 获取柱状图
    jobNumBar(params).then(res => {
        if (res.data.code !== 0) return;
        option.xAxis.data = res.data?.data.map(item => item.name);
        option.series[0].data = res.data?.data.map(item => item.data[0].value);
        option.series[1].data = res.data?.data.map(item => item.data[1].value);
        chart.value.setOption(option);
    })
    // 获取饼状图
    eventNumPie(params).then(res => {
        if (res.data.code!== 0) return;
        // 更新饼图数据
        const updatedPieData = pieOption.series[0].data.map(item => {
            const matchedData = res.data?.data.find(dataItem => dataItem.name === item.name);
            return {
                ...item,
                value: matchedData ? matchedData.value : item.value
            };
        });
        pieOption.series[0].data = updatedPieData;
        pieChart.value.setOption(pieOption);
    })
};
const getData = (value, date_enum) => {
    const params = {
        device_sn: singleUavHome.value.device_sn,
        date_enum,
        // start_date: newTime.value[0],
        // end_date: newTime.value[1]
    }
    // 获取柱状图
    jobNumBar(params).then(res => {
        if (res.data.code !== 0) return
        option.xAxis.data = res.data?.data.map(item => item.name)
        option.series[0].data = res.data?.data.map(item => item.data[0].value)
        option.series[1].data = res.data?.data.map(item => item.data[1].value)
        chart.value.setOption(option)
    })
    // 获取饼状图
    eventNumPie(params).then(res => {
        if (res.data.code !== 0) return
        // 更新饼图数据
        const updatedPieData = pieOption.series[0].data.map(item => {
            const matchedData = res.data?.data.find(dataItem => dataItem.name === item.name)
            return {
                ...item,
                value: matchedData ? matchedData.value : item.value,
            }
        })
        pieOption.series[0].data = updatedPieData
        pieChart.value.setOption(pieOption)
    })
}
onMounted(() => {
    getData(newTime.value, 'TODAY');
});
    getData(newTime.value, 'TODAY')
})
</script>
<style lang="scss" scoped>
.inspection-rask-details {
    margin-left: 29px;
    // padding: 16px 16px;
    width: 390px;
    height: 526px;
    background: linear-gradient(
        270deg,
        rgba(31, 62, 122, 0) 0%,
        rgba(31, 62, 122, 0.35) 21%,
        #1f3e7a 100%
    );
    border-radius: 0px 0px 0px 0px;
    opacity: 0.85;
    .chart-container {
        width: 100%;
        height: 220px;
        margin-top: 20px;
    }
    .pie-container {
        width: 100%;
        height: 212px;
        margin-top: 10px;
    }
    margin-left: 29px;
    // padding: 16px 16px;
    width: 390px;
    height: 526px;
    background: linear-gradient(270deg, rgba(31, 62, 122, 0) 0%, rgba(31, 62, 122, 0.35) 21%, #1f3e7a 100%);
    border-radius: 0px 0px 0px 0px;
    opacity: 0.85;
    .chart-container {
        width: 100%;
        height: 220px;
        margin-top: 20px;
    }
    .pie-container {
        width: 100%;
        height: 212px;
        margin-top: 10px;
    }
}
</style>