From 267560778112315d0a6e5a7626a342ed65fba456 Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期三, 27 八月 2025 15:17:55 +0800
Subject: [PATCH] ID1686-已签到页面改版优化

---
 src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue | 1099 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 860 insertions(+), 239 deletions(-)

diff --git a/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue b/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
index 37b8371..fd40c78 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/pages/SignedIn.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="signed-in-container" :style="{ '--height': height + 'px' }">
     <div class="row1">
-      <div class="row1-col1">
+      <div class="col row1-col1">
         <el-image
           :src="pageData.patientPhone"
           style="width: 100%; height: 100%"
@@ -11,163 +11,278 @@
           </template>
         </el-image>
       </div>
-      <div class="row1-col2">
+      <div class="col row1-col2">
         <Card
-          title="异常指标"
-          :icon="xinlvImg"
+          title="治疗模式"
+          :icon="tslImg"
           background-color="#ffffff"
+          class="mini-card row1-col2-row1"
           header-class-name="mihi-header"
         >
-          <div class="dialysis-mode-content">
-            <span
-              v-for="(item, index) in pageData.abnormalItems"
-              :key="index"
-              class="abnormal-indicator"
-              :style="{ color: formatTestColr(item.结果标记) }"
-            >
-              {{ getItemName(item.项目名称) }}
-              {{ formatTestFlag(item.结果标记) }}
-            </span>
+          <div class="item-box dialysis-mode-content">
+            <span class="text-1">{{
+              formatSubstituteMode(pageData.置换方式)
+            }}</span>
+            <span class="text-2">{{ pageData.治疗模式 }}</span>
           </div>
         </Card>
-      </div>
-      <div class="row1-col3">
-        <div class="row1-col3-row1">
-          <Card
-            title="治疗模式"
-            :icon="zlmsImg"
-            background-color="#ffffff"
-            class="row1-col3-row1-item"
-            header-class-name="mihi-header"
-          >
-            <div class="item-box dialysis-mode-content">
-              {{ pageData.dialysisPlan }}
-            </div>
-          </Card>
-          <Card
-            title="治疗状态"
-            :icon="zlztImg"
-            background-color="#ffffff"
-            class="row1-col3-row1-item"
-            header-class-name="mihi-header"
-          >
-            <div class="item-box treatment-status">已签到</div>
-          </Card>
-        </div>
         <Card
           title="处方脱水量"
           :icon="cljdImg"
           background-color="#ffffff"
-          class="row1-col3-row2"
+          class="mini-card row1-col2-row2"
           header-class-name="mihi-header"
         >
           <div class="item-box prescription-ehydration-olume">
-            {{ pageData.prescriptionDehydrationVolume }} L
+            <span
+              >{{ pageData.处方脱水量 }}
+              <template v-if="pageData.处方脱水量">L</template></span
+            >
           </div>
         </Card>
       </div>
-      <div class="row1-col4">
+      <div class="col row1-col3">
         <Card
-          title="透析器(显示规格)"
+          title="置换总量"
+          :icon="zlztImg"
+          background-color="#ffffff"
+          class="mini-card row1-col3-row1"
+          header-class-name="mihi-header"
+        >
+          <div class="item-box total-amount-replacement">
+            <span>{{ pageData.置换总量 }}</span>
+          </div>
+        </Card>
+        <Card
+          title="透析时长"
+          :icon="cljdImg"
+          background-color="#ffffff"
+          class="mini-card row1-col3-row2"
+          header-class-name="mihi-header"
+        >
+          <div class="item-box dialysis-duration">
+            <span>{{ pageData.透析时长2 }}</span>
+          </div>
+        </Card>
+      </div>
+      <div class="col row1-col4">
+        <Card
+          title="透析器"
           :icon="txqImg"
           background-color="#ffffff"
-          class="row1-col4-row"
+          class="mini-card row1-col4-row1"
           header-class-name="mihi-header"
         >
           <div class="item-box dialyzer">
-            {{ pageData.dialyzer }}
+            <span>{{ pageData.透析器 }}</span>
           </div>
         </Card>
+        <Card
+          title="抗凝剂"
+          :icon="tslImg"
+          background-color="#ffffff"
+          class="mini-card row1-col4-row2"
+          header-class-name="mihi-header"
+        >
+          <div class="item-box anticoagulant">
+            <div
+              v-for="(item, index) in pageData.抗凝剂"
+              :key="index"
+              class="list-item"
+            >
+              <div class="list-item-name">
+                {{ item.name }}
+              </div>
+              <div class="list-item-num">
+                <span>首剂:{{ item.首剂 }}{{ item.单位 }}</span>
+                <span
+                  >追加/维持:{{
+                    item.是否为追加 ? item.追加剂量 : item.维持剂量
+                  }}{{ item.单位 }}</span
+                >
+                <span>总量:{{ item.总量 }}{{ item.单位 }}</span>
+              </div>
+            </div>
+          </div>
+        </Card>
+      </div>
+      <div class="col row1-col5">
         <Card
           title="脱水量详情"
           :icon="cljdImg"
           background-color="#ffffff"
-          class="row1-col4-row"
-          header-class-name="mihi-header"
+          class="mini-card row1-col5-row1"
+          header-class-name="mini-header"
         >
           <div class="dehydrated-level">
             <div class="dehydrated-level-item">
               <span class="item-left"
-                >平均脱水量:{{ pageData.averageDehydrationRate }} L</span
+                >平均脱水量:{{ pageData.最近平均脱水量 }} L</span
               >
               <span class="item-right">(最近9次)</span>
             </div>
             <div class="dehydrated-level-item">
-              <span class="item-left"
-                >最大脱水量:{{ pageData.maximumDehydrationCapacity }} L</span
-              >
+              <div class="item-left">
+                <span>最大脱水量:{{ pageData.最近最大脱水量 }} L</span>
+                <template v-if="pageData.最近最大脱水量透析时长"
+                  >/
+                  <span class="level-dete">{{
+                    pageData.最近最大脱水量透析时长
+                  }}</span>
+                </template>
+              </div>
               <span class="item-right"
-                >({{ pageData.maximumDehydrationCapacityDate }})</span
+                >({{ pageData.最近最大脱水量透析日期 }})</span
               >
             </div>
+          </div>
+        </Card>
+        <Card
+          title="处方备注"
+          :icon="maibo2Img"
+          background-color="#ffffff"
+          class="mini-card row1-col5-row2"
+          header-class-name="mihi-header"
+        >
+          <div class="item-box prescription-remarks">
+            <span>{{ pageData.处方备注 }}</span>
           </div>
         </Card>
       </div>
     </div>
     <div class="row2">
-      <Card
-        title="干体重"
-        :icon="tizhongImg"
-        background-color="#ffffff"
-        class="row2-item"
-        header-class-name="big-header"
-      >
-        <div class="weight-box">
-          <span class="weight-text">{{ pageData.dryWeight }}</span>
-          <span class="unit-text">kg</span>
+      <div class="col row2-col1">
+        <div class="row2-col1-row1">
+          <Card
+            title="处方血流量"
+            :icon="cljdImg"
+            background-color="#ffffff"
+            class="mini-card row2-col1-row1-col1"
+            header-class-name="mihi-header"
+          >
+            <div class="item-box blood-flow">
+              <span>{{ pageData.处方血流量 }}</span>
+            </div>
+          </Card>
+          <Card
+            title="处方钠"
+            :icon="cljdImg"
+            background-color="#ffffff"
+            class="mini-card row2-col1-row1-col2"
+            header-class-name="mihi-header"
+          >
+            <div class="item-box prescription-sodium">
+              <span>{{ pageData.处方钠 }}</span>
+            </div>
+          </Card>
         </div>
-      </Card>
-      <Card
-        title="透前体重"
-        :icon="tizhongImg"
-        background-color="#ffffff"
-        class="row2-item"
-        header-class-name="big-header"
-      >
-        <div class="weight-box">
-          <span class="weight-text">{{ pageData.preDialysisWeight }}</span>
-          <span class="unit-text">kg</span>
+        <div class="row2-col1-row2">
+          <Card
+            title="透析液流量"
+            :icon="cljdImg"
+            background-color="#ffffff"
+            class="mini-card row2-col1-row2-col1"
+            header-class-name="mihi-header"
+          >
+            <div class="item-box dialysis-fluid-flow-rate">
+              <span>{{ pageData.透析液流量 }}</span>
+            </div>
+          </Card>
+          <Card
+            title="透析液种类"
+            :icon="cljdImg"
+            background-color="#ffffff"
+            class="mini-card row2-col1-row2-col2"
+            header-class-name="mihi-header"
+          >
+            <div class="item-box types-dialysis-fluid">
+              <div>葡萄糖:{{ pageData.葡萄糖 }}</div>
+              <div>钙:{{ pageData.钙 }}</div>
+            </div>
+          </Card>
         </div>
-      </Card>
-      <Card
-        title="上次透后体重"
-        :icon="tizhongImg"
-        background-color="#ffffff"
-        class="row2-item"
-        header-class-name="big-header"
-      >
-        <div class="weight-box">
-          <span class="weight-text">{{
-            pageData.weightAfterLastDialysis
-          }}</span>
-          <span class="unit-text">kg</span>
-        </div>
-      </Card>
-      <Card
-        title="体重增长"
-        :icon="tizhongImg"
-        background-color="#ffffff"
-        class="row2-item"
-        header-class-name="big-header"
-      >
-        <div class="weight-box">
-          <span v-if="pageData.weightIncreaseRate > 0" class="weight-text">+</span>
-          <span class="weight-text">{{ pageData.weightIncrease }}</span>
-          <span class="unit-text">kg</span>
-        </div>
-      </Card>
-      <Card
-        title="增长率"
-        :icon="tizhongImg"
-        background-color="#ffffff"
-        class="row2-item"
-        header-class-name="big-header"
-      >
-        <div class="weight-box">
-          <span class="weight-text">{{ pageData.weightIncreaseRate }}</span>
-          <span class="unit-text">%</span>
-        </div>
-      </Card>
+        <Card
+          title="治疗状态"
+          :icon="zlztImg"
+          background-color="#ffffff"
+          class="mini-card row2-col1-row3"
+          header-class-name="mihi-header"
+        >
+          <div class="item-box treatment-status">
+            <span>已签到</span>
+          </div>
+        </Card>
+      </div>
+      <div class="col row2-col2">
+        <Card
+          title="参考指标"
+          :icon="tizhongImg"
+          background-color="#ffffff"
+          class="reference-indicators"
+          header-class-name="mihi-header"
+        >
+          <template #right>
+            {{ nowDateText }}
+          </template>
+          <table class="item-box reference-indicators-content">
+            <tbody>
+              <tr>
+                <td>血压<br />超滤量<br /></td>
+                <td
+                  ref="bloodPressureRectangularChart"
+                  style="overflow: hidden"
+                >
+                  <canvas width="1px" height="1px" />
+                </td>
+              </tr>
+              <tr>
+                <td>干体重</td>
+                <td>{{ fourPointBloodPressureMap.干体重 }}kg</td>
+              </tr>
+              <tr>
+                <td>体重增长</td>
+                <td class="flex-td">
+                  <span class="sub-text">(透前-上次透后)</span
+                  ><span class="right-text">{{ weightGain1 }}kg</span>
+                </td>
+              </tr>
+              <tr>
+                <td>体重增长</td>
+                <td class="flex-td">
+                  <span class="sub-text">(透前-干体重)</span><span class="text-right">{{ weightGain2 }}kg</span>
+                </td>
+              </tr>
+              <!-- <tr>
+                <td>脱水量</td>
+                <td>{{ pageData.脱水量 }}%</td>
+              </tr> -->
+              <tr>
+                <td>透前体重</td>
+                <td>{{ fourPointBloodPressureMap?.透前体重 }}kg</td>
+              </tr>
+              <tr>
+                <td>透后体重</td>
+                <td>{{ fourPointBloodPressureMap?.透后体重 }}kg</td>
+              </tr>
+              <tr>
+                <td>透析时间</td>
+                <td>{{ fourPointBloodPressureMap?.透析时间 }}</td>
+              </tr>
+            </tbody>
+          </table>
+        </Card>
+      </div>
+      <div class="col row2-col3">
+        <Card
+          title="临时医嘱"
+          :icon="yizhuImg"
+          background-color="#ffffff"
+          class="mini-card"
+          header-class-name="mini-header"
+        >
+          <DoctorAdvice :list="pageData.临时医嘱列表" />
+        </Card>
+      </div>
     </div>
     <div class="row3">
       <BlockBotttom
@@ -192,32 +307,45 @@
         class="btn"
       />
     </div>
+    <!-- 定时任务 -->
+    <ScheduledTaskDialog ref="scheduledTaskDialogRef" />
   </div>
 </template>
 <script lang="ts" setup name="SignedIn">
-import { computed } from "vue";
+import { computed, defineAsyncComponent, onMounted, ref } from "vue";
+import dayjs from "dayjs";
+import "dayjs/locale/zh-cn";
+dayjs.locale("zh-cn");
 // @ts-ignore
 import Card from "../components/Card.vue";
+import DoctorAdvice from "../components/DoctorAdvice/index.vue";
 import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen";
+import type { 四点血压图数据 } from "@/store/type/bedsideAuxiliaryScreen.type";
 import tslImg from "@/img/tsl.png";
 import dingShiImg from "@/img/dingshi2.png";
 import jiaoHaoImg from "@/img/jiaoHao.png";
 import kaiShiImg from "@/img/kaiShi.png";
 import xinlvImg from "@/img/xinlv.png";
 import zlmsImg from "@/img/zlms.png";
-import zlztImg from '@/img/txzt.png';
+import zlztImg from "@/img/txzt.png";
 import cljdImg from "@/img/cljd.png";
 import txqImg from "@/img/txq.png";
 import tizhongImg from "@/img/tizhong.png";
+import yizhuImg from "@/img/yizhu.png";
+import maibo2Img from "@/img/maibo2.png";
 
 import {
   getItemName,
   formatTestColr,
   formatTestFlag,
+  formatSubstituteMode,
 } from "@/store/type/bedsideAuxiliaryScreen.type";
 // @ts-ignore
 import BlockBotttom from "../components/BlockBotttom.vue";
-import { ElMessage } from "element-plus/es";
+import { ElMessage } from "element-plus";
+const ScheduledTaskDialog = defineAsyncComponent(
+  () => import("../components/ScheduledTask.vue")
+);
 
 interface Props {
   height: number;
@@ -226,14 +354,75 @@
 
 const bedsideAuxiliaryScreenStore = useBedsideAuxiliaryScreenStore();
 
+const bloodPressureRectangularChart = ref<HTMLElement | null>(null);
+const scheduledTaskDialogRef = ref<any>(null);
+
+
 const pageData = computed(() => {
   return Object.assign(bedsideAuxiliaryScreenStore.deviceData.signedIn, {
     patientPhone: bedsideAuxiliaryScreenStore.deviceData.patientPhone,
   });
 });
 
+const fourPointBloodPressureMap = computed(() => {
+  let result = {};
+  if (
+    pageData.value.四点血压图数据 &&
+    pageData.value.四点血压图数据.length > 0
+  ) {
+    result = pageData.value.四点血压图数据[0];
+  }
+  return result;
+});
+
+const nowDateText = computed(() => {
+  if (fourPointBloodPressureMap.value?.透析日期) {
+    let result = dayjs(fourPointBloodPressureMap.value?.透析日期).format(
+      "YYYY-MM-DD"
+    );
+    result += `(${dayjs(fourPointBloodPressureMap.value?.透析日期).format(
+      "ddd"
+    )})`;
+    return result;
+  }
+  return "";
+});
+
+const weightGain1 = computed(() => {
+  if (
+    pageData.value.四点血压图数据 &&
+    pageData.value.四点血压图数据.length > 1
+  ) {
+    const value =
+      pageData.value.四点血压图数据[0].透前体重 -
+      pageData.value.四点血压图数据[1].透后体重;
+    const formattedValue = Number.isInteger(value)
+      ? value
+      : Number(value.toFixed(1));
+    return formattedValue;
+  }
+  return "";
+});
+
+const weightGain2 = computed(() => {
+  const value =
+    fourPointBloodPressureMap.value.透前体重 -
+    fourPointBloodPressureMap.value.干体重;
+  const formattedValue = Number.isInteger(value)
+    ? value
+    : Number(value.toFixed(1));
+  return formattedValue;
+});
+
 /** 点击定时任务 */
-const onScheduledTasksClick = () => {};
+const onScheduledTasksClick = () => {
+  if (
+    !bedsideAuxiliaryScreenStore.deviceCode ||
+    !bedsideAuxiliaryScreenStore.deviceData.deviceCode
+  )
+    return ElMessage.warning("未初始化或正在进行初始化操作中");
+  scheduledTaskDialogRef.value?.openDialog();
+};
 
 const onCallBumberClick = () => {
   ElMessage({
@@ -248,6 +437,211 @@
     type: "warning",
   });
 };
+
+const genderBloodPressureRectangularChart = (datas: 四点血压图数据[] | null) => {
+  if (!bloodPressureRectangularChart.value) return;
+
+  const benchmarkData = { width: 386, height: 280 };
+
+  // 获取容器宽高(90% 缩放)
+  const containerWidth = bloodPressureRectangularChart.value.offsetWidth * 0.9;
+  const containerHeight = bloodPressureRectangularChart.value.offsetHeight * 0.9;
+
+  // 获取设备像素比
+  const dpr = window.devicePixelRatio || 1;
+
+  // 等比例缩放因子(保持比例)
+  const scale = Math.min(
+    containerWidth / benchmarkData.width,
+    containerHeight / benchmarkData.height
+  );
+
+  // 计算实际画布 CSS 尺寸
+  const cssWidth = benchmarkData.width * scale;
+  const cssHeight = benchmarkData.height * scale;
+
+  // 获取 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,
+  canvasHeight: number,
+  scale: number,
+  x: number,
+  y: number,
+  radius: number,
+  height: number,
+  超滤总量: string, // 超滤总量
+  脱水百分比: number, // 脱水百分比
+  透后体重减干体重的差值: number // 透后体重减干体重的差值
+) => {
+  ctx.beginPath();
+  ctx.arc(x, y + height, radius, 0, Math.PI * 2);
+  ctx.fillStyle = "#409EFF"; // 填充蓝色
+  ctx.strokeStyle = "#409EFF";
+  if (脱水百分比 > 3) {
+    ctx.fillStyle = "#E6A23C"; // 填充黄色
+    ctx.strokeStyle = "#E6A23C";
+  } else if (脱水百分比 > 5) {
+    ctx.fillStyle = "#F56C6C"; // 填充红色
+    ctx.strokeStyle = "#F56C6C";
+  }
+  ctx.fill();
+  ctx.stroke();
+
+  // 绘制侧面矩形
+  ctx.beginPath();
+  ctx.moveTo(x - radius, y - height);
+  ctx.lineTo(x - radius, y + height);
+  ctx.lineTo(x + radius, y + height);
+  ctx.lineTo(x + radius, y - height);
+  ctx.closePath();
+  ctx.fill();
+  ctx.stroke();
+
+  const baseFontSize = 16;
+
+  // 添加文本说明
+  ctx.font = `${baseFontSize * scale}px Arial`;
+  ctx.textAlign = "center";
+  ctx.fillStyle = "#409EFF";
+  ctx.fillText(超滤总量, x, canvasHeight - height - 5); // 文本位于圆柱上方一点
+
+  if (透后体重减干体重的差值 > 0) {
+    ctx.font = `${baseFontSize * scale}px Arial`;
+    ctx.textAlign = "center";
+    ctx.fillStyle = "#000000";
+    ctx.fillText(透后体重减干体重的差值 + "", x, canvasHeight - 5); // 文本位于圆柱上方一点
+  }
+};
+onMounted(() => {
+  genderBloodPressureRectangularChart(pageData.value.四点血压图数据);
+});
 </script>
 <style lang="less" scoped>
 * {
@@ -258,165 +652,317 @@
   height: var(--height);
   overflow: hidden;
   .row1 {
-    height: 37.44%;
-    margin-bottom: 4px;
+    height: 38.38%;
     overflow: hidden;
+    margin-bottom: 1.07%;
     display: flex;
     align-items: center;
     justify-content: space-between;
-    .row1-col1 {
-      flex: 0 0 14.86%;
+    .col {
       height: 100%;
       border-radius: 2px;
       overflow: hidden;
-    }
-    .row1-col2 {
-      flex: 0 0 32.86%;
-      height: 100%;
-      .dialysis-mode-content {
-        height: 100%;
-        .abnormal-indicator {
-          display: inline-block;
-          margin-right: 6px;
-          margin-bottom: 4px;
-          font-family: PingFangSC, PingFang SC;
-          font-weight: 600;
-          font-size: 5px;
-          line-height: 6px;
-          text-align: left;
-          font-style: normal;
-        }
+      &.row1-col1 {
+        flex: 0 0 14.86%;
       }
-    }
-    .row1-col3 {
-      flex: 0 0 23.71%;
-      height: 100%;
-      display: flex;
-      flex-direction: column;
-      gap: 4px;
-      .row1-col3-row1 {
-        flex: 1;
+      &.row1-col2 {
+        flex: 0 0 14.57%;
         display: flex;
+        flex-direction: column;
         gap: 4px;
-        .row1-col3-row1-item {
-          flex: 1;
-        }
-      }
-      .row1-col3-row2 {
-        flex: 1;
-      }
-    }
-    .row1-col4 {
-      flex: 0 0 25.14%;
-      height: 100%;
-      display: flex;
-      flex-direction: column;
-      gap: 4px;
-      .row1-col4-row {
-        flex: 1;
-        .dehydrated-level {
-          padding-left: 6px;
-          display: flex;
-          flex-direction: column;
-          align-items: center;
-          justify-content: space-between;
-          .dehydrated-level-item {
-            width: 100%;
+        .row1-col2-row1 {
+          flex: 0 0 40%;
+          .dialysis-mode-content {
             display: flex;
             align-items: center;
-            .item-left {
-              flex: 1;
+            justify-content: center;
+            .text-1 {
               font-family: PingFangSC, PingFang SC;
               font-weight: 600;
-              font-size: 4px;
+              font-size: 6px;
+              color: #c9a589;
+              line-height: 8px;
+              text-align: center;
+              font-style: normal;
+            }
+            .text-2 {
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 9px;
+              color: #d58e56;
+              line-height: 12px;
+              text-align: center;
+              font-style: normal;
+            }
+          }
+        }
+        .row1-col2-row2 {
+          flex: 0 0 60%;
+          .prescription-ehydration-olume {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 11px;
+            color: #e87d00;
+            text-align: center;
+            font-style: normal;
+          }
+        }
+      }
+      &.row1-col3 {
+        flex: 0 0 14.57%;
+        display: flex;
+        flex-direction: column;
+        gap: 4px;
+        .row1-col3-row1 {
+          flex: 0 0 40%;
+          .total-amount-replacement {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 9px;
+            color: #d58e56;
+            line-height: 13px;
+            text-align: center;
+            font-style: normal;
+          }
+        }
+        .row1-col3-row2 {
+          flex: 0 0 60%;
+          .dialysis-duration {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 8px;
+            color: #333333;
+            line-height: 11px;
+            text-align: center;
+            font-style: normal;
+          }
+        }
+      }
+      &.row1-col4 {
+        flex: 0 0 25.71%;
+        display: flex;
+        flex-direction: column;
+        gap: 4px;
+        .row1-col4-row1 {
+          flex: 0 0 40%;
+          .dialyzer {
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 9px;
+            color: #333333;
+            text-align: center;
+            font-style: normal;
+          }
+        }
+        .row1-col4-row2 {
+          flex: 0 0 60%;
+          .anticoagulant {
+            .list-item {
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 4.5px;
               color: #333333;
               line-height: 6px;
+              text-align: left;
               font-style: normal;
+              .list-item-name {
+                margin-bottom: 2px;
+              }
             }
-            .item-right {
-              font-family: PingFangSC, PingFang SC;
-              font-weight: 600;
-              font-size: 4px;
-              color: #777777;
-              line-height: 6px;
-              font-style: normal;
+          }
+        }
+      }
+      &.row1-col5 {
+        flex: 0 0 25.71%;
+        display: flex;
+        flex-direction: column;
+        gap: 4px;
+        .row1-col5-row1 {
+          flex: 0 0 40%;
+          .dehydrated-level {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            justify-content: space-between;
+            .dehydrated-level-item {
+              width: 100%;
+              display: flex;
+              align-items: center;
+              .item-left {
+                flex: 1;
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 600;
+                font-size: 4px;
+                color: #333333;
+                line-height: 6px;
+                font-style: normal;
+                .level-dete {
+                  font-family: PingFangSC, PingFang SC;
+                  font-weight: 600;
+                  font-size: 4px;
+                  color: #d58e56;
+                  text-align: left;
+                  font-style: normal;
+                }
+              }
+              .item-right {
+                font-family: PingFangSC, PingFang SC;
+                font-weight: 600;
+                font-size: 4px;
+                color: #777777;
+                line-height: 6px;
+                font-style: normal;
+              }
             }
+          }
+        }
+        .row1-col5-row2 {
+          flex: 0 0 60%;
+          .prescription-remarks {
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 500;
+            font-size: 4px;
+            color: #9a1717;
+            line-height: 6px;
+            text-align: left;
+            font-style: normal;
           }
         }
       }
     }
   }
   .row2 {
-    height: 21.72%;
+    height: 44.56%;
     overflow: hidden;
+    margin-bottom: 1.07%;
     display: flex;
-    gap: 4px;
-    .row2-item {
-      flex: 1;
-
-      .weight-box {
+    justify-content: space-between;
+    .col {
+      height: 100%;
+      border-radius: 2px;
+      overflow: hidden;
+      &.row2-col1 {
+        flex: 0 0 38%;
         display: flex;
-        align-items: flex-end;
-        justify-content: center;
-        gap: 2px;
-        align-items: baseline;
-        .weight-text {
-          font-family: PingFangSC, PingFang SC;
-          font-weight: 600;
-          font-size: 11px;
-          color: #333333;
-          text-align: center;
-          font-style: normal;
+        flex-direction: column;
+        justify-content: space-between;
+        .row2-col1-row1 {
+          height: 34%;
+          display: flex;
+          gap: 4px;
+          .row2-col1-row1-col1 {
+            flex: 1;
+            height: 100%;
+            .blood-flow {
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 9px;
+              color: #333333;
+              line-height: 12px;
+              text-align: center;
+              font-style: normal;
+            }
+          }
+          .row2-col1-row1-col2 {
+            flex: 1;
+            height: 100%;
+            .prescription-sodium {
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 9px;
+              color: #333333;
+              line-height: 12px;
+              text-align: center;
+              font-style: normal;
+            }
+          }
         }
-        .unit-text {
-          font-family: PingFangSC, PingFang SC;
-          font-weight: 600;
-          font-size: 7px;
-          color: #333333;
-          text-align: center;
-          font-style: normal;
+        .row2-col1-row2 {
+          height: 34%;
+          display: flex;
+          gap: 4px;
+          .row2-col1-row2-col1 {
+            flex: 1;
+            height: 100%;
+            .dialysis-fluid-flow-rate {
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 9px;
+              color: #333333;
+              line-height: 12px;
+              text-align: center;
+              font-style: normal;
+            }
+          }
+          .row2-col1-row2-col2 {
+            flex: 1;
+            height: 100%;
+            .types-dialysis-fluid {
+              display: flex;
+              flex-direction: column;
+              font-family: PingFangSC, PingFang SC;
+              font-weight: 600;
+              font-size: 4.2px;
+              color: #333333;
+              font-style: normal;
+            }
+          }
         }
+        .row2-col1-row3 {
+          height: 22.3%;
+          flex-direction: row;
+          .treatment-status {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 9px;
+            color: #70a3dd;
+            text-align: center;
+            font-style: normal;
+          }
+        }
+      }
+      &.row2-col2 {
+        flex: 0 0 18.2%;
+      }
+      &.row2-col3 {
+        flex: 0 0 41.4%;
       }
     }
   }
   .row3 {
-    position: absolute;
-    width: 100%;
-    bottom: 2px;
-    height: 13.33%;
+    height: 11.92%;
+    overflow: hidden;
+    background: #fff;
     display: flex;
     align-items: center;
     justify-content: flex-end;
     padding-right: 13px;
-    overflow: hidden;
-    background: #ffffff;
     border-radius: 2px;
     .btn {
       margin-left: 9px;
     }
   }
-  .item-box {
-    height: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    font-family: PingFangSC, PingFang SC;
-    font-weight: 600;
-    font-size: 8px;
-    color: #70a3dd;
-    text-align: center;
-    font-style: normal;
-    &.dialysis-mode-content {
-      color: #d58e56;
-    }
-    &.treatment-status {
-      color: #70a3dd;
-    }
-    &.prescription-ehydration-olume {
-      color: #8079cb;
-    }
-  }
-  // card header class
   :deep(.mihi-header) {
     flex: 0 0 4px;
     .card-icon {
@@ -427,14 +973,89 @@
       font-size: 4px;
     }
   }
-  :deep(.big-header) {
-    flex: 0 0 9px;
-    .card-icon {
-      width: 9px;
-      height: 9px;
+}
+.item-box {
+  height: 100%;
+  overflow-y: auto !important;
+}
+:deep(.mini-header) {
+  flex: 0 0 4px !important;
+  .card-icon {
+    width: 4px !important;
+    height: 4px !important;
+  }
+  .card-title {
+    font-size: 4px !important;
+  }
+}
+</style>
+// <style lang="less">
+// .reference-indicators {
+//   padding: 0 !important;
+//   .card-header {
+//     padding: 3px 4px;
+//   }
+// }
+//
+</style>
+<style lang="less">
+.reference-indicators {
+  padding: 0 !important;
+  .card-header {
+    padding: 3px 4px;
+    margin-bottom: 0 !important;
+  }
+  .reference-indicators-content {
+    width: 100%;
+    border-collapse: collapse;
+    td {
+      border: 1px solid #dfdfdf; /* 黑色边框 */
+      border-left: none;
+      text-align: center;
+      vertical-align: middle;
     }
-    .card-title {
-      font-size: 5px;
+    & td:first-child {
+      width: 36%;
+      font-family: PingFangSC, PingFang SC;
+      font-weight: 400;
+      font-size: 3px;
+      color: #333333;
+      text-align: center;
+      font-style: normal;
+    }
+    & td:last-child {
+      position: relative;
+      width: 64%;
+      border-right: none;
+      font-family: PingFangSC, PingFang SC;
+      font-weight: 500;
+      font-size: 3.6px;
+      color: #333333;
+      text-align: center;
+      font-style: normal;
+      &.flex-td {
+        display: flex;
+        align-items: center;
+        justify-content: space-around;
+        width: 100%;
+      }
+      .sub-text {
+        font-size: 3px;
+        color: #666;
+        margin-right: 1.2px;
+         white-space: nowrap;
+      }
+      // .text-right {
+      //   position: absolute;
+      //   right: 0;
+      //   top: 50%;
+      //   transform: translateY(-50%);
+      //   font-size: 3px;
+      //   color: #666;
+      // }
+    }
+    & tr:not(:first-child) td {
+      height: 6px;
     }
   }
 }

--
Gitblit v1.8.0