Source/UBCS-WEB/src/components/Master/MasterTransfer.vue
@@ -1,48 +1,56 @@
<template>
<el-dialog :visible.sync="dialogPush" append-to-body  :close-on-click-modal="false"  @close="recoverPage" title="导出">
  <div style="margin-bottom: 10px">
    <el-radio-group v-model="radio">
      <el-radio :label="0">选择</el-radio>
      <el-radio :label="1">全部</el-radio>
      <el-radio :label="2">页码</el-radio>
    </el-radio-group>
  </div>
  <div style="text-align: center">
  <el-transfer
    style="text-align: left; display: inline-block;height: 400px"
    filterable
    :filter-method="filterMethod"
    filter-placeholder="关键词搜索"
    v-model="value"
    :titles="['未选属性', '已选属性']"
    :data="data">
  </el-transfer>
  </div>
  <div style="display: flex;justify-content: flex-end;">
    <el-button size="small" plain type="success" @click="handleExcel">确定</el-button>
    <el-button size="small" plain >取消</el-button>
  </div>
</el-dialog>
  <el-dialog :close-on-click-modal="false" :visible.sync="dialogPush" append-to-body style="width: 1550px; margin: auto"
             title="导出"
             @close="escHandler">
    <div style="margin-bottom: 20px;">
      <div>
        <span>导出方式:</span>
        <el-radio-group v-model="radio">
          <el-radio :label="0">选择</el-radio>
          <el-radio :label="1">全部</el-radio>
          <el-radio :label="2">页码</el-radio>
        </el-radio-group>
        <span v-if="radio === 2" style="margin-left: 20px;"><el-input v-model="pageExport" style="width: 150px"></el-input> (输入页码或者页面范围,如:1-10)</span>
      </div>
    </div>
    <div style="text-align: center">
      <el-transfer
        v-model="value"
        :data="data"
        :filter-method="filterMethod"
        :titles="['未选属性', '已选属性']"
        filter-placeholder="关键词搜索"
        filterable
        style="text-align: left; display: inline-block;height: 400px">
      </el-transfer>
    </div>
    <div style="display: flex;justify-content: flex-end;">
      <el-button plain size="small" type="success" @click="handleExcel">确定</el-button>
      <el-button plain size="small" @click="escHandler">取消</el-button>
    </div>
  </el-dialog>
</template>
<script>
import {exportCode} from '@/api/GetItem'
import {exportCode, FindData} from '@/api/GetItem'
import func from "@/util/func";
export default {
name: "MasterTransfer",
  props:['visible','tableHeadData','codeClassifyOid','tableData','selectRow'],
  data(){
  name: "MasterTransfer",
  props: ['visible', 'tableHeadData', 'codeClassifyOid', 'tableData', 'selectRow', 'templateOid', 'limit'],
  data() {
    return {
      pageExport: "",
      data: [],
      value: [],
      filterMethod(query, item) {
        return item.label.indexOf(query) > -1;
      },
      dialogPush:this.visible,
      radio:0,
      tableHeadFindData:[],
      tableExportData:[],
      option:{
      dialogPush: this.visible,
      radio: 0,
      tableHeadFindData: [],
      tableExportData: [],
      option: {
        title: '文档标题',
        column: [{
          label: '主数据',
@@ -50,109 +58,210 @@
          children: []
        }],
        data: []
      }
      },
      exportArr: {},
      exportArrTwo: {},
      ids: ""
    };
  },
  watch:{
  watch: {
    //监听初始化
    visible (){
    visible() {
      this.dialogPush = this.visible;
    },
    //表头数据 用来渲染穿梭框
    tableHeadData:{
      handler(newval,oldval){
        console.log(newval)
       if(newval){
         //excel表头数据转换
         this.tableHeadFindData=newval.map(obj => obj.label);
         this.tableHeadFindData.forEach((city, index) => {
           this.data.push({
             label: city,
             key: index,
           });
         });
         //excel表格数据转换
         this.option.column[0].children=newval.map(obj => {
           return {
             label: obj.label,
             prop: obj.prop
           }
         })
       }
    tableHeadData: {
      handler(newval, oldval) {
        if (newval) {
          // 清空data数组
          this.data = [];
          // excel表头数据转换
          this.tableHeadFindData = newval.map(obj => obj.label);
          this.tableHeadFindData.forEach((city, index) => {
            this.data.push({
              label: city,
              key: index,
            });
          });
          // excel表格数据转换
          this.option.column[0].children = newval.map(obj => {
            return {
              label: obj.label,
              prop: obj.prop
            }
          })
        }
      }
},
    tableData(){
    },
    tableData() {
      // 将值里面的true或false改变为是或否
      this.option.data = this.tableData.map(obj => {
          for (let prop in obj) {
            if (obj[prop] === "true") {
              obj[prop] = "是";
            } else if (obj[prop] === "false") {
              obj[prop] = "否";
            }
        for (let prop in obj) {
          if (obj[prop] === "true") {
            obj[prop] = "是";
          } else if (obj[prop] === "false") {
            obj[prop] = "否";
          }
        }
        return obj;
      });
    },
    codeClassifyOid:{
      handler(newval,oldval){
    codeClassifyOid: {
      handler(newval, oldval) {
      }
    },
    value: {
      handler(newval, oldval) {
        //console.log('value', newval)
      }
    }
  },
  computed:{
  },
  computed: {},
  mounted() {
  },
  methods:{
  methods: {
    escHandler() {
      this.$emit('update:visible', false);
      this.value = [];
      this.radio = 0
    },
    //关闭页面
    recoverPage(){
    recoverPage() {
      this.$emit('update:visible', false);
    },
    handleExcel(){
      // this.$Export.excel({
      //   title: this.option.title,
      //   columns: this.option.column,
      //   data: this.option.data
      // });
      if(this.radio === 0){
        if(this.selectRow.length<=0){
    handleExcel() {
      this.value.map(index => this.tableHeadData[index].prop).forEach((item, index) => {
        this.exportArr[`attrIdIndexMap[${index}]`] = item
      })
      if (this.radio === 0) {
        if (this.selectRow.length <= 0) {
          this.$message.warning('请选择要导出的模板')
        }else {
        } else {
          //已选择多选
          const selectList=[]
          const selectList = []
          //已选择属性
          let exportArr={}
          const ids = this.selectRow.map(item => item.oid).join(',')
          this.selectRow.forEach(item=>{
          let exportArr = {}
          this.ids = this.selectRow.map(item => item.oid).join(',')
          this.selectRow.forEach(item => {
            selectList.push(
             item.oid
              item.oid
            )
          })
          this.value.map(index => this.tableHeadData[index].prop).forEach((item, index) => {
            exportArr[`attrIdIndexMap[${index}]`] = item
          })
          exportCode({codeClassifyOid:this.codeClassifyOid,'conditionMap[oid]':ids,...exportArr}).then(res=>{
            // console.log('res',res)
            if(res){
              const fileNames = res.headers['content-disposition'].split(";");
              let characterSet = fileNames[2].split("filename*=")[1];
              let fileName = decodeURI(fileNames[1].split("filename=")[1],characterSet);  // 下载的文件名
              let blob = new Blob([res.data], {
                type: res.data.type + ";charset=utf-8",
          if (this.value <= 0) {
            this.tableHeadData.map(item => item.prop)
              .forEach((prop, index) => {
                this.exportArrTwo[`attrIdIndexMap[${index}]`] = prop;
              });
              func.downloadFileByBlob(blob,fileName);
              window.URL.revokeObjectURL(src); //释放掉blob对象
            exportCode({
              codeClassifyOid: this.codeClassifyOid,
              'conditionMap[oid]': this.ids, ...this.exportArrTwo,
              limit: -1
            }).then(res => {
              // console.log('res',res)
              if (res) {
                func.downloadFileByBlobHandler(res);
                this.escHandler()
              }
            })
          } else {
            exportCode({
              codeClassifyOid: this.codeClassifyOid,
              'conditionMap[oid]': this.ids, ...this.exportArr
            }).then(res => {
              // console.log('res',res)
              if (res) {
                func.downloadFileByBlobHandler(res);
                this.escHandler()
              }
            })
          }
        }
      } else if (this.radio === 1) {
        if (this.value <= 0) {
          this.tableHeadData.map(item => item.prop)
            .forEach((prop, index) => {
              this.exportArrTwo[`attrIdIndexMap[${index}]`] = prop;
            });
          exportCode({codeClassifyOid: this.codeClassifyOid, ...this.exportArrTwo, limit: -1}).then(res => {
            // console.log('res',res)
            if (res) {
              func.downloadFileByBlobHandler(res);
              this.escHandler()
            }
          })
        } else {
          exportCode({codeClassifyOid: this.codeClassifyOid, ...this.exportArr, limit: -1}).then(res => {
            // console.log('res',res)
            if (res) {
              func.downloadFileByBlobHandler(res);
              this.escHandler()
            }
          })
        }
      };
      } else if (this.radio === 2) {
        const input = this.pageExport.trim();
        let start, end;
        if (input.includes('-')) {
          if (input.indexOf('-') !== input.lastIndexOf('-')) {
            this.$message.warning('输入格式错误:只能输入一个 - 号隔开');
            return;
          }
          //包含-解析
          const range = input.split('-');
          start = Number(range[0]);
          end = Number(range[1]);
          if (isNaN(start) || isNaN(end)) {
            this.$message.warning('输入格式错误');
            return;
          }
        } else {
          //不包含-解析
          start = Number(input);
          end = start;
          if (isNaN(start)) {
            this.$message.warning('输入格式错误');
            return;
          }
        }
        if (this.value >= 1) {
          exportCode({
            codeClassifyOid: this.codeClassifyOid, ...this.exportArr,
            limit: this.limit,
            page: start,
            endPage: end
          }).then((res) => {
            // console.log('res',res)
            if (res) {
              func.downloadFileByBlobHandler(res);
              this.escHandler()
            }
          });
        } else {
          this.tableHeadData.map(item => item.prop)
            .forEach((prop, index) => {
              this.exportArrTwo[`attrIdIndexMap[${index}]`] = prop;
            });
          exportCode({
            codeClassifyOid: this.codeClassifyOid, ...this.exportArrTwo,
            limit: this.limit,
            page: start,
            endPage: end
          }).then(res => {
            // console.log('res',res)
            if (res) {
              func.downloadFileByBlobHandler(res);
              this.escHandler()
            }
          })
        }
      }
    },
  }
}
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
</style>