import React, { useState, useEffect } from 'react' import { View, Text, ScrollView, Input, Switch } from '@tarojs/components' import Taro from '@tarojs/taro' import { useScrollHeight } from '@/hooks/useScrollHeight' import { getShopSettingByCategory, batchSaveShopSetting } from '@/api/shop/shopSetting' definePageConfig({ navigationBarTitleText: '商城设置', }) type Category = 'basic' | 'order' | 'points' | 'dealer' | 'notify' const CATEGORIES: { key: Category; label: string }[] = [ { key: 'basic', label: '基础设置' }, { key: 'order', label: '订单设置' }, { key: 'points', label: '积分设置' }, { key: 'dealer', label: '分销设置' }, { key: 'notify', label: '通知设置' }, ] const ShopSettingPage: React.FC = () => { const scrollHeight = useScrollHeight(44) const [activeCategory, setActiveCategory] = useState('basic') const [settings, setSettings] = useState>({}) const [loading, setLoading] = useState(false) const [saving, setSaving] = useState(false) useEffect(() => { fetchSettings(activeCategory) }, [activeCategory]) const fetchSettings = async (category: Category) => { setLoading(true) try { const list = await getShopSettingByCategory(category) const map: Record = {} list.forEach(item => { if (item.settingKey) { map[item.settingKey] = item.settingValue ?? '' } }) setSettings(map) } catch (e: any) { Taro.showToast({ title: e?.message || '加载失败', icon: 'none' }) } finally { setLoading(false) } } const handleSave = async () => { setSaving(true) try { await batchSaveShopSetting(activeCategory, settings as Record) Taro.showToast({ title: '保存成功', icon: 'success' }) } catch (e: any) { Taro.showToast({ title: e?.message || '保存失败', icon: 'none' }) } finally { setSaving(false) } } const handleChange = (key: string, value: string) => { setSettings(prev => ({ ...prev, [key]: value })) } const handleSwitchChange = (key: string, checked: boolean) => { setSettings(prev => ({ ...prev, [key]: checked ? '1' : '0' })) } const renderSettingItem = (key: string, label: string, type: 'text' | 'switch' | 'number' = 'text', placeholder = '') => { const value = settings[key] ?? '' if (type === 'switch') { return ( {label} handleSwitchChange(key, e.detail.value)} /> ) } return ( {label} handleChange(key, e.detail.value)} /> ) } const renderCategorySettings = () => { if (loading) { return ( 加载中... ) } switch (activeCategory) { case 'basic': return ( {renderSettingItem('shopName', '商城名称', 'text', '请输入商城名称')} {renderSettingItem('shopLogo', '商城Logo', 'text', '请输入Logo地址')} {renderSettingItem('shopDesc', '商城描述', 'text', '请输入商城描述')} {renderSettingItem('shopPhone', '客服电话', 'text', '请输入客服电话')} {renderSettingItem('shopAddress', '商城地址', 'text', '请输入商城地址')} {renderSettingItem('shopEnabled', '商城开关', 'switch')} ) case 'order': return ( {renderSettingItem('orderAutoConfirmDays', '自动确认收货(天)', 'number', '如: 7')} {renderSettingItem('orderAutoCloseMins', '未付款自动关闭(分钟)', 'number', '如: 30')} {renderSettingItem('orderAutoCommentDays', '自动好评(天)', 'number', '如: 15')} {renderSettingItem('orderFreightFreeAmount', '免运费金额', 'number', '如: 99')} {renderSettingItem('orderRefundEnabled', '允许退款', 'switch')} ) case 'points': return ( {renderSettingItem('pointsEnabled', '积分功能', 'switch')} {renderSettingItem('pointsSigninEnabled', '签到积分', 'switch')} {renderSettingItem('pointsSigninAmount', '每日签到积分', 'number', '如: 10')} {renderSettingItem('pointsOrderRate', '消费积分比例(元/积分)', 'number', '如: 10')} {renderSettingItem('pointsExchangeRate', '积分兑换比例(积分/元)', 'number', '如: 100')} ) case 'dealer': return ( {renderSettingItem('dealerEnabled', '分销功能', 'switch')} {renderSettingItem('dealerApplyEnabled', '开放申请', 'switch')} {renderSettingItem('dealerLevel1Rate', '一级佣金比例(%)', 'number', '如: 10')} {renderSettingItem('dealerLevel2Rate', '二级佣金比例(%)', 'number', '如: 5')} {renderSettingItem('dealerWithdrawMin', '最低提现金额', 'number', '如: 10')} ) case 'notify': return ( {renderSettingItem('notifyOrderEnabled', '订单通知', 'switch')} {renderSettingItem('notifyPayEnabled', '支付通知', 'switch')} {renderSettingItem('notifyRefundEnabled', '退款通知', 'switch')} {renderSettingItem('notifyShipEnabled', '发货通知', 'switch')} {renderSettingItem('notifySignEnabled', '签收通知', 'switch')} ) default: return null } } return ( {/* 分类 Tab */} {CATEGORIES.map(cat => ( setActiveCategory(cat.key)} > {cat.label} {activeCategory === cat.key && ( )} ))} {renderCategorySettings()} {/* 保存按钮 */} {!loading && ( {saving ? '保存中...' : '保存设置'} )} ) } export default ShopSettingPage