180 lines
5.3 KiB
JavaScript
180 lines
5.3 KiB
JavaScript
import request from "./request";
|
||
import {
|
||
setStorageWithExpiry,
|
||
getStorageWithExpiry
|
||
} from './auth'
|
||
|
||
export async function getDictDataByType(type) {
|
||
let data = getStorageWithExpiry(type);
|
||
if (data === null || data === undefined || data.length == 0) {
|
||
try {
|
||
const response = await request({
|
||
url: '/system/dict-data/type',
|
||
method: 'get',
|
||
params: {
|
||
type
|
||
}
|
||
});
|
||
data = response.data;
|
||
setStorageWithExpiry(type, data, 3600); // 存储数据并设置过期时间
|
||
} catch (error) {
|
||
console.error("请求字典数据时出现了异常:", error);
|
||
throw error; // 确保错误能够被外部捕获
|
||
}
|
||
}
|
||
return data;
|
||
}
|
||
|
||
export function formatDate(timestamp) {
|
||
if (!timestamp) {
|
||
return ""
|
||
}
|
||
// 将时间戳转换为Date对象
|
||
const date = new Date(timestamp);
|
||
// 获取年月日时分秒
|
||
const year = date.getFullYear();
|
||
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||
const day = date.getDate().toString().padStart(2, '0');
|
||
// 组合成日期时间字符串
|
||
return `${year}-${month}-${day}`;
|
||
}
|
||
export function formatDateChinese(timestamp) {
|
||
// 将时间戳转换为Date对象
|
||
const date = new Date(timestamp);
|
||
// 获取年月日时分秒
|
||
const year = date.getFullYear();
|
||
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||
const day = date.getDate().toString().padStart(2, '0');
|
||
// 组合成日期时间字符串
|
||
return `${year}年${month}月${day}日`;
|
||
}
|
||
|
||
export function formatDateTimeToMinute(timestamp) {
|
||
// 将时间戳转换为 Date 对象
|
||
const date = new Date(timestamp);
|
||
// 获取年月日时分
|
||
const year = date.getFullYear();
|
||
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||
const day = date.getDate().toString().padStart(2, '0');
|
||
const hours = date.getHours().toString().padStart(2, '0');
|
||
const minutes = date.getMinutes().toString().padStart(2, '0');
|
||
// 组合成日期时间字符串(格式:yyyy-MM-dd hh:mm)
|
||
return `${year}-${month}-${day} ${hours}:${minutes}`;
|
||
}
|
||
|
||
/**
|
||
* 构造树型结构数据
|
||
* @param {*} data 数据源
|
||
* @param {*} id id字段 默认 'id'
|
||
* @param {*} parentId 父节点字段 默认 'parentId'
|
||
* @param {*} children 孩子节点字段 默认 'children'
|
||
* @param {*} rootId 根Id 默认 0
|
||
*/
|
||
/**
|
||
* 将扁平数组转换为树形结构,并支持按 sort 字段排序
|
||
* @param {Array} data 源数据
|
||
* @param {String} id 节点ID字段名,默认为 'id'
|
||
* @param {String} parentId 父节点ID字段名,默认为 'parentId'
|
||
* @param {String} children 子节点字段名,默认为 'children'
|
||
* @param {Number|String} rootId 根节点ID值,默认为最小的parentId或0
|
||
* @param {String} sortKey 排序字段名,默认为 'sort'
|
||
* @returns {Array} 树形结构数据
|
||
*/
|
||
export function handleTree(data, id, parentId, children, rootId, sortKey) {
|
||
// 参数默认值处理
|
||
id = id || 'id';
|
||
parentId = parentId || 'parentId';
|
||
children = children || 'children';
|
||
sortKey = sortKey || 'sort';
|
||
|
||
// 自动计算根节点ID(取最小的parentId,若无则用0)
|
||
rootId = rootId || Math.min(...data.map(item => item[parentId])) || 0;
|
||
|
||
// 深拷贝源数据以避免污染原数组
|
||
const cloneData = JSON.parse(JSON.stringify(data));
|
||
|
||
// 先对所有数据进行排序(确保父节点在前)
|
||
cloneData.sort((a, b) => {
|
||
const aSort = a[sortKey] ?? 0; // 使用空值合并运算符处理undefined
|
||
const bSort = b[sortKey] ?? 0;
|
||
return aSort - bSort; // 升序排序
|
||
});
|
||
|
||
// 构建哈希表加速查找
|
||
const nodeMap = {};
|
||
cloneData.forEach(item => {
|
||
nodeMap[item[id]] = item;
|
||
item[children] = []; // 初始化children数组
|
||
});
|
||
|
||
// 构建树形结构
|
||
const tree = [];
|
||
cloneData.forEach(item => {
|
||
if (item[parentId] === rootId) {
|
||
// 根节点直接加入结果
|
||
tree.push(item);
|
||
} else {
|
||
// 非根节点找到父节点并插入
|
||
const parent = nodeMap[item[parentId]];
|
||
parent?.[children]?.push(item);
|
||
}
|
||
});
|
||
|
||
// 递归排序所有子节点
|
||
const sortChildren = (nodes) => {
|
||
nodes.forEach(node => {
|
||
if (node[children]?.length) {
|
||
node[children].sort((a, b) => {
|
||
const aSort = a[sortKey] ?? 0;
|
||
const bSort = b[sortKey] ?? 0;
|
||
return aSort - bSort;
|
||
});
|
||
sortChildren(node[children]);
|
||
}
|
||
});
|
||
};
|
||
sortChildren(tree);
|
||
|
||
return tree.length ? tree : data; // 空树时返回原数据
|
||
}
|
||
|
||
export function getDateRange(type) {
|
||
const now = new Date()
|
||
let start, end
|
||
|
||
if (type === 'week') {
|
||
// 获取本周的开始(周一)和结束(周日)
|
||
const day = now.getDay() || 7 // Sunday 为 0,设为 7
|
||
start = new Date(now)
|
||
start.setDate(now.getDate() - day + 1)
|
||
|
||
end = new Date(start)
|
||
end.setDate(start.getDate() + 6)
|
||
} else if (type === 'month') {
|
||
// 获取本月的开始和结束
|
||
start = new Date(now.getFullYear(), now.getMonth(), 1)
|
||
end = new Date(now.getFullYear(), now.getMonth() + 1, 0) // 本月最后一天
|
||
}else if (type === 'day') {
|
||
// 获取当天的开始和结束(00:00:00 到 23:59:59)
|
||
start = new Date(now)
|
||
start.setHours(0, 0, 0, 0)
|
||
|
||
end = new Date(now)
|
||
end.setHours(23, 59, 59, 999)
|
||
} else {
|
||
console.warn('不支持的类型:', type)
|
||
return []
|
||
}
|
||
|
||
return [
|
||
formatDateCus(start),
|
||
formatDateCus(end)
|
||
]
|
||
}
|
||
|
||
export function formatDateCus(date) {
|
||
const y = date.getFullYear()
|
||
const m = (date.getMonth() + 1).toString().padStart(2, '0')
|
||
const d = date.getDate().toString().padStart(2, '0')
|
||
return `${y}-${m}-${d}`
|
||
} |