From 863a99f05466a93112a6c02ba1b671c7ecbf2d06 Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期三, 27 八月 2025 15:06:32 +0800
Subject: [PATCH] ID1956-四点血压图旧版完成

---
 src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue |  315 +++++++++++++++++++++++----------------------------
 1 files changed, 143 insertions(+), 172 deletions(-)

diff --git a/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue b/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
index ef7bb57..b95dabf 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
@@ -422,186 +422,156 @@
     type: "warning",
   });
 };
-const genderBloodPressureRectangularChart = (
-  datas: 四点血压图数据[] | null
-) => {
-  if (bloodPressureRectangularChart.value) {
-    const benchmarkData = {
-      width: 386,
-      height: 280,
-    };
-    // 获取容器实际宽高
-    const containerWidth = bloodPressureRectangularChart.value.offsetWidth * 0.9;
-    const containerHeight = bloodPressureRectangularChart.value.offsetHeight * 0.9;
-    // 等比例缩放因子
-    const scale = Math.min(
-      containerWidth / benchmarkData.width,
-      containerHeight / benchmarkData.height
-    );
 
-    // 拿到 canvas
-    let canvas = bloodPressureRectangularChart.value.querySelector("canvas");
-    if (!canvas) {
-      canvas = document.createElement("canvas");
-      bloodPressureRectangularChart.value.appendChild(canvas);
-    }
+const genderBloodPressureRectangularChart = (datas: 四点血压图数据[] | null) => {
+  if (!bloodPressureRectangularChart.value) return;
 
-    // 设置 canvas 尺寸
-    canvas.width = containerWidth;
-    canvas.height = containerHeight;
-    canvas.style.width = `${canvas.width}px`;
-    canvas.style.height = `${canvas.height}px`;
+  const benchmarkData = { width: 386, height: 280 };
 
-    const ctx = canvas.getContext("2d");
-    if (!ctx) return;
+  // 获取容器宽高(90% 缩放)
+  const containerWidth = bloodPressureRectangularChart.value.offsetWidth * 0.9;
+  const containerHeight = bloodPressureRectangularChart.value.offsetHeight * 0.9;
 
-    // 清除画布
-    ctx.clearRect(0, 0, canvas.width, canvas.height);
+  // 获取设备像素比
+  const dpr = window.devicePixelRatio || 1;
 
-    // 按缩放因子缩放绘制环境
-    ctx.save();
-    // ctx.scale(scale, scale);
+  // 等比例缩放因子(保持比例)
+  const scale = Math.min(
+    containerWidth / benchmarkData.width,
+    containerHeight / benchmarkData.height
+  );
 
-    // 设置字体样式
-    ctx.font = `12px Arial`;
-    ctx.textAlign = "center";
+  // 计算实际画布 CSS 尺寸
+  const cssWidth = benchmarkData.width * scale;
+  const cssHeight = benchmarkData.height * scale;
 
-    // 处理数据
-    const measurements = [
-      { systolic: 143, diastolic: 74 },
-      { systolic: 136, diastolic: 71 },
-      { systolic: 139, diastolic: 73 },
-      { systolic: 139, diastolic: 73 },
-    ];
-
-    measurements[0].systolic = datas[0]?.血压1_透前收缩压 ?? null;
-    measurements[0].diastolic = datas[0]?.血压1_透前舒张压 ?? null;
-    measurements[1].systolic = datas[0]?.血压2_前半程最低收缩压 ?? null;
-    measurements[1].diastolic = datas[0]?.血压2_前半程最低舒张压 ?? null;
-    measurements[2].systolic = datas[0]?.血压3_后半程最低收缩压 ?? null;
-    measurements[2].diastolic = datas[0]?.血压3_后半程最低舒张压 ?? null;
-    measurements[3].systolic = datas[0]?.血压4_透后收缩压 ?? null;
-    measurements[3].diastolic = datas[0]?.血压4_透后舒张压 ?? null;
-
-    const chartHeight = canvas.height;
-    const chartWidth = canvas.width;
-
-    // 限所在位置 200
-    const upperLimitY = chartHeight * 0.5;
-    ctx.beginPath();
-    ctx.moveTo(0, upperLimitY);
-    ctx.lineTo(chartWidth, upperLimitY);
-    ctx.strokeStyle = "red";
-    ctx.lineWidth = 1;
-    ctx.stroke();
-
-    // 下限所在位置 140
-    const lowerLimitY = chartHeight * (1 - 0.2857);
-    console.log("lowerLimitY:", lowerLimitY);
-    ctx.beginPath();
-    ctx.moveTo(0, lowerLimitY);
-    ctx.lineTo(chartWidth, lowerLimitY);
-    ctx.strokeStyle = "blue";
-    ctx.lineWidth = 1;
-    ctx.stroke();
-
-    // 绘制收缩压折线图
-    const measurementWidth = canvas.width / (measurements.length + 1);
-
-    // 收缩压线
-    let systolicEnd = { x: null, y: null };
-    ctx.beginPath();
-    ctx.moveTo(
-      measurementWidth,
-      chartHeight - measurements[0].systolic * scale
-    );
-    for (let i = 1; i < measurements.length; i++) {
-      const x = (i + 1) * measurementWidth;
-      ctx.lineTo(x, chartHeight - measurements[i].systolic * scale);
-      if (i === measurements.length - 1) {
-        systolicEnd.x = x;
-        systolicEnd.y = chartHeight - measurements[i].systolic * scale;
-      }
-    }
-    ctx.strokeStyle = "black";
-    ctx.lineWidth = 1;
-    ctx.stroke();
-
-    // 舒张压线
-    let diastolicEnd = { x: null, y: null };
-    ctx.beginPath();
-    ctx.moveTo(
-      measurementWidth,
-      chartHeight - measurements[0].diastolic * scale
-    );
-    for (let i = 1; i < measurements.length; i++) {
-      const x = (i + 1) * measurementWidth;
-      ctx.lineTo(x, chartHeight - measurements[i].diastolic * scale);
-      if (i === measurements.length - 1) {
-        diastolicEnd.x = x;
-        diastolicEnd.y = chartHeight - measurements[i].diastolic * scale;
-      }
-    }
-
-    // 连接收缩压和舒张压的起始点和结束点
-    ctx.moveTo(
-      measurementWidth,
-      chartHeight - measurements[0].systolic * scale
-    );
-    ctx.lineTo(
-      measurementWidth,
-      chartHeight - measurements[0].diastolic * scale
-    );
-    ctx.moveTo(systolicEnd.x, systolicEnd.y);
-    ctx.lineTo(diastolicEnd.x, diastolicEnd.y);
-
-    ctx.strokeStyle = "black";
-    ctx.lineWidth = 1;
-    ctx.stroke();
-
-    const baseFontSize = 24;
-    ctx.font = `${baseFontSize * scale}px Arial`;
-    ctx.textAlign = "center";
-    ctx.textBaseline = "middle";
-    ctx.fillStyle = "black";
-
-    measurements.forEach((m, i) => {
-      const x = (i + 1) * measurementWidth;
-      ctx.fillText(
-        m.systolic.toString(),
-        x,
-        chartHeight - m.systolic * scale - 5
-      );
-      ctx.fillText(
-        m.diastolic.toString(),
-        x,
-        chartHeight - m.diastolic * scale + 10
-      );
-    });
-
-    // 绘制圆柱体
-    const 计算脱水量刻度 = 100 / datas[0]?.超滤总量;
-    const cylinderX = canvas.width * 0.9; // 圆柱体中心X坐标
-    const cylinderY = canvas.height; // 圆柱体中心Y坐标
-    const cylinderRadius = 6 * scale; // 圆柱体半径
-    const cylinderHeight = 计算脱水量刻度 * datas[0]?.超滤总量 * scale || 0; // 圆柱体高度
-    const 超滤总量 = datas[0]?.超滤总量 + "" || "0 L"; // 超滤总量
-    const 脱水百分比 = datas[0]?.脱水百分比 || 0; // 脱水百分比
-    const 透后体重减干体重的差值 = datas[0]?.透后体重减干体重的差值 || 0; // 透后体重减干体重的差值
-    drawCylinder(
-      ctx,
-      canvas.height,
-      scale,
-      cylinderX,
-      cylinderY,
-      cylinderRadius,
-      cylinderHeight,
-      超滤总量,
-      脱水百分比,
-      透后体重减干体重的差值
-    );
+  // 获取 canvas
+  let canvas = bloodPressureRectangularChart.value.querySelector("canvas");
+  if (!canvas) {
+    canvas = document.createElement("canvas");
+    bloodPressureRectangularChart.value.appendChild(canvas);
   }
+
+  // 物理像素
+  canvas.width = cssWidth * dpr;
+  canvas.height = cssHeight * dpr;
+  canvas.style.width = `${cssWidth}px`;
+  canvas.style.height = `${cssHeight}px`;
+
+  const ctx = canvas.getContext("2d");
+  if (!ctx) return;
+
+  // 先清除画布(按物理像素)
+  ctx.clearRect(0, 0, canvas.width, canvas.height);
+
+  // 缩放到实际坐标系(dpr & scale)
+  ctx.save();
+  ctx.scale(dpr * scale, dpr * scale);
+
+  // 基准坐标系:benchmarkData.width × benchmarkData.height
+  const chartWidth = benchmarkData.width;
+  const chartHeight = benchmarkData.height;
+
+  // ========== 绘制基线 ==========
+  const upperLimitY = chartHeight * 0.5; // 200
+  ctx.beginPath();
+  ctx.moveTo(0, upperLimitY);
+  ctx.lineTo(chartWidth, upperLimitY);
+  ctx.strokeStyle = "red";
+  ctx.lineWidth = 1;
+  ctx.stroke();
+
+  const lowerLimitY = chartHeight * (1 - 0.2857); // 140
+  ctx.beginPath();
+  ctx.moveTo(0, lowerLimitY);
+  ctx.lineTo(chartWidth, lowerLimitY);
+  ctx.strokeStyle = "blue";
+  ctx.lineWidth = 1;
+  ctx.stroke();
+
+  // ========== 血压数据 ==========
+  const measurements = [
+    { systolic: datas?.[0]?.血压1_透前收缩压 ?? 0, diastolic: datas?.[0]?.血压1_透前舒张压 ?? 0 },
+    { systolic: datas?.[0]?.血压2_前半程最低收缩压 ?? 0, diastolic: datas?.[0]?.血压2_前半程最低舒张压 ?? 0 },
+    { systolic: datas?.[0]?.血压3_后半程最低收缩压 ?? 0, diastolic: datas?.[0]?.血压3_后半程最低舒张压 ?? 0 },
+    { systolic: datas?.[0]?.血压4_透后收缩压 ?? 0, diastolic: datas?.[0]?.血压4_透后舒张压 ?? 0 },
+  ];
+
+  const measurementWidth = chartWidth / (measurements.length + 1);
+
+  // 收缩压线
+  let systolicEnd = { x: 0, y: 0 };
+  ctx.beginPath();
+  ctx.moveTo(measurementWidth, chartHeight - measurements[0].systolic);
+  for (let i = 1; i < measurements.length; i++) {
+    const x = (i + 1) * measurementWidth;
+    ctx.lineTo(x, chartHeight - measurements[i].systolic);
+    if (i === measurements.length - 1) {
+      systolicEnd = { x, y: chartHeight - measurements[i].systolic };
+    }
+  }
+  ctx.strokeStyle = "black";
+  ctx.stroke();
+
+  // 舒张压线
+  let diastolicEnd = { x: 0, y: 0 };
+  ctx.beginPath();
+  ctx.moveTo(measurementWidth, chartHeight - measurements[0].diastolic);
+  for (let i = 1; i < measurements.length; i++) {
+    const x = (i + 1) * measurementWidth;
+    ctx.lineTo(x, chartHeight - measurements[i].diastolic);
+    if (i === measurements.length - 1) {
+      diastolicEnd = { x, y: chartHeight - measurements[i].diastolic };
+    }
+  }
+  ctx.strokeStyle = "black";
+  ctx.stroke();
+
+  // 连接起始 & 结束
+  ctx.beginPath();
+  ctx.moveTo(measurementWidth, chartHeight - measurements[0].systolic);
+  ctx.lineTo(measurementWidth, chartHeight - measurements[0].diastolic);
+  ctx.moveTo(systolicEnd.x, systolicEnd.y);
+  ctx.lineTo(diastolicEnd.x, diastolicEnd.y);
+  ctx.stroke();
+
+  // ========== 文本 ==========
+  const baseFontSize = 24;
+  ctx.font = `${baseFontSize}px Arial`;
+  ctx.textAlign = "center";
+  ctx.textBaseline = "middle";
+  ctx.fillStyle = "black";
+
+  measurements.forEach((m, i) => {
+    const x = (i + 1) * measurementWidth;
+    ctx.fillText(m.systolic.toString(), x, chartHeight - m.systolic - 5);
+    ctx.fillText(m.diastolic.toString(), x, chartHeight - m.diastolic + 10);
+  });
+
+  // ========== 圆柱体 ==========
+  const 计算脱水量刻度 = 100 / (datas?.[0]?.超滤总量 || 1);
+  const cylinderX = chartWidth * 0.9;
+  const cylinderY = chartHeight;
+  const cylinderRadius = 6;
+  const cylinderHeight = 计算脱水量刻度 * (datas?.[0]?.超滤总量 || 0);
+
+  drawCylinder(
+    ctx,
+    chartHeight,
+    1, // 因为已经 scale 过了
+    cylinderX,
+    cylinderY,
+    cylinderRadius,
+    cylinderHeight,
+    datas?.[0]?.超滤总量?.toString() ?? "0 L",
+    datas?.[0]?.脱水百分比 ?? 0,
+    datas?.[0]?.透后体重减干体重的差值 ?? 0
+  );
+
+  ctx.restore(); // 恢复
 };
+
+
 
 const drawCylinder = (
   ctx: CanvasRenderingContext2D,
@@ -772,7 +742,7 @@
           .dialyzer {
             font-family: PingFangSC, PingFang SC;
             font-weight: 600;
-            font-size: 11px;
+            font-size: 9px;
             color: #333333;
             text-align: center;
             font-style: normal;
@@ -991,6 +961,7 @@
 }
 .item-box {
   height: 100%;
+  overflow-y: auto !important;
 }
 :deep(.mini-header) {
   flex: 0 0 4px !important;

--
Gitblit v1.8.0