123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629 |
- // 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
|