Newer
Older
KaiFengPC / src / views / sponeScreen / waterFlood / pumpProcess.vue
@zhangdeliang zhangdeliang 17 days ago 16 KB update
<template>
  <!-- 泵站运行工况图 雨污水 -->
  <div class="pumpGKT">
    <!-- 信息展示 -->
    <div class="pumpInfo">
      <div class="flex">
        <div class="infoLeft">
          <div class="name">
            {{ pumpObj.pumpName }}
            {{ pumpObj.pumpType == 'rain_water' ? '雨水泵站' : pumpObj.pumpType == 'sewage_water' ? '污水泵站' : '雨污合建' }}
          </div>
          <div class="type">
            <p class="fail" v-if="Object.keys(detailObj).length == 0"><span></span>离线</p>
            <p class="success" v-else><span></span>在线</p>
          </div>
          <div>更新时间:{{ detailObj.tt }}</div>
        </div>
        <div class="infoRight">
          <div class="cont">开泵时间:--</div>
          <div class="cont">开泵台数:0台</div>
          <div class="cont">开泵时长:--小时--分--秒</div>
          <div class="cont">总抽排量:--m³</div>
        </div>
      </div>
    </div>
    <!-- 泵站图 -->
    <div class="pumpCont">
      <!-- 排入水体 -->
      <div class="waterGo" v-if="pumpObj.pumpType == 'sewage_water'">{{ pumpObj.sweagepump.collectionOut }}</div>
      <div class="waterGo" v-else>{{ pumpObj.rainpump.collectionOut }}</div>

      <!-- 雨水池、污水池 -->
      <div class="waterType" v-if="pumpObj.pumpType == 'sewage_water'">污水池</div>
      <div class="waterType" v-else>雨水池</div>

      <!-- 大水管水流动效 -->
      <div class="path-run" v-if="mainWater">
        <svg
          xmlns="http://www.w3.org/2000/svg"
          width="1056"
          height="350"
          viewBox="0 0 1256 400"
          fill="transparent"
          stroke-width="15"
          stroke-dasharray="60"
        >
          <path
            transform="translate(7.5 7.5)  rotate(0 619.5 131.5)"
            d="M0,393L0,10C0,4.48 4.48,0 10,0L1229,0C1234.52,0 1239,4.48 1239,10L1239,393 "
            class="pathRun"
            stroke="#ff8500"
            fill="transparent"
          ></path>
        </svg>
      </div>

      <!-- 格栅机 -->
      <div class="gsjCont flex">
        <div class="partGsj" v-for="(item, index) in gsjList" :key="index">
          <div class="contTips">{{ index + 1 }}#格栅机</div>
          <img src="@/assets/newImgs/pumpGY/gsjDefault.png" alt="格栅机停止状态" v-if="item.status == '运行'" />
          <img src="@/assets/newImgs/pumpGY/gsjMove.png" alt="格栅机运行状态" v-else />
          <div class="status">就地</div>
          <div class="yxstatus statusYX" v-if="item.status == '运行'">{{ item.status }}</div>
          <div class="yxstatus statusTZ" v-else>停止</div>
        </div>
      </div>

      <!-- 泵机 -->
      <div class="pumpBZ">
        <!-- 水流和液位值 -->
        <div class="waterVal">
          <img class="water" src="@/assets/newImgs/pumpGY/water.png" :style="{ height: (realYW / 10.5) * 384 + 'px' }" alt="水位" />
          <div class="value">
            <img src="@/assets/newImgs/pumpGY/gauge.png" alt="水尺" />
            <div class="number" :style="{ bottom: (realYW / 10.5) * 384 + 'px' }">
              <div class="val">{{ realYW }}</div>
            </div>
          </div>
        </div>
        <!-- 雨水泵 -->
        <div class="flex bzCont" v-if="pumpObj.pumpType == 'rain_water' || pumpObj.pumpType == 'confluence'">
          <div class="partBJ" v-for="(item, index) in pumpList" :key="index">
            <img class="guan" src="@/assets/newImgs/pumpGY/guan.png" alt="水管" />
            <!-- 开启单个水管水流动效 -->
            <div class="line-div" v-if="item.status == '运行'">
              <svg
                xmlns="http://www.w3.org/2000/svg"
                version="1.0"
                viewBox="0 0 40 400"
                stroke-width="40"
                stroke-dasharray="30"
                style="height: 290px; width: 24px"
              >
                <path d="M5 -50 Q1 -5 2 -2 V425" stroke="#ff8500" fill="transparent" class="line-div-run"></path>
              </svg>
            </div>
            <div class="tipsBZ">
              <div class="contTips">{{ i }}雨水泵</div>
              <div class="light" v-if="item.dl">
                <div class="flex"><img src="@/assets/newImgs/pumpGY/dlIcon.png" alt="电流" />{{ item.dl }}</div>
                <div class="flex"><img src="@/assets/newImgs/pumpGY/timeIcon.png" alt="时长" />{{ item.hour }}</div>
              </div>
            </div>
            <img class="pump" src="@/assets/newImgs/pumpGY/pumpOpen.png" alt="泵机开启状态" v-if="item.status == '运行'" />
            <img class="pump" src="@/assets/newImgs/pumpGY/pump.png" alt="泵机停止状态" v-else />
            <div class="status">就地</div>
            <div class="yxstatus statusYX" v-if="item.status == '运行'">{{ item.status }}</div>
            <div class="yxstatus statusTZ" v-else>停止</div>
          </div>
        </div>

        <!-- 污水泵 -->
        <div class="flex bzCont" v-if="pumpObj.pumpType == 'sewage_water'">
          <div class="partBJ" v-for="(item, index) in pumpList" :key="index">
            <img class="guan" src="@/assets/newImgs/pumpGY/guan.png" alt="水管" />
            <!-- 开启单个水管水流动效 -->
            <div class="line-div" v-if="item.status == '运行'">
              <svg
                xmlns="http://www.w3.org/2000/svg"
                version="1.0"
                viewBox="0 0 40 400"
                stroke-width="40"
                stroke-dasharray="30"
                style="height: 290px; width: 24px"
              >
                <path d="M5 -50 Q1 -5 2 -2 V425" stroke="#ff8500" fill="transparent" class="line-div-run"></path>
              </svg>
            </div>
            <div class="tipsBZ">
              <div class="contTips">{{ i }}污水泵</div>
              <div class="light" v-if="item.dl">
                <div class="flex"><img src="@/assets/newImgs/pumpGY/dlIcon.png" alt="电流" />{{ item.dl }}</div>
                <div class="flex"><img src="@/assets/newImgs/pumpGY/timeIcon.png" alt="时长" />{{ item.hour }}</div>
              </div>
            </div>
            <img class="pump" src="@/assets/newImgs/pumpGY/pumpWOpen.png" alt="泵机开启状态" v-if="item.status == '运行'" />
            <img class="pump" src="@/assets/newImgs/pumpGY/pumpW.png" alt="泵机停止状态" v-else />
            <div class="status">就地</div>
            <div class="yxstatus statusYX" v-if="item.status == '运行'">{{ item.status }}</div>
            <div class="yxstatus statusTZ" v-else>停止</div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { realtimeDataList, sitePropertyRelation } from '@/api/scada/monitor';

const { proxy } = getCurrentInstance();
const pumpObj = ref({});
const detailObj = ref({});
const pumpList = ref([]); //泵机
const gsjList = ref([]); //格栅机
const realYW = ref(''); //实时液位
const mainWater = ref(false); //大水管动效
const timer = ref(null);

const props = defineProps({
  pumpObj: {
    type: Object,
  },
});
watch(
  () => props.pumpObj,
  () => {
    pumpObj.value = props.pumpObj;
  },
  { immediate: true }
);

// 获取数据
async function getData() {
  let datas = {};
  if (localStorage.getItem('showHistoryMonitor') == '1') {
    //其他模块历史数据,取水位最高的那一条数据
    let params = {
      startTime: localStorage.getItem('setRainDateKF') + ' 00:00:00',
      endTime: localStorage.getItem('setRainDateKF') + ' 23:59:59',
      stationCode: pumpObj.value.pumpCode, //泵站code
      pageSize: 99999,
      pageNum: 1,
    };
    let res = await sitePropertyRelation(params);
    let lists = res.data || [];
    let index = 0;
    let arrs = [];
    if (lists.length == 0) {
      // 无数据时把泵的数量渲染加上
      let total = pumpObj.value.rainpump.deviceCount || pumpObj.value.sweagepump.deviceCount;
      for (let i = 0; i < total; i++) {
        pumpList.value.push({
          status: '停止',
          dl: '',
          hour: '',
        });
      }
      return;
    } else {
      if (!!!lists[0]['BZKFDJG-YW'] || !!!lists[0]['BZKFHYG-YE']) {
        // 无数据时把泵的数量渲染加上
        let total = pumpObj.value.rainpump.deviceCount || pumpObj.value.sweagepump.deviceCount;
        for (let i = 0; i < total; i++) {
          pumpList.value.push({
            status: '停止',
            dl: '',
            hour: '',
          });
        }
        return;
      }
      lists.map(item => {
        arrs.push(item['BZKFDJG-YW'] || item['BZKFHYG-YE']);
        let max = Math.max(...arrs);
        index = arrs.findIndex(item2 => {
          return item2 == max;
        });
      });
      datas = lists[index];
    }
  } else {
    //排水防涝实时数据
    let params = {
      stationCode: pumpObj.value.pumpCode, //泵站code
    };
    let res = await realtimeDataList(params);
    datas = res.data || {};
  }
  pumpList.value = [];
  detailObj.value = datas;
  realYW.value = detailObj.value['BZKFDJG-YW'] || detailObj.value['BZKFHYG-YE'] || 0.2; //实时液位
  for (let i in datas) {
    // 添加泵机数据
    if (i.includes('QSB-YX') || i.includes('YSB-YX') || i.includes('RUN')) {
      if (datas[i] == '0') {
        datas[i] = '停止';
      } else if (datas[i] == '1') {
        datas[i] = '运行';
      }
      pumpList.value.push({ status: datas[i], dl: '', hour: '' });
    }
    // 大水管动效判断
    pumpList.value &&
      pumpList.value.filter(item => {
        if (item.status == '运行') {
          mainWater.value = true;
        } else {
          mainWater.value = false;
        }
      });
    // 添加格栅机数据
    if (i.includes('QSB-GSJ')) {
      gsjList.value.push({ status: datas[i] });
    }
  }
}

onMounted(() => {
  if (pumpObj.value.pumpCode == 'hdbz') {
    // 假数据,演示用,河大泵站
    realYW.value = 5.19;
    pumpList.value = [
      { status: '运行', dl: '88.1A', hour: '33:32:20' },
      { status: '运行', dl: '78.1A', hour: '33:32:20' },
      { status: '运行', dl: '79.1A', hour: '51:30:20' },
      { status: '运行', dl: '45.1A', hour: '04:32:20' },
      { status: '停止', dl: '', hour: '' },
    ];
    mainWater.value = true;
    pumpObj.value.rainpump = JSON.stringify({ collectionOut: '东护城河' });
    detailObj.value.tt = '2024-08-20 12:20:32';
  } else if (
    pumpObj.value.pumpCode == 'BZKFHYG' ||
    pumpObj.value.pumpCode == 'BZKFDJG' ||
    pumpObj.value.pumpCode == 'BZKFMXJ' ||
    pumpObj.value.pumpCode == 'BZKFTBJ'
  ) {
    // 接入plc数据的泵站数据展示
    getData();
    // 定时刷新
    timer.value = setInterval(() => {
      getData();
    }, 5 * 60 * 1000);
  } else {
    pumpList.value = [];
    // 其他普通泵站显示
    realYW.value = 5.19;
    console.log(pumpObj.value.rainpump);
    let total = pumpObj.value.rainpump.deviceCount || pumpObj.value.sweagepump.deviceCount;
    for (let i = 0; i < total; i++) {
      pumpList.value.push({
        status: '停止',
        dl: '',
        hour: '',
      });
    }
    detailObj.value.tt = '2024-08-20 12:20:32';
  }
});

onBeforeUnmount(() => {
  if (timer.value) clearInterval(timer.value);
});
</script>

<style lang="scss" scoped>
// prettier-ignore
.pumpGKT {
  width:1450PX;
  font-family: Source Han Sans CN;
  font-weight: 500;
  font-size: 16PX;
  color: #FFFFFF;
  
  .pumpCont{
    position:relative;
    margin:30PX 0PX 100PX 0PX;
    width:1395PX;
    height: 460PX;
    background: url('@/assets/newImgs/pumpGY/pumpBg.png') no-repeat;
    background-size:100% 100%;
    .pumpBZ{
      position:absolute;
      bottom:0PX;
      left:345PX;
      width:935PX;
      height: 100%;
      .bzCont{
        position:absolute;
        bottom:0PX;
        left:50PX;
        z-index: 20;
        width:820PX;
        height: 100%;
        justify-content: space-around;
        .partBJ{
          position:relative;
          width:50PX;
          .tipsBZ{
            position:absolute;
            left:30PX;
            top:90PX;
            .light{
              width:100PX;
              .flex{
                align-items: center;
                margin-top:5PX;
                img{
                  width:17PX;
                  height: 17PX;
                  margin-right:5PX;
                }
              }
              
            }
          }
          .guan{
            margin:25PX 0px 0px 0PX;
          }
          .line-div{
            position:absolute;
            left:5PX;
            top:25PX;
            .line-div-run{
              fill:transparent !important;
              animation: moveLines 1s linear infinite;;
            }
            @keyframes moveLines {
              0%{
                stroke-dashoffset: -30;
              }
              100%{
                stroke-dashoffset: 30;
              }
            }
          }
          .pump{
            margin:-3PX 0px 0px -20PX;
          }
          .status{
            margin:0PX 0px 0px -8PX;
          }
          .yxstatus{
            margin:40PX 0px 0px -20PX;
          }
        }
      }
      .waterVal{
        position:absolute;
        bottom:10PX;
        left:0PX;
        z-index: 10;
        width:100%;
        height: 100%;
        .water{
          position:absolute;
          bottom:0PX;
          left:0PX;
          width:100%;
        }
        .value{
          position:absolute;
          bottom:0PX;
          right:0PX;
          height: 384PX;
          .number{
            position:absolute;
            bottom:0PX;
            left:0PX;
            z-index: 99;
            width:67PX;
            border-bottom:3px solid #2ABB3E;
            .val{
              text-align: center;
              padding:3PX 2PX;
              width:42PX;
              margin-left:25PX;
              margin-bottom:-1PX;
              background: #2ABB3E;
              font-weight: bold;
              font-size: 17PX;
            }
          }
        }
      }
    }
    .gsjCont{
      position:absolute;
      bottom:0PX;
      left:10PX;
      width:260PX;
      height: 100%;
      justify-content: space-around;
      .partGsj{
        text-align: center;
        .contTips{
          margin:90PX 0PX 10PX 15PX;
        }
        img{
          width:107PX;
          height: 252PX;
        }
        .status{
          margin:40PX 0PX 0PX -5PX;
        }
        .yxstatus{
          margin:40PX 0PX 0PX 15PX;
        }
      }
    }

    .contTips{
      width: 78PX;
      height: 26PX;
      line-height: 26PX;
      text-align: center;
      background: #004DE0;
      border-radius: 13PX;
      font-size:14PX;
    }
    .waterGo{
      position:absolute;
      right:-30PX;
      bottom:45PX;
      width:10PX;
      font-size:20PX;
      font-weight: bold;
    }
    .waterType{
      position:absolute;
      left:360PX;
      bottom:165PX;
      width:10PX;
      font-size:26PX;
      font-weight: bold;
      z-index: 90;
    }
    .path-run{
      position:absolute;
      left:285PX;
      top:0PX;
      height: 350PX;
      .pathRun{
        animation: pathRun 2s linear infinite;
        fill:transparent !important;
      }
      @keyframes pathRun {
        0%{
          stroke-dashoffset: 0;
        }
        100%{
          stroke-dashoffset: -120;
        }
      }
    }
  }
  .statusYX{
    width: 68PX;
    height: 28PX;
    line-height: 28PX;
    text-align: center;
    background: #2ABB3E;
    border-radius: 14PX;
  }
  .statusTZ{
    width: 68PX;
    height: 28PX;
    line-height: 28PX;
    text-align: center;
    background: #959595;
    border-radius: 14PX;
  }
  .pumpInfo{
    width:660PX;
    height: 140PX;
    background: rgba(7,45,67,0.6);
    border: 2PX solid #2C81C7;
    box-shadow: 0PX 0PX 8PX #67BDFA inset;
    padding:15PX;
    .infoLeft{
      width:60%;
      .name{
        font-size: 18PX;
        font-weight: 800;
      }
      .type{
        p{
          span{
            width:10PX;
            height: 10PX;
            border-radius: 50%;
            display: inline-block;
            margin-right: 8PX;
          }
        }
        .success span{
          background: #39FE54;
        }
        .fail span{
          background: #959595;
        }
        .fault span{
          background: #FF2E2E;
        }
      }
    }
    .infoRight{
      flex:1;
      .cont{
        margin-bottom:5px;
      }
    }
  }
  
}
</style>