<template>
  <div class="griddv">
    <div class="left">
      <div class="griddv-title">
        <h2>网格列表</h2>
      </div>
      <div class="griddv-tree">
        <el-tree
          :data="treeList"
          :props="defaultProps"
          @node-click="handleNodeClick"
          node-key="id"
          ref="tree"
          :expand-on-click-node="false"
          default-expand-all
          highlight-current>
        </el-tree>
      </div>
    </div>
    <div class="middle" v-loading="isLoading" element-loading-background="rgba(0, 0, 0, 0.5)">
      <div id="tree" style="width: 100%; height: 100%">
        <VueOkrTree
          ref="VueOkrTree"
          :data="chartData"
          node-key="id"
          show-collapsable
          aniamte
          animate-name="okr-fade-in-linear"
          :render-content="renderContent"
          default-expand-all>
        </VueOkrTree>
      </div>
    </div>
    <div class="right">
      <div class="right-top">
        <div class="griddv-title">
          <h2>网格内人员情况</h2>
        </div>
        <div class="right-chart">
          <ai-echart
            style="height: 100%; width: 100%;"
            :data="userInfo"
            :ops="pieChart">
          </ai-echart>
        </div>
      </div>
      <div class="right-bottom">
        <div class="griddv-title">
          <h2>事件上报情况</h2>
        </div>
        <div class="right-chart">
          <ai-echart
            style="height: 100%; width: 100%;"
            :data="eventInfo"
            :ops="pieChart">
          </ai-echart>
        </div>
      </div>
    </div>
    <el-dialog :visible.sync="isShowInfo" width="640px" :modal-append-to-body="false">
      <template slot="title">
        <h2>家庭信息</h2>
        <img src="../assets/grid/close.png" @click="isShowInfo = false">
      </template>
      <div class="grid-info">
        <div class="grid-info__title">
          <h2>家庭地址</h2>
          <span>{{ residentInfo.currentAreaName }}</span>
        </div>
        <ai-table
          v-if="tableData.length"
          style="width: 558px"
          :tableData="tableData"
          :col-configs="colConfigs"
          :total="total"
          :isShowPagination="false"
          :current.sync="search.current"
          :size.sync="search.size"
          @getList="() => {}">
        </ai-table>
      </div>
    </el-dialog>
  </div>
</template>

<script>
  import pieChart from 'dvcp-dv-ui/components/AiEchart/template/pie/pieChart2'
  import { VueOkrTree } from 'vue-okr-tree'
  import 'vue-okr-tree/dist/vue-okr-tree.css'
  export default {
    name: 'AppGridDV',

    label: '网格数据大屏',

    props: {
      instance: Function,
      dict: Object,
    },

    data () {
      return {
        isLoading: false,
        treeList: [],
        search: {
          size: 100,
          current: 1
        },
        userInfo: [],
        eventInfo: [],
        pieChart,
        total: 0,
        isShowInfo: false,
        defaultProps: {
          children: 'girdList',
          label: 'girdName',
        },
        colConfigs: [
          { prop: 'name',  label: '姓名', align: 'center', width: 120 },
          { prop: 'residentType', label: '与户主关系', align: 'center',  formart: v => this.dict.getLabel('householdRelation', v) },
          { prop: 'idNumber', label: '身份证号', align: 'center', width: 220 },
          { prop: 'phone', label: '联系方式', align: 'center' }
        ],
        girdId: '',
        residentInfo: {},
        tableData: [],
        chartData: [],
        girdLevel: '0',
        defaultUrl: 'http://respub.sinoecare.net/20220121/avatar-20220121163714.jpg'
      }
    },

    components: {
      VueOkrTree
    },

    created () {
      this.dict.load('householdRelation')
      this.getTreeList()
      this.getGirdInfo()
    },

    methods: {
      handleNodeClick (e) {
        this.girdLevel = e.girdLevel
        this.isLoading = true
        this.getGirdInfo(e.id, e.girdLevel)
        this.getStatisticsInfo(e.id)
      },

      getStatisticsInfo (id) {
        this.instance.post(`/app/appgirdmemberinfo/girdMemberAndResidentStatistic?girdId=${id}`).then((res) => {
          if (res.code == 0) {
            this.userInfo = Object.keys(res.data).map(v => {
              return {
                name: v,
                v1: res.data[v]
              }
            })
          }
        })

        this.instance.post(`/app/appclapeventinfo/clapEventStatistic?girdId=${id}`).then((res) => {
          if (res.code == 0) {
            this.eventInfo = Object.keys(res.data).map(v => {
              return {
                name: v,
                v1: res.data[v]
              }
            })
          }
        })
      },

      renderContent (h, node) {
        return h('div', {
          class: `userlist ${node.data.label === '子节点' ? 'last-level' : ''} ${node.data.girdLevel > 1 ? 'userlist-wrapper' : ''}`
        }, node.data.userList.map(v => {
          return h('div', {
            class: `user-item user-item-${v.girdLevel}`
          }, [h('img', {
            attrs: {
              src: v.photo || this.defaultUrl
            }
          }), h('p', {
            attrs: {
              title: v.label,
              'data-id': v.id
            },
            on: {
              click: () => {
                if (node.data.label === '子节点') {
                  this.getResidentInfo(v.id)
                }
              }
            }
          }, v.label), h('span', {
            style: {
              display: v.girdLevel > 1 ? 'none' : 'block'
            },
            attrs: {
              title: v.girdName
            }
          }, v.girdName)])
        }))
      },

      getResidentInfo (id) {
        this.isLoading = true
        this.instance.post(`/app/appresident/detail?id=${id}`).then((res) => {
          if (res.code == 0) {
            this.residentInfo.resident = res.data
            this.tableData = res.data.family || []
            this.isShowInfo = true
          }

          this.isLoading = false
        })
      },

      getGirdInfo (id, level) {
        this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => {
          if (res.code == 0) {
            this.chartData = this.formatList(res.data)

            this.$nextTick(() => {
              if (level === '2') {
                this.getUserList(id)
              } else {
                this.isLoading = false
              }
            })
          }
        })
      },

      getUserList (id) {
        this.instance.post(`/app/appgirdmemberresident/listByGirdMember`, null, {
          params: {
            size: 1000,
            girdId: id
          }
        }).then(res => {
          if (res.code == 0) {
            const userList = res.data.records.map(v => {
              return {
                ...v,
                isLast: true,
                label: v.name
              }
            })
            
            this.isLoading = false

            if (!userList.length) {
              return false
            }

            const node = this.$refs.VueOkrTree.getNode(id)

            if (userList.length) {
              this.$refs.VueOkrTree.append({
                id: new Date().getTime(),
                label: '子节点',
                userList: userList || []
              }, node)
            }
          }
        })
      },

      formatList (list) {
        return list.map(item => {
          const userList = item.girdMemberManageList ? item.girdMemberManageList.map(v => {
            return {
              ...v,
              label: v.name,
              id: v.id,
              girdName: item.girdName,
              girdLevel: item.girdLevel,
              isUser: true
            }
          }) : [{
            label: item.girdName,
            id: item.id,
            girdLevel: item.girdLevel,
            girdName: item.girdName
          }]
          const obj = {
            label: item.girdName,
            id: item.id,
            girdLevel: item.girdLevel,
            isUser: false,
            userList: userList,
            children: item.girdList || []
          }

          if (obj.children && obj.children.length) {
            obj.children = this.formatList(obj.children)
          }

          return obj
        })
      },

      getTreeList () {
        this.instance.post('/app/appgirdinfo/listAll').then((res) => {
          if (res.code == 0) {
            this.treeList = [...res.data]

            this.$nextTick(() => {
              this.$refs.tree.setCurrentKey(res.data[0].id)
              this.getStatisticsInfo(res.data[0].id)
            })
          }
        })
      }
    }
  }
</script>

<style lang="scss" scoped>
  .griddv {
    display: flex;
    align-items: center;
    height: 100%;

    .grid-info {
      width: 100%;
      .grid-info__title {
        display: flex;
        align-items: center;
        margin-bottom: 20px;

        h2, span {
          color: #fff;
          font-size: 14px;
          font-weight: 500;
        }
      }
    }

    ::v-deep .el-dialog__body {
      padding: 10px 40px 30px;

      .el-table {
        background-color: transparent;
      }
      
      .el-table__body tr td:first-child .cell, .ai-table .el-table__header tr th:first-child .cell {
        padding-left: 0!important;
      }

      .el-table th, .el-table tr {
        color: #fff;
        font-size: 14px;
        background-color: rgba(28, 39, 65, 0.9);
      }

      .el-table__row--striped, .el-table--striped .el-table__body tr.el-table__row--striped td {
        background-color: transparent!important;
      }

      .el-table__header-wrapper {
        display: none;
      }

      .el-table--enable-row-hover .el-table__body tr:hover > td, .el-table-filter {
        background-color: transparent;
      }
    }

    ::v-deep .el-dialog {
      position: absolute;
      top: 50%;
      left: 50%;
      margin: 0!important;
      transform: translate(-50%, -50%);
      background: rgba(2, 13, 43, 0.9);
      box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.5), inset 0px 0px 10px 0px #2C7CFF;
      border: 1px solid #2D65C9;

      .el-dialog__header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        background: transparent;
        box-shadow: none;

        h2 {
          color: #fff;
          font-size: 18px;
        }

        img {
          cursor: pointer;
          width: 16px;
          height: 16px;

          &:hover {
            opacity: 0.6;
          }
        }
      }

      .el-dialog__headerbtn {
        display: none;
      }
    }

    ::v-deep .userlist {
      display: flex;
      align-items: center;

      &.userlist-wrapper {
        padding: 10px;
        background: rgba(76, 166, 255, 0.1);
        border: 1px solid rgba(255, 255, 255, 0.2);
      }

      .user-item {
        margin-right: 10px;
        color: #fff;
        font-size: 0;

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

        img {
          width: 58px;
          height: 80px;
          object-fit: cover;
        }

        p {
          max-width: 120px;
          margin: 4px 0;
          font-size: 19px;
          overflow: hidden;
          text-overflow:ellipsis;
          white-space: nowrap;
        }

        span {
          display: block;
          max-width: 120px;
          font-size: 17px;
          color: #9DD3FF;
          overflow: hidden;
          text-overflow:ellipsis;
          white-space: nowrap;
        }

        &.user-item-0 {
          img {
            width: 86px;
            height: 120px;
          }
        }

        &.user-item-2 {
          p {
            font-size: 12px;
            margin-bottom: 0;
          }
          img {
            width: 40px;
            height: 56px;
          }
        }
      }

      &.last-level {
        flex-wrap: wrap;
        max-width: 690px;
        font-size: 0;
        background: rgba(0, 0, 0, 0.1);
        border: 1px solid rgba(255, 255, 255, 0.2);
        padding: 12px 12px 0 12px;
        box-sizing: border-box;

        .user-item {
          margin-bottom: 12px;
        }

        img {
          display: none;
        }

        p {
          padding: 8px;
          font-size: 12px;
          background: #0B477D;
          border-radius: 4px;
        }

        span {
          display: none!important;
        }
      }
    }

    * {
      box-sizing: border-box;
    }

    .griddv-title {
      display: flex;
      width: 320px;
      height: 62px;
      background-image: url(../assets/grid/title-bg.png);
      background-size: 100% 100%;

      h2 {
        width: 100%;
        height: 50px;
        line-height: 50px;
        padding-left: 24px;
        font-weight: 600;
        font-size: 20px;
        letter-spacing: 1px;
        color: #fff;
      }
    }

    & > div {
      height: 100%;
    }

    .right {
      display: flex;
      justify-content: space-between;
      flex-direction: column;
      width: 440px;
      margin-left: 20px;

      & > div {
        width: 100%;
        height: 440px;
        padding-bottom: 20px;
        background: rgba(7, 11, 35, 0.4);
        border: 1px solid #2D50B5;
        box-sizing: border-box;

        .right-chart {
          height: calc(100% - 82px);
        }
      }
    }

    .middle {
      flex: 1;
      margin-left: 20px;
      background: rgba(7, 11, 35, 0.4);
      border: 1px solid #2D50B5;
      overflow: hidden;

      #tree {
        padding: 20px;
        overflow: auto;
      }

      ::v-deep .org-chart-container {
        display: flex;
        justify-content: center;

        .org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before,
        .org-chart-node.is-leaf:before {
          border-radius: 0;
          border-color: #9CD7FF!important;
        }

        .org-chart-node-label-inner {
          padding: 0!important;
        }
      }
    }

    .left {
      width: 320px;
      background: rgba(7, 11, 35, 0.4);
      border: 1px solid #2D50B5;

      .griddv-tree {
        height:  calc(100% - 62px);
        overflow-y: auto;
        padding: 0 8px 8px 8px;
      }

      ::v-deep .el-tree {
        background: transparent;

        .el-tree-node__expand-icon {
          color: #eaeff9;
        }

        .el-tree-node__expand-icon.is-leaf {
          color: transparent;
        }

        .el-tree-node__content {
          height: 32px;
          color: #eaeff9;
          font-size: 14px;
          user-select: none;
          font-weight: normal!important;
        }

        .is-current > .el-tree-node__content, .el-tree-node__content:hover {
          background: linear-gradient(270deg, #4895D9 0%, #2D52CA 100%);
        }
      }
    }
  }
</style>