| | |
| | | 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 解析,数字会转为字符串处理 |
| | |
| | | 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) { |
| | |
| | | |
| | | 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); |
| | |
| | | |
| | | 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 + ''; |
| | | }; |
| | | |
| | | /** |
| | |
| | | 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`); |
| | | }; |