<template>
    <div id="nitrogenCss3D" class="threejs-Object-CSS"
      style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px">
      <a-spin :spinning="loading" />
      <div v-for="groupNum in monitorDataGroupNum" :key="groupNum" class="modal-monitor">
        <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
          <div class="title">{{ groupNum }}号空压机 </div>
          <div class="monitor-item">
            <span class="monitor-title">排气压力:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['compressExhaustPressF1'] ?
              monitorData[groupNum - 1]['compressExhaustPressF1'] : '-' }}</span><span class="unit">Mpa</span></span>
          </div>
          <div class="monitor-item">
            <span class="monitor-title">分离压力:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['compressSeparatePressF1'] ?
              monitorData[groupNum - 1]['compressSeparatePressF1'] : '-' }}</span><span class="unit">Mpa</span></span>
          </div>
          <div class="monitor-item">
            <span class="monitor-title">排气温度:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['exhaustTemp'] ? monitorData[groupNum
              - 1]['exhaustTemp'] : '-' }}</span><span class="unit">℃</span></span>
          </div>
          <div class="signal-item">
            <div class="signal"><span class="monitor-title">运行信号</span><span
                :class="{ 'signal-round': true, 'signal-round-run': monitorData[groupNum - 1]['compressRunSigF1'], 'signal-round-gry': !monitorData[groupNum - 1]['compressRunSigF1'] }"></span>
            </div>
            <div class="signal"><span class="monitor-title">加载信号</span><span
                :class="{ 'signal-round': true, 'signal-round-run': monitorData[groupNum - 1]['compressLoadSigF1'], 'signal-round-gry': !monitorData[groupNum - 1]['compressLoadSigF1'] }"></span>
            </div>
          </div>
        </fourBorderBg>
        <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
          <div class="title">{{ cqgs[groupNum - 1] }}</div>
          <div class="monitor-item">
            <span class="monitor-title">气囊温度:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverTemp'] ?
              monitorData[groupNum - 1]['airReceiverTemp'] : '-' }}</span><span class="unit">℃</span></span>
          </div>
          <div class="monitor-item">
            <span class="monitor-title">气囊压力<span class="unit"></span>:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverPress'] ?
              monitorData[groupNum - 1]['airReceiverPress'] : '-' }}</span><span class="unit">Mpa</span></span>
          </div>
          <div class="monitor-item">
            <span class="monitor-title">气囊流量<span class="unit"></span>:</span>
            <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverFlow'] ?
              monitorData[groupNum - 1]['airReceiverFlow'] : '-' }}</span><span class="unit">m³/k</span></span>
          </div>
        </fourBorderBg>
      </div>
    </div>
    <div id="nitrogen3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
    <div class="nitrogen-home">
      <div class="nitrogen-container">
        <div class="top-box">
          <!-- 左边监测数据 -->
          <div class="lr-box left-box">
            <div class="item item-l" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
              <div class="monitor-box">
                <!-- <div class="device-title">{{ monitorData[groupNum - 1]['strName'] }}</div>-->
                <dv-decoration7 style="height:30px;">
                  <div class="base-title">{{ groupNum }}号空压机组</div>
                </dv-decoration7>
                <div class="state-item" v-for="(data, index) in showMonitorData" :key="index">
                  <div class="item-col">
                    <span class="state-title">{{ Object.values(data)[0] }} :</span>
                    <span class="state-val">{{ (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[0]])
                      >= 0 ? monitorData[groupNum - 1][Object.keys(data)[0]] : '-' }}</span>
                  </div>
                  <div class="item-col">
                    <span class="state-title">{{ Object.values(data)[1] }} :</span>
                    <span class="state-val">{{ (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[1]])
                      >= 0 ? monitorData[groupNum - 1][Object.keys(data)[1]] : '-' }}</span>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <!-- 右边控制状态 -->
          <div class="lr-box right-box">
            <div class="item">
              <div class="control-item">
                <div class="control-item-l">
                  <!-- <img src="@/assets/img/yccz.png" alt="" width="36px" height="36px" style="margin-right: 10px;"> -->
                  <span style="font-size: 18px;">远程控制</span>
                </div>
              </div>
              <div class="control-item" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
                <div class="control-item-l">
                  <span class="round"></span>
                  <span>{{ kyjs[groupNum - 1] }}</span>
                </div>
                <div class="control-item-r" style="display: flex; align-items: center;">
                  <a-switch v-model="airCompressorState[groupNum - 1][`compressRunSigF1`]" checked-children="开启"
                    un-checked-children="关闭" :disabled="airCompressorState[groupNum - 1][`controlModel`]"
                    @change="handlerDevice(airCompressorState[groupNum - 1])">
                  </a-switch>
                </div>
              </div>
              <div class="control-item">
                <div class="control-item-l">
                  <span class="round"></span>
                  <span>控制模式</span>
                </div>
                <div>
                  <a-switch v-model="airCompressorState[0][`controlModel`]" checked-children="就地" un-checked-children="远程"
                    @change="handlerControlModel(airCompressorState[0])">
                  </a-switch>
                </div>
              </div>
              <div class="control-item">
                <div class="control-item-l">
                  <span class="round"></span>
                  <span>是否开启联动</span>
                </div>
                <div class="item-data-box" style="display: flex">
                  <div
                    :class="{ 'state-icon': true, 'open': monitorData[0].linkState, 'close': !monitorData[0].linkState }">
                  </div>
                  <div style="margin-left: 10px;">{{ !monitorData[0].linkState ? '不联动' : '联动' }}</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
</template>
<script lang="ts" setup name="nitrogenHome">
import { onMounted, onUnmounted, ref, watch } from 'vue'
import { Decoration7 as DvDecoration7 } from '@kjgl77/datav-vue3'
import fourBorderBg from '../../../comment/components/fourBorderBg.vue'
import { mountedThree, destroy } from '../nitrogen.threejs'
import { list } from '../nitrogen.api'

const loading = ref(true)

const kyjs = ['1号空压机', '2号空压机', '3号空压机', '4号空压机'];
const cqgs = ['1号储气罐', '2号储气罐', '3号储气罐', '4号储气罐'];

const monitorDataGroupNum = ref(3);

const airCompressorState = ref([
  {
    id: '',
    compressRunSigF1: false,
    controlModel: false
  },
  {
    id: '',
    compressRunSigF1: false,
    controlModel: false
  },
  {
    id: '',
    compressRunSigF1: false,
    controlModel: false
  },
  {
    id: '',
    compressRunSigF1: false,
    controlModel: false
  }
]);
const showMonitorData = [
  {
    supVolt1: '电流A(A)',
    supVolt2: '电流B(A)',
  },
  {
    supVolt3: '电流C(A)',
    current: '电源电压(V)',
  },
  {
    shock1: '震动X(mm/s)',
    shock2: '震动Y(mm/s)',
  },
  {
    shock3: '震动Z(mm/s)',
    noise: '噪声',
  },
  {
    ambTempCol: '环境温度(℃)',
  },
];
const monitorData = ref(new Array(4).fill({
  strName: '空压机',
  compressGroupName: '',
  compressExhaustPressF1: '-',
  compressSeparatePressF1: '-',
  compressHostTempF1: '-',
  compressCrewTempF1: '-',
  compressRunTimeF1: '-',
  controlModel: 'LOC'
}));

// https获取监测数据
let timer: null | NodeJS.Timeout = null;
async function getMonitor() {
  if (Object.prototype.toString.call(timer) === '[object Null]') {
    timer = await setTimeout(async () => {
      await getDataSource();
      if (timer) {
        timer = null;
      }
      await getMonitor();
    }, 1000);
  }
};

async function getDataSource() {
  const res = await list({ devicetype: 'pressurefan', pagetype: 'normal' });
  const dataSource = res.msgTxt[0].datalist || [];
  dataSource.forEach((data, index) => {
    const item = data.readData;
    Object.assign(item, data);
    item.compressRunSigF1 = item.compressRunSigF1 ? true : false
    airCompressorState.value[index].id = item.id
    airCompressorState.value[index].compressRunSigF1 = item.compressRunSigF1
    airCompressorState.value[index].controlModel = item.controlModel === 'LOC' ? true : false
    monitorData.value[index] = item
  });
  monitorDataGroupNum.value = monitorData.value.length
  loading.value = false
};

function handlerDevice(data) {
  // if (data.length < 1) return
  // handleAirCompressor({ id: data.id, compressRunF1: data.compressRunSigF1 }).then(res => {
  //   if (res.success) {
  //     message.success('操作成功')
  //   } else {
  //     message.warning(data.msg)
  //   }
  // })
};
function resetDevice(data) {

}

function handlerControlModel(data) {

}

watch(monitorDataGroupNum, (newVal) => {
  if (newVal) {
    destroy()
    mountedThree(newVal)
  }
})
onMounted(async () => {
  await getMonitor()
})

onUnmounted(() => {
  destroy();
  if (timer) {
    clearTimeout(timer);
    timer = undefined;
  }
});

</script>

<style lang="less" scoped>
@ventSpace: zxm;

.nitrogen-box {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
}

#nitrogenCss3D {
  .modal-monitor {
    position: absolute;
    left: 0px;
    top: 0px;
  }

  &:deep(.win) {
    margin: 0 !important;
  }

  &:deep(.main) {

    .title {
      height: 34px;
      text-align: center;
      font-weight: 600;
      color: #7AF5FF;
      // background-image: url('../../../assets/img/yfj/light.png');
      background-repeat: no-repeat;
      background-position-x: center;
      background-position-y: 100%;
      background-size: 80%;
      font-size: 16px;
    }

    .monitor-item {
      display: flex;
      flex-direction: row;
      width: auto;
      margin-bottom: 3px;
      .monitor-val {
        color: #ffb700;
        display: flex;
        width: auto;

        .val {
          width: 80px;
          font-size: 14px;
        }

        .unit {
          color: #ffffffbb;
          font-size: 14px;

        }
      }
    }

    .monitor-title {
      width: 100px;
      color: #7AF5FF;
      font-weight: 400;
      font-size: 14px;
    }

    .signal-item {
      display: flex;
      justify-content: space-between;

      // margin-bottom: 5px;
      .signal-round {
        display: inline-block;
        width: 8px;
        height: 8px;
        border-radius: 50%;
        margin: 0 10px;
        position: relative;

        &::after {
          display: block;
          content: '';
          position: absolute;
          width: 12px;
          height: 12px;
          top: -2px;
          left: -2px;
          border-radius: 50%;
        }
      }

      .signal-round-gry {
        background-color: #858585;

        &::after {
          background-color: #85858544;
          box-shadow: 0 0 1px 1px #85858599;
        }
      }

      .signal-round-run {
        background-color: #67FC00;

        &::after {
          background-color: #67FC0044;
          box-shadow: 0 0 1px 1px #c6ff77;
        }
      }

      .signal-round-warning {
        background-color: #E9170B;

        &::after {
          background-color: #E9170B44;
          box-shadow: 0 0 1px 1px #E9170B;
        }
      }
    }
  }
}

.nitrogen-home {
  width: 100%;
  height: calc(100% - 100px);
  position: fixed;
  z-index: 99;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  pointer-events: none;
  top: 100px;
  .nitrogen-container {
    width: 100%;
    height: calc(100%);
    display: flex;
    justify-content: space-between;
    margin-bottom: 100px;

    .top-box {
      width: 100%;
      padding: 10px;
      overflow: hidden;
      display: flex;
      justify-content: space-between;

      .lr-box {
        height: fit-content;
        display: flex;
        flex-direction: column;
        position: relative;
        overflow: hidden;
        z-index: 9999;
      }

      .item {
        width: 285px;
        height: auto;
        position: relative;
        border-radius: 5px;
        margin-top: 10px;
        margin-bottom: 0px;
        pointer-events: auto;
        color: #fff;
        overflow: hidden;

        .control-item {
          height: auto;
          min-height: 35px;
          display: flex;
          flex-direction: row;
          justify-content: space-between;
          align-items: center;
          padding: 5px;
          margin: 0 10px 0 3px;
          pointer-events: auto;
          background: linear-gradient(to right, #0063CD22, #0063CD04);

          margin-bottom: 5px;
          border-width: 1px;
          border-style: dashed;

          border-image: linear-gradient(to right, #008ccd66, #0063CD04)1 1;
          border-radius: 5px;

          &:last-child {
            margin-bottom: 0
          }

          .control-item-l {
            display: flex;
            align-items: center;
            font-size: 14px;

            .round {
              display: inline-block;
              width: 3px;
              height: 3px;
              padding: 1px;
              border-radius: 50%;
              background-color: #3DF6FF;
              margin-right: 5px;
              box-shadow: 0 0 1px 1px #64f7ff;
            }
          }

          .control-item-r {
            text-align: right;
          }

          .button-box {
            position: relative;
            padding: 5px;
            border: 1px transparent solid;
            background-clip: border-box;
            border-radius: 5px;
            margin-left: 8px;
          }

          .a-button {
            pointer-events: auto;
          }

          &::v-deep .a-button--mini {
            padding: 6px 10px;
          }

          &::v-deep .a-button--mini.is-round {
            padding: 6px 10px;
          }
        }

        .base-title {
          width: calc(100% - 60px);
          text-align: center;
          color: #00d8ff;
        }

        .state-item {
          display: flex;
          flex-direction: row;
          padding: 5px;

          .item-col {
            width: 50%;
            display: flex;
            justify-content: center;
            align-items: center;
            padding-right: 4px;

            .state-title {
              color: #ffffffcc;
              flex: 9;
              font-size: 14px;

              .unit {
                // color: #ffffffbb;
              }
            }

            .state-val {
              flex: 1;
              color: #e4a300;
              margin-right: 5px;
              text-align: right;
              font-size: 14px;
            }
          }
        }

        .signal-box {
          margin: 5px 0;
          display: flex;
          align-items: center;

          .signal-title {
            color: #7AF5FF;
            margin: 0 5px;
          }

          &:last-child {
            margin-right: 0px;
          }
        }

        .list-item {
          padding: 0 10px;
          display: flex;
          justify-content: space-between;
          align-items: center;

          .item-data-key {
            color: #ffffff99;
          }
        }

        .item-data-box {
          color: #fff;

          .state-icon {
            display: inline-block;
            width: 12px;
            height: 12px;
            border-radius: 12px;
          }

          .open {
            border: 5px solid #133a56;
            background: #4ecb73;
          }

          .close {
            border: 5px solid #192961;
            background: #6d7898;
          }
        }
      }

      .item-l {
        width: 335px;

        .monitor-box {
          width: 335px;
          background-color: #ffffff05;
          margin-left: 2px;
          border-radius: 5px;
          backdrop-filter: blur(10px);
        }
      }

      .right-box {
        .item {
          height: auto;
        }
      }

      .left-box {
        width: 365px;

        .control-item {
          height: 36px;
        }
      }
    }
  }
}</style>
