From 9e5caf43d7059cd5b28703b138e95b7f4df94699 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期五, 27 九月 2024 17:00:42 +0800
Subject: [PATCH] 首页图表

---
 src/views/system/data-manage/data-detail/list.js |   62 +-
 src/views/home/data-video/index.vue              |  320 ++++++++++++++++
 src/views/home/data-wrapper/index.vue            |   17 
 src/views/home/data-face/index.vue               |  336 +++++++++++++++++
 src/views/home/data-car/index.vue                |  335 +++++++++++++++++
 src/views/system/check/result/detail/index.vue   |    1 
 src/api/platform/home.js                         |   29 +
 7 files changed, 1,066 insertions(+), 34 deletions(-)

diff --git a/src/api/platform/home.js b/src/api/platform/home.js
index 55c25fa..7198b74 100644
--- a/src/api/platform/home.js
+++ b/src/api/platform/home.js
@@ -1,5 +1,32 @@
 import request from '@/utils/request'
 
+// 杩愮淮鐩戞帶鎶ヨ〃
+export function video(data) {
+  return request({
+    url: '/home/video',
+    method: 'get',
+    params: data
+  })
+}
+
+// 杩愮淮鐩戞帶鎶ヨ〃
+export function car(data) {
+  return request({
+    url: '/home/car',
+    method: 'get',
+    params: data
+  })
+}
+
+// 杩愮淮鐩戞帶鎶ヨ〃
+export function face(data) {
+  return request({
+    url: '/home/face',
+    method: 'get',
+    params: data
+  })
+}
+
 // 杩愮淮鍏徃涓嬫媺
 export function ywUnitList() {
   return request({
@@ -57,4 +84,4 @@
     method: 'get',
     params: { category }
   })
-}
\ No newline at end of file
+}
diff --git a/src/views/home/data-car/index.vue b/src/views/home/data-car/index.vue
new file mode 100644
index 0000000..c50f199
--- /dev/null
+++ b/src/views/home/data-car/index.vue
@@ -0,0 +1,335 @@
+<template>
+  <div class="data-chart-container">
+    <el-card class="data-card" :body-style="{ height: '100%' }">
+      <div class="card-content">
+        <div class="title-container">
+          <h1>杞﹁締鎶ヨ〃</h1>
+          <div class="select-container">
+            <el-select v-model="params.examineTag" placeholder="鑰冩牳鏍囩" @change="getChart" clearable>
+              <el-option v-for="item in options" :key="item.label" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+          <div>
+            <el-date-picker v-model="date" format="yyyy-MM" value-format="yyyy-MM" type="month" placeholder="閫夋嫨鏈堜唤"
+                            @change="dateChange">
+            </el-date-picker>
+          </div>
+        </div>
+        <div class="chart-container">
+          <div id="chartContent" ref="chartContent"></div>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+import {car} from "../../../api/platform/home";
+
+var chartDom = document.getElementById('main');
+var myChart = echarts.init(chartDom);
+var option;
+let observer = null;
+export default {
+  name: 'DataCar',
+  data() {
+    return {
+      date: '',
+      params: {
+        month: '',
+      },
+      options: [
+        {label: '鐪佸巺', value: 1},
+        {label: '鍏畨閮�', value: 2}
+      ],
+      dataList: [],
+    }
+  },
+  methods: {
+    dateChange() {
+      this.params.date = this.date;
+      this.getChart();
+    },
+    getChart() {
+      this.loading = true;
+      myChart.showLoading()
+      car(this.params).then(res => {
+        myChart = echarts.init(this.$refs.chartContent);
+        this.initChart(res.data);
+        this.observe();
+      })
+    },
+    groupByData(data) {
+      if (!data || data.length === 0) {
+        return this.getAllDay().map((item) => [item, []]);
+      }
+      const tempGroup = {};
+      data.forEach((item) => {
+        let {createDate} = item;
+        let tempTime = createDate.split('-');
+        createDate = tempTime[1] + '-' + tempTime[2];
+        if (!tempGroup[createDate]) {
+          tempGroup[createDate] = [];
+        }
+        tempGroup[createDate].push(item);
+      })
+      const tempArray = Object.entries(tempGroup).sort(([keyA], [keyB]) => new Date([keyA]) - new Date([keyB]));
+      return tempArray;
+    },
+    getAllDay() {
+      const currentDate = this.date.split('-');
+      const currentYear = currentDate[0];
+      const currentMonth = currentDate[1];
+      const daysInMonth = new Date(currentYear, currentMonth, 0).getDate();
+      const datesOfMonth = [];
+      for (var day = 1; day <= daysInMonth; day++) {
+        const formattedDate = currentMonth + '-' + (day.toString().padStart(2, '0'));
+        datesOfMonth.push(formattedDate);
+      }
+      return datesOfMonth;
+    },
+    initChart(data) {
+      const dataList = this.groupByData(data.list);
+      const baseLine = data.baseLine == null ? 0 : data.baseLine;
+      // 閫夋嫨杈冨ぇ鐨勫�间綔涓篩杞寸殑鏈�澶у��
+      var snapCount
+      if (!data.list || data.list.length === 0) {
+        snapCount = 0;
+      }else {
+        snapCount = data.list[data.list.length - 1].snapCount
+      }
+      const yMax = Math.max(snapCount, baseLine * 1.2);
+      const colors = ['#5470C6', '#66CC99', '#EE6666'];
+      option = {
+        color: colors,
+        tooltip: {
+          trigger: "axis", // 榧犳爣绉诲叆鍒版煴瀛愰噷闈㈠氨浼氭湁涓�涓彁绀猴紝榛樿鏄痠tem鏂瑰紡锛屽鏋滄湁澶氫釜鏌辩姸鍥撅紝鍫嗗湪涓�鍧梚tem灏变笉澶ソ浜嗭紝涓汉鍠滄axis鏂瑰紡鐨�
+          axisPointer: {
+            type: 'cross',
+            label:{
+              precision: 0
+            }
+          },
+          formatter: function (params) {
+            // 鍒涘缓涓�涓彉閲忔潵瀛樺偍鏈�缁堢殑 HTML 瀛楃涓�
+            var tooltipHtml = '';
+
+            // 棣栧厛锛屾坊鍔犲垎绫诲悕锛堟垨杞村�硷級鐨勬樉绀�
+            if (params.length > 0) {
+              tooltipHtml += "<div style='padding:0 12px;width:100%;height:24px;line-height:24px;'><p>" + params[0].name + "</p></div>";
+            }
+
+            var pointsHtml = params.map(function (item) {
+              // 浣跨敤 toLocaleString() 鏉ユ牸寮忓寲 value
+              var formattedValue = item.value? item.value.toLocaleString() : '-';
+              return `<div style="display: flex; align-items: center; font-size: 14px; padding: 0 12px; line-height: 24px;">
+                         <span style="display: inline-block; margin-right: 5px; border-radius: 2px; width: 10px; height: 10px; background-color: ${item.color || '#ccc'};"></span>
+                         <span style="margin-right: 10px;">${item.seriesName}</span>
+                         <span style="font-weight: bold;display: inline-block; min-width: 60px; margin-left: auto; text-align: right;">${formattedValue}</span>
+                      </div>`;
+            }).join('');
+            tooltipHtml = `${tooltipHtml}${pointsHtml}`;
+            tooltipHtml += `<div style="font-weight: bold; margin-top: 10px;padding:0 12px;">鎶撴媿閲忓弬鑰冨��: ${baseLine.toLocaleString()}</div>`;
+
+            return tooltipHtml;
+          }
+        },
+        grid: {
+          left: 10,
+          right: 0,
+          bottom: 0,
+          top: '20%',
+          containLabel: true
+        },
+        legend: {
+          data: ['鐐逛綅鍦ㄧ嚎', '鎶撴媿閲�']
+        },
+        xAxis: [
+          {
+            type: 'category',
+            axisTick: {
+              alignWithLabel: true
+            },
+            data: dataList.map((item) => item[0]),
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value',
+            name: '鐐逛綅鏁�',
+            position: 'left',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[0]
+              }
+
+            },
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+          },
+          {
+            type: 'value',
+            name: '鎶撴媿閲�',
+            max: yMax,
+            min: 0,
+            position: 'right',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[1]
+              }
+            },
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+          }
+        ],
+        series: [
+          {
+            type: 'line',
+            yAxisIndex: 1,
+            markLine: {
+              symbol: 'none',
+              data: [
+                {
+                  yAxis: baseLine, // 鑷畾涔変笅闄愬��
+                  name: '鍙傝�冩姄鎷嶉噺', // 鍩哄噯绾垮悕绉�
+                  label: { // 涓嶆樉绀哄熀鍑嗙嚎鍚嶇О
+                    show: false,
+                  },
+                  lineStyle: {
+                    type: 'dashed', // 鍩哄噯绾挎牱寮忎负铏氱嚎
+                    color: '#b17063',
+                  },
+                },
+              ],
+            },
+          },
+          {
+            name: '鐐逛綅鍦ㄧ嚎',
+            type: 'line',
+            yAxisIndex: 0,
+            color: colors[0],
+            tooltip: {
+              valueFormatter: function (value) {
+                return value;
+              }
+            },
+            data: data.list.map(item => {
+              return item['online'] ? item['online'] : null;
+            })
+          },
+          {
+            name: '鎶撴媿閲�',
+            type: 'bar',
+            yAxisIndex: 1,
+            color: colors[1],
+            tooltip: {
+              valueFormatter: function (value) {
+                return value;
+              }
+            },
+            data: data.list.map(item => {
+              return item['snapCount'] ? item['snapCount'] : null;
+            })
+          },
+        ]
+      };
+
+      myChart.setOption(option);
+      myChart.hideLoading();
+    },
+
+    // 鐩戝惉鍙樺寲
+    observe() {
+      if (!observer) {
+        observer = new ResizeObserver(entries => {
+          this.handleResize();
+        })
+      }
+      observer.observe(this.$refs.chartContent);
+    },
+    // 绐楀彛鍙樻崲
+    handleResize() {
+      if (myChart) {
+        myChart.resize();
+      }
+    }
+
+  },
+  mounted() {
+    const date = new Date();
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1) >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
+    this.date = year + '-' + month;
+    this.params.date = this.date;
+    this.getChart();
+    this.observe();
+  },
+  beforeDestroy() {
+    if (myChart) {
+      myChart.dispose();
+      observer.unobserve(this.$refs.chartContent);
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.data-chart-container {
+  height: 400px;
+  margin-bottom: 20px;
+
+  .data-card {
+    height: 100%;
+
+    .card-content {
+      width: 100%;
+      height: 100%;
+      position: relative;
+    }
+  }
+}
+
+.title-container {
+  position: absolute;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  z-index: 2;
+
+  .more-button {
+    cursor: pointer;
+    font-size: 16px;
+    padding: 0 10px;
+  }
+}
+
+.chart-container {
+
+  width: 100%;
+  height: 100%;
+
+  #chartContent {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.select-container {
+  margin: 0 20px;
+  width: 180px;
+}
+</style>
diff --git a/src/views/home/data-face/index.vue b/src/views/home/data-face/index.vue
new file mode 100644
index 0000000..ae50412
--- /dev/null
+++ b/src/views/home/data-face/index.vue
@@ -0,0 +1,336 @@
+<template>
+  <div class="data-chart-container">
+    <el-card class="data-card" :body-style="{ height: '100%' }">
+      <div class="card-content">
+        <div class="title-container">
+          <h1>浜鸿劯鎶ヨ〃</h1>
+          <div class="select-container">
+            <el-select v-model="params.examineTag" placeholder="鑰冩牳鏍囩" @change="getChart" clearable>
+              <el-option v-for="item in options" :key="item.label" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+          <div>
+            <el-date-picker v-model="date" format="yyyy-MM" value-format="yyyy-MM" type="month" placeholder="閫夋嫨鏈堜唤"
+                            @change="dateChange">
+            </el-date-picker>
+          </div>
+        </div>
+        <div class="chart-container">
+          <div id="chartContent" ref="chartContent"></div>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+import {car, face} from "../../../api/platform/home";
+
+var chartDom = document.getElementById('main');
+var myChart = echarts.init(chartDom);
+var option;
+let observer = null;
+export default {
+  name: 'DataCar',
+  data() {
+    return {
+      date: '',
+      params: {
+        month: '',
+      },
+      options: [
+        {label: '鐪佸巺', value: 1},
+        {label: '鍏畨閮�', value: 2}
+      ],
+      dataList: [],
+    }
+  },
+  methods: {
+    dateChange() {
+      this.params.date = this.date;
+      this.getChart();
+    },
+    getChart() {
+      this.loading = true;
+      myChart.showLoading()
+      face(this.params).then(res => {
+        myChart = echarts.init(this.$refs.chartContent);
+        this.initChart(res.data);
+        this.observe();
+      })
+    },
+    groupByData(data) {
+      if (!data || data.length === 0) {
+        return this.getAllDay().map((item) => [item, []]);
+      }
+      const tempGroup = {};
+      data.forEach((item) => {
+        let {createDate} = item;
+        let tempTime = createDate.split('-');
+        createDate = tempTime[1] + '-' + tempTime[2];
+        if (!tempGroup[createDate]) {
+          tempGroup[createDate] = [];
+        }
+        tempGroup[createDate].push(item);
+      })
+      const tempArray = Object.entries(tempGroup).sort(([keyA], [keyB]) => new Date([keyA]) - new Date([keyB]));
+      return tempArray;
+    },
+    getAllDay() {
+      const currentDate = this.date.split('-');
+      const currentYear = currentDate[0];
+      const currentMonth = currentDate[1];
+      const daysInMonth = new Date(currentYear, currentMonth, 0).getDate();
+      const datesOfMonth = [];
+      for (var day = 1; day <= daysInMonth; day++) {
+        const formattedDate = currentMonth + '-' + (day.toString().padStart(2, '0'));
+        datesOfMonth.push(formattedDate);
+      }
+      return datesOfMonth;
+    },
+    initChart(data) {
+      const dataList = this.groupByData(data.list);
+      const baseLine = data.baseLine == null ? 0 : data.baseLine;
+      // 閫夋嫨杈冨ぇ鐨勫�间綔涓篩杞寸殑鏈�澶у��
+      var snapCount
+      if (!data.list || data.list.length === 0) {
+        snapCount = 0;
+      }else {
+        snapCount = data.list[data.list.length - 1].snapCount
+      }
+      const yMax = Math.max(snapCount, baseLine * 1.2);
+      const colors = ['#5470C6', '#66CC99', '#EE6666'];
+      option = {
+        color: colors,
+        tooltip: {
+          trigger: "axis", // 榧犳爣绉诲叆鍒版煴瀛愰噷闈㈠氨浼氭湁涓�涓彁绀猴紝榛樿鏄痠tem鏂瑰紡锛屽鏋滄湁澶氫釜鏌辩姸鍥撅紝鍫嗗湪涓�鍧梚tem灏变笉澶ソ浜嗭紝涓汉鍠滄axis鏂瑰紡鐨�
+          axisPointer: {
+            type: 'cross',
+            label:{
+              precision: 0
+            }
+          },
+          formatter: function (params) {
+            // 鍒涘缓涓�涓彉閲忔潵瀛樺偍鏈�缁堢殑 HTML 瀛楃涓�
+            var tooltipHtml = '';
+
+            // 棣栧厛锛屾坊鍔犲垎绫诲悕锛堟垨杞村�硷級鐨勬樉绀�
+            if (params.length > 0) {
+              tooltipHtml += "<div style='padding:0 12px;width:100%;height:24px;line-height:24px;'><p>" + params[0].name + "</p></div>";
+            }
+
+            var pointsHtml = params.map(function (item) {
+              // 浣跨敤 toLocaleString() 鏉ユ牸寮忓寲 value
+              var formattedValue = item.value? item.value.toLocaleString() : '-';
+              return `<div style="display: flex; align-items: center; font-size: 14px; padding: 0 12px; line-height: 24px;">
+                         <span style="display: inline-block; margin-right: 5px; border-radius: 2px; width: 10px; height: 10px; background-color: ${item.color || '#ccc'};"></span>
+                         <span style="margin-right: 10px;">${item.seriesName}</span>
+                         <span style="font-weight: bold;display: inline-block; min-width: 60px; margin-left: auto; text-align: right;">${formattedValue}</span>
+                      </div>`;
+            }).join('');
+            tooltipHtml = `${tooltipHtml}${pointsHtml}`;
+            tooltipHtml += `<div style="font-weight: bold; margin-top: 10px;padding:0 12px;">鎶撴媿閲忓弬鑰冨��: ${baseLine.toLocaleString()}</div>`;
+
+            return tooltipHtml;
+          }
+        },
+        grid: {
+          left: 10,
+          right: 0,
+          bottom: 0,
+          top: '20%',
+          containLabel: true
+        },
+        legend: {
+          data: ['鐐逛綅鍦ㄧ嚎', '鎶撴媿閲�']
+        },
+        xAxis: [
+          {
+            type: 'category',
+            axisTick: {
+              alignWithLabel: true
+            },
+            data: dataList.map((item) => item[0]),
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value',
+            name: '鐐逛綅鏁�',
+            position: 'left',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[0]
+              }
+            },
+
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+
+          },
+          {
+            type: 'value',
+            name: '鎶撴媿閲�',
+            max: yMax,
+            min: 0,
+            position: 'right',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[1]
+              }
+            },
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+          }
+        ],
+        series: [
+          {
+            type: 'line',
+            yAxisIndex: 1,
+            markLine: {
+              symbol: 'none',
+              data: [
+                {
+                  yAxis: baseLine, // 鑷畾涔変笅闄愬��
+                  name: '鍙傝�冩姄鎷嶉噺', // 鍩哄噯绾垮悕绉�
+                  label: { // 涓嶆樉绀哄熀鍑嗙嚎鍚嶇О
+                    show: false,
+                  },
+                  lineStyle: {
+                    type: 'dashed', // 鍩哄噯绾挎牱寮忎负铏氱嚎
+                    color: '#b17063',
+                  },
+                },
+              ],
+            },
+          },
+          {
+            name: '鐐逛綅鍦ㄧ嚎',
+            type: 'line',
+            yAxisIndex: 0,
+            color: colors[0],
+            tooltip: {
+              valueFormatter: function (value) {
+                return value;
+              }
+            },
+            data: data.list.map(item => {
+              return item['online'] ? item['online'] : null;
+            })
+          },
+          {
+            name: '鎶撴媿閲�',
+            type: 'bar',
+            yAxisIndex: 1,
+            color: colors[1],
+            tooltip: {
+              valueFormatter: function (value) {
+                return value;
+              }
+            },
+            data: data.list.map(item => {
+              return item['snapCount'] ? item['snapCount'] : null;
+            })
+          },
+        ]
+      };
+
+      myChart.setOption(option);
+      myChart.hideLoading();
+    },
+
+    // 鐩戝惉鍙樺寲
+    observe() {
+      if (!observer) {
+        observer = new ResizeObserver(entries => {
+          this.handleResize();
+        })
+      }
+      observer.observe(this.$refs.chartContent);
+    },
+    // 绐楀彛鍙樻崲
+    handleResize() {
+      if (myChart) {
+        myChart.resize();
+      }
+    }
+
+  },
+  mounted() {
+    const date = new Date();
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1) >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
+    this.date = year + '-' + month;
+    this.params.date = this.date;
+    this.getChart();
+    this.observe();
+  },
+  beforeDestroy() {
+    if (myChart) {
+      myChart.dispose();
+      observer.unobserve(this.$refs.chartContent);
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.data-chart-container {
+  height: 400px;
+  margin-bottom: 20px;
+
+  .data-card {
+    height: 100%;
+
+    .card-content {
+      width: 100%;
+      height: 100%;
+      position: relative;
+    }
+  }
+}
+
+.title-container {
+  position: absolute;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  z-index: 2;
+
+  .more-button {
+    cursor: pointer;
+    font-size: 16px;
+    padding: 0 10px;
+  }
+}
+
+.chart-container {
+
+  width: 100%;
+  height: 100%;
+
+  #chartContent {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.select-container {
+  margin: 0 20px;
+  width: 180px;
+}
+</style>
diff --git a/src/views/home/data-video/index.vue b/src/views/home/data-video/index.vue
new file mode 100644
index 0000000..47febe7
--- /dev/null
+++ b/src/views/home/data-video/index.vue
@@ -0,0 +1,320 @@
+<template>
+  <div class="data-chart-container">
+    <el-card class="data-card" :body-style="{ height: '100%' }">
+      <div class="card-content">
+        <div class="title-container">
+          <h1>瑙嗛鎶ヨ〃</h1>
+          <div class="select-container">
+            <el-select v-model="params.examineTag" placeholder="鑰冩牳鏍囩" @change="getChart" clearable>
+              <el-option v-for="item in options" :key="item.label" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </div>
+          <div >
+            <el-date-picker v-model="date" format="yyyy-MM" value-format="yyyy-MM" type="month" placeholder="閫夋嫨鏈堜唤"
+                            @change="dateChange">
+            </el-date-picker>
+          </div>
+        </div>
+        <div class="chart-container">
+          <div id="chartContent" ref="chartContent"></div>
+        </div>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+import {video} from "../../../api/platform/home";
+var chartDom = document.getElementById('main');
+var myChart = echarts.init(chartDom);
+var option;
+let observer = null;
+export default {
+  name: 'DataVideo',
+  data() {
+    return {
+      date: '',
+      params: {
+        month: '',
+      },
+      options: [
+        {label: '鐪佸巺', value: 1},
+        {label: '鍏畨閮�', value: 2}
+      ],
+      dataList: [],
+    }
+  },
+  methods: {
+    dateChange() {
+      this.params.date = this.date;
+      this.getChart();
+    },
+    getChart() {
+      this.loading = true;
+      myChart.showLoading();
+      video(this.params).then(res => {
+        myChart = echarts.init(this.$refs.chartContent);
+        this.initChart(res.data);
+        this.observe();
+      })
+    },
+    groupByData(data) {
+      if (!data || data.length ===0) {
+        return this.getAllDay().map((item) => [item, []]);
+      }
+      const tempGroup = {};
+      data.forEach((item) => {
+        let {createDate} = item;
+        let tempTime = createDate.split('-');
+        createDate = tempTime[1] + '-' + tempTime[2];
+        if (!tempGroup[createDate]) {
+          tempGroup[createDate] = [];
+        }
+        tempGroup[createDate].push(item);
+      })
+      const tempArray = Object.entries(tempGroup).sort(([keyA], [keyB]) => new Date([keyA]) - new Date([keyB]));
+      return tempArray;
+    },
+    getAllDay() {
+      const currentDate = this.date.split('-');
+      const currentYear = currentDate[0];
+      const currentMonth = currentDate[1];
+      const daysInMonth = new Date(currentYear, currentMonth, 0).getDate();
+      const datesOfMonth = [];
+      for (var day = 1; day <= daysInMonth; day++) {
+        const formattedDate = currentMonth + '-' + (day.toString().padStart(2, '0'));
+        datesOfMonth.push(formattedDate);
+      }
+      return datesOfMonth;
+    },
+    initChart(data) {
+      const dataList = this.groupByData(data.list);
+      const baseLine = data.baseLine == null ? 0 : data.baseLine;
+      const colors = ['#5470C6', '#66CC99', '#EE6666'];
+      option = {
+        color: colors,
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross',
+            label:{
+              precision: 0
+            }
+          },
+          formatter: function (params) {
+            // 鍒涘缓涓�涓彉閲忔潵瀛樺偍鏈�缁堢殑 HTML 瀛楃涓�
+            var tooltipHtml = '';
+
+            // 棣栧厛锛屾坊鍔犲垎绫诲悕锛堟垨杞村�硷級鐨勬樉绀�
+            if (params.length > 0) {
+              tooltipHtml += "<div style='padding:0 12px;width:100%;height:24px;line-height:24px;'><p>" + params[0].name + "</p></div>";
+            }
+
+            var pointsHtml = params.map(function (item) {
+              // 浣跨敤 toLocaleString() 鏉ユ牸寮忓寲 value
+              var formattedValue = item.value? item.value.toLocaleString() : '-';
+              return `<div style="display: flex; align-items: center; font-size: 14px; padding: 0 12px; line-height: 24px;">
+                         <span style="display: inline-block; margin-right: 5px; border-radius: 2px; width: 10px; height: 10px; background-color: ${item.color || '#ccc'};"></span>
+                         <span style="margin-right: 10px;">${item.seriesName}</span>
+                         <span style="font-weight: bold;display: inline-block; min-width: 60px; margin-left: auto; text-align: right;">${formattedValue}</span>
+                      </div>`;
+            }).join('');
+            tooltipHtml = `${tooltipHtml}${pointsHtml}`;
+            tooltipHtml += `<div style="font-weight: bold; margin-top: 10px;padding:0 12px;">褰曞儚姝e父鍙傝�冨��: ${baseLine.toLocaleString()}</div>`;
+
+            return tooltipHtml;
+          }
+        },
+        grid: {
+          left: 10,
+          right: 0,
+          bottom: 0,
+          top: '20%',
+          containLabel: true
+        },
+        legend: {
+          data: ['鐐逛綅鍦ㄧ嚎', '褰曞儚瀹屾暣', '褰曞儚缂哄け']
+        },
+        xAxis: [
+          {
+            type: 'category',
+            axisTick: {
+              alignWithLabel: true
+            },
+            data: dataList.map((item) => item[0]),
+          }
+        ],
+        yAxis: [
+          {
+            type: 'value',
+            name: '褰曞儚鏁�',
+            position: 'right',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[1]
+              }
+            },
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+          },
+          {
+            type: 'value',
+            name: '鐐逛綅鏁�',
+            position: 'left',
+            alignTicks: true,
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: colors[0]
+              }
+            },
+            axisLabel: {
+              formatter: function (value) {
+                // 杩斿洖鏁存暟閮ㄥ垎锛屾垨浣跨敤鍏朵粬閫昏緫鏉ユ牸寮忓寲鏍囩
+                return Math.floor(value);
+              }
+            }
+          }
+        ],
+        series: [
+          {
+            yAxisIndex: 0,
+            type: 'line',
+            markLine: {
+              symbol: 'none',
+              data: [
+                {
+                  yAxis: baseLine, // 鑷畾涔変笅闄愬��
+                  name: '鍙傝�冨綍鍍忔甯告暟', // 鍩哄噯绾垮悕绉�
+                  label: { // 涓嶆樉绀哄熀鍑嗙嚎鍚嶇О
+                    show: false,
+                  },
+                  lineStyle: {
+                    type: 'dashed', // 鍩哄噯绾挎牱寮忎负铏氱嚎
+                    color: '#b17063',
+                  },
+                },
+              ],
+            },
+          },
+          {
+            name: '褰曞儚瀹屾暣',
+            yAxisIndex: 0,
+            type: 'bar',
+            data: data.list.map(item => {
+              return item['integrityNum'];
+            })
+          },
+          {
+            name: '褰曞儚缂哄け',
+            type: 'bar',
+            yAxisIndex: 0,
+            data:  data.list.map(item => {
+              return item['loseNum'];
+            })
+          },
+          {
+            name: '鐐逛綅鍦ㄧ嚎',
+            type: 'line',
+            yAxisIndex: 1,
+            data: data.list.map(item => {
+              return item['online'];
+            })
+          },
+        ]
+      };
+
+      option && myChart.setOption(option);
+      myChart.hideLoading();
+    },
+
+
+    // 鐩戝惉鍙樺寲
+    observe() {
+      if (!observer) {
+        observer = new ResizeObserver(entries => {
+          this.handleResize();
+        })
+      }
+      observer.observe(this.$refs.chartContent);
+    },
+    // 绐楀彛鍙樻崲
+    handleResize() {
+      if (myChart) {
+        myChart.resize();
+      }
+    }
+
+  },
+  mounted() {
+    const date = new Date();
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1) >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
+    this.date = year + '-' + month;
+    this.params.date = this.date;
+    this.getChart();
+    this.observe();
+  },
+  beforeDestroy() {b
+    if (myChart) {
+      myChart.dispose();
+      observer.unobserve(this.$refs.chartContent);
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.data-chart-container {
+  height: 400px;
+  margin-bottom: 20px;
+
+  .data-card {
+    height: 100%;
+
+    .card-content {
+      width: 100%;
+      height: 100%;
+      position: relative;
+    }
+  }
+}
+
+.title-container {
+  position: absolute;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  z-index: 2;
+
+  .more-button {
+    cursor: pointer;
+    font-size: 16px;
+    padding: 0 10px;
+  }
+}
+
+.chart-container {
+
+  width: 100%;
+  height: 100%;
+
+  #chartContent {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.select-container {
+  margin: 0 20px;
+  width: 180px;
+}
+</style>
diff --git a/src/views/home/data-wrapper/index.vue b/src/views/home/data-wrapper/index.vue
index a424f12..6db217f 100644
--- a/src/views/home/data-wrapper/index.vue
+++ b/src/views/home/data-wrapper/index.vue
@@ -1,5 +1,14 @@
 <template>
   <div class="data-container">
+    <div>
+      <data-video></data-video>
+    </div>
+    <div>
+      <data-car></data-car>
+    </div>
+    <div>
+      <data-face></data-face>
+    </div>
     <el-row :gutter="40">
       <el-col :xs='24' :md="24" :sm="24" :lg="24" :xl="12">
         <data-chart></data-chart>
@@ -26,6 +35,9 @@
 import DataCheck from '../data-check/index.vue';
 import WorkOrder from '../work-order/index.vue';
 import DataChart from '../data-chart/index.vue';
+import DataVideo from '../data-video/index.vue';
+import DataCar from '../data-car/index.vue';
+import DataFace from '../data-face/index.vue';
 export default {
   name: 'DataWrapper',
   components: {
@@ -34,7 +46,10 @@
     DataCheck,
     WorkOrder,
     Examine,
-    DataChart
+    DataChart,
+    DataVideo,
+    DataCar,
+    DataFace
   }
 }
 </script>
diff --git a/src/views/system/check/result/detail/index.vue b/src/views/system/check/result/detail/index.vue
index c7507dd..e078471 100644
--- a/src/views/system/check/result/detail/index.vue
+++ b/src/views/system/check/result/detail/index.vue
@@ -376,7 +376,6 @@
 
     dateChange() {
       this.queryParams.date = this.date;
-      console.log(this.queryParams);
       this.getChart(this.queryParams.deptId);
     }
 
diff --git a/src/views/system/data-manage/data-detail/list.js b/src/views/system/data-manage/data-detail/list.js
index 3bd813d..0915eae 100644
--- a/src/views/system/data-manage/data-detail/list.js
+++ b/src/views/system/data-manage/data-detail/list.js
@@ -339,7 +339,7 @@
               label: '绾害寮傚父鏁�'
             },
             {
-              label: '鍚堟牸鐜�'
+              label: '浠婃棩鍚堟牸鐜�'
             },
           ]
         }
@@ -671,7 +671,7 @@
               label: '绾害寮傚父鏁�'
             },
             {
-              label: '娉ㄥ唽鐜�'
+              label: '浠婃棩娉ㄥ唽鐜�'
             },
           ]
         }
@@ -701,7 +701,7 @@
       ],
     },
     {
-      title: '鑰冩牳妗f姣�',
+      title: '妗f鑰冩牳姣�',
       index: 'archives_rate',
       columns: [
         {
@@ -1003,7 +1003,7 @@
               label: '绾害寮傚父鏁�'
             },
             {
-              label: '鑰冩牳姣�'
+              label: '浠婃棩鑰冩牳姣�'
             },
           ]
         }
@@ -1165,7 +1165,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -1316,7 +1316,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -1408,7 +1408,7 @@
               label: '寮傚父'
             },
             {
-              label: '鍙敤鐜�'
+              label: '浠婃棩鍙敤鐜�'
             },
           ]
         }
@@ -1488,7 +1488,7 @@
               label: '寮傚父'
             },
             {
-              label: '鍙敤鐜�'
+              label: '浠婃棩鍙敤鐜�'
             },
           ]
         }
@@ -1965,7 +1965,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -2057,7 +2057,7 @@
               label: '寮傚父'
             },
             {
-              label: '鍙敤鐜�'
+              label: '浠婃棩閲嶇偣鍙敤鐜�'
             },
           ]
         }
@@ -2158,7 +2158,7 @@
               label: 'osd鏃堕棿鏍囨敞閿欒鏁�'
             },
             {
-              label: '鏍囨敞姝g‘鐜�'
+              label: '浠婃棩鏍囨敞姝g‘鐜�'
             },
           ]
         }
@@ -2253,7 +2253,7 @@
               label: 'osd鏃堕棿鏍囨敞閿欒鏁�'
             },
             {
-              label: '鏍℃椂姝g‘鐜�'
+              label: '浠婃棩鏍℃椂姝g‘鐜�'
             },
           ]
         }
@@ -2412,7 +2412,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -2623,7 +2623,7 @@
               label: '鏁版嵁閲忓皯'
             },
             {
-              label: '绋冲畾鎬�'
+              label: '浠婃棩绋冲畾鎬�'
             },
           ]
         }
@@ -2702,7 +2702,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -3011,7 +3011,7 @@
               label: '绾害寮傚父鏁�'
             },
             {
-              label: '涓�鑷寸巼'
+              label: '浠婃棩涓�鑷寸巼'
             },
           ]
         }
@@ -3105,7 +3105,7 @@
               label: '绮惧害杩囦綆'
             },
             {
-              label: '鍑嗙‘鐜�'
+              label: '浠婃棩鍑嗙‘鐜�'
             },
           ]
         }
@@ -3211,7 +3211,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '瀹屾暣鎬�'
+              label: '浠婃棩瀹屾暣鎬�'
             }
           ]
         }
@@ -3303,7 +3303,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '鍑嗙‘鎬�'
+              label: '浠婃棩鍑嗙‘鎬�'
             }
           ]
         }
@@ -3566,7 +3566,7 @@
               label: '鏁版嵁閲忓皯'
             },
             {
-              label: '鍑嗙‘鎬�'
+              label: '浠婃棩鍑嗙‘鎬�'
             },
           ]
         }
@@ -3679,7 +3679,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '鍙婃椂鎬�'
+              label: '浠婃棩鍙婃椂鎬�'
             }
           ]
         }
@@ -3767,7 +3767,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '鍙敤鎬�'
+              label: '浠婃棩鍙敤鎬�'
             }
           ]
         }
@@ -3891,7 +3891,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '鍙敤鎬�'
+              label: '浠婃棩鍙敤鎬�'
             }
           ]
         }
@@ -3983,7 +3983,7 @@
               label: '鏁版嵁閲忓皯'
             },
             {
-              label: '绋冲畾鎬�'
+              label: '浠婃棩绋冲畾鎬�'
             },
           ]
         }
@@ -4055,7 +4055,7 @@
               label: '璁惧鎬绘暟'
             },
             {
-              label: '鍦ㄧ嚎鐜�'
+              label: '浠婃棩鍦ㄧ嚎鐜�'
             },
           ]
         }
@@ -4364,7 +4364,7 @@
               label: '绾害寮傚父鏁�'
             },
             {
-              label: '涓�鑷寸巼'
+              label: '浠婃棩涓�鑷寸巼'
             },
           ]
         }
@@ -4462,7 +4462,7 @@
               label: '绮惧害杩囦綆'
             },
             {
-              label: '鍑嗙‘鐜�'
+              label: '浠婃棩鍑嗙‘鐜�'
             },
           ]
         }
@@ -4526,7 +4526,7 @@
               label: '绮惧害杩囦綆'
             },
             {
-              label: '鍚堟牸鎬�'
+              label: '浠婃棩鍚堟牸鎬�'
             },
           ]
         }
@@ -4755,7 +4755,7 @@
               label: '鏁版嵁閲忓皯'
             },
             {
-              label: '鍑嗙‘鎬�'
+              label: '浠婃棩鍑嗙‘鎬�'
             },
           ]
         }
@@ -4978,7 +4978,7 @@
               label: '鏁版嵁閲忓皯'
             },
             {
-              label: '鍙婃椂鎬�'
+              label: '浠婃棩鍙婃椂鎬�'
             },
           ]
         }
@@ -5108,7 +5108,7 @@
           icon: 'el-icon-truck',
           dataList: [
             {
-              label: '鍙敤鎬�'
+              label: '浠婃棩鍙敤鎬�'
             }
           ]
         }

--
Gitblit v1.8.0