Files
xk-doctor-wx/subPackages/sub_salesperson/common/inputDraftStorage.js

110 lines
2.9 KiB
JavaScript
Raw Normal View History

2026-06-05 12:28:36 +08:00
/**
* 业务员录入本地草稿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 || '未填写姓名'
}