From 09dc74e264b6262cbe41c9c8476e24705871d4a6 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期日, 08 十一月 2026 23:31:17 +0800
Subject: [PATCH] yxh

---
 src/components/DoctorPageLayout/src/DoctorPageLayout.vue |  166 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 153 insertions(+), 13 deletions(-)

diff --git a/src/components/DoctorPageLayout/src/DoctorPageLayout.vue b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
index 51091de..f1f54c2 100644
--- a/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
+++ b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
@@ -38,7 +38,7 @@
     footer   搴曢儴鍔熻兘鎸夐挳锛堝彲閫夛紱鍥哄畾鍦ㄩ〉闈㈠簳閮級
 -->
 <script setup lang="ts">
-import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
+import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
 import BedSwitchSelect from '@/views/ecg/doctor/components/BedSwitchSelect.vue'
 import { useRoomStore } from '@/store/modules/room'
 
@@ -47,6 +47,47 @@
 /* ==================== 涓�/鍥磋锛堝彧璇绘ā寮忥級 ==================== */
 
 const roomStore = useRoomStore()
+
+/* ==================== 鏄剧ず瀵嗗害锛堝垎杈ㄧ巼閫傞厤锛� ==================== */
+
+/**
+ * 銆愪负浠�涔堟槸"瀵嗗害"鑰屼笉鏄�"鏁翠綋缂╂斁"銆�
+ * 鏇捐�冭檻鐢� `document.body.style.zoom = 0.9` 鍋氭暣浣撶缉鏀撅紝**瀹炴祴涓嶅彲琛�**锛�
+ *   鈶� CSS zoom **涓嶄細鏀瑰彉濯掍綋鏌ヨ**锛坺oom:1.25 鏃� innerWidth 浠嶆槸 1342銆�
+ *      `(min-width:1200px)` 浠嶅懡涓級鈬� 鏍呮牸涓嶄細闅忎箣闄嶇骇锛�"缂╁皬"鍙嶈�岃瀛楁鏇存尋锛�
+ *   鈶� CSS zoom 浼氳 Element Plus 鐨勪笅鎷�/寮圭獥瀹氫綅閿欎綅 鈥斺�� 瀹冧滑闈�
+ *      getBoundingClientRect + translate 璁$畻浣嶇疆锛宺ect 宸插惈缂╂斁鍊嶇巼锛�
+ *      鍐欏洖鐨� px 鍙堝湪缂╂斁鍧愭爣绯婚噷锛岀瓑浜庤鏀惧ぇ涓ゆ銆�
+ *
+ * 鎵�浠ユ敼涓�**鍙帇缂╅棿璺�**锛堢函 CSS锛岄浂瀹氫綅椋庨櫓锛夛細琛ㄥ崟琛岃窛銆佽〃鏍煎崟鍏冩牸鍐呰竟璺濄��
+ * 搴曟爮鍐呰竟璺濄�傜煯灞忚兘澶氭樉绀哄嚑琛岃褰曪紝瑙嗚涓婄瓑鏁堜簬"缂╂斁"锛屼絾涓嶇牬鍧忎换浣曞脊灞傘��
+ *
+ * 鐪熉锋暣浣撶缉鏀捐鐢�**娴忚鍣ㄨ嚜甯︾缉鏀�**锛圕trl + / Ctrl - / Ctrl 0锛夛細
+ * 鏍呮牸宸插仛鍝嶅簲寮忥紝娴忚鍣ㄧ缉鏀句細鏀瑰彉 innerWidth锛屼粠鑰岃嚜鍔ㄥ湪 4/2/1 鍒椾箣闂村垏鎹€��
+ */
+const DENSITY_KEY = 'ecg.doctor.density'
+type Density = 'normal' | 'compact'
+const density = ref<Density>('normal')
+const isCompact = computed(() => density.value === 'compact')
+
+const loadDensity = () => {
+  try {
+    const v = localStorage.getItem(DENSITY_KEY)
+    if (v === 'compact' || v === 'normal') density.value = v
+  } catch {
+    /* 闅愮妯″紡/绂佺敤瀛樺偍鏃跺拷鐣� */
+  }
+}
+// 璁颁綇閫夋嫨锛堢敤 watch 鑰屼笉鏄� el-select 鐨� @change锛氶伩鍏� EP 鍥炶皟鍙傛暟绫诲瀷涓庤仈鍚堢被鍨嬩笉鍖归厤锛�
+watch(density, (v) => {
+  try {
+    localStorage.setItem(DENSITY_KEY, v)
+  } catch {
+    /* 闅愮妯″紡/绂佺敤瀛樺偍鏃跺拷鐣� */
+  }
+})
+// 鍦� setup 闃舵灏辫鍙栵紝閬垮厤棣栧抚浠�"鏍囧噯"璺冲埌"绱у噾"鐨勯棯鍔�
+loadDensity()
 
 /**
  * 鏄惁鏄剧ず椤堕儴鎻愮ず鏉°��
@@ -94,11 +135,33 @@
   }
 )
 
-/** 榛樿瀹藉害锛坧x锛夛細鐢� asideWidth 瑙f瀽鑰屾潵锛岀敤浣滃垵濮嬪�间笌"鍙屽嚮澶嶄綅"鍊� */
-const defaultAsidePx = (() => {
+/**
+ * 銆岄粯璁ゃ�嶅彸鏍忓搴︼紙px锛夛細**鎸夌獥鍙e搴﹁嚜閫傚簲**銆�
+ *
+ * 鑳屾櫙锛氬師鏉ュ浐瀹� 400px銆傚尰鐢熺數鑴戝垎杈ㄧ巼宸紓澶э紙1920 / 1366 / 1024锛屼笖甯稿甫 125% 缂╂斁锛夛紝
+ * 绐勫睆涓婂彸鏍忓悆鎺� 400px 鍚庯紝宸︿晶鎮h�呬俊鎭紙4 鍒楁爡鏍硷紝姣忓垪瑕� 100px 鏍囩锛夊彧鍓╁嚑鐧惧儚绱狅紝
+ * 瀛楁琚帇鎴愪竴鏉$紳 鈥斺�� 鐜板満琛ㄧ幇涓�"閮ㄥ垎鍐呭鐪嬩笉鍒�"銆�
+ *
+ * 瑙勫垯锛歚min(閰嶇疆鍊�, 绐楀彛瀹� 脳 28%)`锛屼笖涓嶄綆浜� minAsideWidth銆�
+ *   1920 鈫� 400锛堜笌鍘熸潵涓�鑷达紝瀹藉睆鏃犲彉鍖栵級
+ *   1600 鈫� 400
+ *   1366 鈫� 382
+ *   1280 鈫� 358
+ *   1024 鈫� 287
+ */
+const calcDefaultAsidePx = () => {
   const n = parseInt(props.asideWidth, 10)
-  return Number.isFinite(n) && n > 0 ? n : 400
-})()
+  const base = Number.isFinite(n) && n > 0 ? n : 400
+  const vw = typeof window !== 'undefined' ? window.innerWidth : 1920
+  return Math.max(props.minAsideWidth, Math.min(base, Math.round(vw * 0.28)))
+}
+
+/**
+ * 鍖荤敓鏄惁**鎵嬪姩**璋冭繃瀹藉害锛堟嫋杩囧垎鐣岀嚎 / 鐢ㄩ敭鐩樿皟杩� / 鏈夎蹇嗗�硷級銆�
+ * 鎵嬪姩璋冭繃 鈫� 灏婇噸浠栫殑閫夋嫨锛岀獥鍙e彉鍖栨椂鍙仛"澶圭揣"锛�
+ * 娌¤皟杩� 鈫� 璺熼殢绐楀彛鑷�傚簲锛堟崲鍒板皬灞忚嚜鍔ㄦ敹绐勶級銆�
+ */
+const asideUserSet = ref(false)
 
 /**
  * 銆愬叧閿�戜笉渚濊禆 CSS `height: 100%` 鐨勮В鏋愶紝鏀逛负**瀹炴祴鐖跺鍣ㄥ彲鐢ㄩ珮搴�**銆�
@@ -125,8 +188,8 @@
 /** 涓讳綋琛屽鍣細鎷栧姩鏃剁敤瀹冪畻"鍙充晶鏍忔渶澶氳兘鏈夊瀹�" */
 const bodyRef = ref<HTMLElement>()
 
-/** 鍙充晶鏍忓綋鍓嶅搴︼紙px锛� */
-const asidePx = ref<number>(defaultAsidePx)
+/** 鍙充晶鏍忓綋鍓嶅搴︼紙px锛夛細鍒濆鍊间篃璧拌嚜閫傚簲锛岀獎灞忎笉浼氫竴涓婃潵灏卞崰鎺� 400px */
+const asidePx = ref<number>(calcDefaultAsidePx())
 
 /** 鏄惁姝e湪鎷栧姩锛堢敤浜庢崲鍏夋爣銆佺閫変腑锛� */
 const dragging = ref(false)
@@ -149,6 +212,7 @@
 
 /** 璁颁綇鎷栧姩缁撴灉锛堥殣绉佹ā寮�/绂佺敤瀛樺偍鏃堕潤榛樺拷鐣ワ級 */
 const saveAsidePx = () => {
+  asideUserSet.value = true
   if (!props.storageKey) return
   try {
     localStorage.setItem(props.storageKey, String(asidePx.value))
@@ -162,15 +226,19 @@
   if (!props.storageKey) return
   try {
     const v = parseInt(localStorage.getItem(props.storageKey) || '', 10)
-    if (Number.isFinite(v) && v > 0) asidePx.value = clampAsidePx(v)
+    if (Number.isFinite(v) && v > 0) {
+      asidePx.value = clampAsidePx(v)
+      asideUserSet.value = true // 鏈夎蹇嗗�� = 鍖荤敓鎵嬪姩璋冭繃锛屽悗缁笉鍐嶈窡闅忕獥鍙h嚜閫傚簲
+    }
   } catch {
     /* ignore */
   }
 }
 
-/** 鍙屽嚮鍒嗙晫绾匡細鎭㈠榛樿瀹藉害骞舵竻闄よ蹇� */
+/** 鍙屽嚮鍒嗙晫绾匡細鎭㈠榛樿瀹藉害锛堥噸鏂版寜褰撳墠绐楀彛鑷�傚簲锛夊苟娓呴櫎璁板繂 */
 const resetAsideWidth = () => {
-  asidePx.value = clampAsidePx(defaultAsidePx)
+  asideUserSet.value = false
+  asidePx.value = clampAsidePx(calcDefaultAsidePx())
   if (props.storageKey) {
     try {
       localStorage.removeItem(props.storageKey)
@@ -244,7 +312,12 @@
 
   // 瀹藉害鍙樺寲锛堝惈绐楀彛缂╂斁锛夋椂閲嶆柊澶逛竴娆″彸鏍忓搴︼紝
   // 鍚﹀垯鎷栧鍚庢妸绐楀彛缂╁皬锛屽彸渚ф爮鍙兘鎶婂乏渚у唴瀹规尋娌°��
-  asidePx.value = clampAsidePx(asidePx.value)
+  //
+  // 銆愬垎杈ㄧ巼鑷�傚簲銆戞病鎵嬪姩璋冭繃鐨勶紙棣栨浣跨敤 / 鍙屽嚮澶嶄綅杩囷級鈫� 璺熼殢绐楀彛閲嶆柊绠楅粯璁ゅ搴︼紝
+  // 杩欐牱鍚屼竴浣嶅尰鐢熸崲鍒板皬灞忕瑪璁版湰涓婅嚜鍔ㄦ敹绐勶紱鎵嬪姩璋冭繃鐨勫彧鍋氬す绱э紝灏婇噸浠栫殑閫夋嫨銆�
+  asidePx.value = asideUserSet.value
+    ? clampAsidePx(asidePx.value)
+    : clampAsidePx(calcDefaultAsidePx())
 }
 
 /** 鐢� rAF 鍚堝苟杩炵画瑙﹀彂锛岄伩鍏� ResizeObserver 寰幆鍛婅 */
@@ -280,7 +353,7 @@
   <div
     ref="rootRef"
     class="doctor-page"
-    :class="{ 'is-resizing': dragging }"
+    :class="{ 'is-resizing': dragging, 'is-compact': isCompact }"
     :style="{ height: measuredHeight }"
   >
     <!--
@@ -292,7 +365,22 @@
       <div class="doctor-page__header-left">
         <slot name="header"></slot>
       </div>
-      <BedSwitchSelect :enabled="bedSwitchEnabled" :op-types="bedSwitchOpTypes" />
+      <div class="doctor-page__header-tools">
+        <!--
+          銆愬垎杈ㄧ巼閫傞厤銆戞樉绀哄瘑搴︼細绱у噾妯″紡鍘嬬缉琛岄珮/鍐呰竟璺濓紝鐭睆锛�768 楂橈級
+          鑳藉鏄剧ず鍑犺璁板綍銆傞�夋嫨璁板湪 localStorage锛屾崲椤典繚鎸併��
+        -->
+        <el-select
+          v-model="density"
+          size="small"
+          class="doctor-page__density"
+          title="鏄剧ず瀵嗗害锛氱揣鍑戞ā寮忛�傚悎灏忓睆骞�/宸叉斁澶х缉鏀剧殑鐢佃剳"
+        >
+          <el-option label="鏍囧噯鏄剧ず" value="normal" />
+          <el-option label="绱у噾鏄剧ず" value="compact" />
+        </el-select>
+        <BedSwitchSelect :enabled="bedSwitchEnabled" :op-types="bedSwitchOpTypes" />
+      </div>
     </div>
 
     <!-- 鍥磋妯″紡锛堝彧璇伙級/ 鏈�夊伐浣� 鎻愮ず鏉★細璁╁尰鐢熶竴鐪肩煡閬�"鐜板湪鍙兘鐪嬶紝涓嶈兘鎿嶄綔" -->
@@ -395,6 +483,18 @@
   flex: 1;
   min-width: 0;
   overflow: hidden;
+}
+
+/* 鍙充笂瑙掑伐鍏峰尯锛氭樉绀哄瘑搴� + 宸ヤ綅鍒囨崲锛堥兘鍥哄畾闈犲彸锛屼笉鍙備笌鍘嬬缉锛� */
+.doctor-page__header-tools {
+  display: flex;
+  flex: none;
+  align-items: center;
+  gap: 8px;
+}
+
+.doctor-page__density {
+  width: 104px;
 }
 
 /* ==========================================================================
@@ -577,4 +677,44 @@
     margin-left: 0;
   }
 }
+
+/* ==========================================================================
+   銆愬垎杈ㄧ巼閫傞厤銆戠揣鍑戞樉绀烘ā寮�
+   --------------------------------------------------------------------------
+   鍙帇缂┿�岄棿璺濄�嶏紝涓嶆敼瀛楀彿 鈥斺�� 榛樿锛堟爣鍑嗭級**瀹屽叏涓嶅彈褰卞搷**锛屾墍鏈夎鍒欓兘鎸傚湪
+   `.is-compact` 涓嬶紝鍒囧洖鏍囧噯鍗虫仮澶嶅師鏍枫��
+
+   閽堝鐨勭幇鍦洪棶棰橈細768 楂樼殑绗旇鏈紙鍐嶅彔鍔� 125% 缂╂斁锛変笂锛屾偅鑰呬俊鎭� + 宸插畬鎴愯褰�
+   + 搴曢儴鎸夐挳鍔犺捣鏉ヨ秴杩囧彲鐢ㄩ珮搴︼紝璁板綍鍒楄〃鍙墿涓�涓よ銆傚帇缂╁悗鑳芥妸楂樺害杩樼粰鍐呭銆�
+   ========================================================================== */
+.doctor-page.is-compact {
+  /* 鎮h�呬俊鎭� 18 椤圭敤鐨勬槸 EP 榛樿 18px 琛岃窛锛屾槸鏈�澶х殑楂樺害娴垂鐐� */
+  :deep(.el-form-item) {
+    margin-bottom: 4px;
+  }
+
+  /* 璁板綍琛ㄦ牸锛氬崟鍏冩牸涓婁笅鍐呰竟璺� 8px 鈫� 3px锛岃楂樻敹鍒� 18px */
+  :deep(.el-table .cell) {
+    padding: 0 8px;
+    line-height: 18px;
+  }
+
+  :deep(.el-table td.el-table__cell),
+  :deep(.el-table th.el-table__cell) {
+    padding: 3px 0;
+  }
+
+  .doctor-page__header {
+    height: 36px;
+  }
+
+  .doctor-page__readonly-tip {
+    padding: 2px 12px;
+    line-height: 18px;
+  }
+
+  .doctor-page__footer {
+    padding: 2px 0 2px 8px;
+  }
+}
 </style>

--
Gitblit v1.9.3