Browse Source

[Feat 0000] 看板模拟数据

houzekong 5 months ago
parent
commit
21175a7c49

+ 32 - 18
src/views/vent/home/billboard/billboard.data.ts

@@ -656,6 +656,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtltmk',
     orgname: '柳塔矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 70,
@@ -667,6 +668,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtcctrk',
     orgname: '寸草塔二矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 76,
@@ -678,6 +680,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtbetmk',
     orgname: '布尔台矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 55,
@@ -689,6 +692,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtwlmlmk',
     orgname: '乌兰木伦矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 32,
@@ -700,6 +704,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtcctmk',
     orgname: '寸草塔矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 55,
@@ -711,6 +716,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtsgtmk',
     orgname: '石圪台矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 67,
@@ -722,6 +728,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtbltmk',
     orgname: '补连塔矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 46,
@@ -733,6 +740,7 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjthlgmk',
     orgname: '哈拉沟矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
       cds: 53,
@@ -744,10 +752,11 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtswmk',
     orgname: '上湾矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
-      zxcds: 2,
+      cds: 32,
+      zxcds: 21,
       cdbjs: 1,
       jcsbs: 0,
     },
@@ -755,56 +764,61 @@ export const mockSHENDONG = [
   {
     code: 'sdmtjtdltmkhjtj',
     orgname: '活鸡兔井',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
-      zxcds: 2,
-      cdbjs: 1,
+      cds: 53,
+      zxcds: 22,
+      cdbjs: 12,
       jcsbs: 0,
     },
   },
   {
     code: 'sdmtjtdltmk',
     orgname: '大柳塔井',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
-      zxcds: 2,
-      cdbjs: 1,
-      jcsbs: 0,
+      cds: 15,
+      zxcds: 15,
+      cdbjs: 0,
+      jcsbs: 20,
     },
   },
   {
     code: 'sdmtjtjjmk',
     orgname: '锦界矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
-      zxcds: 2,
-      cdbjs: 1,
-      jcsbs: 0,
+      cds: 78,
+      zxcds: 0,
+      cdbjs: 0,
+      jcsbs: 23,
     },
   },
   {
     code: 'sdmtjtyjlmk',
     orgname: '榆家梁矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
+      cds: 31,
       zxcds: 2,
       cdbjs: 1,
-      jcsbs: 0,
+      jcsbs: 46,
     },
   },
   {
     code: 'sdmtjtbdmk',
     orgname: '保德矿',
+    ip: '',
     dustRisk: {
       fxdj: '低',
-      cds: 3,
-      zxcds: 2,
+      cds: 53,
+      zxcds: 22,
       cdbjs: 1,
-      jcsbs: 0,
+      jcsbs: 11,
     },
   },
 ];

+ 1 - 1
src/views/vent/home/billboard/risk.vue → src/views/vent/home/billboard/dustRiskMock.vue

@@ -3,5 +3,5 @@
   <Billboard billboard-type="DuskRisk" title="粉尘看板" />
 </template>
 <script lang="ts" setup>
-  import Billboard from './index.vue';
+  import Billboard from './mock.vue';
 </script>

+ 1 - 3
src/views/vent/home/billboard/index.vue

@@ -61,7 +61,6 @@
   import DuskRisk from './components/DustRisk.vue';
   import _ from 'lodash-es';
   import { useRouter } from 'vue-router';
-  import { mockSHENDONG } from './billboard.data';
   // import mapComponent from './components/3Dmap/index.vue';
 
   const props = defineProps<{
@@ -91,8 +90,7 @@
   const billboards = ref<(() => VNode)[]>([]);
 
   function fetchBillboards() {
-    Promise.resolve(mockSHENDONG).then((r) => {
-      // getSummary().then((r) => {
+    getSummary().then((r) => {
       billboards.value = r.map((el) => {
         return () =>
           h(

+ 209 - 0
src/views/vent/home/billboard/mock.vue

@@ -0,0 +1,209 @@
+<!-- eslint-disable vue/multi-word-component-names -->
+<template>
+  <div class="company-home">
+    <a-button
+      preIcon="ant-design:rollback-outlined"
+      type="text"
+      size="small"
+      style="position: absolute; left: 15px; top: 15px; color: #fff"
+      @click="getBack"
+    >
+      回到首页
+    </a-button>
+    <div class="top-bg">
+      <div class="main-title">{{ mainTitle }}</div>
+    </div>
+    <a-row class="company-content" :gutter="10">
+      <!-- <a-col v-for="(item, i) in shownBillboards" :key="`svvhbi-${i}`" :span="6">
+        <BaseCard :title="item.orgname || '/'" @open="openHandler(item.ip)">
+          <component :is="componentMap[billboardType]" :data="item" />
+        </BaseCard>
+      </a-col> -->
+      <a-col v-for="(render, i) in shownBillboards" :key="`svvhbi-${i}`" :span="6">
+        <component :is="render" />
+      </a-col>
+    </a-row>
+    <!-- <div v-if="showBtn" style="position: absolute; top: 0; left: 0">
+      <a-button @click="billboardType = 'DustStatus'">切换粉尘看板</a-button>
+      <a-button @click="billboardType = 'FireStatus'">切换火灾看板</a-button>
+      <a-button @click="billboardType = 'FileOverview'">切换文件看板</a-button>
+      <a-button @click="billboardType = 'VentilationStatus'">切换风扇看板</a-button>
+      <a-button @click="billboardType = 'GasStatus'">切换瓦斯看板</a-button>
+    </div> -->
+    <ArrowButton point-to="left" class="company__arrow_left" @click="changeCurrentPage(-1)" />
+    <ArrowButton point-to="right" class="company__arrow_right" @click="changeCurrentPage(1)" />
+  </div>
+</template>
+<script lang="ts" setup>
+  /**
+   * 本文件夹下的内容是公司端看板页的内容:
+   *
+   * 看板有多种类型,包含了监测、跳转矿端的功能。
+   *
+   * 菜单配置相关信息:使用vent/home/billboard/gas及类似组件进行配置(即 ./gas.vue ./fire.vue 等)
+   *
+   * 支持的看板类型如下:'DustStatus'、'FireStatus'、'FileOverview'、'VentilationStatus'、'GasStatus'、'Summary'
+   *
+   */
+  import { VNode, computed, h, onMounted, ref } from 'vue';
+  import BaseCard from './components/BaseCard.vue';
+  import ArrowButton from './components/ArrowButton.vue';
+  // import { useRoute } from 'vue-router';
+  // import { getSummary } from './billboard.api';
+  import { useAutoLogin } from '../../../../hooks/vent/useAutoLogin';
+  import DustStatus from './components/DustStatus.vue';
+  import FileOverview from './components/FileOverview.vue';
+  import FireStatus from './components/FireStatus.vue';
+  import VentilationStatus from './components/VentilationStatus.vue';
+  import GasStatus from './components/GasStatus.vue';
+  import Summary from './components/Summary.vue';
+  import Warning from './components/Warning.vue';
+  import DuskRisk from './components/DustRisk.vue';
+  import _ from 'lodash-es';
+  import { useRouter } from 'vue-router';
+  import { mockSHENDONG } from './billboard.data';
+  // import mapComponent from './components/3Dmap/index.vue';
+
+  const props = defineProps<{
+    billboardType: string;
+    title?: string;
+  }>();
+
+  // const route = useRoute();
+  const { open } = useAutoLogin();
+  const router = useRouter();
+
+  // 组件Map,不同type使用不用组件
+  const componentMap = {
+    DustStatus,
+    FileOverview,
+    VentilationStatus,
+    GasStatus,
+    FireStatus,
+    Summary,
+    Warning,
+    DuskRisk,
+  };
+
+  const mainTitle = props.title || '国能神东一通三防管控平台';
+
+  // 看板相关的基础配置
+  const billboards = ref<(() => VNode)[]>([]);
+
+  function fetchBillboards() {
+    Promise.resolve(mockSHENDONG).then((r) => {
+      billboards.value = r.map((el) => {
+        return () =>
+          h(
+            BaseCard,
+            {
+              title: el.orgname || '/',
+              onOpen: () => openHandler(el.ip),
+            },
+            {
+              default: () =>
+                h(componentMap[props.billboardType], {
+                  data: JSON.parse(JSON.stringify(el)),
+                }),
+            }
+          );
+      });
+    });
+  }
+
+  // 看板分页相关的配置
+  const pageSize = 8;
+  const currentPage = ref(1);
+  const totalPage = computed(() => {
+    return Math.ceil(billboards.value.length / pageSize) + 1;
+  });
+
+  // 能真正在页面上展示的看板
+  const shownBillboards = computed(() => {
+    return billboards.value.slice((currentPage.value - 1) * pageSize, currentPage.value * pageSize);
+  });
+
+  function changeCurrentPage(pagecount: number) {
+    currentPage.value = Math.max((currentPage.value + pagecount) % totalPage.value, 1);
+  }
+
+  // const billboardType = ref('DustStatus');
+  // const showBtn = ref(true);
+
+  // 组件Map,不同type需要跳转到不同的矿端页面
+  const routePathMap = {
+    DustStatus: '/dust/warn/home',
+    FileOverview: '/fileManager/fileDetail/home',
+    VentilationStatus: '/micro-vent-3dModal/dashboard/analysis',
+    GasStatus: '/gas/warn/home',
+    FireStatus: '/fire/warn/home',
+    Summary: '/monitorChannel/monitor-alarm-home',
+  };
+  // 页面跳转
+  function openHandler(ip: string) {
+    // const url = `http://localhost:3100/login`;
+    const url = `http://${ip}:8092${routePathMap[props.billboardType]}`;
+    open(url);
+  }
+
+  // 返回首页
+  function getBack() {
+    router.push('/company/home');
+  }
+
+  onMounted(() => {
+    // if (route.query.type) {
+    //   billboardType.value = route.query.type as string;
+    //   showBtn.value = false;
+    // }
+    fetchBillboards();
+  });
+</script>
+<style lang="less" scoped>
+  @font-face {
+    font-family: 'douyuFont';
+    src: url('../../../../assets/font/douyuFont.otf');
+  }
+
+  .company-home {
+    width: 100%;
+    height: 100%;
+    color: #fff;
+    position: relative;
+    background: url('@/assets/images/company/content-bg.png') no-repeat;
+    background-size: 100% 100%;
+    // background: url('../../../../assets/images/company/home-pageBg.png') no-repeat center;
+    // background-size: 100% 100%;
+
+    .top-bg {
+      width: 100%;
+      height: 97px;
+      background: url('@/assets/images/company/top-bg.png') no-repeat center;
+      .main-title {
+        height: 96px;
+        font-family: 'douyuFont';
+        font-size: 20px;
+        letter-spacing: 2px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+
+    .company-content {
+      width: 100%;
+      height: calc(100% - 97px);
+      padding: 30px 100px 0 100px;
+    }
+    .company__arrow_left {
+      position: absolute;
+      top: calc(50% - 38px);
+      left: 15px;
+    }
+    .company__arrow_right {
+      position: absolute;
+      top: calc(50% - 38px);
+      right: 15px;
+    }
+  }
+</style>