index.vue 8.54 KB
<!--
 * @Description:
 * @Autor: renchao
 * @LastEditTime: 2023-10-09 10:18:46
-->
<template>
  <div class="clxx">
    <!-- 材料预览 -->
    <div class="clyl-box">
      <div class="menu-tree">
        <div class="item">
          材料目录({{ tableData.length }})
          <div style="margin-top: 10px">
            <div
              style="
                  text-align: center;
                  line-height: 20px;
                  color: black;
                  font-size: 14px;
                "
              v-if="tableData.length == 0">
              暂无数据
            </div>
            <div
              v-for="(item, index) in tableData"
              :key="item.bsmSj"
              :class="['child', treeCheckId == item.bsmSj ? 'checked' : '']"
              @click="treeClick(item, index)">
              <span v-if="item.isrequired == 1" class="required">必选</span>
              {{ item.sjmc }}
              <span class="cl_number" :key="key">({{ item.ys ? item.ys : 0 }})</span>
            </div>
          </div>
        </div>
      </div>
      <image-preview
        ref="imageRef"
        v-if="tableData.length > 0"
        :previewImg="previewImg"
        @nextPriview="nextPriview"
        @prevPriview="prevPriview" />
    </div>
  </div>
</template>
<script>
  import store from '@/store/index.js'
  import imagePreview from "./dialog/imagePreview.vue";
  import { repairInitClml, getClmxList } from "@/api/clxx.js";
  export default {
    components: { imagePreview },
    props: {
      formData: {
        type: Object,
        default: () => {
          return {}
        }
      }
    },
    data () {
      return {
        iclass: "",
        // 材料目录选中
        treeCheckIndex: 0,
        treeCheckId: "",
        key: 0,
        tableData: [],
        previewImg: {
          bsmSj: "",
          index: 0,
          selectedIndex: 0,
          imgList: []
        }
      }
    },
    computed: {
      workFresh () {
        return store.state.user.workFresh
      }
    },
    watch: {
      workFresh: {
        handler (newValue, oldValue) {
          if (newValue) this.clmlInitList()
        },
        deep: true,
        immediate: true
      }
    },
    created () {
      this.clmlInitList()
    },
    methods: {
      /**
       * @description: 自动预览
       * @author: renchao
       */
      nextPriview () {
        if (this.treeCheckIndex < this.tableData.length) {
          this.treeCheckIndex++;
          if (this.tableData[this.treeCheckIndex]) {
            this.treeCheckId = this.tableData[this.treeCheckIndex].bsmSj;
            // 判断页数
            let ys = this.tableData[this.treeCheckIndex].ys
            this.previewImg.index = 0;
            // 获取材料明细
            if (ys > 0) {
              getClmxList(this.treeCheckId).then(res => {
                this.previewImg.imgList = res.result ? res.result : []
              })
            } else {
              this.previewImg.imgList = []
            }
            this.previewImg.bsmSj = this.tableData[this.treeCheckIndex].bsmSj;
          } else {
            this.$message.error('没有最后一张了');
          }
        }
      },
      /**
       * @description: prevPriview
       * @author: renchao
       */
      prevPriview () {
        if (this.treeCheckIndex >= 1) {
          this.treeCheckIndex--;
          this.treeCheckId = this.tableData[this.treeCheckIndex].bsmSj;
          // 判断页数
          let ys = this.tableData[this.treeCheckIndex].ys
          if (ys > 0) {
            getClmxList(this.treeCheckId).then(res => {
              this.previewImg.imgList = res.result ? res.result : []
              this.previewImg.index = this.previewImg.imgList.length - 1;
            })
          } else {
            this.previewImg.imgList = [];
            this.previewImg.index = 0
          }
          this.previewImg.bsmSj = this.tableData[this.treeCheckIndex].bsmSj;
        } else {
          this.$message.error('没有第一张了');
        }
      },
      /**
       * @description: 材料目录明细初始化
       * @param {*} type
       * @author: renchao
       */
      clmlInitList (type) {
        // 1:列表初始化  2:新增材料
        return new Promise((resolve) => {
          console.log(this.formData, 'this.formData');
          repairInitClml(this.formData).then((res) => {
            if (res.code == 200) {
              resolve(res.code);
              if (res.result && res.result.length > 0) {
                this.tableData = res.result;
                if (type == 1) {
                  this.treeClick(this.tableData[0], 0);
                } else {
                  //新增材料后刷新列表焦点置于新增的对象上
                  this.treeClick(
                    this.tableData[this.tableData.length - 1],
                    this.tableData.length - 1
                  );
                }
              }
            } else {
              this.$message.error(res.message);
            }
          })
        })
      },
      /**
       * @description: setChecked
       * @param {*} item
       * @author: renchao
       */
      setChecked (item) {
        this.treeCheckId = item.bsmSj;
        this.title = item.sjmc;
        this.titleYs = 1;
        this.titleNum = item.children.length;
        this.previewImg.imgList = item.children;
        this.previewImg.bsmSj = item.bsmSj;
      },
      /**
       * @description: 材料目录点击选中
       * @param {*} item
       * @param {*} index
       * @author: renchao
       */
      treeClick (item, index) {
        this.previewImg.index = 0;
        this.treeCheckId = item?.bsmSj;
        this.treeCheckIndex = index;
        getClmxList(item.bsmSj).then(res => {
          this.previewImg.imgList = res.result ? res.result : []
        })
        this.previewImg.bsmSj = item?.bsmSj;
      },
      /**
       * @description: 小图片点击
       * @param {*} item
       * @param {*} index
       * @author: renchao
       */
      imgClick (item, index) {
        this.showImg = item;
        this.titleYs = index + 1;
      },
      //设置tableData
      setTableData (tableData) {
        this.$nextTick((res) => {
          this.tableData = tableData;
        })
      }
    }
  }
</script>
<style scoped lang="scss">
  @import "~@/styles/mixin.scss";
  .active {
    background: $light-blue !important;
    color: #fff;
  }

  .required {
    font-size: 12px;
    color: $pink;
    float: left;
  }

  .cl_number {
    float: right;
  }

  .clxx {
    width: 100%;
    height: 100%;
    min-height: 600px;
    .left {
      display: flex;
      flex-direction: column;
      justify-content: space-between;

      .item {
        width: 28px;
        height: 49%;
        @include flex-center;
        background-color: #e4e7ed;
        border-bottom-right-radius: 10px;
        padding: 5px;
        cursor: pointer;
        transition: all 0.3s;

        &:hover {
          @extend .active;
        }
      }
    }

    .clmlmx-box {
      margin: 0 auto;

      .title {
        text-align: center;
        height: 60px;
        line-height: 60px;
        border: 1px solid #dfe6ec;
        font-size: 20px;
        background: #81d3f81a;
        margin-bottom: -1px;
      }
    }

    .clyl-box {
      width: 100%;
      height: 100%;
      display: flex;
      position: absolute;

      .menu-tree {
        width: 20%;
        min-width: 160px;
        height: 100%;
        margin-right: 10px;
        border-right: 1px dotted #d9d9d9;
        padding: 0 15px;

        .item {
          line-height: 30px;
          padding-top: 5px;
          border-bottom: 1px solid #e8e8e8;
          font-size: 16px;
          text-align: center;
          color: $light-blue;

          .itemIcon {
            float: right;
            line-height: 60px;
            cursor: pointer;
          }

          .child {
            line-height: 32px;
            border-bottom: 1px solid #e8e8e8;
            padding-left: 10px;
            color: #6b6b6b;
            cursor: pointer;
            box-sizing: border-box;
            border-radius: 6px;
            line-height: 20px;
            transition: all 0.3s;
            padding: 8px 0;
            overflow: hidden;
          }

          .child:hover {
            color: $light-blue;
            transform: scale(1.1);
          }

          .checked {
            border: 1px solid $light-blue;
            color: $light-blue;
          }
        }
      }

      .clyl-img {
        width: 75%;
        height: 100%;
        background: #f3f4f7;
        margin: 0 auto;
        position: relative;
      }
    }
  }
</style>