feat: harden CMPP delivery and platform workflows
This commit is contained in:
@@ -24,6 +24,12 @@ const carrierTone: Record<string, 'success' | 'info' | 'warning' | 'neutral'> =
|
||||
中国电信: 'warning',
|
||||
};
|
||||
|
||||
const ruleCarrierMeta: Record<string, { label: string; tone: 'success' | 'info' | 'warning' | 'neutral' }> = {
|
||||
mobile: { label: '中国移动', tone: 'success' },
|
||||
unicom: { label: '中国联通', tone: 'info' },
|
||||
telecom: { label: '中国电信', tone: 'warning' },
|
||||
};
|
||||
|
||||
type PhoneSegmentSummaryProps = {
|
||||
icon: ReactNode;
|
||||
label: string;
|
||||
@@ -69,6 +75,7 @@ export function AdminPhoneSegmentsPage() {
|
||||
const [rulePage, setRulePage] = useState(1);
|
||||
const [reloadKey, setReloadKey] = useState(0);
|
||||
const [deleteTarget, setDeleteTarget] = useState<PhoneSegment | null>(null);
|
||||
const [ruleDeleteTarget, setRuleDeleteTarget] = useState<CarrierRule | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false;
|
||||
@@ -146,6 +153,16 @@ export function AdminPhoneSegmentsPage() {
|
||||
.catch((failure: Error) => setError(failure.message || '手机号段删除失败'));
|
||||
}
|
||||
|
||||
function deleteCarrierRule() {
|
||||
if (!ruleDeleteTarget) return;
|
||||
adminApi.deletePhoneCarrierRule(ruleDeleteTarget.id)
|
||||
.then(() => {
|
||||
setRuleDeleteTarget(null);
|
||||
setReloadKey((current) => current + 1);
|
||||
})
|
||||
.catch((failure: Error) => setError(failure.message || '运营商区分规则删除失败'));
|
||||
}
|
||||
|
||||
const columns = useMemo<Array<TableColumn<PhoneSegment>>>(() => [
|
||||
{ key: 'segment', title: '手机号段(前7位)', width: '190px', render: (record) => <strong className="phone-segment-prefix">{record.prefix}</strong> },
|
||||
{ key: 'carrier', title: '运营商', width: '130px', render: (record) => record.carrier ? <Tag tone={carrierTone[record.carrier] ?? 'neutral'}>{record.carrier}</Tag> : '-' },
|
||||
@@ -156,10 +173,11 @@ export function AdminPhoneSegmentsPage() {
|
||||
], []);
|
||||
|
||||
const ruleColumns = useMemo<Array<TableColumn<CarrierRule>>>(() => [
|
||||
{ key: 'carrier', title: '运营商', width: '140px', render: (record) => record.carrier ?? '-' },
|
||||
{ key: 'carrier', title: '运营商', width: '140px', render: (record) => { const meta = ruleCarrierMeta[record.carrier ?? '']; return meta ? <Tag tone={meta.tone}>{meta.label}</Tag> : record.carrier ?? '-'; } },
|
||||
{ key: 'pattern', title: '号码前缀正则', render: (record) => <strong>{record.pattern}</strong> },
|
||||
{ key: 'priority', title: '优先级', width: '120px', render: (record) => record.priority ?? 100 },
|
||||
{ key: 'remark', title: '备注', render: (record) => record.remark ?? '-' },
|
||||
{ key: 'actions', title: '操作', width: '90px', align: 'right', render: (record) => <Button className="phone-segment-delete" icon={<Trash2 size={14} />} onClick={() => setRuleDeleteTarget(record)} size="sm" variant="ghost">删除</Button> },
|
||||
], []);
|
||||
|
||||
const queryPanel = (
|
||||
@@ -304,6 +322,16 @@ export function AdminPhoneSegmentsPage() {
|
||||
<p>确认删除手机号段“{deleteTarget.prefix}”吗?删除后号码归属识别将不再使用该记录。</p>
|
||||
</Modal>
|
||||
) : null}
|
||||
{ruleDeleteTarget ? (
|
||||
<Modal
|
||||
footer={<><Button onClick={() => setRuleDeleteTarget(null)} variant="ghost">取消</Button><Button onClick={deleteCarrierRule} variant="danger">确认删除</Button></>}
|
||||
onClose={() => setRuleDeleteTarget(null)}
|
||||
open
|
||||
title="删除运营商区分规则"
|
||||
>
|
||||
<p>确认删除规则“{ruleDeleteTarget.pattern}”吗?删除后运营商识别将不再使用该规则。</p>
|
||||
</Modal>
|
||||
) : null}
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user