{"remainingRequest":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\bizComponents\\eipControl\\EipHotTable.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\bizComponents\\eipControl\\EipHotTable.vue","mtime":1675071991460},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["//\n//\n//\n//\n//\n//\n\r\nimport utils from \"@/components/bizComponents/utils.js\";\r\nimport FormMath from \"@/components/bizComponents/math.js\";\r\nimport { HotTable } from \"@handsontable/vue\";\r\nimport SubDataDetail from \"@/components/bizComponents/flow/SubDataDetail.vue\";\r\nimport \"handsontable/dist/handsontable.full.css\";\r\nimport Handsontable from \"handsontable\";\r\nimport \"handsontable/languages/zh-CN\";\r\nexport default {\r\n  name: \"eip-hot-table\",\r\n  props: {\r\n    options:String,\r\n    initconf: String,\r\n    permission: Object,\r\n    isInitTemplateData: String,\r\n    initFillDataType: String,\r\n    addInitTemplateData: String,//允许添加初始化数据\r\n    initSumRow: String,//初始化统计行\r\n    name:String,\r\n  },\r\n  components: {HotTable,SubDataDetail},\r\n  data() {\r\n    return {\r\n      root:'hot-table',\r\n      myRenderer:this.rendererMe,\r\n      subTablePath:'',\r\n      formFields: [],\r\n      formId: '',\r\n      hotSettings: {\r\n        data: [        //数据可以是二维数组，也可以是数组对象\r\n          []\r\n        ],\r\n        className: \"htCenter htMiddle\", //单元格文字对齐方式(htLeft,htRight,htCenter)\r\n        currentRowClassName: \"my-selectRow\", //给选中行添加自定义class类名\r\n        currentColClassName: \"my-selectCol\", //给选中列添加自定义class类名\r\n        autoWrapRow: true, //文字是否自动换行(当没有设置colWidths时生效)\r\n        fixedColumnsLeft: 1,//固定左边列数\r\n        fixedRowsTop: 0,//固定上边列数\r\n        // fillHandle: true, //是否开启拖拽复制操作(true,false,'horizontal'水平复制,'vertical'垂直复制)\r\n        autoRowSize: false,\r\n        autoColumnSize: true,\r\n        // highlightedRows:[],\r\n        // readOnly:true,\r\n        // comments: true,\r\n        width: \"100%\",\r\n        height:\"80vh\",\r\n        stretchH:'all',\r\n        language: \"zh-CN\",\r\n        colHeaders: true, //['A', 'B', 'C'], //是否展示列表头,默认是A,B,C等字母,可以['列1','列2']进行自定义展示\r\n        rowHeaders: true, //是否展示行表头,默认是1,2,3等数据,可以['行1','行2']进行自定义展示\r\n        contextMenu:{\r\n          items:{\r\n          }\r\n        },\r\n        licenseKey: \"non-commercial-and-evaluation\",\r\n        mergeCells: true,\r\n        //contextMenu: true,\r\n        wordWrap: true,//自动换行\r\n        // mergeCells: true,\r\n        // manualColumnFreeze: true, //手动固定列  ?\r\n        // manualColumnMove: true, //手动移动列\r\n        // manualRowMove: true,   //手动移动行\r\n         manualColumnResize: true,//手工更改列距\r\n         manualRowResize: true,//手动更改行距\r\n        // comments: true, //添加注释  \r\n        // customBorders:[],//添加边框\r\n         columnSorting: false,\r\n        // stretchH: 'all',//根据宽度横向扩展，last:只扩展最后一列，none：默认不扩展\r\n        // fillHandle: true, //选中拖拽复制 possible values: true, false, \"horizontal\", \"vertical\"\r\n        // fixedColumnsLeft: 1,//固定左边列数\r\n        // fixedRowsTop: 0,//固定上边列数\r\n        // beforeRemoveRow: this.beforeRemoveRowMe,\r\n        afterCreateRow: this.afterCreateRowMe,\r\n        afterChange: this.afterChangeMe,\r\n        afterSelectionEnd: this.afterSelectionEndMe,\r\n        renderer: this.rendererMe,\r\n        cells: this.cellsMe,\r\n        afterLoadData: this.afterLoadDataMe,\r\n        mergeCells: [   //合并\r\n            // {row: 1, col: 1, rowspan: 3, colspan: 3},  //指定合并，从（1,1）开始行3列3合并成一格\r\n            // {row: 3, col: 4, rowspan: 2, colspan: 2}\r\n        ],\r\n        columns: [],\r\n        hiddenColumns: {\r\n          copyPasteEnabled: true,\r\n          indicators: true,\r\n          columns: []\r\n        },\r\n        nestedHeaders: null,\r\n        // nestedHeaders: [\r\n        //   // [{label: 'A', colspan: 3}, {label: 'B', colspan: 3}],\r\n        //   ['A',{label: 'C', colspan: 2}, {label: 'F', colspan: 2}],\r\n        //   ['A',{label: 'C', colspan: 2}, 'D', 'E'],\r\n        //   ['会议室名称', '会议室地址', '备注', '楼层', '日期']\r\n        // ],\r\n        //启用公式库\r\n        formulas: false,//暂时还不知道怎么数据怎么与配置结合，先不启用\r\n        /** \r\n        支持的公式：\r\n        任何数字，负数和正数，如浮点数或整数;\r\n        算术运算，如：+，-，/，*，%，^，\r\n        逻辑操作如：AND()，OR()，NOT()，XOR()，\r\n        比较操作，如：=，>，>=，<，<=，<>;\r\n        所有的JavaScript数学常量，如：PI()，E()，LN10()，LN2()，LOG10E()，LOG2E()，SQRT1_2()，SQRT2()，\r\n        错误处理：#DIV/0!，#ERROR!，#VALUE!，#REF!，#NAME?，#N/A，#NUM!，\r\n        字符串操作如:( &连接eq。=-(2&5)将返回-25）;\r\n        公式中定义的所有excel 公式 ;\r\n        相对和绝对单元格引用，如：A1，$A1，A$1，$A$1，\r\n        内建变量，如：TRUE，FALSE，NULL，\r\n        自定义变量;\r\n        嵌套函数;\r\n        动态更新。\r\n        **/\r\n      },\r\n      mathExpMap:{},\r\n      rowMathExpMap:{},\r\n      mathExpItemMap:{},\r\n      initCustDialogConf: {},\r\n      customDialog: {},\r\n      fillOrg: {},\r\n      readOnlyColumnMap: {},\r\n      cellStyleMap: {},//列样式\r\n      mathRowCellMap: {},//计算单元格\r\n      allMathExpList: {},//所有与计算相关的列\r\n      crossMappings:{},//跨表取数设置\r\n      crossMappingSubTables:[],//被取数的子表\r\n      mainFieldMathMap: {},//涉及主表计算公式\r\n      initRowData:{},\r\n      allRowMathMap: {},//跨行运算公式\r\n      firstSumMap:{},//首行汇总\r\n      instId:'',//流程实例ID\r\n      defId:'',//流程定义ID\r\n      initDataBack:[],//初始化数据备份\r\n      initSumRowField:'',//统计行标签字段\r\n      initSumRowValue:'',//统计行标签字段值\r\n      crossMappingFields:{},//跨表取数单元格\r\n      mergeCellField:'',//合并单元格列\r\n      readOnlyRowsMap: {},//单元格只读设置\r\n      cellCalcs: [],//单元格计算公式\r\n      requiredRowsMap:{},//必填设置，提交时校验\r\n      fieldNameMap:{},\r\n    };\r\n  },\r\n  computed: {\r\n    hotInstance: function() {\r\n      return this.$refs.hottable.hotInstance;\r\n    }\r\n  },\r\n  mounted() {\r\n    const formInst = utils.getOnlineFormInstance(this);\r\n    if(formInst && formInst.$parent){\r\n      let columnSort = true;\r\n      if(formInst.$parent.instId){\r\n        this.instId = formInst.$parent.instId;\r\n        columnSort = false;\r\n      }\r\n      if(formInst.$parent.defId){\r\n        this.defId = formInst.$parent.defId;\r\n        columnSort = false;\r\n      }\r\n      //流程中不允许排序，在基础数据维护中允许排序\r\n      this.hotSettings.columnSorting = columnSort;\r\n    }\r\n    if(this.options){\r\n      let optionsJon = JSON.parse(this.options);\r\n      this.subTablePath = optionsJon.subTablePath;\r\n      let relations = optionsJon.colHeadersRelations;\r\n      let isMathExp = false;//是否包含计算公式\r\n      let _this = this;\r\n      if(optionsJon.initSumRowField){\r\n        this.initSumRowField = optionsJon.initSumRowField;\r\n      }\r\n      if(optionsJon.initSumRowValue){\r\n        this.initSumRowValue = optionsJon.initSumRowValue;\r\n      }\r\n      //设置控件高度\r\n      if(optionsJon.height){\r\n        this.hotSettings.height = optionsJon.height + 'vh';\r\n      }\r\n      //收集单元格计算公式\r\n      if(optionsJon.cellCalcs && optionsJon.cellCalcs.length>0){\r\n        this.cellCalcs = [...optionsJon.cellCalcs];\r\n        //计算单元格只读\r\n        this.cellCalcs.forEach(cellCalc =>{\r\n          const fieldName = cellCalc.cellField.split('.')[2];\r\n          _this.readOnlyRowsMap[fieldName+'_'+(cellCalc.rowIndex-1)] = true;\r\n        })\r\n      }\r\n      //收集表头、列合并单元格、计算公式、字段权限等\r\n      if(relations && relations.length>0){\r\n          let hotFieldPermission = this.permission?this.permission['fields'][optionsJon.boSubEntity]:[];\r\n          let headers = [];\r\n          let columns = [];\r\n          let dataList = [[]];\r\n          for (let index = 0; index < relations.length; index++) {\r\n            let relation = relations[index];\r\n            this.fieldNameMap[relation.name] = relation.desc;\r\n            headers.push(relation.desc);\r\n            _this.initRowData[relation.name] = '';\r\n            let column = relation.column;\r\n            column.className = 'htLeft';\r\n            if(column.type == 'dropdown' && Array.isArray(column.source) && column.source.length>0){\r\n              let sourceArray = [];\r\n              column.source.forEach(item => {\r\n                if(item.value!=''&&item.value!='undefined'){\r\n                  sourceArray.push(item.value);\r\n                }\r\n              });\r\n              column.source = sourceArray;\r\n            }\r\n            //收集计算公式\r\n            if(column.mathExp){\r\n              this.initMathMap(column);\r\n              isMathExp = true;\r\n            }\r\n            if(column.rowMathExp && Array.isArray(column.rowMathExp) && column.rowMathExp.length>0){\r\n              this.initRowMathMap(column);\r\n              isMathExp = true;\r\n            }\r\n            //收集合并列\r\n            if(column.mergeCell===true){\r\n              const cellField = {field:column.data,index:index};\r\n              if(!this.mergeCellField){\r\n                this.mergeCellField = {...cellField};\r\n              }else{\r\n                this.addCellFieldChildren(this.mergeCellField,cellField);\r\n              }\r\n            }\r\n            //应用流程表单权限\r\n            if(hotFieldPermission[column.data]=='r'){\r\n              column.readOnly = true;\r\n            }else if(hotFieldPermission[column.data]=='n'){\r\n              this.hotSettings.hiddenColumns.columns.push(index);\r\n            }else if(hotFieldPermission[column.data]=='b'){\r\n              column.required = true;\r\n              this.requiredRowsMap[column.data] = true;\r\n            }\r\n\r\n            //收集只读\r\n            if(column.readOnly){\r\n              this.readOnlyColumnMap[index] = {field:column.data,desc:relation.desc};\r\n            }else if(column.readOnlyRows){//单元格只读\r\n              const readOnlyRows = column.readOnlyRows.split(',');\r\n              readOnlyRows.forEach(rowIndex =>{\r\n                _this.readOnlyRowsMap[column.data+'_'+(rowIndex-1)] = true;\r\n              })\r\n            }\r\n\r\n            //收集必填\r\n            if(column.required){\r\n              this.requiredRowsMap[column.data] = {all:true};\r\n            }else if(column.requiredRows){//单元格必填\r\n              const requiredRows = column.requiredRows.split(',');\r\n              _this.requiredRowsMap[column.data] = {all:false,rows:requiredRows};\r\n            }\r\n\r\n            //收集列样式\r\n            this.handCellStyle(column);\r\n\r\n            //收集首行汇总\r\n            if(relation.isSum==true){\r\n              this.firstSumMap[relation.name] = true;\r\n            }\r\n\r\n            columns.push(column);\r\n          }\r\n          //收集跨表取数设置\r\n          let crossMapping = optionsJon.crossMapping;\r\n          if(crossMapping  && Array.isArray(crossMapping) && crossMapping.length>0){\r\n            let subTableMap = {};\r\n            crossMapping.forEach(crossMap =>{\r\n              const cfromFields = crossMap.fromFields;\r\n              if(crossMap.toField && cfromFields && Array.isArray(cfromFields) && cfromFields.length>0){\r\n                //收集跨表取数字段及位置（设置只读）\r\n                const crossField = crossMap.toField.split('.')[2];\r\n                if(!_this.crossMappingFields[crossField]){\r\n                  _this.crossMappingFields[crossField] = {};\r\n                }\r\n                _this.crossMappingFields[crossField][crossMap.toIndex-1] = true;\r\n                let subTableName = '';\r\n                for (let k = 0; k < cfromFields.length; k++) {\r\n                  const mfromFields = cfromFields[k].fromField.split('.');\r\n                  const subPath = mfromFields[0]+'.'+mfromFields[1];\r\n                  if(!_this.crossMappings[mfromFields[1]]){\r\n                    _this.crossMappings[mfromFields[1]] = [];\r\n                  }\r\n                  if(!subTableMap[subPath]){\r\n                    _this.crossMappingSubTables.push(subPath);\r\n                    subTableMap[subPath] = true;\r\n                  }\r\n                  subTableName = mfromFields[1];\r\n                }\r\n                _this.crossMappings[subTableName].push(crossMap);\r\n              }\r\n            });\r\n          }\r\n          //收集主表计算设置\r\n          this.initMainMathMap(optionsJon.mainTableCalcs);\r\n\r\n          //收集所有计算公式相关单元格信息\r\n          this.initAllMathField();\r\n          //初始化嵌套表头\r\n          this.initNestedHeaders(optionsJon,relations);\r\n          this.hotSettings.colHeaders = headers;\r\n          this.hotSettings.columns = columns;\r\n          this.hotSettings.data = dataList;\r\n          this.hotSettings.mergeCells = this.buildMergeCell(dataList);\r\n      }\r\n      //处理新增和删除权限\r\n      this.handlerMenu(optionsJon, isMathExp);\r\n      //获取子表字段属性\r\n      // this.initFormFields();\r\n    }\r\n    if(this.initconf){\r\n      const initConfJson = JSON.parse(this.initconf);\r\n      if(initConfJson){\r\n          this.initCustDialogConf = initConfJson;\r\n          if((initConfJson.orgConfig && (initConfJson.orgConfig.id || \r\n            initConfJson.orgConfig.name || initConfJson.orgConfig.code || initConfJson.orgConfig.instId))){\r\n            //初始化部门填制单位\r\n            this.initFillOrg();\r\n          }\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    addCellFieldChildren(field,children){\r\n      if(field.children){\r\n        return this.addCellFieldChildren(field.children,children)\r\n      }else{\r\n        field.children = children;\r\n      }\r\n    },\r\n    initFillOrg(){\r\n      let custDialog = this.initCustDialogConf;\r\n      const currentUser = JSON.parse(sessionStorage.getItem(\"currentUser\"));\r\n      if(custDialog && custDialog.orgConfig && (custDialog.orgConfig.id ||custDialog.orgConfig.name || custDialog.orgConfig.code || custDialog.orgConfig.instId) \r\n      && !this.fillOrg.id){\r\n        if(!localStorage.getItem(\"curFillOrg_\"+currentUser.account)){\r\n          let _this = this;\r\n          _this.$http.get('${uc}/api/org/v1/org/getFillOrg').then(resp => {\r\n              const rep = resp.data;\r\n              if(rep.state){\r\n                _this.fillOrg = rep.value;\r\n                localStorage.setItem(\"curFillOrg_\"+currentUser.account,JSON.stringify(rep.value));\r\n              }else{\r\n                _this.$message({\r\n                  message: rep.message,\r\n                  type: \"warning\"\r\n                });\r\n              }\r\n          }, error => {\r\n              _this.closeLoading(loading);\r\n              _this.$message({\r\n                message: \"获取当前用户填制单位失败！\",\r\n                type: \"warning\"\r\n              });\r\n          })\r\n        }else{\r\n          this.fillOrg = JSON.parse(localStorage.getItem(\"curFillOrg_\"+currentUser.account));\r\n        }\r\n      }\r\n\r\n    },\r\n    initMathMap(column){//收集行内计算公式\r\n      if(column.mathExp){\r\n        //收集计算单元格\r\n        this.mathRowCellMap[column.data] = {};\r\n        this.mathRowCellMap[column.data][-1] = true;\r\n\r\n        this.mathExpMap[column.data] = column.mathExp;\r\n        this.mathExpItemMap[column.data] = {};\r\n        this.mathExpItemMap[column.data][column.data] = column.mathExp;\r\n        const fields = this.parseFuncexpField(column.mathExp);\r\n        if(fields){\r\n          let _this = this;\r\n          fields.forEach(field =>{\r\n            const fieldArray = field.split('.');\r\n            const na = fieldArray[1];\r\n            const sa = fieldArray[3];\r\n            if(!_this.mathExpItemMap[na]){\r\n              _this.mathExpItemMap[na] = {};\r\n            }\r\n            _this.mathExpItemMap[na][column.data] = column.mathExp;\r\n            if(!_this.mathExpItemMap[sa]){\r\n              _this.mathExpItemMap[sa] = {};\r\n            }\r\n            _this.mathExpItemMap[sa][column.data] = column.mathExp;\r\n          })\r\n        }\r\n      }\r\n    },\r\n    initRowMathMap(column){//收集跨行计算公式\r\n      if(column.rowMathExp){\r\n        const rowMathExp = column.rowMathExp;\r\n        this.allRowMathMap[column.data] = rowMathExp;\r\n        if(!this.mathRowCellMap[column.data]){\r\n          this.mathRowCellMap[column.data] = {};\r\n        }\r\n        let _this = this;\r\n        rowMathExp.forEach(item =>{\r\n           //收集计算单元格\r\n          _this.mathRowCellMap[column.data][item.sn-1] = true;\r\n          var statFun = item.mathExp;\r\n          var myregexp = /\\[(.*?)\\]/g;\r\n          var match = myregexp.exec(statFun);\r\n          var arrs = [];\r\n          while (match != null) {\r\n              var idx = match[1];\r\n              const idexVal = idx.indexOf(':')==-1?_this.toNumber(idx):idx;\r\n              var has = false;\r\n              for (var i = 0, v; v = arrs[i++];) {\r\n                  if (v == idexVal) has = true;\r\n              }\r\n              if (!has){\r\n                arrs.push(idexVal);\r\n                if(!_this.rowMathExpMap[column.data]){\r\n                  _this.rowMathExpMap[column.data] = {};\r\n                  _this.rowMathExpMap[column.data][idexVal] = [];\r\n                }\r\n                if(!_this.rowMathExpMap[column.data][idexVal]){\r\n                  _this.rowMathExpMap[column.data][idexVal] = [];\r\n                }\r\n                _this.rowMathExpMap[column.data][idexVal].push(item);\r\n              } \r\n              match = myregexp.exec(statFun);\r\n          }\r\n        });\r\n      }\r\n    },\r\n    initMainMathMap(mainTableCalcs){//收集主表计算公式\r\n      if(mainTableCalcs  && Array.isArray(mainTableCalcs) && mainTableCalcs.length>0){\r\n        let mainFieldMathMap = {};\r\n        mainTableCalcs.forEach(calc =>{\r\n          if(calc.sumField && calc.mainField){\r\n            const sumFieldPath = calc.sumField.split(\".\");\r\n            mainFieldMathMap[sumFieldPath[2]] = calc;\r\n          }\r\n        });\r\n        this.mainFieldMathMap = mainFieldMathMap;\r\n      }\r\n    },\r\n    initAllMathField(){\r\n      let _this = this;\r\n      let rowMathMap = _this.rowMathExpMap;\r\n      let mathMap = _this.mathExpMap;\r\n      let mathExpItemMap = _this.mathExpItemMap;\r\n      let rowExecArray = [];\r\n      if(rowMathMap){\r\n        for (const key in rowMathMap) {\r\n          if (rowMathMap.hasOwnProperty(key)) {\r\n            let rowMath = rowMathMap[key];\r\n            let rowItem = {name:key,isAll:false,index:[]};\r\n            for (const idx in rowMath) {\r\n              if (rowMath.hasOwnProperty(idx)) {\r\n                if(idx.indexOf(':')!=-1){\r\n                  const fArray = idx.split(\":\");\r\n                  if(fArray.length==2){\r\n                    const a = _this.toNumber(fArray[0]);\r\n                    const b = _this.toNumber(fArray[1]);\r\n                    for (let i = a; i <= b; i++) {\r\n                      rowItem.index.push(i);\r\n                    }\r\n                  }\r\n                }else{\r\n                  rowItem.index.push(_this.toNumber(_this.toNumber(idx)));\r\n                }\r\n              }\r\n            }\r\n            rowExecArray.push(rowItem);\r\n          }\r\n        }\r\n      }\r\n      if(mathMap){\r\n        for (const ma in mathMap) {\r\n          if (mathMap.hasOwnProperty(ma)){\r\n            rowExecArray.push({name:ma,isAll:true});\r\n          }\r\n        }\r\n      }\r\n      if(rowExecArray && rowExecArray.length>0){\r\n        _this.allMathExpList = rowExecArray;\r\n      }\r\n    },\r\n    //初始化嵌套表头\r\n    initNestedHeaders(options,headers){\r\n      let _this = this;\r\n      let getRowLable = function(cell){\r\n         const start = cell.startField;\r\n         const end = cell.endField;\r\n         let colspan = 0;\r\n         let isEnd = false;\r\n         for (let i = 0; i < headers.length; i++) {\r\n           if(!isEnd){\r\n             if(start==headers[i].name){\r\n                colspan++;\r\n              }else if(end==headers[i].name){\r\n                colspan++;\r\n                isEnd = true;\r\n              }else if(colspan>0){\r\n                colspan++;\r\n              }\r\n           }\r\n         }\r\n         return {label: cell.name, colspan: colspan};\r\n      }\r\n      let getIsInNested = function(name,itemHeaders){\r\n        let rowLable = null;\r\n        itemHeaders.forEach(cell =>{\r\n          if(!rowLable && name == cell.startField){\r\n            rowLable = getRowLable(cell);\r\n          }\r\n        })\r\n        return rowLable;\r\n      }\r\n      if(options && typeof(options.nestedHeaders)!='undefined' && options.nestedHeaders){\r\n        let myNestedHeaders = [];\r\n        options.nestedHeaders.forEach(row =>{\r\n          let nestedHeader = [];\r\n          for (let i = 0; i < headers.length; i++) {\r\n            let rowLable = getIsInNested(headers[i].name,row.headers);\r\n            if(!rowLable){\r\n              nestedHeader.push(headers[i].desc);\r\n            }else{\r\n              nestedHeader.push(rowLable);\r\n              i = i + rowLable.colspan -1;\r\n            }\r\n          }\r\n          if(JSON.stringify(nestedHeader)!==JSON.stringify(headers)){\r\n            myNestedHeaders.push(nestedHeader);\r\n          }\r\n        })\r\n        if(myNestedHeaders.length>0){\r\n          let headerArray = [];\r\n          headers.forEach(myHeader =>{\r\n            headerArray.push(myHeader.desc);\r\n          })\r\n          myNestedHeaders.push(headerArray);\r\n          this.hotSettings.nestedHeaders = myNestedHeaders;\r\n        }\r\n      }\r\n    },\r\n    initFormFields(){\r\n      const formInst = utils.getOnlineFormInstance(this);\r\n      this.formId = formInst.$refs[\"onlineForm\"].$parent.$parent.formId;\r\n      if(this.formId && typeof(this.formId)!='undefined'){\r\n          const paths = this.subTablePath.split('.');\r\n          const entName = paths[1].split('sub_')[1];\r\n          let _this = this;\r\n          this.$http.get('${form}/form/form/v1/getFormFields?formId='+this.formId+'&entName='+entName).then(resp => {\r\n              if(resp.data){\r\n                _this.formFields = resp.data;\r\n              }\r\n          }, error => {})\r\n      }\r\n    },\r\n    handlerMenu(optionsJon,isMathExp){\r\n      if(this.permission && this.permission['table']){\r\n        const tabPermission = this.permission['table'][optionsJon.boSubEntity];\r\n        let __this = this;\r\n        // this.hotSettings.contextMenu.items[\"row_detail\"] = {name:'明细',callback:function(){\r\n        //       let cell = this.getSelected()[0];\r\n        //       const index = cell[0];\r\n        //       const curData = __this.getHotTableData();\r\n        //       __this.$refs['subDataDetail'].handleOpen(curData[index],__this.formFields);\r\n        //     },\r\n        // };\r\n        if(tabPermission && tabPermission.add == true){\r\n          this.hotSettings.contextMenu.items[\"row_above\"] = {name:'上方插入一行'};\r\n          this.hotSettings.contextMenu.items[\"row_below\"] = {name:'下方插入一行'};\r\n          this.hotSettings.contextMenu.items[\"row_up\"] = {name:'上移',callback:function(){\r\n              let cell = this.getSelected()[0];\r\n              const index = cell[0];\r\n              if (index === 0) {\r\n                  __this.$message({\r\n                    message: \"已经是列表中第一位\",\r\n                    type: \"warning\"\r\n                  });\r\n                } else {\r\n                  let dataList = __this.hotSettings.data;\r\n                  const t = dataList[index - 1];\r\n                  dataList[index - 1] = dataList[index];\r\n                  dataList[index] = t;\r\n                  __this.hotSettings.data = [];\r\n                  __this.hotSettings.data = dataList;\r\n                }\r\n            },\r\n          };\r\n          this.hotSettings.contextMenu.items[\"row_down\"] = {name:'下移',callback:function(){\r\n              let cell = this.getSelected()[0];\r\n              const index = cell[0];\r\n              let dataList = __this.hotSettings.data;\r\n              if (index === dataList.length - 1) {\r\n                  __this.$message({\r\n                    message: \"已经是列表中最后一位\",\r\n                    type: \"warning\"\r\n                  });\r\n                } else {\r\n                  var t = dataList[index + 1];\r\n                  dataList[index + 1] = dataList[index];\r\n                  dataList[index] = t;\r\n                  __this.hotSettings.data = [];\r\n                  __this.hotSettings.data = dataList;\r\n                }\r\n            },\r\n        };\r\n        if(tabPermission && tabPermission.del == true){\r\n            this.hotSettings.contextMenu.items[\"remove_row\"] = {name:'删除行'};\r\n        }\r\n      }\r\n     }\r\n    },\r\n    handCellStyle(column){\r\n      if(column.style){\r\n        let cstyle = '';\r\n        if(column.style.diyStyle){\r\n          cstyle = column.style.diyStyle;\r\n        }else{\r\n          if(column.style.background){\r\n            cstyle = 'background-color:'+column.style.background+';';\r\n          }\r\n          if(column.style.bold){\r\n            cstyle = cstyle +'font-weight: bold;';\r\n          }\r\n          if(column.style.size){\r\n            cstyle = cstyle +'font-size:'+column.style.size+'px;';\r\n          }\r\n          if(column.style.color){\r\n            cstyle = cstyle +'color:'+column.style.color+';';\r\n          }\r\n        }\r\n        if(cstyle){\r\n          this.cellStyleMap[column.data] = cstyle;\r\n        }\r\n      }\r\n    },\r\n    cellsMe(row, col, prop){\r\n      let cellProperties = {renderer:this.rendererMe};\r\n      //计算公式单元格设置只读\r\n      if(this.mathRowCellMap[prop] && (this.mathRowCellMap[prop][-1]===true || this.mathRowCellMap[prop][row]===true)){\r\n        cellProperties['readOnly'] = true;\r\n      }else if(this.crossMappingFields[prop] && this.crossMappingFields[prop][row]===true){\r\n        cellProperties['readOnly'] = true;\r\n      }else if(this.firstSumMap[prop] && row==0){\r\n        cellProperties['readOnly'] = true;\r\n      }else if(this.readOnlyRowsMap[prop+'_'+row] === true){\r\n        cellProperties['readOnly'] = true;\r\n      }\r\n      return cellProperties;\r\n    },\r\n    afterLoadDataMe(){\r\n      // if(this.isInitTemplateData!=='true' && this.hotSettings.data && this.hotSettings.data.length==1 && \r\n      //   Array.isArray(this.hotSettings.data[0])){\r\n      //   this.hotSettings.data[0] = {...this.initRowData};\r\n      // }\r\n      //this.hotInstance.render();\r\n    },\r\n    rendererMe(instance, td, row, col, prop, value, cellProperties){\r\n      Handsontable.renderers.TextRenderer.apply(this, arguments);\r\n      \r\n      if (this.cellStyleMap[prop]) {\r\n          td.style = this.cellStyleMap[prop];\r\n      }\r\n      td.style.lineHeight = '22px';\r\n      if(this.mathRowCellMap[prop] && (this.mathRowCellMap[prop][-1]===true || this.mathRowCellMap[prop][row]===true)){\r\n        cellProperties['readOnly'] = true;\r\n        td.style.background = '#F5F7FA';\r\n      }else if(this.crossMappingFields[prop] && this.crossMappingFields[prop][row]===true){\r\n        cellProperties['readOnly'] = true;\r\n        td.style.background = '#F5F7FA';\r\n      }else if(this.firstSumMap[prop] && row==0){\r\n        cellProperties['readOnly'] = true;\r\n        td.style.background = '#F5F7FA';\r\n      }else if(this.readOnlyRowsMap[prop+'_'+row] === true){\r\n         cellProperties['readOnly'] = true;\r\n         td.style.background = '#F5F7FA';\r\n      }\r\n    },\r\n    buildMergeCell(dataList){\r\n      if(!dataList){\r\n        dataList = this.getHotTableData();\r\n      }\r\n      if(dataList && dataList.length == 1 && Object.keys(dataList[0]).length==0){\r\n        return ;\r\n      }\r\n      let mergeCells = [];\r\n      const mergef = {row:0, col:0, rowspan: dataList.length, colspan:1};\r\n      this.getChildrenMergeCell(mergeCells, dataList, mergef, this.mergeCellField);\r\n      this.mergeCells = mergeCells;\r\n      return mergeCells;\r\n    },\r\n    getChildrenMergeCell(mergeCells, dataList, merge, field){\r\n      let mfield = field;\r\n      let mergeMap = {};\r\n      let indexMap = {};\r\n      for (let i = merge.row; i < merge.row+merge.rowspan; i++) {\r\n          const item = dataList[i];\r\n          indexMap[mfield.field] = mfield.index;\r\n          if(!mergeMap[mfield.field]){\r\n            mergeMap[mfield.field] = {value:item[mfield.field],size:1,startRow:i};\r\n          }else{\r\n            let omfield = mergeMap[mfield.field];\r\n            if(omfield.value==null || omfield.value== 'null' || omfield.value =='undefined' || omfield.value==='' || omfield.value!=item[mfield.field]){\r\n              if(omfield.size>1){\r\n                const mergef = {row:omfield.startRow, col:mfield.index, rowspan:omfield.size, colspan:1};\r\n                mergeCells.push({...mergef});\r\n                if(mfield.children){\r\n                  this.getChildrenMergeCell(mergeCells, dataList, mergef, mfield.children);\r\n                }\r\n              }\r\n              delete mergeMap[mfield.field];\r\n              mergeMap[mfield.field] = {value:item[mfield.field],size:1,startRow:i};\r\n            }else{\r\n              omfield.size++;\r\n              mergeMap[mfield.field] = omfield;\r\n            }\r\n          }\r\n      }\r\n      for (const key in mergeMap) {\r\n        if (mergeMap.hasOwnProperty(key)) {\r\n          const merge = mergeMap[key];\r\n          if(merge.size>1){\r\n            const mergef = {row:merge.startRow, col:indexMap[key], rowspan:merge.size, colspan:1};\r\n            mergeCells.push({...mergef});\r\n            if(mfield.children){\r\n              this.getChildrenMergeCell(mergeCells, dataList, mergef, mfield.children);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    },\r\n    beforeRemoveRowMe: function (changes, source) { // 数据改变时触发此方法\r\n      \r\n    },\r\n    // 添加行\r\n    afterCreateRowMe: function (changes) {\r\n      this.hotSettings.data[changes] = {...this.initRowData};\r\n      if(Array.isArray(this.hotSettings.data[0])){\r\n        this.hotSettings.data[0] = {...this.initRowData};\r\n        this.hotSettings.data[0] = this.fillOrgDataField(this.hotSettings.data[0]);\r\n      }\r\n      this.hotSettings.data[changes] = this.fillOrgDataField(this.hotSettings.data[changes]);\r\n    },\r\n    // 新增行时，动态改变值\r\n    afterChangeMe: function (changes, source) {\r\n      if(source =='edit' || source == 'Autofill.fill'){\r\n          //执行计算公式\r\n          //this.execMathExpSingle(changes);\r\n          //this.execMathExpAll(changes);\r\n          this.execInCellMathExp(null,changes);\r\n      }else if(source == 'CopyPaste.paste' && changes && changes.length>0){\r\n        let hotData = this.getBackMergeData();\r\n        let isChange = false;\r\n        if(hotData){\r\n          changes.forEach(change =>{\r\n              let changeIndex = change[0]\r\n              let changeField = change[1];\r\n              let changeValue = change[3];\r\n              if(changeValue==='　'){\r\n                hotData[changeIndex][changeField] = '';\r\n                isChange = true;\r\n              }\r\n          });\r\n          if(isChange){\r\n            this.hotSettings.data = [];\r\n            this.hotSettings.data = hotData;\r\n          }\r\n          try {\r\n            this.execCrossMapping();//执行跨表取数\r\n            this.execCellMathExp(hotData);//执行计算公式 \r\n          } catch (error) {\r\n            console.log(error);\r\n          }\r\n        }\r\n      }\r\n    },\r\n    execMathExpAll(changes){\r\n      if (changes && changes.length>0) {\r\n          let _this = this;\r\n          let isChange = false;\r\n          let hotData = this.getBackMergeData();\r\n          let fsumMap = this.firstSumMap;\r\n          let changeFields = {};\r\n          changes.forEach(change =>{\r\n            //执行跨行计算公式\r\n            let changeIndex = change[0]\r\n            let changeField = change[1];\r\n            changeFields[changeField] = true;\r\n            //执行行内计算公式\r\n            const exeMathResult = _this.exeAllMathExp(hotData,_this,changeIndex,isChange);\r\n            hotData = exeMathResult.data;\r\n            if(exeMathResult.isChange){\r\n              isChange = exeMathResult.isChange;\r\n            }\r\n          })\r\n          \r\n          //执行跨行计算公式\r\n          const exeRowResult = _this.exeAllRowMathExp(hotData,_this,isChange);\r\n          hotData = exeRowResult.data;\r\n          if(exeRowResult.isChange){\r\n            isChange = exeRowResult.isChange;\r\n          }\r\n\r\n          //执行单元格计算公式\r\n          const exeCellResult = _this.exeCellMathExp(hotData,_this,isChange);\r\n          hotData = exeCellResult.data;\r\n          if(exeCellResult.isChange){\r\n            isChange = exeCellResult.isChange;\r\n          }\r\n          \r\n\r\n          //执行首行汇总\r\n          if('{}'!=JSON.stringify(fsumMap)){\r\n              for (let sumKey in fsumMap) {\r\n                if (fsumMap.hasOwnProperty(sumKey)) {\r\n                  const tempResult = _this.exeFirstRowSum(hotData,sumKey,_this,isChange,fsumMap);\r\n                  hotData = tempResult.data;\r\n                  if(tempResult.isChange){\r\n                    isChange = tempResult.isChange;\r\n                  }\r\n                }\r\n              }\r\n          }\r\n          \r\n          //执行主表统计公式\r\n          for (let cField in changeFields) {\r\n            if (changeFields.hasOwnProperty(cField)) {\r\n              _this.exeMainFieldMathExp(hotData,cField,_this);\r\n            }\r\n          }\r\n          \r\n          if(isChange){\r\n            this.hotSettings.data = [];\r\n            this.hotSettings.data = hotData;\r\n          }\r\n          if(this.mergeCells && this.mergeCells.length>0){\r\n            this.hotSettings.mergeCells = this.buildMergeCell(hotData);\r\n          }\r\n      }\r\n    },\r\n    exeAllMathExp(hotData,_this,fieldIndex,isChange){//执行所有行内运算\r\n      if(_this.mathExpMap){\r\n        for (const fieldName in _this.mathExpMap) {\r\n          //如果行内运算对应单元格包含跨行运算，则以跨行运算为主，不进行行内运算\r\n          if(_this.mathExpMap.hasOwnProperty(fieldName) && !this.isInRowMath(fieldName,fieldIndex)){\r\n            const curexp =  _this.mathExpMap[fieldName];\r\n            let curvalue = this.calcExpValue(curexp,hotData,fieldIndex);\r\n            if(hotData[fieldIndex]){\r\n              hotData[fieldIndex][fieldName] = curvalue;\r\n              isChange = true;\r\n            }\r\n          }\r\n        }\r\n        return {data:hotData,isChange:isChange};\r\n      }\r\n    },\r\n    //判断行内运算的单元格是否包含跨行运算\r\n    isInRowMath(field,fieldIndex){\r\n      var isIn = false;\r\n      if(this.allRowMathMap && this.allRowMathMap[field]){\r\n        const rowMaths = this.allRowMathMap[field];\r\n        if(rowMaths && rowMaths.length>0){\r\n          rowMaths.forEach(mathItem =>{\r\n            if((mathItem.sn-1) ==fieldIndex){\r\n              isIn = true;\r\n              return true;\r\n            }\r\n          })\r\n        }\r\n      }\r\n      return isIn;\r\n    },\r\n    exeAllRowMathExp(hotData,_this,isChange){//执行所有跨行运算\r\n      if(_this.allRowMathMap){\r\n        for (const fieldName in _this.allRowMathMap) {\r\n          if(_this.allRowMathMap.hasOwnProperty(fieldName)){\r\n            let frowMaths = _this.allRowMathMap[fieldName];\r\n            if(frowMaths && frowMaths.length>0){\r\n              frowMaths.forEach(mathItem =>{\r\n                if(hotData[mathItem.sn-1]){\r\n                  const value = _this.calcRowsExpValue(mathItem.mathExp,hotData,fieldName);\r\n                  hotData[mathItem.sn-1][fieldName] = value;\r\n                  isChange = true;\r\n                }\r\n              })\r\n            }\r\n          }\r\n        }\r\n      }\r\n      return {data:hotData,isChange:isChange};\r\n    },\r\n    exeCellMathExp(hotData,_this,isChange){//执行所有单元格计算公式\r\n      if(_this.cellCalcs && _this.cellCalcs.length>0){\r\n        const formInst = utils.getOnlineFormInstance(this);\r\n        _this.cellCalcs.forEach(item =>{\r\n          const fieldName = item.cellField.split('.')[2];\r\n          if(hotData[item.rowIndex-1]){\r\n            const value = _this.calcCellExpValue(item.mathExp,hotData,formInst);\r\n            hotData[item.rowIndex-1][fieldName] = value;\r\n            isChange = true;\r\n          }\r\n        });\r\n      }\r\n      return {data:hotData,isChange:isChange};\r\n    },\r\n    exeFirstRowSum(hotData,fieldName,_this,isChange,fsumMap){\r\n      if(hotData && hotData.length>0){\r\n        if(fsumMap[fieldName]===true){\r\n          let exeValue = _this.sumCol(hotData, fieldName, true, _this);\r\n          hotData[0][fieldName] = this.tofixed(exeValue, 2);\r\n          isChange = true;\r\n        }\r\n      }\r\n      return {data:hotData,isChange:isChange};\r\n    },\r\n    sumCol(data, field, outFirst, _this){//汇总某列数据，\r\n      let sum = 0;\r\n      if(data && data.length>0){\r\n        for (let index = 0; index < data.length; index++) {\r\n          if(!(outFirst && index==0)){\r\n            const el = data[index];\r\n            sum += _this.toNumber(el[field]);\r\n          }\r\n        }\r\n      }\r\n      return sum;\r\n    },\r\n    //执行跨行计算公式\r\n    exeRowMathExp(hotData,fieldIndex,fieldName,_this,isChange,isRepeat){\r\n      //const fieldIndex = ffieldIndex+1;//_this.rowMathExpMap[column.data]\r\n      //执行当前字段涉及的计算公式（为了保证执行顺序，先执行当前编辑字段相关计算公式）\r\n      for (const rme in _this.rowMathExpMap) {\r\n        if(_this.rowMathExpMap.hasOwnProperty(rme)){\r\n          let frowMaths = _this.rowMathExpMap[rme];\r\n          let expArray = [];\r\n          if(frowMaths){\r\n            if(frowMaths[fieldIndex]){\r\n              expArray.push(fieldIndex);\r\n            }\r\n            for (const fm in frowMaths) {\r\n              if (frowMaths.hasOwnProperty(fm)) {\r\n                if(fm.indexOf(\":\")!=-1){\r\n                  const fArray = fm.split(\":\");\r\n                  if(fArray.length==2){\r\n                    const a = _this.toNumber(fArray[0]);\r\n                    const b = _this.toNumber(fArray[1]);\r\n                    if(fieldIndex>=a && fieldIndex<=b){\r\n                      expArray.push(fm);\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n          if(expArray.length>0){\r\n           //先执行直接关联的单元格计算\r\n            expArray.forEach(expKey =>{\r\n              const expItems = _this.rowMathExpMap[fieldName][expKey];\r\n              expItems.forEach(eItem =>{\r\n                  let value = _this.calcRowsExpValue(eItem.mathExp,hotData,fieldName);\r\n                  if(hotData[eItem.sn-1]){\r\n                    hotData[eItem.sn-1][fieldName] = value;\r\n                    isChange = true;\r\n                  }\r\n              });\r\n            })\r\n          }\r\n        }\r\n      }\r\n      return {data:hotData,isChange:isChange};\r\n    },\r\n    //执行行内计算公式\r\n    exeMathExp(hotData,fieldIndex,fieldName,_this,isChange,isRepeat){\r\n      //执行当前字段涉及的计算公式（为了保证执行顺序，先执行当前编辑字段相关计算公式）\r\n      const curExpMap = _this.mathExpItemMap[fieldName];\r\n      if(curExpMap){\r\n        for (const curkey in curExpMap) {\r\n          if (curExpMap.hasOwnProperty(curkey)) {\r\n            const curexp = curExpMap[curkey];\r\n            let curvalue = this.calcExpValue(curexp,hotData,fieldIndex);\r\n            if(hotData[fieldIndex]){\r\n              hotData[fieldIndex][curkey] = curvalue;\r\n              isChange = true;\r\n              //执行主表统计公式\r\n              _this.exeMainFieldMathExp(hotData,curkey,_this);\r\n            }\r\n          }\r\n        }\r\n        //执行其他字段涉及的计算公式（防止有关联计算）\r\n        for (const itemKey in _this.mathExpItemMap) {\r\n          if (_this.mathExpItemMap.hasOwnProperty(itemKey) && fieldName!=itemKey) {\r\n            const expMap = _this.mathExpItemMap[itemKey];\r\n            for (const key in expMap) {\r\n              if (expMap.hasOwnProperty(key)) {\r\n                const exp = expMap[key];\r\n                let value = this.calcExpValue(exp,hotData,fieldIndex);\r\n                if(hotData[fieldIndex]){\r\n                  hotData[fieldIndex][key] = value;\r\n                  isChange = true;\r\n                  //执行主表统计公式\r\n                   _this.exeMainFieldMathExp(hotData,key,_this);\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      if(isRepeat){\r\n        return _this.exeMathExp(hotData,fieldIndex,fieldName,_this,isChange,false);\r\n      }else{\r\n        return {data:hotData,isChange:isChange};\r\n      }\r\n    },\r\n    //执行主表字段统计公式\r\n    exeMainFieldMathExp(hotData,fieldName,_this){\r\n      const calc = this.mainFieldMathMap[fieldName];\r\n      if(calc){\r\n        let sumValue = 0;\r\n        let _this = this;\r\n        if(calc.mainField && hotData && hotData.length>0){\r\n          hotData.forEach(item =>{\r\n            sumValue += _this.toNumber(item[fieldName]);\r\n          })\r\n        }\r\n        const formInst = utils.getOnlineFormInstance(this);\r\n        if(formInst && formInst['data']){\r\n          const mainFieldPath = calc.mainField.split(\".\");\r\n          formInst['data'][mainFieldPath[0]][mainFieldPath[1]] = sumValue;\r\n        }\r\n      }\r\n    },\r\n    //单元格被选中，如果是只读，提示权限信息\r\n    afterSelectionEndMe(r, c, r2, c2){\r\n      const readOnlyField = this.readOnlyColumnMap[c];\r\n      if(r==r2 && c==c2 && readOnlyField){\r\n        this.$message({\r\n          message: \"字段【\"+readOnlyField['desc']+\"】不可填写！\",\r\n          type: \"warning\"\r\n        });\r\n      }else if(this.hotSettings.columns[c]){\r\n        const fieldName = this.hotSettings.columns[c]['data'];\r\n        if(fieldName && this.readOnlyRowsMap[fieldName+'_'+r] === true){\r\n          this.$message({\r\n            message: \"当前单元格不可填写！\",\r\n            type: \"warning\"\r\n          });\r\n        }else if(fieldName && this.mathRowCellMap[fieldName] && \r\n            (this.mathRowCellMap[fieldName][-1]===true || this.mathRowCellMap[fieldName][r]===true)){\r\n          this.$message({\r\n            message: \"当前为计算单元格，不可填写！\",\r\n            type: \"warning\"\r\n          });\r\n        }else if(this.crossMappingFields[fieldName] && this.crossMappingFields[fieldName][r]===true){\r\n          this.$message({\r\n            message: \"当前为跨表取数单元格，不可填写！\",\r\n            type: \"warning\"\r\n          });\r\n        }else if(this.firstSumMap[fieldName] && r==0){\r\n          this.$message({\r\n            message: \"当前为汇总单元格，不可填写！\",\r\n            type: \"warning\"\r\n          });\r\n        }\r\n      }\r\n    },\r\n    toNumber(x) {\r\n        if (typeof(x)=='undefined' || x === null || x === undefined || x === '')\r\n            return 0;\r\n        if (typeof x == \"string\") {\r\n            x = x.replace(/,/g, \"\");\r\n        }\r\n        var match = x.toString().match(/([$|￥])\\d+\\.?\\d*/);\r\n        if (match) {\r\n            x = x.replace(match[1], '');\r\n        }\r\n        return Number(x);\r\n    },\r\n    calcExpValue(exp, scope, subIndex) {\r\n        if (!exp) return 0;\r\n        var reg = /([\\[|\\{]).*?\\((.*?)\\)[\\}|\\]]/g;\r\n        let _this = this;\r\n        exp = exp.replace(reg, function () {\r\n            var symbol = arguments[1],\r\n                name = arguments[2],\r\n                value = 0;\r\n            if (scope) {\r\n                //子表统计计算情况，多行数据\r\n                if (symbol == '[') {\r\n                    var valArray = [];\r\n                    var subMsg = name.split(\".\");\r\n                    if (subMsg.length < 1) {\r\n                        throw `子表统计的表达式${name}错误`;\r\n                    }\r\n                    const subMsgSize = subMsg.length;\r\n                    var fieldName = subMsg[subMsgSize - 1];\r\n                    var fvalue = 0;\r\n                    if(scope[subIndex] && scope[subIndex][fieldName]){\r\n                      fvalue = _this.toNumber(scope[subIndex][fieldName]);\r\n                    }\r\n                    valArray.push(fvalue);\r\n                    value = `[${valArray.join(',')}`;\r\n                } else {\r\n                    var subMsg = name.split(\".\");\r\n                    var fieldName = subMsg[subMsg.length - 1];\r\n                    var val = scope[subIndex]?_this.toNumber(scope[subIndex][fieldName]):0;\r\n                    val = _this.toNumber(val);\r\n                    if (!isNaN(val) && \"\" != val) value = val;\r\n                }\r\n            }\r\n            if (!value) {\r\n                value = 0;\r\n            }\r\n            if(value<0){\r\n              value = '('+value+')';\r\n            }\r\n            return value;\r\n        });\r\n        exp = exp.replace(/[|\\[|\\]]/g,\"\");\r\n        if (exp.substring(0, 16) != \"FormMath.tofixed\") {\r\n            return this.isValue(this.tofixed(eval(`(${exp})`), 0));\r\n        }\r\n        try {\r\n           return this.isValue(eval(`(${exp})`));\r\n        } catch (error) {\r\n          _this.$message({\r\n              message: \"计算公式执行失败：\"+error,\r\n              type: \"error\"\r\n            });\r\n          return 0;\r\n        }\r\n    },\r\n    calcRowsExpValue(exp, scope, fName) {\r\n        if (!exp) return 0;\r\n        var reg = /\\[(.*?)\\]/g;\r\n        let _this = this;\r\n        exp = exp.replace(reg, function () {\r\n            var symbol = arguments[1],\r\n                cindex = arguments[2],\r\n                expStr = arguments[3],\r\n                value = 0;\r\n            if (scope) {\r\n                if (symbol.indexOf(':')>-1) {\r\n                    var sumStr = expStr.substring(cindex-13, cindex-1);\r\n                    if(sumStr === 'FormMath.sum'){\r\n                      var idxArray = symbol.split(':');\r\n                      var a = _this.toNumber(idxArray[0]);\r\n                      var b= _this.toNumber(idxArray[1]);\r\n                      var tempValue = [];\r\n                      for (let index = a; index <= b; index++) {\r\n                        var rowIndex = index -1;\r\n                        if(scope[rowIndex]){\r\n                          tempValue.push(_this.toNumber(scope[rowIndex][fName]));\r\n                        }\r\n                      }\r\n                      value = \"[\"+tempValue+\"]\";\r\n                    }\r\n                } else {\r\n                    var val = 0;\r\n                    var rowIndex = _this.toNumber(symbol)-1;\r\n                    if(scope[rowIndex]){\r\n                      val = _this.toNumber(scope[rowIndex][fName]);\r\n                    }\r\n                    val = _this.toNumber(val);\r\n                    if (!isNaN(val) && \"\" != val) value = val;\r\n                }\r\n            }\r\n            if (!value) {\r\n                value = 0;\r\n            }\r\n            if(value<0){\r\n              value = '('+value+')';\r\n            }\r\n            return value;\r\n        });\r\n        if (exp.substring(0, 16) != \"FormMath.tofixed\") {\r\n            return this.isValue(this.tofixed(eval(`(${exp})`), 0));\r\n        }\r\n        let resultValue = 0;\r\n        try {\r\n          resultValue = this.isValue(eval(`(${exp})`));\r\n        } catch (error) {\r\n          _this.$message({\r\n              message: \"计算公式执行失败：\"+error,\r\n              type: \"error\"\r\n            });\r\n        }\r\n        return resultValue;\r\n    },\r\n    calcCellExpValue(exp, scope, formInst) {\r\n        if (!exp) return 0;\r\n        var reg = /([\\[|\\{]).*?\\((.*?)\\)[\\}|\\]]/g;\r\n        let _this = this;\r\n        let subDataMap = {};\r\n        subDataMap[_this.subTablePath] = scope;\r\n        exp = exp.replace(reg, function () {\r\n            var symbol = arguments[1],\r\n                name = arguments[2],\r\n                value = 0;\r\n            if (scope) {\r\n                //子表统计计算情况，多行数据\r\n                if (symbol == '[') {\r\n                    var valArray = [];\r\n                    var subMsg = name.split(\".\");\r\n                    if (subMsg.length < 1) {\r\n                        throw `子表统计的表达式${name}错误`;\r\n                    }\r\n                    const subMsgSize = subMsg.length;\r\n                    var fvalue = 0;\r\n                    if(subMsgSize>3){\r\n                      var fieldNameStr = subMsg[subMsgSize - 1];\r\n                      const indexStr = fieldNameStr.match(/\\[(.+?)\\]/g);\r\n                      let subIndex = _this.toNumber(indexStr[0].replace(/\\[(.+?)\\]/g,'$1'))-1;\r\n                      let fName = fieldNameStr.replace(indexStr[0],'');\r\n                      let subPath = subMsg[1]+'.'+subMsg[2];\r\n                      if(!subDataMap[subPath] && _this.subTablePath != subPath){\r\n                        const hotTableRef = 'hottable.'+subPath;\r\n                        const hotTableObj = formInst.$refs[\"onlineForm\"].$refs[hotTableRef];\r\n                        if(hotTableObj){\r\n                          subDataMap[subPath] = formInst.$refs[\"onlineForm\"].$refs[hotTableRef].getHotTableData();\r\n                        }else{\r\n                          const paths = subPath.split('.');\r\n                          if(formInst.data[paths[0]] && formInst.data[paths[0]][paths[1]]){\r\n                            subDataMap[subPath] = formInst.data[paths[0]][paths[1]];\r\n                          }\r\n                        }\r\n                      }\r\n                      if(subDataMap[subPath]){\r\n                        let subData  = [...subDataMap[subPath]];\r\n                        if(subData[subIndex] && subData[subIndex][fName]){\r\n                          fvalue = _this.toNumber(subData[subIndex][fName]);\r\n                        }\r\n                      }\r\n                    }else if(formInst.data[subMsg[1]] && formInst.data[subMsg[1]][subMsg[2]]){\r\n                      fvalue = _this.toNumber(formInst.data[subMsg[1]][subMsg[2]]);\r\n                    }\r\n                    valArray.push(fvalue);\r\n                    value = `[${valArray.join(',')}`;\r\n                } else {\r\n                    var subMsg = name.split(\".\");\r\n                    var fieldName = subMsg[subMsg.length - 1];\r\n                    var val = 0;\r\n                    if(formInst.data[subMsg[1]] && formInst.data[subMsg[1]][subMsg[2]]){\r\n                      val = _this.toNumber(formInst.data[subMsg[1]][subMsg[2]]);\r\n                    }\r\n                    if (!isNaN(val) && \"\" != val) value = val;\r\n                }\r\n            }\r\n            if (!value) {\r\n                value = 0;\r\n            }\r\n            if(value<0){\r\n              value = '('+value+')';\r\n            }\r\n            return value;\r\n        });\r\n        exp = exp.replace(/[|\\[|\\]]/g,\"\");\r\n        if (exp.substring(0, 16) != \"FormMath.tofixed\") {\r\n            return this.isValue(this.tofixed(eval(`(${exp})`), 0));\r\n        }\r\n        try {\r\n           return this.isValue(eval(`(${exp})`));\r\n        } catch (error) {\r\n          _this.$message({\r\n              message: \"计算公式执行失败：\"+error,\r\n              type: \"error\"\r\n            });\r\n          return 0;\r\n        }\r\n    },\r\n    getValueByPath(path,subIndex){\r\n      let obj = this.hotSettings.data;\r\n      if (!obj || !path || path.constructor != String) {\r\n            return null;\r\n        }\r\n        if (!/^\\w?.*[\\w|\\]]$/.test(path)) {\r\n            return null;\r\n        }\r\n        let pathAry = path.split(\".\");\r\n        if (pathAry.length == 1) {\r\n            return obj[path];\r\n        }\r\n        else if (pathAry.length > 1) {\r\n            let ret = obj;\r\n            for (var i = 0; i < pathAry.length; i++) {\r\n                if (ret === null || ret === undefined) {\r\n                    return null;\r\n                }\r\n                const key = pathAry[i];\r\n                const match = /^(\\w+)\\[(\\d+)\\]$/.exec(key);\r\n                if (match) {\r\n                    ret = ret[match[1]][match[2]];\r\n                }\r\n                else if (ret && ret.constructor === Array) {\r\n                    let index = 0;\r\n                    if (subIndex != null && subIndex != undefined) {\r\n                        let preIndex = Number.parseInt(subIndex);\r\n                        if (!isNaN(preIndex)) {\r\n                            index = preIndex;\r\n                        }\r\n                    }\r\n                    ret = ret[index][key];\r\n                }\r\n                else {\r\n                    ret = ret[key];\r\n                }\r\n            }\r\n            return ret;\r\n        }\r\n        return null;\r\n    },\r\n    isValue(value) {\r\n        if (!value) {\r\n            return \"\";\r\n        } else if (value == \"Infinity\") {\r\n            return \"\";\r\n        } else {\r\n            return value;\r\n        }\r\n    },\r\n    tofixed(x, b) {\r\n        var tmp = this.toNumber(x);\r\n        b = this.toNumber(b);\r\n        if (isNaN(tmp) || tmp === \"\" || isNaN(b)) return x;\r\n        return tmp.toFixed(b);\r\n    },\r\n    parseFuncexpField(statFun){\r\n      var myregexp = /[{|[].*?\\((.*?)\\)[}|\\]]/g;\r\n      var match = myregexp.exec(statFun);\r\n      var arrs = [];\r\n      while (match != null) {\r\n          var str = match[1];\r\n          var has = false;\r\n          for (var i = 0, v; v = arrs[i++];) {\r\n              if (v == str) has = true;\r\n          }\r\n          if (!has) arrs.push(str);\r\n          match = myregexp.exec(statFun);\r\n      }\r\n      return arrs;\r\n    },\r\n    fillbackHotTableData(subData,needExecCross){\r\n      if(subData && subData.length>0){\r\n        this.hotSettings.data = JSON.parse(JSON.stringify(subData));\r\n        const mergeCells = this.buildMergeCell(subData);\r\n        if(mergeCells && typeof(mergeCells)!='undefined'){\r\n          this.hotSettings.mergeCells = mergeCells;\r\n        }\r\n        if(needExecCross!==false){\r\n          try {\r\n            //this.execCrossMapping();//执行跨表取数\r\n          } catch (error) {}\r\n        }\r\n        this.execInCellMathExp(subData);\r\n      }else{\r\n        this.hotSettings.data = [[]];\r\n      }\r\n    },\r\n    mergeCellRefresh(){//执行合并单元格\r\n      let data = this.getBackMergeData();\r\n      this.hotSettings.mergeCells = this.buildMergeCell(data);\r\n    },\r\n    execCellMathExp(data){\r\n      //这里执行3遍 防止包含行内计算和跨行计算先后顺序都有的情况\r\n      this.execInCellMathExp(data);\r\n      this.execInCellMathExp();\r\n      this.execInCellMathExp();\r\n    },\r\n    execInCellMathExp(data,changes){//执行计算公式\r\n      if(!data){\r\n        data = this.getBackMergeData();\r\n      }\r\n      let isneedFsum = false;\r\n      if(!changes){\r\n        changes = [];\r\n      }\r\n      if(changes.length>0 || (this.allMathExpList && this.allMathExpList.length>0 && data && data.length>0) || (this.cellCalcs || this.cellCalcs.length>0)){\r\n        let items = this.allMathExpList;\r\n        if(items && items.length>0){\r\n          const dataSize = data.length;\r\n          items.forEach(item =>{\r\n            if(item.isAll){\r\n              for (let i = 0; i < dataSize; i++) {\r\n                changes.push({0:i,1:item['name']});\r\n              }\r\n            }else{\r\n              if(item.index && item.index.length>0){\r\n                for (let i = 0; i < item.index.length; i++) {\r\n                  changes.push({0:item.index[i],1:item['name']});\r\n                }\r\n              }\r\n            }\r\n          });\r\n        }\r\n        const cellCalcs = this.cellCalcs;\r\n        if(cellCalcs && cellCalcs.length>0){\r\n          const cellCalc = cellCalcs[0];\r\n          changes.push({0:cellCalc.rowIndex,1:cellCalc.cellField.split('.')[2]});\r\n        }\r\n        if(changes && changes.length>0){\r\n          //this.execMathExpSingle(changes);\r\n          this.execMathExpAll(changes);\r\n        }else{\r\n          isneedFsum = true;\r\n        }\r\n      }else{\r\n        isneedFsum = true;\r\n      }\r\n      if(isneedFsum){\r\n        //执行首行汇总\r\n          let fsumMap = this.firstSumMap;\r\n          if('{}'!=JSON.stringify(fsumMap)){\r\n            let _this = this;\r\n            let isChange = false;\r\n            let hotData = this.getHotTableData();\r\n            for (let sumKey in fsumMap) {\r\n              if (fsumMap.hasOwnProperty(sumKey)) {\r\n                const tempResult = _this.exeFirstRowSum(hotData,sumKey,_this,isChange,fsumMap);\r\n                hotData = tempResult.data;\r\n                if(tempResult.isChange){\r\n                  isChange = tempResult.isChange;\r\n                }\r\n              }\r\n            }\r\n            if(isChange){\r\n              this.hotSettings.data = [];\r\n              this.hotSettings.data = hotData;\r\n            }\r\n            if(this.mergeCells && this.mergeCells.length>0){\r\n              this.hotSettings.mergeCells = this.buildMergeCell(hotData);\r\n            }\r\n          }\r\n      }\r\n    },\r\n    execCrossMapping(){\r\n      if(this.crossMappings && this.crossMappingSubTables.length>0){\r\n        let subData = {};\r\n        let curData = this.getHotTableData();\r\n        let _this = this;\r\n        const formInst = utils.getOnlineFormInstance(this);\r\n        this.crossMappingSubTables.forEach(sub =>{\r\n          const hotTableRef = 'hottable.'+sub;\r\n          const hotTableObj = formInst.$refs[\"onlineForm\"].$refs[hotTableRef];\r\n          if(hotTableObj){\r\n            subData[sub] = formInst.$refs[\"onlineForm\"].$refs[hotTableRef].getHotTableData();\r\n          }else{\r\n            const paths = sub.split('.');\r\n            if(formInst.data[paths[0]] && formInst.data[paths[0]][paths[1]]){\r\n               subData[sub] = formInst.data[paths[0]][paths[1]];\r\n            }\r\n          }\r\n        });\r\n        let isChange = false;\r\n        for (const subTablePath in _this.crossMappings) {\r\n          if (_this.crossMappings.hasOwnProperty(subTablePath)) {\r\n            const toFList = _this.crossMappings[subTablePath];\r\n            toFList.forEach(map =>{\r\n              const fromFields = map['fromFields'];\r\n              const toIndex = _this.toNumber(map['toIndex'])-1;\r\n              const toFieldPath = map['toField'].split('.');\r\n              if(fromFields && fromFields.length>0 && curData[toIndex]){\r\n                let sumValue = 0;\r\n                for (let i = 0; i < fromFields.length; i++) {\r\n                  const field = fromFields[i];\r\n                  const fromFieldPath = field.fromField.split('.');\r\n                  const fromIndex = _this.toNumber(field['fromIndex'])-1;\r\n                  const subPath = fromFieldPath[0]+'.'+fromFieldPath[1];\r\n                  if(subData[subPath] && subData[subPath][fromIndex] && curData[toIndex]){\r\n                    if(typeof subData[subPath][fromIndex][fromFieldPath[2]] !='undefined'){\r\n                        const tempValue = subData[subPath][fromIndex][fromFieldPath[2]];\r\n                        sumValue += _this.toNumber(tempValue);\r\n                    }\r\n                  }\r\n                }\r\n                curData[toIndex][toFieldPath[2]] = sumValue;\r\n                isChange = true;\r\n              }\r\n            });\r\n          }\r\n        }\r\n        if(isChange){\r\n          this.fillbackHotTableData(curData,false);\r\n        }\r\n      }\r\n    },\r\n    getBackMergeData(exeMath){//获取恢复合并单元格后的数据\r\n      //取数前先执行跨表取数和计算公式\r\n      if(exeMath===true){\r\n        try {\r\n         this.execCrossMapping();//执行跨表取数\r\n         this.execCellMathExp();//执行计算公式 \r\n        } catch (error) {\r\n          console.log(error);\r\n        }\r\n      }\r\n      let data = this.hotSettings.data;\r\n      let row = this.initRowData;\r\n      let _this = this;\r\n      //处理初始化时的第一行数据类型为数组转json为空问题\r\n      if(data && data.length>0 && Array.isArray(data[0]) && row && JSON.stringify(row)!='{}'){\r\n        let newRow = {};\r\n        let oldRow = this.hotSettings.data[0];\r\n        for (const key in row) {\r\n          if (row.hasOwnProperty(key)) {\r\n            newRow[key] = typeof(oldRow[key])=='undefined'?'':oldRow[key];\r\n          }\r\n        }\r\n        data[0] = newRow;\r\n        this.hotSettings.data[0] = newRow;\r\n      }\r\n      if(data && data.length == 1 && JSON.stringify(data[0])==JSON.stringify(this.initRowData)){\r\n        return [];\r\n      }\r\n      let mergeCells = this.mergeCells;\r\n      if(mergeCells && mergeCells.length>0 && data && data.length>0){\r\n        let columns = this.hotSettings.columns;\r\n        mergeCells.forEach(item =>{\r\n          const rowIndex = item.row;\r\n          if(data[rowIndex]){\r\n            const rowspan = item.rowspan;\r\n            const field = columns[item['col']]['data'];\r\n            const baseValue = data[rowIndex][field];\r\n            for (let index = rowIndex; index < rowIndex+rowspan; index++) {\r\n              if(data[index]){\r\n                  data[index][field] = baseValue;\r\n              }\r\n            }\r\n          }\r\n        });\r\n      }\r\n      //处理填制单位（复制的时候）\r\n      let custDialog = this.initCustDialogConf\r\n      if(data && data.length>0 && custDialog && custDialog.orgConfig && ((custDialog.orgConfig.name && this.fillOrg.id)||custDialog.orgConfig.instId)){\r\n        const fillFillObj = this.getOrgFillFieldObj(custDialog);\r\n        if(fillFillObj.orgNameField || fillFillObj.orgIdField || fillFillObj.orgCodeField || fillFillObj.instIdField){\r\n          data.forEach(item =>{\r\n            if(fillFillObj.orgNameField && !item[fillFillObj.orgNameField]){\r\n              item[fillFillObj.orgNameField] = _this.fillOrg.name;\r\n            }if(fillFillObj.orgIdField && !item[fillFillObj.orgIdField]){\r\n              item[fillFillObj.orgIdField] = _this.fillOrg.id;\r\n            }if(fillFillObj.orgCodeField && !item[fillFillObj.orgCodeField]){\r\n              item[fillFillObj.orgCodeField] = _this.fillOrg.code;\r\n            }if(fillFillObj.instIdField && !item[fillFillObj.instIdField]){\r\n              item[fillFillObj.instIdField] = _this.instId;\r\n            }\r\n          });\r\n        }\r\n      }\r\n      return data;\r\n    },\r\n    getOrgFillFieldObj(custDialog){\r\n        let orgFillFieldObj = {orgNameField:'',orgIdField:'',orgCodeField:'',instIdField:''};\r\n        if(custDialog.orgConfig.name){\r\n          const namePath = custDialog.orgConfig.name.split('.');\r\n          orgFillFieldObj.orgNameField = namePath[namePath.length-1];\r\n        }\r\n        if(custDialog.orgConfig.id){\r\n          const idPath = custDialog.orgConfig.id.split('.');\r\n          orgFillFieldObj.orgIdField = idPath[idPath.length-1];\r\n        }\r\n        if(custDialog.orgConfig.code){\r\n          const codePath = custDialog.orgConfig.code.split('.');\r\n          orgFillFieldObj.orgCodeField = codePath[codePath.length-1];\r\n        }\r\n        if(custDialog.orgConfig.instId){\r\n          const instIdPath = custDialog.orgConfig.instId.split('.');\r\n          orgFillFieldObj.instIdField = instIdPath[instIdPath.length-1];\r\n        }\r\n        return orgFillFieldObj;\r\n    },\r\n    getHotTableData(exeMath){\r\n      //如果是保存或提交时需进行必填校验\r\n      const data = this.getBackMergeData(exeMath);\r\n      if(exeMath===true){\r\n        if(!this.validateCells(data)){\r\n          return false;\r\n        }\r\n      }\r\n      return data;\r\n    },\r\n    validateCells(data){\r\n      let _this = this;\r\n      let isTrue = true;\r\n      const requireds = this.requiredRowsMap;\r\n      if(requireds && '{}'!==JSON.stringify(requireds)){\r\n        if(!data || data.length<1){\r\n           _this.$message({\r\n              message: \"子表【\"+_this.name+\"】存在必填项未填写！\",\r\n              type: \"error\"\r\n            });\r\n          isTrue = false;\r\n          return false;\r\n        }\r\n        for (const field in requireds) {\r\n          if (requireds.hasOwnProperty(field)) {\r\n            const required = requireds[field];\r\n            if(required.all === true){\r\n              for (let i = 0; i < data.length; i++) {\r\n                if(!data[i][field] && data[i][field]!==0  && data[i][field]!==false){\r\n                  _this.$message({\r\n                    message: \"子表【\"+_this.name+\"】中第【\"+(i+1)+\"】行【\"+_this.fieldNameMap[field]+\"】必填！\",\r\n                    type: \"error\"\r\n                  });\r\n                  isTrue = false;\r\n                  return false;\r\n                }\r\n              }\r\n            }else if(required.rows && required.rows.length>0){\r\n              required.rows.forEach(index =>{\r\n                if(!data[index-1] || (!data[index-1][field] && data[index-1][field]!==0  && data[index-1][field]!==false)){\r\n                  _this.$message({\r\n                    message: \"子表【\"+_this.name+\"】中第【\"+index+\"】行【\"+_this.fieldNameMap[field]+\"】必填！\",\r\n                    type: \"error\"\r\n                  });\r\n                  isTrue = false;\r\n                  return false;\r\n                }\r\n              })\r\n            }\r\n          }\r\n        }\r\n      }\r\n      return isTrue;\r\n    },\r\n    initTemplateData(){\r\n        if(this.isInitTemplateData !=='true'){\r\n          //初始化统计行\r\n          this.toAddInitSumRow();\r\n          return ;\r\n        }\r\n        let _this = this;\r\n        //如果已有数据则不需要再次初始化\r\n        const curData = this.getHotTableData();\r\n        let initType = this.initFillDataType;\r\n        const formInst = utils.getOnlineFormInstance(_this);\r\n        if((!initType || initType=='empty')){\r\n          if(curData.length==0 || (curData.length==1 && (Array.isArray(curData[0]) || JSON.stringify(curData[0]) ==JSON.stringify(this.initRowData)))){\r\n            this.hotSettings.data = [[]];\r\n          }else{\r\n            //初始化统计行\r\n            this.toAddInitSumRow();\r\n            return ;\r\n          }\r\n        }else if(initType=='cover'){\r\n          const paths = this.subTablePath.split('.');\r\n          formInst['data'][paths[0]][paths[1]] = [];\r\n          this.hotSettings.data = [[]];\r\n        }\r\n        if(!this.initCustDialogConf || !this.initCustDialogConf.custDialog || !this.initCustDialogConf.custDialog.alias){\r\n          //初始化统计行\r\n          this.toAddInitSumRow();\r\n          return ;\r\n        }\r\n        const loading = this.$loading({\r\n          lock: true,\r\n          text: '正在初始化填报模板...',\r\n          spinner: 'el-icon-loading',\r\n          background: 'rgba(0, 0, 0, 0.7)'\r\n        });\r\n        this.$http.get('${form}/form/customDialog/v1/getByAlias?alias='+this.initCustDialogConf.custDialog.alias).then(resp => {\r\n            _this.customDialog = resp.data;\r\n        }, error => {\r\n            _this.closeLoading(loading);\r\n            _this.$message({\r\n              message: \"获取自定义对话框失败！\",\r\n              type: \"error\"\r\n            });\r\n        }).then(function () {\r\n             const custdialog = _this.initCustDialogConf;\r\n             const currentUser = JSON.parse(sessionStorage.getItem(\"currentUser\"));\r\n             if(!custdialog.orgConfig.code && !custdialog.orgConfig.name && !custdialog.orgConfig.id){\r\n                _this.closeLoading(loading);\r\n                _this.toFillInitData(_this);\r\n              }else if (localStorage.getItem(\"curFillOrg_\"+currentUser.account)) {\r\n               _this.closeLoading(loading);\r\n               _this.fillOrg = JSON.parse(localStorage.getItem(\"curFillOrg_\"+currentUser.account));\r\n               _this.toFillInitData(_this);\r\n             }else{\r\n               _this.$http.get('${uc}/api/org/v1/org/getFillOrg').then(resp => {\r\n                   _this.closeLoading(loading);\r\n                    const rep = resp.data;\r\n                    if(rep.state){\r\n                      _this.fillOrg = rep.value;\r\n                      localStorage.setItem(\"curFillOrg_\"+currentUser.account,JSON.stringify(rep.value))\r\n                      _this.toFillInitData(_this);\r\n                    }else{\r\n                      _this.$message({\r\n                        message: rep.message,\r\n                        type: \"warning\"\r\n                      });\r\n                    }\r\n                }, error => {\r\n                    _this.closeLoading(loading);\r\n                    _this.$message({\r\n                      message: \"获取当前用户填制单位失败！\",\r\n                      type: \"warning\"\r\n                    });\r\n                })\r\n             }\r\n        });\r\n    },\r\n    closeLoading(loading){\r\n      let _this = this;\r\n      setTimeout(function(){\r\n        loading.close();\r\n      },2000);\r\n    },\r\n    toFillInitData(_this){\r\n      setTimeout(function(){\r\n        _this.fillInitData(_this);\r\n      },1000);\r\n    },\r\n    fillInitData(_this){\r\n      const custDialog = _this.initCustDialogConf.custDialog;\r\n      const formInst = utils.getOnlineFormInstance(_this);\r\n      const curData = formInst['data'];\r\n      //处理对话框的参数传入\r\n      let params = [];\r\n      if(custDialog.conditions){\r\n        //对话框按表单字段查询（参数传入的）\r\n        let bindList = custDialog.conditions;\r\n        if(bindList.length>0){\r\n          bindList.forEach(ele => {\r\n            //绑定表单字段\r\n            if (ele.defaultType == \"3\" && ele.bind) {\r\n              let obj = {};\r\n              obj.field = ele.field;\r\n              const bindArray = ele.bind.split('.');\r\n              if(bindArray.length==3){\r\n                obj.bind = curData[bindArray[1]][bindArray[2]];\r\n                params.push(obj);\r\n              }\r\n              \r\n            }\r\n          });\r\n        }\r\n      }\r\n      let url = '${form}/form/customDialog/v1/getListData?alias='+custDialog.alias;\r\n      if(params.length>0){\r\n        let paStr = '';\r\n        params.forEach(pa =>{\r\n          if(paStr){\r\n            paStr += ',';\r\n          }\r\n          paStr = paStr + '\"'+pa.field +'\":\"'+pa.bind+'\"';\r\n        });\r\n        url = url+'&mapParam='+paStr;\r\n      }else{\r\n        url = url+'&mapParam=';\r\n      }\r\n      const param = {pageBean: {page: 1, pageSize: 1000, showTotal: true}};\r\n      _this.$http.post(url, param).then(resp => {\r\n          const response = resp.data;\r\n          if(response.rows){\r\n             _this.syncInitTableValue(response.rows);\r\n             if(response.rows.length==0){\r\n               //初始化统计行\r\n               _this.toAddInitSumRow();\r\n               _this.hotSettings.data[0] = _this.fillOrgDataField(_this.hotSettings.data[0]);\r\n             }\r\n          }\r\n      }, error => {\r\n          _this.$message({\r\n            message: \"获取初始化数据失败！\",\r\n            type: \"error\"\r\n          });\r\n      });\r\n    },\r\n    getFillOrgObj(custDialog){//获取填制单位、实例信息\r\n      let fillOrg = null;\r\n      if(custDialog.orgConfig && (custDialog.orgConfig.id ||custDialog.orgConfig.name || custDialog.orgConfig.code || custDialog.orgConfig.instId) \r\n      && this.fillOrg.id){\r\n        fillOrg = {};\r\n        const namePath = custDialog.orgConfig.name.split('.');\r\n        const orgNameField = namePath[namePath.length-1];\r\n        if(custDialog.orgConfig.name && orgNameField){\r\n          fillOrg[orgNameField] = this.fillOrg.name;\r\n        }\r\n        if(custDialog.orgConfig.id){\r\n          const idPath = custDialog.orgConfig.id.split('.');\r\n          const orgIdField = idPath[idPath.length-1];\r\n          fillOrg[orgIdField] = this.fillOrg.id;\r\n        }\r\n        if(custDialog.orgConfig.code){\r\n          const codePath = custDialog.orgConfig.code.split('.');\r\n          const orgCodeField = codePath[codePath.length-1];\r\n          fillOrg[orgCodeField] = this.fillOrg.code;\r\n        }\r\n        if(custDialog.orgConfig.instId){\r\n          const instIdPath = custDialog.orgConfig.instId.split('.');\r\n          const instIdField = instIdPath[instIdPath.length-1];\r\n          fillOrg[instIdField] = this.instId;\r\n        }\r\n      }\r\n      return fillOrg;\r\n    },\r\n    // 同步初始化数据结果\r\n    syncInitTableValue(s) {\r\n      let custDialog = this.initCustDialogConf;\r\n      var returnStr = JSON.parse(this.customDialog.resultfield);\r\n      //拿到返回的字段\r\n      var field = new Array([returnStr.length]);\r\n      var comment = new Array([returnStr.length]);\r\n      var str = [];\r\n      var ids = [];\r\n      for (var i = 0; i < returnStr.length; i++) {\r\n        field[i] =\r\n          this.customDialog.dsType == \"dataSource\"\r\n            ? returnStr[i].field.toUpperCase()\r\n            : returnStr[i].field;\r\n        comment[i] =\r\n          this.customDialog.dsType == \"dataSource\"\r\n            ? returnStr[i].comment.toUpperCase()\r\n            : returnStr[i].comment;\r\n      }\r\n      if (this.customDialog.selectNum === 1) {\r\n        var temp = \"\";\r\n        for (var i = 0; i < comment.length; i++) {\r\n          const va = s[0][field[i]];\r\n          va = typeof(va)=='undefined'?'':va;\r\n          temp += '\"' + comment[i] + '\":\"' + va + '\",';\r\n        }\r\n        if (temp != \"\") {\r\n          temp = \"{\" + temp.substring(0, temp.length - 1) + \"}\";\r\n        }\r\n        str.push(JSON.parse(temp));\r\n        ids.push(s[0].id);\r\n      } else {\r\n        for (var i = 0; i < s.length; i++) {\r\n          var temp = \"\";\r\n          for (var j = 0; j < comment.length; j++) {\r\n            const va = s[i][field[j]];\r\n            va = typeof(va)=='undefined'?'':va;\r\n            temp += '\"' + comment[j] + '\":\"' + va + '\",';\r\n          }\r\n          if (temp != \"\") {\r\n            temp = \"{\" + temp.substring(0, temp.length - 1) + \"}\";\r\n          }\r\n          str.push(JSON.parse(temp));\r\n          ids.push(s[i].id);\r\n        }\r\n      }\r\n      //处理填制部门\r\n      let fillOrg = this.getFillOrgObj(custDialog);\r\n      \r\n      //处理实例id回填\r\n      if(custDialog.orgConfig && custDialog.orgConfig.instId && this.instId){\r\n          if(fillOrg == null){\r\n            fillOrg = {};\r\n          }\r\n          const instIdPath = custDialog.orgConfig.instId.split('.');\r\n          const instIdField = instIdPath[instIdPath.length-1];\r\n          fillOrg[instIdField] = this.instId;\r\n      }\r\n      const returnData = str;\r\n      const _this = this;\r\n      const formInst = utils.getOnlineFormInstance(this);\r\n      let filldata = this.hotSettings.data;\r\n      if(filldata && filldata.length==1){\r\n        filldata = [];\r\n        //if(Object.keys(this.hotSettings.data[0]).length==0 || JSON.stringify(this.initRowData) == JSON.stringify(this.hotSettings.data[0])){\r\n          const initSumRow = this.getInitSumRow();\r\n          if(initSumRow){\r\n            filldata.push({...initSumRow,...fillOrg});\r\n          }\r\n        //}\r\n      }\r\n      let fillInitData = [];\r\n      returnData.forEach(row => {\r\n        var targetArray = null;\r\n        var subLineData = _this.initRowData?_this.initRowData:{};\r\n        custDialog.custDialog.mappingConf.forEach(con => {\r\n          if (con.target[0]) {\r\n            targetArray = con.target[0].split(\".\");\r\n            var from = \"\";\r\n            if (_this.customDialog.dsType == \"restful\") {\r\n              from = con.from;\r\n            } else {\r\n              from = con.from.toUpperCase();\r\n            }\r\n            subLineData[targetArray[targetArray.length - 1]] = row[from];\r\n          }\r\n        });\r\n        if(fillOrg!=null){\r\n          subLineData = {...subLineData,...fillOrg};\r\n        }\r\n        fillInitData.push({...subLineData});\r\n      });\r\n      if(this.addInitTemplateData==='true'){\r\n        this.initDataBack = fillInitData;\r\n      }\r\n      filldata = [...filldata,...fillInitData];\r\n      this.fillbackHotTableData(filldata,false);\r\n    },\r\n    fillOrgDataField(row){\r\n      let custDialog = this.initCustDialogConf;\r\n      if(custDialog && custDialog.orgConfig){\r\n        if(custDialog.orgConfig.name && this.fillOrg.id){\r\n          const namePath = custDialog.orgConfig.name.split('.');\r\n          const orgNameField = namePath[namePath.length-1];\r\n          row[orgNameField] = this.fillOrg.name;\r\n          if(custDialog.orgConfig.id){\r\n            const idPath = custDialog.orgConfig.id.split('.');\r\n            const orgIdField = idPath[idPath.length-1];\r\n            row[orgIdField] = this.fillOrg.id;\r\n          }\r\n          if(custDialog.orgConfig.code){\r\n            const codePath = custDialog.orgConfig.code.split('.');\r\n            const orgCodeField = codePath[codePath.length-1];\r\n            row[orgCodeField] = this.fillOrg.code;\r\n          }\r\n        }\r\n        if(custDialog.orgConfig.instId && this.instId){\r\n            const instIdPath = custDialog.orgConfig.instId.split('.');\r\n            const instIdField = instIdPath[instIdPath.length-1];\r\n            row[instIdField] = this.instId;\r\n        }\r\n      }\r\n      return row;\r\n    },\r\n    toAddInitSumRow(){\r\n      const data = this.getHotTableData();\r\n      if(!data || data.length<1 ||(data.length==1 && \r\n        JSON.stringify(data[0])===JSON.stringify(this.initRowData))){\r\n          const initSumRow = this.getInitSumRow();\r\n          if(initSumRow){\r\n            let rows = [];\r\n            rows.push({...initSumRow});\r\n            this.fillbackHotTableData(rows);\r\n          }\r\n      }\r\n    },\r\n    getInitSumRow(){\r\n      if(this.initSumRow==='true'){\r\n        let newRow = {...this.initRowData};\r\n        if(this.initSumRowField && this.initSumRowValue){\r\n          newRow[this.initSumRowField] = this.initSumRowValue;\r\n        }\r\n        let fillOrg = this.getFillOrgObj(this.initCustDialogConf);\r\n        if(fillOrg == null){\r\n            fillOrg = {};\r\n        }\r\n        return {...newRow,...fillOrg};\r\n      }\r\n      return '';\r\n    },\r\n    toAddInitTemplateData(){\r\n      if(this.addInitTemplateData==='true' && this.initDataBack && Array.isArray(this.initDataBack) && this.initDataBack.length>0){\r\n        let curData = this.getBackMergeData();\r\n        if(!(curData && Array.isArray(this.initDataBack))){\r\n          curData = [[]];\r\n        }\r\n        curData = [...curData,...this.initDataBack];\r\n        this.fillbackHotTableData(curData);\r\n      }else if(!this.initDataBack || this.initDataBack.length<1){\r\n        this.$message({\r\n          message: \"初始化数据为空。\",\r\n          type: \"warning\"\r\n        });\r\n      }\r\n    },\r\n    getTableHeaders(){\r\n      const optionsJon = JSON.parse(this.options);\r\n      const relations = optionsJon.colHeadersRelations;\r\n      let headers = {nested:this.hotSettings.nestedHeaders?true:false,header:[]};\r\n      relations.forEach(item =>{\r\n        headers.header.push({name:item.name,desc:item.desc});\r\n      })\r\n      return headers;\r\n    },\r\n  },\r\n  created() {\r\n     \r\n  }\r\n};\r\n",null]}