export function asList(raw) { if (Array.isArray(raw)) return raw.filter((x) => x && typeof x === 'object') if (raw && typeof raw === 'object') { const nested = raw.records || raw.list || raw.items || raw.messages || raw.projects || raw.data if (Array.isArray(nested)) return nested.filter((x) => x && typeof x === 'object') return [raw] } return [] } export function firstText(row, keys, fallback = '') { for (const k of keys) { const v = row && row[k] if (v != null && String(v).trim() && String(v) !== 'null') return String(v).trim() } return fallback } export function initial(name) { const s = String(name || '').trim() return s ? s.slice(0, 1) : '?' } export function maskPhone(phone) { const s = String(phone || '') if (s.length < 7) return s return s.slice(0, 3) + '****' + s.slice(-4) } function asDate(t) { if (t == null || t === '') return null let d const n = Number(t) if (!Number.isNaN(n) && String(t).length >= 10) { d = new Date(n < 1e12 ? n * 1000 : n) } else { d = new Date(t) } if (Number.isNaN(d.getTime())) return null return d } function dayStart(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime() } function period(d) { const h = d.getHours() if (h < 6) return '凌晨' if (h < 12) return '上午' if (h < 13) return '中午' if (h < 18) return '下午' return '晚上' } function hm12(d) { const h = d.getHours() % 12 || 12 const m = String(d.getMinutes()).padStart(2, '0') return `${h}:${m}` } export function fmtTime(t) { const d = asDate(t) if (!d) return t == null ? '' : String(t) const label = period(d) + hm12(d) const now = new Date() const diff = (dayStart(now) - dayStart(d)) / 86400000 if (diff === 0) return label if (diff === 1) return '昨天 ' + label if (diff < 7) { const week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] return week[d.getDay()] + ' ' + label } return `${d.getMonth() + 1}月${d.getDate()}日 ${label}` } export function fmtListTime(t) { const d = asDate(t) if (!d) return t == null ? '' : String(t) const now = new Date() const diff = (dayStart(now) - dayStart(d)) / 86400000 if (diff === 0) return period(d) + hm12(d) if (diff === 1) return '昨天' if (diff < 7) { const week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] return week[d.getDay()] } return `${d.getMonth() + 1}月${d.getDate()}日` } export function pad2(n) { return String(n).padStart(2, '0') } export function clockText(date) { const d = date || new Date() return `${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}` } export function yuan(v) { const n = Number(v) if (Number.isNaN(n)) return '' return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) } export function dmId(a, b) { const pair = [String(a), String(b)].sort() return `dm:${pair[0]}:${pair[1]}` } export function convType(s) { const t = String((s && s.type) || '') if (t === 'dm') return 'direct' if (t === 'group' || t === 'work' || t === 'files' || t === 'direct') return t const id = String((s && s.id) || '') if (id.startsWith('g:')) return 'group' if (id.startsWith('work:')) return 'work' if (id.startsWith('files:')) return 'files' return 'direct' } export function toast(title, icon = 'none') { uni.showToast({ title: String(title || ''), icon, duration: 2200 }) }