// import http from '@/api/http.js' // import { downloadXlsx } from "../utils/xlsx"; import { saveAs } from 'file-saver' import { apiGetExportMsg, apiGetModel, } from '../api/api' // import XLSXD from 'xlsx-style' // import Papa from 'papaparse' // import { isObject } from "xe-utils" //检查空 const checkNull = val => val === undefined || val === null const until = { // 计算比率 ratioCalculation(a, b) { let num = null if (a !== '-' && b !== '-') { if (a === '0.00' || a === 0) { num = 0 } else if (b === '0.00' || b === 0) { num = '-' } else { num = Math.round((Number(a) / Number(b) * 100)) + '%' } } else { num = '-' } return num }, // 导出所有 downloadPer(url, fileName, idss, idsmo) { let params = null if (!idsmo) { params = { ids: idss ? idss.join(',') : '' } } else { params = { idsMv: idss ? idss.join(',') : '', idsBcr: idsmo ? idsmo.join(',') : '', } } apiGetExportMsg(url, params).then(datas => { let blob = new Blob([datas]) saveAs(blob, fileName) }).catch((r) => { console.error(r) }) }, // 下载模板 downloadTemplate(url, params, proName) { apiGetModel(url, params).then(datas => { let blob = new Blob([datas]) saveAs(blob, proName) }).catch((r) => { console.error(r) }) }, getTime(date) { var y = date.getFullYear(); var m = date.getMonth() + 1; m = m < 10 ? ('0' + m) : m; var d = date.getDate(); d = d < 10 ? ('0' + d) : d; var h = date.getHours(); h = h < 10 ? ('0' + h) : h; var minute = date.getMinutes(); minute = minute < 10 ? ('0' + minute) : minute; var second = date.getSeconds(); second = second < 10 ? ('0' + second) : second; return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; // timeF = y + '-' + m + '-' + d // return timeF }, changePowerPickDate(val) { let endss = val.substring(val.length - 2, val.length) * 1 let startTime = val.substring(0, val.length - 2) let allTime = '' if (0 <= endss && endss < 15) { allTime = startTime + '00' } else if (15 <= endss && endss < 30) { allTime = startTime + '15' } else if (30 <= endss && endss < 45) { allTime = startTime + '30' } else if (45 <= endss && endss < 60) { allTime = startTime + '45' } return allTime }, changeElectricPickDate(val) { let endss = val.substring(val.length - 2, val.length) * 1 let startTime = val.substring(0, val.length - 2) let allTime = '' if (0 <= endss && endss < 10) { allTime = startTime + '00' } else if (10 <= endss && endss < 20) { allTime = startTime + '10' } else if (20 <= endss && endss < 30) { allTime = startTime + '20' } else if (30 <= endss && endss < 40) { allTime = startTime + '30' } else if (40 <= endss && endss < 50) { allTime = startTime + '40' } else if (50 <= endss && endss < 60) { allTime = startTime + '50' } return allTime }, oninput(str, limit, type, zero) { if (zero) { if (str.substr(0, 1) === '.' || str.substr(0, 1) === '-') { str = '' } } else { if (str.substr(0, 1) === '.' || str.substr(0, 1) === '-' || str.substr(0, 1) === '0') { str = '' } } if (type === 'float') { str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点 if (limit === 1) { str = str.replace(/^\D*([0-9]\d*\.?\d{0,1})?.*$/, '$1') // 小数点后只能输 1 位 } else if (limit === 2) { str = str.replace(/^\D*([0-9]\d*\.?\d{0,2})?.*$/, '$1') // 小数点后只能输 2 位 } else if (limit === 3) { str = str.replace(/^\D*([0-9]\d*\.?\d{0,3})?.*$/, '$1') // 小数点后只能输 3 位 } else if (limit === 4) { str = str.replace(/^\D*([0-9]\d*\.?\d{0,4})?.*$/, '$1') // 小数点后只能输 4 位 } else if (limit === 6) { str = str.replace(/^\D*([0-9]\d*\.?\d{0,6})?.*$/, '$1') // 小数点后只能输 6 位 } } else { str = str.replace(/[^\d^]+/g, '') str = str.substring(0, limit) } return str }, sortBy(attr, rev) { //第二个参数没有传递 默认升序排列 if (rev == undefined) { rev = 1; } else { rev = (rev) ? 1 : -1; } return function (a, b) { a = a[attr]; b = b[attr]; if (a < b) { return rev * -1; } if (a > b) { return rev * 1; } return 0; } }, /** * 字母大小写切换 * @param str 要处理的字符串 * @param type 1:首字母大写其余小写 2:首子母小写其余大写 3:大小写转换 4:全部大写 5:全部小写 */ strChangeCase(str, type) { function ToggleCase(str) { var itemText = "" str.split("").forEach( function (item) { if (/^([a-z]+)/.test(item)) { itemText += item.toUpperCase(); } else if (/^([A-Z]+)/.test(item)) { itemText += item.toLowerCase(); } else { itemText += item; } }); return itemText; } switch (type) { case 1: return str.replace(/^(\w)(\w+)/, function (v, v1, v2) { return v1.toUpperCase() + v2.toLowerCase(); }); case 2: return str.replace(/^(\w)(\w+)/, function (v, v1, v2) { return v1.toLowerCase() + v2.toUpperCase(); }); case 3: return ToggleCase(str); case 4: return str.toUpperCase(); case 5: return str.toLowerCase(); default: return str; } }, /* *数字每千位加逗号 * */ commafy(num) { return num && num.toString() .replace(/\d+/, function (s) { return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,') }) }, /* *手机号码中间4位隐藏花号(*)显示 * */ hideMobile(mobile) { return mobile && mobile.toString().replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") }, /* * 验证是否为数字 */ isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }, /* * 是否为数组 */ isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }, /* * 递归深拷贝 */ deepCopy(obj) { let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === 'object' && obj[key] !== null) { result[key] = deepCopy(obj[key]); } else { result[key] = obj[key]; } } } return result; }, exportTable(name, columnData, tableDatas) { let datalist = []; //表头数据 let cluData = '' for (let i = 0; i < columnData.length; i++) { cluData += columnData[i].label + ',' } cluData.slice(0, cluData.length - 1) datalist.push(cluData.split(',')); //这里的tableData为你的表格数据 for (let j = 0; j < tableDatas.length; j++) { let item = tableDatas[j] let tabelDatas = '' for (let k = 0; k < columnData.length; k++) { let its = columnData[k] if (item[its.value] !== null) { tabelDatas += item[its.value] + ',' } else { tabelDatas += '-,' } } datalist.push(tabelDatas.split(',')); } downloadXlsx(datalist, `${name}.xlsx`); // let blob = new Blob([datalist]) // saveAs(blob, `${name}.xlsx`) // this.exportCsv(datalist) }, exportExcel() { // let time = this.$utils.getTime(new Date()) // let titleName = this.title + ' ' + time // this.$utils.exportTable(titleName,this.columData, this.tableData) let wb = XLSX.utils.book_new(); let headers = { name: '姓名', age: '年龄', sex: '性别' } this.columData.unshift(headers) let contentWs = XLSX.utils.json_to_sheet(this.columData, { header: ['name', 'age', 'sex'], // 可自定义表头顺序 skipHeader: true, //是否忽略表头,默认为false origin: 'A2' // 设置插入位置 }) contentWs['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 1, c: 0 } }, { s: { r: 0, c: 1 }, e: { r: 1, c: 1 } }] // contentWs['!merges'] = [{s:{r:1,c:2}, e:{r:2,c:2}}] // contentWs['A1'] = { // t: 's', // v: '人员', // s: { // font:{ // name: '微软雅黑', // sz: 16, // bold: true, // color: {rgb: 'ffffff'} // }, // alignment: { // horizontal: 'center', // vertical: 'center' // }, // fill:{bgcolor: {rgb: '4472c4'}} // } // } // 设置合并单元格 !merges为一个对象数组,每个对象设定了单元格合并的规则, // {s:{r:0,c:0}, e:{r:0,c:2}}为一个规则,s:起始位置,e:结束位置,r:行,c:列 // contentWs['!merges'] = [{s:{r:0,c:0}, e:{r:0,c:2}}] // contentWs['A3'] = { // t: 's', // v: '人员ss', // s: { // font:{ // name: '微软雅黑', // sz: 16, // bold: true, // color: {rgb: 'ffffff'} // }, // alignment: { // horizontal: 'center', // vertical: 'center' // }, // fill:{bgcolor: {rgb: '4472c4'}} // } // } // contentWs['!merges'] = [{s:{r:0,c:2}, e:{r:0,c:4}}] //设置列宽 contentWs['!cols'] = [{ wch: 30 }, { wch: 20 }, { wch: 40 }] XLSX.utils.book_append_sheet(wb, contentWs, '明细') // XLSX.writeFile(wb, '明细.xlsx') const tmpDown = new Blob([ this.s2ab( XLSXD.write(wb, { bookType: 'xlsx', bookSST: true, type: 'binary', cellStyles: true }) ) ]) this.downExcel(tmpDown, '明细.xlsx') }, downExcel(obj, fileName) { const a_node = document.createElement('a') a_node.download = fileName if ('msSaveOrOpenBlob' in navigator) { window.navigator.msSaveOrOpenBlob(obj, fileName) } else { a_node.href = URL.createObjectURL(obj) } a_node.click() setTimeout(() => { URL.createObjectURL(obj) }, 2000) }, s2ab(s) { if (typeof ArrayBuffer !== 'undefined') { const buf = new ArrayBuffer(s.length) const view = new Uint8Array(buf) for (let i = 0; i != s.length; ++i) { view[i] = s.charCodeAt(i) & 0xff } return buf } else { const buf = new Array(s.length) for (let i = 0; i != s.length; ++i) { buf[i] = s.charCodeAt(i) & 0xff } return buf } }, setTooltip(myChart1, myChart2, num) { // const myChart1 = this.$echarts.init(document.getElementById(name1)) // const myChart2 = this.$echarts.init(document.getElementById(name2)) myChart1.getZr().on('mousemove', (params) => { const pointInPixel = [params.offsetX, params.offsetY]; // 判断当前鼠标移动的位置是否在图表中 if (myChart1.containPixel('grid', pointInPixel)) { //使用 convertFromPixel方法 转换像素坐标值到逻辑坐标系上的点。获取点击位置对应的x轴数据的索引值 const pointInGrid = myChart1.convertFromPixel({ seriesIndex: 0 }, pointInPixel); // x轴数据的索引值 const xIndex = pointInGrid[0]; // 使用getOption() 获取图表的option const op = myChart1.getOption(); // 获取当前点击位置要的数据 const xDate = op.xAxis[0].data[xIndex]; // 这里不直接用params.dataIndex是因为可能两个图表X轴的月份数据点不一致 const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate); myChart2.dispatchAction({ type: 'showTip', seriesIndex: num, // 我用的echarts版本是4.8.0,用name而不用dataIndex时,不知道为什么tooltip不显示,所以这里用dataIndex // name: params.name dataIndex: dataIndex, position: '15%' }); } else { myChart2.dispatchAction({ type: 'hideTip' }); } }) myChart2.getZr().on('mousemove', (params) => { const pointInPixel = [params.offsetX, params.offsetY]; // 判断当前鼠标移动的位置是否在图表中 if (myChart2.containPixel('grid', pointInPixel)) { //使用 convertFromPixel方法 转换像素坐标值到逻辑坐标系上的点。获取点击位置对应的x轴数据的索引值 const pointInGrid = myChart2.convertFromPixel({ seriesIndex: 0 }, pointInPixel); // x轴数据的索引值 const xIndex = pointInGrid[0]; // 使用getOption() 获取图表的option const op = myChart2.getOption(); // 获取当前点击位置要的数据 const xDate = op.xAxis[0].data[xIndex]; // 这里不直接用params.dataIndex是因为可能两个图表X轴的月份数据点不一致 const dataIndex = op.xAxis[0].data.findIndex(x => x === xDate); myChart1.dispatchAction({ type: 'showTip', seriesIndex: num, // 我用的echarts版本是4.8.0,用name而不用dataIndex时,不知道为什么tooltip不显示,所以这里用dataIndex // name: params.name dataIndex: dataIndex, position: '15%' }); } else { myChart1.dispatchAction({ type: 'hideTip' }); } }) }, // 数据是否为null,NaN,0的判断 isHasNum(data) { let num = null if (data && data !== 0) { if (data !== 'NaN' && data !== null) { num = Number(data).toFixed(2) } else { num = '-' } } else if (data === 0) { num = 0 } else { num = '-' } return num }, //获取当前月天数 hasYearMonthDate(a, b) { let d = new Date(a, b, 0) let de = d.getDate() return de }, // ------------------------------------------------------------------------ // 冒泡排序 sortBubble(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { let temp = arr[j] arr[j] = arr[j + 1] arr[j + 1] = temp } } } return arr }, //数组去重 // 方法一 //利用for 循环 搭配 indexOf 去重 unique(arr) { let newArr = [] for (let i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) { newArr.push(arr[i]) } } return arr }, //方法二 //借助ES6提供的Set结构 new Set() // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22]; // var arr2 = noRepeat(arr) noRepeatT(arr) { var newArr = [...new Set(arr)]; //利用了Set结构不能接收重复数据的特点 return newArr }, //方法三 //利用 filter() 去重 //eg: var arr = ['apple','apps','pear','apple','orange','apps'] useFilter(arr) { return arr.filter(function (item, index) { return arr.indexOf(item) === index; // 因为indexOf 只能查找到第一个 }) }, //方法四 //将数组的每一个元素依次与其他元素做比较,发现重复元素,删除 //eg: var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22]; noRepeatF(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; } } } return arr; }, //方法五 //借助新数组 通过 indexOf 方法判断当前元素在数组中的索引,如果与循环的下标相等则添加到新数组中 // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22] noRepeatFi(arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (arr.indexOf(arr[i]) == i) { newArr.push(arr[i]); } } return newArr; }, //方法六 //利用双重for循环 // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22] noRepeatS(arr) { for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr.length; j++) { if (arr[i] == arr[j] && i != j) { //将后面重复的数删掉 arr.splice(j, 1); } } } return arr; }, //方法七 //利用includes实现数组去重 // var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22]; noRepeatSe(arr) { let newArr = []; for (i = 0; i < arr.length; i++) { if (!newArr.includes(arr[i])) { newArr.push(arr[i]) } } return newArr }, //把url中的参数解析为一个对象 // var url = 'http://www.demo.cn/index.html?key1=val1&key2=val2' parseQueryString(argu) { let str = argu.split('?')[1] let result = {} let temp = str.split('&') for (let i = 0; i < temp.length; i++) { let temp2 = temp[i].split('=') result[temp2[0]] = temp2[1] } return result }, //统计字符串中出现最多的字母 // let str = 'jdjsajdjasdasdakss' countStr(str) { let json = {} //循环完毕后会得到一个对象 如{a:0,b:1,c:2} for (let i = 0; i < str.length; i++) { if (!json[str.charAt(i)]) { json[str.charAt(i)] = 1 } else { json[str.charAt(i)]++ } } }, //对象深拷贝 deepClone(obj) { if (obj instanceof Object) { let isArray = Array.isArray(obj) let cloneObj = isArray ? [] : {} for (let key in obj) { cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key] } return cloneObj } else { throw new Error('obj不是一个对象') } }, // 防抖 debounce(fn, delay) { var delay = delay || 200; var timer; return function () { var th = this; var args = arguments; if (timer) { clearTimeout(timer); } timer = setTimeout(function () { timer = null; fn.apply(th, args); }, delay); }; }, // 节流 throttle(fn, interval) { var last; var timer; var interval = interval || 200; return function () { var th = this; var args = arguments; var now = +new Date(); if (last && now - last < interval) { clearTimeout(timer); timer = setTimeout(function () { last = now; fn.apply(th, args); }, interval); } else { last = now; fn.apply(th, args); } } } } export default until