import { reactive } from 'vue' const STORAGE_KEY = 'overseas-pda-warehouse-work-v1' const blankState = () => ({ scopeKey: '', stocktake: { taskNo: '', scopeType: 'LOCATION', scopeCode: '', reason: '' }, move: { sourcePalletCode: '', targetLocationCode: '', reason: '' }, relabel: { currentNo: '', oldLabel: '', newLabel: '', action: 'RELABEL', reason: '', remark: '', photoFileIds: [], photoNames: [] }, returnReceipt: { entryMode: 'SKU', lookupCode: '', currentReturnNo: '', startedBy: 'SKU', trackingNo: '', palletCode: '', quantities: {}, boxCounts: {} }, returnPacking: { mode: 'SKU', searchCode: '', selectedOrders: [], quantities: {}, targetBoxes: [], sourceCartonMarks: [], targetCode: '', activePlan: null, result: null, putawayResults: {} }, returnPackingPlan: {}, warehouseTransfer: { currentNo: '' }, query: { inventoryCode: '', locationCode: '', palletCode: '' } }) export const warehouseWork = reactive(blankState()) function storageAvailable() { return typeof uni !== 'undefined' && typeof uni.setStorageSync === 'function' && typeof uni.getStorageSync === 'function' } function domain(value, fallback) { return Object.fromEntries(Object.keys(fallback).map(key => [key, value?.[key] ?? fallback[key]])) } export function persistWarehouseWork() { if (!storageAvailable() || !warehouseWork.scopeKey) return uni.setStorageSync(STORAGE_KEY, JSON.parse(JSON.stringify(warehouseWork))) } export function restoreWarehouseWork(scopeKey) { const expected = String(scopeKey || '') if (!expected) return false const saved = storageAvailable() ? uni.getStorageSync(STORAGE_KEY) : null const fresh = blankState() if (!saved || saved.scopeKey !== expected) { Object.assign(warehouseWork, fresh, { scopeKey: expected }) if (storageAvailable()) uni.removeStorageSync(STORAGE_KEY) return false } Object.assign(warehouseWork, fresh, { scopeKey: expected, stocktake: domain(saved.stocktake, fresh.stocktake), move: domain(saved.move, fresh.move), relabel: domain(saved.relabel, fresh.relabel), returnReceipt: domain(saved.returnReceipt, fresh.returnReceipt), returnPacking: domain(saved.returnPacking, fresh.returnPacking), returnPackingPlan: domain(saved.returnPackingPlan, fresh.returnPackingPlan), warehouseTransfer: domain(saved.warehouseTransfer, fresh.warehouseTransfer), query: { ...fresh.query, ...(saved.query || {}) } }) return true } export function updateWarehouseWork(name, patch) { if (!warehouseWork[name]) throw new Error('未知海外仓现场作业') Object.assign(warehouseWork[name], patch) persistWarehouseWork() } export function warehouseIdempotencyKey(name, action, _payload = {}) { if (!warehouseWork[name]) throw new Error('当前作业不支持写操作') return { value: `pda-${name}-${action}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}` } } export function resetWarehouseDomain(name) { const fresh = blankState() if (!fresh[name]) return warehouseWork[name] = fresh[name] persistWarehouseWork() } export function resetWarehouseWork() { Object.assign(warehouseWork, blankState()) if (typeof uni !== 'undefined' && typeof uni.removeStorageSync === 'function') uni.removeStorageSync(STORAGE_KEY) }