diff --git a/vehicle-data-platform/apps/web/src/pages/Quality.tsx b/vehicle-data-platform/apps/web/src/pages/Quality.tsx index a44b0a76..13655521 100644 --- a/vehicle-data-platform/apps/web/src/pages/Quality.tsx +++ b/vehicle-data-platform/apps/web/src/pages/Quality.tsx @@ -341,6 +341,35 @@ function priorityIssueTicketText(row: PriorityIssueRow) { ].join('\n'); } +function priorityIssueEvidencePackageText(row: PriorityIssueRow) { + const lookup = qualityIssueVehicleLookup(row); + const dateFrom = issueEvidenceDate(row.lastSeen); + const dateTo = nextDate(dateFrom); + const evidenceFilters = { + ...(dateFrom ? { dateFrom } : {}), + ...(dateTo ? { dateTo } : {}) + }; + return [ + '【告警证据包】', + `优先级:${row.priority}`, + `车辆:${row.vehicleLabel}`, + `数据来源:${qualityProtocolLabel(row.protocol)}`, + `来源地址:${row.sourceEndpoint || '-'}`, + `问题:${qualityIssueLabel(row.issueType)}`, + `建议动作:${row.actionLabel}`, + `SLA:${row.sla}`, + `最后时间:${row.lastSeen || '-'}`, + `详情:${row.detail || '-'}`, + `验收标准:${acceptanceCriteria(row)}`, + `实时定位:${appURL(buildAppHash({ page: 'realtime', keyword: lookup.key, protocol: row.protocol }))}`, + `轨迹回放:${appURL(buildAppHash({ page: 'history', keyword: lookup.key, protocol: row.protocol, filters: evidenceFilters }))}`, + `RAW证据:${appURL(buildAppHash({ page: 'history-query', keyword: lookup.key, protocol: row.protocol, filters: { tab: 'raw', ...evidenceFilters, includeFields: 'true' } }))}`, + `里程复核:${appURL(buildAppHash({ page: 'mileage', keyword: lookup.key, protocol: row.protocol, filters: evidenceFilters }))}`, + `车辆服务:${appURL(buildAppHash({ page: 'detail', keyword: lookup.key, protocol: row.protocol }))}`, + `告警筛选:${qualityShareURL()}` + ].join('\n'); +} + function priorityDigestPolicyLines(policies?: QualityNotificationPolicy[]) { const policy = policies?.find((item) => item.name.startsWith('P0')) ?? policies?.[0]; if (!policy) return []; @@ -762,6 +791,7 @@ export function Quality({ + @@ -971,6 +1001,7 @@ export function Quality({ + diff --git a/vehicle-data-platform/apps/web/src/test/App.test.tsx b/vehicle-data-platform/apps/web/src/test/App.test.tsx index 0e5161e7..d3e77b64 100644 --- a/vehicle-data-platform/apps/web/src/test/App.test.tsx +++ b/vehicle-data-platform/apps/web/src/test/App.test.tsx @@ -3837,6 +3837,20 @@ test('copies notification text from regular quality issue row', async () => { expect(writeText).toHaveBeenCalledWith(expect.stringContaining('详情:位置字段缺失,影响轨迹回放')); expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹证据:http://localhost:3000/#/history?keyword=VIN-ROW-NOTIFY&protocol=GB32960&dateFrom=2026-07-03&dateTo=2026-07-04')); expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆服务:http://localhost:3000/#/detail?keyword=VIN-ROW-NOTIFY&protocol=GB32960')); + + const evidenceButtons = screen.getAllByRole('button', { name: '复制证据包' }); + expect(evidenceButtons.length).toBeGreaterThanOrEqual(2); + fireEvent.click(evidenceButtons[evidenceButtons.length - 1]); + + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【告警证据包】')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('优先级:P1')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('验收标准:缺失字段恢复解析,统计、定位或里程依赖的核心字段可查询')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('实时定位:http://localhost:3000/#/realtime?keyword=VIN-ROW-NOTIFY&protocol=GB32960')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹回放:http://localhost:3000/#/history?keyword=VIN-ROW-NOTIFY&protocol=GB32960&dateFrom=2026-07-03&dateTo=2026-07-04')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('RAW证据:http://localhost:3000/#/history-query?keyword=VIN-ROW-NOTIFY&protocol=GB32960')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('includeFields=true')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('里程复核:http://localhost:3000/#/mileage?keyword=VIN-ROW-NOTIFY&protocol=GB32960&dateFrom=2026-07-03&dateTo=2026-07-04')); + expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆服务:http://localhost:3000/#/detail?keyword=VIN-ROW-NOTIFY&protocol=GB32960')); }); test('opens realtime map context from quality priority queue', async () => {