103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
/** 草稿 Storage 命名空间(统一 key 前缀) */
|
||
export const DRAFT_NS = {
|
||
ASSIGN: 'draft_assign',
|
||
ACCEPT: 'draft_accept',
|
||
RECTIFY: 'draft_rectify',
|
||
INSPECTION_RESULT: 'draft_inspection_result',
|
||
INSPECTION_SHEET: 'draft_inspection_sheet'
|
||
};
|
||
|
||
/**
|
||
* 构建草稿 Storage key(与迁移前页面逻辑一致,保留空片段)
|
||
* 例:draft_rectify_100_ 、draft_accept_
|
||
* @param {string} namespace 命名空间,如 DRAFT_NS.ASSIGN
|
||
* @param {...string|number} parts 业务 id 片段
|
||
*/
|
||
export function buildDraftKey(namespace, ...parts) {
|
||
return [namespace, ...parts.map((p) => String(p ?? ''))].join('_');
|
||
}
|
||
|
||
/** 迁移期 compact key(曾错误地 filter 掉空片段) */
|
||
export function buildDraftKeyCompact(namespace, ...parts) {
|
||
return [namespace, ...parts.map((p) => String(p ?? '')).filter(Boolean)].join('_');
|
||
}
|
||
|
||
/**
|
||
* 读取草稿,支持回退到其它 key(迁移兼容)
|
||
* @param {string} primaryKey
|
||
* @param {string[]} [fallbackKeys]
|
||
*/
|
||
export function loadDraftWithFallback(primaryKey, fallbackKeys = []) {
|
||
const primary = loadDraft(primaryKey);
|
||
if (primary) {
|
||
return { data: primary, key: primaryKey, fromFallback: false };
|
||
}
|
||
|
||
for (const fallbackKey of fallbackKeys) {
|
||
if (!fallbackKey || fallbackKey === primaryKey) continue;
|
||
const fallback = loadDraft(fallbackKey);
|
||
if (fallback) {
|
||
return { data: fallback, key: primaryKey, fromFallback: true, fallbackKey };
|
||
}
|
||
}
|
||
|
||
return { data: null, key: primaryKey, fromFallback: false };
|
||
}
|
||
|
||
/**
|
||
* 读取草稿
|
||
* @param {string} key
|
||
* @returns {Object|null}
|
||
*/
|
||
export function loadDraft(key) {
|
||
if (!key) return null;
|
||
|
||
const raw = uni.getStorageSync(key);
|
||
if (!raw) return null;
|
||
|
||
try {
|
||
return typeof raw === 'string' ? JSON.parse(raw) : raw;
|
||
} catch (error) {
|
||
console.error('[draftCache] 解析草稿失败:', key, error);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 写入草稿
|
||
* @param {string} key
|
||
* @param {Object} data
|
||
*/
|
||
export function saveDraftToStorage(key, data) {
|
||
if (!key) return;
|
||
|
||
uni.setStorageSync(
|
||
key,
|
||
JSON.stringify({
|
||
...data,
|
||
updatedAt: Date.now()
|
||
})
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 删除草稿
|
||
* @param {string} key
|
||
*/
|
||
export function removeDraft(key) {
|
||
if (!key) return;
|
||
uni.removeStorageSync(key);
|
||
}
|
||
|
||
/** 默认:payload 中任一字段有值即视为有内容(忽略 updatedAt) */
|
||
export function defaultHasContent(payload) {
|
||
if (!payload || typeof payload !== 'object') return false;
|
||
|
||
return Object.entries(payload).some(([key, value]) => {
|
||
if (key === 'updatedAt') return false;
|
||
if (Array.isArray(value)) return value.length > 0;
|
||
if (value && typeof value === 'object') return Object.keys(value).length > 0;
|
||
return value !== '' && value != null;
|
||
});
|
||
}
|