|
@@ -1,14 +1,14 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <!-- 第一行:统计卡片行 -->
|
|
|
|
|
- <el-row :gutter="16" class="mb-4">
|
|
|
|
|
|
|
+ <!-- 第一行:筛选条件 -->
|
|
|
|
|
+ <el-row :gutter="16" class="mb-6">
|
|
|
<el-col :span="24">
|
|
<el-col :span="24">
|
|
|
- <el-card class="chart-card" shadow="never">
|
|
|
|
|
|
|
+ <el-card class="filter-card" shadow="hover" style="border: none">
|
|
|
<el-form
|
|
<el-form
|
|
|
class="-mb-15px"
|
|
class="-mb-15px"
|
|
|
:model="queryParams"
|
|
:model="queryParams"
|
|
|
ref="queryFormRef"
|
|
ref="queryFormRef"
|
|
|
:inline="true"
|
|
:inline="true"
|
|
|
- label-width="68px"
|
|
|
|
|
|
|
+ label-width="80px"
|
|
|
>
|
|
>
|
|
|
<el-form-item label="所属部门" prop="project_name">
|
|
<el-form-item label="所属部门" prop="project_name">
|
|
|
<el-tree-select
|
|
<el-tree-select
|
|
@@ -20,7 +20,7 @@
|
|
|
filterable
|
|
filterable
|
|
|
placeholder="请选择所在部门"
|
|
placeholder="请选择所在部门"
|
|
|
clearable
|
|
clearable
|
|
|
- style="width: 180px"
|
|
|
|
|
|
|
+ style="width: 200px"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="创建时间" prop="createTime">
|
|
<el-form-item label="创建时间" prop="createTime">
|
|
@@ -31,232 +31,186 @@
|
|
|
start-placeholder="开始日期"
|
|
start-placeholder="开始日期"
|
|
|
end-placeholder="结束日期"
|
|
end-placeholder="结束日期"
|
|
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
|
|
- class="!w-220px"
|
|
|
|
|
|
|
+ class="!w-240px"
|
|
|
@change="handleDateChange"
|
|
@change="handleDateChange"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <!-- <el-form-item label="填写状态" prop="project_name">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="queryParams.status"
|
|
|
|
|
- placeholder="填写状态"
|
|
|
|
|
- clearable
|
|
|
|
|
- class="!w-240px"
|
|
|
|
|
- >
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="dict in getIntDictOptions(DICT_TYPE.OPERATION_FILL_ORDER_STATUS)"
|
|
|
|
|
- :key="dict.value"
|
|
|
|
|
- :label="dict.label"
|
|
|
|
|
- :value="dict.value"
|
|
|
|
|
- />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>-->
|
|
|
|
|
<el-form-item>
|
|
<el-form-item>
|
|
|
- <el-button @click="handleQuery"
|
|
|
|
|
- ><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
|
|
|
|
|
- >
|
|
|
|
|
- <el-button @click="resetQuery"
|
|
|
|
|
- ><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-button type="primary" @click="handleQuery">
|
|
|
|
|
+ <Icon icon="ep:search" class="mr-5px" /> 搜索
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button @click="resetQuery" class="btn-default">
|
|
|
|
|
+ <Icon icon="ep:refresh" class="mr-5px" /> 重置
|
|
|
|
|
+ </el-button>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
- <el-row :gutter="16" class="mb-4">
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 第二行:统计卡片行 -->
|
|
|
|
|
+ <el-row :gutter="16" class="mb-6">
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
- <el-card class="stat-card" shadow="never">
|
|
|
|
|
- <div class="flex flex-col">
|
|
|
|
|
- <div class="flex justify-between items-center text-gray-400">
|
|
|
|
|
- <span>昨日工单数量</span>
|
|
|
|
|
- <Icon icon="ep:menu" class="text-[32px] text-blue-400" />
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">总数量</span>
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">未完成</span>
|
|
|
|
|
|
|
+ <el-card class="stat-card stat-card-neutral-1" shadow="hover" style="border: none">
|
|
|
|
|
+ <div class="stat-content">
|
|
|
|
|
+ <div class="stat-header">
|
|
|
|
|
+ <div class="stat-icon-wrapper">
|
|
|
|
|
+ <Icon icon="ep:calendar" class="stat-icon" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-title">昨日工单数量</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ day.total }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ day.todo }}
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <el-divider class="stat-divider" />
|
|
|
|
|
+ <div class="stat-body">
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">总数量</div>
|
|
|
|
|
+ <div class="stat-sub-value text-slate-700">{{ day.total }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">未完成</div>
|
|
|
|
|
+ <div class="stat-sub-value text-amber-600">{{ day.todo }}</div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <!-- <el-divider class="my-2" />-->
|
|
|
|
|
- <!-- <div class="flex justify-between items-center text-gray-400 text-sm">-->
|
|
|
|
|
- <!-- <span>今日新增</span>-->
|
|
|
|
|
- <!-- <span class="text-green-500">+{{ statsData.productCategoryTodayCount }}</span>-->
|
|
|
|
|
- <!-- </div>-->
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
- <el-card class="stat-card" shadow="never">
|
|
|
|
|
- <div class="flex flex-col">
|
|
|
|
|
- <div class="flex justify-between items-center text-gray-400">
|
|
|
|
|
- <span>近一周工单数量</span>
|
|
|
|
|
- <Icon icon="ep:menu" class="text-[32px] text-blue-400" />
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">总数量</span>
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">未完成</span>
|
|
|
|
|
|
|
+ <el-card class="stat-card stat-card-neutral-2" shadow="hover" style="border: none">
|
|
|
|
|
+ <div class="stat-content">
|
|
|
|
|
+ <div class="stat-header">
|
|
|
|
|
+ <div class="stat-icon-wrapper">
|
|
|
|
|
+ <Icon icon="ep:star" class="stat-icon" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-title">近一周工单数量</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ week.total }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ week.todo }}
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <el-divider class="stat-divider" />
|
|
|
|
|
+ <div class="stat-body">
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">总数量</div>
|
|
|
|
|
+ <div class="stat-sub-value text-slate-700">{{ week.total }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">未完成</div>
|
|
|
|
|
+ <div class="stat-sub-value text-amber-600">{{ week.todo }}</div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <!-- <el-divider class="my-2" />-->
|
|
|
|
|
- <!-- <div class="flex justify-between items-center text-gray-400 text-sm">-->
|
|
|
|
|
- <!-- <span>今日新增</span>-->
|
|
|
|
|
- <!-- <span class="text-green-500">+{{ statsData.productCategoryTodayCount }}</span>-->
|
|
|
|
|
- <!-- </div>-->
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
- <el-card class="stat-card" shadow="never">
|
|
|
|
|
- <div class="flex flex-col">
|
|
|
|
|
- <div class="flex justify-between items-center text-gray-400">
|
|
|
|
|
- <span>近一月工单数量</span>
|
|
|
|
|
- <Icon icon="ep:menu" class="text-[32px] text-blue-400" />
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">总数量</span>
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">未完成</span>
|
|
|
|
|
|
|
+ <el-card class="stat-card stat-card-neutral-3" shadow="hover" style="border: none">
|
|
|
|
|
+ <div class="stat-content">
|
|
|
|
|
+ <div class="stat-header">
|
|
|
|
|
+ <div class="stat-icon-wrapper">
|
|
|
|
|
+ <Icon icon="ep:trend-charts" class="stat-icon" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-title">近一月工单数量</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ month.total }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ month.todo }}
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <el-divider class="stat-divider" />
|
|
|
|
|
+ <div class="stat-body">
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">总数量</div>
|
|
|
|
|
+ <div class="stat-sub-value text-slate-700">{{ month.total }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">未完成</div>
|
|
|
|
|
+ <div class="stat-sub-value text-amber-600">{{ month.todo }}</div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <!-- <el-divider class="my-2" />-->
|
|
|
|
|
- <!-- <div class="flex justify-between items-center text-gray-400 text-sm">-->
|
|
|
|
|
- <!-- <span>今日新增</span>-->
|
|
|
|
|
- <!-- <span class="text-green-500">+{{ statsData.productCategoryTodayCount }}</span>-->
|
|
|
|
|
- <!-- </div>-->
|
|
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
- <el-card class="stat-card" shadow="never">
|
|
|
|
|
- <div class="flex flex-col">
|
|
|
|
|
- <div class="flex justify-between items-center text-gray-400">
|
|
|
|
|
- <span>工单数量</span>
|
|
|
|
|
- <Icon icon="ep:menu" class="text-[32px] text-blue-400" />
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">总数量</span>
|
|
|
|
|
- <span class="text-gray-500 text-base font-medium" style="font-size: 14px">未完成</span>
|
|
|
|
|
|
|
+ <el-card class="stat-card stat-card-neutral-4" shadow="hover" style="border: none">
|
|
|
|
|
+ <div class="stat-content">
|
|
|
|
|
+ <div class="stat-header">
|
|
|
|
|
+ <div class="stat-icon-wrapper">
|
|
|
|
|
+ <Icon icon="ep:data-analysis" class="stat-icon" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-title">工单总数量</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="flex justify-between items-center mb-1">
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ total.total }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="text-3xl font-bold text-gray-700">
|
|
|
|
|
- {{ total.todo }}
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <el-divider class="stat-divider" />
|
|
|
|
|
+ <div class="stat-body">
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">总数量</div>
|
|
|
|
|
+ <div class="stat-sub-value text-slate-700">{{ total.total }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="stat-item">
|
|
|
|
|
+ <div class="stat-sub-label">未完成</div>
|
|
|
|
|
+ <div class="stat-sub-value text-amber-600">{{ total.todo }}</div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
- <!-- 第二行:图表行 -->
|
|
|
|
|
- <el-row :gutter="16" class="mb-4">
|
|
|
|
|
|
|
+ <!-- 第三行:图表行 -->
|
|
|
|
|
+ <el-row :gutter="16" class="mb-6">
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-card class="chart-card" shadow="never">
|
|
|
|
|
|
|
+ <el-card class="chart-card-enhanced" shadow="hover" style="border: none">
|
|
|
<template #header>
|
|
<template #header>
|
|
|
- <div class="flex items-center">
|
|
|
|
|
- <span class="text-base font-medium text-gray-600">工单状态统计</span>
|
|
|
|
|
|
|
+ <div class="chart-header">
|
|
|
|
|
+ <div class="chart-title-wrapper">
|
|
|
|
|
+ <div class="chart-title-dot chart-title-dot-blue"></div>
|
|
|
|
|
+ <span class="chart-title">工单状态统计</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
- <el-row class="h-[220px]">
|
|
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="finishedChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: dodgerblue; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('工单已执行')"
|
|
|
|
|
- >已执行</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-row class="chart-grid">
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="finishedChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('工单已执行')">
|
|
|
|
|
+ <span class="label-dot label-dot-blue"></span>
|
|
|
|
|
+ <span class="label-text">已执行</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="writeChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: orangered; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('工单待执行')"
|
|
|
|
|
- >待执行</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="writeChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('工单待执行')">
|
|
|
|
|
+ <span class="label-dot label-dot-amber"></span>
|
|
|
|
|
+ <span class="label-text">待执行</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="ignoreChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: purple; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('工单忽略')"
|
|
|
|
|
- >忽略</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="ignoreChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('工单忽略')">
|
|
|
|
|
+ <span class="label-dot label-dot-gray"></span>
|
|
|
|
|
+ <span class="label-text">忽略</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
- <el-card class="chart-card" shadow="never">
|
|
|
|
|
|
|
+ <el-card class="chart-card-enhanced" shadow="hover" style="border: none">
|
|
|
<template #header>
|
|
<template #header>
|
|
|
- <div class="flex items-center">
|
|
|
|
|
- <span class="text-base font-medium text-gray-600">设备状态统计</span>
|
|
|
|
|
|
|
+ <div class="chart-header">
|
|
|
|
|
+ <div class="chart-title-wrapper">
|
|
|
|
|
+ <div class="chart-title-dot chart-title-dot-green"></div>
|
|
|
|
|
+ <span class="chart-title">设备状态统计</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
- <el-row class="h-[220px]">
|
|
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="finishedTodayChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: dodgerblue; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('设备已执行')"
|
|
|
|
|
- >已填写</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-row class="chart-grid">
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="finishedTodayChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('设备已执行')">
|
|
|
|
|
+ <span class="label-dot label-dot-blue"></span>
|
|
|
|
|
+ <span class="label-text">已填写</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="writeTodayChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: orangered; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('设备待执行')"
|
|
|
|
|
- >未填写</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="writeTodayChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('设备待执行')">
|
|
|
|
|
+ <span class="label-dot label-dot-amber"></span>
|
|
|
|
|
+ <span class="label-text">未填写</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8" class="flex flex-col items-center">
|
|
|
|
|
- <div ref="ignoreTodayChartRef" class="h-[160px] w-full"></div>
|
|
|
|
|
- <div class="text-center mt-2">
|
|
|
|
|
- <span
|
|
|
|
|
- class="text-sm text-gray-600"
|
|
|
|
|
- style="text-decoration: underline; color: purple; cursor: pointer"
|
|
|
|
|
- @click="clickStatus('设备忽略')"
|
|
|
|
|
- >忽略</span
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <el-col :span="8" class="chart-item">
|
|
|
|
|
+ <div ref="ignoreTodayChartRef" class="gauge-chart"></div>
|
|
|
|
|
+ <div class="chart-label clickable" @click="clickStatus('设备忽略')">
|
|
|
|
|
+ <span class="label-dot label-dot-gray"></span>
|
|
|
|
|
+ <span class="label-text">忽略</span>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
@@ -264,31 +218,37 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
- <!-- 第三行:消息统计行 -->
|
|
|
|
|
- <el-row :gutter="16" class="mb-4">
|
|
|
|
|
|
|
+ <!-- 第四行:消息统计行 -->
|
|
|
|
|
+ <el-row :gutter="16" class="mb-6">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-card class="chart-card" shadow="never">
|
|
|
|
|
|
|
+ <el-card class="chart-card-enhanced" shadow="hover" style="border: none">
|
|
|
<template #header>
|
|
<template #header>
|
|
|
- <div class="flex items-center">
|
|
|
|
|
- <span class="text-base font-medium text-gray-600">巡检项状态统计</span>
|
|
|
|
|
|
|
+ <div class="chart-header">
|
|
|
|
|
+ <div class="chart-title-wrapper">
|
|
|
|
|
+ <div class="chart-title-dot chart-title-dot-purple"></div>
|
|
|
|
|
+ <span class="chart-title">巡检项状态统计</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
- <div ref="statusChartRef" class="h-[300px]"></div>
|
|
|
|
|
|
|
+ <div ref="statusChartRef" class="pie-chart-container"></div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="16">
|
|
<el-col :span="16">
|
|
|
- <el-card class="chart-card" shadow="never">
|
|
|
|
|
|
|
+ <el-card class="chart-card-enhanced" shadow="hover" style="border: none">
|
|
|
<template #header>
|
|
<template #header>
|
|
|
- <div class="flex items-center justify-between">
|
|
|
|
|
- <span class="text-base font-medium text-gray-600">近一年数量统计</span>
|
|
|
|
|
|
|
+ <div class="chart-header">
|
|
|
|
|
+ <div class="chart-title-wrapper">
|
|
|
|
|
+ <div class="chart-title-dot chart-title-dot-indigo"></div>
|
|
|
|
|
+ <span class="chart-title">近一年数量统计</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
- <div ref="chartContainer" class="h-[300px]"></div>
|
|
|
|
|
|
|
+ <div ref="chartContainer" class="bar-chart-container"></div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
- <!-- TODO 第四行:地图 -->
|
|
|
|
|
|
|
+ <!-- TODO 第五行:地图 -->
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts" name="Index">
|
|
<script setup lang="ts" name="Index">
|
|
@@ -951,4 +911,327 @@ onUnmounted(() => {
|
|
|
})
|
|
})
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
-<style lang="scss" scoped></style>
|
|
|
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
|
+// 筛选卡片样式
|
|
|
|
|
+.filter-card {
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ border: 1px solid #e5e7eb;
|
|
|
|
|
+ background: linear-gradient(to bottom, #fafafa, #ffffff);
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-card__body) {
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-form-item__label) {
|
|
|
|
|
+ color: #6b7280;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.btn-primary {
|
|
|
|
|
+ background: linear-gradient(135deg, #64748b 0%, #475569 100%);
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ background: linear-gradient(135deg, #475569 0%, #334155 100%);
|
|
|
|
|
+ transform: translateY(-1px);
|
|
|
|
|
+ box-shadow: 0 4px 8px rgba(100, 116, 139, 0.3);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.btn-default {
|
|
|
|
|
+ border-color: #d1d5db;
|
|
|
|
|
+ color: #6b7280;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ border-color: #9ca3af;
|
|
|
|
|
+ color: #4b5563;
|
|
|
|
|
+ background: #f9fafb;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 统计卡片基础样式
|
|
|
|
|
+.stat-card {
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ border: 1px solid #e5e7eb;
|
|
|
|
|
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ transform: translateY(-4px);
|
|
|
|
|
+ box-shadow: 0 12px 24px -8px rgba(0, 0, 0, 0.1);
|
|
|
|
|
+ border-color: #d1d5db;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-card__body) {
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 中性色渐变背景(低饱和度)
|
|
|
|
|
+.stat-card-neutral-1 {
|
|
|
|
|
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-card-neutral-2 {
|
|
|
|
|
+ background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-card-neutral-3 {
|
|
|
|
|
+ background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-card-neutral-4 {
|
|
|
|
|
+ background: linear-gradient(135deg, #f1f5f9 0%, #cbd5e1 100%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 统计内容区域
|
|
|
|
|
+.stat-content {
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-icon-wrapper {
|
|
|
|
|
+ width: 48px;
|
|
|
|
|
+ height: 48px;
|
|
|
|
|
+ background: #0090ff;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ box-shadow: 0 4px 8px rgba(100, 116, 139, 0.2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-icon {
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ color: white;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-title {
|
|
|
|
|
+ font-size: 15px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #475569;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-divider {
|
|
|
|
|
+ border-color: #e2e8f0;
|
|
|
|
|
+ margin: 12px 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-body {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 8px 12px;
|
|
|
|
|
+ background: rgba(255, 255, 255, 0.6);
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ transition: all 0.2s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ background: rgba(255, 255, 255, 0.9);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-sub-label {
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ color: #64748b;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-sub-value {
|
|
|
|
|
+ font-size: 28px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ line-height: 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 图表卡片增强样式
|
|
|
|
|
+.chart-card-enhanced {
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ border: 1px solid #e5e7eb;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
|
|
|
|
|
+ border-color: #d1d5db;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-card__header) {
|
|
|
|
|
+ padding: 16px 20px;
|
|
|
|
|
+ border-bottom: 1px solid #f1f5f9;
|
|
|
|
|
+ background: linear-gradient(to right, #fafafa, #ffffff);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-card__body) {
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-wrapper {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-dot {
|
|
|
|
|
+ width: 8px;
|
|
|
|
|
+ height: 8px;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-dot-blue {
|
|
|
|
|
+ background: #0055bb;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-dot-green {
|
|
|
|
|
+ background: #0055bb;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-dot-purple {
|
|
|
|
|
+ background: #0055bb;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title-dot-indigo {
|
|
|
|
|
+ background: #0055bb;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-title {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #334155;
|
|
|
|
|
+ letter-spacing: 0.3px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-grid {
|
|
|
|
|
+ min-height: 220px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ transition: all 0.2s ease;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ background: #f8fafc;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.gauge-chart {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 160px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.chart-label {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 6px;
|
|
|
|
|
+ margin-top: 8px;
|
|
|
|
|
+ padding: 6px 12px;
|
|
|
|
|
+ background: #f1f5f9;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ transition: all 0.2s ease;
|
|
|
|
|
+
|
|
|
|
|
+ .chart-item:hover & {
|
|
|
|
|
+ background: #e2e8f0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ &.clickable {
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ background: #cbd5e1;
|
|
|
|
|
+ transform: scale(1.05);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-dot {
|
|
|
|
|
+ width: 8px;
|
|
|
|
|
+ height: 8px;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-dot-blue {
|
|
|
|
|
+ background: #64748b;
|
|
|
|
|
+ box-shadow: 0 0 0 2px rgba(100, 116, 139, 0.2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-dot-amber {
|
|
|
|
|
+ background: #d97706;
|
|
|
|
|
+ box-shadow: 0 0 0 2px rgba(217, 119, 6, 0.2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-dot-gray {
|
|
|
|
|
+ background: #78716c;
|
|
|
|
|
+ box-shadow: 0 0 0 2px rgba(120, 113, 108, 0.2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.label-text {
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ color: #64748b;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.pie-chart-container {
|
|
|
|
|
+ height: 300px;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.bar-chart-container {
|
|
|
|
|
+ height: 300px;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 响应式优化
|
|
|
|
|
+@media (max-width: 1200px) {
|
|
|
|
|
+ .stat-sub-value {
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@media (max-width: 768px) {
|
|
|
|
|
+ .stat-card {
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .chart-item {
|
|
|
|
|
+ padding: 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .gauge-chart {
|
|
|
|
|
+ height: 140px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|