单应用项目,可以创建很多独立工具类页面 ,不用登录 初始化的页面
zhangchen
2025-09-16 2a8070b96f4aec8059ea96935b9166aec75b188b
src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue
@@ -1,32 +1,388 @@
<template>
  <div class="under-treatment-container" :style="{ '--height': height + 'px' }">
    <div class="left-box">
      <div class="left-row1">
        <div class="left-row1-col1">
          <el-image
            :src="pageData.patientPhone"
            style="width: 100%; height: 100%"
          >
            <template #placeholder>
              <div class="image-slot">加载中<span class="dot">...</span></div>
            </template>
          </el-image>
  <div>
    <div
      class="under-treatment-container"
      :style="{ '--height': height + 'px' }"
    >
      <div class="left-box">
        <div class="left-row1">
          <div class="left-row1-col1">
            <el-image
              :src="pageData.patientPhone"
              style="width: 100%; height: 100%"
            >
              <template #placeholder>
                <div class="image-slot">加载中<span class="dot">...</span></div>
              </template>
            </el-image>
          </div>
          <div class="left-row1-col2">
            <Card
              title="治疗模式"
              :icon="zlmsImg"
              background-color="#ffffff"
              class="mini-card left-row1-col2-row1"
              header-class-name="mini-header"
            >
              <div class="item-box dialysis-mode-content">
                <div class="dialysis-mode-content-box">
                  <span class="mini-text">{{
                    formatSubstituteMode(pageData.substituteMode)
                  }}</span>
                  <span class="text">{{ pageData.dialysisPlan }}</span>
                </div>
              </div>
            </Card>
            <Card
              title="处方备注"
              :icon="zlmsImg"
              background-color="#ffffff"
              class="mini-card left-row1-col2-item-row2"
              header-class-name="mini-header"
            >
              <div class="prescription-remarks">
                {{ pageData.prescriptionRemarks }}
              </div>
            </Card>
          </div>
          <div class="left-row1-col3">
            <Card
              title="透析器"
              :icon="txqImg"
              background-color="#ffffff"
              class="mini-card left-row1-col3-row1"
              header-class-name="mini-header"
            >
              <div class="item-box prescription-ehydration-olume">
                <span class="text">{{ pageData.dialyzer }}</span>
              </div>
            </Card>
            <Card
              title="异常指标"
              :icon="xinlvImg"
              background-color="#ffffff"
              class="mini-card left-row1-col3-row2"
              header-class-name="mini-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>
            </Card>
          </div>
        </div>
        <div class="left-row1-col2"></div>
        <div class="left-row1-col3"></div>
        <div class="left-row2">
          <Card
            title="血温监测"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card left-row2-col1"
            header-class-name="mini-header"
          >
            <div class="item-box current-lood0emperature">
              <span class="text">{{ pageData.currentBloodTemperature }}</span>
            </div>
          </Card>
          <Card
            title="血压监测"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card left-row2-col2"
            header-class-name="mini-header"
          >
            <div class="item-box venous-pressure">
              <span class="text"
                >{{ pageData.venousPressure }}/{{
                  pageData.transmembranePressure
                }}</span
              >
            </div>
          </Card>
          <Card
            title="血压脉搏趋势图"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card ktv-card left-row2-col3"
            header-class-name="mini-header"
          >
            <div style="height: 100%">
              <div
                ref="bloodPressureAndPulseEchartRef"
                style="width: 100%; height: 100%"
              ></div>
            </div>
          </Card>
        </div>
        <div class="left-row3">
          <Card
            title="血容量监测"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card left-row3-col1"
            header-class-name="mini-header"
          >
            <div class="item-box current-lood0emperature">
              <span class="text">{{ pageData.bloodVolumeMonitoring }}</span>
            </div>
          </Card>
          <Card
            title="Kt/V监测"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card left-row3-col2"
            header-class-name="mini-header"
          >
            <div class="item-box venous-pressure">
              <span class="text">{{ pageData.ktv }}</span>
            </div>
          </Card>
          <Card
            title="Kt/V趋势图"
            :icon="xinLv2Img"
            background-color="#ffffff"
            class="mini-card ktv-card left-row3-col3"
            header-class-name="mini-header"
          >
            <div style="height: 100%">
              <div
                ref="ktvListEchartRef"
                style="width: 100%; height: 100%"
              ></div>
            </div>
          </Card>
        </div>
        <div class="left-row4">
          <Card
            title="静脉压/跨膜压"
            :icon="txqImg"
            background-color="#ffffff"
            class="mini-card left-row4-col"
            header-class-name="mini-header"
          >
            <div class="item-box current-lood0emperature">
              <span class="text">{{ pageData.venousPressure2 }}/{{ pageData.transmembranePressure2 }}</span>
            </div>
          </Card>
          <Card
            title="血流量/透析液流量"
            :icon="txqImg"
            background-color="#ffffff"
            class="mini-card left-row4-col"
            header-class-name="mini-header"
          >
            <div class="item-box current-lood0emperature">
              <span class="text">{{ pageData.bloodFlow }}/{{ pageData.dialysisFluidFlowRate }}</span>
            </div>
          </Card>
        </div>
      </div>
      <div class="left-row2"></div>
      <div class="left-row3"></div>
      <div class="left-row4"></div>
      <div class="right-box">
        <div class="right-box-row1">
          <Card
            title="治疗状态"
            :icon="txztImg"
            background-color="#ffffff"
            class="mini-card right-box-row1-col1"
            header-class-name="mini-header"
          >
            <div class="item-box treatment-status">
              <span class="text">{{ treatmentStatusText }}</span>
            </div>
          </Card>
          <Card
            title="脱水量详情"
            :icon="cljdImg"
            background-color="#ffffff"
            class="mini-card right-box-row1-col2"
            header-class-name="mini-header"
          >
            <div class="dehydrated-level">
              <div class="dehydrated-level-item">
                <span class="item-left"
                  >平均脱水量:{{ pageData.averageDehydrationRate }} L</span
                >
                <span class="item-right">(最近9次)</span>
              </div>
              <div class="dehydrated-level-item">
                <div class="item-left">
                  <span
                    >最大脱水量:{{
                      pageData.maximumDehydrationCapacity
                    }}
                    L</span
                  >
                  <template v-if="pageData.maximumDehydrationDuration"
                    >/
                    <span class="level-dete">{{
                      pageData.maximumDehydrationDuration
                    }}</span>
                  </template>
                </div>
                <span class="item-right"
                  >({{ pageData.maximumDehydrationCapacityDate }})</span
                >
              </div>
            </div>
          </Card>
        </div>
        <div class="right-box-row2">
          <Card
            title="时间进度"
            :icon="sjjdImg"
            background-color="#ffffff"
            class="mini-card right-box-row2-item"
            header-class-name="mini-header"
          >
            <div class="progress-box">
              <div class="item-num">
                {{ jgTime4(pageData.dialysisDuration) }}/{{
                  pageData.prescriptionDialysisDurationHour
                }}:{{ pageData.prescriptionDialysisDurationMin }}
              </div>
              <ProgressBar
                :percent="
                  (Number(pageData.dialysisDuration) /
                    (Number(pageData.prescriptionDialysisDuration) * 60)) *
                  100
                "
                color="#70A3DD"
                backgroundColor="#D6DEF1"
                borderRadius="50%"
              />
            </div>
          </Card>
          <Card
            title="超滤进度"
            :icon="cljdImg"
            background-color="#ffffff"
            class="mini-card right-box-row2-item"
            header-class-name="mini-header"
          >
            <div class="progress-box">
              <div class="item-num">
                {{ pageData.currentDehydrationVolume }}/{{
                  pageData.prescriptionDehydrationVolume
                }}({{ pageData.currentUltrafiltrationRate }})
              </div>
              <ProgressBar
                :percent="
                  (pageData.currentDehydrationVolume /
                    pageData.prescriptionDehydrationVolume) *
                  100
                "
                color="#70CAAE"
                backgroundColor="#D6DEF1"
                borderRadius="50%"
              />
            </div>
          </Card>
        </div>
        <div class="right-box-row3">
          <Card
            title="临时医嘱"
            :icon="yizhuImg"
            background-color="#ffffff"
            class="mini-card right-box-row2-item"
            header-class-name="mini-header"
          >
            <DoctorAdvice :list="pageData.doctorAdvice" />
          </Card>
        </div>
        <div class="right-box-row4">
          <BlockBotttom
            :icon="dingShiImg"
            text="定时任务"
            backgroundColor="#20C6B6"
            @click="() => onScheduledTasksClick()"
            class="btn"
          />
          <!-- <BlockBotttom
            :icon="jiaoHaoImg"
            text="叫号"
            backgroundColor="#20C6B6"
            @click="() => onCallBumberClick()"
            class="btn"
          /> -->
          <!-- <BlockBotttom
            :icon="addImg"
            text="添加记录"
            backgroundColor="#409EFF"
            @click="() => onAddRecordClick()"
            class="btn"
          /> -->
          <BlockBotttom
            v-if="!whetherDialysisHasBeenEnded"
            :icon="kaiShiImg"
            text="结束透析"
            backgroundColor="#E6A23C"
            @click="() => onEndClick()"
            class="btn"
          />
        </div>
      </div>
    </div>
    <div class="right-box"></div>
    <!-- 定时任务 -->
    <ScheduledTaskDialog ref="scheduledTaskDialogRef" />
    <!-- 结束透析组件 -->
    <EndDialysis ref="endDialysisRef" />
  </div>
</template>
<script lang="ts" setup name="UnderTreatment">
import { computed } from "vue";
import {
  computed,
  ref,
  onMounted,
  onBeforeUnmount,
  watch,
  defineAsyncComponent,
} from "vue";
import * as echarts from "echarts";
import dayjs from "dayjs";
// @ts-ignore
import Card from "../components/Card.vue";
// @ts-ignore
import ProgressBar from "../components/ProgressBar.vue";
import DoctorAdvice from "../components/DoctorAdvice/index.vue";
// @ts-ignore
import BlockBotttom from "../components/BlockBotttom.vue";
const ScheduledTaskDialog = defineAsyncComponent(
  () => import("../components/ScheduledTask.vue")
);
const EndDialysis = defineAsyncComponent(() => import("../components/EndDialysis/index.vue"));
import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen";
import {
  formatSubstituteMode,
  formatTestColr,
  getItemName,
  formatTestFlag,
  EMedStatus,
} from "@/store/type/bedsideAuxiliaryScreen.type";
import type {
  KtvItem,
  MonitoringRecord,
} from "@/store/type/bedsideAuxiliaryScreen.type";
import { formatDate, jgTime4, jgTime5 } from "@/utils/formatTime";
import zlmsImg from "@/img/zlms.png";
import dingShiImg from "@/img/dingshi2.png";
import jiaoHaoImg from "@/img/jiaoHao.png";
import kaiShiImg from "@/img/kaiShi.png";
import addImg from "@/img/add.png";
import txqImg from "@/img/txq.png";
import xinlvImg from "@/img/xinlv.png";
import xinLv2Img from "@/img/xinlv2.png";
import txztImg from "@/img/txzt.png";
import cljdImg from "@/img/cljd.png";
import sjjdImg from "@/img/sjjd.png";
import yizhuImg from "@/img/yizhu.png";
import { ElMessage } from "element-plus";
interface Props {
  height: number;
@@ -35,10 +391,435 @@
const bedsideAuxiliaryScreenStore = useBedsideAuxiliaryScreenStore();
const scheduledTaskDialogRef = ref<any>(null);
const endDialysisRef = ref<any>(null);
// ktv趋势图的
const ktvListEchartRef = ref<HTMLElement | null>(null);
// 血压脉搏趋势图的
const bloodPressureAndPulseEchartRef = ref<HTMLElement | null>(null);
const pageData = computed(() => {
  return Object.assign(bedsideAuxiliaryScreenStore.deviceData.underTreatment, {
    patientPhone: bedsideAuxiliaryScreenStore.deviceData.patientPhone,
  });
});
const treatmentStatusText = computed(() => {
  const status = +bedsideAuxiliaryScreenStore.deviceData.treatmentStatus;
  if (status === EMedStatus.NOT_CHECKED_IN) return "未签到";
  if (status === EMedStatus.SIGNED_IN) return "已签到";
  if (status === EMedStatus.DURING_DIALYSIS) return "透析中";
  if (status === EMedStatus.END) return "已结束";
  if (status === EMedStatus.CHECKED) return "已检查";
  if (status === EMedStatus.ARCHIVED) return "已归档";
  return "未知状态";
});
/** 是否已结束透析 */
const whetherDialysisHasBeenEnded = computed(() => {
  return (
    +bedsideAuxiliaryScreenStore.deviceData.treatmentStatus >= EMedStatus.END
  );
});
watch(
  () => pageData.value.ktvList,
  (newVal) => {
    generateKtvListEchart(newVal);
  },
  { deep: true }
);
watch(
  () => pageData.value.monitoringRecord,
  (newVal) => {
    generatBloodPressureAndPulseEchart(newVal);
  },
  { deep: true }
);
watch(
  () => props.height,
  () => {
    generateKtvListEchart(pageData.value.ktvList);
    generatBloodPressureAndPulseEchart(pageData.value.monitoringRecord);
  }
);
/** 生成ktv趋势图 */
const generateKtvListEchart = (ktvList: KtvItem[]) => {
  if (!ktvListEchartRef.value) return;
  // if (!ktvList || ktvList.length === 0) return;
  // 检查是否已经有实例
  let chart = echarts.getInstanceByDom(ktvListEchartRef.value);
  if (!chart) {
    chart = echarts.init(ktvListEchartRef.value);
  }
  const option = {
    grid: {
      top: 6,
      bottom: 20,
      right: 20,
    },
    xAxis: {
      type: "category",
      data: ktvList.map((item) => dayjs(item.时间).format("HH:mm")),
      axisLine: { show: true },
      axisTick: { show: true },
      splitLine: { show: false },
    },
    yAxis: {
      type: "value",
      axisLine: { show: true },
      axisTick: { show: true },
      splitLine: { show: false },
      splitNumber: 4,
    },
    series: [
      {
        data: ktvList.map((item) => item.ktv),
        type: "line",
        smooth: false,
        symbol: "circle",
        symbolSize: 6,
        lineStyle: {
          width: 2,
          color: "#70CAAE",
        },
        itemStyle: {
          color: (params: any) => getColor(params.value),
        },
      },
    ],
    tooltip: {
      trigger: "axis",
    },
  };
  chart.setOption(option, true); // 第二个参数为 true 表示全量更新
};
const getColor = (val: number) => {
  if (val < 1.2) return "#FE0201"; // 红色
  if (val <= 1.6) return "#70CAAE"; // 绿色
  return "#FE6500"; // 橙色
};
const formatMarkPoint = (
  name: string,
  value: number,
  yAxis: number,
  xAxis: number,
  symbolSize: number,
  symbolOffset: number[],
  color: string
) => {
  return {
    name,
    value,
    yAxis,
    xAxis,
    symbolSize,
    symbolOffset,
    label: { fontSize: 8, color },
  };
};
/** 生成血压脉搏趋势图 */
const generatBloodPressureAndPulseEchart = (
  bloodPressureAndPulses: MonitoringRecord[]
) => {
  if (!bloodPressureAndPulseEchartRef.value) return;
  let chart = echarts.getInstanceByDom(bloodPressureAndPulseEchartRef.value);
  if (!chart) {
    chart = echarts.init(bloodPressureAndPulseEchartRef.value);
  }
  const telescopicPressureDatas: number[] = []; // 伸缩压
  const diastolicPressureDatas: number[] = []; // 舒张压
  const pulseDatas: number[] = []; // 脉搏
  const xAxisData: number[] = []; // 横坐标
  const markPointTelescopicPressureDatas: any[] = []; // 伸缩压的markPoint
  const markPointDiastolicPressureDatas: any[] = []; // 舒张压的markPoint
  const markPointPulseDatas: any[] = []; // 脉搏的markPoint
  bloodPressureAndPulses.forEach((item, index) => {
    telescopicPressureDatas.push(+item.伸缩压);
    diastolicPressureDatas.push(+item.舒张压);
    pulseDatas.push(+item.脉搏);
    xAxisData.push(index);
    if (index === 0) {
      markPointTelescopicPressureDatas.push(
        formatMarkPoint(
          "伸缩压",
          +item.伸缩压,
          +item.伸缩压,
          0,
          0,
          [0, 10],
          "red"
        )
      );
      markPointDiastolicPressureDatas.push(
        formatMarkPoint(
          "舒张压",
          +item.舒张压,
          +item.舒张压,
          0,
          0,
          [15, 5],
          "#409EFF"
        )
      );
      markPointPulseDatas.push(
        formatMarkPoint(
          "脉搏",
          +item.脉搏,
          +item.脉搏,
          0,
          0,
          [10, -15],
          "#D940FF"
        )
      );
    } else if (
      bloodPressureAndPulses.length > 1 &&
      index === bloodPressureAndPulses.length - 1
    ) {
      markPointTelescopicPressureDatas.push(
        formatMarkPoint(
          "伸缩压",
          +item.伸缩压,
          +item.伸缩压,
          index,
          0,
          [-15, -20],
          "red"
        )
      );
      markPointDiastolicPressureDatas.push(
        formatMarkPoint(
          "舒张压",
          +item.舒张压,
          +item.舒张压,
          index,
          0,
          [-15, 0],
          "#409EFF"
        )
      );
      markPointPulseDatas.push(
        formatMarkPoint(
          "脉搏",
          +item.脉搏,
          +item.脉搏,
          index,
          0,
          [0, 0],
          "#D940FF"
        )
      );
    }
  });
  if (bloodPressureAndPulses.length === 1) {
    xAxisData.push(1);
  }
  const option = {
    backgroundColor: "#ffffff",
    tooltip: {
      trigger: "axis",
    },
    toolbox: {
      show: false,
    },
    grid: {
      left: 20,
      top: 0,
      bottom: 0,
    },
    xAxis: {
      type: "category",
      // 标记做右往左排列
      boundaryGap: false,
      data: xAxisData,
      axisTick: {
        show: true, // 显示 X 轴刻度
      },
    },
    yAxis: {
      show: false,
      name: "",
      type: "value",
      min: 40,
      max: 220,
      interval: 10, // 指定刻度间隔,
      splitLine: {
        show: false,
      },
    },
    series: [
      {
        name: "伸缩压",
        type: "line",
        symbol: "triangle",
        symbolSize: 6,
        symbolRotate: 180,
        data: telescopicPressureDatas,
        lineStyle: {
          width: 2, // 设置线条宽度为5
          color: "red",
        },
        itemStyle: {
          borderWidth: 2,
          borderColor: "red",
          color: "red",
        },
        markPoint: {
          data: markPointTelescopicPressureDatas,
        },
        markLine: {
          symbol: "none",
          lineStyle: { color: "#409EFF", width: 2 },
          data: [
            { name: "y90", yAxis: 90, label: { show: false }, symbol: "none" },
          ],
        },
      },
      {
        name: "舒张压",
        type: "line",
        symbol: "triangle",
        symbolSize: 6,
        data: diastolicPressureDatas,
        lineStyle: {
          color: "#409EFF",
          width: 2, // 设置线条宽度为5
        },
        itemStyle: {
          borderWidth: 2,
          borderColor: "#409EFF",
          color: "#409EFF",
        },
        markPoint: {
          data: markPointDiastolicPressureDatas,
        },
        markLine: {
          symbol: "none",
          lineStyle: { color: "#F56C6C", width: 2 },
          data: [
            {
              name: "y140",
              yAxis: 140,
              label: { show: false },
              symbol: "none",
            },
          ],
        },
      },
      {
        name: "脉搏",
        type: "line",
        symbolSize: 6,
        data: pulseDatas,
        lineStyle: {
          color: "#D940FF",
          width: 2, // 设置线条宽度为5
        },
        itemStyle: {
          borderWidth: 2,
          borderColor: "#D940FF",
          color: "#D940FF",
        },
        markPoint: {
          data: markPointPulseDatas,
        },
      },
    ],
  };
  chart.setOption(option);
};
// 给首尾点加上 label
const wrapData = (arr: number[]) => {
  return arr.map((v, i) => ({
    value: v,
    label: {
      show: i === 0 || i === arr.length - 1,
      position: "top",
      fontSize: 12,
    },
  }));
};
/** 定时任务 */
const onScheduledTasksClick = () => {
  if (
    !bedsideAuxiliaryScreenStore.deviceCode ||
    !bedsideAuxiliaryScreenStore.deviceData.deviceCode
  )
    return ElMessage.warning("未初始化或正在进行初始化操作中");
  scheduledTaskDialogRef.value?.openDialog();
};
/** 叫号 */
const onCallBumberClick = () => {
  ElMessage({
    message: "功能开发中,敬请期待!",
    type: "warning",
  });
};
/** 添加记录 */
const onAddRecordClick = () => {
  ElMessage({
    message: "功能开发中,敬请期待!",
    type: "warning",
  });
};
/** 结束透析 */
const onEndClick = () => {
  if (
    !bedsideAuxiliaryScreenStore.deviceCode ||
    !bedsideAuxiliaryScreenStore.deviceData.deviceCode
  )
    return ElMessage.warning("未初始化或正在进行初始化操作中");
  if (!bedsideAuxiliaryScreenStore.userInfo?.token)
    return ElMessage.warning("请登录");
  endDialysisRef.value?.openDialog();
};
onMounted(() => {
  // 生成ktv趋势图
  generateKtvListEchart(pageData.value.ktvList);
  generatBloodPressureAndPulseEchart(pageData.value.monitoringRecord);
});
onBeforeUnmount(() => {
  // 销毁图表实例
  if (ktvListEchartRef.value) {
    const chart = echarts.getInstanceByDom(ktvListEchartRef.value);
    if (chart) {
      chart.dispose();
    }
  }
  if (bloodPressureAndPulseEchartRef.value) {
    const chart = echarts.getInstanceByDom(
      bloodPressureAndPulseEchartRef.value
    );
    if (chart) {
      chart.dispose();
    }
  }
});
</script>
@@ -55,48 +836,294 @@
  padding-bottom: 2px;
  overflow: hidden;
  .left-box {
    flex: 0 0 58.25%;
    height: calc(100% - 12px);
    width: 58.25%;
    height: 100%;
    display: flex;
    align-items: flex-start;
    flex-direction: column;
    gap: 4px;
    div {
      width: 100%;
    }
    .left-row1 {
      flex: 0 0 41.99%;
      // width: calc(100% - 8px);
      gap: 4px;
      width: 100%;
      height: 38.97%;
      display: flex;
      background: blue;
      gap: 4px;
      .left-row1-col1,
      .left-row1-col2,
      .left-row1-col3 {
        height: 100%;
      }
      .left-row1-col1 {
        flex: 0 0 26.94%;
        width: 26.94%;
        border-radius: 2px;
        overflow: hidden;
      }
      .left-row1-col2 {
        flex: 0 0 26.42%;
        width: 26.43%;
        display: flex;
        flex-direction: column;
        gap: 4px;
        .left-row1-col2-row1 {
          height: 36.62%;
        }
        .left-row1-col2-item-row2 {
          height: 63.38%;
        }
      }
      .left-row1-col3 {
        flex: 0 0 46.63%;
        width: 46.63%;
        display: flex;
        flex-direction: column;
        gap: 4px;
        .left-row1-col3-row1 {
          height: 36.62%;
        }
        .left-row1-col3-row2 {
          height: 63.38%;
          .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;
            }
          }
        }
      }
    }
    .left-row2 {
      flex: 0 0 22.65%;
      background: yellow;
      width: 100%;
      height: 21.03%;
      display: flex;
      gap: 4px;
      .left-row2-col1 {
        width: 26.94%;
      }
      .left-row2-col2 {
        width: 26.43%;
      }
      .left-row2-col3 {
        width: 46.62%;
      }
    }
    .left-row3 {
      flex: 0 0 22.65%;
      background: orange;
      width: 100%;
      height: 21.03%;
      display: flex;
      gap: 4px;
      .left-row3-col1 {
        width: 26.94%;
      }
      .left-row3-col2 {
        width: 26.43%;
      }
      .left-row3-col3 {
        width: 46.62%;
      }
    }
    .left-row4 {
      flex: 0 0 12.71%;
      background: purple;
      width: 100%;
      height: 11.79%;
      display: flex;
      gap: 4px;
      .left-row4-col {
        width: 50%;
      }
    }
  }
  .right-box {
    flex: 0 0 41.75%;
    width: 41.75%;
    height: 100%;
    background: green;
    display: flex;
    flex-direction: column;
    gap: 4px;
    .right-box-row1,
    .right-box-row2,
    .right-box-row3 .right-box-row4 {
      width: 100%;
    }
    .right-box-row1 {
      height: 14.44%;
      display: flex;
      gap: 4px;
      .right-box-row1-col1 {
        width: 36.17%;
      }
      .right-box-row1-col2 {
        width: 63.83%;
      }
    }
    .right-box-row2 {
      height: 25%;
      display: flex;
      gap: 4px;
      .right-box-row2-item {
        width: 50%;
      }
    }
    .right-box-row3 {
      height: 47.78%;
    }
    .right-box-row4 {
      height: 12.78%;
      background: #ffffff;
      border-radius: 2px;
      display: flex;
      align-items: center;
      justify-content: flex-end;
      padding-right: 13px;
      .btn {
        margin-left: 9px;
      }
    }
  }
  .progress-box {
    display: flex;
    align-items: center;
    flex-direction: column;
    .item-num {
      margin-bottom: 4px;
      font-family: PingFangSC, PingFang SC;
      font-weight: 600;
      font-size: 8px;
      color: #333333;
      text-align: left;
      font-style: normal;
    }
  }
  .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;
      display: flex;
      align-items: center;
      // align-items: baseline;
      .dialysis-mode-content-box {
        display: flex;
        align-items: flex-end;
        line-height: 1;
        .mini-text {
          margin-right: 1px;
          font-size: 5px;
          color: #c9a589;
        }
      }
    }
    &.treatment-status {
      color: #70a3dd;
    }
    &.prescription-ehydration-olume {
      color: #8079cb;
    }
    &.current-lood0emperature {
      color: #70a3dd;
      font-size: 9px;
    }
    &.venous-pressure {
      color: #70a3dd;
      font-size: 9px;
    }
  }
  .prescription-remarks {
    font-family: PingFangSC, PingFang SC;
    font-weight: 500;
    font-size: 5px;
    color: #d58e56;
    line-height: 7px;
    text-align: left;
    font-style: normal;
  }
  .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;
      }
    }
  }
  // card header class
  .mini-card {
    padding: 2px;
  }
  .ktv-card {
    overflow: visible;
    .card-header {
      margin-bottom: 0px;
    }
    ::v-deep(.card-main) {
      overflow: visible !important;
      div {
        overflow: visible;
      }
    }
  }
  :deep(.mini-header) {
    flex: 0 0 4px;
    .card-icon {
      width: 4px;
      height: 4px;
    }
    .card-title {
      font-size: 4px;
    }
  }
  :deep(.big-header) {
    flex: 0 0 9px;
    .card-icon {
      width: 9px;
      height: 9px;
    }
    .card-title {
      font-size: 5px;
    }
  }
}
</style>