58 lines
1.4 KiB
JavaScript
58 lines
1.4 KiB
JavaScript
|
|
/**
|
|||
|
|
* 雪花 ID 全局处理:禁止 Number(),统一字符串传递。
|
|||
|
|
* JS Number.MAX_SAFE_INTEGER = 9007199254740991,雪花 id 超出后会精度丢失。
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
export function asId(value) {
|
|||
|
|
if (value == null || value === "") {
|
|||
|
|
return undefined;
|
|||
|
|
}
|
|||
|
|
return String(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 是否像主键/外键字段名 */
|
|||
|
|
export function isIdFieldName(key) {
|
|||
|
|
return key === "id" || key.endsWith("Id");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 对象内所有 *Id / id 字段转字符串 */
|
|||
|
|
export function withIds(obj = {}) {
|
|||
|
|
if (!obj || typeof obj !== "object") {
|
|||
|
|
return obj;
|
|||
|
|
}
|
|||
|
|
const next = { ...obj };
|
|||
|
|
Object.keys(next).forEach((key) => {
|
|||
|
|
if (isIdFieldName(key) && next[key] != null && next[key] !== "") {
|
|||
|
|
next[key] = asId(next[key]);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return next;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 分页/查询参数中的 id 字段转字符串 */
|
|||
|
|
export function normalizeQueryIds(query = {}) {
|
|||
|
|
const next = { ...query };
|
|||
|
|
Object.keys(next).forEach((key) => {
|
|||
|
|
if (isIdFieldName(key) && next[key] != null && next[key] !== "") {
|
|||
|
|
next[key] = asId(next[key]);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return next;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 兼容历史 Number() 精度丢失:比较雪花 id 前 16 位 */
|
|||
|
|
export function sameId(a, b) {
|
|||
|
|
const sa = asId(a);
|
|||
|
|
const sb = asId(b);
|
|||
|
|
if (!sa || !sb) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (sa === sb) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return sa.slice(0, 16) === sb.slice(0, 16);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** @deprecated 使用 sameId */
|
|||
|
|
export const sameDeptId = sameId;
|