From 1446994d504819c367e1ff667360eadb314f9ac6 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期日, 18 十月 2026 16:52:18 +0800
Subject: [PATCH] 修改了诊室工号

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

diff --git a/src/components/DoctorPageLayout/src/DoctorPageLayout.vue b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
index 4184c5d..51091de 100644
--- a/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
+++ b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
@@ -7,13 +7,13 @@
   銆屽彨鍙� / 杩囧彿 / 閲嶅彨 / 鏆傚仠 / 鎾ら攢鍙彿銆嶆尅浣忥紱
   涓斿灞傚鍣ㄦ病鏈夌‘瀹氶珮搴︼紝涓棿鍖烘棤娉曚骇鐢熸粴鍔紝鍐呭鍙兘涓�璺妸椤甸潰鎾戦暱銆�
 
-  銆愬竷灞�濂戠害銆戔�斺�旂旱鍚戜笁娈� + 鍙充晶鏍�
+  銆愬竷灞�濂戠害銆戔�斺�旂旱鍚戜笁娈� + 鍙充晶鏍忥紙涓棿鏈�**鍙嫋鍔ㄥ垎鐣岀嚎**锛�
   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
   鈹� #header  鏍囬鏍忥紙鍥哄畾楂樺害锛屼笉婊氬姩锛�          鈹�  flex: none
   鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
   鈹� #default 涓讳綋锛堟粴鍔ㄥ尯锛�       鈹� #aside      鈹�  浠呬腑闂村尯涓庡彸鏍忓悇鑷粴鍔�
-  鈹�  路 鎮h�呬俊鎭紙鐢卞悇闈㈡澘鍐呴儴    鈹� 锛堢嫭绔嬫粴鍔級鈹�
-  鈹�    璁句负 sticky锛岄拤鍦ㄩ《閮級   鈹�             鈹�
+  鈹�  路 鎮h�呬俊鎭紙鐢卞悇闈㈡澘鍐呴儴    鈹� 锛堢嫭绔嬫粴鍔級鈹�  涓よ�呬箣闂寸殑绔栫嚎**鍙乏鍙虫嫋鍔�**
+  鈹�    璁句负 sticky锛岄拤鍦ㄩ《閮級   鈹�             鈹�  浠ヨ皟鏁村彸鏍忓搴�
   鈹�  路 宸插畬鎴愯褰曞垪琛紙婊氬姩锛�    鈹�             鈹�
   鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
   鈹� #footer  鍔熻兘鎸夐挳锛堝浐瀹氬簳閮紝姘镐笉琚伄鎸★級    鈹�  flex: none
@@ -29,6 +29,7 @@
      甯︿笉閫忔槑鑳屾櫙涓庝笂杈规锛屽唴瀹规案杩滀笉浼氶�忚繃鏉ユ垨鐩栦綇瀹冦��
   4. 鏍瑰厓绱�**鑷甫涓嶉�忔槑鑳屾櫙**锛氬悇闈㈡澘鍐� sticky 鐨勬偅鑰呬俊鎭嫢涓嶉�忔槑锛�
      婊氬姩鍐呭浼氫粠瀹冧笌杈圭紭鐨勭紳闅欓�忓嚭锛屾晠鏁撮〉缁熶竴搴曡壊銆�
+  5. 銆愭湰娆℃柊澧炪�戝垎鐣岀嚎鍙嫋鍔紙瑙佷笅锛夛紝瀹藉害璁板湪 localStorage 閲岋紝鍒囬〉/鍒锋柊鍚庝繚鎸併��
 
   銆愭彃妲姐��
     header   鏍囬鏍忥紙鍙�夛級
@@ -37,19 +38,67 @@
     footer   搴曢儴鍔熻兘鎸夐挳锛堝彲閫夛紱鍥哄畾鍦ㄩ〉闈㈠簳閮級
 -->
 <script setup lang="ts">
-import { onBeforeUnmount, onMounted, ref } from 'vue'
+import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
+import BedSwitchSelect from '@/views/ecg/doctor/components/BedSwitchSelect.vue'
+import { useRoomStore } from '@/store/modules/room'
 
 defineOptions({ name: 'DoctorPageLayout' })
 
-withDefaults(
+/* ==================== 涓�/鍥磋锛堝彧璇绘ā寮忥級 ==================== */
+
+const roomStore = useRoomStore()
+
+/**
+ * 鏄惁鏄剧ず椤堕儴鎻愮ず鏉°��
+ *
+ * 鍒ゅ畾锛�**鍙褰撳墠涓嶅彲鎿嶄綔**灏辨彁绀� 鈥斺�� 鍚袱绉嶆儏鍐碉細
+ *   鈶� 杩樻病閫夊畾瑕佺湅鍝釜宸ヤ綅锛堟湭鍏ュ骇涔熸病鍥磋锛夛紱
+ *   鈶� 姝e湪鍥磋鍒汉鐨勫伐浣嶏紙鎴戝叆搴х殑 鈮� 鎴戞鍦ㄧ湅鐨勶級銆�
+ */
+const showReadonlyTip = computed(() => !roomStore.getCanOperate)
+const readonlyTipText = computed(() =>
+  roomStore.getViewText ? `銆�${roomStore.getViewText}銆峘 : '锛堝皻鏈�夋嫨宸ヤ綅锛�'
+)
+const readonlyTipPrefix = computed(() =>
+  roomStore.getViewText ? '鍥磋妯″紡锛堝彧璇伙級锛氭鍦ㄦ煡鐪�' : '灏氭湭閫夋嫨宸ヤ綅锛氳鐢ㄥ彸涓婅銆屽伐浣嶃�嶄笅鎷夐�夋嫨瑕佹煡鐪� / 瑕佸叆搴х殑宸ヤ綅'
+)
+
+const props = withDefaults(
   defineProps<{
-    /** 鍙充晶鏍忓搴� */
+    /** 鍙充晶鏍�**鍒濆/榛樿**瀹藉害锛堟嫋鍔ㄤ箣鍚庝互瀹為檯鎷栧姩鍊间负鍑嗭紱鍙屽嚮鍒嗙晫绾挎仮澶嶈鍊硷級 */
     asideWidth?: string
+    /** 鍙充晶鏍忔渶灏忓搴︼紙px锛� */
+    minAsideWidth?: number
+    /** 宸︿晶鍐呭鍖烘渶灏忓搴︼紙px锛夛細宸︿晶鏄洓鍒楁偅鑰呬俊鎭〃鍗曪紝澶獎浼氭姌琛� */
+    minContentWidth?: number
+    /** 璁板繂鎷栧姩缁撴灉鐨� localStorage key锛涗紶绌哄瓧绗︿覆琛ㄧず涓嶈蹇� */
+    storageKey?: string
+    /**
+     * 銆愭湰娆¢渶姹傘�戞槸鍚﹀厑璁稿湪鏍囬鏍忓垏鎹㈠伐浣嶃��
+     * 璁惧棰嗙敤 / 瑁呮満椤典紶 `false`锛氬伐浣嶅浐瀹氾紝涓嶆彁渚涘垏鎹紙鏈叆搴ц�呭嵆鍥磋鑰咃紝鍙锛夈��
+     */
+    bedSwitchEnabled?: boolean
+    /**
+     * 銆愭湰娆¢渶姹傘�戝彲鍒囨崲宸ヤ綅鐨�**浣滀笟绫诲瀷**杩囨护锛�0妫�鏌� 1棰嗙敤 2瑁呮満锛夈��
+     * 鍙彿妫�鏌ラ〉浼� `[0]` 鈫� 涓嬫媺鍙垪妫�鏌ョ被宸ヤ綅锛涗笉浼� = 涓嶈繃婊ゃ��
+     */
+    bedSwitchOpTypes?: number[] | null
   }>(),
   {
-    asideWidth: '400px'
+    asideWidth: '400px',
+    minAsideWidth: 280,
+    minContentWidth: 520,
+    storageKey: 'ecg.doctor.asideWidth',
+    bedSwitchEnabled: true,
+    bedSwitchOpTypes: null
   }
 )
+
+/** 榛樿瀹藉害锛坧x锛夛細鐢� asideWidth 瑙f瀽鑰屾潵锛岀敤浣滃垵濮嬪�间笌"鍙屽嚮澶嶄綅"鍊� */
+const defaultAsidePx = (() => {
+  const n = parseInt(props.asideWidth, 10)
+  return Number.isFinite(n) && n > 0 ? n : 400
+})()
 
 /**
  * 銆愬叧閿�戜笉渚濊禆 CSS `height: 100%` 鐨勮В鏋愶紝鏀逛负**瀹炴祴鐖跺鍣ㄥ彲鐢ㄩ珮搴�**銆�
@@ -71,6 +120,111 @@
 const rootRef = ref<HTMLElement>()
 const measuredHeight = ref<string | undefined>(undefined)
 
+// ==================== 鍙充晶鏍忓搴︼紙鍙嫋鍔ㄥ垎鐣岀嚎锛� ====================
+
+/** 涓讳綋琛屽鍣細鎷栧姩鏃剁敤瀹冪畻"鍙充晶鏍忔渶澶氳兘鏈夊瀹�" */
+const bodyRef = ref<HTMLElement>()
+
+/** 鍙充晶鏍忓綋鍓嶅搴︼紙px锛� */
+const asidePx = ref<number>(defaultAsidePx)
+
+/** 鏄惁姝e湪鎷栧姩锛堢敤浜庢崲鍏夋爣銆佺閫変腑锛� */
+const dragging = ref(false)
+
+/**
+ * 鎶婂搴﹀す鍒板悎娉曞尯闂淬��
+ *
+ * 涓婇檺 = 瀹瑰櫒瀹藉害 鈭� 宸︿晶鏈�灏忓搴︼紙淇濊瘉宸︿晶鎮h�呬俊鎭�/璁板綍鍒楄〃涓嶈鎸ゆ病锛夛紱
+ * 涓嬮檺 = minAsideWidth銆傜獥鍙f瀬绐勫鑷翠袱鑰呭啿绐佹椂锛�**浼樺厛淇濊瘉涓嬮檺**锛�
+ * 宸︿晶闈犺嚜韬殑 `min-width:0 + overflow` 浼橀泤闄嶇骇銆�
+ */
+const clampAsidePx = (px: number) => {
+  const bodyPx = bodyRef.value?.clientWidth ?? 0
+  const lower = props.minAsideWidth
+  const upper = bodyPx > 0
+    ? Math.max(lower, bodyPx - props.minContentWidth)
+    : Number.MAX_SAFE_INTEGER
+  return Math.round(Math.min(Math.max(px, lower), upper))
+}
+
+/** 璁颁綇鎷栧姩缁撴灉锛堥殣绉佹ā寮�/绂佺敤瀛樺偍鏃堕潤榛樺拷鐣ワ級 */
+const saveAsidePx = () => {
+  if (!props.storageKey) return
+  try {
+    localStorage.setItem(props.storageKey, String(asidePx.value))
+  } catch {
+    /* ignore */
+  }
+}
+
+/** 璇诲彇涓婃鎷栧姩缁撴灉锛涘繀椤荤瓑 bodyRef 鎸傝浇鍚庢墠鑳� clamp */
+const loadAsidePx = () => {
+  if (!props.storageKey) return
+  try {
+    const v = parseInt(localStorage.getItem(props.storageKey) || '', 10)
+    if (Number.isFinite(v) && v > 0) asidePx.value = clampAsidePx(v)
+  } catch {
+    /* ignore */
+  }
+}
+
+/** 鍙屽嚮鍒嗙晫绾匡細鎭㈠榛樿瀹藉害骞舵竻闄よ蹇� */
+const resetAsideWidth = () => {
+  asidePx.value = clampAsidePx(defaultAsidePx)
+  if (props.storageKey) {
+    try {
+      localStorage.removeItem(props.storageKey)
+    } catch {
+      /* ignore */
+    }
+  }
+}
+
+let startX = 0
+let startPx = 0
+
+/**
+ * 鐢� Pointer Events + setPointerCapture锛�
+ * 鎹曡幏鍚� pointermove/up 閮藉彧鍦ㄥ垎鐣岀嚎涓婅Е鍙戯紝**涓嶉渶瑕�**鍐嶅線 document 涓婃寕/鎽樼洃鍚紝
+ * 涔熷氨涓嶄細鍑虹幇"鎷栧埌 iframe 鎴栫獥鍙e鏉炬墜鍚庣洃鍚畫鐣�"鐨勮�侀棶棰樸��
+ */
+const onSplitterDown = (e: PointerEvent) => {
+  const el = e.currentTarget as HTMLElement | null
+  dragging.value = true
+  startX = e.clientX
+  startPx = asidePx.value
+  el?.setPointerCapture?.(e.pointerId)
+  e.preventDefault()
+}
+
+const onSplitterMove = (e: PointerEvent) => {
+  if (!dragging.value) return
+  // 鍒嗙晫绾垮悜鍙虫嫋锛埼攛>0锛夆啋 鍙充晶鏍忓彉绐勶紝鏁呯敤鍑忔硶
+  asidePx.value = clampAsidePx(startPx - (e.clientX - startX))
+}
+
+const onSplitterUp = (e: PointerEvent) => {
+  if (!dragging.value) return
+  dragging.value = false
+  const el = e.currentTarget as HTMLElement | null
+  el?.releasePointerCapture?.(e.pointerId)
+  saveAsidePx()
+}
+
+/** 閿洏寰皟锛堚啇/鈫� 姣忔 20px锛夛紝鏃犻紶鏍囦篃鑳借皟鏁� */
+const onSplitterKey = (e: KeyboardEvent) => {
+  const step = 20
+  if (e.key === 'ArrowLeft') {
+    asidePx.value = clampAsidePx(asidePx.value + step) // 鍒嗙晫绾垮乏绉� 鈫� 鍙充晶鍙樺
+  } else if (e.key === 'ArrowRight') {
+    asidePx.value = clampAsidePx(asidePx.value - step)
+  } else {
+    return
+  }
+  saveAsidePx()
+  e.preventDefault()
+}
+
 let ro: ResizeObserver | undefined
 let rafId = 0
 
@@ -87,6 +241,10 @@
 
   // 鐖剁骇楂樺害涓嶅彲娴嬶紙auto/0锛夋椂淇濈暀 CSS 鍥為��锛屼笉璁惧唴鑱旈珮搴�
   measuredHeight.value = inner > 0 ? `${inner}px` : undefined
+
+  // 瀹藉害鍙樺寲锛堝惈绐楀彛缂╂斁锛夋椂閲嶆柊澶逛竴娆″彸鏍忓搴︼紝
+  // 鍚﹀垯鎷栧鍚庢妸绐楀彛缂╁皬锛屽彸渚ф爮鍙兘鎶婂乏渚у唴瀹规尋娌°��
+  asidePx.value = clampAsidePx(asidePx.value)
 }
 
 /** 鐢� rAF 鍚堝苟杩炵画瑙﹀彂锛岄伩鍏� ResizeObserver 寰幆鍛婅 */
@@ -100,6 +258,7 @@
 
 onMounted(() => {
   measure()
+  loadAsidePx()
   const parent = rootRef.value?.parentElement
   if (parent && typeof ResizeObserver !== 'undefined') {
     ro = new ResizeObserver(scheduleMeasure)
@@ -118,22 +277,65 @@
 </script>
 
 <template>
-  <div ref="rootRef" class="doctor-page" :style="{ height: measuredHeight }">
-    <!-- 鏍囬鏍忥細鍥哄畾楂樺害锛屼笉婊氬姩 -->
+  <div
+    ref="rootRef"
+    class="doctor-page"
+    :class="{ 'is-resizing': dragging }"
+    :style="{ height: measuredHeight }"
+  >
+    <!--
+      鏍囬鏍忥細鍥哄畾楂樺害锛屼笉婊氬姩銆�
+      鍙充晶鍥哄畾鏀俱�屽伐浣嶅垏鎹� / 鍥磋銆嶄笅鎷夛紙涓�/鍥磋妯″瀷鐨勫叆鍙o級鈥斺�旀斁鍦ㄥ竷灞�灞傦紝
+      鍙彿妫�鏌� / 璁惧棰嗙敤 / 瑁呮満 涓夐〉鑷姩閮芥湁锛屼笉鐢ㄥ悇椤甸噸澶嶅姞銆�
+    -->
     <div v-if="$slots.header" class="doctor-page__header">
-      <slot name="header"></slot>
+      <div class="doctor-page__header-left">
+        <slot name="header"></slot>
+      </div>
+      <BedSwitchSelect :enabled="bedSwitchEnabled" :op-types="bedSwitchOpTypes" />
+    </div>
+
+    <!-- 鍥磋妯″紡锛堝彧璇伙級/ 鏈�夊伐浣� 鎻愮ず鏉★細璁╁尰鐢熶竴鐪肩煡閬�"鐜板湪鍙兘鐪嬶紝涓嶈兘鎿嶄綔" -->
+    <div v-if="showReadonlyTip" class="doctor-page__readonly-tip">
+      <Icon icon="ep:view" class="mr-4px" />
+      {{ readonlyTipPrefix }}{{ roomStore.getViewText ? readonlyTipText : '' }}<template v-if="roomStore.getViewText && roomStore.viewOwnerName">锛屼富浜� {{ roomStore.viewOwnerName }}</template><template v-if="roomStore.getViewText">锛涘闇�鎿嶄綔锛岃鍦ㄥ彸涓婅銆屽伐浣嶃�嶉噷鍏ュ骇鍒拌宸ヤ綅銆�</template>
     </div>
 
     <!-- 涓讳綋锛氬崰鎹墿浣欏叏閮ㄩ珮搴︼紱鍐呴儴鍙"鍐呭鍖�"鍜�"鍙虫爮"鍚勮嚜婊氬姩 -->
-    <div class="doctor-page__body">
+    <div ref="bodyRef" class="doctor-page__body" :class="{ 'is-readonly': !roomStore.getCanOperate }">
       <div class="doctor-page__content">
         <slot></slot>
       </div>
 
+      <!--
+        鍙嫋鍔ㄥ垎鐣岀嚎锛堟湰娆¢渶姹傦級锛�
+        路 宸﹀彸鎷栧姩 = 璋冩暣鍙充晶鎮h�呮竻鍗曠殑瀹藉害锛�
+        路 鍙屽嚮 = 鎭㈠榛樿瀹藉害锛堝苟娓呴櫎璁板繂锛夛紱
+        路 鑱氱劍鍚� 鈫�/鈫� = 姣忔 20px 寰皟锛�
+        路 瀹藉害璁板繂鍦� localStorage锛屼笁涓伐浣滃彴椤甸潰鍏辩敤鍚屼竴涓� key銆�
+      -->
+      <div
+        v-if="$slots.aside"
+        class="doctor-page__splitter"
+        :class="{ 'is-dragging': dragging }"
+        role="separator"
+        aria-orientation="vertical"
+        :aria-valuenow="asidePx"
+        :aria-valuemin="minAsideWidth"
+        tabindex="0"
+        title="鎷栧姩璋冩暣鍙充晶瀹藉害锛堝弻鍑诲浣嶏級"
+        @pointerdown="onSplitterDown"
+        @pointermove="onSplitterMove"
+        @pointerup="onSplitterUp"
+        @pointercancel="onSplitterUp"
+        @dblclick="resetAsideWidth"
+        @keydown="onSplitterKey"
+      ></div>
+
       <div
         v-if="$slots.aside"
         class="doctor-page__aside"
-        :style="{ width: asideWidth, flex: `0 0 ${asideWidth}` }"
+        :style="{ width: `${asidePx}px`, flex: '0 0 auto' }"
       >
         <slot name="aside"></slot>
       </div>
@@ -144,7 +346,7 @@
       闇�姹傦細`鑷姩`銆乣鍋滄鍊欒瘖` 涓� `鍙彿/杩囧彿/閲嶅彨/鏆傚仠/鎾ら攢鍙彿` **鍚堟垚涓�缁�**锛�
             涓�璧�**闈犲彸**锛堝鐫�鍙充晶鍊欒瘖琛級锛屼笉瑕佽鎷嗘暎鍒板乏杈�/涓棿銆�
     -->
-    <div v-if="$slots.footer" class="doctor-page__footer">
+    <div v-if="$slots.footer" class="doctor-page__footer" :class="{ 'is-readonly': !roomStore.getCanOperate }">
       <div class="doctor-page__footer-right">
         <slot name="footer"></slot>
       </div>
@@ -168,6 +370,12 @@
   background-color: var(--el-bg-color);
 }
 
+/* 鎷栧姩鍒嗙晫绾胯繃绋嬩腑锛氬叏灞�鎹㈡垚宸﹀彸绠ご鍏夋爣锛屽苟绂佹閫変腑鏂囧瓧锛堝惁鍒欎細鎷栧嚭涓�鐗囪摑鑹查�夊尯锛� */
+.doctor-page.is-resizing {
+  cursor: col-resize;
+  user-select: none;
+}
+
 /* ---------- 鏍囬鏍� ---------- */
 .doctor-page__header {
   flex: none;
@@ -175,6 +383,59 @@
   padding: 0 12px;
   overflow: hidden;
   background-color: var(--el-color-primary-light-7);
+  /* 宸︿晶鏍囬锛堝悇椤典紶鍏ョ殑 TitlePanel锛�+ 鍙充晶銆屽伐浣嶅垏鎹� / 鍥磋銆嶄笅鎷� */
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 8px;
+}
+
+/* 鏍囬鍖哄彲鍘嬬缉锛堝伐浣嶄笅鎷夊浐瀹氶潬鍙筹級 */
+.doctor-page__header-left {
+  flex: 1;
+  min-width: 0;
+  overflow: hidden;
+}
+
+/* ==========================================================================
+   銆愭湰娆¢渶姹傘�戝伐浣滃彴鎸夐挳缁熶竴灏哄 / 瀛楀彿锛堟柟渚块紶鏍囧嚮涓級
+
+   鍘熸潵娣风敤 `size="small"`锛�24px / 12px 瀛楋級涓庨粯璁わ紙32px / 14px 瀛楋級锛�
+   鍚屼竴椤甸噷澶у皬涓嶄竴銆傝繖閲屽仛缁熶竴褰掍竴鍖栵紝**涓嶉�愪釜鏀� size 灞炴��**锛�
+   褰掍竴鍖栧悗 `--small` 宸叉棤瑙嗚鏁堟灉锛屽悗缁柊澧炴寜閽篃浼氳嚜鍔ㄤ竴鑷淬��
+   ========================================================================== */
+.doctor-page :deep(.el-button),
+.doctor-page :deep(.el-button--small),
+.doctor-page :deep(.el-button--default) {
+  height: 32px;
+  padding: 0 14px;
+  font-size: 14px;
+}
+
+/* 琛ㄦ牸 / 闃熷垪鍒楄〃鍐呯殑琛屽唴鎸夐挳锛氬皬涓�妗o紝閬垮厤鎶婅〃鏍艰鎾戦珮 */
+.doctor-page :deep(.el-table .el-button:not(.is-link)),
+.doctor-page :deep(.queue-list .el-button:not(.is-link)) {
+  height: 28px;
+  padding: 0 10px;
+  font-size: 13px;
+}
+
+/* 閾炬帴寮忔寜閽紙琛ㄥご銆屾挙閿�銆嶃�佸�欓�夊尯銆岀珛鍗宠ˉ浜恒�嶇瓑锛夛細鍙斁澶у瓧鍙凤紝涓嶅姞楂樺害 */
+.doctor-page :deep(.el-button.is-link) {
+  height: auto;
+  padding: 0 4px;
+  font-size: 14px;
+}
+
+/* ---------- 鍥磋妯″紡锛堝彧璇伙級鎻愮ず鏉� ---------- */
+.doctor-page__readonly-tip {
+  flex: none;
+  padding: 4px 12px;
+  font-size: 13px;
+  line-height: 20px;
+  color: var(--el-color-warning);
+  background-color: var(--el-color-warning-light-9);
+  border-bottom: 1px solid var(--el-color-warning-light-7);
 }
 
 /* ---------- 涓讳綋 ---------- */
@@ -183,6 +444,20 @@
   flex: 1;
   /* 鈿狅笍 鍏抽敭锛氫笉鍔� min-height:0锛宖lex 瀛愰」涓嶄細鏀剁缉锛宱verflow 涓嶇敓鏁� */
   min-height: 0;
+}
+
+/*
+  鍥磋妯″紡锛堝彧璇伙級锛氬唴瀹瑰尯閲岀殑**鎸夐挳 / 寮�鍏� / 鍕鹃�夋**涓�寰嬩笉鍙偣銆�
+  瑕嗙洊鍚勯潰鏉块噷鐨勩�屾鏌ュ畬鎴� / 鏀惧純妫�鏌� / 纭垂 / 棰嗙敤瀹屾垚 / 瑁呮満瀹屾垚 / 鏁版嵁褰曞叆 / 鎾ら攢 鈥︺�嶃��
+  璇存槑锛�
+    路 寮圭獥锛堟偅鑰呬俊鎭�佹墦鍗伴瑙堢瓑锛夋槸 teleport 鍑哄幓鐨勶紝涓嶅彈杩欓噷褰卞搷锛屼粛鍙甯告煡鐪嬶紱
+    路 鏈嶅姟绔繕鏈変竴閬撶‖鏍¢獙锛堥潪宸ヤ綅涓讳汉璋冪敤鍐欐帴鍙d細琚嫆缁濓級锛岃繖閲屽彧鏄綋楠屽眰銆�
+*/
+.doctor-page__body.is-readonly :deep(.el-button),
+.doctor-page__body.is-readonly :deep(.el-switch),
+.doctor-page__body.is-readonly :deep(.el-checkbox) {
+  pointer-events: none;
+  opacity: 0.5;
 }
 
 /*
@@ -196,6 +471,9 @@
   杩欓噷鐨� `overflow-y: auto` 鍙湪**绌洪棿瀹炲湪涓嶈冻**锛堟偅鑰呬俊鎭� + 鎸夐挳鎶婇珮搴﹀悆鍏夛級鏃剁敓鏁堬紝
   浣滀负鍏滃簳锛涙甯告儏鍐典笉浼氬嚭鐜版粴鍔ㄦ潯銆�
   娉ㄦ剰蹇呴』淇濈暀 min-height:0锛屽惁鍒� flex 瀛愰」涓嶄細鏀剁缉锛岃褰曞垪琛ㄦ嬁涓嶅埌鍙楅檺楂樺害銆�
+
+  鈿狅笍 鍙宠竟妗嗗凡鍘绘帀锛氬垎鐣岀嚎鏀圭敱 `.doctor-page__splitter` 鎻愪緵锛�
+     鍚﹀垯銆�3px 鍙宠竟妗� + 鍒嗙晫绾裤�嶄細骞舵帓鎴愪袱鏉$嚎銆�
 */
 .doctor-page__content {
   display: flex;
@@ -207,6 +485,42 @@
   overflow-y: auto;
   overflow-x: hidden;
   border: solid var(--el-color-primary-light-7);
+  border-right: none;
+}
+
+/* ---------- 鍙嫋鍔ㄥ垎鐣岀嚎 ---------- */
+/*
+  鍛戒腑鍖� 6px锛堝ソ鐐逛腑锛夛紝瑙嗚绾� 1px 灞呬腑锛沨over / 鎷栧姩涓姞绮楀彉涓昏壊銆�
+  娉ㄦ剰锛氬搴︾敱瀹冭嚜宸卞崰浣嶏紝鍥犳鎷栧姩鏃�"鍐呭鍖哄搴�"鐢� flex 鑷姩璁╁嚭锛屾棤闇� JS 鏀瑰乏渚с��
+*/
+.doctor-page__splitter {
+  position: relative;
+  flex: none;
+  width: 6px;
+  cursor: col-resize;
+  background-color: transparent;
+  /* 闃叉鎷栧姩鏃舵祻瑙堝櫒鍋氬師鐢熸嫋鎷�/婊氬姩 */
+  touch-action: none;
+  outline: none;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 50%;
+    width: 1px;
+    transform: translateX(-50%);
+    background-color: var(--el-border-color);
+    transition: background-color 0.15s, width 0.15s;
+  }
+
+  &:hover::before,
+  &.is-dragging::before,
+  &:focus-visible::before {
+    width: 2px;
+    background-color: var(--el-color-primary);
+  }
 }
 
 /* ---------- 鍙充晶鏍� ---------- */
@@ -238,6 +552,16 @@
 }
 
 /*
+  鍥磋妯″紡锛堝彧璇伙級锛氬簳閮ㄥ姛鑳芥寜閽暣缁勭鐢� 鈥斺��
+  pointer-events:none 鍚屾椂鎸′綇鐐瑰嚮涓庢偓鍋滐紝鍐嶅姞閫忔槑搴﹁"涓嶈兘鐐�"涓�鐪煎彲瑙併��
+  锛堟湇鍔$鍙︽湁纭牎楠岋細闈炲伐浣嶄富浜鸿皟鐢ㄥ啓鎺ュ彛浼氳鎷掔粷锛屽墠绔鐢ㄥ彧鏄綋楠屽眰銆傦級
+*/
+.doctor-page__footer.is-readonly {
+  pointer-events: none;
+  opacity: 0.55;
+}
+
+/*
   鍙充晶鎺т欢缁勶細`鑷姩` 澶嶉�夋 + 鍔熻兘鎸夐挳 + `鍋滄鍊欒瘖` 寮�鍏� **鍚堟垚涓�缁�**锛�
   涓�璧烽潬鍙炽�傜敤 gap 缁熶竴闂磋窛锛堝苟娓呮帀 Element Plus 缁欑浉閭� el-button 鐨�
   榛樿 margin-left:12px锛屽惁鍒欎細涓� gap 鍙犲姞瀵艰嚧闂磋窛涓嶅潎锛夈��

--
Gitblit v1.9.3