/** 草稿 Storage 命名空间(统一 key 前缀) */ export const DRAFT_NS = { ASSIGN: 'draft_assign', ACCEPT: 'draft_accept', ACCEPT_APPROVAL: 'draft_accept_approval', RECTIFY: 'draft_rectify', INSPECTION_RESULT: 'draft_inspection_result', INSPECTION_SHEET: 'draft_inspection_sheet', HAZARD_ADD: 'draft_hazard_add' }; /** * 构建草稿 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; }); }