From c5370d2a8c89caa6c8da533c2cf691cb3d16dc3c Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期四, 12 十二月 2024 16:45:31 +0800
Subject: [PATCH] ll

---
 screen/src/views/FireFighting.vue |  546 ++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 385 insertions(+), 161 deletions(-)

diff --git a/screen/src/views/FireFighting.vue b/screen/src/views/FireFighting.vue
index 864f2c5..8e63144 100644
--- a/screen/src/views/FireFighting.vue
+++ b/screen/src/views/FireFighting.vue
@@ -3,7 +3,7 @@
     <div class="main_app">
       <img src="@/assets/images/FireFighting/bg@2x.png" class="main_bg" alt="" />
       <div class="main_header">
-        <img src="@/assets/images/maintitle@2x.png" class="main_header_bg" alt="" />
+        <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" />
         <div class="title">瀹夋嘲鏅烘収鐗╂祦鍥尯-娑堥槻鎬佸娍鐩戞帶</div>
         <div class="time_wrap">
           <span class="date">{{ date }}</span>
@@ -31,17 +31,22 @@
                   <span class="item">鏁呴殰</span>
                   <span class="item">绂荤嚎</span>
                 </div>
-                <template v-for="i in 5">
-                  <div class="line">
-                    <span class="item name">鐏伓鎶ヨ绯荤粺</span>
-                    <span class="item">11</span>
-                    <span class="item">11</span>
-                    <span class="item">11</span>
-                    <span class="item">11</span>
-                    <span class="item">11</span>
+                <div class="one-swiper list_content">
+                  <div class="swiper-wrapper">
+                    <div class="line_wrap one-swiper-slide swiper-slide" v-for="(item, i) in dataList1">
+                      <div class="line">
+                        <span class="item name">{{ item.typeName }}</span>
+                        <span class="item">{{ item.totalDeviceNum || 0 }}</span>
+                        <span class="item">{{ item.alarmDeviceNum || 0 }}</span>
+                        <span class="item">{{ item.shieldDeviceNum || 0 }}</span>
+                        <span class="item">{{ item.errDeviceNum || 0 }}</span>
+                        <span class="item">{{ item.offlineDeviceNum || 0 }}</span>
+                      </div>
+                      <div class="separate"></div>
+                    </div>
                   </div>
-                  <div class="separate"></div>
-                </template>
+                </div>
+
               </div>
             </div>
           </div>
@@ -54,7 +59,14 @@
               <img src="@/assets/images/title@2x.png" class="bg" alt="" />
             </div>
             <div class="police_wrap">
-              <div class="echart1" id="echart1"></div>
+              <div class="item" v-for="(item, i) in dataList2">
+                <div class="head">
+                  <div class="name">{{ item.name }}</div>
+                  <div class="name">{{ item.num }}娆�</div>
+                </div>
+                <FirePercent :color="policeColors[i]" :rate="item.rate" />
+              </div>
+
             </div>
           </div>
           <div class="left_box_three">
@@ -77,35 +89,35 @@
                 <img src="@/assets/images/FireFighting/xiaofang_ic_zaixian@2x.png" alt="">
                 <div class="content">
                   <div class="name">鍦ㄧ嚎</div>
-                  <div class="num">1000</div>
+                  <div class="num">{{ dataList4.onlineDeviceNum }}</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/FireFighting/xiaofang_ic_baojing@2x.png" alt="">
                 <div class="content">
                   <div class="name">鎶ヨ</div>
-                  <div class="num num2">12</div>
+                  <div class="num num2">{{ dataList4.alarmDeviceNum }}</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/FireFighting/xiaofang_ic_guzhang@2x.png" alt="">
                 <div class="content">
                   <div class="name">鏁呴殰</div>
-                  <div class="num num3">12</div>
+                  <div class="num num3">{{ dataList4.errDeviceNum }}</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/FireFighting/xiaofang_ic_lixian@2x.png" alt="">
                 <div class="content">
                   <div class="name">绂荤嚎</div>
-                  <div class="num num4">12</div>
+                  <div class="num num4">{{ dataList4.offlineDeviceNum }}</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/FireFighting/xiaofang_ic_pingbi@2x.png" alt="">
                 <div class="content">
                   <div class="name">灞忚斀</div>
-                  <div class="num num5">12</div>
+                  <div class="num num5">{{ dataList4.shieldDeviceNum || 0 }}</div>
                 </div>
               </div>
             </div>
@@ -199,20 +211,27 @@
             </div>
             <div class="content_wrap">
               <div class="list">
-                <template v-for="i in 3">
-                  <div class="item">
-                    <div>宸茬淮淇�</div>
-                    <div class="num active">500</div>
-                  </div>
-                  <div v-if="i < 3" class="separate"></div>
-                </template>
-
+                <div class="item">
+                  <div>宸茬淮淇�</div>
+                  <div class="num active">{{ dataList5.protectNum }}</div>
+                </div>
+                <div class="separate"></div>
+                <div class="item">
+                  <div>璁″垝缁翠繚</div>
+                  <div class="num active">{{ dataList5.planProtectTotal }}</div>
+                </div>
+                <div class="separate"></div>
+                <div class="item">
+                  <div>缁翠繚鐜�</div>
+                  <div v-if="dataList5.protectNum && dataList5.planProtectTotal" class="num active">{{
+                    ((dataList5.protectNum / dataList5.planProtectTotal) * 100).toFixed(0) }}%</div>
+                </div>
               </div>
               <div class="footer">
                 <img src="@/assets/images/FireFighting/ic_weixiu@2x.png" class="icon" alt="">
                 <div class="content">
                   <div>鏈湀鏂板缁翠繚</div>
-                  <div class="num">40 <span>涓�</span></div>
+                  <div class="num">{{ dataList5.monthAddNum }} <span>涓�</span></div>
                 </div>
               </div>
             </div>
@@ -234,14 +253,14 @@
                 <img src="@/assets/images/FireFighting/ic_tibao@2x.png" alt="">
                 <div class="content">
                   <div class="name">鎻愭姤闅愭偅鏁�</div>
-                  <div class="num"><span>10</span>涓�</div>
+                  <div class="num"><span>{{ dataList4.dangerTotalNum }}</span>涓�</div>
                 </div>
               </div>
               <div class="item">
                 <img src="@/assets/images/FireFighting/ic_chuli@2x.png" alt="">
                 <div class="content">
                   <div class="name">澶勭悊闅愭偅鏁�</div>
-                  <div class="num"><span class="today">3</span>涓�</div>
+                  <div class="num"><span class="today">{{ dataList4.dangerDealedNum }}</span>涓�</div>
                 </div>
               </div>
             </div>
@@ -249,30 +268,38 @@
               <img class="icon" src="@/assets/images/FireFighting/ic_title_green@2x.png" alt="">
               <div class="name">鍛婅淇℃伅</div>
             </div>
-            <div class="list">
-              <div class="item" v-for="i in 5">
-                <div class="icon">
-                  <div class="circle"></div>
-                  <div class="line"></div>
+            <div class="list two-swiper">
+              <div class="swiper-wrapper">
+                <div class="item two-swiper-slide swiper-slide" v-for="item, i in dataList7" :key="i">
+                  <div class="icon">
+                    <div class="circle"></div>
+                    <div class="line"></div>
+                  </div>
+                  <div class="content">
+                    <div class="header">
+                      <div class="time">
+                        <span>{{ item.alarmTime }}</span>
+                        <span class="status" v-if="item.handleStatus == 1">宸叉牳瀹�</span>
+                        <span class="status" v-else-if="item.handleStatus == 2">鏈牳瀹�</span>
+                        <span class="status" v-else-if="item.handleStatus == 3">鏍稿疄涓�</span>
+                        <span v-else class="status">鏈牳瀹�</span>
+                      </div>
+                      <div class="have_time">宸茬粡鍙戠敓{{ item.haveTime }}</div>
+                    </div>
+                    <div class="wrap">
+                      <div class="title">
+                        <img class="xf" src="@/assets/images/FireFighting/ic_gaojing_red@2x.png" alt="">
+                        <span>{{ item.alarmTypeName }}</span>
+                      </div>
+                      <div class="title">
+                        <img class="addr" src="@/assets/images/FireFighting/xiaofang_ic_weizhi@2x.png" alt="">
+                        <span>{{ item.regionName }}</span>
+                      </div>
+                    </div>
+                  </div>
                 </div>
-                <div class="content">
-                  <div class="header">
-                    <div class="time">
-                      <span>123</span>
-                      <span class="status">澶勭悊涓�</span>
-                    </div>
-                    <div class="have_time">宸茬粡鍙戠敓<span>1</span>鍒嗛挓</div>
-                  </div>
-                  <div class="wrap">
-                    <div class="title">
-                      <img class="xf" src="@/assets/images/FireFighting/ic_gaojing_red@2x.png" alt="">
-                      <span>娑堥槻璀﹀憡</span>
-                    </div>
-                    <div class="title">
-                      <img class="addr" src="@/assets/images/FireFighting/xiaofang_ic_weizhi@2x.png" alt="">
-                      <span>address</span>
-                    </div>
-                  </div>
+                <div v-if="dataList7.length == 0" style="margin-top: 100px;" class="empty_wrap">
+                  <img src="@/assets/images/default_empty.png" alt="">
                 </div>
               </div>
             </div>
@@ -286,10 +313,22 @@
 <script setup>
 import { ref, onMounted } from 'vue'
 import VScaleScreen from 'v-scale-screen'
-import Percent from '@/components/percent.vue'
+import FirePercent from '@/components/FirePercent.vue'
 import dayjs from 'dayjs'
-
+import duration from 'dayjs/plugin/duration'
+dayjs.extend(duration)
 import * as echarts from 'echarts'
+import 'swiper/css/swiper.min.css'
+import Swiper from 'swiper'
+import {
+  getFightingalarmData,
+  getFightingHandle,
+  getFightingcenterData,
+  getFightingDeAlarm,
+  getFightingDeviceY,
+  getFighalarmDataList
+} from '@/api'
+
 const colors = ['#FEAF01', '#01ABFE', '#51F9E4']
 const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',]
 const date = ref(dayjs().format('YYYY.MM.DD'))
@@ -302,103 +341,10 @@
 
 }, 1000)
 
-const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a']
-const initEnergy = () => {
-  var myChart = echarts.init(document.querySelector('.energyRef'))
-  // 缁樺埗鍥捐〃
-  const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a']
-  myChart.setOption({
-    grid: {
-      top: '20%',
-      left: '2%',
-      right: '2%',
-      bottom: '4%',
-      containLabel: true
-    },
-    tooltip: {
-      trigger: 'axis',
-      axisPointer: {
-        type: 'line'
-      },
-    },
-    xAxis: {
-      type: 'category',
-      data: [1, 2, 3, 4, 4, 5]
-    },
-    yAxis: {
-      type: 'value',
-      name: 'kw路h',
-      nameTextStyle: {
-        padding: [0, 0, 4, -30]    // 鍥涗釜鏁板瓧鍒嗗埆涓轰笂鍙充笅宸︿笌鍘熶綅缃窛绂�
-      },
-      splitLine: {
-        show: true,
-        lineStyle: {
-          //杩欓噷杈撳叆绾挎潯鐨勬牱寮�
-          color: 'rgba(255,255,255,0.14)',
-        }
-      }
-    },
-    series: [
-      {
-        data: [1, 2, 3, 4, 5],
-        type: 'bar',
-        barWidth: 10,
-        itemStyle: {
-          normal: {
-            color: new echarts.graphic.LinearGradient(
-              0, 0, 0, 1,
-              [
-                { offset: 0, color: arr[1] },
-                { offset: 1, color: '#080807' }
-              ]
-            ),
-            barBorderRadius: [10, 10, 0, 0]
-          }
-        }
-      }
-    ]
-  })
-  window.addEventListener('resize', function () {//鎵ц
-    myChart.resize()
-  })
-}
-const initEchart1 = () => {
-  const myChart = echarts.init(document.getElementById('echart1'))
-  const option = {
-    series: [
 
-      {
-        type: 'pie',
-        radius: ['86%', '100%'],
-        label: {
-          show: false,
-          position: 'center'
-        },
-        padAngle: 5,
-        itemStyle: {
-          borderRadius: 10
-        },
-        color: colors,
-        labelLine: {
-          show: false
-        },
-        data: [
-          { value: 1048, name: 'Search Engine' },
-          { value: 735, name: 'Direct' },
-          { value: 580, name: 'Email' }
-        ]
-      }
-    ]
-  }
-  myChart.setOption(option)
-  window.addEventListener('resize', function () { // 鎵ц
-    myChart.resize()
-  })
-}
 const initWatergage = () => {
   const myChart = echarts.init(document.getElementById('watergage'))
-  var data_value = 2
+  var data_value = 1
   const option = {
     barMaxWidth: 3,
     polar: {
@@ -761,11 +707,273 @@
   })
 }
 
+const dataList1 = ref([])
+const policeColors = ['#01D9FE', '#FE5501', '#0193FE', '#28F0C4']
+const dataList2 = ref([])
+const getData2 = () => {
+  // let temp = []
+  // temp.push({ name: '鐪熷疄鎶ヨ鏁�', num: 10, rate: 20 })
+  // temp.push({ name: '璇姤璀︽暟', num: 30, rate: 60 })
+  // temp.push({ name: '宸茶В闄�', num: 20, rate: 40 })
+  // temp.push({ name: '澶勭悊涓�', num: 8, rate: 16 })
+  // dataList2.value = temp
+  // return
+  getFightingalarmData().then(res => {
+    const result = res.data || {}
+    let temp = []
+    temp.push({ name: '鐪熷疄鎶ヨ鏁�', num: result.realNum, rate: (result.realNum / result.totalNum) * 100 })
+    temp.push({ name: '璇姤璀︽暟', num: result.errNum, rate: (result.errNum / result.totalNum) * 100 })
+    temp.push({ name: '宸茶В闄�', num: result.liftNum, rate: (result.liftNum / result.totalNum) * 100 })
+    temp.push({ name: '澶勭悊涓�', num: result.processingNum, rate: (result.processingNum / result.totalNum) * 100 })
+    dataList2.value = temp
+  })
+}
+
+const dataList3 = ref([])
+const getData3 = () => {
+  getFightingHandle({ type: 0 }).then(res => {
+    dataList3.value = res.data || []
+    initEchart2()
+  })
+}
+const initEchart2 = () => {
+  var myChart = echarts.init(document.querySelector('.echart2'))
+  // 鐢熸垚鏁版嵁鍜屾棩鏈�
+  // 绀轰緥鏁版嵁
+  const data1 = dataList3.value.map(i => i.realNum)
+  const data2 = dataList3.value.map(i => i.processingNum)
+  const data3 = dataList3.value.map(i => i.liftNum)
+  const data4 = dataList3.value.map(i => i.errNum)
+  const months = dataList3.value.map(i => {
+    return i.startDate.substring(5, 7) + '鏈�'
+  }
+  )
+  const option = {
+    legend: {
+      x: "center",
+      textStyle: {
+        color: "#FFFFFF", // 鍥句緥鏂囧瓧璁句负鐧借壊
+        fontSize: 12
+      },
+      icon: 'circle',
+      top: '6%',
+      itemWidth: 8,
+      itemHeight: 8,
+      itemGap: 20,
+      data: ['鍛婅鏁�', '杩涜涓�', '宸插鐞�', '璇姤鏁�'] // 鏇存柊鍥句緥鍚嶇О
+    },
+    grid: {
+      left: '2%',
+      right: '0%',
+      top: '20%',
+      bottom: '10%',
+      containLabel: true,
+    },
+    tooltip: {
+      trigger: "axis",
+      axisPointer: {
+        type: "shadow"
+      },
+      textStyle: {
+        color: "rgba(255, 255, 255, 1)"
+      },
+      backgroundColor: "rgba(0,0,0,0.8)",
+      borderColor: "rgba(219, 230, 255, 0.8)",
+    },
+    xAxis: {
+      data: months,
+      axisLabel: {
+        color: "#FFFFFF", // X 杞存枃瀛楄涓虹櫧鑹�
+        fontSize: 13,
+      },
+      axisLine: {
+        lineStyle: {
+          color: '#1E294C'
+        }
+      },
+      axisTick: {
+        show: false
+      }
+    },
+    yAxis: {
+      show: true,
+      axisLabel: {
+        color: "#FFFFFF", // Y 杞存枃瀛楄涓虹櫧鑹�
+        fontSize: 12,
+      },
+      axisLine: {
+        lineStyle: {
+          color: '#A9AEB2'
+        }
+      },
+      axisTick: {
+        lineStyle: {
+          color: '#A9AEB2'
+        }
+      },
+      splitLine: {
+        show: true,
+        lineStyle: {
+          color: ["#0f1d27"],
+          width: 1
+        },
+      },
+    },
+    series: [
+      {
+        name: "鍛婅鏁�",
+        type: "bar",
+        stack: "attendance",
+        data: data1,
+        itemStyle: {
+          color: '#FEAF01',
+        },
+        label: {
+          show: false,
+          color: "#FFFFFF",
+        },
+        emphasis: {
+          focus: "series",
+        },
+        barWidth: 6,
+      },
+      {
+        name: "杩涜涓�", // 杩熷埌鏁版嵁
+        type: "bar",
+        stack: "attendance",
+        data: data2,
+        itemStyle: {
+          color: '#28F0C4', // 杩熷埌鐨勯鑹�
+        },
+        label: {
+          show: false,
+          color: "#FFFFFF",
+        },
+        emphasis: {
+          focus: "series",
+        },
+      },
+      {
+        name: "宸插鐞�", // 璇峰亣鏁版嵁
+        type: "bar",
+        stack: "attendance",
+        data: data3,
+        itemStyle: {
+          color: '#0193FE', // 璇峰亣鐨勯鑹�
+        },
+        label: {
+          show: false,
+          color: "#FFFFFF",
+        },
+        emphasis: {
+          focus: "series",
+        },
+      },
+      {
+        name: "璇姤鏁�", // 鍗曠嫭鐨勫姞鐝煴瀛�
+        type: "bar",
+        data: data4,
+        barWidth: 6,
+        itemStyle: {
+          color: '#FEED01', // 楂樹寒鐨勭传鑹�
+        },
+        emphasis: {
+          focus: "series",
+        },
+      },
+    ],
+  }
+  myChart.setOption(option)
+  window.addEventListener('resize', function () {//鎵ц
+    myChart.resize()
+  })
+}
+
+const dataList4 = ref({})
+const getData4 = () => {
+  getFightingcenterData().then(res => {
+    dataList4.value = res.data || {}
+    dataList1.value = res.data.deviceTypeList
+  })
+}
+const dataList5 = ref({}) // 缁翠繚
+const getData5 = () => {
+  getFightingDeviceY().then(res => {
+    dataList5.value = res.data || {}
+  })
+}
+const dataList6 = ref([])
+const getData6 = () => {
+  getFightingHandle({ type: 1 }).then(res => {
+    dataList6.value = res.data
+  })
+}
+const dataList7 = ref([])
+const getData7 = () => {
+  getFighalarmDataList().then(res => {
+    dataList7.value = res.data || []
+    dataList7.value = dataList7.value.map(item => {
+      item.haveTime = dayjs.duration(new Date().getTime() - new Date(item.alarmTime).getTime()).format('H灏忔椂m鍒嗛挓')
+      return item
+    })
+  })
+}
+
+const autoplayFlag = (list = [], leng = 4, time = 2000) => {
+  if (list.length > leng) {
+    return { delay: time, disableOnInteraction: false }
+  } else {
+    return false
+  }
+}
+const loopFn1 = () => {
+  var newSwiper1 = new Swiper('.one-swiper', {
+    initialSlide: 0,
+    direction: 'vertical', //绔栫洿鏂瑰悜
+    slidesPerView: 5,
+    autoplay: autoplayFlag(dataList1.value, 5, 4000),
+    observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+  })
+}
+const loopFn2 = () => {
+  var newSwiper1 = new Swiper('.two-swiper', {
+    initialSlide: 0,
+    direction: 'vertical', //绔栫洿鏂瑰悜
+    slidesPerView: 4,
+    autoplay: autoplayFlag(dataList7.value, 4, 4000),
+    observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+  })
+}
+
 onMounted(() => {
-  // initEnergy()
-  // initEchart1()
+  // getData1()
+  getData2()
+  getData3()
+  getData4()
+  getData5()
+  // getData6()
+  getData7()
+  setInterval(() => {
+    getData2()
+    getData3()
+    getData4()
+    // getData6()
+    getData7()
+  }, 60 * 1000)
+  setInterval(() => {
+
+    getData5()
+
+  }, 60 * 60 * 1000)
+
   initWatergage()
   initLiquidlevel()
+
+  setTimeout(() => {
+    loopFn1()
+    loopFn2()
+  }, 12000)
+  
 })
 
 
@@ -786,12 +994,18 @@
     .left_box_one {
       width: 100%;
       margin-bottom: 20px;
-      border: 1px solid;
 
       .list_wrap {
         padding: 10px 0;
-        height: 227px;
-        overflow: auto;
+
+        .list_content {
+          height: 170px;
+          overflow: hidden;
+
+          .line_wrap {
+            height: 34px !important;
+          }
+        }
 
         .list {
           .line {
@@ -848,20 +1062,26 @@
       margin-bottom: 20px;
 
       .police_wrap {
+        padding: 15px 20px 0;
         height: 225px;
 
-        border: 1px solid;
+        .item {
+          margin-bottom: 5px;
 
-        .echart1 {
-          width: 100%;
-          height: 100%;
+          .head {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            font-size: 16px;
+            color: #FFFFFF;
+            margin-bottom: 8px;
+          }
         }
       }
     }
 
     .left_box_three {
       .dispose_wrap {
-        border: 1px solid;
         height: 210px;
         width: 100%;
 
@@ -921,12 +1141,14 @@
                   #dd4c26 50%,
                   #e43724 100%);
             }
+
             .num3 {
               background-image: -webkit-linear-gradient(top,
                   #fff 0%,
                   #e9bf43 50%,
                   #eb8131 100%);
             }
+
             .num4 {
               background-image: -webkit-linear-gradient(top,
                   #fff 0%,
@@ -1039,7 +1261,7 @@
                   font-weight: 500;
 
                   span {
-                    font-style: 14px;
+                    font-size: 14px;
                     font-weight: 400;
                   }
                 }
@@ -1056,6 +1278,7 @@
             text-align: center;
             position: relative;
             left: 30px;
+
             .watergage {
               width: 130px;
               height: 112px;
@@ -1262,8 +1485,8 @@
       }
 
       .list {
-        height: 330px;
-        overflow: auto;
+        height: 320px;
+        overflow: hidden;
         margin-top: 15px;
         scrollbar-width: none;
 
@@ -1271,6 +1494,7 @@
           display: flex;
           font-size: 13px;
           color: #D2E0FF;
+          height: 80px !important;
 
           .icon {
             width: 40px;
@@ -1330,7 +1554,7 @@
             }
 
             .wrap {
-              height: 40px;
+              height: 34px;
               background: linear-gradient(270deg, rgba(254, 85, 1, 0) 0%, rgba(254, 85, 1, 0.19) 100%);
               border-radius: 2px 0px 0px 2px;
               display: flex;

--
Gitblit v1.9.3