vue 项目相关开发工具utils

本文介绍了在Vue项目中常用的开发工具函数,包括阿拉伯数字转汉字的实现,以及一系列其他实用工具方法,帮助提升开发效率。

阿拉伯数字转汉字

//方案一
NumberToChinese(num) {
    var chnNumChar = [
      "零",
      "一",
      "二",
      "三",
      "四",
      "五",
      "六",
      "七",
      "八",
      "九"
    ];
    var chnUnitSection = ["", "万", "亿", "万亿", "亿亿"];
    var chnUnitChar = ["", "十", "百", "千"];
    var unitPos = 0;
    var strIns = "",
      chnStr = "";
    var needZero = false;

    if (num === 0) {
      return chnNumChar[0];
    }

    while (num > 0) {
      var section = num % 10000;
      if (needZero) {
        chnStr = chnNumChar[0] + chnStr;
      }
      strIns = this.SectionToChinese(section);
      strIns += section !== 0 ? chnUnitSection[unitPos] : chnUnitSection[0];
      chnStr = strIns + chnStr;
      needZero = section < 1000 && section > 0;
      num = Math.floor(num / 10000);
      unitPos++;
    }
    return chnStr;
  },
  lazyLoadScript(url) {
    return new Promise((resolve, reject) => {
      let script = document.createElement("script");
      script.src = url;
      script.type = "text/javascript";
      let head = document.getElementsByTagName("head")[0];
      head.appendChild(script);
      script.onload = () => {
        resolve();
      };
      script.onerror = err => {
        reject(err);
      };
    });
  },
  //方案二
  DX(n) {
    if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法";
    if (n === 0) {
      return "零";
    }
    let unit = "万千百拾亿千百拾万千百拾元角分";
    let str = "";
    n += "00";
    let p = n.indexOf(".");
    if (p >= 0) n = n.substring(0, p) + n.substr(p + 1, 2);
    unit = unit.substr(unit.length - n.length);
    for (var i = 0; i < n.length; i++) {
      str += "零壹贰叁肆伍陆柒捌玖".charAt(n.charAt(i)) + unit.charAt(i);
    }
    return str
      .replace(/零(千|百|拾|角)/g, "零")
      .replace(/(零)+/g, "零")
      .replace(/零(万|亿|元)/g, "$1")
      .replace(/(亿)万|壹(拾)/g, "$1$2")
      .replace(/^元零?|零分/g, "")
      .replace(/元$/g, "元整");
  },

其他常用

  setSS: (key, value) => {
    sessionStorage.setItem(key, JSON.stringify(value));
  },
  getSS: key => {
    let value = sessionStorage.getItem(key);
    try {
      return JSON.parse(value);
    } catch (err) {
      return value;
    }
  },
  delSS: key => {
    sessionStorage.removeItem(key);
  },
  setLS: (key, value) => {
    localStorage.setItem(key, JSON.stringify(value));
  },
  getLS: key => {
    let value = localStorage.getItem(key);
    try {
      return JSON.parse(value);
    } catch (err) {
      return value;
    }
  },
  delLS: key => {
    localStorage.removeItem(key);
  },
  setCookie: (name, value) => {
    const Days = 0.5;
    const exp = new Date();
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    document.cookie =
      name + "=" + escape(value) + ";expires=" + exp.toGMTString();
  },
  getCookie: name => {
    const reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    const arr = document.cookie.match(reg);
    if (arr) {
      return unescape(arr[2]);
    } else {
      return null;
    }
  },
  delCookie: name => {
    const exp = new Date();
    exp.setTime(exp.getTime() - 1);
    const cval = utils.getCookie(name);
    if (cval != null) {
      document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
    }
  },
  downLoad: downLoadUrl => {
    let a = document.createElement("a");
    if (a.download) {
      a.href = downLoadUrl;
      if (document.createEvent) {
        var evObj = document.createEvent("MouseEvents");
        evObj.initEvent(
          "click",
          true,
          true,
          window,
          1,
          12,
          345,
          7,
          220,
          false,
          false,
          true,
          false,
          0,
          null
        );
        a.dispatchEvent(evObj);
      } else if (document.createEventObject) {
        a.fireEvent("onmousemove");
      }
    } else {
      window.open(downLoadUrl, "_blank");
    }
  },
  postDownLoad: (url, options, fileName) => {
    Message({
      message: "开始下载",
      type: "success"
    });
    axiosHttp()({
      method: options.method || "post",
      url: url,
      responseType: "blob",
      timeout: options.timeout || 10000,
      params: options.params || {},
      data: options.data || {}
    })
      .then(res => {
        const blob = new Blob([res.data]);
        // 兼容不同浏览器的URL对象
        const url = window.URL || window.webkitURL || window.moxURL;

        // 获取后台提供的文件名
        let backendFileName = res.headers["content-disposition"];
        if (/utf-8''/i.test(backendFileName)) {
          backendFileName = backendFileName.split("-8''")[1];
        } else if (backendFileName && backendFileName.length >= 2) {
          backendFileName = backendFileName.split("=")[1];
        }
        backendFileName = decodeURIComponent(backendFileName);

        //  兼容IE
        if ("msSaveOrOpenBlob" in navigator) {
          window.navigator.msSaveOrOpenBlob(blob, fileName || backendFileName);
          return;
        }
        // 创建下载链接
        const downloadHref = url.createObjectURL(blob);
        // 创建a标签并为其添加属性
        let downloadLink = document.createElement("a");
        downloadLink.href = downloadHref;
        downloadLink.download = fileName || backendFileName || "未知文件.txt";
        // 触发点击事件执行下载
        downloadLink.click();
      })
      .catch(_ => {
        Message({
          message: "下载失败",
          type: "error"
        });
      });
  },
  imgView: downLoadUrl => {
    window.open("../../#/imgView?url=" + downLoadUrl);
  },
  pdfView: downLoadUrl => {
    window.open("../../#/pdfView?url=" + downLoadUrl);
  },
  format: (date, fmt) => {
    // 格式化日期
    var _date = new Date(date);
    var o = {
      "y+": _date.getFullYear(),
      "M+": _date.getMonth() + 1, // 月份
      "d+": _date.getDate(), // 日
      "h+": _date.getHours(), // 小时
      "m+": _date.getMinutes(), // 分
      "s+": _date.getSeconds(), // 秒
      "q+": Math.floor((_date.getMonth() + 3) / 3), // 季度
      "S+": _date.getMilliseconds() // 毫秒
    };
    for (var k in o) {
      if (new RegExp("(" + k + ")").test(fmt)) {
        if (k === "y+") {
          fmt = fmt.replace(
            RegExp.$1,
            ("" + o[k]).substr(4 - RegExp.$1.length)
          );
        } else if (k === "S+") {
          var lens = RegExp.$1.length;
          lens = lens === 1 ? 3 : lens;
          fmt = fmt.replace(
            RegExp.$1,
            ("00" + o[k]).substr(("" + o[k]).length - 1, lens)
          );
        } else {
          fmt = fmt.replace(
            RegExp.$1,
            RegExp.$1.length === 1
              ? o[k]
              : ("00" + o[k]).substr(("" + o[k]).length)
          );
        }
      }
    }
    return fmt;
  },
  parseUrl: () => {
    // url获参
    var param = {};
    var matchs = window.location.href
      .substring(window.location.href.indexOf("?") + 1)
      .split("&");
    matchs.forEach(element => {
      var match = element.split("=");
      param[match[0]] = match[1];
    });
    return param;
  },
  deepClone: obj => {
    var _obj;
    if (typeof obj === "object" && obj !== null) {
      if (Object.prototype.toString.call(obj) === "[object Object]") {
        _obj = {};
        for (var key in obj) {
          _obj[key] = utils.deepClone(obj[key]);
        }
        return _obj;
      } else if (Object.prototype.toString.call(obj) === "[object Array]") {
        _obj = [];
        for (var _key in obj) {
          _obj[_key] = utils.deepClone(obj[_key]);
        }
        return _obj;
      } else {
        return obj;
      }
    } else {
      return obj;
    }
  },
  /**
   * 深度清空对象的value值
   * @param {Object} obj 待清空对象
   */
  deepClear: (obj) => {
    for (let key in obj) {
      if (Object.prototype.toString.call(obj[key]) === '[object Object]') {
        utils.deepClear(obj[key])
      } else if (Object.prototype.toString.call(obj[key]) === '[object Array]') {
        obj[key] = []
      } else {
        obj[key] = null
      }
    }
  },
  /**
   *
   * @param {Int,Float} value 数值
   * @param {Int} effLen 有效长度
   * @param {Int} deciLen 保留小数点
   */
  validateNumber(value, effLen, deciLen) {
    if (!value) {
      return {
        isValid: false,
        msg: null
      };
    }
    let intLen = effLen - deciLen - 1;
    // /(^[1-9][0-9]{0,12}(\.\d{1,2})?$)|(^[0-9]\.\d{1,2}?$)|(^[1-9][0-9]{0,12}$)/
    let regk =
      "/(^[1-9][0-9]{0," +
      intLen +
      "}(\\.\\d{1," +
      deciLen +
      "})?$)|(^[0-9]\\.\\d{1," +
      deciLen +
      "}?$)|(^[1-9][0-9]{0," +
      intLen +
      "}$)/";
    let reg = this.evil(regk);
    if (!reg.test(value + "")) {
      return {
        isValid: false,
        msg: new Error(
          "最多输入 " +
          (effLen - deciLen) +
          " 位正整数, " +
          deciLen +
          " 位小数"
        )
      };
    } else {
      return true;
    }
  },
  evil(fn) {
    var Fn = Function; // 一个变量指向Function,防止有些前端编译工具报错
    return new Fn("return " + fn)();
  },
  arrayConcatUnrepeat(arr1, arr2, corekey) {
    let result = [];
    if (arr1.length && arr2.length) {
      let arr = arr1.concat(arr2);
      let obj = {};
      for (let i = 0; i < arr.length; i++) {
        if (!obj[arr[i][corekey]]) {
          result.push(arr[i]);
          obj[arr[i][corekey]] = true;
        }
      }
    } else {
      result = arr1 || arr2 ? arr2 : [];
    }
    return result;
  },
  luhmCheck: bankno => {
    var lastNum = bankno.substr(bankno.length - 1, 1); // 取出最后一位(与luhm进行比较)

    var first15Num = bankno.substr(0, bankno.length - 1); // 前15或18位
    var newArr = [];
    for (var i = first15Num.length - 1; i > -1; i--) {
      // 前15或18位倒序存进数组
      newArr.push(first15Num.substr(i, 1));
    }
    var arrJiShu = []; // 奇数位*2的积 <9
    var arrJiShu2 = []; // 奇数位*2的积 >9

    var arrOuShu = []; // 偶数位数组
    for (var j = 0; j < newArr.length; j++) {
      if ((j + 1) % 2 === 1) {
        // 奇数位
        if (parseInt(newArr[j]) * 2 < 9) {
          arrJiShu.push(parseInt(newArr[j]) * 2);
        } else {
          arrJiShu2.push(parseInt(newArr[j]) * 2);
        }
      } else {
        arrOuShu.push(newArr[j]);
      }
    }

    var jishuChild1 = []; // 奇数位*2 >9 的分割之后的数组个位数
    var jishuChild2 = []; // 奇数位*2 >9 的分割之后的数组十位数
    for (var h = 0; h < arrJiShu2.length; h++) {
      jishuChild1.push(parseInt(arrJiShu2[h]) % 10);
      jishuChild2.push(parseInt(arrJiShu2[h]) / 10);
    }

    var sumJiShu = 0; // 奇数位*2 < 9 的数组之和
    var sumOuShu = 0; // 偶数位数组之和
    var sumJiShuChild1 = 0; // 奇数位*2 >9 的分割之后的数组个位数之和
    var sumJiShuChild2 = 0; // 奇数位*2 >9 的分割之后的数组十位数之和
    var sumTotal = 0;
    for (var m = 0; m < arrJiShu.length; m++) {
      sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
    }

    for (var n = 0; n < arrOuShu.length; n++) {
      sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
    }

    for (var p = 0; p < jishuChild1.length; p++) {
      sumJiShuChild1 = sumJiShuChild1 + parseInt(jishuChild1[p]);
      sumJiShuChild2 = sumJiShuChild2 + parseInt(jishuChild2[p]);
    }
    // 计算总和
    sumTotal =
      parseInt(sumJiShu) +
      parseInt(sumOuShu) +
      parseInt(sumJiShuChild1) +
      parseInt(sumJiShuChild2);

    // 计算Luhm值
    var k = parseInt(sumTotal) % 10 === 0 ? 10 : parseInt(sumTotal) % 10;
    var luhm = 10 - k;

    if (+lastNum === luhm && lastNum.length !== 0) {
      return true;
    } else {
      return false;
    }
  },
  // 显示当前日期   20180907
  getNowDate() {
    var y = new Date().getFullYear();
    var m = new Date().getMonth() + 1;
    m = m < 10 ? "0" + m : m;
    var d = new Date().getDate();
    d = d < 10 ? "0" + d : d;
    return y + "" + m + "" + d;
  },
  // 时间戳更改为日期展示 2020-12-30
  getDateFormat(time) {
    if (time) {
      var y = new Date(time).getFullYear();
      var m = new Date(time).getMonth() + 1;
      m = m < 10 ? "0" + m : m;
      var d = new Date(time).getDate();
      d = d < 10 ? "0" + d : d;
      return y + "-" + m + "-" + d;
    } else {
      return ''
    }
  },
  // 获取时间戳
  getDateTime(dateTime) {
    let date;
    if (dateTime) {
      date = new Date(dateTime);
    } else {
      date = new Date();
    }
    let month = date.getMonth() + 1;
    let strDate = date.getDate();
    if (month >= 1 && month <= 9) {
      month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
      strDate = "0" + strDate;
    }
    return `${date.getFullYear()}-${month}-${strDate} ${date.getHours()}:${
      date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
      }:${date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()}`;
  },
  // 阿拉伯数字转大写
  DX(n) {
    if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法";
    if (n === 0) {
      return "零";
    }
    let unit = "万千百拾亿千百拾万千百拾元角分";
    let str = "";
    n += "00";
    let p = n.indexOf(".");
    if (p >= 0) n = n.substring(0, p) + n.substr(p + 1, 2);
    unit = unit.substr(unit.length - n.length);
    for (var i = 0; i < n.length; i++) {
      str += "零壹贰叁肆伍陆柒捌玖".charAt(n.charAt(i)) + unit.charAt(i);
    }
    return str
      .replace(/零(千|百|拾|角)/g, "零")
      .replace(/(零)+/g, "零")
      .replace(/零(万|亿|元)/g, "$1")
      .replace(/(亿)万|壹(拾)/g, "$1$2")
      .replace(/^元零?|零分/g, "")
      .replace(/元$/g, "元整");
  },

  SectionToChinese(section) {
    var chnNumChar = [
      "零",
      "一",
      "二",
      "三",
      "四",
      "五",
      "六",
      "七",
      "八",
      "九"
    ];
    var chnUnitSection = ["", "万", "亿", "万亿", "亿亿"];
    var chnUnitChar = ["", "十", "百", "千"];
    var strIns = "",
      chnStr = "";
    var unitPos = 0;
    var zero = true;
    while (section > 0) {
      var v = section % 10;
      if (v === 0) {
        if (!zero) {
          zero = true;
          chnStr = chnNumChar[v] + chnStr;
        }
      } else {
        zero = false;
        strIns = chnNumChar[v];
        strIns += chnUnitChar[unitPos];
        chnStr = strIns + chnStr;
      }
      unitPos++;
      section = Math.floor(section / 10);
    }
    return chnStr;
  },
  NumberToChinese(num) {
    var chnNumChar = [
      "零",
      "一",
      "二",
      "三",
      "四",
      "五",
      "六",
      "七",
      "八",
      "九"
    ];
    var chnUnitSection = ["", "万", "亿", "万亿", "亿亿"];
    var chnUnitChar = ["", "十", "百", "千"];
    var unitPos = 0;
    var strIns = "",
      chnStr = "";
    var needZero = false;

    if (num === 0) {
      return chnNumChar[0];
    }

    while (num > 0) {
      var section = num % 10000;
      if (needZero) {
        chnStr = chnNumChar[0] + chnStr;
      }
      strIns = this.SectionToChinese(section);
      strIns += section !== 0 ? chnUnitSection[unitPos] : chnUnitSection[0];
      chnStr = strIns + chnStr;
      needZero = section < 1000 && section > 0;
      num = Math.floor(num / 10000);
      unitPos++;
    }
    return chnStr;
  },
  lazyLoadScript(url) {
    return new Promise((resolve, reject) => {
      let script = document.createElement("script");
      script.src = url;
      script.type = "text/javascript";
      let head = document.getElementsByTagName("head")[0];
      head.appendChild(script);
      script.onload = () => {
        resolve();
      };
      script.onerror = err => {
        reject(err);
      };
    });
  },
  hasClass(ele, cls) {
    return ele && ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
  },
  addClass(ele, cls) {
    if (!this.hasClass(ele, cls)) ele.className += " " + cls;
  },
  removeClass(ele, cls) {
    if (this.hasClass(ele, cls)) {
      var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
      ele.className = ele.className.replace(reg, " ");
    }
  },
  scroll() {
    var scrollTop = document.getElementById("app").scrollTop - 88;
    document.getElementById("app").scrollTop = scrollTop;
  },
  clearSession() {
    sessionStorage.clear();
    store.commit("delLoginInfo");
  },
  myToLocaleString(value) {
    if (!value) {
      return value;
    }
    let str = Number(value.split(".")[0]).toLocaleString();
    if (value.split(".")[1]) {
      str += "." + value.split(".")[1];
    }
    return str;
  },
  // input框输入数字转小数
  plusOrMinus(values) {
    let newValue;
    if (!/[^0-9.-]/g.test(values)) {
      newValue = values
        .replace(/[^\-\d.]/g, "")
        .replace(/\b(0+){2,}/g, "0")
        .replace(/\{2,}/g, "-")
        .replace(/^\./g, "")
        .replace(/\.{2,}/g, ".")
        .replace(".", "$#$")
        .replace(/\./g, "")
        .replace("$#$", ".");
      if (
        newValue.toString().indexOf(".") > 0 &&
        Number(newValue.toString().split(".")[1].length) > 2
      ) {
        newValue = parseInt(parseFloat(newValue) * 100) / 100;
      }
      if (newValue.toString().split("-").length - 1 > 1) {
        newValue = parseFloat(newValue) || "";
      }
      if (
        newValue.toString().split("-").length > 1 &&
        newValue.toString().split("-")[0].length > 0
      ) {
        newValue = parseFloat(newValue) || "";
      }
      if (
        newValue.toString().length > 1 &&
        (newValue.toString().charAt(0) === "0" ||
          (newValue.toString().length > 2 &&
            newValue.toString().charAt(0) === "-" &&
            newValue.toString().charAt(1) === "0" &&
            newValue.toString().charAt(2) !== ".")) &&
        newValue.toString().indexOf(".") < 1
      ) {
        newValue = parseFloat(newValue) || "";
      }
      // 判断整数位最多为9位
      if (
        newValue.toString().indexOf(".") > 0 &&
        Number(newValue.toString().split(".")[0].length) > 9
      ) {
        newValue =
          newValue.toString().substring(0, 9) +
          "." +
          newValue.toString().split(".")[1];
      } else if (
        newValue.toString().indexOf(".") < 0 &&
        Number(newValue.toString().split(".")[0].length) > 9
      ) {
        newValue = newValue.toString().substring(0, 9);
      }
    } else {
      newValue = values.replace(/[^0-9.-]/g, "");
    }

    return newValue;
  },
  /**
   * 10000 => "10,000.00"
   * 数字转换为千分符
   */
  toThousandFilter(num, str = '', n = 2) {
    if ([null, undefined, ''].includes(num)) return str
    let _num = (+num || 0)
      .toString()
      .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ","));
    if (_num.indexOf(".") === -1 && n) {
      _num = _num + ".00";
    } else if (
      _num.indexOf(".") !== -1 &&
      _num.toString().split(".")[1].length === 1
    ) {
      _num = _num + "0";
    }
    return _num;
  },

  /**
   * 获取枚举值
   * @param {Object} enumObj 枚举对象
  */
  getEnumCodeOrName(enumObj, key = 'code') {
    return Object.prototype.toString.call(enumObj) === '[object Object]' ? enumObj[key] : enumObj
  },
  /**
   * 获取枚举值
   * @param {String} code 枚举code
   * @param {Array} enumList 枚举列表
  */
  generateEnum(code, enumList) {
    let target = enumList.find(item => item.code === code)
    if (target) {
      return {
        code,
        name: target.description || target.name
      }
    } else {
      return null
    }
  },
  /**
   * 转换表格数据枚举值
   * @param {Array} enumArr 需转换的枚举字段
   * @param {Array} tableData 原始表单数据
   */
  translateTableData(enumArr, tableData) {
    if (!enumArr || !tableData) return [];
    let _data = utils.deepClone(tableData);
    enumArr.forEach(enumKey => {
      _data.forEach(obj => {
        obj[`${enumKey}Name`] = utils.getEnumCodeOrName(obj[enumKey], 'name')
        obj[`${enumKey}Code`] = utils.getEnumCodeOrName(obj[enumKey], 'code')
      })
    })
    return _data
  },
  addClass(ele, cls) {
    ele.classList.add(cls);
  },
  removeClass(ele, cls) {
    ele.classList.remove(cls);
  },
  throttle(method, time = 500) {
    var timer = null;
    var begin = new Date();
    return function () {
      var context = this;
      var args = arguments;
      var current = new Date();
      clearTimeout(timer);
      if (current - begin >= time) {
        method.apply(context, args);
        begin = current;
      } else {
        timer = setTimeout(function () {
          method.apply(context, args);
        }, time);
      }
    };
  },
  chainOperator(obj, path) {
    return path.split(".").reduce((pre, item, index) => {
      if (index === 0) {
        return pre === null || pre === undefined ? "" : obj;
      } else {
        return pre[item] === null || pre[item] === undefined ? "" : pre[item];
      }
    }, obj);
  },
  /**
   * 输入框输入金额自动计算金额单位
   * @param {数值} val
   */
  amountFormat(val) {
    let num = val ? val.toString().split(".")[0] : '0';
    let num1 = num.split(',')
    let num2 = num1.join('')
    let unit = '';
    switch (num2.length) {
      case 3:
        unit = '百';
        break;
      case 4:
        unit = '千';
        break;
      case 5:
        unit = '万';
        break;
      case 6:
        unit = '十万';
        break;
      case 7:
        unit = '百万';
        break;
      case 8:
        unit = '千万';
        break;
      case 9:
        unit = '亿';
        break;
      case 10:
        unit = '十亿';
        break;
      case 11:
        unit = '百亿';
        break;
      case 12:
        unit = '千亿';
        break;
      default:
        unit = '';
        break;
    }
    return unit
  },
  /**
   * 输入框取消去掉千分符
   * @param {数值} val
   */
  removeThousand(val) {
    let num = val ? val : '0';
    let num1 = num.toString().split(".")
    let num2 = num1[0].split(',')
    let num3 = num2.join('')
    let num4 = num3 + "." + (num1[1] ? num1[1] : '0')
    return num4
  },
  moneyToCapital(n) {
    if (n == 0) {
      return "零";
    }
    if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "";
    var unit = "仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分",
      str = "";
    n += "00";
    var p = n.indexOf(".");
    if (p >= 0) n = n.substring(0, p) + n.substr(p + 1, 2);
    unit = unit.substr(unit.length - n.length);
    for (var i = 0; i < n.length; i++)
      str += "零壹贰叁肆伍陆柒捌玖".charAt(n.charAt(i)) + unit.charAt(i);
    return str
      .replace(/零(千|百|拾|角)/g, "零")
      .replace(/(零)+/g, "零")
      .replace(/零(万|亿|元)/g, "$1")
      .replace(/(亿)万|壹(拾)/g, "$1$2")
      .replace(/^元零?|零分/g, "")
      .replace(/元$/g, "元整");
  },
  /**
   * 获取分组合并行数
   * @param {数据源} list
   * @param {合并单元格的列} column
   */
  groupMergeRow(list = [], column) {
    let group = {};
    list.map(item => {
      let key = item[column];
      let value = group[key];
      if (value) {
        group[key] = ++value;
      } else {
        group[key] = 1;
      }
    });
    return group;
  },
  /**
   * 获取分组顺序
   * @param {数据源} list
   * @param {合并单元格的列} column
   */
  groupOrder(list = [], column) {
    let group = {};
    list.filter((item, index) => {
      let key = item[column];
      let value = group[key];
      if (!value && value !== 0) {
        group[key] = index;
      }
    });
    return group;
  },
  /**
   * 获取分组序号(当合并单元格的列是根据id合并的,就会出现序号合并,需要调用此函数获取序号)
   * @param {数据源} list
   * @param {合并单元格的列} column
   */
  groupSn(list = [], column) {
    //获取分组编号
    const map = new Map();
    Array.from(new Set(list.map(item => item[column]))).map((item, index) => {
      map.set(item, index + 1);
    });
    return map;
  },
  /**
   * 深度清空对象的value值
   * @param {Object} obj 待清空对象
   */
  deepClear(obj) {
    for (let key in obj) {
      if (Object.prototype.toString.call(obj[key]) === "[object Object]") {
        utils.deepClear(obj[key]);
      } else if (
        Object.prototype.toString.call(obj[key]) === "[object Array]"
      ) {
        obj[key] = [];
      } else {
        obj[key] = null;
      }
    }
  },
  // 计算最大值
  calMax(arr) {
    let max = Math.max(...arr)
    let maxint = Math.ceil(max / 9) // 不让最高的值超过最上面的刻度
    let maxval = maxint * 10 // 让显示的刻度是整数
    // 为了防止数据为0时,Y轴不显示,给个最大值
    if (maxval == 0) { maxval = 1 }
    return Math.ceil(maxval)
  },
  // 计算最小值
  calMin(arr) {
    let min = Math.min(...arr);
    let minint = Math.floor(min / 10)
    let minval = minint * 10 //让显示的刻度是整数
    return Math.floor(minval)
  },
  /**
   * @description: 异步async异常捕获,不冒泡至控制台
   * @param {Promise} promise 对象
   * @param {Array} 路径 [err, res]
   */
  asyncCatch(promise, rejectCallback) {
    return promise
      .then(res => {
        return [null, res]
      })
      .catch(err => {
        if (typeof rejectCallback === 'function') {
          rejectCallback()
        }
        console.log(err)
        return [err]
      })
  },
  /**
   * @description: 确认弹窗
   * @param {String} prompt 提示语
   */
  confirm(prompt) {
    prompt = prompt || '确认删除?'
    return MessageBox.confirm(prompt, { closeOnClickModal: false })
  },
  /**
   * @description: 空值转换
   */
  transformNone(val, defaultVal = '') {
    return [null, undefined, ''].includes(val) ? defaultVal : val
  },
  /**
   * @description: excel报表下载
   */
  exportExcel(title, message, url, sendObj, method = 'post') {
    let obj = utils.deepClone(sendObj)
    Notification({
      title: "提示",
      message: message || `${title}报表下载中,因计算量大,需等待时间长`,
      duration: 10000
    })
    let loading = Loading.service({
      fullscreen: false,
      text: '下载中...',
      background: 'rgba(0, 0, 0, 0.7)'
    })
    axios({
      method: method || "post",
      url,
      baseURL: baseURL,
      responseType: "blob",
      timeout: 600000,
      headers: {
        "Content-type": "application/json;charset=UTF-8",
        Authorization: utils.getSS("Authorization") || null
      },
      data: JSON.stringify({
        body: obj
      })
    })
      .then(res => {
        const blob = new Blob([res.data], { type: "application/x-xls" });
        // for IE
        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
          window.navigator.msSaveOrOpenBlob(blob, `${title}报表.xls`);
        } else {
          // 兼容不同浏览器的URL对象
          const url = window.URL || window.webkitURL || window.moxURL;
          // 创建下载链接
          const downloadHref = url.createObjectURL(blob);
          // 创建a标签并为其添加属性
          let downloadLink = document.createElement("a");
          downloadLink.href = downloadHref;
          downloadLink.download = `${title}报表.xls`;
          // 触发点击事件执行下载
          downloadLink.click();
        }
      })
      .catch(_ => {
        Message({
          message: '下载失败',
          type: 'error'
        })
      })
      .finally(() => {
        loading.close()
      })
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值