import React, { useState } from 'react'; import { Popover, Tag, List, Descriptions, Typography } from 'antd'; interface PreResultData { video_id: string; advertiser_id: number; material_id: string; is_ad_high_quality_material: string; is_ecp_high_quality_material: string; is_inefficient_material: string; is_first_publish_material: string; is_local_high_quality_material: string; not_ad_high_quality_reason: string[] | null; not_ecp_high_quality_reason: string[] | null; } interface PreResultDisplayProps { preResult: string; } const fieldConfig = [ { key: 'is_ad_high_quality_material', label: 'AD优质', noLabel: 'AD非优质素材', unknownLabel: 'AD未知', yesColor: 'green', noColor: 'red', unknownColor: 'default' }, { key: 'is_ecp_high_quality_material', label: '千川优质', noLabel: '千川非优质素材', unknownLabel: '千川未知', yesColor: 'green', noColor: 'red', unknownColor: 'default' }, { key: 'is_local_high_quality_material', label: '本地推优质', noLabel: '本地推非优质', unknownLabel: '本地推未知', yesColor: 'green', noColor: 'red', unknownColor: 'default' }, { key: 'is_inefficient_material', label: '低效', noLabel: '非低效', unknownLabel: '是否低效未知', yesColor: 'red', noColor: 'green', unknownColor: 'default' }, { key: 'is_first_publish_material', label: '首发', noLabel: '非首发', unknownLabel: '是否首发未知', yesColor: 'blue', noColor: 'default', unknownColor: 'default' }, ]; const PreResultDisplay: React.FC = ({ preResult }) => { const [parsedData, setParsedData] = useState(null); const [hasError, setHasError] = useState(false); React.useEffect(() => { if (!preResult) { setParsedData(null); setHasError(false); return; } try { const data = JSON.parse(preResult); setParsedData(data); setHasError(false); } catch { setParsedData(null); setHasError(true); } }, [preResult]); if (!preResult || hasError || !parsedData) { return -; } const getIndicatorDisplay = (key: string) => { const config = fieldConfig.find(c => c.key === key); if (!config) return null; const value = parsedData[key as keyof PreResultData]; const isYes = value === 'YES'; const isNo = value === 'NO'; const isUnknown = value === 'UNKNOWN'; if (isUnknown) return null; let displayLabel, displayColor; if (isYes) { displayLabel = config.label; displayColor = config.yesColor; } else if (isNo) { displayLabel = config.noLabel; displayColor = config.noColor; } return { tag: ( {displayLabel} ), detail: { label: config.label.replace('优质', '优质素材'), value: displayLabel, color: displayColor, }, }; }; const content = (
前测结果详情 {parsedData.video_id} {parsedData.advertiser_id} {parsedData.material_id} 质量评估
{fieldConfig.map(config => { const value = parsedData[config.key as keyof PreResultData]; const isYes = value === 'YES'; const isNo = value === 'NO'; const isUnknown = value === 'UNKNOWN'; if (isUnknown) return null; let displayLabel, displayColor; if (isYes) { displayLabel = config.label; displayColor = config.yesColor; } else if (isNo) { displayLabel = config.noLabel; displayColor = config.noColor; } return ( {displayLabel} ); })}
{parsedData.not_ad_high_quality_reason && parsedData.not_ad_high_quality_reason.length > 0 && (
AD非优质原因 ( {index + 1}. {item} )} size="small" />
)} {parsedData.not_ecp_high_quality_reason && parsedData.not_ecp_high_quality_reason.length > 0 && (
千川非优质原因 ( {index + 1}. {item} )} size="small" />
)}
); return (
{fieldConfig.map(config => { const display = getIndicatorDisplay(config.key); return display?.tag; })}
); }; export default PreResultDisplay;