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}
/>
);
}