110 lines
2.9 KiB
JavaScript
110 lines
2.9 KiB
JavaScript
|
|
/**
|
|||
|
|
* 业务员录入本地草稿(uni.setStorageSync)
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
export const MAX_DRAFTS = 20
|
|||
|
|
|
|||
|
|
const STORAGE_VERSION = 'v1'
|
|||
|
|
|
|||
|
|
function readJson(key) {
|
|||
|
|
try {
|
|||
|
|
const raw = uni.getStorageSync(key)
|
|||
|
|
if (!raw) return []
|
|||
|
|
return typeof raw === 'string' ? JSON.parse(raw) : raw
|
|||
|
|
} catch (e) {
|
|||
|
|
return []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function writeJson(key, data) {
|
|||
|
|
try {
|
|||
|
|
uni.setStorageSync(key, JSON.stringify(data))
|
|||
|
|
return true
|
|||
|
|
} catch (e) {
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function storageUserSuffix() {
|
|||
|
|
const user = uni.getStorageSync('salesperson_user') || {}
|
|||
|
|
if (user.id != null && user.id !== '') return String(user.id)
|
|||
|
|
const token = uni.getStorageSync('salesperson_token') || ''
|
|||
|
|
if (!token) return 'anon'
|
|||
|
|
let hash = 0
|
|||
|
|
for (let i = 0; i < token.length; i += 1) {
|
|||
|
|
hash = (hash * 31 + token.charCodeAt(i)) | 0
|
|||
|
|
}
|
|||
|
|
return 't' + Math.abs(hash)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function storageKey(type) {
|
|||
|
|
return `salesperson.inputDraft.${STORAGE_VERSION}.${storageUserSuffix()}.${type}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function newDraftId() {
|
|||
|
|
return `draft_${Date.now()}_${Math.floor(Math.random() * 10000)}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function listDrafts(type) {
|
|||
|
|
const list = readJson(storageKey(type))
|
|||
|
|
if (!Array.isArray(list)) return []
|
|||
|
|
return list.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function getDraft(type, draftId) {
|
|||
|
|
if (!draftId) return null
|
|||
|
|
return listDrafts(type).find((d) => d.id === draftId) || null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function removeDraft(type, draftId) {
|
|||
|
|
const key = storageKey(type)
|
|||
|
|
const list = listDrafts(type).filter((d) => d.id !== draftId)
|
|||
|
|
writeJson(key, list)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function saveDraft(type, { name, form, ui, draftId }) {
|
|||
|
|
const trimmed = String(name || '').trim()
|
|||
|
|
if (!trimmed) {
|
|||
|
|
throw new Error('请输入草稿名称')
|
|||
|
|
}
|
|||
|
|
const key = storageKey(type)
|
|||
|
|
let list = listDrafts(type)
|
|||
|
|
const now = Math.floor(Date.now() / 1000)
|
|||
|
|
const payload = {
|
|||
|
|
id: draftId || newDraftId(),
|
|||
|
|
name: trimmed,
|
|||
|
|
updatedAt: now,
|
|||
|
|
form: JSON.parse(JSON.stringify(form || {})),
|
|||
|
|
ui: JSON.parse(JSON.stringify(ui || {})),
|
|||
|
|
}
|
|||
|
|
const idx = list.findIndex((d) => d.id === payload.id)
|
|||
|
|
if (idx >= 0) {
|
|||
|
|
list[idx] = payload
|
|||
|
|
} else {
|
|||
|
|
if (list.length >= MAX_DRAFTS) {
|
|||
|
|
throw new Error(`最多保存 ${MAX_DRAFTS} 个草稿,请先删除旧草稿`)
|
|||
|
|
}
|
|||
|
|
list.push(payload)
|
|||
|
|
}
|
|||
|
|
const ok = writeJson(key, list)
|
|||
|
|
if (!ok) {
|
|||
|
|
throw new Error('保存失败,存储空间可能不足,请删除部分草稿或图片后再试')
|
|||
|
|
}
|
|||
|
|
return payload
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function formatDraftTime(ts) {
|
|||
|
|
if (!ts) return ''
|
|||
|
|
const d = new Date(Number(ts) * 1000)
|
|||
|
|
const pad = (n) => String(n).padStart(2, '0')
|
|||
|
|
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function draftSummary(type, form) {
|
|||
|
|
if (!form) return ''
|
|||
|
|
if (type === 'store') {
|
|||
|
|
return form.name || form.contact || form.mobile || '未填写名称'
|
|||
|
|
}
|
|||
|
|
return form.name || form.mobile || '未填写姓名'
|
|||
|
|
}
|