{"remainingRequest":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\bizComponents\\utils.js","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\bizComponents\\utils.js","mtime":1675071991631},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["import \"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.regexp.replace\";\nimport \"core-js/modules/es6.number.parse-int\";\nimport \"core-js/modules/es7.array.includes\";\nimport \"core-js/modules/es6.string.includes\";\nimport _toConsumableArray from \"D:/jenkins/workspace/xq-web-bpm/node_modules/@babel/runtime/helpers/esm/toConsumableArray\";\nimport \"core-js/modules/es6.number.constructor\";\nimport \"core-js/modules/web.dom.iterable\";\nimport \"core-js/modules/es6.regexp.to-string\";\nimport \"core-js/modules/es6.regexp.split\";\nimport { Message, MessageBox, Notification } from 'element-ui';\nvar closeAllNotificationFlag = false; //是否隐藏感叹号校验提示\n\nvar notifications = {}; //用来获取弹窗的实例，以对对应弹窗进行操作\n\nvar utils = {\n  //根据传入的值和数组进行比较，相等返回该数据个某条数据\n  indexOfList: function indexOfList(list, key, value) {\n    for (var i = 0; i < list.length; i++) {\n      if (list[i][key] == value) {\n        return list[i];\n      }\n    }\n  },\n  //字节数转KB或者MB\n  bigDecimal: function bigDecimal(bytes) {\n    var returnValue = bytes / (1024 * 1024);\n\n    if (returnValue > 1) {\n      return returnValue.toFixed(2) + \"M\";\n    } else {\n      returnValue = bytes / 1024;\n      return returnValue.toFixed(0) + \"KB\";\n    }\n  },\n  //获取指定字符后面所有字符\n  substringType: function substringType(str, type) {\n    var returnValue = str.split(\".\");\n    return returnValue[returnValue.length - 1];\n  },\n  // 获取随机的名称\n  getName: function getName() {\n    return Math.random().toString(36).substr(2);\n  },\n  // 获取控件是否可编辑\n  getWriteable: function getWriteable(permission) {\n    if (permission === 'w' || permission === 'b') {\n      return true;\n    }\n\n    return false;\n  },\n  // 获取控件是否添加必填校验\n  addRequiredOrNot: function addRequiredOrNot(permission, validate, linkageValidate, _this) {\n    //判断是否有联动校验\n    if (linkageValidate.length > 0) {\n      linkageValidate.forEach(function (ele) {\n        if (ele && ele.validate && \"data.\" + ele.target == _this.atter) {\n          validate = ele.validate;\n        }\n      });\n    }\n\n    if (permission !== 'b') {\n      return validate;\n    } //如果表单授权为某控件加了必填则必填\n\n\n    if (permission === 'b' && validate && !validate.required && validate.constructor === Object) {\n      validate.required = true;\n    }\n\n    if (validate === undefined || validate === null) {\n      validate = \"required\";\n    } else if (validate.constructor === String) {\n      var ary = validate.split(\"|\");\n\n      if (!ary.some(function (item) {\n        return item === \"required\";\n      })) {\n        ary.splice(0, 0, \"required\");\n        validate = ary.join(\"|\");\n      }\n    } else if (validate.constructor === Object) {\n      validate = Object.assign({\n        required: true\n      }, validate);\n    } else {\n      throw \"validate不是允许的类型\";\n    }\n\n    return validate;\n  },\n  // 格式化日期\n  formatDate: function formatDate(value) {\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    return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;\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  // 比较2个日期\n  daysBetween: function daysBetween(DateOne, DateTwo, notSupportEquals) {\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 (notSupportEquals) {\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  dateCalc: function dateCalc(startDate, endDate, op) {\n    if (!startDate || !endDate || startDate.length == 0 || endDate.length == 0) {\n      return 0;\n    }\n\n    if (op.legend == 0) {\n      op = \"day\";\n    }\n\n    var date1 = new Date(startDate).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + startDate).getTime();\n    var date2 = new Date(endDate).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + endDate).getTime();\n    var res = 0;\n    var days = date2 - date1;\n\n    switch (op) {\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      default:\n        res = parseInt(days / 1000);\n    }\n\n    return res;\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].children = p[0].children || []; // 将子节点放到父节点中\n\n          p[0].children.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  getAndValidPath: function getAndValidPath(obj, key) {\n    if (!obj || obj.constructor != Object || !key || key.constructor != String) {\n      return null;\n    }\n\n    if (!obj.hasOwnProperty(key)) {\n      return null;\n    }\n\n    var path = obj[key];\n\n    if (/^\\w+.*\\w+$/.test(path)) {\n      return path;\n    } else {\n      return null;\n    }\n  },\n  // 获取Vue实例中指定className的父实例\n  getParentInstanceByClassName: function getParentInstanceByClassName(instance, className) {\n    if (!instance) {\n      throw \"VueComponent实例为空.\";\n    }\n\n    if (instance.$el.className && instance.$el.className.indexOf(className) > -1) {\n      return instance;\n    } else if (instance.$root && instance.$root._uid == instance._uid) {\n      throw \"\\u67E5\\u627EVueComponent\\u5B9E\\u4F8B\\u6811\\u65F6\\u627E\\u5230\\u6839\\u8282\\u70B9\\u90FD\\u672A\\u627E\\u5230className\\u4E3A\".concat(className, \"\\u7684\\u5B9E\\u4F8B.\");\n    } else if (instance.$parent) {\n      return utils.getParentInstanceByClassName(instance.$parent, className);\n    }\n  },\n  // 获取控件所在表单对应的实例对象\n  getOnlineFormInstance: function getOnlineFormInstance(instance) {\n    if (!instance) {\n      throw \"VueComponent实例为空.\";\n    }\n\n    if (instance.$el.getAttribute && instance.$el.getAttribute(\"name\") === 'online-form') {\n      return instance;\n    } else if (instance.$root && instance.$root._uid == instance._uid) {\n      throw \"\\u67E5\\u627EVueComponent\\u5B9E\\u4F8B\\u6811\\u65F6\\u627E\\u5230\\u6839\\u8282\\u70B9\\u90FD\\u672A\\u627E\\u5230name\\u4E3Aonline-form\\u7684\\u5B9E\\u4F8B.\";\n    } else if (instance.$parent) {\n      return utils.getOnlineFormInstance(instance.$parent);\n    }\n  },\n  // 根据自定义标签名(组件名)获取某个Vue实例\n  getInstanceByTag: function getInstanceByTag(instance, args) {\n    if (!instance) {\n      throw \"VueComponent实例为空.\";\n    }\n\n    if (args.includes(instance.$options._componentTag)) {\n      return instance;\n    } else if (instance.$root && instance.$root._uid == instance._uid) {\n      throw \"\\u67E5\\u627EVueComponent\\u5B9E\\u4F8B\\u6811\\u65F6\\u627E\\u5230\\u6839\\u8282\\u70B9\\u90FD\\u672A\\u627E\\u5230name\\u4E3Atag\\u7684\\u5B9E\\u4F8B.\";\n    } else if (instance.$parent) {\n      return utils.getInstanceByTag(instance.$parent, args);\n    }\n  },\n  // 获取Vue实例及父级实例中有reload方法的实例\n  getReloadMethod: function getReloadMethod(instance) {\n    if (!instance) {\n      return null;\n    }\n\n    if (instance.reload && instance.reload.constructor === Function) {\n      return instance;\n    } else if (instance.$root && instance.$root._uid == instance._uid) {\n      return null;\n    } else if (instance.$parent) {\n      return utils.getReloadMethod(instance.$parent);\n    }\n  },\n  // 重新加载当前页面(不会刷新整个页面，只刷新router-view部分)\n  reload: function reload() {\n    var viewElementAry = document.getElementsByName(\"app-base-main\");\n\n    if (!viewElementAry || viewElementAry.length != 1) {\n      window.location.reload();\n    } else {\n      var viewInst = viewElementAry[0].__vue__;\n\n      if (!viewInst || !viewInst._isVue) {\n        window.location.reload();\n      }\n\n      var r = utils.getReloadMethod(viewInst);\n\n      if (r) {\n        r.reload();\n      } else {\n        window.location.reload();\n      }\n    }\n  },\n  // 获取在线表单的json格式字符串的表单数据(validate参数决定是否需要对表单进行验证)\n  getOnlineFormData: function getOnlineFormData(validate) {\n    return new Promise(function (resolve, reject) {\n      var formElementAry = document.getElementsByName(\"online-form\");\n\n      if (!formElementAry || formElementAry.length < 1) {\n        var frmFrame = $('#frmFrame');\n\n        if (frmFrame && frmFrame.length > 0) {\n          var frm = frmFrame[0];\n          var isCallBack = false;\n          var cancelTimeout = false;\n          var isTimeOut = false; // 子页面是否收到了消息\n\n          var isRoger = false;\n          frm.contentWindow.postMessage(\"saveData\", '*');\n          window.addEventListener('message', function (e) {\n            if (e.data && e.data.constructor == Object) {\n              if (e.data.type == 'saveData' && !isCallBack) {\n                isCallBack = true;\n\n                if (e.data.state && !isTimeOut) {\n                  var iframeData = {\n                    businessKey: e.data.businessKey,\n                    sysCode: e.data.sysCode\n                  };\n\n                  if (e.data.vars) {\n                    iframeData.vars = e.data.vars;\n                  }\n\n                  resolve(iframeData);\n                }\n              } else if (e.data.type == 'cancelTimeout') {\n                cancelTimeout = true;\n              } else if (e.data.type == 'roger' && !isRoger) {\n                isRoger = true;\n              }\n            }\n          }); // 只要子页面引入了hotent.helper.js，父页面发送了消息后，子页面会马上回复`roger`。\n          // 这里设置0.5秒后未收到`roger`消息则认为子页面未引入hotent.helper.js，此时直接reject。\n\n          setTimeout(function () {\n            if (!isRoger) {\n              reject(6);\n            }\n          }, 500); // 设置10秒超时机制，如果超时则不再往下执行\n\n          setTimeout(function () {\n            if (!isCallBack && !cancelTimeout) {\n              isTimeOut = true;\n              reject(5);\n            }\n          }, 10000);\n        } else {\n          reject(1);\n        }\n      } else {\n        var frmInst = formElementAry[0].__vue__;\n\n        if (!frmInst || !frmInst._isVue) {\n          reject(2);\n        } //处理handsontable子表数据\n\n\n        var refs = frmInst.$refs[\"onlineForm\"].$refs;\n        var hotData = true;\n\n        if (refs) {\n          for (var ref in refs) {\n            if (refs.hasOwnProperty(ref) && ref.indexOf('hottable.') == 0) {\n              var refEle = refs[ref];\n              hotData = refEle.getHotTableData(true);\n\n              if (hotData && Array.isArray(hotData)) {\n                var names = ref.split('.');\n\n                if (hotData && Array.isArray(hotData)) {\n                  frmInst.data[names[1]][names[2]] = _toConsumableArray(hotData);\n                } else {\n                  frmInst.data[names[1]][names[2]] = [];\n                }\n              }\n            }\n          }\n        }\n\n        if (!validate) {\n          resolve(JSON.stringify(frmInst.data));\n          return;\n        }\n\n        frmInst.$root.$validator.validateAll(\"custom-form\").then(function (result) {\n          if (hotData === false) {\n            //hottable子表数据校验失败\n            reject(7);\n            return;\n          }\n\n          if (result) {\n            resolve(JSON.stringify(frmInst.data));\n          } else {\n            reject({\n              reason: 3,\n              errors: frmInst.$root.$validator.errors.items\n            });\n          }\n        });\n      }\n    });\n  },\n  // 获取表单数据失败的处理\n  handleGetFormDataReject: function handleGetFormDataReject(reason, needConfirm) {\n    return new Promise(function (resolve, reject) {\n      var errors = [];\n\n      if (reason && reason.constructor == Object) {\n        errors = reason.errors;\n        reason = reason.reason;\n      }\n\n      switch (reason) {\n        case 1:\n          Message.error(\"未获取到在线表单或者URL表单.\");\n          reject();\n          break;\n\n        case 2:\n          Message.error(\"使用了在线表单，但是表单为空或者加载失败.\");\n          reject();\n          break;\n\n        case 3:\n          var errorMsg = [];\n          errors && errors.forEach(function (e) {\n            var fieldLabel = \"\";\n\n            if (e.field) {\n              if (e.field.indexOf(\"-\") != -1) {\n                fieldLabel = e.field.substr(e.field.indexOf(\"-\") + 1);\n              } else {\n                fieldLabel = e.field;\n              }\n            }\n\n            errorMsg.push(\"\".concat(fieldLabel, \" \").concat(e.msg));\n          });\n\n          if (errorMsg.length > 0) {\n            if (document.getElementsByName(\"online-form\")[0]) {\n              var frmInst = document.getElementsByName(\"online-form\")[0].__vue__;\n\n              var jsonObj = frmInst.$refs.onlineForm.$refs;\n\n              for (var key in jsonObj) {\n                if (jsonObj[key].$el.textContent) {\n                  var textContent = jsonObj[key].$el.textContent;\n\n                  for (var i = 0; i < errorMsg.length; i++) {\n                    if (textContent.indexOf(errorMsg[i]) != -1) {\n                      document.getElementsByClassName(key)[0].style.color = \"red\";\n                      break;\n                    }\n                  }\n                }\n              }\n            }\n\n            utils.handleReject(errorMsg);\n          } else {\n            Message.warning(\"请正确的填写表单内容.\");\n          }\n\n          reject();\n          break;\n\n        case 5:\n          Message.error(\"URL表单处理业务数据超时.\");\n          reject();\n          break;\n\n        case 6:\n          if (needConfirm) {\n            MessageBox.confirm(\"URL表单页面未正确处理数据，是否仍然启动流程？\", {\n              type: \"warning\"\n            }).then(function () {\n              return resolve();\n            }).catch(function () {\n              return reject();\n            });\n          } else {\n            resolve();\n          }\n\n          break;\n\n        case 7:\n          //hottable子表数据校验失败。\n          reject();\n          break;\n\n        default:\n          Message.error(\"\\u83B7\\u53D6\\u8868\\u5355\\u6570\\u636E\\u65F6\\u53D1\\u751F\\u9884\\u671F\\u4E4B\\u5916\\u7684\\u5F02\\u5E38\\uFF0Creason:\".concat(reason));\n          reject();\n          break;\n      }\n    });\n  },\n  //关闭所有校验通知\n  closeAllNotification: function closeAllNotification() {\n    closeAllNotificationFlag = true;\n\n    for (var key in notifications) {\n      notifications[key].close();\n      delete notifications[key];\n    }\n  },\n  handleReject: function handleReject(errorMsg) {\n    utils.closeAllNotification();\n    closeAllNotificationFlag = false;\n    var notifi = Notification.error({\n      title: \"错误提示\",\n      dangerouslyUseHTMLString: true,\n      message: \"\\u8BF7\\u6B63\\u786E\\u7684\\u586B\\u5199\\u4EE5\\u4E0B\\u8868\\u5355\\u5185\\u5BB9\\uFF1A<br/>\".concat(errorMsg.join('<br/>')),\n      duration: 0,\n      onClose: function onClose() {\n        if (!closeAllNotificationFlag) {\n          setTimeout(function () {\n            var n = Notification.warning({\n              customClass: \"customClass\",\n              duration: 0,\n              showClose: false,\n              onClick: function onClick() {\n                n.close();\n                utils.handleReject(errorMsg);\n              }\n            });\n            notifications[n.id] = n;\n          }, 10);\n        }\n      }\n    });\n    notifications[notifi.id] = notifi;\n  },\n  // 获取指定dom元素的父级中具有指定属性的dom元素\n  getParentElementByAttribute: function getParentElementByAttribute(el, attribute) {\n    if (!el || !el.hasAttribute || el.hasAttribute.constructor !== 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  // 通过路径取得对象中的属性\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        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            obj.$set(ret[index], key, value); //ret[index][key] = value;\n          } else {\n            //ret[key] = value;\n            obj.$set(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    obj.$forceUpdate();\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 === \"\") return; //如果包含换行，下面解析json会报错，所以将换行替换为2个空格符\n\n    jsonStr = jsonStr.replace(/\\n/g, \"  \");\n\n    try {\n      switch (type) {\n        case 1:\n          return eval(\"(\" + jsonStr + \")\");\n          break;\n\n        case 4:\n          JSON.parse(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   * 数字格式转换成千分位\r\n   *@param{Object}num\r\n  */\n  thousandBit: function thousandBit(num) {\n    if ((num + \"\").trim() == \"\") {\n      return \"\";\n    }\n\n    if (isNaN(num)) {\n      return \"\";\n    }\n\n    num = num + \"\";\n\n    if (/^.*\\..*$/.test(num)) {\n      var pointIndex = num.lastIndexOf(\".\");\n      var intPart = num.substring(0, pointIndex);\n      var pointPart = num.substring(pointIndex + 1, num.length);\n      var intPart = intPart + \"\";\n      var re = /(-?\\d+)(\\d{3})/;\n\n      while (re.test(intPart)) {\n        intPart = intPart.replace(re, \"$1,$2\");\n      }\n\n      num = intPart + \".\" + pointPart;\n    } else {\n      num = num + \"\";\n      var re = /(-?\\d+)(\\d{3})/;\n\n      while (re.test(num)) {\n        num = num.replace(re, \"$1,$2\");\n      }\n    }\n\n    return num;\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  //选择器上下移\n  down: function down(ary, selectArr, this_) {\n    if (ary.length > 0 && selectArr.length > 0) {\n      var idx = selectArr.indexOf(ary[ary.length - 1]);\n\n      if (idx + 1 < selectArr.length) {\n        var t = selectArr[idx + 1];\n        selectArr[idx + 1] = selectArr[idx];\n        selectArr[idx] = t;\n        this_.calacInputSuffixHeight();\n        this_.syncInputValue();\n      }\n    }\n  },\n  up: function up(ary, selectArr, this_) {\n    if (ary.length > 0 && selectArr.length > 0) {\n      var idx = selectArr.indexOf(ary[ary.length - 1]);\n\n      if (idx != 0) {\n        var t = selectArr[idx - 1];\n        selectArr[idx - 1] = selectArr[idx];\n        selectArr[idx] = t;\n        this_.calacInputSuffixHeight();\n        this_.syncInputValue();\n      }\n    }\n  },\n  Array: {\n    //上移按钮\n    up: function up(idx, list) {\n      idx = parseInt(idx);\n\n      if (idx < 1) {\n        return;\n      }\n\n      var t = list[idx - 1];\n      list[idx - 1] = list[idx];\n      list[idx] = t;\n    },\n    //下移按钮\n    down: function down(idx, list) {\n      idx = parseInt(idx);\n\n      if (idx >= list.length - 1) {\n        return;\n      }\n\n      var t = list[idx + 1];\n      list[idx + 1] = list[idx];\n      list[idx] = t;\n    },\n    resumeSn: function resumeSn(list) {\n      for (var k = 0; k < list.length; k++) {\n        list[k].sn = k;\n      }\n\n      return list;\n    },\n\n    /**\r\n     * idx 原位置\r\n     * num 目标位置\r\n     * list 数组\r\n     */\n    moveToNum: function moveToNum(idx, target, list) {\n      if (target == -1) {\n        target = 0;\n      } else if (idx >= target) {\n        target = target + 1;\n      }\n\n      var t = list.splice(idx, 1);\n      list.insert(target, t[0]);\n      this.resumeSn(list);\n    },\n    //删除按钮\n    del: function del(idx, list) {\n      list.splice(idx, 1);\n    },\n    //找到指定元素的未知\n    idxOf: function idxOf(val, list) {\n      for (var i = 0; i < list.length; i++) {\n        if (list[i] == val) return i;\n      }\n\n      return -1;\n    },\n    //删除指定元素\n    remove: function remove(val, list) {\n      var idx = this.idxOf(val, list);\n\n      if (idx > -1) {\n        list.splice(idx, 1);\n      }\n    },\n    //置顶\n    top: function top(idx, list) {\n      if (idx >= list.length || idx < 1) {\n        return;\n      } //逐个交换\n\n\n      for (var i = 0; i < idx; i++) {\n        var temp = list[i];\n        list[i] = list[idx];\n        list[idx] = temp;\n      }\n    },\n    //置底\n    bottom: function bottom(idx, list) {\n      if (idx >= list.length - 1 || idx < 0) {\n        return;\n      } //逐个交换\n\n\n      for (var i = list.length - 1; i > idx; i--) {\n        var temp = list[i];\n        list[i] = list[idx];\n        list[idx] = temp;\n      }\n    }\n  },\n\n  /**\r\n   * 对象转url参数\r\n   * @param {*} data\r\n   * @param {*} isPrefix\r\n   */\n  queryParams: function queryParams(data) {\n    var isPrefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    var prefix = isPrefix ? '?' : '';\n    var _result = [];\n\n    var _loop = function _loop(key) {\n      var value = data[key]; // 去掉为空的参数\n\n      if (['', undefined, null].includes(value)) {\n        return \"continue\";\n      }\n\n      if (value.constructor === Array) {\n        value.forEach(function (_value) {\n          _result.push(encodeURIComponent(key) + '[]=' + encodeURIComponent(_value));\n        });\n      } else {\n        _result.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n      }\n    };\n\n    for (var key in data) {\n      var _ret = _loop(key);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return _result.length ? prefix + _result.join('&') : '';\n  },\n  Menu: {\n    addSubMenus: function addSubMenus(that, children) {\n      var this_ = this;\n\n      if (children && children.length > 0) {\n        //\t\t\t\t\tif(!parent.children){\n        //\t\t\t\t\t\tparent.children = [{path:'/', redirect:children[0].menuUrl}];\n        //\t\t\t\t\t}\n        children.forEach(function (m) {\n          //const route = {path: m.menuUrl, name: m.alias,  component: resolve => require([`@/${m.templateUrl}`], resolve )};\n          //parent.children.push(route);\n          if (m.children && m.children.length > 0) {\n            this_.addSubMenus(that, m.children);\n          }\n        });\n      }\n    },\n    addToRouter: function addToRouter(that, route) {\n      var routes = that.$router.options.routes;\n      var isIn = false;\n      routes.forEach(function (r) {\n        if (r.path == route.path) {\n          isIn = true;\n        }\n      });\n\n      if (!isIn) {\n        that.$router.options.routes.push(route);\n        that.$router.addRoutes([route]);\n      }\n    },\n    addSyncMenus: function addSyncMenus(that, menus) {\n      var _this2 = this;\n\n      if (menus && menus.constructor === Array && menus.length > 0) {\n        // 更新当前选中的菜单\n        setTimeout(function () {\n          var curRoutePath = that.$route.path;\n          menus.forEach(function (m) {\n            //将动态菜单添加到路由\n            if (m.code != 'home' && m.code != 'statement' && that.menuMaps[m.code]) {\n              //const route = {path: m.path,  component: resolve => require([`@/${m.templateUrl}`], resolve )};\n              //添加路由信息\n              if (that.menuMaps[m.code] && that.menuMaps[m.code].length > 0) {\n                _this2.addSubMenus(that, that.menuMaps[m.code]);\n              } //this.addToRouter(that,route);\n\n            }\n\n            var p = new RegExp(\"^/\".concat(m.alias, \"/.*$\"));\n\n            if (p.test(curRoutePath)) {\n              that.activeMenuIndex = m.alias;\n            }\n          });\n        }, 100);\n      }\n    }\n  }\n}; // 在数组上扩展一个删除指定项的方法\n\nArray.prototype.remove = function (item) {\n  this.splice(this.findIndex(function (v) {\n    return v === item;\n  }), 1);\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\nexport default utils;",null]}