From 86850a45ed466f32b3336940c7ed8f4dea700a93 Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期四, 24 七月 2025 16:02:09 +0800
Subject: [PATCH] ID1625-治疗中页面暂存
---
package-lock.json | 5
src/store/type/bedsideAuxiliaryScreen.type.ts | 18 ++-
package.json | 1
src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue | 240 ++++++++++++++++++++++++++++++++++++++++++++---
4 files changed, 238 insertions(+), 26 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5383b81..da5de25 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
"@vant/icons": "^3.0.2",
"@zxing/library": "^0.21.3",
"axios": "^1.9.0",
+ "dayjs": "^1.11.13",
"echarts": "^5.6.0",
"element-plus": "^2.9.2",
"event-source-polyfill": "^1.0.31",
@@ -1412,7 +1413,7 @@
},
"node_modules/dayjs": {
"version": "1.11.13",
- "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
@@ -6127,7 +6128,7 @@
},
"dayjs": {
"version": "1.11.13",
- "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
},
"de-indent": {
diff --git a/package.json b/package.json
index 9eab2a0..a432161 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
"@vant/icons": "^3.0.2",
"@zxing/library": "^0.21.3",
"axios": "^1.9.0",
+ "dayjs": "^1.11.13",
"echarts": "^5.6.0",
"element-plus": "^2.9.2",
"event-source-polyfill": "^1.0.31",
diff --git a/src/store/type/bedsideAuxiliaryScreen.type.ts b/src/store/type/bedsideAuxiliaryScreen.type.ts
index 13631fa..14fabbc 100644
--- a/src/store/type/bedsideAuxiliaryScreen.type.ts
+++ b/src/store/type/bedsideAuxiliaryScreen.type.ts
@@ -309,7 +309,9 @@
maximumDehydrationDuration: string; // 最大脱水量那天的时长
prescriptionRemarks: string; // 透析处方备注
abnormalItems: AnomalyIndex[]; // 异常指标列表
- prescriptionDialysisDuration: string; // 透析处方的时长(单位:小时)
+ prescriptionDialysisDurationHour: string; // 透析处方的时长(小时部分)
+ prescriptionDialysisDurationMin: string; // 透析处方的时长(分钟部分)
+ prescriptionDialysisDuration: number | null; // 透析处方的时长(单位:小时)
dialysisStartTime: number | null; // 透析开始时间(时间戳)
dialysisEndTime: number | null; // 透析结束时间(时间戳)
dialysisDuration: number | null; // 已透析时长(单位:分钟)
@@ -328,7 +330,7 @@
ktvList: KtvItem[]; // 实时ktv计算结果列表
}
-interface MonitoringRecord {
+export interface MonitoringRecord {
伸缩压: string; // 血压伸缩压
舒张压: string; // 血压舒张压
脉搏: string; // 脉搏
@@ -345,7 +347,8 @@
maximumDehydrationDuration: "",
prescriptionRemarks: "",
abnormalItems: [],
- prescriptionDialysisDuration: "",
+ prescriptionDialysisDurationHour: "",
+ prescriptionDialysisDurationMin: "",
dialysisStartTime: null,
dialysisEndTime: null,
dialysisDuration: null,
@@ -362,6 +365,7 @@
bloodVolumeMonitoring: null,
dialysisFluidFlowRate: null,
ktvList: [],
+ prescriptionDialysisDuration: null, // 透析处方的时长(单位:小时)
};
};
@@ -475,15 +479,19 @@
underTreatment.prescriptionRemarks = seeMsg.透析状态?.透析处方备注 ?? "";
underTreatment.abnormalItems = seeMsg.透析状态?.异常检验指标 ?? [];
underTreatment.prescriptionDialysisDuration =
+ seeMsg.透析状态?.透析处方的时长 ?? null;
+ underTreatment.prescriptionDialysisDurationHour =
seeMsg.透析状态?.透析处方的时长_小时 ?? "";
+ underTreatment.prescriptionDialysisDurationMin =
+ seeMsg.透析状态?.透析处方的时长_分钟 ?? "";
underTreatment.dialysisStartTime =
seeMsg.透析状态?.透析开始时间 ?? null;
underTreatment.dialysisEndTime = seeMsg.透析状态?.透析结束时间 ?? null;
underTreatment.dialysisDuration = seeMsg.透析状态?.iot_透析时间 ?? null;
underTreatment.prescriptionDehydrationVolume =
- seeMsg.透析状态?.处方脱水量 ?? null;
+ seeMsg.透析状态?.iot_脱水目标量 ?? null;
underTreatment.currentDehydrationVolume =
- seeMsg.透析状态?.实时脱水量 ?? null;
+ seeMsg.透析状态?.iot_当前脱水量 ?? null;
underTreatment.currentUltrafiltrationRate =
seeMsg.透析状态?.iot_脱水速率 ?? null;
underTreatment.currentBloodTemperature =
diff --git a/src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue b/src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue
index b584ed6..57cde83 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/pages/UnderTreatment.vue
@@ -105,10 +105,15 @@
title="血压脉搏趋势图"
:icon="xinLv2Img"
background-color="#ffffff"
- class="mini-card left-row2-col3"
+ class="mini-card ktv-card left-row2-col3"
header-class-name="mini-header"
>
- <div class=""></div>
+ <div style="height: 100%">
+ <div
+ ref="bloodPressureAndPulseEchartRef"
+ style="width: 100%; height: 100%"
+ ></div>
+ </div>
</Card>
</div>
<div class="left-row3">
@@ -225,8 +230,22 @@
class="mini-card right-box-row2-item"
header-class-name="mini-header"
>
- <div class="item-box">
- <div class="item-num"></div>
+ <div class="progress-box">
+ <div class="item-num">
+ {{ jgTime4(pageData.dialysisDuration) }}/{{
+ pageData.prescriptionDialysisDuration
+ }}:{{ pageData.prescriptionDialysisDurationMin }}
+ </div>
+ <ProgressBar
+ :percent="
+ (Number(pageData.dialysisDuration) /
+ (Number(pageData.prescriptionDialysisDuration) * 60)) *
+ 100
+ "
+ color="#70A3DD"
+ backgroundColor="#D6DEF1"
+ borderRadius="50%"
+ />
</div>
</Card>
<Card
@@ -245,7 +264,7 @@
<ProgressBar
:percent="
(pageData.currentDehydrationVolume /
- pageData.currentDehydrationVolume) *
+ pageData.prescriptionDehydrationVolume) *
100
"
color="#70CAAE"
@@ -302,6 +321,8 @@
<script lang="ts" setup name="UnderTreatment">
import { computed, ref, onMounted, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
+import dayjs from "dayjs";
+
// @ts-ignore
import Card from "../components/Card.vue";
// @ts-ignore
@@ -317,8 +338,11 @@
formatTestFlag,
EMedStatus,
} from "@/store/type/bedsideAuxiliaryScreen.type";
-import type { KtvItem } from "@/store/type/bedsideAuxiliaryScreen.type";
-import { formatDate } from "@/utils/formatTime";
+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";
@@ -341,6 +365,8 @@
// ktv趋势图的
const ktvListEchartRef = ref<HTMLElement | null>(null);
+// 血压脉搏趋势图的
+const bloodPressureAndPulseEchartRef = ref<HTMLElement | null>(null);
const pageData = computed(() => {
return Object.assign(bedsideAuxiliaryScreenStore.deviceData.underTreatment, {
@@ -349,7 +375,7 @@
});
const treatmentStatusText = computed(() => {
- const status = bedsideAuxiliaryScreenStore.deviceData.treatmentStatus;
+ const status = +bedsideAuxiliaryScreenStore.deviceData.treatmentStatus;
if (status === EMedStatus.NOT_CHECKED_IN) return "未签到";
if (status === EMedStatus.SIGNED_IN) return "已签到";
if (status === EMedStatus.DURING_DIALYSIS) return "透析中";
@@ -364,7 +390,7 @@
/** 生成ktv趋势图 */
const generateKtvListEchart = (ktvList: KtvItem[]) => {
if (!ktvListEchartRef.value) return;
- if (!ktvList || ktvList.length === 0) return;
+ // if (!ktvList || ktvList.length === 0) return;
// 检查是否已经有实例
let chart = echarts.getInstanceByDom(ktvListEchartRef.value);
@@ -373,25 +399,25 @@
}
const option = {
+ grid: {
+ top: 6,
+ bottom: 20,
+ right: 20,
+ },
xAxis: {
type: "category",
- data: ktvList.map((item) => formatDate(new Date(item.时间), "HH:mm")),
+ data: ktvList.map((item) => dayjs(item.时间).format("HH:mm")),
axisLine: { show: true },
axisTick: { show: true },
- // axisLabel: {
- // margin: 5, // 控制文字与轴的距离,尽量小
- // fontSize: 12,
- // },
+ splitLine: { show: false },
},
yAxis: {
type: "value",
axisLine: { show: true },
axisTick: { show: true },
- // axisLabel: {
- // margin: 5,
- // fontSize: 12,
- // },
- splitLine: { show: true },
+ splitLine: { show: false },
+
+ splitNumber: 4,
},
series: [
{
@@ -417,6 +443,166 @@
chart.setOption(option, true); // 第二个参数为 true 表示全量更新
};
+/** 生成血压脉搏趋势图 */
+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: string[] = []; // 横坐标
+
+ bloodPressureAndPulses.forEach((item, index) => {
+ telescopicPressureDatas.push(+item.伸缩压);
+ diastolicPressureDatas.push(+item.舒张压);
+ pulseDatas.push(+item.脉搏);
+ xAxisData.push(String(index + 1));
+ });
+
+ const option = {
+ grid: [
+ { top: "20%", height: "27%", left: 30, right: 20 }, // 伸缩压
+ { top: "45%", height: "27%", left: 30, right: 20 }, // 舒张压
+ { top: "67%", height: "27%", left: 30, right: 20 }, // 脉搏
+ ],
+ tooltip: {
+ trigger: "axis",
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: xAxisData,
+ boundaryGap: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: false },
+ splitLine: { show: false },
+ gridIndex: 0,
+ },
+ {
+ type: "category",
+ data: xAxisData,
+ boundaryGap: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: false },
+ splitLine: { show: false },
+ gridIndex: 1,
+ },
+ {
+ type: "category",
+ data: xAxisData,
+ boundaryGap: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: true }, // 最下面一层显示时间轴
+ splitLine: { show: false },
+ gridIndex: 2,
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ show: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: false },
+ splitLine: { show: false },
+ min: 80,
+ max: 180,
+ interval: 20,
+ gridIndex: 0,
+ },
+ {
+ type: "value",
+ show: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: false },
+ splitLine: { show: false },
+ min: 40,
+ max: 120,
+ interval: 20,
+ gridIndex: 1,
+ },
+ {
+ type: "value",
+ show: false,
+ axisLine: { show: false },
+ axisTick: { show: false },
+ axisLabel: { show: false },
+ splitLine: { show: false },
+ min: 40,
+ max: 140,
+ interval: 20,
+ gridIndex: 2,
+ },
+ ],
+ series: [
+ {
+ name: "伸缩压",
+ xAxisIndex: 0,
+ yAxisIndex: 0,
+ data: wrapData(telescopicPressureDatas),
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 6,
+ lineStyle: { width: 2, color: "#FE0201" },
+ itemStyle: { color: "#FE0201" },
+ label: { color: "#FE0201" },
+ },
+ {
+ name: "舒张压",
+ xAxisIndex: 1,
+ yAxisIndex: 1,
+ data: wrapData(diastolicPressureDatas),
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 6,
+ lineStyle: { width: 2, color: "#70A3DD" },
+ itemStyle: { color: "#70A3DD" },
+ label: { color: "#70A3DD" },
+ },
+ {
+ name: "脉搏",
+ xAxisIndex: 2,
+ yAxisIndex: 2,
+ data: wrapData(pulseDatas),
+ type: "line",
+ smooth: false,
+ symbol: "circle",
+ symbolSize: 6,
+ lineStyle: { width: 2, color: "#8079CB" },
+ itemStyle: { color: "#8079CB" },
+ label: { color: "#8079CB" },
+ },
+ ],
+ };
+
+ 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 = () => {};
@@ -432,12 +618,21 @@
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();
}
@@ -716,9 +911,16 @@
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;
--
Gitblit v1.8.0