"use client" import { useEffect, useState } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Switch } from "@/components/ui/switch" import { Slider } from "@/components/ui/slider" import { Badge } from "@/components/ui/badge" import { Save, Percent, Users, Wallet, Info } from "lucide-react" type ReferralConfig = { distributorShare: number minWithdrawAmount: number bindingDays: number userDiscount: number enableAutoWithdraw: boolean } const DEFAULT_REFERRAL_CONFIG: ReferralConfig = { distributorShare: 90, minWithdrawAmount: 10, bindingDays: 30, userDiscount: 5, enableAutoWithdraw: false, } export default function ReferralSettingsPage() { const [config, setConfig] = useState(DEFAULT_REFERRAL_CONFIG) const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) useEffect(() => { const loadConfig = async () => { try { const res = await fetch("/api/db/config?key=referral_config") if (res.ok) { const data = await res.json() if (data?.success && data.config) { setConfig({ distributorShare: data.config.distributorShare ?? 90, minWithdrawAmount: data.config.minWithdrawAmount ?? 10, bindingDays: data.config.bindingDays ?? 30, userDiscount: data.config.userDiscount ?? 5, enableAutoWithdraw: data.config.enableAutoWithdraw ?? false, }) } } } catch (e) { console.error("加载 referral_config 失败:", e) } finally { setLoading(false) } } loadConfig() }, []) const handleSave = async () => { setSaving(true) try { // 确保所有字段都是正确类型(防止字符串导致计算错误) const safeConfig = { distributorShare: Number(config.distributorShare) || 0, minWithdrawAmount: Number(config.minWithdrawAmount) || 0, bindingDays: Number(config.bindingDays) || 0, userDiscount: Number(config.userDiscount) || 0, enableAutoWithdraw: Boolean(config.enableAutoWithdraw), } const body = { key: "referral_config", config: safeConfig, description: "分销 / 推广规则配置", } const res = await fetch("/api/db/config", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }) const data = await res.json() if (!res.ok || !data?.success) { alert("保存失败: " + (data?.error || res.statusText)) return } alert("✅ 分销配置已保存成功!\n\n• 小程序与网站的推广规则会一起生效\n• 绑定关系会使用新的天数配置\n• 佣金比例会立即应用到新订单\n\n如有缓存,请刷新前台/小程序页面。") } catch (e: any) { console.error("保存 referral_config 失败:", e) alert("保存失败: " + (e?.message || String(e))) } finally { setSaving(false) } } const handleNumberChange = (field: keyof ReferralConfig) => (e: React.ChangeEvent) => { const value = parseFloat(e.target.value || "0") setConfig((prev) => ({ ...prev, [field]: isNaN(value) ? 0 : value })) } return (

推广 / 分销设置

统一管理「好友优惠」「你得 90% 收益」「绑定期 30 天」「提现门槛」等规则,小程序和 Web 共用这套配置。

{/* 核心规则卡片 */} 推广规则 这三项会直接体现在小程序「推广规则」卡片上,同时影响实收佣金计算。

例如 5 表示好友立减 5%(在价格配置基础上生效)。

setConfig((prev) => ({ ...prev, distributorShare: val }))} />

实际佣金 = 订单金额 × {" "} {config.distributorShare}%,支付回调和分销统计都会用这个值。

好友通过你的链接进来并登录后,绑定在你名下的天数。

{/* 提现与自动提现 */} 提现规则 与「提现中心」「自动提现」相关的参数,影响推广者看到的可提现金额和最低门槛。

小程序「满 X 元可提现」展示的门槛,同时用于后端接口校验。

setConfig((prev) => ({ ...prev, enableAutoWithdraw: checked }))} /> 开启后,可结合定时任务实现「收益自动打款到微信零钱」。
{/* 提示卡片 */} 使用说明

1. 以上配置会写入 system_config.referral_config,小程序「推广中心」、 Web 推广页以及支付回调都会读取同一份配置。

2. 修改后新订单立即生效;旧订单的历史佣金不会自动重算,只影响之后产生的订单。

3. 如遇前端展示与实际结算不一致,优先以此处配置为准,再排查缓存和小程序版本。

) }