import React, { useEffect, useState } from "react"; import { Plus, Search, X, Pencil, Trash2 } from "lucide-react"; import { formatDateTime } from "./time.js"; const endpoint = "/api/admin/refund-payment-accounts"; const money = (fen) => (fen / 100).toFixed(2); const emptyForm = () => ({ name: "", alipay_account: "", balance: "0.00", single_limit: "500.00", is_active: true }); export default function RefundManagementPage({ api }) { const [data, setData] = useState({ items: [], total: 0 }); const [query, setQuery] = useState(""); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [reload, setReload] = useState(0); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [editing, setEditing] = useState(null); const [form, setForm] = useState(emptyForm); const [saving, setSaving] = useState(false); const [saveError, setSaveError] = useState(""); const [deleting, setDeleting] = useState(null); const [deleteError, setDeleteError] = useState(""); useEffect(() => { let cancelled = false; setLoading(true); setError(""); const timer = setTimeout(async () => { try { const result = await api(`${endpoint}?${new URLSearchParams({ q: query, page, page_size: pageSize })}`); if (!cancelled) setData(result.data); } catch (err) { if (!cancelled) setError(err.message); } finally { if (!cancelled) setLoading(false); } }, 250); return () => { cancelled = true; clearTimeout(timer); }; }, [api, query, page, pageSize, reload]); function open(account) { setEditing(account || {}); setForm(account ? { name: account.name, alipay_account: account.alipay_account, balance: money(account.balance_fen), single_limit: money(account.single_limit_fen), is_active: account.is_active } : emptyForm()); setSaveError(""); } async function save(event) { event.preventDefault(); if (saving) return; setSaving(true); setSaveError(""); try { if (!form.name.trim() || !form.alipay_account.trim()) throw new Error("请填写账户名称和支付宝账户"); for (const [key, label] of [["balance", "可用余额"], ["single_limit", "单次付款限额"]]) { if (!/^\d+(\.\d{1,2})?$/.test(form[key]) || Number(form[key]) > 9999999.99 || (key === "single_limit" && Number(form[key]) <= 0)) { throw new Error(`${label}需填写有效金额,最多两位小数,最高 9999999.99 元${key === "single_limit" ? ",且必须大于 0" : ""}`); } } await api(editing.id ? `${endpoint}/${editing.id}` : endpoint, { method: editing.id ? "PATCH" : "POST", body: JSON.stringify(form), }); setEditing(null); setPage(1); setReload((n) => n + 1); } catch (err) { setSaveError(typeof err.message === "string" ? err.message : "保存失败,请检查填写内容"); } finally { setSaving(false); } } async function remove(account) { if (deleting !== null || !window.confirm(`确定删除付款账户“${account.name}”(${account.alipay_account})吗?删除后无法恢复。`)) return; setDeleting(account.id); setDeleteError(""); try { await api(`${endpoint}/${account.id}`, { method: "DELETE" }); setPage(1); setReload((n) => n + 1); } catch (err) { setDeleteError(err.message || "删除失败,请重试"); } finally { setDeleting(null); } } const pages = Math.max(1, Math.ceil(data.total / pageSize)); return <>

返款管理

管理返款使用的支付宝付款账户。

代付接口暂未接入,此处仅维护付款账户资料,不会发起转账。可用余额为人工录入值,后续接入接口后再同步。
{error ?
{error}
: null} {deleteError &&
{deleteError}
}
{loading ? : error ? null : data.items.length ? data.items.map((account) => ) : }
类型账户名称支付宝账户可用余额单次付款限额状态更新时间操作
加载中…
支付宝{account.name}{account.alipay_account} ¥{money(account.balance_fen)}¥{money(account.single_limit_fen)} {account.is_active ? "启用" : "禁用"} {formatDateTime(account.updated_at)}
{query ? "未找到匹配账户" : "暂无付款账户,请点击新增付款账户"}
共 {data.total} 条记录 {page} / {pages}
{editing &&

{editing.id ? "编辑付款账户" : "新增付款账户"}

余额由人工维护;保存资料不会产生实际付款。

{saveError &&
{saveError}
}
} ; }