import { useEffect, useState } from 'react' import { Timeline, Tag, Table, Descriptions, Alert, Empty, Select, Button, Space, Typography, List } from 'antd' import { api } from './api' import type { SceneSchema } from './types' const { Text, Paragraph } = Typography const LAYER_COLOR: Record = { M8: 'blue', M1: 'green', M2: 'volcano', 'M2/M8': 'volcano', M3: 'geekblue', M4: 'purple', M5: 'orange', ME: 'magenta', MetaRule: 'red', } /** 执行追踪:把引擎返回的 trace/事件/扣库存/风控可视化,直观展示"元数据解释执行"全过程。 */ export function TracePanel({ result }: { result: any }) { if (!result) return if (result.success === false) { return (
{result.appliedRules?.length > 0 && ( 命中的 MetaRule 规则} dataSource={result.appliedRules} renderItem={(r: any) => {r.effect}[{r.ruleId}] {r.message}} /> )}
) } return (
{result.rootId} {result.childCount != null && {result.childCount}} 领域事件(ME → Outbox)
{(result.events || []).map((e: any) => {e.eventName} → {e.topic})}
{result.stockActions?.length > 0 && ( <> 跨聚合最终一致(ME 规则 + M2 effect 通用执行) String(i)} dataSource={result.stockActions} columns={[ { title: '目标聚合', dataIndex: 'targetAggregate' }, { title: '命令', dataIndex: 'targetCommand' }, { title: '键', render: (_: any, a: any) => `${a.keyField}=${a.key}` }, { title: '变更', render: (_: any, a: any) => `${a.op} ${a.amount}` }, { title: '剩余', dataIndex: 'remaining' }, { title: '状态', dataIndex: 'status', render: (s: string) => {s} }, ]} /> )} {result.warnings?.length > 0 && (
⚠️ [{w.ruleId}] {w.message}
)} /> )} ) } function TraceTimeline({ trace }: { trace: any[] }) { if (!trace?.length) return null return ( ({ color: LAYER_COLOR[s.layer] || 'gray', children: {s.layer}{s.step} — {s.detail}, }))} /> ) } /** 溯源面板:展示页面各部分分别来自哪一层模型,以及自动关联的 MetaRule 规则。 */ export function ProvenancePanel({ schema }: { schema: SceneSchema }) { const sl = schema.sourceLayers || {} return (
本页面无任何业务硬编码,各部分均由下列本体模型层实时合成:
({ k, v }))} columns={[ { title: '页面要素', dataIndex: 'k' }, { title: '来源模型层', dataIndex: 'v', render: (v: string) => {v} }, ]} /> 自动关联的 MetaRule 动态规则 (
{r.effect} {r.ruleName} {r.ruleId}
{r.matchCondition}
→ {r.message}
)} /> 规则全局参数
{Object.entries(schema.ruleGlobalParams || {}).map(([k, v]) => {k} = {String(v)})}
) } /** 模型查看器:直接查看任意本体层解析后的内容,证明"页面即模型"。 */ export function ModelViewer() { const [layers, setLayers] = useState([]) const [code, setCode] = useState('M8') const [content, setContent] = useState(null) const [dir, setDir] = useState('') useEffect(() => { api.models().then((d) => { setLayers(d.layers); setDir(d.modelsDir) }) }, []) useEffect(() => { if (code) api.model(code).then((d) => setContent(d.content)) }, [code]) return (
String(r[rowKeyField] ?? i)} dataSource={rows} columns={cols} /> 事件 Outbox(最近)
{s} }, ]} /> ) }