wujingjing
2025-04-14 1df71bdd7fc5b35be1447c9cc574bf610666f436
src/utils/util.ts
@@ -1,15 +1,50 @@
import type { Ref } from 'vue';
import JSONbig from 'json-bigint';
import { ElMessage, ElMessageBox } from 'element-plus';
import JSONbig from 'json-bigint';
import { storeToRefs } from 'pinia';
import type { Ref } from 'vue';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useThemeConfig } from '/@/stores/themeConfig';
import { storeToRefs } from 'pinia';
import request from '/@/utils/request';
// 导入依赖
import axios from 'axios';
import FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
import axios from 'axios';
import { MAIN_URL } from '../constants';
import { saveAs } from 'file-saver';
/**
 * 普通对象转为 formData
 * @param obj
 */
export const toFormData = (obj: any) => {
   const formData = new FormData();
   const addFormData = (subObj, prePrefix = '', isArray = false) => {
      for (const key in subObj) {
         if (Object.prototype.hasOwnProperty.call(subObj, key)) {
            const value = subObj[key];
            let currentKey = '';
            if (prePrefix === '') {
               currentKey = key;
            } else if (isArray) {
               currentKey = `${prePrefix}[${key}]`;
            } else {
               currentKey = `${prePrefix}.${key}`;
            }
            if (value != null && Array.isArray(value) && value.length > 0) {
               addFormData(value, currentKey, true);
            } else if (value != null && typeof value === 'object' && Object.values(value).length > 0) {
               addFormData(value, currentKey, false);
            } else {
               formData.append(currentKey, value);
            }
         }
      }
   };
   addFormData(obj);
   return formData;
};
/**
 * @description 当碰到 JSON 中存在过长的数字时,使用 JSONbigString 解析,数字会转为字符串处理
@@ -250,11 +285,11 @@
   callback: (value: T, index?, array?, parent?) => any,
   parent: any = null,
   markParent = false,
   childrenKey = 'Children'
   childrenKey = 'children'
) => {
   if (!treeData || treeData.length === 0) return;
   if (!parent) parent = treeData;
   for (let index = 0; index < treeData.length; index++) {
      const value = treeData[index] as any;
      if (markParent) {
@@ -503,28 +538,37 @@
   themeConfig.value.isTagsview = !isHide;
};
/**
 * 最近 n 天的 startDate、endDate
 * @param dates
 */
export const getRecentDateRange = (dates: number) => {
export const getRecentDateRange = (dates: number, includesCurrent = true) => {
   dates = includesCurrent ? dates - 1 : dates;
   // 获取当前日期
   const currentDate = new Date();
   const endDate = new Date();
   const startDate = new Date();
   startDate.setDate(currentDate.getDate() - dates + 1);
   // 将时分秒设为0
   startDate.setHours(0);
   startDate.setMinutes(0);
   startDate.setSeconds(0);
   // 获取当前日期作为终止节点
   const endDate = currentDate;
   return { startDate, endDate };
   startDate.setTime(startDate.getTime() - 3600 * 1000 * 24 * dates);
   endDate.setHours(23, 59, 59, 59);
   startDate.setHours(0, 0, 0, 0);
   return [startDate, endDate];
};
/**
 * 最近 n 天的 date
 * @param dates
 */
export const getRecentDate = (dates: number) => {
   // 获取当前日期
   const recentDate = new Date();
   recentDate.setTime(recentDate.getTime() - 3600 * 1000 * 24 * dates);
   recentDate.setHours(0, 0, 0, 0);
   return recentDate;
};
//#region ====================== 最近时间 ======================
export const getAWeek = () => getRecentDateRange(7);
export const getAWeek = () => {
   return getRecentDateRange(7);
};
export const getHalfMonth = () => getRecentDateRange(15);
export const getAMonth = () => getRecentDateRange(30);
export const getThreeMonth = () => getRecentDateRange(90);
@@ -578,11 +622,26 @@
export const toPercent = (num: number, havePercentSymbol = true, decimalPlaces = 1, defaultValue = '-') => {
   if (num == null) return `${defaultValue} %`;
   let percent = Number(num * 100).toFixed(decimalPlaces);
   const factor = Math.pow(10, decimalPlaces);
   let percent = Math.round(Number(num) * 100 * factor) / factor + '';
   if (havePercentSymbol) {
      percent += '%';
   }
   return percent;
};
/**
 * 保留指定精度小数位,且不补零
 * @param num
 * @param precision
 * @returns
 */
export const toMyFixed = (num, precision) => {
   if (num == null) return '';
   if (!precision) return num + '';
   const factor = Math.pow(10, precision);
   return Math.round(Number(num) * factor) / factor + '';
};
/**
@@ -656,3 +715,75 @@
export const arrayIsEmpty = (arr: any) => {
   return !arr || arr.length === 0;
};
type GetTextWidthOption = {
   size?: string;
   family?: string;
};
export function getTextWidth(text: string, option: GetTextWidthOption) {
   if (!text) return 0;
   const { size = '14px', family = 'Microsoft YaHei' } = option;
   const spanEle = document.createElement('span');
   document.body.appendChild(spanEle);
   spanEle.style.font = 'times new roman';
   spanEle.style.fontSize = size;
   spanEle.style.height = 'auto';
   spanEle.style.width = 'auto';
   spanEle.style.position = 'absolute';
   spanEle.style.whiteSpace = 'no-wrap';
   spanEle.innerHTML = text;
   const width = spanEle.clientWidth;
   document.body.removeChild(spanEle);
   return width;
}
export function decodeFormData(formDataString) {
   const params = new URLSearchParams(formDataString);
   const decodedData = {};
   for (const [key, value] of params) {
      decodedData[key] = decodeURIComponent(value);
   }
   return decodedData;
}
/**
 * 休眠指定秒数
 * @param seconds 休眠秒数
 * @returns Promise
 */
export const sleep = (seconds: number): Promise<void> => {
   return new Promise((resolve) => {
      setTimeout(resolve, seconds * 1000);
   });
};
/**
 * 下载文件
 * @param url 文件地址
 * [{
      类型: item.OTYPE,
      名称: item.ONAME,
      位置: item.WKT,
}]
 * @param fileName 文件名
 */
export const downloadExcel = (tableData: any[], fileName: string) => {
   // 创建工作簿
   const wb = XLSX.utils.book_new();
   // 创建工作表
   const ws = XLSX.utils.json_to_sheet(tableData);
   // 将工作表添加到工作簿
   XLSX.utils.book_append_sheet(wb, ws, '查询结果');
   // 生成 Excel 文件
   const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
   const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
   // 下载文件
   saveAs(blob, `${fileName}_${new Date().toLocaleDateString()}.xlsx`);
};