From 1cc6b471d30173b991cbce055da787f7ee943475 Mon Sep 17 00:00:00 2001 From: kx_guo Date: Tue, 8 Sep 2026 11:48:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E5=8E=9F=E5=9E=8B=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=A3=8E=E9=99=A9=E6=8A=A5=E5=91=8A=E9=A1=B5=E9=9D=A2=E4=B8=8E?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完善报告页栏目和原型样式,统一风险卡片、网页报告、PDF与Word的字段口径;接入真实PDF和DOCX下载,修复合作频次、七维结论及标准判定展示差异。 --- src/api/reports.ts | 16 + .../assistant/AssistantResponseCard.vue | 4 +- src/components/assistant/RiskAnalysisCard.vue | 18 +- src/pages/ReportPage.vue | 488 ++++++++++++++++++ src/pages/RiskAssistantPage.vue | 7 + src/router/routes.ts | 10 + src/types/risk.ts | 2 + 7 files changed, 531 insertions(+), 14 deletions(-) create mode 100644 src/api/reports.ts create mode 100644 src/pages/ReportPage.vue diff --git a/src/api/reports.ts b/src/api/reports.ts new file mode 100644 index 0000000..dc40894 --- /dev/null +++ b/src/api/reports.ts @@ -0,0 +1,16 @@ +import { http } from "@/api/http"; +import type { RiskReportResult } from "@/types/risk"; + +export function downloadReportPdf(payload: RiskReportResult) { + return http.post("/v1/reports/pdf", payload, { + responseType: "blob", + timeout: 60_000, + }); +} + +export function downloadReportWord(payload: RiskReportResult) { + return http.post("/v1/reports/word", payload, { + responseType: "blob", + timeout: 60_000, + }); +} diff --git a/src/components/assistant/AssistantResponseCard.vue b/src/components/assistant/AssistantResponseCard.vue index 1a675db..2742822 100644 --- a/src/components/assistant/AssistantResponseCard.vue +++ b/src/components/assistant/AssistantResponseCard.vue @@ -98,9 +98,9 @@ function formatCount(value: unknown) { {{ formatCount(data.anomalyCount) }}近3年异常 -
+
{{ formatCount(data.cooperationCount) }}合作频次(代理) + >合作频次(采购订单)
×{{ data.frequencyCoefficient?.toFixed(2) ?? "1.00" }}(); +const emit = defineEmits<{ generateReport: [] }>(); const expanded = ref(true); const feedback = ref(""); @@ -161,16 +162,9 @@ const stars = computed(() => { 供应商层级{{ result.supplierFreq.tier }}
-
- 合作频次(代理) - {{ - result.supplierFreq.cooperationCount ?? - result.supplierFreq.anomalyCount ?? - 0 - }} - 次 +
+ 合作频次(采购订单) + {{ result.supplierFreq.cooperationCount }} 次
管理建议{{ result.supplierFreq.suggestion }} @@ -190,7 +184,7 @@ const stars = computed(() => { > {{ result.supplierFreq.note || - "当前以近3年异常记录数作为合作频次代理,不代表真实采购订单合作次数。" + "合作频次按近3年采购订单去重单据编号统计;异常数仍按异常案例库统计。" }} @@ -298,7 +292,7 @@ const stars = computed(() => { diff --git a/src/pages/ReportPage.vue b/src/pages/ReportPage.vue new file mode 100644 index 0000000..7a8bf7e --- /dev/null +++ b/src/pages/ReportPage.vue @@ -0,0 +1,488 @@ + + + + + diff --git a/src/pages/RiskAssistantPage.vue b/src/pages/RiskAssistantPage.vue index 5620d4e..808c87b 100644 --- a/src/pages/RiskAssistantPage.vue +++ b/src/pages/RiskAssistantPage.vue @@ -11,6 +11,7 @@ import OcrRecognitionDialog from "@/components/ocr/OcrRecognitionDialog.vue"; import { useConversationStore } from "@/stores/conversation.store"; import { useAuthStore } from "@/stores/auth.store"; import { storeToRefs } from "pinia"; +import type { RiskAssessmentResult } from "@/types/risk"; const route = useRoute(); const router = useRouter(); @@ -217,6 +218,11 @@ async function openFromRoute() { } } +function openReport(result: RiskAssessmentResult) { + sessionStorage.setItem("dieya-risk-report", JSON.stringify(result)); + void router.push({ name: "report" }); +} + async function submit( messageType: "text" | "image" | "file" | "audio" = "text", ) { @@ -315,6 +321,7 @@ async function scrollToBottom(behavior: "smooth" | "auto" = "smooth") { v-if="message.riskResult" :result="message.riskResult" :can-monitor="canMonitor" + @generate-report="openReport(message.riskResult)" /> import("@/pages/ReportPage.vue"), + meta: { + title: "风险报告", + requiresAuth: true, + permission: "risk.assess", + }, + }, { path: "overview", name: "overview", diff --git a/src/types/risk.ts b/src/types/risk.ts index d3a0bd6..cc7b92b 100644 --- a/src/types/risk.ts +++ b/src/types/risk.ts @@ -77,6 +77,8 @@ export interface RiskAssessmentResult { dimensionScores?: RiskDimensionScore[]; } +export type RiskReportResult = RiskAssessmentResult; + export interface ModelInfo { modelVersion: string; scoreRange: string;