import React, { useState } from 'react'
import {
Card, Input, Button, Space, Tag, message, Descriptions, Row, Col,
Segmented, Typography, Result, Divider,
} from 'antd'
import {
ScanOutlined, GlobalOutlined, MobileOutlined, DesktopOutlined,
ShoppingOutlined, SafetyCertificateOutlined,
} from '@ant-design/icons'
import { api } from './api.js'
const { Text, Paragraph } = Typography
const screenMeta = {
iptv: { label: 'IPTV 大屏', color: 'blue', icon: },
ott: { label: 'OTT/智能电视', color: 'geekblue', icon: },
app: { label: '手机 APP', color: 'green', icon: },
}
function ScreenTags({ screens }) {
if (!screens || screens.length === 0) return 暂不可用
return (
{screens.map((s) => (
{screenMeta[s]?.label || s}
))}
)
}
// ============ 跨域解析网关(C.1/C.2)============
function ResolvePanel() {
const [maCode, setMaCode] = useState('')
const [res, setRes] = useState(null)
const [loading, setLoading] = useState(false)
async function doResolve() {
if (!maCode) return message.warning('请输入 MA 码(支持集级子标识 #E03)')
setLoading(true)
const r = await api.resolve(maCode.trim())
setLoading(false)
if (r.ok) setRes(r.data.data)
else { setRes(null); message.error(r.data.message || '解析失败') }
}
const p = res?.parsed
return (
MA 跨域解析网关 · 同一码三屏统一解析}>
setMaCode(e.target.value)} onPressEnter={doResolve} />
{res && (
{res.resolved ? 解析成功 : 未解析/未登记}
{res.in_circulation ? 流通中 : {res.status || '不可用'}}
{res.title || '-'}
{res.issuer || '-'}
{p?.valid ? (
国家码 {p.country_code}
行业 {p.industry_node}
机构 {p.org_node}
类目 {p.category}
{p.year} 年
序列 {p.sequence}
{p.episode > 0 && 第 {p.episode} 集}
) : 结构非法}
{res.message}
)}
)
}
// ============ 扫码验真(B.2)============
function ScanVerifyPanel() {
const [maCode, setMaCode] = useState('')
const [res, setRes] = useState(null)
const [loading, setLoading] = useState(false)
async function doScan() {
if (!maCode) return message.warning('请输入/扫描 MA 码')
setLoading(true)
const r = await api.scanVerify(maCode.trim())
setLoading(false)
if (r.ok) setRes(r.data.data)
else { setRes(null); message.error(r.data.message || '验真失败') }
}
let status = 'info', title = '请扫码验真'
if (res) {
if (res.authentic && res.compliant) { status = 'success'; title = '正版内容 · 合规流通' }
else if (res.authentic && !res.compliant) { status = 'warning'; title = '真码 · 但不合规(已下架/未流通)' }
else { status = 'error'; title = '验真失败 · 疑似盗版/伪造' }
}
return (
用户扫码验真 · 防盗版}>
setMaCode(e.target.value)} onPressEnter={doScan} />
} loading={loading} onClick={doScan}>扫码验真
{res && (
}>
{res.authentic ? '真码' : '假码/未登记'}
{res.compliant ? '合规流通' : '不合规'}
{res.title && 《{res.title}》}
{res.message}
} />
)}
)
}
// ============ 跨屏权益通兑(D.1)============
function RightsPanel() {
const [maCode, setMaCode] = useState('')
const [userHash, setUserHash] = useState('user-demo-001')
const [buyScreen, setBuyScreen] = useState('iptv')
const [verifyScreen, setVerifyScreen] = useState('app')
const [buyRes, setBuyRes] = useState(null)
const [verifyRes, setVerifyRes] = useState(null)
async function doBuy() {
if (!maCode) return message.warning('请输入 MA 码')
const r = await api.purchase(maCode.trim(), userHash, buyScreen)
if (r.ok) { setBuyRes(r.data.data); message.success(`已在「${screenMeta[buyScreen].label}」购买`) }
else message.error(r.data.message || '购买失败')
}
async function doVerify() {
if (!maCode) return message.warning('请输入 MA 码')
const r = await api.verifyRights(maCode.trim(), userHash, verifyScreen)
if (r.ok) setVerifyRes(r.data.data)
else message.error(r.data.message || '核验失败')
}
const opts = Object.entries(screenMeta).map(([v, m]) => ({ label: m.label, value: v }))
return (
跨屏权益通兑 · 一次购买全屏通看}>
setMaCode(e.target.value)} placeholder="已发布的 MA 码" />
setUserHash(e.target.value)} />
} onClick={doBuy}>购买
{buyRes && (
已购买:{screenMeta[buyRes.screen]?.label}({new Date(buyRes.purchased_at).toLocaleString()})
)}
} onClick={doVerify}>核验权益
{verifyRes && (
verifyRes.entitled
? ✓ 有权益(通兑):{verifyRes.message}
: ✗ 无权益:{verifyRes.message}
)}
演示:在「IPTV 大屏」购买后,切到「手机 APP」核验,应通兑通看且不重复付费(权益归一到整剧 MA 码)。
)
}
export default function ScreenFusion() {
return (
大小屏融合:同一 MA 码贯通 IPTV / OTT / 手机 APP,统一解析、扫码验真、一次购买全屏通看。
)
}