{"remainingRequest":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\xq-web-fvue\\src\\hotent-ui-util.js","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\src\\hotent-ui-util.js","mtime":1667327529778},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\babel.config.js","mtime":1667327525434},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\xq-web-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["import \"core-js/modules/es7.object.get-own-property-descriptors\";\nimport \"core-js/modules/es6.array.from\";\nimport \"core-js/modules/es6.set\";\nimport \"core-js/modules/es6.string.iterator\";\nimport \"core-js/modules/es6.map\";\nimport \"core-js/modules/es6.array.find-index\";\nimport \"core-js/modules/es6.regexp.constructor\";\nimport \"core-js/modules/es6.regexp.match\";\nimport \"core-js/modules/es6.number.parse-int\";\nimport _toConsumableArray from \"D:/jenkins/workspace/xq-web-fvue/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\";\nimport \"core-js/modules/es6.number.is-integer\";\nimport \"core-js/modules/es6.number.constructor\";\nimport \"core-js/modules/es6.regexp.split\";\nimport _defineProperty from \"D:/jenkins/workspace/xq-web-fvue/node_modules/@babel/runtime/helpers/esm/defineProperty.js\";\nimport \"core-js/modules/es7.object.values\";\nimport _typeof from \"D:/jenkins/workspace/xq-web-fvue/node_modules/@babel/runtime/helpers/esm/typeof.js\";\nimport \"core-js/modules/es6.regexp.replace\";\nimport \"core-js/modules/es6.function.name\";\nimport \"core-js/modules/web.dom.iterable\";\nimport \"core-js/modules/es6.object.keys\";\nimport \"core-js/modules/es6.regexp.to-string\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nvar utils = {\n  /**\r\n   * 根据字典编码获取字典数据\r\n   */\n  getDictItemsFromCache: function getDictItemsFromCache(dictCode) {\n    if (!dictCode) {\n      return '字典Code不能为空!';\n    }\n\n    if (sessionStorage.getItem('dict_data')) {\n      var dict_data = JSON.parse(sessionStorage.getItem('dict_data'));\n\n      if (dict_data[dictCode]) {\n        var distItem = dict_data[dictCode];\n        return distItem;\n      }\n    }\n  },\n\n  /**\r\n   * 深拷贝\r\n   */\n  deepClone: function deepClone(data) {\n    var type = utils.getType(data);\n    var obj;\n\n    if (type === \"array\") {\n      obj = [];\n    } else if (type === \"object\") {\n      obj = {};\n    } else {\n      //不再具有下一层次\n      return data;\n    }\n\n    if (type === \"array\") {\n      for (var i = 0, len = data.length; i < len; i++) {\n        obj.push(utils.deepClone(data[i]));\n      }\n    } else if (type === \"object\") {\n      for (var key in data) {\n        obj[key] = utils.deepClone(data[key]);\n      }\n    }\n\n    return obj;\n  },\n  getType: function getType(obj) {\n    //tostring会返回对应不同的标签的构造函数\n    var toString = Object.prototype.toString;\n    var map = {\n      \"[object Boolean]\": \"boolean\",\n      \"[object Number]\": \"number\",\n      \"[object String]\": \"string\",\n      \"[object Function]\": \"function\",\n      \"[object Array]\": \"array\",\n      \"[object Date]\": \"date\",\n      \"[object RegExp]\": \"regExp\",\n      \"[object Undefined]\": \"undefined\",\n      \"[object Null]\": \"null\",\n      \"[object Object]\": \"object\"\n    };\n\n    if (obj instanceof Element) {\n      return \"element\";\n    }\n\n    return map[toString.call(obj)];\n  },\n  isEmpty: function isEmpty(value) {\n    if (value === null || value === undefined || value === \"\") {\n      return true;\n    } else if (value.constructor == Object) {\n      return Object.keys(value).length == 0;\n    } else if (value.constructor == Array) {\n      return value.length == 0;\n    }\n\n    return false;\n  },\n  // 解析URL地址，如果url地址包含了${form}这样的占位符，会按照sso.js中配置的对应服务的地址替换。\n  parseUrl: function parseUrl(url) {\n    if (url === \"\") return;\n    var ctx = window.context,\n        reg = /^(\\$\\{(\\w+)\\})\\/.*$/;\n    var match = reg.exec(url);\n\n    if (match != null) {\n      var name = match[2],\n          mc = match[1],\n          val = ctx[name];\n\n      if (!val) {\n        throw new Error(\"The '\" + name + \"' in url:\" + url + \" does not defined in context provider.\");\n      }\n\n      return url.replace(mc, val);\n    } else {\n      return url;\n    }\n  },\n  // 使用ctx对象中的值替换掉exp中所有的${key}\n  parseExp: function parseExp(exp, ctx) {\n    if (!exp || exp.constructor != String) return exp;\n    ctx = ctx || {};\n    var reg = /(\\$\\{(\\w+)\\})/,\n        match = null,\n        count = 0;\n\n    while (match = reg.exec(exp)) {\n      count++; // 避免死循环\n\n      if (count > 999) {\n        break;\n      }\n\n      if (match != null) {\n        exp = exp.replace(match[1], ctx.hasOwnProperty(match[2]) ? ctx[match[2]] : \"\");\n      }\n    }\n\n    return exp;\n  },\n  // 获取随机的名称\n  getName: function getName() {\n    return Math.random().toString(36).substr(2, 10);\n  },\n  // 获取控件是否可编辑\n  getWriteable: function getWriteable(permission) {\n    if (permission === 'n' || permission === 'r') {\n      return false;\n    }\n\n    return true;\n  },\n  // 合并验证规则(如果rules和appendRules均为字符串格式，合并后仍为字符串格式；如果其中一个为Object格式，合并后为Object格式。)\n  mergeValidate: function mergeValidate(rules, appendRules) {\n    if (!appendRules || appendRules.constructor !== Object && appendRules.constructor !== String) {\n      return rules;\n    }\n\n    var rulesTypeIsString = true,\n        appendTypeIsString = appendRules.constructor === String,\n        finalTypeIsString = true;\n\n    if (rules === undefined || rules === null) {\n      rulesTypeIsString = appendTypeIsString;\n      rules = appendTypeIsString ? \"\" : {};\n    } else if (rules.constructor === Object || rules.constructor === String) {\n      rulesTypeIsString = rules.constructor === String;\n    } else {\n      throw \"rules\\u7684\\u7C7B\\u578B\\u4E3A\".concat(_typeof(rules), \"\\uFF0C\\u53EA\\u80FD\\u4E3AObject\\u7C7B\\u578B\\u6216String\\u7C7B\\u578B\\u3002\");\n    }\n\n    finalTypeIsString = rulesTypeIsString && appendTypeIsString; // 仍然以String格式\n\n    if (finalTypeIsString) {\n      var ruleAry = utils.stringSplit(rules, \"|\");\n      var appendAry = utils.stringSplit(appendRules, \"|\");\n      var ruleObj = {},\n          appendObj = {};\n      ruleAry.forEach(function (r) {\n        var k = utils.stringSplit(r, \":\")[0];\n        ruleObj[k] = r;\n      });\n      appendAry.forEach(function (a) {\n        var k = utils.stringSplit(a, \":\")[0];\n        appendObj[k] = a;\n      }); // 如果旧规则中存在与追加规则中的同名规则，则使用追加规则覆盖旧规则。\n\n      var mergeObj = Object.assign(ruleObj, appendObj);\n      return Object.values(mergeObj).join(\"|\");\n    } // 转换为Object格式\n    else {\n      var _ruleObj = {},\n          _appendObj = {};\n\n      if (rulesTypeIsString) {\n        _ruleObj = utils.validateString2Object(rules);\n      } else {\n        _ruleObj = _objectSpread({}, rules);\n      }\n\n      if (appendTypeIsString) {\n        _appendObj = utils.validateString2Object(appendRules);\n      } else {\n        _appendObj = _objectSpread({}, appendRules);\n      }\n\n      return Object.assign(_ruleObj, _appendObj);\n    }\n  },\n  // 减少校验规则\n  reduceValidate: function reduceValidate(rules, reduceRules) {\n    if (!rules || !reduceRules || reduceRules.constructor !== Object && reduceRules.constructor !== String) {\n      return rules;\n    } // 要减少的校验规则的名称集合\n\n\n    var reduceRuleNames = [];\n\n    if (reduceRules.constructor === String) {\n      var reduceRuleObj = utils.validateString2Object(reduceRules);\n      reduceRuleNames = Object.keys(reduceRuleObj);\n    } else {\n      reduceRuleNames = Object.keys(reduceRules);\n    }\n\n    if (rules.constructor === Object) {\n      Object.keys(rules).forEach(function (k) {\n        if (reduceRuleNames.some(function (n) {\n          return n == k;\n        })) {\n          delete rules[k];\n        }\n      });\n      return rules;\n    } else if (rules.constructor === String) {\n      var ruleAry = utils.stringSplit(rules, \"|\");\n      var nRuleAry = ruleAry.reduce(function (ary, r) {\n        var name = utils.stringSplit(r, \":\")[0];\n\n        if (reduceRuleNames.every(function (m) {\n          return m != name;\n        })) {\n          ary.push(r);\n        }\n\n        return ary;\n      }, []);\n      return nRuleAry.join(\"|\");\n    } else {\n      throw \"rules\\u7684\\u7C7B\\u578B\\u4E3A\".concat(_typeof(rules), \"\\uFF0C\\u53EA\\u80FD\\u4E3AObject\\u7C7B\\u578B\\u6216String\\u7C7B\\u578B\\u3002\");\n    }\n  },\n  // 字符串格式的校验规则转为对象格式\n  validateString2Object: function validateString2Object(rule) {\n    if (!rule || rule.constructor !== String) {\n      return rule;\n    }\n\n    var obj = {};\n    var ary = utils.stringSplit(rule, '|');\n    ary.forEach(function (m) {\n      var regAndArgs = utils.stringSplit(m, ':');\n\n      if (regAndArgs.length == 1) {\n        obj[regAndArgs[0]] = true;\n      } else if (regAndArgs.length > 1) {\n        var args = utils.stringSplit(regAndArgs[1], \",\");\n        obj[regAndArgs[0]] = args;\n      }\n    });\n    return obj;\n  },\n  // 字符串str按照sep分割为数组，并清理掉数组结果中的空白项。\n  stringSplit: function stringSplit(str, sep) {\n    if (!str || str.constructor !== String || !sep || sep.constructor !== String) {\n      return [];\n    }\n\n    var ary = str.split(sep);\n    ary = ary.map(function (p) {\n      return p.trim();\n    });\n    ary = ary.trim();\n    return ary;\n  },\n  // 获取控件是否添加必填校验\n  addRequiredOrNot: function addRequiredOrNot(permission, validate) {\n    if (permission !== 'b') {\n      return validate;\n    }\n\n    if (validate === undefined || validate === null) {\n      validate = \"\";\n    }\n\n    return utils.mergeValidate(\"required\", validate);\n  },\n  // 格式化日期时间\n  formatDate: function formatDate(value, type) {\n    var date = null;\n\n    if (!value) {\n      return date;\n    }\n\n    if (value.constructor == Date && !isNaN(value.getTime())) {\n      date = value;\n    } else if (value.constructor == String || value.constructor == Number) {\n      date = new Date(value);\n    } else {\n      throw \"格式化日期时，传入的数据格式不正确。\";\n    }\n\n    var y = date.getFullYear();\n    var MM = date.getMonth() + 1;\n    MM = MM < 10 ? '0' + MM : MM;\n    var d = date.getDate();\n    d = d < 10 ? '0' + d : d;\n    var h = date.getHours();\n    h = h < 10 ? '0' + h : h;\n    var m = date.getMinutes();\n    m = m < 10 ? '0' + m : m;\n    var s = date.getSeconds();\n    s = s < 10 ? '0' + s : s;\n\n    if (type == 'year') {\n      return y;\n    } else if (type == 'yearMonth') {\n      return y + '-' + MM;\n    } else if (type == 'date') {\n      return y + '-' + MM + '-' + d;\n    } else if (type == 'dateTime') {\n      return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;\n    }\n  },\n  // 格式化日期 \n  formatDateYear: function formatDateYear(value) {\n    var date = new Date(value);\n    var y = date.getFullYear();\n    var MM = date.getMonth() + 1;\n    MM = MM < 10 ? '0' + MM : MM;\n    var d = date.getDate();\n    d = d < 10 ? '0' + d : d;\n    return y + '-' + MM + '-' + d;\n  },\n  // 日期1是否早于日期2\n  dateIsBefore: function dateIsBefore(dateOne, dateTwo, canEquals) {\n    if (!dateOne || !dateTwo) {\n      return true;\n    }\n\n    var date1 = new Date(dateOne).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + dateOne).getTime();\n    var date2 = new Date(dateTwo).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + dateTwo).getTime();\n\n    if (!canEquals) {\n      //大于。v2>v1 。\n      if (date2 > date1) {\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      //大于等于。v2>=v1 。只要v1不大于v2即可\n      if (date1 > date2) {\n        return false;\n      } else {\n        return true;\n      }\n    }\n  },\n  // 日期计算，不传单位时，默认以'天'为单位计算\n  dateCalc: function dateCalc(startDate, endDate, op) {\n    if (!startDate || !endDate || startDate.length == 0 || endDate.length == 0) {\n      return 0;\n    }\n\n    if (!op || op.constructor != String) {\n      op = \"day\";\n    }\n\n    var opAry = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\n    if (opAry.indexOf(op) == -1) {\n      throw \"\\u8BA1\\u7B97\\u65E5\\u671F\\u7684\\u5355\\u4F4D\\u53EA\\u80FD\\u4ECE\".concat(opAry, \"\\u4E2D\\u9009\\u62E9\");\n    }\n\n    var date1 = new Date(Date.parse(startDate.replace(/-/g, \"/\"))).getTime();\n    var date2 = new Date(Date.parse(endDate.replace(/-/g, \"/\"))).getTime();\n\n    if (!Number.isInteger(date1) || !Number.isInteger(date2)) {\n      var now = new Date();\n      var nowStr = now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate();\n\n      if (!Number.isInteger(date1)) {\n        date1 = new Date(\"\".concat(nowStr, \" \").concat(startDate)).getTime();\n      }\n\n      if (!Number.isInteger(date1)) {\n        date2 = new Date(\"\".concat(nowStr, \" \").concat(endDate)).getTime();\n      }\n\n      if (!Number.isInteger(date1) || !Number.isInteger(date2)) {\n        return 0;\n      }\n    }\n\n    var res = 0;\n    var days = date2 - date1;\n\n    switch (op) {\n      case \"year\":\n        res = parseInt(days / (1000 * 60 * 60 * 24 * 30 * 12));\n        break;\n\n      case \"month\":\n        res = parseInt(days / (1000 * 60 * 60 * 24 * 30));\n        break;\n\n      case \"day\":\n        res = parseInt(days / (1000 * 60 * 60 * 24));\n        break;\n\n      case \"hour\":\n        res = parseInt(days / (1000 * 60 * 60));\n        break;\n\n      case \"minute\":\n        res = parseInt(days / (1000 * 60));\n        break;\n\n      case \"second\":\n        res = parseInt(days / 1000);\n    }\n\n    return res;\n  },\n  nest2tile: function nest2tile(arr, childrenKey, obtainChildren) {\n    var _ref;\n\n    if (!childrenKey) {\n      childrenKey = \"children\";\n    }\n\n    return (_ref = []).concat.apply(_ref, _toConsumableArray(arr.map(function (item) {\n      var _ref2;\n\n      var _item = _objectSpread({}, item);\n\n      if (obtainChildren == undefined || obtainChildren == false) {\n        delete _item[childrenKey];\n      }\n\n      return (_ref2 = []).concat.apply(_ref2, [_item].concat(_toConsumableArray(utils.nest2tile(item[childrenKey]))));\n    })));\n  },\n  // 平铺结构转嵌套结构\n  tile2nest: function tile2nest(array, key, pKey, childrenKey) {\n    if (!array || array.constructor !== Array) {\n      return array;\n    } // 复制一份，避免修改原始数组\n\n\n    var ary = _toConsumableArray(array);\n\n    key = key || \"id\";\n    pKey = pKey || \"parentId\";\n    childrenKey = childrenKey || \"children\"; // 定义一个待移除数组\n\n    var ary2remove = [];\n    ary.map(function (item) {\n      if (item[key] !== item[pKey]) {\n        // 找父节点\n        var p = ary.filter(function (c) {\n          return c[key] === item[pKey];\n        });\n\n        if (p && p.length == 1) {\n          p[0][childrenKey] = p[0][childrenKey] || []; // 将子节点放到父节点中\n\n          p[0][childrenKey].push(item);\n          ary2remove.push(item[key]);\n        }\n      }\n    }); // 遍历移除待删除对象\n\n    ary2remove.map(function (item) {\n      ary = ary.filter(function (c) {\n        return c[key] !== item;\n      });\n    });\n    return ary;\n  },\n  // 获取控件所在表单对应的实例对象\n  getOnlineFormInstance: function getOnlineFormInstance(instance) {\n    if (instance == instance.$root) {\n      return instance;\n    }\n\n    if (!instance) {\n      throw \"VueComponent实例为空.\";\n    }\n\n    if (instance.hasOwnProperty(\"watchMap\")) {\n      return instance;\n    } else if (instance.$parent) {\n      return utils.getOnlineFormInstance(instance.$parent);\n    }\n  },\n  // 获取子表每一行所在的作用域元素及索引\n  getSubScopeElAndIndex: function getSubScopeElAndIndex(el) {\n    var subScopeEl = utils.getParentElementByAttribute(el, \"data-subname\");\n\n    if (!subScopeEl) {\n      return {\n        subScopeEl: null,\n        index: null\n      };\n    }\n\n    var index = subScopeEl.dataset[\"index\"];\n\n    if (index === undefined) {\n      throw \"要计算的子表行未获取到index属性.\";\n    }\n\n    index = Number.parseInt(index);\n    return {\n      subScopeEl: subScopeEl,\n      index: index\n    };\n  },\n  // 在子表指定行中通过v-model表达式获取input对应的vue实例\n  getSubInputScopeByModelExpression: function getSubInputScopeByModelExpression(subScopeEl, expression) {\n    var inputAry = subScopeEl.getElementsByClassName(\"inputs\");\n    var result = null;\n\n    for (var i = 0, c; c = inputAry[i++];) {\n      var expressionName = c.__vue__.$vnode.data.model.expression; // 兼容front端使用\n\n      if (c.__vue__.$vnode && c.__vue__.$vnode.componentOptions && c.__vue__.$vnode.componentOptions.propsData && c.__vue__.$vnode.componentOptions.propsData.modelExpression) {\n        expressionName = c.__vue__.$vnode.componentOptions.propsData.modelExpression;\n      }\n\n      if (c && c.__vue__ && c.__vue__.$vnode.data.model && expressionName === expression) {\n        result = c.__vue__;\n      }\n    }\n\n    return result;\n  },\n  // 获取在线表单的json格式字符串的表单数据(validate参数决定是否需要对表单进行验证)\n  validateForm: function validateForm(instance, scopeName) {\n    return new Promise(function (resolve, reject) {\n      instance.$root.$validator.validateAll(scopeName).then(function (result) {\n        if (result) {\n          resolve(result);\n        } else {\n          reject(instance.$root.$validator.errors.items);\n        }\n      });\n    });\n  },\n  // 获取指定dom元素的父级中具有指定属性的dom元素\n  getParentElementByAttribute: function getParentElementByAttribute(el, attribute) {\n    if (el === null || el === undefined) {\n      return null;\n    }\n\n    if (!el.hasAttribute || typeof el.hasAttribute != 'function') {\n      throw \"传入的元素el不能为空且必须为HTMLHtmlElement类型.\";\n    }\n\n    if (!attribute || attribute.constructor !== String) {\n      throw \"传入的属性attribute不能为空且必须为String类型.\";\n    }\n\n    if (el.hasAttribute(attribute)) {\n      return el;\n    } else if (el.tagName === 'HTML') {\n      return null;\n    } else {\n      return utils.getParentElementByAttribute(el.parentElement, attribute);\n    }\n  },\n  // 从父级dom元素中获取指定属性的值\n  getSomeAttributeFromParentElement: function getSomeAttributeFromParentElement(el, attribute) {\n    var pEl = utils.getParentElementByAttribute(el, attribute);\n\n    if (pEl && pEl.getAttribute && pEl.getAttribute.constructor === Function) {\n      return pEl.getAttribute(attribute);\n    }\n\n    return null;\n  },\n  // 将子表属性路径转换为完整的属性路径，例如：item.name => data.sub[0].name\n  getWholePathOfSub: function getWholePathOfSub(subPath, mainPath, index) {\n    if (!subPath || !mainPath || index === null || !Number.isInteger(index)) {\n      return null;\n    }\n\n    var match = subPath.split('.');\n\n    if (match && match.length > 1) {\n      return \"\".concat(mainPath, \"[\").concat(index, \"].\").concat(match[match.length - 1]);\n    }\n\n    return null;\n  },\n  // 通过路径取得对象中的属性\n  getValueByPath: function getValueByPath(obj, path, subIndex) {\n    if (!obj || !path || path.constructor != String) {\n      return null;\n    }\n\n    if (!/^\\w?.*[\\w|\\]]$/.test(path)) {\n      return null;\n    }\n\n    var pathAry = path.split(\".\");\n\n    if (pathAry.length == 1) {\n      return obj[path];\n    } else if (pathAry.length > 1) {\n      var ret = obj;\n\n      for (var i = 0; i < pathAry.length; i++) {\n        if (ret === null || ret === undefined) {\n          return null;\n        }\n\n        var key = pathAry[i];\n        var match = /^(\\w+)\\[(\\d+)\\]$/.exec(key);\n\n        if (match) {\n          ret = ret[match[1]][match[2]];\n        } else if (ret && ret.constructor === Array) {\n          var index = 0;\n\n          if (subIndex != null && subIndex != undefined) {\n            var preIndex = Number.parseInt(subIndex);\n\n            if (!isNaN(preIndex)) {\n              index = preIndex;\n            }\n          }\n\n          ret = ret[index][key];\n        } else {\n          ret = ret[key];\n        }\n      }\n\n      return ret;\n    }\n\n    return null;\n  },\n  // 通过路径设置对象中的属性\n  setValueByPath: function setValueByPath(obj, path, value, subIndex) {\n    if (!obj || !path || path.constructor != String) {\n      return;\n    }\n\n    if (!/^\\w?.*[\\w|\\]]$/.test(path)) {\n      return;\n    }\n\n    var pathAry = path.split(\".\");\n\n    if (pathAry.length == 1) {\n      obj[path] = value;\n    } else if (pathAry.length > 1) {\n      var ret = obj;\n\n      for (var i = 0; i < pathAry.length; i++) {\n        var key = pathAry[i];\n        var match = /^(\\w+)\\[(\\d+)\\]$/.exec(key);\n\n        if (i == pathAry.length - 1) {\n          if (match) {\n            ret[match[1]][match[2]] = value;\n          } else if (ret && ret.constructor === Array) {\n            var index = 0;\n\n            if (subIndex != null && subIndex != undefined) {\n              var preIndex = Number.parseInt(subIndex);\n\n              if (!isNaN(preIndex)) {\n                index = preIndex;\n              }\n            }\n\n            ret[index][key] = value;\n          } else {\n            ret[key] = value;\n          }\n        } else {\n          if (match) {\n            ret = ret[match[1]][match[2]];\n          } else {\n            ret = ret[key];\n          }\n        }\n      }\n    }\n  },\n\n  /**\r\n  * 将字符串转为json对象。\r\n  * @param jsonStr\r\n  * @param type  可不填写parseToJson\r\n  * @returns\r\n  */\n  parseToJson: function parseToJson(jsonStr, type) {\n    type = type || 1;\n    if (!jsonStr || jsonStr === \"\" || type > 3) return null;\n\n    try {\n      switch (type) {\n        case 1:\n          return JSON.parse(jsonStr);\n          break;\n\n        case 2:\n          return eval(\"(\".concat(jsonStr, \")\"));\n          break;\n\n        default:\n          throw \"解析json对象错误\";\n          break;\n      }\n    } catch (e) {\n      return utils.parseToJson(jsonStr, type + 1);\n    }\n  },\n\n  /**\r\n  * 将数字转换成人名币大写。\r\n  * \r\n  * @param currencyDigits\r\n  * @returns\r\n  */\n  convertCurrency: function convertCurrency(currencyDigits) {\n    var MAXIMUM_NUMBER = 99999999999.99;\n    var CN_ZERO = \"零\";\n    var CN_ONE = \"壹\";\n    var CN_TWO = \"贰\";\n    var CN_THREE = \"叁\";\n    var CN_FOUR = \"肆\";\n    var CN_FIVE = \"伍\";\n    var CN_SIX = \"陆\";\n    var CN_SEVEN = \"柒\";\n    var CN_EIGHT = \"捌\";\n    var CN_NINE = \"玖\";\n    var CN_TEN = \"拾\";\n    var CN_HUNDRED = \"佰\";\n    var CN_THOUSAND = \"仟\";\n    var CN_TEN_THOUSAND = \"万\";\n    var CN_HUNDRED_MILLION = \"亿\";\n    var CN_SYMBOL = \"\";\n    var CN_DOLLAR = \"元\";\n    var CN_TEN_CENT = \"角\";\n    var CN_CENT = \"分\";\n    var CN_INTEGER = \"整\";\n    var integral;\n    var decimal;\n    var outputCharacters;\n    var parts;\n    var digits, radices, bigRadices, decimals;\n    var zeroCount;\n    var i, p, d;\n    var quotient, modulus;\n    currencyDigits = currencyDigits.toString();\n\n    if (currencyDigits == \"\") {\n      return \"\";\n    }\n\n    if (currencyDigits.match(/[^,.\\d]/) != null) {\n      return \"\";\n    }\n\n    if (currencyDigits.match(/^((\\d{1,3}(,\\d{3})*(.((\\d{3},)*\\d{1,3}))?)|(\\d+(.\\d+)?))$/) == null) {\n      return \"\";\n    }\n\n    currencyDigits = currencyDigits.replace(/,/g, \"\");\n    currencyDigits = currencyDigits.replace(/^0+/, \"\");\n\n    if (Number(currencyDigits) > MAXIMUM_NUMBER) {\n      return \"\";\n    }\n\n    parts = currencyDigits.split(\".\");\n\n    if (parts.length > 1) {\n      integral = parts[0];\n      decimal = parts[1];\n      decimal = decimal.substr(0, 2);\n    } else {\n      integral = parts[0];\n      decimal = \"\";\n    }\n\n    digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);\n    radices = new Array(\"\", CN_TEN, CN_HUNDRED, CN_THOUSAND);\n    bigRadices = new Array(\"\", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);\n    decimals = new Array(CN_TEN_CENT, CN_CENT);\n    outputCharacters = \"\";\n\n    if (Number(integral) > 0) {\n      zeroCount = 0;\n\n      for (i = 0; i < integral.length; i++) {\n        p = integral.length - i - 1;\n        d = integral.substr(i, 1);\n        quotient = p / 4;\n        modulus = p % 4;\n\n        if (d == \"0\") {\n          zeroCount++;\n        } else {\n          if (zeroCount > 0) {\n            outputCharacters += digits[0];\n          }\n\n          zeroCount = 0;\n          outputCharacters += digits[Number(d)] + radices[modulus];\n        }\n\n        if (modulus == 0 && zeroCount < 4) {\n          outputCharacters += bigRadices[quotient];\n        }\n      }\n\n      outputCharacters += CN_DOLLAR;\n    }\n\n    if (decimal != \"\") {\n      for (i = 0; i < decimal.length; i++) {\n        d = decimal.substr(i, 1);\n\n        if (d != \"0\") {\n          outputCharacters += digits[Number(d)] + decimals[i];\n        }\n      }\n    }\n\n    if (outputCharacters == \"\") {\n      outputCharacters = CN_ZERO + CN_DOLLAR;\n    }\n\n    if (decimal == \"\") {\n      outputCharacters += CN_INTEGER;\n    }\n\n    outputCharacters = CN_SYMBOL + outputCharacters;\n    return outputCharacters;\n  },\n\n  /**\r\n   * 通过name获取页面url地址参数\r\n   * @param name\r\n   * @returns\r\n   * \r\n   */\n  getUrlKey: function getUrlKey(name) {\n    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, \"\"])[1].replace(/\\+/g, '%20')) || null;\n  },\n  // 返回调整顺序后的数组 part：数组中的一个或多个元素， direct：调整的方向  up：向上  down：向下\n  arrayMove: function arrayMove(ary, part, direct) {\n    direct = direct || \"down\";\n\n    if (!part || part.constructor !== Object && part.constructor !== Array) {\n      return ary;\n    }\n\n    if (part.constructor === Object) {\n      part = [part];\n    }\n\n    if (direct == \"up\") {\n      part.forEach(function (m) {\n        var index = ary.indexOf(m, 1);\n\n        if (index > 0) {\n          var newAry = _toConsumableArray(ary);\n\n          newAry[index - 1] = ary[index];\n          newAry[index] = ary[index - 1];\n          ary = newAry;\n        }\n      });\n    } else if (direct == \"down\") {\n      for (var i = part.length - 1, m; m = part[i--];) {\n        var index = ary.indexOf(m, 0);\n\n        if (index > -1 && index < ary.length - 1) {\n          var newAry = _toConsumableArray(ary);\n\n          newAry[index + 1] = ary[index];\n          newAry[index] = ary[index + 1];\n          ary = newAry;\n        }\n      }\n    }\n\n    return ary;\n  },\n  // 通过配置中指定的key所对应的属性路径在当前表单中获取对应的值，支持通过data.main.name 或者是 item.name来分别获取主表数据及子表数据的情况\n  getValueByConfigKey: function getValueByConfigKey(inst, config, key) {\n    if (!config.hasOwnProperty(key)) {\n      throw \"config\\u5BF9\\u8C61\\u4E2D\\u672A\\u627E\\u5230\\u5C5E\\u6027\".concat(key);\n    }\n\n    var keyPath = config[key]; // 获取当前组件所在的表单\n\n    var formInst = utils.getOnlineFormInstance(inst.$parent); // 获取当前组件是否在子表中的某一行\n\n    var _utils$getSubScopeElA = utils.getSubScopeElAndIndex(inst.$el),\n        subScopeEl = _utils$getSubScopeElA.subScopeEl,\n        index = _utils$getSubScopeElA.index;\n\n    if (subScopeEl) {\n      //判断是否有孙表\n      var paths = subScopeEl.dataset[\"subname\"];\n\n      if (paths.split(\".\").length == 4 && paths.indexOf(\"[\") == -1) {\n        //孙表回填路径\n        paths = paths.split(\".\")[0] + \".\" + paths.split(\".\")[1] + \".\" + paths.split(\".\")[2] + \"[\" + parseInt(utils.getSomeAttributeFromParentElement(inst.$el, \"sub-index\")) + \"]\" + \".\" + paths.split(\".\")[3];\n      } // 将item.name这样的路径替换为data.sub[0].name这样的全路径格式\n\n\n      var wholeKeyPath = utils.getWholePathOfSub(keyPath, paths, index);\n      return utils.getValueByPath(formInst, wholeKeyPath);\n    } else {\n      return utils.getValueByPath(formInst, keyPath);\n    }\n  },\n  // 通过配置中指定的key来设置值到对应的属性路径上，支持设置主表数据data.main.name 或设置子表数据item.name\n  setValueByConfigKey: function setValueByConfigKey(inst, config, key, value) {\n    if (!config.hasOwnProperty(key)) {\n      return;\n    }\n\n    var keyPath = config[key]; // 获取当前组件所在的表单\n\n    var formInst = utils.getOnlineFormInstance(inst.$parent); // 获取当前组件是否在子表中的某一行\n\n    var _utils$getSubScopeElA2 = utils.getSubScopeElAndIndex(inst.$el),\n        subScopeEl = _utils$getSubScopeElA2.subScopeEl,\n        index = _utils$getSubScopeElA2.index;\n\n    if (subScopeEl) {\n      //判断是否有孙表\n      var paths = subScopeEl.dataset[\"subname\"];\n\n      if (paths.split(\".\").length == 4 && paths.indexOf(\"[\") == -1) {\n        //孙表回填路径\n        paths = paths.split(\".\")[0] + \".\" + paths.split(\".\")[1] + \".\" + paths.split(\".\")[2] + \"[\" + parseInt(utils.getSomeAttributeFromParentElement(inst.$el, \"sub-index\")) + \"]\" + \".\" + paths.split(\".\")[3];\n      } // 将item.name这样的路径替换为data.sub[0].name这样的全路径格式\n\n\n      var wholeKeyPath = utils.getWholePathOfSub(keyPath, paths, index);\n      utils.setValueByPath(formInst, wholeKeyPath, value);\n    } else {\n      utils.setValueByPath(formInst, keyPath, value);\n    }\n  },\n  // 判断两个对象是否相等（props为属性数组，有传入时，只比对传入的属性是否相等）\n  objectEquals: function objectEquals(obj1, obj2, props) {\n    if (!props || props.constructor !== Array) {\n      props = [];\n    }\n\n    if (!obj1 || !obj2) {\n      return obj1 === obj2;\n    }\n\n    for (var propName in obj1) {\n      if (props.length > 0 && props.indexOf(propName) === -1) {\n        continue;\n      }\n\n      if (obj1.hasOwnProperty(propName) != obj2.hasOwnProperty(propName)) {\n        return false;\n      } else if (_typeof(obj1[propName]) != _typeof(obj2[propName])) {\n        return false;\n      }\n    }\n\n    for (var propName in obj2) {\n      if (props.length > 0 && props.indexOf(propName) === -1) {\n        continue;\n      }\n\n      if (obj1.hasOwnProperty(propName) != obj2.hasOwnProperty(propName)) {\n        return false;\n      } else if (_typeof(obj1[propName]) != _typeof(obj2[propName])) {\n        return false;\n      }\n\n      if (!obj1.hasOwnProperty(propName)) {\n        continue;\n      }\n\n      if (obj1[propName] instanceof Array && obj2[propName] instanceof Array) {\n        if (!utils.arrayEquals(obj1[propName], obj2[propName])) {\n          return false;\n        }\n      } else if (obj1[propName] instanceof Object && obj2[propName] instanceof Object) {\n        if (!utils.objectEquals(obj1[propName], obj2[propName])) {\n          return false;\n        }\n      } else if (obj1[propName] != obj2[propName]) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n  // 判断两个数组是否相等，支持数组中元素为对象时的深度对比\n  arrayEquals: function arrayEquals(ary1, ary2) {\n    if (!ary1 || !ary2) {\n      return ary1 === ary2;\n    }\n\n    if (ary1.length != ary2.length) {\n      return false;\n    }\n\n    for (var i = 0, l = ary1.length; i < l; i++) {\n      if (ary1[i] instanceof Array && ary2[i] instanceof Array) {\n        if (!utils.arrayEquals(ary1[i], ary2[i])) {\n          return false;\n        }\n      } else if (ary1[i] instanceof Object && ary2[i] instanceof Object) {\n        if (!utils.objectEquals(ary1[i], ary2[i])) {\n          return false;\n        }\n      } else if (ary1[i] != ary2[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n  // 以第一行文本的缩进空格数为基准，后续的每一行都去掉这个基准所对应的空格。\n  trimEachLine: function trimEachLine(text) {\n    if (!text || text.constructor != String || text.indexOf(\"\\n\") == -1) {\n      return text;\n    }\n\n    var ary = text.split(\"\\n\"),\n        totem = 0;\n    return ary.reduce(function (prev, cur, index) {\n      if (index == 1) {\n        var match = /^(\\s+).*$/.exec(cur);\n        match && match.length == 2 && (totem = match[1].length);\n      }\n\n      return prev + \"\\n\" + cur.slice(totem, cur.length);\n    });\n  },\n  // 获取字符串的哈希编码\n  hashCode: function hashCode(text) {\n    var hash = 0,\n        char;\n    if (text.length == 0) return hash;\n\n    for (var i = 0; i < text.length; i++) {\n      char = text.charCodeAt(i);\n      hash = (hash << 5) - hash + char;\n      hash = hash & hash;\n    }\n\n    return hash;\n  }\n}; // 在数组上扩展一个删除指定项的方法\n\nArray.prototype.remove = function (item) {\n  var index = this.findIndex(function (v) {\n    return v === item;\n  });\n\n  if (index > -1) {\n    this.splice(index, 1);\n  }\n}; // 清空数组\n\n\nArray.prototype.empty = function () {\n  this.splice(0, this.length);\n}; // 在数组上扩展一个去重的方法\n\n\nArray.prototype.unique = function (arg) {\n  var res = new Map();\n  return this.filter(function (m) {\n    if (arg) {\n      return !res.has(m[arg]) && res.set(m[arg], 1);\n    } else {\n      return !res.has(m) && res.set(m, 1);\n    }\n  });\n}; // 去除数组中的空字符串选项\n\n\nArray.prototype.trim = function () {\n  return this.filter(function (m) {\n    return m !== '';\n  });\n}; // 按照数组中的指定key将数组进行分组\n\n\nArray.prototype.groupByKey = function (key) {\n  var res = {};\n  this.forEach(function (m) {\n    var group = res[m[key]];\n\n    if (!group) {\n      group = [];\n      res[m[key]] = group;\n    }\n\n    group.push(m);\n  });\n  return res;\n}; // 按照数组中的指定key将数组进行分组\n\n\nArray.prototype.groupByKey = function (key) {\n  var res = {};\n  this.forEach(function (m) {\n    var group = res[m[key]];\n\n    if (!group) {\n      group = [];\n      res[m[key]] = group;\n    }\n\n    group.push(m);\n  });\n  return res;\n}; // 将数组对象中的某一个属性值单独抽取出来成为一个新的数组  [{id:'1',name:'苹果'},{id:'2',name:'香蕉'}].extractByKey(\"id\") ==> ['1','2']\n\n\nArray.prototype.extractByKey = function (key) {\n  var set = new Set();\n  this.forEach(function (m) {\n    if (key && m[key]) {\n      set.add(m[key]);\n    }\n  });\n  return Array.from(set);\n};\n/**\r\n * 日期格式化。\r\n * 日期格式：\r\n * yyyy，yy 年份\r\n * MM 大写表示月份\r\n * dd 表示日期\r\n * hh 表示小时\r\n * mm 表示分钟\r\n * ss 表示秒\r\n * q  表示季度\r\n * 实例如下：\r\n * var now = new Date(); \r\n * var nowStr = now.format(\"yyyy-MM-dd hh:mm:ss\"); \r\n */\n\n\nDate.prototype.format = function (format) {\n  var o = {\n    \"M+\": this.getMonth() + 1,\n    //month \n    \"d+\": this.getDate(),\n    //day \n    \"h+\": this.getHours(),\n    //hour \n    \"H+\": this.getHours(),\n    //hour\n    \"m+\": this.getMinutes(),\n    //minute \n    \"s+\": this.getSeconds(),\n    //second \n    \"q+\": Math.floor((this.getMonth() + 3) / 3),\n    //quarter \n    \"S\": this.getMilliseconds() //millisecond \n\n  };\n\n  if (/(y+)/.test(format)) {\n    format = format.replace(RegExp.$1, (this.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n  }\n\n  for (var k in o) {\n    if (new RegExp(\"(\" + k + \")\").test(format)) {\n      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : (\"00\" + o[k]).substr((\"\" + o[k]).length));\n    }\n  }\n\n  return format;\n};\n\nexport default utils;",null]}