import { useEffect, useMemo, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { ArrowLeft, FileText, MessageSquare, Server } from 'lucide-react'; import { adminApi, type ClientSmsSignature, type ClientSmsTemplate, type EnterpriseApplication, type TenantAccount, type TenantOption } from '@/api/adminApi'; import { Breadcrumb, Button, Table, Tag, type TableColumn } from '@/components/ui'; export function AdminCustomerDetailPage() { const navigate = useNavigate(); const { enterpriseId } = useParams(); const [tenant, setTenant] = useState(null); const [account, setAccount] = useState(null); const [applications, setApplications] = useState([]); const [signatures, setSignatures] = useState([]); const [templates, setTemplates] = useState([]); const [error, setError] = useState(''); useEffect(() => { if (!enterpriseId) return; Promise.all([ adminApi.getTenant(enterpriseId), adminApi.listAccounts(), adminApi.listEnterpriseApplications({ tenantId: enterpriseId }), adminApi.listEnterpriseSignatures({ tenantId: enterpriseId }), adminApi.listEnterpriseTemplates({ tenantId: enterpriseId }), ]) .then(([tenantItem, accounts, applicationItems, signatureItems, templateItems]) => { setTenant(tenantItem); setAccount(accounts.find((item) => item.tenantId === enterpriseId) ?? null); setApplications(applicationItems); setSignatures(Array.isArray(signatureItems) ? signatureItems : []); setTemplates(Array.isArray(templateItems) ? templateItems : []); setError(''); }) .catch((failure: Error) => setError(failure.message || '企业详情加载失败')); }, [enterpriseId]); const appColumns = useMemo>>(() => [ { key: 'name', title: '应用名称', render: (record) => {record.name} }, { key: 'scene', title: '场景', render: (record) => record.scene ?? '-' }, { key: 'status', title: '状态', render: (record) => {record.status} }, { key: 'cmpp', title: 'CMPP 状态', render: (record) => record.cmppStatus ?? '-' }, ], []); const signatureColumns = useMemo>>(() => [ { key: 'name', title: '签名', render: (record) => {record.name} }, { key: 'purpose', title: '用途', render: (record) => record.purpose ?? '-' }, { key: 'status', title: '审核状态', render: (record) => {record.auditStatus} }, ], []); const templateColumns = useMemo>>(() => [ { key: 'name', title: '模板', render: (record) => {record.name} }, { key: 'content', title: '内容', render: (record) => {record.content} }, { key: 'status', title: '审核状态', render: (record) => {record.auditStatus} }, ], []); return (

{tenant?.name ?? '企业详情'}

{error ?

{error}

: null}
企业编码{tenant?.code ?? '-'}{tenant?.status ?? '-'}
短信余量{(account?.smsUnits ?? 0).toLocaleString('zh-CN')}真实账户余量
现金余额¥{((account?.balanceCents ?? 0) / 100).toLocaleString('zh-CN')}真实账户余额

企业档案

来自真实企业档案接口。

统一社会信用代码{tenant?.enterpriseProfile?.creditCode || '-'}
省/市{[tenant?.enterpriseProfile?.province, tenant?.enterpriseProfile?.city].filter(Boolean).join(' / ') || '-'}
通讯地址{tenant?.enterpriseProfile?.address || '-'}
联系人{tenant?.enterpriseProfile?.contactName || '-'}
手机号{tenant?.enterpriseProfile?.contactPhone || '-'}
身份证号{tenant?.enterpriseProfile?.contactIdCard || '-'}
电子邮箱{tenant?.enterpriseProfile?.contactEmail || '-'}

短信应用

来自企业应用真实接口。

{applications.length} 个

短信签名

来自企业签名真实接口。

{signatures.length} 个

短信模板

来自企业模板真实接口。

{templates.length} 个
); }