import Taro from '@tarojs/taro' import type { DesignItem, OrderItem, AddressItem } from '../types' const THEME_KEY = 'smart_theme' const USER_KEY = 'smart_user_info' const ACTIVE_USER_KEY = 'smart_active_openid' // ---------- 当前用户 openid 管理 ---------- function getActiveOpenid(): string { const user = getUserInfoRaw() const openid = user?.openid || Taro.getStorageSync(ACTIVE_USER_KEY) || '_guest_' Taro.setStorageSync(ACTIVE_USER_KEY, openid) return openid } function key(scope: string): string { const prefix = getActiveOpenid() return `${scope}_${prefix}` } // ---------- 用户数据 ---------- export function getUserInfoRaw(): any { try { return Taro.getStorageSync(USER_KEY) } catch { return null } } export function setUserInfoRaw(info: any) { Taro.setStorageSync(USER_KEY, info) if (info?.openid) { Taro.setStorageSync(ACTIVE_USER_KEY, info.openid) } } export function clearUserInfo() { Taro.removeStorageSync(USER_KEY) Taro.removeStorageSync(ACTIVE_USER_KEY) } export function setUserInfo(info: any) { setUserInfoRaw(info) } export function getUserInfo() { return getUserInfoRaw() } // ---------- 设计清单 ---------- export function getDesignList(): DesignItem[] { try { return Taro.getStorageSync(key('design_list')) || [] } catch { return [] } } export function setDesignList(list: DesignItem[]) { Taro.setStorageSync(key('design_list'), list) } export function addDesign(product: any, count: number): DesignItem { const list = getDesignList() const item: DesignItem = { id: 'DSG' + Date.now(), productId: product.id, productName: product.name, productIcon: product.icon, unitPrice: product.price, count, status: 'undesigned', createdAt: new Date().toISOString().slice(0, 10) } setDesignList([...list, item]) return item } export function updateDesign(id: string, patch: Partial) { const list = getDesignList() const idx = list.findIndex(d => d.id === id) if (idx === -1) return list[idx] = { ...list[idx], ...patch } setDesignList(list) } // ---------- 订单 ---------- export function getOrderList(): OrderItem[] { try { return Taro.getStorageSync(key('order_list')) || [] } catch { return [] } } export function setOrderList(list: OrderItem[]) { Taro.setStorageSync(key('order_list'), list) } export function designToOrder(designId: string): OrderItem | null { const dList = getDesignList() const oList = getOrderList() const design = dList.find(d => d.id === designId) if (!design) return null const order: OrderItem = { id: 'ORD' + Date.now().toString().slice(-9), productName: design.productName, productIcon: design.productIcon, statusCode: 'pending', date: new Date().toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }).replace(/\//g, '-'), price: '¥' + (design.unitPrice * design.count).toFixed(2), count: design.count, sku: `${design.productName} × ${design.count}` } const dIdx = dList.findIndex(d => d.id === designId) if (dIdx !== -1) { dList[dIdx].status = 'ordered' dList[dIdx].orderId = order.id } setDesignList(dList) setOrderList([order, ...oList]) return order } // ---------- 主题 ---------- export type ThemeMode = 'light' | 'dark' export function getTheme(): ThemeMode { try { return Taro.getStorageSync(THEME_KEY) || 'light' } catch { return 'light' } } export function setTheme(theme: ThemeMode) { Taro.setStorageSync(THEME_KEY, theme) } // ---------- 收货地址 ---------- export function getAddressList(): AddressItem[] { try { return Taro.getStorageSync(key('address_list')) || [] } catch { return [] } } export function setAddressList(list: AddressItem[]) { Taro.setStorageSync(key('address_list'), list) } export function addAddress(addr: Omit): AddressItem { const list = getAddressList() const item: AddressItem = { ...addr, id: 'ADR' + Date.now() } // 若设为默认,取消其他默认 if (item.isDefault) { list.forEach(a => { a.isDefault = false }) } setAddressList([item, ...list]) return item } export function updateAddress(id: string, patch: Partial) { const list = getAddressList() const idx = list.findIndex(a => a.id === id) if (idx === -1) return if (patch.isDefault) list.forEach(a => { a.isDefault = false }) list[idx] = { ...list[idx], ...patch } setAddressList(list) } export function deleteAddress(id: string) { const list = getAddressList().filter(a => a.id !== id) setAddressList(list) } export function getDefaultAddress(): AddressItem | undefined { return getAddressList().find(a => a.isDefault) }