From 2a122106c080eb0a8b0ec82903e785087c6d3b49 Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期一, 04 八月 2025 16:40:15 +0800
Subject: [PATCH] ID1918-患者姓名根据配置脱敏

---
 package-lock.json                                             |   72 ++++++++++++++++++++++++++++++++++++
 src/utils/utils.ts                                            |   21 ++++++++++
 src/views/mobile/bedsideAuxiliaryScreen/components/Header.vue |    4 +
 package.json                                                  |    1 
 4 files changed, 97 insertions(+), 1 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index da5de25..0ad23e7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
         "element-plus": "^2.9.2",
         "event-source-polyfill": "^1.0.31",
         "pinia": "^3.0.3",
+        "pinyin": "^4.0.0",
         "qs": "^6.14.0",
         "speak-tts": "^2.0.8",
         "vant": "^3.4.3",
@@ -1821,6 +1822,12 @@
       "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
       "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
       "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/keypress": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz",
+      "integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==",
       "license": "MIT"
     },
     "node_modules/less": {
@@ -4773,6 +4780,48 @@
         "@vue/devtools-kit": "^7.7.7"
       }
     },
+    "node_modules/pinyin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/pinyin/-/pinyin-4.0.0.tgz",
+      "integrity": "sha512-vHpV5K+vpp6XUUpZNGRDuHoN+1xcmieM3EWlH4QjSX2kkpG/gVOwpqwV9EOJ9x9c9UERFKeLml5XVSukE/PLgQ==",
+      "license": "MIT",
+      "dependencies": {
+        "commander": "~1.1.1"
+      },
+      "bin": {
+        "pinyin": "bin/pinyin"
+      },
+      "engines": {
+        "install-node": "^18.0.0"
+      },
+      "peerDependencies": {
+        "@node-rs/jieba": "^1.6.0",
+        "nodejieba": "^3.4.4",
+        "segmentit": "^2.0.3"
+      },
+      "peerDependenciesMeta": {
+        "@node-rs/jieba": {
+          "optional": true
+        },
+        "nodejieba": {
+          "optional": true
+        },
+        "segmentit": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pinyin/node_modules/commander": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz",
+      "integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==",
+      "dependencies": {
+        "keypress": "0.1.x"
+      },
+      "engines": {
+        "node": ">= 0.6.x"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.49",
       "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
@@ -6401,6 +6450,11 @@
       "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
       "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
       "dev": true
+    },
+    "keypress": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz",
+      "integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA=="
     },
     "less": {
       "version": "4.2.1",
@@ -8355,6 +8409,24 @@
         }
       }
     },
+    "pinyin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/pinyin/-/pinyin-4.0.0.tgz",
+      "integrity": "sha512-vHpV5K+vpp6XUUpZNGRDuHoN+1xcmieM3EWlH4QjSX2kkpG/gVOwpqwV9EOJ9x9c9UERFKeLml5XVSukE/PLgQ==",
+      "requires": {
+        "commander": "~1.1.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz",
+          "integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==",
+          "requires": {
+            "keypress": "0.1.x"
+          }
+        }
+      }
+    },
     "postcss": {
       "version": "8.4.49",
       "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
diff --git a/package.json b/package.json
index a432161..1c21545 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
     "element-plus": "^2.9.2",
     "event-source-polyfill": "^1.0.31",
     "pinia": "^3.0.3",
+    "pinyin": "^4.0.0",
     "qs": "^6.14.0",
     "speak-tts": "^2.0.8",
     "vant": "^3.4.3",
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index deeee91..d419c94 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -1,3 +1,5 @@
+import pinyin from 'pinyin';
+
 /**
  * 计算某个类名元素的可用高度(视口高度 - 元素顶部距离)
  * @param className 元素类名(不带.)
@@ -49,3 +51,22 @@
   }
   return result;
 }
+
+/**
+ * 姓名脱敏:第二个字变成首字母大写
+ * @param name 患者姓名
+ * @returns 脱敏后的姓名
+ */
+export function maskName(name: string): string {
+  if (!name) return ''
+
+  const chars = Array.from(name)
+  if (chars.length < 2) return name
+
+  const secondChar = chars[1]
+  const [pinyinArr] = pinyin(secondChar, { style: pinyin.STYLE_FIRST_LETTER })
+  const masked = pinyinArr[0]?.toUpperCase?.() || '*'
+
+  chars[1] = masked
+  return chars.join('')
+}
\ No newline at end of file
diff --git a/src/views/mobile/bedsideAuxiliaryScreen/components/Header.vue b/src/views/mobile/bedsideAuxiliaryScreen/components/Header.vue
index 4df3652..da82b86 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/components/Header.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/components/Header.vue
@@ -101,6 +101,7 @@
 import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen";
 import { EPatForm, EPageType } from "@/store/type/bedsideAuxiliaryScreen.type";
 import { ElMessage } from "element-plus";
+import { maskName } from '@/utils/utils';
 
 const bedsideAuxiliaryScreenStore = useBedsideAuxiliaryScreenStore();
 
@@ -118,9 +119,10 @@
   return bedsideAuxiliaryScreenStore.deviceData.pageType;
 });
 
+
 const patientInfo = computed(() => {
   return {
-    patientName: bedsideAuxiliaryScreenStore.deviceData.patientName,
+    patientName: bedsideAuxiliaryScreenStore.deviceData.customConfiguration.患者信息是否加密显示 === 1 ? maskName(bedsideAuxiliaryScreenStore.deviceData.patientName) :  bedsideAuxiliaryScreenStore.deviceData.patientName,
     patientPhone: bedsideAuxiliaryScreenStore.deviceData.patientPhone,
     age: bedsideAuxiliaryScreenStore.deviceData.age,
     gender: bedsideAuxiliaryScreenStore.deviceData.gender,

--
Gitblit v1.8.0