ch.vue 7.59 KB
<!--
 * @Author: yangwei
 * @Date: 2023-02-28 15:47:12
 * @LastEditors: yangwei
 * @LastEditTime: 2023-06-16 16:14:51
 * @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': borderColor}"
          :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:{value:'openMenu',default:null},
    selectAll:{value:'selectAll',default:null},
    changeChoosedObj:{value:'changeChoosedObj',default:null},
    clearChangeChoosedObj:{value:'clearChangeChoosedObj',default:null}
  },
  props: {
    ch: {
      type: Array,
      default: function () {
        return [];
      },
    },
  },
  data() {
    return {
      //选中户bsm合集
      hbsmList: [],
      //选中层bsm合集
      cbsmList: [],
      //选中户qszt集合
      hqsztList: [],
      //区分单双击事件的定时器
      time: null,
      // 边框颜色
      borderColor:'rgb(230, 230, 230)'
    };
  },
  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) {
    },
    // 户单元状态点击事件
    hDyztClick(e, bsm, hs) {
      // this.handleClickH(e.target.parentNode, bsm, hs);
    },
    //户双击事件
    dbclick(bsm) {
      // clearTimeout(this.time);
    },
    //幢单元全选/反选
    zdySelectAll(val,flag) {
      // 手动点击全部取消选中
      !flag &&  this.clearChangeChoosedObj()
      this.ch.forEach((c) => {
        c.hs.forEach((h) => {
          if (val) {
            h.select = true;
            // 使用hbsmList时,需要去重
            this.hbsmList.push(h.bsm)
          } else {
            h.select = false;
            this.borderColor = 'rgb(230, 230, 230)'
            this.hbsmList = []
          }
        });
      });
      this.$refs.hBsm && this.$refs.hBsm.forEach((item) => {
        // item.style.borderColor = this.borderColor
        item.style.backgroundColor =  '#fff';
        // item.style.border = `1px solid ${this.borderColor}`
      });
    },
  },
  watch: {
    selectAll: {
      handler(val) {
        this.zdySelectAll(val.selectAll);
      },
      immediate: true,
      deep: true,
    },
    changeChoosedObj: {
      handler(val) {
        //清除选中户
        this.borderColor = 'rgb(230, 230, 230)';
        this.zdySelectAll(false,true)
        if (val.bsms.length) {
          this.$refs.hBsm.forEach((item) => {
            val.bsms.forEach((i,ind) => {
              if (item.dataset.bsm == i) {
                if (ind == 0) {
                  //定位到第一个户所在位置
                  window.lpbContent.$refs.lpbContent.scrollTop = item.offsetTop;
                  window.lpbContent.$refs.lpbContent.scrollLeft = item.offsetLeft;
                }
                item.style.border = '1px solid '+ val.color;
                // item.style.backgroundColor =  val.color;
              }
            });
          });
        }else{
          this.borderColor = 'rgb(230, 230, 230)'
        }

      },
      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 {
      .floor {
        min-width: 56px;
        background: #e8f2ff;
        border: 1px solid #acbae8;
      }
      &:first-child {
        .floor {
          border-radius: 4px 0px 0px 1px;
        }
      }
      td {
        min-width: 138px;
        height: 64px;
        line-height: 64px;
        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: 3px 0px 3px 0px;
        }
        .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: 28px;
          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 ;
        border-color: #5A78DE !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>