import React, { useEffect } from 'react' import {View, Text} from '@tarojs/components' import {ConfigProvider, Button, Grid, Avatar, Badge} from '@nutui/nutui-react-taro' import { User, Shopping, Dongdong, ArrowRight, Purse, People, Scan, Setting } from '@nutui/icons-react-taro' import {useDealerUser} from '@/hooks/useDealerUser' import {useUser} from '@/hooks/useUser' import { useThemeStyles } from '@/hooks/useTheme' import { useRiderNotification } from '@/hooks/useRiderNotification' import {businessGradients, cardGradients, gradientUtils} from '@/styles/gradients' import {updateShopDealerUser} from '@/api/shop/shopDealerUser' import Taro from '@tarojs/taro' const DealerIndex: React.FC = () => { const { dealerUser, error, refresh, } = useDealerUser() // 获取用户角色信息 const { hasRole } = useUser() // 配送员通知功能 const { pendingCount, startPolling, stopPolling, soundEnabled, toggleSound } = useRiderNotification() // 页面生命周期管理 useEffect(() => { startPolling() return () => stopPolling() }, [startPolling, stopPolling]) // 使用主题样式 const themeStyles = useThemeStyles() // 导航到各个功能页面 const navigateToPage = (url: string) => { Taro.navigateTo({url}) } // 格式化金额 const formatMoney = (money?: string) => { if (!money) return '0.00' return parseFloat(money).toFixed(2) } // 格式化时间 const formatTime = (time?: string) => { if (!time) return '-' return new Date(time).toLocaleDateString() } // 获取用户主题 const userTheme = gradientUtils.getThemeByUserId(dealerUser?.userId) // 获取渐变背景 const getGradientBackground = (themeColor?: string) => { if (themeColor) { const darkerColor = gradientUtils.adjustColorBrightness(themeColor, -30) return gradientUtils.createGradient(themeColor, darkerColor) } return userTheme.background } console.log(getGradientBackground(),'getGradientBackground()') // 判断是否是配送员 const isRider = hasRole('rider') // 请求订阅消息授权 const handleRequestSubscribeMessage = () => { // 微信订阅消息模板ID(需在微信公众平台配置后替换) const templateIds = [ 'YOUR_TEMPLATE_ID', // TODO: 替换为实际的订阅消息模板ID ] // 过滤出有效的模板ID const validTemplateIds = templateIds.filter(id => id && !id.includes('YOUR_')) if (validTemplateIds.length === 0) { Taro.showModal({ title: '提示', content: '订阅消息功能尚未配置,请联系管理员', showCancel: false }) return } // 请求订阅 Taro.requestSubscribeMessage({ tmplIds: validTemplateIds, success: (res) => { console.log('订阅消息授权结果:', res) const accepted = Object.values(res).some(v => v === 'accept') if (accepted) { Taro.showToast({ title: '订阅成功', icon: 'success' }) // 保存授权状态到本地 Taro.setStorageSync('rider_subscribed', '1') } else { Taro.showToast({ title: '您已拒绝订阅', icon: 'none' }) } }, fail: (err) => { console.error('订阅消息授权失败:', err) Taro.showToast({ title: '授权失败', icon: 'none' }) } }) } // 点击待使用金额 - 配送员专用:将冻结金额转入可提现 const handleFreezeMoneyClick = async () => { // 检查是否是配送员 if (!isRider) { return } // 检查冻结金额是否为 0 const freezeMoney = Number(dealerUser?.freezeMoney ?? 0) if (freezeMoney <= 0) { return } // 弹出确认框 Taro.showModal({ title: '确认操作', content: `确定要将 ¥${freezeMoney.toFixed(2)} 转入钱包吗?`, confirmText: '确定', cancelText: '取消', success: async (res) => { if (res.confirm) { try { Taro.showLoading({ title: '处理中...' }) const currentMoney = Number(dealerUser?.money ?? 0) await updateShopDealerUser({ id: dealerUser?.id, money: (currentMoney + freezeMoney).toFixed(2), freezeMoney: '0.00' }) Taro.hideLoading() Taro.showToast({ title: '更新成功', icon: 'success', duration: 1500 }) // 刷新数据 refresh() } catch (error) { Taro.hideLoading() Taro.showToast({ title: '更新失败', icon: 'none', duration: 1500 }) } } } }) } if (error) { return ( {error} ) } return ( {/*头部信息*/} {dealerUser && ( {/* 装饰性背景元素 - 小程序兼容版本 */} } className="mr-4" style={{ border: '2px solid rgba(255, 255, 255, 0.3)' }} /> {dealerUser?.realName || '分销商'} ID: {dealerUser.userId} 加入时间 {formatTime(dealerUser.createTime)} )} {/* 佣金统计卡片 */} {dealerUser && ( 配送提成 {formatMoney(dealerUser.money)} 本月配送佣金 0 ? 1 : 0.8 }} onClick={isRider && Number(dealerUser.freezeMoney ?? 0) > 0 ? handleFreezeMoneyClick : undefined} > {formatMoney(dealerUser.freezeMoney)} {isRider && Number(dealerUser.freezeMoney ?? 0) > 0 ? '待使用' : '待使用'} {formatMoney(dealerUser.totalMoney)} 累计收入 )} {/* 团队统计 */} {dealerUser && ( 我的邀请 navigateToPage('/dealer/team/index')} > 查看详情 {dealerUser.firstNum || 0} 一级成员 {dealerUser.secondNum || 0} 二级成员 {dealerUser.thirdNum || 0} 三级成员 )} {/* 功能导航 */} 配送工具 navigateToPage('/rider/orders/index')}> {pendingCount > 0 && ( 99 ? '99+' : pendingCount} max={99} style={{ position: 'absolute', top: '-4px', right: '-4px' }} /> )} navigateToPage('/rider/withdraw/index')}> navigateToPage('/rider/team/index')}> navigateToPage('/rider/qrcode/index')}> navigateToPage('/rider/ticket/verification/index?auto=1')}> {/* 第二行功能 - 通知设置 */} { const isSubscribed = Taro.getStorageSync('rider_subscribed') === '1' Taro.showModal({ title: '通知设置', content: `声音提醒:${soundEnabled ? '已开启' : '已关闭'}\n订阅消息:${isSubscribed ? '已订阅' : '未订阅'}`, confirmText: '更多设置', cancelText: '关闭', success: (res) => { if (res.confirm) { // 显示更多设置选项 Taro.showActionSheet({ itemList: [ soundEnabled ? '关闭声音提醒' : '开启声音提醒', isSubscribed ? '订阅状态正常' : '订阅消息通知', '检查更新' ], success: (sheetRes) => { if (sheetRes.tapIndex === 0) { // 切换声音 toggleSound() Taro.showToast({ title: soundEnabled ? '已关闭声音' : '已开启声音', icon: 'none' }) } else if (sheetRes.tapIndex === 1) { // 订阅消息 if (!isSubscribed) { handleRequestSubscribeMessage() } else { Taro.showToast({ title: '已订阅消息通知', icon: 'success' }) } } else if (sheetRes.tapIndex === 2) { Taro.showToast({ title: '已是最新版本', icon: 'success' }) } } }) } } }) }}> {soundEnabled ? ( ) : ( )} {/* 预留功能位置 */} {/* 底部安全区域 */} ) } export default DealerIndex