|
/** 库存/数量显示:保留最多6位小数,去掉末尾多余的0(不强制补零) */
|
export const formatQuantity = (value) => {
|
if (value == null || value === '') return '0';
|
const n = Number(value);
|
if (Number.isNaN(n)) return '0';
|
if (n < 0) return '0';
|
return n % 1 === 0 ? String(n) : n.toFixed(6).replace(/\.?0+$/, '');
|
};
|
|
/** 校验最多 N 位小数,用于数量类字段;超过时返回错误信息并阻止提交 */
|
export const maxDecimalPlaces = (maxDecimals, message) => {
|
const factor = Math.pow(10, maxDecimals);
|
const msg = message || `最多${maxDecimals}位小数`;
|
return (value) => {
|
if (value == null || value === '') return undefined;
|
const n = Number(value);
|
if (Number.isNaN(n)) return undefined;
|
const rounded = Math.round(n * factor) / factor;
|
if (Math.abs(n - rounded) > 1e-10) return msg;
|
return undefined;
|
};
|
};
|
|
/** 判断数值是否超过 6 位小数(用于提交前校验) */
|
export const hasMoreThan6Decimals = (value) => {
|
if (value == null || value === '') return false;
|
const n = Number(value);
|
if (Number.isNaN(n)) return false;
|
const rounded = Math.round(n * 1e6) / 1e6;
|
return Math.abs(n - rounded) > 1e-10;
|
};
|
|
export const extractNavMenus = (data) => {
|
if (!data) {
|
return;
|
}
|
const navMenus = [];
|
const traverse = (nodes) => {
|
nodes.forEach((node) => {
|
if (!node.children) {
|
navMenus.push(node);
|
} else {
|
traverse(node.children);
|
}
|
});
|
};
|
traverse(data);
|
return navMenus;
|
};
|
|
export const integrateParams = (_params) => {
|
const { pagination, sort, filter, ...other } = _params;
|
return {
|
current: pagination?.page,
|
pageSize: pagination?.perPage,
|
orderBy: sort?.field + ' ' + sort?.order,
|
...filter,
|
...other
|
}
|
}
|
|
export const camelToPascalWithSpaces = (camelCaseString) => {
|
if (typeof camelCaseString !== 'string') {
|
return '';
|
}
|
if (camelCaseString.trim() === '') {
|
return '';
|
}
|
return camelCaseString
|
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
.replace(/^\w/, (c) => c.toUpperCase());
|
}
|
|
export const flattenTree = (nodes, depth = 0) => {
|
let result = [];
|
nodes.forEach(node => {
|
result.push({ ...node, depth });
|
if (node.children && node.children.length > 0) {
|
result = result.concat(flattenTree(node.children, depth + 1));
|
}
|
});
|
return result;
|
};
|
|
export const haveChildren = (item) => {
|
if (Array.isArray(item)) {
|
return item.map((k) => haveChildren(k));
|
}
|
|
if (item && typeof item === 'object') {
|
if (item.id !== undefined) {
|
item.id = item.id.toString();
|
}
|
|
if (item.children && Array.isArray(item.children)) {
|
item.children = haveChildren(item.children);
|
}
|
}
|
|
return item;
|
};
|