{"remainingRequest":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\xq-web-fvue\\src\\components\\eipControl\\EipSubImportDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\src\\components\\eipControl\\EipSubImportDialog.vue","mtime":1667327529309},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\r\nimport req from \"@/request.js\";\r\nimport XLSX from \"xlsx/dist/xlsx.core.min.js\";\r\nimport SubPagination from \"@/components/eipControl/bus/SubPagination.js\";\r\nconst Base64 = require(\"js-base64\").Base64;\r\n\r\nexport default {\r\n  name: \"eip-sub-import-dialog\",\r\n  props: {\r\n    subDesc:{\r\n      type: String,\r\n      default: \"子表模板\",\r\n    },\r\n    dataSubname: {\r\n      type: String,\r\n      required: true,\r\n    },\r\n    maxRow: {\r\n      type: String,\r\n      default: null,\r\n    },\r\n    mergeExpression: {\r\n      type: String,\r\n      default: null,\r\n    },\r\n    dataColumns: {\r\n      type: String,\r\n      required: true,\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      dialogVisible: false,\r\n      importRows: null,\r\n      showRowData: false,\r\n      mergeFunc: null,\r\n      mode: \"append\",\r\n      modeOptions: [\r\n        { mode: \"append\", desc: \"追加导入\" },\r\n        { mode: \"override\", desc: \"覆盖导入\" },\r\n        { mode: \"merge\", desc: \"合并导入\", disabled: true },\r\n      ],\r\n    };\r\n  },\r\n  computed: {\r\n    columns: function () {\r\n      return eval(Base64.decode(this.dataColumns));\r\n    }\r\n  },\r\n  watch: {\r\n    dialogVisible: {\r\n      handler: function (newVal) {\r\n        // 清空附件\r\n        if (!newVal && this.$refs.selectFile) {\r\n          this.$refs.selectFile.value = \"\";\r\n          this.importRows = null;\r\n          this.showRowData = false;\r\n        }\r\n      },\r\n      immediate: true,\r\n    },\r\n    mergeExpression: {\r\n      handler: function (newVal) {\r\n        if (newVal) {\r\n          // 如果有导入合并的代码，则允许选择合并导入模式\r\n          this.$set(this.modeOptions[2], \"disabled\", false);\r\n          // 并设置默认为 合并导入\r\n          this.mode = \"merge\";\r\n          // 解码合并的代码\r\n          const funcExp = Base64.decode(newVal);\r\n          this.mergeFunc = eval(`(${funcExp})`);\r\n        }\r\n      },\r\n      immediate: true,\r\n    },\r\n  },\r\n  methods: {\r\n    //子表模板导出\r\n    exportFormSub(){\r\n      req.post(window.context.form+\"/form/form/v1/exportFormSub?subDesc=\"+this.subDesc, this.columns, \"arraybuffer\");\r\n    },\r\n    getNameByDesc(desc) {\r\n      var name = \"\";\r\n      this.columns.forEach(col => {\r\n        if (col.desc == desc) {\r\n          name = col.name;\r\n        }\r\n      });\r\n      return name;\r\n    },\r\n    changeRowKey(rows) {\r\n      var importRows = [];\r\n      rows.forEach(row => {\r\n        var importRow = {};\r\n        for (let key in row) {\r\n          importRow[this.getNameByDesc(key)] = row[key];\r\n        }\r\n        importRows.push(importRow);\r\n      });\r\n      return importRows;\r\n    },\r\n    dialogConfirm() {\r\n      if(this.importRows.length==0){\r\n        this.$message.error(\"请选择要导入的文件\");\r\n        return;\r\n      }\r\n      if(this.maxRow){\r\n        let maxRowInt = parseInt(this.maxRow);\r\n        if(this.mode==\"override\"){//覆盖导入\r\n          let count = this.importRows.length;\r\n          if(count>maxRowInt && maxRowInt!=0){\r\n            this.$message.error(\"子表数据已超过最大行数【\"+maxRowInt+\"】\");\r\n            return;\r\n          }\r\n        }else if(this.mode==\"append\" || this.mode==\"merge\"){//追加导入/合并导入\r\n          let boData = document.getElementsByName(\"online-form\")[0].__vue__.data; //获取表单bo对象\r\n          let pathArr = this.dataSubname.split('.')\r\n          let subTabName = pathArr[2].replace('sub_', '')\r\n          let subInitData = boData[pathArr[1]][pathArr[2]] || [];//子表数据\r\n          let num = this.importRows.length+subInitData.length;\r\n          if(num>maxRowInt && maxRowInt!=0){\r\n            this.$message.error(\"子表数据已超过最大行数【\"+maxRowInt+\"】\");\r\n            return;\r\n          }\r\n        }\r\n      }\r\n      SubPagination.importData(\r\n        this.dataSubname,\r\n        this.importRows,\r\n        this.mode,\r\n        this.mergeFunc\r\n      )\r\n        .then(() => {\r\n          this.dialogVisible = false;\r\n        })\r\n        .catch((err) => {\r\n          this.$message.error(`数据导入失败：${err}`);\r\n        });\r\n    },\r\n    fileChange(m) {\r\n      if (!m || !m.target || !m.target.files || m.target.files.length != 1) {\r\n        return;\r\n      }\r\n      this.importRows = [];\r\n      this.readWorkbookFromLocalFile(m.target.files[0], (rows) => {\r\n        this.importRows = this.changeRowKey(rows);\r\n      });\r\n    },\r\n    // 读取本地excel文件\r\n    readWorkbookFromLocalFile(file, callback) {\r\n      const reader = new FileReader();\r\n      reader.onload = (e) => {\r\n        const data = e.target.result;\r\n        let workbook = null;\r\n        try {\r\n          // 读取Excel内容\r\n          workbook = XLSX.read(data, { type: \"binary\" });\r\n        } catch (err) {\r\n          this.$message.error(\"所选文件不是有效的Excel文件.\");\r\n          return;\r\n        }\r\n        const sheetNames = workbook.SheetNames,\r\n          // 只读取第一个sheet的数据\r\n          worksheet = workbook.Sheets[sheetNames[0]];\r\n\r\n        if (worksheet[\"!merges\"] && worksheet[\"!merges\"].length > 0) {\r\n          const merge = worksheet[\"!merges\"][0],\r\n            rowNum = Number(merge[\"e\"][\"r\"]);\r\n          // 合并单元格时会导致转换出来的JSON数据格式错乱\r\n          this.$message.error(\r\n            `Excel中不能有合并的单元格，请检查第${rowNum + 1}行数据。`\r\n          );\r\n          return;\r\n        }\r\n        const json = XLSX.utils.sheet_to_json(worksheet);\r\n        if (!json || json.constructor != Array) {\r\n          this.$message.error(\"读取的数据格式错误。\");\r\n          return;\r\n        }\r\n        if (callback) callback(json);\r\n      };\r\n      reader.readAsBinaryString(file);\r\n    },\r\n  },\r\n};\r\n",null]}