fix(burst-location): explain normal data source

This commit is contained in:
2026-07-09 11:51:40 +08:00
parent 600a8703ed
commit 435a4172e4
3 changed files with 79 additions and 0 deletions
@@ -239,6 +239,19 @@ const AnalysisParameters: React.FC<Props> = ({ onResult }) => {
<MenuItem value="simulation"></MenuItem>
</Select>
</FormControl>
<Typography
variant="caption"
sx={{
mt: 0.75,
display: "block",
color: "text.secondary",
lineHeight: 1.6,
}}
>
{isSimulationMode
? "爆管数据读取所选方案模拟结果,正常数据读取实时模拟结果,两者使用同一爆管时间窗。"
: "爆管数据读取所选监测时间窗,正常数据默认读取前一天同一时段的监测数据。"}
</Typography>
</Box>
{isSimulationMode && (
@@ -75,6 +75,33 @@ const toneStyles: Record<
const formatDateTime = (value?: string) =>
value ? dayjs(value).format("MM-DD HH:mm") : "-";
const formatDateTimeRange = (start?: string, end?: string) => {
if (!start || !end) return "-";
return `${formatDateTime(start)}${formatDateTime(end)}`;
};
const getDataSourceLabel = (result: BurstLocationResult) =>
result.data_source === "simulation" ? "模拟方案" : "监测数据";
const getNormalDataDescription = (result: BurstLocationResult) => {
switch (result.observed_source) {
case "simulation_scheme_burst_realtime_normal_timerange":
return "正常数据读取实时模拟结果,与爆管数据使用同一时间窗。";
case "scada_burst_scada_normal_timerange":
return "正常数据读取监测数据;未单独指定正常时间窗时,默认使用爆管时段前一天同一时段。";
case "scada_burst_payload_normal_timerange":
return "爆管数据读取监测数据,正常数据来自请求载荷。";
case "simulation_scheme_timerange":
return "历史方案记录:爆管数据和正常数据均读取方案模拟结果。";
case "scada_timerange":
return "历史方案记录:爆管数据和正常数据使用同一监测时间窗。";
case "request_payload":
return "爆管数据和正常数据均来自请求载荷。";
default:
return "正常数据按后端返回的数据源规则选择。";
}
};
const MetricCard = ({ label, value, hint, tone }: MetricCardProps) => {
const style = toneStyles[tone];
return (
@@ -214,6 +241,16 @@ const LocationResults: React.FC<Props> = ({ result }) => {
const burstTime = result.scada_window?.burst_start
? formatDateTime(result.scada_window.burst_start)
: "-";
const burstWindow = formatDateTimeRange(
result.scada_window?.burst_start,
result.scada_window?.burst_end,
);
const normalWindow = formatDateTimeRange(
result.scada_window?.normal_start,
result.scada_window?.normal_end,
);
const sourceLabel = getDataSourceLabel(result);
const normalDataDescription = getNormalDataDescription(result);
return (
<Box className="h-full overflow-auto p-1">
@@ -287,6 +324,31 @@ const LocationResults: React.FC<Props> = ({ result }) => {
tone="green"
/>
</Box>
<Box className="rounded-lg border border-gray-200 bg-gray-50 px-3 py-2">
<Box className="mb-1 flex flex-wrap items-center gap-1.5">
<Chip
size="small"
label={sourceLabel}
color={result.data_source === "simulation" ? "secondary" : "primary"}
sx={{ height: 22, fontSize: "0.72rem", fontWeight: 600 }}
/>
<Typography variant="caption" className="text-gray-600">
</Typography>
</Box>
<Typography variant="caption" className="block leading-5 text-gray-700">
{normalDataDescription}
</Typography>
<Typography variant="caption" className="mt-1 block leading-5 text-gray-500">
: {burstWindow}: {normalWindow}
</Typography>
{result.data_source === "simulation" && result.simulation_scheme?.name ? (
<Typography variant="caption" className="mt-1 block truncate text-purple-600">
: {result.simulation_scheme.name}
</Typography>
) : null}
</Box>
</Box>
{/* Candidate List */}
@@ -23,6 +23,8 @@ export interface BurstLocationResult {
scada_window?: {
burst_start?: string;
burst_end?: string;
normal_start?: string;
normal_end?: string;
};
pressure_samples?: {
burst?: number;
@@ -51,6 +53,8 @@ export interface BurstLocationSchemeDetail {
scada_window?: {
burst_start?: string;
burst_end?: string;
normal_start?: string;
normal_end?: string;
};
result_summary?: {
located_pipe?: string;