import { BarChart3, MapPin, Send, Smartphone, TrendingUp } from 'lucide-react'; import { Button, Modal, Table, Tag } from '@/components/ui'; import { formatNumber, formatTime, getProgress, getRegionRate, getSuccessRate, sendTypeLabels, statusLabels, statusTones, } from './taskModel'; import type { RegionStat, SmsTask } from './taskTypes'; function TaskDetailTitle({ task }: { task: SmsTask }) { return (

发送批次详情

{task.id} {statusLabels[task.status]}

); } function MetricCard({ label, value, tone }: { label: string; value: string; tone?: 'success' | 'primary' }) { return (
{label} {value}
); } export function TaskDetailModal({ task, onClose }: { task: SmsTask; onClose: () => void }) { const progress = getProgress(task); const successRate = getSuccessRate(task); const perPhoneBillingUnits = Math.max(1, Math.ceil(task.wordCount / 67)); return ( 关闭} onClose={onClose} open size="xl" title={} >

发送批次信息

企业/应用
{task.enterprise}{task.application}
提交时间
{formatTime(task.submittedAt)}
发送方式
{sendTypeLabels[task.sendType]}

发送进度

已处理 {formatNumber(task.sentCount)} / 总计 {formatNumber(task.phoneCount)} {progress}%
已提交{formatNumber(task.submittedSuccess)} 已成功{formatNumber(task.successCount)}
{task.status === 'pending_review' ?

任务正在等待运营人工审核,尚未进入发送流程。

: null}
{(task.reviewReason || task.rejectReason || task.riskTaskId) ?

审核信息

{task.riskTaskId ?
关联审核任务
{task.riskTaskId}
: null} {task.reviewReason ?
审核原因
{task.reviewReason}
: null} {task.rejectReason ?
驳回原因
{task.rejectReason}
: null}
: null}

模板信息

短信模板内容

{task.templateContent}

字符数/计费条数
{task.wordCount} 字符 · {perPhoneBillingUnits} 条/号码
发送号码数
{formatNumber(task.phoneCount)} 个
计费规则:每 67 字为 1 条短信。本次任务单号码 {perPhoneBillingUnits} 条,预计总计费 {formatNumber(task.billingCount)} 条

号码运营商分布

{task.carriers.length === 0 ? (
暂无已识别运营商记录
) : (
{task.carriers.map((carrier) => { const rate = carrier.total > 0 ? (carrier.success / carrier.total) * 100 : 0; return (
{carrier.name}

总数{formatNumber(carrier.total)}

成功{formatNumber(carrier.success)}

{rate.toFixed(1)}% 成功率
); })}
)}

号码省份分布

{record.region} }, { key: 'total', title: '总数', align: 'right', render: (record: RegionStat) => formatNumber(record.total) }, { key: 'success', title: '成功', align: 'right', render: (record: RegionStat) => {formatNumber(record.success)} }, { key: 'rate', title: '成功率', align: 'right', render: (record: RegionStat) => = 95 ? 'success' : 'info'}>{getRegionRate(record).toFixed(1)}%, }, ]} data={task.regions} emptyText="暂无已识别省份记录" rowKey={(record) => record.region} /> ); }