From 06b2f5be922e87d086d1d4e6cdcc2119e7d3a1a4 Mon Sep 17 00:00:00 2001
From: k94314517 <8417338+k94314517@user.noreply.gitee.com>
Date: 星期三, 09 七月 2025 14:36:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 admin/src/views/business/dangerStatic.vue |  586 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 536 insertions(+), 50 deletions(-)

diff --git a/admin/src/views/business/dangerStatic.vue b/admin/src/views/business/dangerStatic.vue
index 4d5d385..b43d2af 100644
--- a/admin/src/views/business/dangerStatic.vue
+++ b/admin/src/views/business/dangerStatic.vue
@@ -1,23 +1,76 @@
 <template>
-  <div class="main_app">
-    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"
-      @changeForm='changeForm'>
-      <template #fastdate>
-        <el-radio-group v-model="filters.fastdate" size="small" @input="changeForm">
-          <el-radio-button label="0">褰撳ぉ</el-radio-button>
-          <el-radio-button label="6">杩�7澶�</el-radio-button>
-          <el-radio-button label="29">杩�30澶�</el-radio-button>
-        </el-radio-group>
-      </template>
-    </QueryForm>
+  <div class="main_app1">
+    <div class="main_head">
+      <div class="main_head_item blue">
+        <span>{{totalList.total}}</span>
+        <span>鎬婚殣鎮f暟</span>
+      </div>
+      <div class="main_head_item red">
+        <span>{{totalList.waitDeal}}</span>
+        <span>寰呭鐞�</span>
+      </div>
+      <div class="main_head_item yellow">
+        <span>{{totalList.dealFinish}}</span>
+        <span>宸叉暣鏀�</span>
+      </div>
+      <div class="main_head_item orange">
+        <span>{{totalList.back}}</span>
+        <span>宸查��鍥�</span>
+      </div>
+      <div class="main_head_item darkBlue">
+        <span>{{totalList.todayNew}}</span>
+        <span>浠婃棩鏂板</span>
+      </div>
+    </div>
+<!--    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"-->
+<!--      @changeForm='changeForm'>-->
+<!--      <template #fastdate>-->
+<!--        <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">-->
+<!--          <el-radio-button label="0">褰撳ぉ</el-radio-button>-->
+<!--          <el-radio-button label="6">杩�7澶�</el-radio-button>-->
+<!--          <el-radio-button label="29">杩�30澶�</el-radio-button>-->
+<!--        </el-radio-group>-->
+<!--      </template>-->
+<!--    </QueryForm>-->
     <div class="main_content">
       <div class="type_wrap">
-        <div class="title">闅愭偅绫诲瀷缁熻</div>
-        <div class="type" ref="typeRef"></div>
+        <div class="title">鏈湀闅愭偅绫诲瀷缁熻</div>
+        <div v-show="typeList && typeList.length > 0" class="echart1" ref="typeRef"></div>
+        <div v-show="typeList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
+          <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
+        </div>
+
       </div>
       <div class="dept_wrap">
-        <div class="title">闅愭偅褰掑睘閮ㄩ棬缁熻</div>
-        <div class="dept" ref="deptRef"></div>
+        <div class="title">鏈湀闅愭偅褰掑睘閮ㄩ棬缁熻</div>
+        <div v-show="deptList && deptList.length > 0" class="echart2" ref="deptRef"></div>
+        <div v-show="deptList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
+          <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
+        </div>
+      </div>
+    </div>
+    <div class="main_table">
+      <div class="main_table_echart">
+        <div class="title">鏈勾闅愭偅瓒嬪娍</div>
+        <div id="echart3" v-show="yearList.length > 0"></div>
+        <div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-show="yearList.length === 0">
+          <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
+        </div>
+      </div>
+      <div class="main_table_list">
+        <div class="title">鏈湀棰戠箒鍙戠敓闅愭偅鍖哄煙Top10</div>
+        <div class="list_head">
+          <div class="list_head_item">璐d换閮ㄩ棬</div>
+          <div class="list_head_item">闅愭偅鍖哄煙</div>
+          <div class="list_head_item">闅愭偅鏁伴噺</div>
+        </div>
+        <div class="table_box">
+          <div class="list_content" v-for="(item, index) in departmentList" :key="index">
+            <div class="list_head_item">{{item.name}}</div>
+            <div class="list_head_item">{{item.categoryName}}</div>
+            <div class="list_head_item">{{item.total}}</div>
+          </div>
+        </div>
       </div>
     </div>
   </div>
@@ -25,14 +78,20 @@
 
 <script>
 import QueryForm from '@/components/common/QueryForm'
-import echarts from 'echarts'
+import * as echarts from 'echarts'
+import { hiddenDangerDataPost } from '@/api/business/hiddenDanger'
+import dayjs from 'dayjs'
 export default {
   components: {
     QueryForm,
   },
   data() {
     return {
-      filters: {},
+      filters: {
+        fastdate: '29',
+        queryStartTime: '',
+        queryEndTime: ''
+      },
       queryFormConfig: {
         formItems: [
           {
@@ -40,16 +99,14 @@
             type: 'select',
             label: '鐘舵��',
             options: [
-              { label: '璁垮鐢宠', value: '0' },
-              { label: '璁垮鎶ュ', value: '1' },
-              { label: '鐢ㄨ溅鐢宠', value: '2' },
-              { label: '闅愭偅闅忔墜鎷�', value: '3' },
-              { label: '鐗╂祦杞︾敵璇�', value: '6' }
+              { label: '寰呭鐞�', value: '0' },
+              { label: '宸插鐞�', value: '1' },
+              { label: '宸查��鍥�', value: '2' },
             ]
           },
           {
-            filed1: 'startDate',
-            filed2: 'endDate',
+            filed1: 'queryStartTime',
+            filed2: 'queryEndTime',
             type: 'datetime',
             label: '鎻愭姤鏃堕棿'
           },
@@ -61,17 +118,297 @@
         ],
         online: true
       },
+      typeList: [],
+      deptList: [],
+      totalList: {
+        total: 0,
+        waitDeal: 0,
+        dealFinish: 0,
+        back: 0,
+        todayNew: 0
+      },
+      yearList: [],
+      departmentList: []
     }
   },
+  mounted() {
+    this.changeRadio('29')
+    this.initDept3()
+    // this.getData()
+  },
   methods: {
-    getData(page) {
-      console.log(this.filters)
+    changeRadio(day) {
+      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
+      this.filters.queryStartTime = arr[0]
+      this.filters.queryEndTime = arr[1]
+      this.getData()
     },
-    changeForm(form) {
-      console.log(form)
+    getData(page) {
+      hiddenDangerDataPost({ ...this.filters }).then(res => {
+        if (res) {
+          this.totalList.total = res.total || 0
+          this.totalList.waitDeal = res.waitDeal || 0
+          this.totalList.dealFinish = res.dealFinish || 0
+          this.totalList.back = res.back || 0
+          this.totalList.todayNew = res.todayNew || 0
+
+          this.yearList = res.yearList
+
+          this.departmentList = res.departmentList.slice(0, 10)
+
+          this.typeList = res.cateList || []
+          this.deptList = res.departmentList || []
+          this.$nextTick(() => {
+            this.initType()
+            this.initDept()
+            this.initDept3()
+          })
+
+        }
+      })
+
+    },
+    changeForm(e) {
+      this.getData()
+    },
+    initType() {
+      const myChart = echarts.init(document.querySelector('.echart1'))
+      let total = 0
+      this.typeList.forEach(i => {
+        total += i.total
+      })
+      let colors = ['#d75a44', '#e39f4d', '#f0d05f', '#7ac7f6', '#4469ee', '#698af0','#86a2f1','#a1b4f6','#a0b5f5', '#9fb5f4', '#b6c7f7', '#c8d5f8']
+      let option = {
+        grid: {
+          left: '0%',
+          right: '0%',
+          bottom: '0%',
+          top: '0%',
+          containLabel: true
+        },
+        title: [
+          {
+            text: '闅愭偅鎬绘暟',
+            top: '46%',
+            left: '45%',
+            textStyle: {
+              color: '#666666',
+              fontSize: 13,
+            },
+          }, {
+            text: total,
+            top: '50%',
+            left: '47.6%',
+            textStyle: {
+              color: '#080404',
+              fontSize: 16,
+              fontWeight: 'bold',
+            },
+          }],
+        legend: {
+          left: 'center',
+          bottom: '8%',
+          itemGap: 30,
+          itemWidth: 30,
+          icon: 'circle',
+          formatter: (name) => {
+            const item = this.typeList.filter((item) => item.name === name)[0]
+
+            if (item) {
+              return ` ${name} ${item.total} | ${item.rata}%`
+            } else {
+              return ` ${name} 0 | 0%`
+            }
+          }
+        },
+        series: [
+          {
+            type: 'pie',
+            radius: ['34%', '50%'],
+            label: {
+              formatter: "{a|{b}}\n\n{c} | {d}%",
+              rich: {
+                a: {
+                  color: '#333333',
+                  fontSize: 14,
+                  fontWeight: 500
+                }
+              }
+            },
+            labelLine: {
+              showAbove: true,
+              show: true,
+              length: 24,
+              length2: 64,
+              lineStyle: {
+                width: 2      // 绾挎潯瀹藉害
+              }
+            },
+            data: this.typeList.map((i, index) => {
+              return {
+                value: i.total,
+                name: i.name,
+                itemStyle: {
+                  color: colors[index]
+                }
+              }
+            })
+          }
+        ]
+      }
+      myChart.setOption(option)
+      window.addEventListener('resize', function () { // 鎵ц
+        myChart.resize()
+      })
+    },
+    initDept() {
+      const myChart = echarts.init(document.querySelector('.echart2'))
+
+      let option = {
+        grid: {
+          left: '10%',
+          right: '10%',
+          bottom: '10%',
+          top: '20%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: this.deptList.map(i => i.name),
+          axisLabel: {
+            color: '#333333',
+            fontSize: 14,
+            fontWeight: 'bold'
+          }
+        },
+        yAxis: {
+          type: 'value',
+          name: '闅愭偅鏁�',
+          minInterval: 1,
+          axisLine: {
+            show: true,
+          }
+        },
+        series: [
+          {
+            data: this.deptList.map(i => i.total),
+            type: 'bar',
+            barWidth: 40,
+            itemStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#d75e45' }, // 娓愬彉璧峰鑹�
+                { offset: 1, color: '#db924c' }  // 娓愬彉缁堟鑹�
+              ])
+            },
+
+            label: {
+              show: true,      // 鏄剧ず鏍囩
+              position: 'top', // 璁╂爣绛炬樉绀哄湪鏌卞瓙椤堕儴
+              color: '#666666',   // 鏂囧瓧棰滆壊
+              fontSize: 14,    // 鏂囧瓧澶у皬
+            }
+          }
+        ]
+      }
+      myChart.setOption(option)
+      window.addEventListener('resize', function () { // 鎵ц
+        myChart.resize()
+      })
+    },
+    initDept3() {
+      if (this.yearList.length === 0) return
+
+      const myChart = echarts.init(document.querySelector('#echart3'))
+
+      let names = this.yearList.map(item => item.name)
+      let datas = this.yearList.map(item => item.total)
+
+      let option = {
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'line'
+          }
+        },
+        grid: {
+          left: '5%',
+          right: '10%',
+          bottom: '0%',
+          top: '20%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: names
+        },
+        yAxis: {
+          type: 'value',
+          axisLine: {
+            show: true
+          },
+          axisLabel: {
+            formatter: function (value) {
+              // 鍥涜垗浜斿叆鍒版渶杩戠殑鏁存暟
+              return Math.round(value);
+            }
+          }
+        },
+        series: [
+          {
+            data: datas,
+            type: 'line',
+            areaStyle: {
+              normal: {
+                color: {
+                  x: 0,
+                  y: 0,
+                  x2: 0,
+                  y2: 1,
+                  colorStops: [{
+                    offset: 0,
+                    color: '#207FF7' // 0% 澶勭殑棰滆壊
+                  }, {
+                    offset: 1,
+                    color: 'rgba(255,255,255,.2)' // 100% 澶勭殑棰滆壊
+                  }],
+                  globalCoord: false // 缂虹渷涓� false
+                }
+              }
+            },
+            lineStyle: { // 绾挎潯鏍峰紡
+              color: {
+                type: 'linear',
+                x: 0,
+                y: 0,
+                x2: 0,
+                y2: 1,
+                colorStops: [{
+                  offset: 0, color: '#207FF7' // 0% 澶勭殑棰滆壊
+                }, {
+                  offset: 1, color: '#207FF7' // 100% 澶勭殑棰滆壊
+                }]
+              },
+              width: 2 // 绾挎潯绮楃粏
+            },
+            symbol: 'circle',
+            symbolSize: 10,
+            itemStyle: {
+              borderWidth: 1,
+              borderColor: '#fff',
+              color: '#207FF7'
+            },
+            smooth: false
+          }
+        ]
+      }
+      myChart.setOption(option)
+      window.addEventListener('resize', function () { // 鎵ц
+        myChart.resize()
+      })
     },
     clear() {
       this.filters = {}
+      this.getData()
     }
   }
 }
@@ -81,32 +418,181 @@
 /*.main_app {
   height: 100%;
 }*/
-
-.main_content {
-  display: flex;
-  height: calc(100% - 110px);
-  .title {
-    font-weight: 600;
-    font-size: 16px;
-    color: #222222;
-    margin-bottom: 20px;
-    margin-top: 20px;
+.main_app1 {
+  width: 100%;
+  height: calc(100% - 44px);
+  overflow-y: auto;
+  overflow-x: hidden;
+  padding: 15px;
+  box-sizing: border-box;
+  background-color: #F4F7FC;
+  .main_head {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 10px;
+    background-color: #ffffff;
+    padding: 20px;
+    box-sizing: border-box;
+    .blue {
+      border-left: 8px solid #12BB8B;
+    }
+    .red {
+      border-left: 8px solid #F6CF46;
+    }
+    .yellow {
+      border-left: 8px solid #5DC9FB;
+    }
+    .orange {
+      border-left: 8px solid #FF9E56;
+    }
+    .darkBlue {
+      border-left: 8px solid #6B6EFF;
+    }
+    .main_head_item {
+      width: 19%;
+      height: 112px;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      box-sizing: border-box;
+      border-radius: 5px;
+      background: #F4F7FC;
+      span {
+        &:nth-child(1) {
+          font-weight: 600;
+          font-size: 30px;
+          color: #222222;
+        }
+        &:nth-child(2) {
+          font-weight: 400;
+          font-size: 14px;
+          color: #222222;
+          margin-top: 10px;
+        }
+      }
+    }
   }
 
-  .type_wrap {
-    flex: 5;
-    flex-shrink: 0;
-    border: 1px solid #E5E5E5;
-    height: 100%;
-    border-right: 12px solid #f7f7f7;
+  .main_table {
+    display: flex;
+    align-items: start;
+    justify-content: space-between;
+    .main_table_echart {
+      width: 64%;
+      height: 400px;
+      background-color: #ffffff;
+      padding: 20px;
+      box-sizing: border-box;
+      .title {
+        font-weight: 600;
+        font-size: 16px;
+        color: #222222;
+      }
+      #echart3 {
+        width: 100%;
+        height: calc(100% - 33px);
+      }
+    }
+    .main_table_list {
+      flex-shrink: 0;
+      width: 35%;
+      padding: 20px;
+      box-sizing: border-box;
+      background-color: #ffffff;
+      .title {
+        font-weight: 600;
+        font-size: 16px;
+        color: #222222;
+      }
+      .list_head {
+        width: 100%;
+        height: 50px;
+        display: flex;
+        align-items: center;
+        background-color: #F7F7F7;
+        border-left: 1px solid #DFE2E8;
+        border-top: 1px solid #DFE2E8;
+        margin-top: 15px;
+        .list_head_item {
+          flex: 1;
+          height: 100%;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          font-size: 13px;
+          color: #222222;
+          border-right: 1px solid #DFE2E8;
+        }
+      }
+      .table_box {
+        width: 100%;
+        border-bottom: 1px solid #DFE2E8;
+        .list_content {
+          width: 100%;
+          height: 50px;
+          display: flex;
+          align-items: center;
+          border-left: 1px solid #DFE2E8;
+          border-top: 1px solid #DFE2E8;
+          .list_head_item {
+            flex: 1;
+            height: 100%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 13px;
+            color: #222222;
+            border-right: 1px solid #DFE2E8;
+          }
+        }
+      }
+    }
   }
 
-  .dept_wrap {
-    flex: 4;
-    flex-shrink: 0;
-    border: 1px solid #E5E5E5;
-    height: 100%;
-    padding-left: 20px;
+  .main_content {
+    display: flex;
+    align-items: start;
+    justify-content: space-between;
+    height: 500px;
+    margin-bottom: 10px;
+    .title {
+      font-weight: 600;
+      font-size: 16px;
+      color: #222222;
+      /*margin-bottom: 20px;*/
+    }
+
+    .type_wrap {
+      width: 49.5%;
+      flex-shrink: 0;
+      height: 100%;
+      /*border-right: 12px solid #f7f7f7;*/
+      background-color: #ffffff;
+      padding: 20px;
+      box-sizing: border-box;
+
+      .echart1 {
+        width: 100%;
+        height: 100%;
+      }
+    }
+
+    .dept_wrap {
+      width: 49.5%;
+      flex-shrink: 0;
+      height: 100%;
+      background-color: #ffffff;
+      padding: 20px;
+      box-sizing: border-box;
+      .echart2 {
+        width: 100%;
+        height: 100%;
+      }
+    }
   }
 }
+
 </style>

--
Gitblit v1.9.3