import { useCallback, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import type { StoreBankAccountDto } from '@dukang/shared-types'; import { request } from '../lib/api'; import { useStoreSession } from '../contexts/StoreSessionContext'; import { useStorePageView } from '../lib/usePageView'; type FormState = { id?: string; bankAccountName: string; bankAccountNo: string; bankBranch: string; }; const EMPTY_FORM: FormState = { bankAccountName: '', bankAccountNo: '', bankBranch: '' }; export default function BankAccountsPage() { useStorePageView('store_bank_accounts_view'); const navigate = useNavigate(); const { store } = useStoreSession(); const isPrimary = !!store?.isPrimary; const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [msg, setMsg] = useState(''); const [form, setForm] = useState(EMPTY_FORM); const [fieldErrors, setFieldErrors] = useState>>({}); const [submitting, setSubmitting] = useState(false); const load = useCallback(async () => { try { const res = await request('SHOP_H5', '/shop/store/bank-accounts'); setItems(res ?? []); } catch (e) { setMsg(e instanceof Error ? e.message : '加载失败'); } finally { setLoading(false); } }, []); useEffect(() => { void load(); }, [load]); function startCreate() { setForm(EMPTY_FORM); setFieldErrors({}); } function startEdit(item: StoreBankAccountDto) { setForm({ id: item.id, bankAccountName: item.bankAccountName, bankAccountNo: item.bankAccountNo, bankBranch: item.bankBranch ?? '', }); setFieldErrors({}); } async function submit() { const name = form.bankAccountName.trim(); const no = form.bankAccountNo.replace(/\s+/g, ''); const branch = form.bankBranch.trim(); const next: Partial> = {}; if (!name) next.bankAccountName = '请填写收款人'; if (!/^\d{8,32}$/.test(no)) next.bankAccountNo = '请填写 8~32 位数字账号'; setFieldErrors(next); if (Object.keys(next).length) return; setSubmitting(true); setMsg(''); try { const body = JSON.stringify({ bankAccountName: name, bankAccountNo: no, bankBranch: branch }); if (form.id) { await request('SHOP_H5', `/shop/store/bank-accounts/${form.id}`, { method: 'PUT', body, }); } else { await request('SHOP_H5', '/shop/store/bank-accounts', { method: 'POST', body }); } setForm(EMPTY_FORM); await load(); } catch (e) { setMsg(e instanceof Error ? e.message : '保存失败'); } finally { setSubmitting(false); } } async function setDefault(id: string) { setMsg(''); try { await request('SHOP_H5', `/shop/store/bank-accounts/${id}/default`, { method: 'POST' }); await load(); } catch (e) { setMsg(e instanceof Error ? e.message : '设置失败'); } } async function remove(id: string) { setMsg(''); try { await request('SHOP_H5', `/shop/store/bank-accounts/${id}`, { method: 'DELETE' }); await load(); } catch (e) { setMsg(e instanceof Error ? e.message : '删除失败'); } } const editing = !!form.id; return (

收款账户

用于总部打款,可维护多个账户;标记「默认」的账户用于提现打款,切换即时生效、无需重启。

{loading ? (

加载中…

) : items.length === 0 ? (

暂无收款账户{isPrimary ? ',请新增' : ''}

) : (
{items.map((it) => (
收款人 {it.bankAccountName} {it.isDefault ? ( 默认 ) : null}

账号: {it.bankAccountNo}

{it.bankBranch ?

开户行: {it.bankBranch}

: null}
{isPrimary ? (
{!it.isDefault ? ( ) : null} {!it.isDefault ? ( ) : null}
) : null}
))}
)} {isPrimary ? (

{editing ? '编辑账户' : '新增账户'}

setForm({ ...form, bankAccountName: e.target.value })} /> {fieldErrors.bankAccountName ? (

{fieldErrors.bankAccountName}

) : null} setForm({ ...form, bankAccountNo: e.target.value.replace(/[^\d]/g, '') })} /> {fieldErrors.bankAccountNo ? (

{fieldErrors.bankAccountNo}

) : null} setForm({ ...form, bankBranch: e.target.value })} />
{editing ? ( ) : null}
) : (

仅主账号可维护收款账户

)} {msg ?

{msg}

: null}
); }