{"remainingRequest":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\cssc-fvue\\src\\components\\eipControl\\EipHotTable.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\cssc-fvue\\src\\components\\eipControl\\EipHotTable.vue","mtime":1667804639071},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["//\n//\n//\n//\n//\n//\n\r\nimport utils from \"@/utils.js\";\r\nimport FormMath from \"@/math.js\";\r\nimport { HotTable } from \"@handsontable/vue\";\r\nimport SubDataDetail from \"@/components/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]}