ch.vue 6.54 KB
<!--
 * @Author: yangwei
 * @Date: 2023-02-28 15:47:12
 * @LastEditors: yangwei
 * @LastEditTime: 2023-03-02 16:35:36
 * @FilePath: \bdcdj-web\src\views\lpb\lpbContent\ch.vue
 * @Description: 
 * 
 * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
-->
<template>
  <div class="ch-wrap">
    <table
      class="chTable"
      ref="ch"
      border="1"
      cellspacing="0"
      cellpadding="0"
      v-show="ch.length"
    >
      <tr v-for="(cs, csIndex) in ch" :key="csIndex">
        <!-- 显示层数 -->
        <td
          class="floor"
          ref="cBsm"
          @contextmenu.prevent="openMenu($event, cs, 'c')"
          @click="handleClickC($event, cs)"
        >
          {{ cs.sjc }}
        </td>
        <!-- 显示户 -->
        <td
          v-for="(hs, hsIndex) in cs.hs"
          :rowspan="hs.sjcs"
          :colspan="hs.sjhs"
          :data-bsm="hs.bsm"
          :data-qszt="hs.qszt"
          ref="hBsm"
          :key="hsIndex"
          style="border-color: rgb(230, 230, 230)"
          :class="hs.select ? 'tdSelect' : ''"
          @click="handleClickH($event.target, hs.bsm, hs)"
          @dblclick="dbclick(hs.bsm)"
          @contextmenu.prevent="openMenu($event, hs, 'h')"
        >
          {{ hs.shbw }}
          <span @click.stop="" class="hqszt lin" v-show="hs.qszt == '0'"
            ></span
          >
          <span @click.stop="" class="hqszt zheng" v-show="hs.qszt == '1'"
            ></span
          >
          <span @click.stop="" class="hqszt xian" v-show="hs.qszt == '2'"
            ></span
          >
          <ul @click.stop="hDyztClick($event, hs.bsm, hs)" class="dyzt">
            <li style="background-color: #6edee1" v-show="hs.qqzt == '1'">

            </li>
            <li style="background-color: #8adc88" v-show="hs.bazt == '1'">

            </li>
            <li style="background-color: #ff8282" v-show="hs.dyzt == '1'">

            </li>
            <li style="background-color: #d7cecf" v-show="hs.cfzt == '1'">

            </li>
            <li style="background-color: #d4a3eb" v-show="hs.yyzt == '1'">

            </li>
            <li style="background-color: #a5a3fb" v-show="hs.xzzt == '1'">

            </li>
          </ul>
        </td>
      </tr>
    </table>
  </div>
</template>

<script>
export default {
  name: "BdcdjWebCh",
  inject: ["openMenu", "selectAll"],
  props: {
    ch: {
      type: Array,
      default: function () {
        return [];
      },
    },
  },
  data() {
    return {
      //选中户bsm合集
      hbsmList: [],
      //选中层bsm合集
      cbsmList: [],
      //选中户qszt集合
      hqsztList: [],
      //区分单双击事件的定时器
      time: null,
    };
  },
  mounted() {},
  methods: {
    // 层选中事件
    handleClickC(e, item) {
      //判断点击的层是否选中
      if (e.target.className.indexOf("tdSelect") == -1) {
        //未选中→选中
        e.target.className += " tdSelect"; //加边框
        this.cbsmList.push(item.bsm);
      } else {
        //选中→未选中
        e.target.className = "floor";
        this.cbsmList = this.cbsmList.filter((i) => i != item.bsm);
      }
      // this.$parent.getCbsm(this.cbsmList);
    },
    //户单击事件
    handleClickH(e, bsm, hs) {
      let self = this;
      // 开启延时器,200ms的间隔区分单击和双击,解决双击时执行两次单击事件
      clearTimeout(self.time);
      self.time = setTimeout(() => {
        // this.closeMenu();
        //判断点击的户是否选中
        if (!hs.select) {
          //未选中→选中
          hs.select = true; //加边框
          this.hbsmList.push(bsm); // 将户bsm放进hbsmList
          this.hqsztList.push(hs.qszt); // 将户qszt放进hqsztList
        } else {
          //选中→未选中
          hs.select = false;
          this.hbsmList = this.hbsmList.filter((i) => i != bsm);
          this.hqsztList = this.hqsztList.filter((i) => i != hs.qszt);
        }
      }, 200);
    },
    // 户单元状态点击事件
    hDyztClick(e, bsm, hs) {
      this.handleClickH(e.target.parentNode, bsm, hs);
    },
    //户双击事件
    dbclick(bsm) {
      clearTimeout(this.time);
    },
    //幢单元全选/反选
    zdySelectAll(val) {
      this.ch.forEach((c) => {
        c.hs.forEach((h) => {
          if (val) {
            h.select = true;
            // 使用hbsmList时,需要去重
            this.hbsmList.push(h.bsm)
          } else {
            h.select = false;
            this.hbsmList = []
          }
        });
      });
    },
  },
  watch: {
    selectAll: {
      handler(val) {
        this.zdySelectAll(val.selectAll);
      },
      immediate: true,
      deep: true,
    },
  },
};
</script>

<style lang="scss" scoped>
.ch-wrap {
  display: flex;
  flex-direction: column-reverse;
  .chTable {
    margin-left: -1px;
    border-color: #e4ebf4 !important;
    border-collapse: collapse;
    border-spacing: 0;
    // position: relative;
    tr {
      td {
        min-width: 138px;
        height: 72px;
        line-height: 72px;
        text-align: center;
        cursor: pointer;
        position: relative;
        .hqszt {
          display: inline-block;
          width: 16px;
          height: 16px;
          font-size: 12px;
          line-height: 16px;
          position: absolute;
          left: 6px;
          top: 6px;
          border: 1px solid;
          border-radius: 8px;
        }
        .lin {
          color: #f7b500;
          border-color: #f7b500;
        }
        .zheng {
          color: #1ad6e1;
          border-color: #1ad6e1;
        }
        .xian {
          color: #45aefd;
          border-color: #45aefd;
        }
        .dyzt {
          user-select: none;
          width: 138px;
          height: 18px;
          position: absolute;
          bottom: 32px;
          box-sizing: border-box;
          padding: 0 6px;
          li {
            display: inline-block;
            width: 18px;
            height: 18px;
            font-size: 12px;
            line-height: 18px;
            color: #ffffff;
            border: 1px solid;
            border-radius: 9px;
          }
        }
      }
      .tdSelect {
        border: 1px solid #006cff !important;
        background-image: url("./images/tdSelect.png");
        background-repeat: no-repeat;
        background-position: right top;
        background-size: 30px;
      }
      .hasBorder {
        border-width: 1px;
        border-style: solid;
      }
    }
  }
}
</style>