import axios from "axios"; import FileSaver from "file-saver"; import { getToken } from "@/utils/auth"; /** * 删除对象中的空值 * @param {object} obj * @returns {Object} */ export function deleteEmptyObj(obj) { const newObj = obj; for (var key in newObj) { if ( newObj[key] === "" || newObj[key] === null || newObj[key] === undefined ) { delete newObj[key]; } } return newObj; } /** * * @param {*} array 要查询的数组 * @param {*} attr 要查询的字段 * @param {*} val 要查询的字段值 * @returns */ export function findElem(array, attr, val) { for (var i = 0; i < array.length; i++) { if (array[i][attr] == val) { return i; // 返回当前索引值 } } return -1; } /** * 生成带参数的链接 * @param {String} url * @param {Object} params * @returns */ export function createParamsUrl(url, params) { if (typeof url === "undefined" || url == null || url == "") { return ""; } if ( typeof params === "undefined" || params == null || typeof params !== "object" ) { return ""; } url += url.indexOf("?") != -1 ? "" : "?"; for (var k in params) { url += (url.indexOf("=") != -1 ? "&" : "") + k + "=" + encodeURI(params[k]); } return url; } /** * 导出功能 * @param {*} obj * @returns */ export function downloadFiles(url, params = {}) { params.token = getToken(); const newParams = deleteEmptyObj(params); const newUrl = createParamsUrl(url, newParams); console.log(process.env.VUE_APP_BASE_API + newUrl); window.open(process.env.VUE_APP_BASE_API + newUrl); } /** * 导入功能 * @param {*} url * @param {*} formData */ export async function handleImport(url, formData) { const Result = await new Promise((resolve, reject) => { axios .post( process.env.VUE_APP_BASE_API + url, formData, { headers: { "Content-Type": "multipart/form-data", "x-token": getToken(), }, } ) .then((res) => { resolve(res.data); }) .catch((err) => { reject(err); }); }); return Result; } /** * 导入有返回二进制文件 * @param {*} url * @param {*} formData */ export async function handleImportTwo(url, formData) { const Result = await new Promise((resolve, reject) => { axios .post( process.env.VUE_APP_BASE_API + url, formData, { responseType: "arraybuffer", headers: { "Content-Type": "multipart/form-data", "x-token": getToken(), }, } ) .then((res) => { resolve(res.data); }) .catch((err) => { reject(err); }); }); return Result; } /** * 重置时间格式 * @param {*} date * @param {*} type */ export function resetDateFormat(date, type) { let newDate = ""; if (!date) { return ""; } // type=1: yyyy-MM-dd 转 yyyy-MM-dd HH:mm:ss if (type == 1 || !type) { newDate = date + " 00:00:00"; } } /** * 若文档中已有命名dateFormat,可用dFormat()调用 * 年(Y) 可用1-4个占位符 * 月(m)、日(d)、小时(H)、分(M)、秒(S) 可用1-2个占位符 * 星期(W) 可用1-3个占位符 * 季度(q为阿拉伯数字,Q为中文数字)可用1或4个占位符 * * let date = new Date() * dateFormat("YYYY-mm-dd HH:MM:SS", date) 2020-02-09 14:04:23 * dateFormat("YYYY-mm-dd HH:MM:SS Q", date) 2020-02-09 14:09:03 一 * dateFormat("YYYY-mm-dd HH:MM:SS WWW", date) 2020-02-09 14:45:12 星期日 * dateFormat("YYYY-mm-dd HH:MM:SS QQQQ", date) 2020-02-09 14:09:36 第一季度 * dateFormat("YYYY-mm-dd HH:MM:SS WWW QQQQ", date) 2020-02-09 14:46:12 星期日 第一季度 */ export function dateFormat(format, date) { const we = date.getDay(); // 星期 const qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度 const opt = { "Y+": date.getFullYear().toString(), // 年 "m+": (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1) "d+": date.getDate().toString(), // 日 "H+": date.getHours().toString(), // 时 "M+": date.getMinutes().toString(), // 分 "S+": date.getSeconds().toString(), // 秒 "q+": qut, // 季度 }; const week = { // 中文数字 (星期) 0: "日", 1: "一", 2: "二", 3: "三", 4: "四", 5: "五", 6: "六", }; const quarter = { // 中文数字(季度) 1: "一", 2: "二", 3: "三", 4: "四", }; if (/(W+)/.test(format)) { format = format.replace( RegExp.$1, RegExp.$1.length > 1 ? RegExp.$1.length > 2 ? "星期" + week[we] : "周" + week[we] : week[we] ); } if (/(Q+)/.test(format)) { // 输入一个Q,只输出一个中文数字,输入4个Q,则拼接上字符串 format = format.replace( RegExp.$1, RegExp.$1.length == 4 ? "第" + quarter[qut] + "季度" : quarter[qut] ); } for (const k in opt) { const r = new RegExp("(" + k + ")").exec(format); if (r) { // 若输入的长度不为1,则前面补零 format = format.replace( r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, "0") ); } } return format; } /** * @param url {string} pdf地址 * @param fileName {string} pdf名称 */ export function downloadPdf(url, fileName) { axios({ method: "get", url, responseType: "blob", }).then((res) => { const file = new Blob([res.data], { type: "application/pdf", }); FileSaver(file, fileName); }); } export function changeNumberMoneyToChinese(money) { // 接收数字或者字符串数字 if (typeof money === "string") { if (money === "") return ""; if (isNaN(parseFloat(money))) { throw Error(`参数有误:${money},请输入数字或字符串数字`); } else { // 去掉分隔符(,) money = money.replace(/,/g, ""); } } else if (typeof money === "number") { // 去掉分隔符(,) money = money.toString().replace(/,/g, ""); } else { throw Error(`参数有误:${money},请输入数字或字符串数字`); } // 汉字的数字 const cnNums = [ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", ]; // 基本单位 const cnIntRadice = ["", "拾", "佰", "仟"]; // 对应整数部分扩展单位 const cnIntUnits = ["", "万", "亿", "兆"]; // 对应小数部分单位 const cnDecUnits = ["角", "分", "毫", "厘"]; // 整数金额时后面跟的字符 const cnInteger = "整"; // 整型完以后的单位 const cnIntLast = "元"; // 金额整数部分 let IntegerNum; // 金额小数部分 let DecimalNum; // 输出的中文金额字符串 let ChineseStr = ""; // 正负值标记 let Symbol = ""; // 转成浮点数 money = parseFloat(money); // 如果是0直接返回结果 if (money === 0) { ChineseStr = cnNums[0] + cnIntLast + cnInteger; return ChineseStr; } // 如果小于0,则将Symbol标记为负,并转为正数 if (money < 0) { money = -money; Symbol = "负 "; } // 转换为字符串 money = money.toString(); // 将整数部分和小数部分分别存入IntegerNum和DecimalNum if (money.indexOf(".") === -1) { IntegerNum = money; DecimalNum = ""; } else { const moneyArr = money.split("."); IntegerNum = moneyArr[0]; DecimalNum = moneyArr[1].substr(0, 4); } // 获取整型部分转换 if (parseInt(IntegerNum, 10) > 0) { let zeroCount = 0; let IntLen = IntegerNum.length; for (let i = 0; i < IntLen; i++) { // 获取整数的每一项 let term = IntegerNum.substr(i, 1); // 剩余待处理的数量 let surplus = IntLen - i - 1; // 用于获取整数部分的扩展单位 // 剩余数量除以4,比如12345,term为1时,expandUnit则为1, // cnIntUnits[expandUnit]对应得到的单位为万 let expandUnit = surplus / 4; // 用于获取整数部分的基本单位 // 剩余数量取余4,比如123,那么第一遍遍历term为1,surplus为2,baseUnit则为2, // 所以cnIntRadice[baseUnit]对应得到的基本单位为'佰' let baseUnit = surplus % 4; if (term === "0") { zeroCount++; } else { // 连续存在多个0的时候需要补'零' if (zeroCount > 0) { ChineseStr += cnNums[0]; } // 归零 zeroCount = 0; /* cnNums是汉字的零到玖组成的数组,term则是阿拉伯0-9, 直接将阿拉伯数字作为下标获取中文数字 例如term是0则cnNums[parseInt(term)]取的就是'零',9取的就是'玖' 最后加上单位就转换成功了! 这里只加十百千的单位 */ ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]; } /* 如果baseUnit为0,意味着当前项和下一项隔了一个节权位即隔了一个逗号 扩展单位只有大单位进阶才需要,判断是否大单位进阶,则通过zeroCount判断 baseUnit === 0即存在逗号,baseUnit === 0 && zeroCount < 4 意为大单位进阶 */ if (baseUnit === 0 && zeroCount < 4) { ChineseStr += cnIntUnits[expandUnit]; } } ChineseStr += cnIntLast; } // 小数部分转换 if (DecimalNum !== "") { let decLen = DecimalNum.length; for (let i = 0; i < decLen; i++) { // 同理,参考整数部分 let term = DecimalNum.substr(i, 1); if (term !== "0") { ChineseStr += cnNums[Number(term)] + cnDecUnits[i]; } } } ChineseStr = Symbol + ChineseStr; return ChineseStr; }