UNPKG

vamp-utils

Version:
527 lines (511 loc) 20.4 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('xlsx'), require('dayjs'), require('axios'), require('jszip')) : typeof define === 'function' && define.amd ? define(['exports', 'xlsx', 'dayjs', 'axios', 'jszip'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.vampUtils = {}, global.XLSX, global.dayjs, global.axios, global.JSZip)); })(this, (function (exports, XLSX, dayjs, axios, JSZip) { 'use strict'; /** * 处理 Excel 文件导入 * @param evt 文件导入事件对象 * @param fieldMapping 字段映射表 (中文字段 -> 英文字段) * @param callback 导入完成回调函数 */ const handleImport = (evt, fieldMapping, callback) => { const [file] = evt.target.files; if (!file) return; const reader = new FileReader(); reader.onload = (loadEvent) => { if (!loadEvent.target) return; try { const data = loadEvent.target.result; const workBook = XLSX.read(data, { type: 'buffer' }); const [sheetName] = workBook.SheetNames; if (!sheetName) return; const sheet = workBook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 0, }); // 转换字段名 const translatedData = jsonData.map((row) => { const newRow = {}; for (const key in row) { if (fieldMapping[key]) { newRow[fieldMapping[key]] = row[key]; } } return newRow; }); // if receiving translatedData is not Array, first change to Array callback(translatedData); // 清空文件输入 const fileInput = evt.target; fileInput.value = ''; } catch (error) { console.error('Excel导入错误:', error); throw new Error('Excel文件处理失败'); } }; reader.onerror = () => { throw new Error('文件读取失败'); }; reader.readAsArrayBuffer(file); }; /** * 导出数据到 Excel 文件 * @param config 导出配置 */ const exportToExcel = (config) => { try { const { data, chineseHeader, fieldMapping, fileName } = config; // 准备 Excel 数据 const excelData = data.map((row) => { return fieldMapping.map((field) => { var _a; return (_a = row[field]) !== null && _a !== void 0 ? _a : ''; }); }); // 添加中文表头 excelData.unshift(chineseHeader); // console.log(XLSX,'xlsx'); // 创建工作表并导出 const ws = XLSX.utils.aoa_to_sheet(excelData); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); XLSX.writeFile(wb, `${fileName}.xlsx`); } catch (error) { console.error('Excel导出错误:', error); throw new Error('Excel导出失败'); } }; // 布尔工具函数 const trueSet = new Set([true, 'true']); const falseSet = new Set([ false, 'false', undefined, null, 'undefined', 'null', ]); function parseBoolean(value) { if (trueSet.has(value)) { return true; } if (falseSet.has(value)) { return false; } return !!value; } function and(array = []) { if (!array.length) { return false; } return array.map(parseBoolean).reduce((previousValue, currentValue) => previousValue && currentValue, true); } function or(array = []) { if (!array.length) { return false; } return array.map(parseBoolean).reduce((previousValue, currentValue) => previousValue || currentValue, false); } // import * as dayjs from 'dayjs'; function formatDateTime(date, template = 'YYYY-MM-DD HH:mm:ss') { if (!date) return ''; return dayjs(date).format(template); } function formatDate(date, template = 'YYYY-MM-DD') { if (!date) return ''; return dayjs(date).format(template); } /** * 设置date的时间为23:59:59 * @param date */ function endTimeOfDate(date = new Date()) { return dayjs(date).endOf('day').toDate(); } function startTimeOfDay(date = new Date()) { return dayjs(date).startOf('day').toDate(); } function randomString(expect = 16) { let str = Math.random().toString(36).substring(2); while (str.length < expect) { str += Math.random().toString(36).substring(2); } return str.substring(0, expect); } /** * 切分string,默认以中英文逗号,空格,换号,制表符分割 * @param value * @param regexp */ function splitString(value, regexp = /[,|,|\t|\n|\r|\s]/) { if (!value) { return []; } return value.split(regexp).filter(item => !!item); } function addSeparator(url) { if (url.startsWith('/')) { return url; } return `/${url}`; } function normalizeNumber(num, length) { const intValue = num.toFixed(0); if (intValue.length >= length) { return intValue; } const zeroLength = length - intValue.length; const zeros = new Array(zeroLength).fill(0).join(''); return `${zeros}${intValue}`; } const WithoutChineseTextRegexp = /^[^\u4e00-\u9fa5]*$/; function containsChineseText(str) { if (!str) { return true; } return !WithoutChineseTextRegexp.test(str); } function randomFilename(filename) { const index = filename.lastIndexOf("."); // const suffix = filename.substr(index); const suffix = filename.substring(index); // const suffix = filename.slice(index); return randomString() + suffix; } function getFilenameByUrl(url) { const index = url.lastIndexOf("/"); // return url.substr(index + 1); return url.substring(index + 1); } function downloadFile(response, filename) { // 提取文件名 const disposition = response.headers["content-disposition"]; const fileName = filename || disposition.match(/filename=(.*)/)[1]; // 将二进制流转为blob const blob = new Blob([response.data], { type: "application/octet-stream" }); downloadBlob(blob, fileName); } function downloadBlob(blob, fileName) { if (typeof window.navigator.msSaveBlob !== "undefined") { // 兼容IE,window.navigator.msSaveBlob:以本地方式保存文件 window.navigator.msSaveBlob(blob, decodeURI(fileName)); } else { // 创建新的URL并指向File对象或者Blob对象的地址 const blobURL = window.URL.createObjectURL(blob); // 创建a标签,用于跳转至下载链接 const tempLink = document.createElement("a"); tempLink.style.display = "none"; tempLink.href = blobURL; tempLink.setAttribute("download", decodeURI(fileName)); // 兼容:某些浏览器不支持HTML5的download属性 if (typeof tempLink.download === "undefined") { tempLink.setAttribute("target", "_blank"); } // 挂载a标签 document.body.appendChild(tempLink); tempLink.click(); document.body.removeChild(tempLink); // 释放blob URL地址 window.URL.revokeObjectURL(blobURL); } } function downloadAndZipFiles(zipFilename, files) { const zipInstance = new JSZip(); const downloadTasks = files.map(({ url, filename }) => { return axios .get(url, { responseType: "blob", }) .then((response) => { return { filename, data: response.data, }; }); }); return Promise.all(downloadTasks) .then((files) => { files.forEach((item) => { zipInstance.file(item.filename, item.data); }); return zipInstance.generateAsync({ type: "blob" }); }) .then((blob) => { downloadBlob(blob, `${zipFilename}.zip`); }); } function zipBlobs(filename, files) { const zipInstance = new JSZip(); files.forEach((item) => { zipInstance.file(item.filename, item.data); }); return zipInstance.generateAsync({ type: "blob" }).then((zipData) => { downloadBlob(zipData, `${filename}.zip`); }); } // export function download<T = any>(response: AxiosResponse<T>, filename?: string): void { // // console.log(response, filename); // const headers = // response.headers || response.config?.headers || (response as any).$headers; // // const contentDisposition = // // headers?.["content-disposition"] || headers?.get?.("content-disposition"); // const contentDisposition = // (headers && headers["content-disposition"]) || // (headers && // typeof headers.get === "function" && // headers.get("content-disposition")); // let finalFilename = "export_" + new Date().getTime() + ".xlsx"; // if (contentDisposition) { // const filenameRegex = // /filename\*?=['"]?(?:UTF-\d['"]*)?([^;\r\n"']*)['"]?;?/gi; // const matches = filenameRegex.exec(contentDisposition); // finalFilename = // matches && matches[1] ? decodeURIComponent(matches[1]) : finalFilename; // } // return downloadToBlob(response.data, finalFilename); // } // export default function download(response: AxiosResponse<Blob>, filename?: string): void { // const headers = response.headers || response.config?.headers; // const contentDisposition = headers?.["content-disposition"] || // (headers && typeof headers.get === 'function' && headers.get("content-disposition")); // let finalFilename = filename || "export_" + new Date().getTime() + ".xlsx"; // if (contentDisposition) { // const filenameRegex = /filename\*?=['"]?(?:UTF-\d['"]*)?([^;\r\n"']*)['"]?;?/gi; // const matches = filenameRegex.exec(contentDisposition); // finalFilename = matches && matches[1] ? decodeURIComponent(matches[1]) : finalFilename; // } // // 确保正确处理 Blob 类型 // const blob = response.data instanceof Blob ? response.data : new Blob([response.data]); // downloadToBlob(blob, finalFilename); // } // add 2025-7-30 function downloadToBlob(blob, filename) { const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename + ".xlsx"; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; // import { ElMessage } from 'element-plus'; // // 统一导出函数 // export function exportFile( // endpoint: string, // 导出接口路径 // params?: any, // 请求参数 // options: { // // 配置选项 // method?: 'post' | 'get'; // headers?: Record<string, string>; // requestConfig?: AxiosRequestConfig; // } = {} // ): Promise<AxiosResponse<Blob>> { // // 默认配置 // const defaultConfig = { // method: 'post', // headers: { // 'Content-Type': 'application/x-www-form-urlencoded', // Accept: // 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // }, // responseType: 'blob', // transformResponse: (data: any, headers: any) => ({ // data, // headers, // }), // }; // // 合并配置 // const mergedConfig = { // ...defaultConfig, // ...options, // headers: { // ...defaultConfig.headers, // ...(options.headers || {}), // }, // }; // // 处理请求参数 // const serializedParams = qs.stringify(params, { indices: false }); // const requestData = // mergedConfig.method === 'post' ? serializedParams : undefined; // const requestParams = // mergedConfig.method === 'get' ? { params: serializedParams } : {}; // const BASE_URL = '/tms/shipment-orders/page-group'; // // 发起请求 // return request({ // url: `${BASE_URL}${endpoint}`, // method: mergedConfig.method, // data: requestData, // ...requestParams, // ...mergedConfig.requestConfig, // headers: mergedConfig.headers, // responseType: mergedConfig.responseType, // transformResponse: mergedConfig.transformResponse, // }); // } // 使用示例 - 导出订单 // export function exportPrintDataOrder(params?: any) { // return exportFile('/exports/order', params); // } // // 使用示例 - 导出用户数据(自定义header) // export function exportUserReport(params: any) { // return exportFile('/exports/user', params, { // headers: { 'X-Custom-Header': 'value' } // }); // } // // 使用示例 - GET方式导出 // export function exportLogs(params: any) { // return exportFile('/exports/logs', params, { // method: 'get' // }); // } // 添加 Blob 转 JSON 的辅助函数 const parseBlobError = (blob) => __awaiter(void 0, void 0, void 0, function* () { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { try { // 尝试解析 JSON const errorData = JSON.parse(reader.result); resolve(errorData); } catch (e) { // 解析失败时返回默认错误 resolve({ code: 'PARSE_ERROR', message: '解析错误信息失败', }); } }; reader.onerror = () => reject(new Error('读取 Blob 失败')); reader.readAsText(blob); }); }); // export async function handleCatchReaponseError(err) { // // 处理 Axios 错误 // if (axios.isAxiosError(err) && err.response?.data instanceof Blob) { // try { // // 解析 Blob 错误响应 // const errorData = await parseBlobError(err.response.data); // ElMessage.error(`导出失败: ${errorData.message || errorData.code}`); // } catch (parseError) { // ElMessage.error('解析错误信息时发生异常'); // } // } else { // // 常规错误处理 // const msg = (err as Error).message || '未知导出错误'; // ElMessage.error(`导出失败: ${msg}`); // } // } /** * 生成随机整数 * @param min 最小值 * @param max 最大值 * @returns 随机整数 */ function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } /** * 格式化金额 * @param amount 金额数字 * @param symbol 货币符号 * @returns 格式化后的字符串 */ function formatMoney(amount, symbol = "¥") { // 处理无效数值 if (isNaN(amount) || !isFinite(amount)) { return `${symbol}0.00`; } // 处理负数 const isNegative = amount < 0; const absoluteValue = Math.abs(amount); // 格式化为两位小数 const parts = absoluteValue.toFixed(2).split("."); const integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); const decimalPart = parts[1]; return `${isNegative ? "-" : ""}${symbol}${integerPart}.${decimalPart}`; } /** * 深拷贝对象 * @param obj 要拷贝的对象 * @returns 深拷贝后的对象 */ function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } /** * 防抖函数 * @param fn 要执行的函数 * @param delay 延迟时间(ms) * @returns 防抖函数 */ // 更新 debounce 函数声明 function debounce(fn, delay = 300) { let timer; return function (...args) { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); }; } exports.WithoutChineseTextRegexp = WithoutChineseTextRegexp; exports.addSeparator = addSeparator; exports.and = and; exports.containsChineseText = containsChineseText; exports.debounce = debounce; exports.deepClone = deepClone; exports.downloadAndZipFiles = downloadAndZipFiles; exports.downloadBlob = downloadBlob; exports.downloadFile = downloadFile; exports.downloadToBlob = downloadToBlob; exports.endTimeOfDate = endTimeOfDate; exports.exportToExcel = exportToExcel; exports.formatDate = formatDate; exports.formatDateTime = formatDateTime; exports.formatMoney = formatMoney; exports.getFilenameByUrl = getFilenameByUrl; exports.handleImport = handleImport; exports.normalizeNumber = normalizeNumber; exports.or = or; exports.parseBlobError = parseBlobError; exports.parseBoolean = parseBoolean; exports.randomFilename = randomFilename; exports.randomInt = randomInt; exports.randomString = randomString; exports.splitString = splitString; exports.startTimeOfDay = startTimeOfDay; exports.zipBlobs = zipBlobs; })); //# sourceMappingURL=vamp-utils.umd.js.map