From 1a07c2f39adca25188ca12dd6976089e9a0e5b71 Mon Sep 17 00:00:00 2001 From: chenxing Date: Fri, 9 Oct 2026 22:09:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(diagram):=20=E5=B5=8C=E5=85=A5=E9=A1=B5?= =?UTF-8?q?=E8=A1=A5=E6=BB=9A=E5=8A=A8=E5=AE=B9=E5=99=A8=EF=BC=88=E8=A3=B8?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E9=A1=B5=E8=A2=AB=E5=85=A8=E5=B1=80=20body?= =?UTF-8?q?=20overflow:hidden=20=E8=A3=81=E5=89=AA=E6=97=A0=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=9D=A1=EF=BC=89+=20=E6=B5=81=E7=A8=8B=E5=9B=BE=20PN?= =?UTF-8?q?G=20=E6=8C=89=E9=80=BB=E8=BE=91=E5=B0=BA=E5=AF=B8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=EF=BC=88SCALE=3D2=20=E5=9B=BE=E6=8C=89=E8=87=AA?= =?UTF-8?q?=E7=84=B6=E5=B0=BA=E5=AF=B8=E6=B8=B2=E6=9F=93=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E6=94=BE=E5=A4=A7=E4=B8=80=E5=80=8D=EF=BC=8C=E5=9B=9B=E5=A4=84?= =?UTF-8?q?=20PNG=20=E6=B6=88=E8=B4=B9=E7=82=B9=E7=BB=9F=E4=B8=80=E8=B5=B0?= =?UTF-8?q?=20fitDiagram=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/diagramImg.ts | 12 ++++++++++++ src/views/flow/EmbedInstance.vue | 20 ++++++++++++++++---- src/views/flow/InstanceDetail.vue | 15 +++++++++++++-- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 src/utils/diagramImg.ts diff --git a/src/utils/diagramImg.ts b/src/utils/diagramImg.ts new file mode 100644 index 0000000..164595b --- /dev/null +++ b/src/utils/diagramImg.ts @@ -0,0 +1,12 @@ +/** + * 流程示意图 PNG 显示口径(2026-10-10 用户反馈:嵌入页图过大):服务端 DiagramImageService + * 按 SCALE=2 出图(视网膜清晰度),页面若按自然尺寸渲染等于整体放大一倍。 + * 须按逻辑尺寸(自然宽一半)显示;>3 分支等超宽长图再收缩到容器宽。 + * 用法:,onMounted 里对 complete 的图补调一次。 + */ +export function fitDiagram(el: HTMLImageElement | null | undefined): void { + if (!el || !el.naturalWidth) return; + const want = el.naturalWidth / 2; + const cap = (el.parentElement?.clientWidth || 0) - 8; // Card body 左右衬 + el.style.width = Math.round(Math.min(want, cap > 120 ? cap : want)) + "px"; +} diff --git a/src/views/flow/EmbedInstance.vue b/src/views/flow/EmbedInstance.vue index 57bfbe3..d8668db 100644 --- a/src/views/flow/EmbedInstance.vue +++ b/src/views/flow/EmbedInstance.vue @@ -3,11 +3,12 @@ // 展示"进度 + 流程示意图",零样式复制、单点维护。全程零 CAS 交互——数据走 /open/flow/embed/data // 免签端点(只认 token),示意图 token 两用(/open/flow/diagram/img 同一 token 出图)。 // 本页只读(方案 §9):不做任何审批动作;办理入口仍是待办站内信 → /task/:taskId 既有链路。 -import { ref, computed, onMounted } from "vue"; +import { ref, computed, onMounted, nextTick } from "vue"; import { useRoute } from "vue-router"; import { Tag } from "view-ui-plus"; import { INSTANCE_STATUS, INSTANCE_STATUS_COLOR, TASK_STATUS } from "@/api/module/flow"; import TraceTimeline from "@/views/flow/components/TraceTimeline.vue"; +import { fitDiagram } from "@/utils/diagramImg"; import config from "@/assets/config/host.config"; const route = useRoute(); @@ -29,6 +30,10 @@ const token = computed(() => String(route.query.token || "")); const diagramSrc = computed( () => `${config.serviceHost}/open/flow/diagram/img?token=${token.value}`, ); +const diagramEl = ref(null); +function onDiagramLoad() { + fitDiagram(diagramEl.value); +} const snapshotRows = computed(() => { const raw = detail.value?.bizSnapshot; @@ -186,6 +191,11 @@ onMounted(async () => { } finally { loading.value = false; } + // 缓存命中的图可能在监听器挂上之前就 complete,补一次适配 + await nextTick(); + if (diagramEl.value?.complete) { + fitDiagram(diagramEl.value); + } }); @@ -217,7 +227,7 @@ onMounted(async () => { - 流程示意图 + 流程示意图 @@ -255,7 +265,9 @@ onMounted(async () => {