From d553a4be94d4f6ee162cc353a28b220403909cfc Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期六, 03 十月 2026 00:58:19 +0800
Subject: [PATCH] ai优化

---
 src/views/ecg/checktype/QueueSequenceForm.vue            |  392 ++++
 src/views/ecg/room/index.vue                             |    2 
 src/api/ecg/screen/index.ts                              |    2 
 src/views/ecg/devmanage/index.vue                        |  196 -
 src/views/ecg/devrent/index.vue                          |  177 -
 src/api/ecg/queue/index.ts                               |    2 
 src/views/ecg/doctor/components/DevInstallPanel.vue      |  241 ++
 src/utils/checkTypeFormatter.ts                          |   14 
 src/views/ecg/doctor/components/DevReadyPanel.vue        |  287 ++
 src/views/ecg/doctor/components/PatientInfoBlock.vue     |  292 ++-
 .eslintrc.js                                             |    8 
 src/components/DoctorPageLayout/index.ts                 |   10 
 src/views/ecg/queue/QueueForm.vue                        |    2 
 src/views/ecg/doctor/components/QueuePanel.vue           |  107 +
 src/store/modules/room.ts                                |   50 
 src/components/RoomStatus/src/RoomStatus.vue             |  179 +
 src/views/ecg/appointment/alter.vue                      |   15 
 src/views/ecg/doctor/components/RoutinePanel.vue         |  372 ++-
 src/views/ecg/appointment/index.vue                      |  216 -
 src/views/ecg/doctor/DevInstall.vue                      |   70 
 src/api/ecg/checktype/index.ts                           |   28 
 src/views/ecg/checktype/index.vue                        |  162 -
 src/views/ecg/doctor/Routine.vue                         |  107 
 src/views/ecg/room/RoomSetting.vue                       |   55 
 src/views/ecg/doctor/components/DeviceInfoBlock.vue      |  151 +
 src/store/modules/user.ts                                |    6 
 src/views/ecg/room/RoomForm.vue                          |    2 
 src/views/ecg/callingscreen/bigscreen2.vue               |    2 
 src/main.ts                                              |    8 
 src/permission.ts                                        |    6 
 src/views/ecg/doctor/components/TitlePanel.vue           |  178 +
 src/views/ecg/doctor/DevDismantle.vue                    |  106 
 src/api/ecg/appointment/index.ts                         |    2 
 src/views/ecg/appointment/AppointmentConfirm.vue         |  150 -
 src/views/ecg/appointment/AppointmentForm.vue            |    6 
 src/components/DoctorPageLayout/src/DoctorPageLayout.vue |  256 +++
 src/hooks/web/useIdleLogout.ts                           |   19 
 src/components/RoomBedSelect/src/RoomBedSelect.vue       |   57 
 src/views/ecg/doctor/index.vue                           |   72 
 src/store/modules/checkType.ts                           |   15 
 src/api/ecg/doctor/index.ts                              |    2 
 src/views/ecg/doctor/DevDataEntry.vue                    |   25 
 src/views/ecg/queue/index.vue                            |  236 +-
 src/api/ecg/queuesequence/index.ts                       |   95 +
 src/config/axios/service.ts                              |    9 
 src/utils/releaseBed.ts                                  |  106 +
 src/views/ecg/checktype/CheckTypeForm.vue                |  194 +
 47 files changed, 3,219 insertions(+), 1,470 deletions(-)

diff --git a/.eslintrc.js b/.eslintrc.js
index b28255c..4867dba 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -68,6 +68,14 @@
     ],
     'vue/multi-word-component-names': 'off',
     'vue/no-v-html': 'off',
+    // 鍏充簬"缁勪欢鏈� import 鍗撮潤榛樹笉娓叉煋"杩欑被闂锛�
+    // 鏈」鐩敤 unplugin-vue-components锛屼絾 globs 鍙鐩� `src/components/**`
+    // 锛堣 build/vite/index.ts锛夛紝鎵�浠� src/components 涓嬬殑 Dialog/ContentWrap/Pagination
+    // 绛夊彲鑷姩寮曞叆锛岃�� **src/views/**銆乻rc/layout/** 涓嬬殑缁勪欢蹇呴』鎵嬪啓 import銆�
+    // 婕忓啓鏃� vite build 涓� ESLint 閮戒笉鎶ラ敊锛圴ue 鍙綋瀹冩槸鏈煡鏍囩銆佹帶鍒跺彴 warning锛夛紝
+    // 瀹炴祴鏇惧鑷淬�屽彨鍙锋鏌ャ�嶉〉鎮h�呬俊鎭暣鍧楁秷澶便��
+    // 鍥犳鐢ㄤ笓闂ㄨ剼鏈牎楠岋細`node _prep/check-component-imports.js`
+    //锛坴ue/no-undef-components 鍦ㄦ湰椤圭洰浼氫骇鐢� 200+ 璇姤锛屾晠涓嶅惎鐢級
     'prettier/prettier': 'off', // 鑺嬭壙锛氶粯璁ゅ叧闂� prettier 鐨� ESLint 鏍¢獙锛屽洜涓烘垜浠娇鐢ㄧ殑鏄� IDE 鐨� Prettier 鎻掍欢
     '@unocss/order': 'off', // 鑺嬭壙锛氱鐢� unocss 銆恈ss銆戦『搴忕殑鎻愮ず锛屽洜涓烘殏鏃朵笉闇�瑕佽繖涔堜弗鏍硷紝璀﹀憡涔熸湁鐐圭箒鐞�
     '@unocss/order-attributify': 'off' // 鑺嬭壙锛氱鐢� unocss 銆愬睘鎬с�戦『搴忕殑鎻愮ず锛屽洜涓烘殏鏃朵笉闇�瑕佽繖涔堜弗鏍硷紝璀﹀憡涔熸湁鐐圭箒鐞�
diff --git a/src/api/ecg/appointment/index.ts b/src/api/ecg/appointment/index.ts
index ddf795d..c8aa681 100644
--- a/src/api/ecg/appointment/index.ts
+++ b/src/api/ecg/appointment/index.ts
@@ -23,7 +23,7 @@
   bookDate: Date // 棰勭害鏃ユ湡
   bookTimeslot: number // 棰勭害鏃堕棿娈�
   bookTime: Date // 棰勭害鍙戠敓鏃堕棿, 鐐瑰嚮棰勭害鐨勬椂闂�
-  bookCheckType: number // 棰勭害妫�鏌ョ被鍨�
+  bookCheckType: number // 棰勭害妫�鏌ラ」鐩�
   paid: number //宸蹭粯娆�
   bookSeqNum: number
   // ========== 浠ヤ笅瀛楁鍚庣 AppointmentRespVO 涓�鐩存湁杩斿洖锛屾鍓� TS 鏈0鏄� ==========
diff --git a/src/api/ecg/checktype/index.ts b/src/api/ecg/checktype/index.ts
index 5cb1657..3a0ce66 100644
--- a/src/api/ecg/checktype/index.ts
+++ b/src/api/ecg/checktype/index.ts
@@ -1,10 +1,10 @@
 import request from '@/config/axios'
 
-// 妫�鏌ョ被鍨� VO
+// 妫�鏌ラ」鐩� VO
 export interface CheckTypeVO {
   id: number // id
-  name: string // 妫�鏌ョ被鍨嬪悕
-  value: number // 妫�鏌ョ被鍨嬪��
+  name: string // 妫�鏌ラ」鐩悕绉�
+  value: number // 妫�鏌ラ」鐩��
   readyNum: number // 鍏佽鍑嗗涓汉鏁�
   needDevReady: number // 闇�瑕佽澶囬鐢�
   callingColumn: number // 鍙彿鍒�
@@ -12,53 +12,55 @@
   expenseRecognition: number // 鏄惁闇�瑕佺‘璐�
   timeslotBookNum: number // 鏃舵棰勭害瑙勫畾浜烘暟
   timeslotReservedNum: number // 姣忔椂娈甸鐣欎汉鏁�
-  affinityCheckTypes: number[] | null// 浜插拰鐨勬鏌ョ被鍨�
+  affinityCheckTypes: number[] | null// 浜插拰鐨勬鏌ラ」鐩�
   notes: string  // 棰勭害娉ㄦ剰浜嬮」
   seqPrefix: string // 搴忓彿鍓嶇紑
   /**
    * 鎺掗槦搴忓彿瑙勫垯锛�
    * 0=棰勭害鍙凤紙鐢ㄩ绾︾郴缁熺殑鍙凤紝涓嶅啀鍒嗛厤锛�
-   * 1=绛惧埌搴忓彿锛堝綋澶╁悓妫�鏌ョ被鍨嬭繛缁�掑锛屾瘡 9 涓鐣� 1 涓粰鍔犳�ワ級
+   * 1=绛惧埌搴忓彿锛堝綋澶╁悓妫�鏌ラ」鐩繛缁�掑锛屾瘡 9 涓鐣� 1 涓粰鍔犳�ワ級
    * 2=鏃舵鍙凤紙鎸夐绾︽椂闂存缁欏彿锛�
    * 鏈厤缃�(null/undefined) 鏃跺悗绔寜 2 澶勭悊锛屼笌鏀归�犲墠琛屼负涓�鑷淬��
    */
   seqRule: number | null
+  /** 鎺掑簭搴忓彿锛氳秺灏忚秺闈犲墠锛堟鏌ラ」鐩湪鍒楄〃涓殑鏄剧ず椤哄簭锛屽彲鍦ㄧ嚎缂栬緫锛� */
+  sort?: number
 }
 
-// 妫�鏌ョ被鍨� API
+// 妫�鏌ラ」鐩� API
 export const CheckTypeApi = {
 
-  // 鏌ヨ妫�鏌ョ被鍨�.绠�鍗曞垪琛�
+  // 鏌ヨ妫�鏌ラ」鐩�.绠�鍗曞垪琛�
   getSimpleCheckTypeList: async () => {
     return await request.get({ url: `/ecg/check-type/list-simple-check-type` })
   },
 
-  // 鏌ヨ妫�鏌ョ被鍨嬪垎椤�
+  // 鏌ヨ妫�鏌ラ」鐩垎椤�
   getCheckTypePage: async (params: any) => {
     return await request.get({ url: `/ecg/check-type/page`, params })
   },
 
-  // 鏌ヨ妫�鏌ョ被鍨嬭鎯�
+  // 鏌ヨ妫�鏌ラ」鐩鎯�
   getCheckType: async (id: number) => {
     return await request.get({ url: `/ecg/check-type/get?id=` + id })
   },
 
-  // 鏂板妫�鏌ョ被鍨�
+  // 鏂板妫�鏌ラ」鐩�
   createCheckType: async (data: CheckTypeVO) => {
     return await request.post({ url: `/ecg/check-type/create`, data })
   },
 
-  // 淇敼妫�鏌ョ被鍨�
+  // 淇敼妫�鏌ラ」鐩�
   updateCheckType: async (data: CheckTypeVO) => {
     return await request.put({ url: `/ecg/check-type/update`, data })
   },
 
-  // 鍒犻櫎妫�鏌ョ被鍨�
+  // 鍒犻櫎妫�鏌ラ」鐩�
   deleteCheckType: async (id: number) => {
     return await request.delete({ url: `/ecg/check-type/delete?id=` + id })
   },
 
-  // 瀵煎嚭妫�鏌ョ被鍨� Excel
+  // 瀵煎嚭妫�鏌ラ」鐩� Excel
   exportCheckType: async (params) => {
     return await request.download({ url: `/ecg/check-type/export-excel`, params })
   }
diff --git a/src/api/ecg/doctor/index.ts b/src/api/ecg/doctor/index.ts
index b6c70a7..2eec85e 100644
--- a/src/api/ecg/doctor/index.ts
+++ b/src/api/ecg/doctor/index.ts
@@ -19,7 +19,7 @@
   roomId: number // 璇婂缂栧彿
   bedNo: string // 璇婄枟搴婄紪鍙�
   patId: string // 鎮h�呯紪鍙�
-  checkType: number // 妫�鏌ョ被鍨�
+  checkType: number // 妫�鏌ラ」鐩�
   jumpFlag?: number // 鎻掗槦鏍囪
   roomId_operator: number | null
   bedNo_operator: string | null
diff --git a/src/api/ecg/queue/index.ts b/src/api/ecg/queue/index.ts
index 5200e0d..47949f4 100644
--- a/src/api/ecg/queue/index.ts
+++ b/src/api/ecg/queue/index.ts
@@ -10,7 +10,7 @@
   patName?: string // 鎮h�呭鍚�
   patGender?: number // 鎮h�呮�у埆
   bookTimeslot?: number // 棰勭害鏃堕棿娈�
-  bookCheckType?: number // 棰勭害妫�鏌ョ被鍨�
+  bookCheckType?: number // 棰勭害妫�鏌ラ」鐩�
   bookSeqNum?: number //棰勭害搴忓彿
   isVip?: number // 鏄惁VIP鎮h��
   seqNum?: number // 鎺掗槦搴忓彿
diff --git a/src/api/ecg/queuesequence/index.ts b/src/api/ecg/queuesequence/index.ts
index 4490d6d..39f400b 100644
--- a/src/api/ecg/queuesequence/index.ts
+++ b/src/api/ecg/queuesequence/index.ts
@@ -1,14 +1,32 @@
 import request from '@/config/axios'
 
-// 鎺掗槦 VO
+/**
+ * 棰勭害鏃舵瑙勫垯锛坬ueue_sequence 琛級
+ *
+ * 涓氬姟璇存槑锛�
+ *   璇ヨ〃璁板綍**姣忎釜妫�鏌ラ」鐩湪姣忎釜棰勭害鏃舵鐨勫彇鍙疯鍒�**锛�
+ *     路 queueSet / queueFull 鈥斺�� 鏅�氭偅鑰呭湪璇ユ椂娈电殑銆岃捣濮嬪簭鍙枫�嶄笌銆屽簭鍙蜂笂闄愩��
+ *     路 queueNo            鈥斺�� 褰撳墠宸插彂鍒板嚑鍙凤紙鍙栧彿鏃朵粠姝ゅ�煎線鍚庡彂锛�
+ *     路 vip 涓変釜瀛楁鍚岀悊
+ *
+ *   璇ヨ〃**鍘熶负姣忓ぉ鑷姩鐢熸垚**锛岀幇宸叉敼涓�**鎵嬪伐缁存姢**锛堟晠闇�瑕佺淮鎶ょ晫闈級銆�
+ *   娉ㄦ剰锛氭瘡鏃ラ噸缃粛鍦ㄨ繍琛岋紙`QueueSequenceMapper#initNumber` 浼氭妸
+ *   `queue_no` 閲嶇疆鍥� `queue_set`锛夛紝鎵�浠ョ淮鎶ゆ椂**涓昏鏀� queueSet / queueFull**銆�
+ *
+ * 鏃舵鍊� timeSlot 涓� `HHMMHHMM` 褰㈠紡锛屽 `8000830` 琛ㄧず `08:00-08:30`
+ * 锛堝皬鏃朵笉琛ラ浂锛屾晠 800 鍗� 08:00锛夈�傚彲鐢ㄤ笅鏂� formatTimeSlot / parseTimeSlot 杞崲銆�
+ */
 export interface QueueSequenceVO {
-  id: number // id
-  checkType: number // 棰勭害妫�鏌ョ被鍨�
-  timeSlot: number
-  queueNo: number
-  queueVipNo: number
-  queueFull: number
-  queueVipFull: number
+  id?: number // id锛堟柊澧炴椂鐣欑┖锛�
+  checkType?: number // 妫�鏌ラ」鐩紙check_type.value锛�
+  timeSlot?: number // 鏃舵锛圚HMMHHMM锛�
+  queueNo?: number // 鏅�氾細褰撳墠搴忓彿
+  queueSet?: number // 鏅�氾細璧峰搴忓彿锛堟瘡鏃ラ噸缃洖鍒版鍊硷級
+  queueVipNo?: number // vip锛氬綋鍓嶅簭鍙�
+  queueVipSet?: number // vip锛氳捣濮嬪簭鍙�
+  queueFull?: number // 鏅�氾細搴忓彿涓婇檺
+  queueVipFull?: number // vip锛氬簭鍙蜂笂闄�
+  createTime?: Date
 }
 
 // 鎺掗槦 API
@@ -17,7 +35,68 @@
   // 鑾峰緱褰撳ぉ鏈弧鐨刅IP鏃堕棿娈�
   getTimeslotByCheckType: async (checkType: number) => {
     return await request.get({ url: `/ecg/queue-sequence/get-timeslot-by-checktype?checkType=` + checkType })
+  },
+
+  // ==================== 棰勭害鏃舵缁存姢锛堝 / 鍒� / 鏀� / 鏌ワ級 ====================
+
+  /** 鍒嗛〉鏌ヨ棰勭害鏃舵瑙勫垯 */
+  getQueueSequencePage: async (params: any) => {
+    return await request.get({ url: `/ecg/queue-sequence/page`, params })
+  },
+
+  /** 鏌ヨ鍗曟潯棰勭害鏃舵瑙勫垯 */
+  getQueueSequence: async (id: number) => {
+    return await request.get({ url: `/ecg/queue-sequence/get?id=` + id })
+  },
+
+  /** 鏂板棰勭害鏃舵瑙勫垯 */
+  createQueueSequence: async (data: QueueSequenceVO) => {
+    return await request.post({ url: `/ecg/queue-sequence/create`, data })
+  },
+
+  /** 淇敼棰勭害鏃舵瑙勫垯 */
+  updateQueueSequence: async (data: QueueSequenceVO) => {
+    return await request.put({ url: `/ecg/queue-sequence/update`, data })
+  },
+
+  /** 鍒犻櫎棰勭害鏃舵瑙勫垯 */
+  deleteQueueSequence: async (id: number) => {
+    return await request.delete({ url: `/ecg/queue-sequence/delete?id=` + id })
   }
 
 }
 
+/**
+ * 鎶� `HHMMHHMM` 褰㈠紡鐨勬椂娈靛�兼牸寮忓寲涓� `HH:mm-HH:mm`銆�
+ *
+ * 渚嬶細8000830 鈫� "08:00-08:30"锛�13301400 鈫� "13:30-14:00"
+ * 鏃犳硶瑙f瀽鏃跺師鏍疯繑鍥炲瓧绗︿覆銆�
+ */
+export function formatTimeSlot(timeSlot?: number | null): string {
+  if (timeSlot === null || timeSlot === undefined) return '-'
+  const s = String(timeSlot)
+  if (!/^\d{5,8}$/.test(s)) return s
+  // 绾﹀畾锛氭渶鍚� 4 浣嶄负缁撴潫 HHmm锛屽叾浣欎负寮�濮� HHmm
+  const endPart = s.slice(-4)
+  const startPart = s.slice(0, s.length - 4)
+  const fmt = (p: string): string => {
+    if (p.length < 3) return p
+    const mm = p.slice(-2)
+    const hh = p.slice(0, p.length - 2)
+    return `${hh.padStart(2, '0')}:${mm}`
+  }
+  return `${fmt(startPart)}-${fmt(endPart)}`
+}
+
+/**
+ * 鎶� `HH:mm-HH:mm` 瑙f瀽鍥� `HHMMHHMM` 鏁板�笺��
+ * 渚嬶細"08:00-08:30" 鈫� 8000830
+ * 瑙f瀽澶辫触杩斿洖 undefined銆�
+ */
+export function parseTimeSlot(text?: string | null): number | undefined {
+  if (!text) return undefined
+  const m = String(text).trim().match(/^(\d{1,2}):(\d{2})\s*-\s*(\d{1,2}):(\d{2})$/)
+  if (!m) return undefined
+  const [, h1, m1, h2, m2] = m
+  return Number(`${Number(h1)}${m1}${Number(h2)}${m2}`)
+}
diff --git a/src/api/ecg/screen/index.ts b/src/api/ecg/screen/index.ts
index 249602a..b2ee952 100644
--- a/src/api/ecg/screen/index.ts
+++ b/src/api/ecg/screen/index.ts
@@ -6,7 +6,7 @@
   patName: string // 鎮h�呭鍚�
   patGender: number // 鎮h�呮�у埆
   bookDate: Date // 棰勭害鏃ユ湡
-  bookCheckType: number // 棰勭害妫�鏌ョ被鍨�
+  bookCheckType: number // 棰勭害妫�鏌ラ」鐩�
   seqNum: number // 鎺掗槦搴忓彿
   bookSeqNum: number // 棰勭害搴忓彿
   status: number // 5:杩囧彿 10:鎺掗槦涓� 15:宸插彫鍥� 20:鍊欒瘖鍑嗗 30:灏辫瘖涓� 40:灏辫瘖瀹屾垚
diff --git a/src/components/DoctorPageLayout/index.ts b/src/components/DoctorPageLayout/index.ts
new file mode 100644
index 0000000..0a64bba
--- /dev/null
+++ b/src/components/DoctorPageLayout/index.ts
@@ -0,0 +1,10 @@
+import type { App } from 'vue'
+import DoctorPageLayout from './src/DoctorPageLayout.vue'
+
+export { DoctorPageLayout }
+
+export default {
+  install(app: App) {
+    app.component('DoctorPageLayout', DoctorPageLayout)
+  }
+}
diff --git a/src/components/DoctorPageLayout/src/DoctorPageLayout.vue b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
new file mode 100644
index 0000000..4184c5d
--- /dev/null
+++ b/src/components/DoctorPageLayout/src/DoctorPageLayout.vue
@@ -0,0 +1,256 @@
+<!--
+  鍖荤敓宸ヤ綔鍙伴�氱敤甯冨眬锛堝彨鍙锋鏌� / 璁惧棰嗙敤 / 瑁呮満 涓夐〉鍏辩敤锛�
+
+  銆愯В鍐充粈涔堥棶棰樸��
+  鍘熷厛涓変釜椤甸潰鐨勫姛鑳芥寜閽斁鍦� `.right-bottom { position: absolute; bottom: 50px }`锛�
+  **鑴辩鏂囨。娴�**锛屽洜姝�"宸插畬鎴愭偅鑰呭垪琛�"鍙橀暱鍚庝細鐩存帴閾哄埌鎸夐挳搴曚笅銆佹妸
+  銆屽彨鍙� / 杩囧彿 / 閲嶅彨 / 鏆傚仠 / 鎾ら攢鍙彿銆嶆尅浣忥紱
+  涓斿灞傚鍣ㄦ病鏈夌‘瀹氶珮搴︼紝涓棿鍖烘棤娉曚骇鐢熸粴鍔紝鍐呭鍙兘涓�璺妸椤甸潰鎾戦暱銆�
+
+  銆愬竷灞�濂戠害銆戔�斺�旂旱鍚戜笁娈� + 鍙充晶鏍�
+  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+  鈹� #header  鏍囬鏍忥紙鍥哄畾楂樺害锛屼笉婊氬姩锛�          鈹�  flex: none
+  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+  鈹� #default 涓讳綋锛堟粴鍔ㄥ尯锛�       鈹� #aside      鈹�  浠呬腑闂村尯涓庡彸鏍忓悇鑷粴鍔�
+  鈹�  路 鎮h�呬俊鎭紙鐢卞悇闈㈡澘鍐呴儴    鈹� 锛堢嫭绔嬫粴鍔級鈹�
+  鈹�    璁句负 sticky锛岄拤鍦ㄩ《閮級   鈹�             鈹�
+  鈹�  路 宸插畬鎴愯褰曞垪琛紙婊氬姩锛�    鈹�             鈹�
+  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+  鈹� #footer  鍔熻兘鎸夐挳锛堝浐瀹氬簳閮紝姘镐笉琚伄鎸★級    鈹�  flex: none
+  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+
+  銆愬叧閿疄鐜扮偣銆�
+  1. 鏍瑰厓绱� `height:100%; display:flex; flex-direction:column; overflow:hidden`
+     鈥斺�� 璁�"鏁撮〉"鏈夌‘瀹氶珮搴︼紝涓棿鍖烘墠鍙兘婊氬姩锛堣�屼笉鏄妸椤甸潰鎾戦暱锛夈��
+  2. 涓棿鍖哄繀椤绘湁 `min-height: 0`銆俧lex 瀛愰」榛樿 `min-height: auto`
+     浼�**鎷掔粷鏀剁缉鍒板唴瀹归珮搴︿互涓�**锛屼粠鑰� `overflow-y:auto` 姘镐笉鐢熸晥 鈥斺��
+     杩欐槸鏈被甯冨眬鏈�甯歌鐨勫潙锛屽埆鍒犮��
+  3. `#footer` 鍦�**姝e父鏂囨。娴�**涓紙涓嶅啀鐢� position:absolute锛夛紝
+     甯︿笉閫忔槑鑳屾櫙涓庝笂杈规锛屽唴瀹规案杩滀笉浼氶�忚繃鏉ユ垨鐩栦綇瀹冦��
+  4. 鏍瑰厓绱�**鑷甫涓嶉�忔槑鑳屾櫙**锛氬悇闈㈡澘鍐� sticky 鐨勬偅鑰呬俊鎭嫢涓嶉�忔槑锛�
+     婊氬姩鍐呭浼氫粠瀹冧笌杈圭紭鐨勭紳闅欓�忓嚭锛屾晠鏁撮〉缁熶竴搴曡壊銆�
+
+  銆愭彃妲姐��
+    header   鏍囬鏍忥紙鍙�夛級
+    default  涓讳綋鍐呭锛堟粴鍔ㄥ尯锛�
+    aside    鍙充晶鏍忥紙鍙�夛紱鐙珛婊氬姩锛屽鎮h�呴槦鍒楋級
+    footer   搴曢儴鍔熻兘鎸夐挳锛堝彲閫夛紱鍥哄畾鍦ㄩ〉闈㈠簳閮級
+-->
+<script setup lang="ts">
+import { onBeforeUnmount, onMounted, ref } from 'vue'
+
+defineOptions({ name: 'DoctorPageLayout' })
+
+withDefaults(
+  defineProps<{
+    /** 鍙充晶鏍忓搴� */
+    asideWidth?: string
+  }>(),
+  {
+    asideWidth: '400px'
+  }
+)
+
+/**
+ * 銆愬叧閿�戜笉渚濊禆 CSS `height: 100%` 鐨勮В鏋愶紝鏀逛负**瀹炴祴鐖跺鍣ㄥ彲鐢ㄩ珮搴�**銆�
+ *
+ * 鑳屾櫙锛堢湡瀹炴晠闅滐級锛氬師鍏堥潬 `.doctor-page { height: 100% }` 鎾戣捣楂樺害銆�
+ * 璇ュ啓娉曡姹�**鐖剁骇鏈夌‘瀹氶珮搴�**锛岃�屾湰缁勪欢鎸傚湪 `AppView` 鐨� `<section>` 涓嬶紝
+ * 閭f潯閾句笂浠讳綍涓�鐜紙`el-scrollbar__view` 鐨� 99%銆乣AppView` 鐨� `min-height` 绛夛級
+ * 涓�鏃︿笉鎴愮珛锛宍height:100%` 灏变細閫�鍖栨垚 `auto` 鈥斺��
+ * 浜庢槸 `.doctor-page` **闅忓唴瀹归暱楂�**锛宖lex 鐨� `flex:none` footer 琚帹鍒拌鍙d笅鏂癸紝
+ * 鐢ㄦ埛蹇呴』婊氬姩椤甸潰鎵嶈兘鐪嬪埌 footer銆傝繖姝f槸鐢ㄦ埛鍙嶉鐨勭幇璞°��
+ *
+ * 瑙e喅锛氱敤 `ResizeObserver` 閲忓嚭**鐖跺厓绱犵殑瀹為檯鍐呭楂樺害**锛屼互鍐呰仈 style 鐩存帴缁欐牴鍏冪礌
+ * 璁惧畾鍍忕礌楂樺害銆傝繖鏍锋棤璁哄灞傛槸 flex銆乥lock 杩樻槸鐧惧垎姣旈摼锛�
+ * 鎴戜滑鐨勪笁娈靛紡甯冨眬閮芥嬁鍒颁竴涓�**纭畾鐨�**楂樺害锛宖ooter 蹇呯劧璐村湪瀹瑰櫒搴曢儴銆佹棤闇�婊氬姩銆�
+ *
+ * 鑻ョ埗绾ч珮搴︿笉鍙祴锛堢綍瑙侊級锛宍height` 淇濇寔 undefined锛�
+ * 姝ゆ椂浠嶅洖閫�鍒� CSS 鐨� `height: 100%`锛屼笉浼氭瘮鍘熸潵鏇村樊銆�
+ */
+const rootRef = ref<HTMLElement>()
+const measuredHeight = ref<string | undefined>(undefined)
+
+let ro: ResizeObserver | undefined
+let rafId = 0
+
+const measure = () => {
+  const el = rootRef.value
+  const parent = el?.parentElement
+  if (!el || !parent) return
+
+  const cs = getComputedStyle(parent)
+  const inner =
+    parent.clientHeight -
+    parseFloat(cs.paddingTop || '0') -
+    parseFloat(cs.paddingBottom || '0')
+
+  // 鐖剁骇楂樺害涓嶅彲娴嬶紙auto/0锛夋椂淇濈暀 CSS 鍥為��锛屼笉璁惧唴鑱旈珮搴�
+  measuredHeight.value = inner > 0 ? `${inner}px` : undefined
+}
+
+/** 鐢� rAF 鍚堝苟杩炵画瑙﹀彂锛岄伩鍏� ResizeObserver 寰幆鍛婅 */
+const scheduleMeasure = () => {
+  if (rafId) cancelAnimationFrame(rafId)
+  rafId = requestAnimationFrame(() => {
+    rafId = 0
+    measure()
+  })
+}
+
+onMounted(() => {
+  measure()
+  const parent = rootRef.value?.parentElement
+  if (parent && typeof ResizeObserver !== 'undefined') {
+    ro = new ResizeObserver(scheduleMeasure)
+    ro.observe(parent)
+  } else {
+    window.addEventListener('resize', scheduleMeasure)
+  }
+})
+
+onBeforeUnmount(() => {
+  if (rafId) cancelAnimationFrame(rafId)
+  ro?.disconnect()
+  ro = undefined
+  window.removeEventListener('resize', scheduleMeasure)
+})
+</script>
+
+<template>
+  <div ref="rootRef" class="doctor-page" :style="{ height: measuredHeight }">
+    <!-- 鏍囬鏍忥細鍥哄畾楂樺害锛屼笉婊氬姩 -->
+    <div v-if="$slots.header" class="doctor-page__header">
+      <slot name="header"></slot>
+    </div>
+
+    <!-- 涓讳綋锛氬崰鎹墿浣欏叏閮ㄩ珮搴︼紱鍐呴儴鍙"鍐呭鍖�"鍜�"鍙虫爮"鍚勮嚜婊氬姩 -->
+    <div class="doctor-page__body">
+      <div class="doctor-page__content">
+        <slot></slot>
+      </div>
+
+      <div
+        v-if="$slots.aside"
+        class="doctor-page__aside"
+        :style="{ width: asideWidth, flex: `0 0 ${asideWidth}` }"
+      >
+        <slot name="aside"></slot>
+      </div>
+    </div>
+
+    <!--
+      鍔熻兘鎸夐挳锛氭甯告枃妗f祦涓殑鍥哄畾搴曢儴鏍忥紝姘镐笉琚唴瀹归伄鎸°��
+      闇�姹傦細`鑷姩`銆乣鍋滄鍊欒瘖` 涓� `鍙彿/杩囧彿/閲嶅彨/鏆傚仠/鎾ら攢鍙彿` **鍚堟垚涓�缁�**锛�
+            涓�璧�**闈犲彸**锛堝鐫�鍙充晶鍊欒瘖琛級锛屼笉瑕佽鎷嗘暎鍒板乏杈�/涓棿銆�
+    -->
+    <div v-if="$slots.footer" class="doctor-page__footer">
+      <div class="doctor-page__footer-right">
+        <slot name="footer"></slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.doctor-page {
+  display: flex;
+  flex-direction: column;
+  /*
+    鍏滃簳楂樺害锛氫粎鍦� `measuredHeight` 鏈祴鍒版椂鐢熸晥锛堣 script 涓殑璇存槑锛夈��
+    鐪熸鐨勭‘瀹氭�ч珮搴︽潵鑷� ResizeObserver 瀹炴祴鍚庡啓鍏ョ殑琛屽唴 style 鈥斺��
+    鍥犱负 `height: 100%` 渚濊禆鐖剁骇鏈夌‘瀹氶珮搴︼紝杩欐潯閾惧湪澶栧眰甯冨眬鍙樺寲鏃朵細澶辨晥锛�
+    瀵艰嚧鏍瑰厓绱犻殢鍐呭闀块珮銆佹妸 footer 鎺ㄥ埌瑙嗗彛涓嬫柟锛堢敤鎴峰弽棣堢殑鐜拌薄锛夈��
+  */
+  height: 100%;
+  overflow: hidden;
+  /* 涓嶉�忔槑搴曡壊锛氶潰鏉垮唴 sticky 鐨勬偅鑰呬俊鎭笌杈圭紭缂濋殭涓嶄細閫忓嚭婊氬姩鍐呭 */
+  background-color: var(--el-bg-color);
+}
+
+/* ---------- 鏍囬鏍� ---------- */
+.doctor-page__header {
+  flex: none;
+  height: 40px;
+  padding: 0 12px;
+  overflow: hidden;
+  background-color: var(--el-color-primary-light-7);
+}
+
+/* ---------- 涓讳綋 ---------- */
+.doctor-page__body {
+  display: flex;
+  flex: 1;
+  /* 鈿狅笍 鍏抽敭锛氫笉鍔� min-height:0锛宖lex 瀛愰」涓嶄細鏀剁缉锛宱verflow 涓嶇敓鏁� */
+  min-height: 0;
+}
+
+/*
+  鍐呭鍖猴細**鑷韩涓嶆粴鍔�**锛堥渶姹傦細婊氬姩鏉¤闀垮湪銆屽凡瀹屾垚璁板綍鍒楄〃銆嶄笂锛岃�屼笉鏄腑闂村尯鏁翠綋锛夈��
+  鍥犳杩欓噷 flex 绾靛悜鎺掑垪 + overflow-y:auto锛�
+    路 鎮h�呬俊鎭紙闈㈡澘閲岀殑 el-form锛塮lex:none锛屽浐瀹氬湪涓婃柟锛�
+    路 璁板綍鍒楄〃锛�.records-host锛塮lex:1锛涜褰曞垪琛�**鑷繁婊氬姩**
+      锛堝悇闈㈡澘鍐� `.records-wrap :deep(.el-card__body) { max-height: calc(100% - 545px); overflow-y:auto }`
+       閰嶅悎 `.el-table__header-wrapper { position: sticky }` 鍥哄畾琛ㄥご锛夈��
+
+  杩欓噷鐨� `overflow-y: auto` 鍙湪**绌洪棿瀹炲湪涓嶈冻**锛堟偅鑰呬俊鎭� + 鎸夐挳鎶婇珮搴﹀悆鍏夛級鏃剁敓鏁堬紝
+  浣滀负鍏滃簳锛涙甯告儏鍐典笉浼氬嚭鐜版粴鍔ㄦ潯銆�
+  娉ㄦ剰蹇呴』淇濈暀 min-height:0锛屽惁鍒� flex 瀛愰」涓嶄細鏀剁缉锛岃褰曞垪琛ㄦ嬁涓嶅埌鍙楅檺楂樺害銆�
+*/
+.doctor-page__content {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  min-width: 0;
+  min-height: 0;
+  padding: 6px 10px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  border: solid var(--el-color-primary-light-7);
+}
+
+/* ---------- 鍙充晶鏍� ---------- */
+.doctor-page__aside {
+  flex: none;
+  /* 鍏佽鍙虫爮鑷韩鏀剁缉锛岄厤鍚� overflow 鐙珛婊氬姩 */
+  min-width: 0;
+  min-height: 0;
+  /* 鍙虫爮鐙珛婊氬姩锛岄暱鍒楄〃涓嶄細鎶婂簳閮ㄦ寜閽《璧� */
+  overflow-y: auto;
+  border: solid var(--el-color-primary-light-7);
+  border-left: none;
+}
+
+/* ---------- 搴曢儴鍔熻兘鎸夐挳 ---------- */
+.doctor-page__footer {
+  display: flex;
+  flex: none;
+  /* 闇�姹傦細鎵�鏈夋帶浠躲�屼竴琛屾樉绀恒�嶄笖鏁寸粍闈犲彸 鈥斺�� 涓嶅厑璁告崲琛岋紝鍚﹀垯 footer 鍙樹袱琛屻��
+     浼氬崰鎺夎褰曞尯楂樺害锛堝師鍏� flex-wrap:wrap 鍦� 1366 瀹戒笅灏变細鎶樿锛夈�� */
+  flex-wrap: nowrap;
+  align-items: center;
+  /* 鏁寸粍闈犲彸锛氬彸渚т笉鐣� padding锛屼娇鎸夐挳缁勪笌鍙充晶 #aside锛堝�欒瘖琛級鍙宠竟绾垮榻� */
+  justify-content: flex-end;
+  padding: 4px 0 4px 8px;
+  /* 鍥哄畾搴曢儴锛氭湁鑳屾櫙/涓婅竟妗嗭紝鍐呭涓嶄細閫忚繃鏉� */
+  background-color: var(--el-bg-color);
+  border-top: 1px solid var(--el-border-color);
+}
+
+/*
+  鍙充晶鎺т欢缁勶細`鑷姩` 澶嶉�夋 + 鍔熻兘鎸夐挳 + `鍋滄鍊欒瘖` 寮�鍏� **鍚堟垚涓�缁�**锛�
+  涓�璧烽潬鍙炽�傜敤 gap 缁熶竴闂磋窛锛堝苟娓呮帀 Element Plus 缁欑浉閭� el-button 鐨�
+  榛樿 margin-left:12px锛屽惁鍒欎細涓� gap 鍙犲姞瀵艰嚧闂磋窛涓嶅潎锛夈��
+*/
+.doctor-page__footer-right {
+  display: flex;
+  flex: none;
+  gap: 8px;
+  align-items: center;
+  white-space: nowrap;
+
+  :deep(.el-button + .el-button) {
+    margin-left: 0;
+  }
+}
+</style>
diff --git a/src/components/RoomBedSelect/src/RoomBedSelect.vue b/src/components/RoomBedSelect/src/RoomBedSelect.vue
index d53c21d..935b00f 100644
--- a/src/components/RoomBedSelect/src/RoomBedSelect.vue
+++ b/src/components/RoomBedSelect/src/RoomBedSelect.vue
@@ -49,9 +49,22 @@
 </script>
 
 <template>
-  <el-card class="bed-card" shadow="hover" :body-style="{ padding: '10px' }">
+  <!--
+    闇�姹傦細鐢ㄦ埛閫夋嫨鐨�**褰撳墠璇婂**鍗$墖瑕佸姞棰滆壊锛屼笌鍏朵粬鍗$墖鍖哄垎寮�銆�
+    杩欓噷缁欏崱鐗囧姞 `is-current` 绫伙紙涓昏壊杈规 + 娴呰壊搴� + 闃村奖锛夛紝
+    骞跺湪鍗$墖澶村彸渚ф樉绀恒�屽綋鍓嶈瘖瀹ゃ�嶈鏍囷紝鍋氬埌涓�鐪煎彲杈ㄣ��
+  -->
+  <el-card
+    class="bed-card"
+    :class="{ 'is-current': isCurSeat }"
+    shadow="hover"
+    :body-style="{ padding: '10px' }"
+  >
     <template #header>
-      <div class="bed-card__title">{{ bed.roomName }}</div>
+      <div class="bed-card__header">
+        <span class="bed-card__title">{{ bed.roomName }}</span>
+        <span v-if="isCurSeat" class="bed-card__badge">褰撳墠璇婂</span>
+      </div>
     </template>
 
     <img
@@ -84,6 +97,46 @@
 </template>
 
 <style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細鐢ㄦ埛閫夋嫨鐨�**褰撳墠璇婂**鍗$墖鍔犻鑹诧紝涓庡叾浠栧崱鐗囧尯鍒嗐��
+   娉ㄦ剰绫诲悕 `is-current` 涓� Element Plus 鑷甫鐨� `.is-*` 涓嶅啿绐侊紙鍗$墖涓婃病鏈夊叾瀹� is- 绫伙級銆�
+   ========================================================================== */
+.bed-card.is-current {
+  /* 涓昏壊杈规鍔犵矖 + 娴呰壊搴� + 鎶曞奖锛屼笁閲嶅尯鍒嗭紝杩滅湅涔熸槑鏄� */
+  border: 2px solid var(--el-color-primary);
+  background-color: var(--el-color-primary-light-9);
+  box-shadow: 0 0 8px var(--el-color-primary-light-5);
+
+  :deep(.el-card__header) {
+    background-color: var(--el-color-primary-light-8);
+    border-bottom: 1px solid var(--el-color-primary-light-5);
+  }
+
+  .bed-card__title {
+    color: var(--el-color-primary);
+  }
+}
+
+/* 鍗$墖澶达細璇婂鍚� + 褰撳墠璇婂瑙掓爣 */
+.bed-card__header {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 6px;
+}
+
+.bed-card__badge {
+  flex: none;
+  padding: 0 5px;
+  font-size: 11px;
+  font-weight: 400;
+  line-height: 16px;
+  color: #fff;
+  background-color: var(--el-color-primary);
+  border-radius: 3px;
+  white-space: nowrap;
+}
+
 .bed-card {
   display: flex;
   flex-direction: column;
diff --git a/src/components/RoomStatus/src/RoomStatus.vue b/src/components/RoomStatus/src/RoomStatus.vue
index 53c06d4..e15d596 100644
--- a/src/components/RoomStatus/src/RoomStatus.vue
+++ b/src/components/RoomStatus/src/RoomStatus.vue
@@ -1,17 +1,22 @@
 <script lang="ts" setup>
 import { RoomApi, RoomVO } from '@/api/ecg/room'
 import { QueueApi } from '@/api/ecg/queue'
-import {PropType} from "vue";
-import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
-import {useCheckTypeStore} from "@/store/modules/checkType";
-import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
+import { PropType } from "vue";
+import { DICT_TYPE, getIntDictOptions } from "@/utils/dict";
+import { useCheckTypeStore } from "@/store/modules/checkType";
+import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
+// 鍔ㄦ�� :src 涓嶄細琚� Vite 鑷姩澶勭悊锛岄渶瑕佹樉寮� import锛堜笌 RoomBedSelect 涓�鑷达級
+import closeImg from '@/assets/room/close.jpg'
+import openImg from '@/assets/room/open.jpg'
+import doctorImg from '@/assets/room/desk-doctor.jpg'
+
 const emit = defineEmits(['refresh'])
 
 defineComponent({
   name: 'RoomStatus'
 })
 
-const  props = defineProps({
+const props = defineProps({
   title: {
     type: String,
     required: true
@@ -34,6 +39,19 @@
     emit('refresh')
 }
 
+/**
+ * 宸ヤ綅鐘舵�佸浘銆備笌銆岃瘖瀹ら�夋嫨銆嶉〉 (RoomBedSelect) 鐢ㄥ悓涓�濂楄祫婧愪笌灏哄锛�
+ *   鏈紑鏀�(0)   鈫� close.jpg
+ *   宸插紑鏀�(10)  鈫� open.jpg
+ *   鏈夊尰鐢�(20/30) 鈫� desk-doctor.jpg
+ */
+const bedImg = (item: any) => {
+  const st = Number(item?.status)
+  if (st === 20 || st === 30) return doctorImg
+  if (st === 10) return openImg
+  return closeImg
+}
+
 /** 鍒濆鍖� **/
 onMounted(() => {
 })
@@ -41,66 +59,123 @@
 </script>
 
 <template>
-  <el-card style="width: 200px" shadow="hover" >
-    <template #header>{{title}}</template>
-    <div v-for="(bedItem, index) in bedList" :key="index">
-      <div class="deskwarp">
-        <img
-            v-if="bedItem.status === 0"
-            src="@/assets/room/close.jpg"
-            style="width: 100%"
-             @click = openBed(bedItem)
-            alt="宸ヤ綅宸插叧闂�"
-        />
-        <img
-            v-else-if="bedItem.status === 10"
-            src="@/assets/room/open.jpg"
-            style="width: 100%"
-             @click = closeBed(bedItem)
-            alt="宸ヤ綅寮�鏀句腑"
-        />
-        <img v-else-if="bedItem.status === 20 || bedItem.status === 30"
-            src="@/assets/room/doctor.png"
-            style="width: 100%"
-        />
-        {{bedItem.bedNo}} {{bedItem.docName}} {{bedItem.status === 30?"-鏆傚仠":""}}
-        <div v-for="(checkType, subIndex) in bedItem.checkTypes" :key="subIndex">
-          {{getCheckTypeName(checkType)}}
-        </div>
-        <div>
-          {{bedItem.opType === 1?"棰嗙敤":""}}
-          {{bedItem.opType === 2?"瀹夎":""}}
-        </div>
-        <el-divider/>
+  <!--
+    闇�姹傦細鏈〉鍗$墖鏀规垚涓庛�岃瘖瀹ら�夋嫨銆嶉〉涓�鑷寸殑鏍峰紡銆�
+    鍥犳杩欓噷鐨勬帓鐗�/瀛楀彿/鍥剧墖灏哄/闂磋窛**閫愰」瀵归綈** components/RoomBedSelect/src/RoomBedSelect.vue锛�
+      路 鍗$墖澶达細灞呬腑銆乸adding 6px 10px銆佹爣棰� 16px/600
+      路 鍗$墖浣擄細绾靛悜鎺掑垪銆佹按骞冲眳涓�乬ap 4px銆乸adding 10px
+      路 鍥剧墖锛�80脳64銆乷bject-fit contain
+      路 涓绘爣绛撅紙搴婁綅鍙�+鍖荤敓鍚嶏級锛�15px/600銆佸眳涓�
+      路 妫�鏌ラ」鐩瓑娆¤淇℃伅锛�14px銆佹瑕佽壊銆佸眳涓�佸彲鎹㈣
+    鍖哄埆锛氳瘖瀹ら�夋嫨鏄�"涓�涓伐浣嶄竴寮犲崱鐗�"锛屾湰椤垫槸"涓�涓瘖瀹や竴寮犲崱鐗囥�佸崱鍐呭垪鍑鸿璇婂鍚勫伐浣�"锛�
+    鏁呭崱鍐呮瘡涓伐浣嶆槸涓�涓� bed-block锛涜瑙夎鏍间笌鍓嶈�呬繚鎸佷竴鑷淬��
+  -->
+  <el-card class="room-status-card" shadow="hover">
+    <template #header>
+      <div class="bed-card__title">{{ title }}</div>
+    </template>
+
+    <div
+      v-for="(bedItem, index) in bedList"
+      :key="index"
+      class="bed-block"
+    >
+      <img
+        class="bed-card__img"
+        :src="bedImg(bedItem)"
+        :alt="bedItem.status === 0 ? '宸ヤ綅宸插叧闂�' : (bedItem.status === 10 ? '宸ヤ綅寮�鏀句腑' : '鏈夊尰鐢�')"
+        @click="bedItem.status === 0 ? openBed(bedItem) : (bedItem.status === 10 ? closeBed(bedItem) : undefined)"
+      />
+
+      <div class="bed-card__label">
+        {{ bedItem.bedNo }} {{ bedItem.docName }} {{ bedItem.status === 30 ? "-鏆傚仠" : "" }}
+      </div>
+
+      <div class="bed-card__meta">
+        <span v-for="(checkType, subIndex) in bedItem.checkTypes" :key="subIndex">
+          {{ getCheckTypeName(checkType) }}
+        </span>
+        <span v-if="bedItem.opType === 1">棰嗙敤</span>
+        <span v-if="bedItem.opType === 2">瀹夎</span>
       </div>
     </div>
   </el-card>
 </template>
 
 <style scoped lang="scss">
-.card-title {
-  font-size: 14px;
-  font-weight: 600;
+/* 鍗$墖鏈綋锛氫笌 RoomBedSelect 鐨� .bed-card 瀵归綈锛堝彧鏄搴︽寜鏈〉闇�瑕佺暐绐勶級 */
+.room-status-card {
+  display: flex;
+  flex-direction: column;
+  width: 168px;
+  margin: 0 6px 6px 0;
+  overflow: hidden;
 
-  &::before {
-    position: relative;
-    top: 8px;
-    left: -5px;
-    display: inline-block;
-    width: 3px;
-    height: 14px;
-    //background-color: #105cfb;
-    background: var(--el-color-primary);
-    border-radius: 5px;
-    content: '';
-    transform: translateY(-50%);
+  // 鍗$墖澶达紙璇婂鍚嶏級
+  :deep(.el-card__header) {
+    flex: none;
+    padding: 6px 10px;
+    text-align: center;
+  }
+
+  // 鍗$墖浣擄細绾靛悜鎺掑垪銆佹按骞冲眳涓�
+  // 娉ㄦ剰锛氳繖閲�**涓嶇敤** flex:1 鈥斺�� RoomBedSelect 鏄湪绛夐珮缃戞牸閲屾墠闇�瑕佸畠鎾戞弧锛�
+  // 鏈〉鍗$墖楂樺害鐢卞伐浣嶆暟鍐冲畾锛岃嫢鎾戞弧浼氭妸鍐呭椤跺埌涓婃柟銆佺暀涓嬪ぇ鐗囩┖鐧姐��
+  :deep(.el-card__body) {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    gap: 4px;
+    padding: 10px;
   }
 }
 
-.deskwarp {
+/* 鍗″唴鍗曚釜宸ヤ綅锛氫笌 RoomBedSelect 鍗$墖浣撶殑鎺掑竷涓�鑷� */
+.bed-block {
   display: flex;
   flex-direction: column;
   align-items: center;
+  gap: 4px;
+  width: 100%;
+  padding-bottom: 6px;
+  border-bottom: 1px dashed var(--el-border-color-lighter);
+
+  &:last-child {
+    padding-bottom: 0;
+    border-bottom: none;
+  }
 }
 
+.bed-card__title {
+  font-size: 16px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+/* 鍥剧墖鍥哄畾灏忓昂瀵革紝涓嶉殢鍗$墖瀹藉害鏀惧ぇ锛堜笌 RoomBedSelect 鐩稿悓锛� */
+.bed-card__img {
+  flex: none;
+  width: 80px;
+  height: 64px;
+  object-fit: contain;
+  cursor: pointer;
+}
+
+.bed-card__label {
+  font-size: 15px;
+  font-weight: 600;
+  line-height: 1.3;
+  text-align: center;
+}
+
+.bed-card__meta {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 0 5px;
+  justify-content: center;
+  font-size: 14px;
+  line-height: 1.3;
+  color: var(--el-text-color-secondary);
+  text-align: center;
+}
 </style>
diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts
index 6044c2c..30f9e26 100644
--- a/src/config/axios/service.ts
+++ b/src/config/axios/service.ts
@@ -14,6 +14,7 @@
 
 import { resetRouter } from '@/router'
 import { deleteUserCache } from '@/hooks/web/useCache'
+import { releaseBedOnExit } from '@/utils/releaseBed'
 
 const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE
 const { result_code, base_url, request_timeout } = config
@@ -206,6 +207,14 @@
 const handleAuthorized = () => {
   const { t } = useI18n()
 
+  // 銆愰噴鏀捐瘖鐤楀簥浣嶃�戦壌鏉冨け璐� 鈬� 鏈疆鐧诲綍鍗冲皢缁撴潫锛屽繀椤诲厛閲婃斁鍖荤敓鍗犵敤鐨勫簥浣嶏紝
+  // 鍚﹀垯璇ュ簥浣嶄細涓�鐩存樉绀鸿鍗犵敤锛坄clinic_room.doc_id` 涓嶄负绌猴級锛屽埆鐨勫尰鐢熼�変笉鍒般��
+  //
+  // 鈿狅笍 椤哄簭瑕佹眰锛歳eleaseBedOnExit 鍐呴儴瑕佽 localStorage 閲岀殑璁块棶浠ょ墝鏉ュ甫
+  // Authorization 澶达紝鎵�浠�**蹇呴』鍦� removeToken() 涔嬪墠**璋冪敤锛堜笉 await锛�
+  // 浠ュ厤闃诲涓嬮潰鐨勬竻鐞嗕笌璺宠浆锛涘け璐ヤ篃涓嶅奖鍝嶆祦绋嬶級銆�
+  void releaseBedOnExit('auth-failed')
+
   // 銆愪慨澶嶃�戦壌鏉冨け璐ユ椂**绔嬪嵆**娓呯悊鏈湴鍑瘉涓庣敤鎴风紦瀛橈紝涓嶅啀绛夌敤鎴风偣鍑诲脊绐椼��
   //
   // 鍘熷洜锛氬師鍏堝彧鏈夊湪鐢ㄦ埛鐐广�岄噸鏂扮櫥褰曘�嶅悗鎵� removeToken/deleteUserCache銆�
diff --git a/src/hooks/web/useIdleLogout.ts b/src/hooks/web/useIdleLogout.ts
index 2cc1ab6..22904c4 100644
--- a/src/hooks/web/useIdleLogout.ts
+++ b/src/hooks/web/useIdleLogout.ts
@@ -1,6 +1,7 @@
 import { watch } from 'vue'
 import { useIdle } from '@vueuse/core'
 import { ElMessage } from 'element-plus'
+import { releaseBedOnExit } from '@/utils/releaseBed'
 
 /**
  * 绌洪棽瓒呮椂鑷姩閫�鍑猴紙闇�姹傦細30 鍒嗛挓涓嶆搷浣滄墠瑕佹眰閲嶆柊杈撳叆瀵嗙爜锛夈��
@@ -93,20 +94,32 @@
       onTimeout()
       return
     }
-    doIdleLogout()
+    void doIdleLogout()
   })
 }
 
 /**
- * 瀹為檯鎵ц绌洪棽鐧诲嚭锛氭竻鐞嗘湰鍦板嚟璇佸苟璺宠浆鐧诲綍椤点��
+ * 瀹為檯鎵ц绌洪棽鐧诲嚭锛氶噴鏀惧簥浣� + 娓呯悊鏈湴鍑瘉骞惰烦杞櫥褰曢〉銆�
  *
  * 涔嬫墍浠ヤ笉璋冪敤 userStore.loginOut()锛堥偅鏄�"涓诲姩閫�鍑�"锛夛細
  *   路 閭d釜鎺ュ彛浼氳姹傚悗绔敞閿� token 鈥� 瀵规湰鍦烘櫙娌″繀瑕侊紝涓斿彲鑳藉洜缃戠粶闂鍗′綇锛�
  *   路 绌洪棽鐧诲嚭鍙渶淇濊瘉鏈湴鍑瘉娓呭共鍑� + 鍥炲埌鐧诲綍椤点��
+ *
+ * 鈿狅笍 浣�**蹇呴』**鍗曠嫭璋冧竴娆°�岄噴鏀惧簥浣嶃�嶏細
+ *   鍖荤敓鍦ㄣ�岃瘖瀹ら�夋嫨銆嶉〉閫夊ソ搴婁綅鍚庡氨鍗犵敤浜嗚搴婁綅锛坄clinic_room.doc_id`锛夈��
+ *   鍘熷厛鏈嚱鏁板彧娓呮湰鍦板嚟璇併�佷笉閫氱煡鍚庣 鈬� 绌洪棽瓒呮椂鍚庡簥浣�**涓�鐩存樉绀鸿鍗犵敤**锛�
+ *   鍏朵粬鍖荤敓閫変笉鍒拌繖涓簥浣嶃�傝繖姝f槸"鍖荤敓蹇樹簡绂诲骇灏遍��鍑虹郴缁�"鐨勪富瑕佸満鏅��
  */
-function doIdleLogout(): void {
+async function doIdleLogout(): Promise<void> {
   ElMessage.warning(`宸茶秴杩� ${IDLE_TIMEOUT_MINUTES} 鍒嗛挓鏈搷浣滐紝璇烽噸鏂扮櫥褰昤)
 
+  // 鍏堥噴鏀惧簥浣嶏紝鍐嶆竻鍑瘉 鈥斺�� 椤哄簭涓嶈兘鍙嶏細閲婃斁鎺ュ彛闇�瑕佹惡甯﹀綋鍓嶄护鐗�
+  try {
+    await releaseBedOnExit('idle-timeout')
+  } catch {
+    /* releaseBedOnExit 鍐呴儴宸插厹搴曪紝涓嶄細鎶涢敊锛涙澶勪粎涓洪槻寰℃�у啓娉� */
+  }
+
   cleanupCredentials()
 
   // 鐢� replace 閬垮厤鐢ㄦ埛鎸�"杩斿洖"鍥炲埌宸茬櫥鍑虹殑椤甸潰
diff --git a/src/main.ts b/src/main.ts
index 15c6a53..1dcff8b 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -28,6 +28,9 @@
 // 璺敱
 import router, { setupRouter } from '@/router'
 
+// 銆愪慨澶嶃�戝尰鐢熷凡閫夎瘖瀹ょ殑鎸佷箙鍖栨仮澶嶏紙璇﹁ store/modules/room.ts 涓殑璇存槑锛�
+import { setupRoomStorePersistence } from '@/store/modules/room'
+
 // 鏉冮檺
 import { setupAuth } from '@/directives'
 
@@ -58,6 +61,11 @@
 
   setupStore(app)
 
+  // 銆愪慨澶嶃�戞妸銆屽尰鐢熷凡閫夎瘖瀹ゃ�嶄粠 sessionStorage 鎭㈠鍒� store銆�
+  // 蹇呴』鏀惧湪 setupStore(app) 涔嬪悗锛圥inia 宸插氨缁級銆佽矾鐢卞畧鍗笌椤甸潰 onMounted 涔嬪墠锛�
+  // 鍚﹀垯鍖荤敓椤甸潰浼氬洜 isSetRoom=false 鑰屼笉鍙栨暟锛堣〃鐜颁负"鍙彿妫�鏌ラ〉娌℃湁鎺掗槦鐥呬汉"锛夈��
+  setupRoomStorePersistence()
+
   setupGlobCom(app)
 
   setupElementPlus(app)
diff --git a/src/permission.ts b/src/permission.ts
index 85c14e2..ad7ab58 100644
--- a/src/permission.ts
+++ b/src/permission.ts
@@ -13,6 +13,7 @@
 import { useRoomStoreWithOut } from "@/store/modules/room";
 // 闇�姹傦細30 鍒嗛挓鏃犳搷浣滄墠瑕佹眰閲嶆柊鐧诲綍锛堝墠绔┖闂叉娴嬶級
 import { setupIdleLogout } from '@/hooks/web/useIdleLogout'
+import { setupBedReleaseOnUnload } from '@/utils/releaseBed'
 
 const { start, done } = useNProgress()
 
@@ -178,5 +179,10 @@
   // ==========================================================================
   if (getAccessToken() && to.path !== '/login') {
     setupIdleLogout()
+    // 闇�姹傦細閫�鍑虹郴缁熸椂鑷姩閫�鍑哄崰鐢ㄧ殑璇婄枟搴婁綅銆�
+    // 娉ㄥ唽 `pagehide` 鍏滃簳锛堝叧闂爣绛鹃〉/鍒锋柊/璺宠蛋锛夆�斺�� 鍐呴儴鑷甫骞傜瓑淇濇姢锛�
+    // 鍙槸"灏藉姏鑰屼负"鐨勬渶鍚庝竴灞傦紱涓昏淇濋殰鍦� useIdleLogout / userStore.loginOut /
+    // axios 鐨� handleAuthorized 涓夊鏄庣‘鐨勯��鍑鸿矾寰勪笂銆�
+    setupBedReleaseOnUnload()
   }
 })
diff --git a/src/store/modules/checkType.ts b/src/store/modules/checkType.ts
index 069a36a..77feab8 100644
--- a/src/store/modules/checkType.ts
+++ b/src/store/modules/checkType.ts
@@ -12,6 +12,8 @@
   notes: string
   seqPrefix: string // 搴忓彿鍓嶇紑
   expenseRecognition: number
+  /** 鏄惁闇�瑕佽澶囬鐢細0-涓嶉渶瑕侊紝1-闇�瑕侊紙鐢ㄤ簬銆岃澶囬鐢ㄣ�嶉〉鐨勬牎楠岋級 */
+  needDevReady?: number
 }
 export interface CheckTypeState {
   checkTypeMap: Map<number, CheckTypeSimpleVO>
@@ -98,6 +100,19 @@
       }
       return this.checkTypeMap[type]?.expenseRecognition
     },
+    /**
+     * 璇ユ鏌ラ」鐩槸鍚﹂渶瑕併�岃澶囬鐢ㄣ�嶃��
+     *
+     * 鐢ㄤ簬銆岃澶囬鐢ㄣ�嶉〉鐨勫畧鍗細鍙湁闇�瑕佽澶囬鐢ㄧ殑椤圭洰锛堝鍔ㄦ�佸績鐢点�佸姩鎬佽鍘嬶級
+     * 鎵嶅簲杩涘叆棰嗙敤娴佺▼锛涘父瑙勫績鐢靛浘绛変笉闇�瑕侀鐢ㄧ殑椤圭洰鑻ヨ鎷夊埌璇ラ〉锛屽簲鎷︿笅骞舵彁绀猴紝
+     * 鍚﹀垯浼氬嚭鐜�"妫�鏌ョ被鎮h�呭嚭鐜板湪璁惧棰嗙敤妯″潡"鐨勬贩涔便��
+     */
+    getNeedDevReady(type: number) {
+      if (!this.isSetCheckType) {
+        this.setCheckTypeMap()
+      }
+      return this.checkTypeMap[type]?.needDevReady
+    },
     async resetCheckTypeInfo() {
       wsCache.delete(CACHE_KEY.CHECKTYPE_CACHE)
       const res = await CheckTypeApi.getSimpleCheckTypeList()
diff --git a/src/store/modules/room.ts b/src/store/modules/room.ts
index f3f771b..74fe57b 100644
--- a/src/store/modules/room.ts
+++ b/src/store/modules/room.ts
@@ -52,13 +52,17 @@
       this.room!.opType = room.opType
       this.isSetRoom = true
 
-      // 鏇存柊 cache
-      const bedInfo = wsCache.get(CACHE_KEY.ROOM)
-      if (bedInfo) {
-        bedInfo.room = room
-        bedInfo.isSetRoom = true
-        wsCache.set(CACHE_KEY.ROOM, bedInfo)
-      }
+      // 銆愪慨澶嶃�戝啓鍏ョ紦瀛橈紙sessionStorage锛夈��
+      //
+      // 鍘熷疄鐜版槸 `const bedInfo = wsCache.get(...); if (bedInfo) { ...; wsCache.set(...) }`
+      // 鈥斺�� **鍙湪缂撳瓨宸插瓨鍦ㄦ椂鎵嶆洿鏂帮紝鑰屽叏椤圭洰娌℃湁浠讳綍鍦版柟棣栨鍐欏叆**锛�
+      // 浜庢槸 ROOM 缂撳瓨浠庢湭琚垱寤猴紝`room` 鍙椿鍦ㄥ唴瀛橀噷锛�
+      //   路 鍒锋柊椤甸潰 / 鏂板紑鏍囩椤� / 浠庝細璇濇仮澶嶅悗锛宍isSetRoom` 鍙堟槸鍒濆鐨� false锛�
+      //   路 鑰屽悇鍖荤敓椤甸潰锛圧outine/index/DevInstall锛夊彧鍦� `isSetRoom === true` 鏃�
+      //     鎵嶅惎鍔ㄥ彇鏁板畾鏃跺櫒 鈬� **椤甸潰涓�鐗囩┖鐧斤紝鐪嬭捣鏉ュ儚"娌″姞杞芥帓闃熺梾浜�"**锛�
+      //   路 瑙掕壊涓� doctor 鐨勭敤鎴疯繕浼氳璺敱瀹堝崼寮瑰洖 /roomselect 閲嶆柊閫夎瘖瀹ゃ��
+      // 杩欓噷鏀逛负**鏃犳潯浠跺啓鍏�**锛涙仮澶嶈鏂囦欢鏈熬鐨� setupRoomStorePersistence()銆�
+      wsCache.set(CACHE_KEY.ROOM, { isSetRoom: true, room: this.room })
     },
     // 鍖荤敓绂诲骇
     async clearRoomInfoAction() {
@@ -73,12 +77,23 @@
 
       this.isSetRoom = false
 
-      // 鏇存柊 cache
-      const roomInfo = wsCache.get(CACHE_KEY.ROOM)
-      if (roomInfo) {
-        roomInfo.room = null
-        roomInfo.isSetRoom = false
-        wsCache.set(CACHE_KEY.ROOM, roomInfo)
+      // 娓呯紦瀛橈紙涓庝笂闈㈢殑鍐欏叆瀵瑰簲锛岄伩鍏嶄笅娆″惎鍔ㄦ妸宸茬搴х殑璇婂鎭㈠鍑烘潵锛�
+      wsCache.delete(CACHE_KEY.ROOM)
+    },
+    /**
+     * 銆愪慨澶嶃�戝簲鐢ㄥ惎鍔ㄦ椂浠� sessionStorage 鎭㈠銆屽尰鐢熷凡閫夎瘖瀹ゃ�嶃��
+     *
+     * 涓轰粈涔堥渶瑕侊細`isSetRoom` 鏄唴瀛樻�侊紝鍒锋柊鍗充涪锛涜�屽悇鍖荤敓椤甸潰閮介潬瀹冨喅瀹氭槸鍚﹀彇鏁般��
+     * 鎭㈠鏃跺悓鏃舵牎楠岃瘖瀹や俊鎭畬鏁达紙roomId + bedNo锛夛紝閬垮厤鑴忕紦瀛樻寚鍚戜笉瀛樺湪鐨勫伐浣嶃��
+     */
+    restoreRoomInfo() {
+      if (this.isSetRoom && this.room?.roomId != null) {
+        return // 鍐呭瓨閲屽凡鏈夛紝鏃犻渶鎭㈠
+      }
+      const cached = wsCache.get(CACHE_KEY.ROOM)
+      if (cached?.isSetRoom && cached?.room?.roomId != null && cached?.room?.bedNo != null) {
+        this.room = { ...this.room, ...cached.room }
+        this.isSetRoom = true
       }
     },
   }
@@ -87,3 +102,12 @@
 export const useRoomStoreWithOut = () => {
   return useRoomStore(store)
 }
+
+/**
+ * 鍦ㄥ簲鐢ㄥ惎鍔ㄩ樁娈佃皟鐢ㄤ竴娆★紙瑙� src/main.ts锛夛紝鎶娿�屽凡閫夎瘖瀹ゃ�嶄粠 sessionStorage 鎭㈠鍒� store銆�
+ *
+ * 蹇呴』鏃╀簬璺敱瀹堝崼涓庡悇鍖荤敓椤甸潰鐨� onMounted锛屽惁鍒欓〉闈細鍥犱负 isSetRoom=false 鑰屽畬鍏ㄤ笉鍙栨暟銆�
+ */
+export const setupRoomStorePersistence = () => {
+  useRoomStoreWithOut().restoreRoomInfo()
+}
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
index 379eb10..7cbb93c 100644
--- a/src/store/modules/user.ts
+++ b/src/store/modules/user.ts
@@ -3,6 +3,7 @@
 import { getAccessToken, removeToken } from '@/utils/auth'
 import { CACHE_KEY, useCache, deleteUserCache } from '@/hooks/web/useCache'
 import { getInfo, loginOut } from '@/api/login'
+import { releaseBedOnExit } from '@/utils/releaseBed'
 
 const { wsCache } = useCache()
 
@@ -79,6 +80,11 @@
       wsCache.set(CACHE_KEY.USER, userInfo)
     },
     async loginOut() {
+      // 鍏堥噴鏀捐瘖鐤楀簥浣嶏紙鍖荤敓甯稿湪銆岃瘖瀹ら�夋嫨銆嶉〉鍗犱簡搴婁綅灏辩洿鎺ラ��鍑虹郴缁燂級銆�
+      // 鍚庣 `/system/auth/logout` 鍐呴儴铏界劧涔熶細绂诲骇锛屼絾锛�
+      //   鈶� 鑻ヨ璇锋眰澶辫触/缃戠粶涓柇锛屽簥浣嶅氨鐣欏湪鍗犵敤鐘舵�侊紱
+      //   鈶� 鏈帴鍙eけ璐ヤ篃涓嶄細闃绘柇閫�鍑烘祦绋嬶紙releaseBedOnExit 鍐呴儴宸插厹搴曪級銆�
+      await releaseBedOnExit('manual-logout')
       await loginOut()
       removeToken()
       deleteUserCache() // 鍒犻櫎鐢ㄦ埛缂撳瓨
diff --git a/src/utils/checkTypeFormatter.ts b/src/utils/checkTypeFormatter.ts
index 5ffe6c7..d698fa9 100644
--- a/src/utils/checkTypeFormatter.ts
+++ b/src/utils/checkTypeFormatter.ts
@@ -14,3 +14,17 @@
   return checkTypeStore.getExpenseRecognition(checkType)
 }
 
+/**
+ * 璇ユ鏌ラ」鐩槸鍚﹂渶瑕併�岃澶囬鐢ㄣ�嶃��
+ *
+ * 閰嶇疆鏉ユ簮锛歚check_type.need_dev_ready`锛堟鏌ョ被鍨嬬鐞嗛〉鐨勩�岄渶瑕佽澶囬鐢ㄣ�嶅紑鍏筹級銆�
+ * 鐢ㄤ簬銆岃澶囬鐢ㄣ�嶉〉鎷︽埅涓嶅睘浜庢湰娴佺▼鐨勬偅鑰� 鈥斺�� 渚嬪甯歌蹇冪數鍥�(needDevReady=0)
+ * 琚鎷夊埌棰嗙敤椤垫椂鎻愮ず骞堕樆鏂紝閬垮厤"妫�鏌ョ被鎮h�呭嚭鐜板湪璁惧棰嗙敤妯″潡"銆�
+ */
+export const needDevReady = (checkType: number | null | undefined) => {
+  if (checkType == null)
+    return false
+
+  return checkTypeStore.getNeedDevReady(checkType) === 1
+}
+
diff --git a/src/utils/releaseBed.ts b/src/utils/releaseBed.ts
new file mode 100644
index 0000000..54619f7
--- /dev/null
+++ b/src/utils/releaseBed.ts
@@ -0,0 +1,106 @@
+import axios from 'axios'
+import { getAccessToken } from '@/utils/auth'
+
+/**
+ * 閫�鍑虹郴缁熸椂鑷姩閲婃斁璇婄枟搴婁綅锛堥渶姹傦細鍖荤敓甯稿繕璁般�岀搴с�嶅氨閫�鍑虹郴缁燂級銆�
+ *
+ * 鑳屾櫙
+ * ----
+ * 鍖荤敓鍦ㄣ�岃瘖瀹ら�夋嫨銆�(`roomselect`) 椤甸�夊ソ搴婁綅鍚庡嵆**鍗犵敤**璇ュ簥浣�
+ * 锛堝悗绔啓鍦� `clinic_room.doc_id` / `status`锛夈��
+ * 鑻ュ尰鐢熶笉鐐广�岀搴с�嶈�岀洿鎺ラ��鍑虹郴缁燂紝搴婁綅浼氫竴鐩存樉绀鸿鍗犵敤锛屽叾浠栧尰鐢熸棤娉曚娇鐢ㄣ��
+ *
+ * 瑕嗙洊鐨勯��鍑鸿矾寰�
+ * --------------
+ *  1. 鎵嬪姩鐐广�岄��鍑虹櫥褰曘�� 鈫� 鍚庣 `/system/auth/logout` 宸蹭細绂诲骇锛圓uthController锛夛紝
+ *     鏈嚱鏁板湪鍏朵箣鍓嶅啀鍏滀竴娆★紝淇濊瘉鍗充娇 logout 璇锋眰澶辫触涔熷凡閲婃斁锛�
+ *  2. **绌洪棽 30 鍒嗛挓鑷姩鐧诲嚭**锛坄useIdleLogout`锛夆啋 鍘熷厛鍙竻鏈湴鍑瘉銆佷笉璋冨悗绔� 鈬� 搴婁綅涓嶉噴鏀撅紝
+ *     杩欐槸鏈淇鐨勬牳蹇冨満鏅紱
+ *  3. **浠ょ墝澶辨晥/鍒锋柊澶辫触琚己鍒剁櫥鍑�**锛坄config/axios/service.ts` 鐨� `handleAuthorized`锛夛紱
+ *  4. 鍏抽棴/鍒锋柊椤甸潰鍓嶇殑 `pagehide` 鍏滃簳銆�
+ *
+ * 涓轰粈涔堢敤**瑁� axios** 鑰屼笉鏄」鐩殑 request
+ * ----------------------------------------
+ * 椤圭洰鐨� `request` 鎸備簡 401 鎷︽埅鍣紝鑰屾湰鍑芥暟**鎭版伆鏄湪 401 涔嬪悗**琚皟鐢ㄧ殑銆�
+ * 鑻ヨ蛋鎷︽埅鍣紝浼氬啀娆¤Е鍙�"鍒锋柊浠ょ墝澶辫触 鈫� 寮哄埗鐧诲嚭 鈫� 鍐嶈皟鏈嚱鏁�"鐨勯�掑綊銆�
+ * 瑁� axios 涓嶆寕浠讳綍鎷︽埅鍣紝澶╃劧鏂紑杩欐潯閾俱��
+ *
+ * 涓轰粈涔堢敤**鏈嶅姟绔寜 userId 鍙嶆煡**鑰屼笉鏄墠绔紶搴婁綅鍙�
+ * ------------------------------------------------
+ * 鏈嚱鏁拌繍琛屾椂鍓嶇缂撳瓨鍙兘宸茶娓呯悊锛堟嬁涓嶅埌 roomId/bedNo锛夛紱涓斿墠绔紦瀛樿嫢涓庡簱涓笉涓�鑷�
+ * 灏变細"閲婃斁涓嶆帀"銆傛晠鍚庣鎻愪緵鏃犲弬鎺ュ彛 `/ecg/doctor/release-my-beds`锛屾寜褰撳墠鐧诲綍鐢ㄦ埛
+ * 鍙嶆煡鍏跺崰鐢ㄧ殑鍏ㄩ儴搴婁綅銆傚墠绔彧闇�甯︿笂浠ょ墝銆�
+ *
+ * 鈿狅笍 鏈枃浠�**涓嶈 import `@/config/axios/config`**锛�
+ *   `config/axios/service.ts` 闇�瑕� import 鏈枃浠讹紙鍦� 401 澶勭悊閲岄噴鏀惧簥浣嶏級锛�
+ *   鑻ユ湰鏂囦欢鍙嶅悜 import 瀹冪殑 config锛屼細褰㈡垚寰幆渚濊禆銆�
+ *   杩欓噷鐩存帴鐢ㄥ悓涓�涓幆澧冨彉閲忔嫾鎺ワ紝鏁堟灉绛変环涓旀棤鐜��
+ *
+ * 澶辫触澶勭悊锛氭湰鍑芥暟**姘镐笉鎶涘紓甯�**锛堥��鍑烘祦绋嬩笉搴斿洜瀹冭�屼腑鏂級銆�
+ */
+
+/** API 鍩虹璺緞锛堜笌 `config/axios/config.ts` 鐨� base_url 璁$畻鏂瑰紡涓�鑷达紝閬垮厤寰幆渚濊禆锛� */
+const BASE_URL = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL
+
+/** 淇濊瘉鍚屼竴杞��鍑哄彧璋冪敤涓�娆★紙澶氫釜閫�鍑鸿矾寰勫彲鑳藉悓鏃惰Е鍙戯級 */
+let releasing = false
+
+export async function releaseBedOnExit(reason?: string): Promise<void> {
+  if (releasing) return
+
+  const token = getAccessToken()
+  if (!token) return // 鏃犱护鐗� 鈬� 鏈潵灏辨病鐧诲綍锛屾棤闇�閲婃斁
+
+  releasing = true
+  try {
+    await axios.post(
+      `${BASE_URL}/ecg/doctor/release-my-beds`,
+      {},
+      {
+        headers: { Authorization: 'Bearer ' + token },
+        timeout: 3000 // 閫�鍑烘祦绋嬩笉鑳戒箙绛�
+      }
+    )
+    console.info('[release-bed] 宸茶姹傞噴鏀惧簥浣�', reason ?? '')
+  } catch (e) {
+    // 闈欓粯澶辫触锛氶��鍑烘祦绋嬩笉搴旇闃诲锛堜緥濡備护鐗屽凡杩囨湡銆佺綉缁滀腑鏂級
+    console.warn('[release-bed] 閲婃斁搴婁綅澶辫触锛堝拷鐣ワ級', reason ?? '', e)
+  } finally {
+    releasing = false
+  }
+}
+
+/**
+ * 娉ㄥ唽 `pagehide` 鍏滃簳锛氬叧闂爣绛鹃〉/鍒锋柊/璺宠蛋鏃跺皾璇曢噴鏀惧簥浣嶃��
+ *
+ * 鐢� `sendBeacon` 鑰岄潪 ajax 鈥斺�� 椤甸潰鍗歌浇鏃舵櫘閫氳姹備細琚祻瑙堝櫒鍙栨秷锛宐eacon 涓嶄細銆�
+ * 浣� beacon **鏃犳硶鑷畾涔夎姹傚ご**锛堜笉鑳藉甫 Authorization锛夛紝鏁呮敼鐢� URL 浼犱护鐗岋細
+ * 鍚庣 `SecurityProperties.tokenParameter` 榛樿灏辨槸 `"token"`锛�
+ * 涓� `TokenAuthenticationFilter` 浼氳鍙栧畠锛堣 `obtainAuthorization`锛夈��
+ *
+ * 娉ㄦ剰锛氭湰椤规槸**灏藉姏鑰屼负**鐨勫厹搴曪紝涓嶄綔涓轰富瑕佹墜娈� 鈥斺��
+ * 涓昏鎵嬫鏄笂闈� 1/2/3 涓夋潯鏄庣‘璺緞銆�
+ */
+export function setupBedReleaseOnUnload(): void {
+  if (typeof window === 'undefined') return
+  // 骞傜瓑锛氶伩鍏� HMR / 閲嶅璋冪敤瀵艰嚧閲嶅娉ㄥ唽
+  if ((window as any).__bedReleaseUnloadBound) return
+  ;(window as any).__bedReleaseUnloadBound = true
+
+  window.addEventListener('pagehide', () => {
+    const token = getAccessToken()
+    if (!token) return
+    try {
+      const url = `${BASE_URL}/ecg/doctor/release-my-beds?token=${encodeURIComponent(token)}`
+      const ok = navigator.sendBeacon?.(url)
+      if (!ok) {
+        // sendBeacon 涓嶅彲鐢�/琚嫆缁濇椂锛岄��鍥炲悓姝� XHR 鏈�鍚庝竴鎼�
+        const xhr = new XMLHttpRequest()
+        xhr.open('POST', url, false) // 鍚屾锛岀‘淇濆嵏杞藉墠鍙戝嚭
+        xhr.send()
+      }
+    } catch {
+      /* 蹇界暐锛氬嵏杞介樁娈典笉搴旀姤閿� */
+    }
+  })
+}
diff --git a/src/views/ecg/appointment/AppointmentConfirm.vue b/src/views/ecg/appointment/AppointmentConfirm.vue
index d78ced3..38c7968 100644
--- a/src/views/ecg/appointment/AppointmentConfirm.vue
+++ b/src/views/ecg/appointment/AppointmentConfirm.vue
@@ -11,7 +11,7 @@
   </div>
   <div style="color: #ff0000; text-align: center; font-size: 12px; margin-top: 4px">
     <i class="el-icon-warning" style="margin-right: 4px"></i>
-    鏀寔韬唤璇佸彿锛岀敵璇峰崟鍙凤紝灏辫瘖娴佹按鍙凤紝浣忛櫌鍙�
+    鏀寔韬唤璇佸彿锛屾垨鐢宠鍗曞彿锛屾垨灏辫瘖鍙凤紝鎴栦綇闄㈠彿
   </div>
 
   <div style="display: flex; flex-wrap: wrap; justify-content: center; margin-bottom: 20px">
@@ -22,86 +22,45 @@
 
   <el-divider />
 
-  <el-form ref="formRef" :model="formData" label-width="100px" class="two-column-form">
-    <div class="form-row">
-      <el-form-item label="鎮h�呭鍚�" prop="patName">
-        <el-input v-model="formData.patName" placeholder="鎮h�呭鍚�" readonly />
-      </el-form-item>
+  <!-- 鏍囬**濮嬬粓鏄剧ず**锛堝師鍏堟棤鎮h�呮椂鏁翠釜鍖哄潡琚� v-if 闅愯棌锛岄〉闈㈡樉寰楃┖鐧斤級 -->
+  <div class="patient-info-title">鎮h�呴绾︿俊鎭�</div>
 
-      <el-form-item label="鎮h�呯敓鏃�" prop="patBirthday">
-        <el-date-picker
-          v-model="formData.patBirthday"
-          type="date"
-          value-format="x"
-          placeholder="閫夋嫨鎮h�呯敓鏃�"
-          readonly
-        />
-      </el-form-item>
-    </div>
-    <div class="form-row">
-      <el-form-item label="鎮h�呮�у埆" prop="patGender">
-        <el-radio-group v-model="formData.patGender" readonly>
-          <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
-            :key="dict.value"
-            :value="dict.value"
-          >
-            {{ dict.label }}
-          </el-radio>
-        </el-radio-group>
-      </el-form-item>
+  <!--
+    闇�姹�10锛氶绾︾鍒扮殑鎮h�呬俊鎭渶鏄剧ず锛�
+      鏉ユ簮锛堥棬璇�/鎬ヨ瘖/浣忛櫌/浣撴锛夈�佸氨璇婂崱鍙枫�佹祦姘村彿銆佸勾榫勩�佺梾鍖恒�佸簥鍙枫��
+      鐧昏鏃堕棿銆佺數璇濄�佸紑鍗曟棩鏈熴�佽窛浠婂ぉ鏁般�佸尰鍢卞彿銆佸紑鍗曞尰甯�
 
-      <el-form-item label="澶氳�愯嵂" prop="tolerance">
-        <!-- 闇�姹�6锛氱粺涓�璧板瓧鍏� ecg_tolerance锛�0=鏃� 1=澶氳�� 2=澶氶噸鑰愯嵂锛夛紱NULL 鎸�"鏃�"鏄剧ず锛圦12锛夈��
-             鍘熷厛纭紪鐮� v-if==0鈫掑惁 / v-else鈫掓槸锛屾枃妗堜笌瀛楀吀涓嶄竴鑷淬�� -->
-        <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" />
-      </el-form-item>
+    杩欓噷鐩存帴澶嶇敤**鍖荤敓绔悓涓�濂�**銆屾偅鑰呬俊鎭睍绀哄潡銆�(PatientInfoBlock)锛�
+    鑰屼笉鏄湪鏈〉鍙﹀啓涓�浠� 鈥斺�� 鍘熷洜锛�
+      路 璇ョ粍浠跺凡鍖呭惈闇�姹�1 瑕佹眰鐨勫叏閮� 18 椤癸紝涓婅堪 12 椤瑰叏閮ㄦ兜鐩栵紱
+      路 閬垮厤鍚屼竴浠芥偅鑰呬俊鎭湪澶氬鍚勫啓涓�閬嶈�屽彛寰勪笉涓�鑷�
+        锛堟湰椤圭洰姝ゅ墠澶氭鍑虹幇"鍚屼竴瀛楁鍚勯〉闈㈡樉绀轰笉鍚�"鐨勯棶棰橈級銆�
+    鍙傛暟璇存槑锛�
+      路 span = 6 鈫� **涓�琛屽洓鍒�**锛堜笌鍖荤敓绔悇椤甸潰淇濇寔涓�鑷达級锛�
+      路 statusDict 浼� ecg_status锛堥绾﹀崟鐘舵�佸瓧鍏革級锛岃�岄潪闃熷垪鐘舵�佸瓧鍏革紱
+      路 showSeqNum 浼� false 鈥斺�� 棰勭害璁板綍灏氭棤鎺掗槦搴忓彿锛堢鍒板悗鎵嶄骇鐢燂級銆�
+  -->
+  <div class="patient-info-wrap">
+    <PatientInfoBlock
+      v-if="formData.patId"
+      :data="formData"
+      :span="6"
+      :status-dict="DICT_TYPE.ECG_STATUS"
+      :show-seq-num="false"
+    />
+    <!-- 鏃犳偅鑰呮椂鐨勫崰浣嶏細淇濈暀鍖哄潡涓庢爣棰樼殑瑙嗚瀹屾暣鎬э紝閬垮厤澶х墖鐣欑櫧 -->
+    <div v-else class="patient-info-placeholder">
+      <Icon icon="ep:user" class="placeholder-icon" />
+      <div class="placeholder-text">璇疯緭鍏ユ偅鑰呯紪鍙峰悗鏌ヨ棰勭害淇℃伅</div>
+      <div class="placeholder-hint">鏀寔韬唤璇佸彿銆佺敵璇峰崟鍙枫�佸氨璇婂彿鎴栦綇闄㈠彿</div>
     </div>
-    <div class="form-row">
-      <el-form-item label="鎮h�呮墜鏈�" prop="patMobile">
-        <el-input v-model="formData.patMobile" placeholder="璇疯緭鍏ユ偅鑰呮墜鏈�" readonly />
-      </el-form-item>
-      <!--
-      <el-form-item label="鎮h�呯數璇�" prop="patPhone" readonly>
-        <el-input v-model="formData.patPhone" placeholder="璇疯緭鍏ユ偅鑰呯數璇�" />
-      </el-form-item>
--->
-      <el-form-item label="韬唤璇佸彿" prop="patIdentityId">
-        <el-input v-model="formData.patIdentityId" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" readonly />
-      </el-form-item>
-    </div>
-    <div class="form-row">
-      <!--
-      <el-form-item label="鐥呭尯浠g爜" prop="patWardCode" readonly>
-        <el-input v-model="formData.patWardCode" placeholder="璇疯緭鍏ョ梾鍖轰唬鐮�" />
-      </el-form-item>
--->
-      <el-form-item label="鐥呭尯鍚嶇О" prop="patWardDesc">
-        <el-input v-model="formData.patWardDesc" placeholder="璇疯緭鍏ョ梾鍖哄悕绉�" readonly />
-      </el-form-item>
-      <el-form-item label="搴婂彿" prop="patBedNo">
-        <el-input v-model="formData.patBedNo" placeholder="璇疯緭鍏ュ簥鍙�" readonly />
-      </el-form-item>
-    </div>
-    <div class="form-row">
-      <!--
-            <el-form-item label="绉戝浠g爜" prop="patDeptCode" readonly>
-              <el-input v-model="formData.patDeptCode" placeholder="璇疯緭鍏ョ瀹や唬鐮�" />
-            </el-form-item>
-      -->
-      <el-form-item label="绉戝鍚嶇О" prop="patDeptDesc">
-        <el-input v-model="formData.patDeptDesc" placeholder="璇疯緭鍏ョ瀹ゅ悕绉�" readonly />
-      </el-form-item>
-      <el-form-item label="鎮h�呭湴鍧�" prop="patAddr">
-        <el-input v-model="formData.patAddr" placeholder="璇疯緭鍏ユ偅鑰呭湴鍧�" readonly />
-      </el-form-item>
-    </div>
-  </el-form>
+  </div>
 </template>
 <script setup lang="ts">
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { AppointmentApi, AppointmentVO } from '@/api/ecg/appointment'
 import CheckItemPanel from '@/views/ecg/appointment/CheckItemPanel.vue'
+import PatientInfoBlock from '@/views/ecg/doctor/components/PatientInfoBlock.vue'
 import { getCheckTypeName } from '@/utils/checkTypeFormatter'
 
 /** 棰勭害纭 琛ㄥ崟 */
@@ -220,14 +179,47 @@
 </script>
 
 <style lang="scss" scoped>
-.two-column-form .form-row {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 20px;
+.patient-info-title {
+  font-size: 15px;
+  font-weight: 600;
+  margin-bottom: 12px;
+  padding-left: 8px;
+  border-left: 3px solid var(--el-color-primary);
 }
 
-.two-column-form .form-row .el-form-item {
-  width: 48%;
+/* 鎮h�呬俊鎭尯鍧楋細濮嬬粓鍗犳嵁鍥哄畾瑙嗚鑼冨洿锛屾棤璁烘湁鏃犳偅鑰咃紝椤甸潰閮戒笉浼氭樉寰楃┖鐧� */
+.patient-info-wrap {
+  min-height: 120px;
+  padding: 12px 16px;
+  border: 1px dashed var(--el-border-color);
+  border-radius: 6px;
+  background-color: var(--el-fill-color-lighter);
+}
+
+/* 鏃犳偅鑰呮椂鐨勫崰浣嶆彁绀� */
+.patient-info-placeholder {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  min-height: 96px;
+  color: var(--el-text-color-secondary);
+
+  .placeholder-icon {
+    font-size: 28px;
+    margin-bottom: 8px;
+    opacity: 0.5;
+  }
+
+  .placeholder-text {
+    font-size: 14px;
+  }
+
+  .placeholder-hint {
+    font-size: 12px;
+    margin-top: 4px;
+    opacity: 0.7;
+  }
 }
 
 .el-form-item {
diff --git a/src/views/ecg/appointment/AppointmentForm.vue b/src/views/ecg/appointment/AppointmentForm.vue
index 7cd3e5e..65ecbfd 100644
--- a/src/views/ecg/appointment/AppointmentForm.vue
+++ b/src/views/ecg/appointment/AppointmentForm.vue
@@ -70,8 +70,8 @@
       </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="妫�鏌ョ被鍨�" prop="bookCheckType">
-            <el-select v-model="formData.bookCheckType" placeholder="璇烽�夋嫨妫�鏌ョ被鍨�">
+          <el-form-item label="妫�鏌ラ」鐩�" prop="bookCheckType">
+            <el-select v-model="formData.bookCheckType" placeholder="璇烽�夋嫨妫�鏌ラ」鐩�">
               <el-option
                 v-for="dict in checkTypeStore.getCheckTypeOptions()"
                 :key="dict.value"
@@ -203,7 +203,7 @@
   // bookId: [{ required: true, message: '棰勭害缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }],
   bookDate: [{ required: true, message: '棰勭害鏃ユ湡涓嶈兘涓虹┖', trigger: 'blur' }],
   bookTimeslot: [{ required: true, message: '棰勭害妫�鏌ユ椂闂存涓嶈兘涓虹┖', trigger: 'blur' }],
-  bookCheckType: [{ required: true, message: '棰勭害妫�鏌ョ被鍨嬩笉鑳戒负绌�', trigger: 'change' }]
+  bookCheckType: [{ required: true, message: '棰勭害妫�鏌ラ」鐩笉鑳戒负绌�', trigger: 'change' }]
 })
 const formRef = ref() // 琛ㄥ崟 Ref
 
diff --git a/src/views/ecg/appointment/alter.vue b/src/views/ecg/appointment/alter.vue
index 1ce575b..f8a5f67 100644
--- a/src/views/ecg/appointment/alter.vue
+++ b/src/views/ecg/appointment/alter.vue
@@ -64,10 +64,10 @@
           class="!w-240px"
         />
       </el-form-item> -->
-      <el-form-item label="妫�鏌ョ被鍨�" prop="bookCheckType">
+      <el-form-item label="妫�鏌ラ」鐩�" prop="bookCheckType">
         <el-select
           v-model="queryParams.bookCheckType"
-          placeholder="璇烽�夋嫨妫�鏌ョ被鍨�"
+          placeholder="璇烽�夋嫨妫�鏌ラ」鐩�"
           clearable
           class="!w-240px"
         >
@@ -158,8 +158,8 @@
       :stripe="true"
       :show-overflow-tooltip="true"
     >
-      <el-table-column label="灏辫瘖娴佹按鍙�" align="center" prop="episodeId" min-width="110px" />
-      <el-table-column label="鐢宠鍙�" align="center" prop="applyNo" min-width="110px" />
+      <el-table-column label="鐢宠鍗曞彿" align="center" prop="applyNo" min-width="110px" />
+      <el-table-column label="鎮h�呯紪鍙�" align="center" prop="patId" />
       <el-table-column label="濮撳悕" align="center" min-width="160px">
         <template #default="scope">
           {{ scope.row.patName }}
@@ -174,10 +174,9 @@
         :formatter="dateFormatter2"
         width="110px"
       />
-      <el-table-column label="鐥呭尯鍚嶇О" align="center" prop="patWardDesc" />
+      <el-table-column label="灏辫瘖鍙�" align="center" prop="episodeId" min-width="110px" />
+      <el-table-column label="鐥呭尯" align="center" prop="patWardDesc" />
       <el-table-column label="搴婂彿" align="center" prop="patBedNo" />
-
-      <el-table-column label="缂栧彿" align="center" prop="patId" />
       <!--
       <el-table-column label="缂磋垂" align="center" prop="paid">
         <template #default="scope">
@@ -198,7 +197,7 @@
           <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
         </template>
       </el-table-column>
-      <el-table-column label="棰勭害妫�鏌ョ被鍨�" align="center" prop="bookCheckType" min-width="120px">
+      <el-table-column label="妫�鏌ラ」鐩�" align="center" prop="bookCheckType" min-width="120px">
         <template #default="scope">
           {{ getCheckTypeName(scope.row.bookCheckType) }}
         </template>
diff --git a/src/views/ecg/appointment/index.vue b/src/views/ecg/appointment/index.vue
index df9b147..48bb190 100644
--- a/src/views/ecg/appointment/index.vue
+++ b/src/views/ecg/appointment/index.vue
@@ -1,41 +1,20 @@
 <template>
   <ContentWrap>
     <!-- 鎼滅储宸ヤ綔鏍� -->
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="68px"
-    >
+    <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
       <el-form-item label="缂栧彿" prop="patId">
-        <el-input
-          v-model="queryParams.patId"
-          placeholder="璇疯緭鍏ョ紪鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patId" placeholder="璇疯緭鍏ョ紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎮h�呭鍚�" prop="patName">
-        <el-input
-          v-model="queryParams.patName"
-          placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patName" placeholder="璇疯緭鍏ユ偅鑰呭鍚�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎮h�呮墜鏈�" prop="patMobile">
-        <el-input
-          v-model="queryParams.patMobile"
-          placeholder="璇疯緭鍏ユ偅鑰呮墜鏈�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patMobile" placeholder="璇疯緭鍏ユ偅鑰呮墜鏈�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
-<!--
+      <!--
       <el-form-item label="鎮h�呯數璇�" prop="patPhone">
         <el-input
           v-model="queryParams.patPhone"
@@ -47,13 +26,8 @@
       </el-form-item>
 -->
       <el-form-item label="韬唤璇佸彿" prop="patIdentityId">
-        <el-input
-          v-model="queryParams.patIdentityId"
-          placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patIdentityId" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <!-- <el-form-item label="棰勭害缂栧彿" prop="applyNo">
         <el-input
@@ -64,40 +38,21 @@
           class="!w-240px"
         />
       </el-form-item> -->
-      <el-form-item label="妫�鏌ョ被鍨�" prop="bookCheckType">
-        <el-select
-          v-model="queryParams.bookCheckType"
-          placeholder="璇烽�夋嫨妫�鏌ョ被鍨�"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in checkTypeStore.getCheckTypeOptions()"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
+      <el-form-item label="妫�鏌ラ」鐩�" prop="bookCheckType">
+        <el-select v-model="queryParams.bookCheckType" placeholder="璇烽�夋嫨妫�鏌ラ」鐩�" clearable class="!w-240px">
+          <el-option v-for="dict in checkTypeStore.getCheckTypeOptions()" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鐧昏鏃堕棿" prop="registerTime">
-        <el-select
-          v-model="queryParams.registerTime"
-          placeholder="璇烽�夋嫨妫�鏌ョ被鍨�"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in opeionregister"
-            :key="dict.value"
-            :label="dict.value"
-            :value="dict.value"
-          />
+        <el-select v-model="queryParams.registerTime" placeholder="璇烽�夋嫨妫�鏌ラ」鐩�" clearable class="!w-240px">
+          <el-option v-for="dict in opeionregister" :key="dict.value" :label="dict.value" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鐥呭尯" prop="patWardDesc">
         <el-input v-model="queryParams.patWardDesc" placeholder="璇疯緭鍏ョ梾鍖哄悕绉�" readonly />
       </el-form-item>
-<!--
+      <!--
       <el-form-item label="棰勭害鏉ユ簮" prop="bookSrc">
         <el-input
           v-model="queryParams.bookSrc"
@@ -109,23 +64,17 @@
       </el-form-item>
 -->
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button>
-        <el-button
-          type="primary"
-          plain
-          @click="openForm('create')"
-          v-hasPermi="['ecg:appointment:create']"
-        >
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" /> 鎼滅储
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆
+        </el-button>
+        <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['ecg:appointment:create']">
           <Icon icon="ep:plus" class="mr-5px" /> 鏂板
         </el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-          v-hasPermi="['ecg:appointment:export']"
-        >
+        <el-button type="success" plain @click="handleExport" :loading="exportLoading"
+          v-hasPermi="['ecg:appointment:export']">
           <Icon icon="ep:download" class="mr-5px" /> 瀵煎嚭
         </el-button>
       </el-form-item>
@@ -135,9 +84,9 @@
   <!-- 鍒楄〃 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="appointmentList" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="灏辫瘖娴佹按鍙�" align="center" prop="episodeId" min-width="110px"/>
-      <el-table-column label="鐢宠鍙�" align="center" prop="applyNo" min-width="110px"/>
-      <el-table-column label="缂栧彿" align="center" prop="patId" />
+      <el-table-column label="鐢宠鍙�" align="center" prop="applyNo" min-width="110px" />
+      <el-table-column label="鎮h�呯紪鍙�" align="center" prop="patId" />
+      <el-table-column label="灏辫瘖鍙�" align="center" prop="episodeId" min-width="110px" />
       <!-- 鏈垪鏍囩鐢便�屽氨璇婂崱鍙枫�嶆敼涓恒�岄棬璇婂彿銆嶏紙缁忕‘璁わ級銆傚師鍥狅紙璇﹁銆婇儴缃叉竻鍗曘��5.1锛夛細
            HIS 鍦ㄥ崱鍙锋Ы浣嶄紶绌猴紝medical_card 鍏ㄥ簱 159,116 琛�**鏃犱竴闈炵┖**锛�
            瀹炴祴璇ュ垪 99.9% 鏄剧ず鐨勬槸 outpatient_no锛�65% 褰㈠韬唤璇併��35% 涓洪棬璇婂彿锛夈��
@@ -152,24 +101,27 @@
           </el-tag>
         </template>
       </el-table-column>
-      <!-- 闇�姹�1锛氬尰鍢卞彿锛圚IS observationRequest.id.item[root=2.16.156.10011.1.28]锛夈��
-           璇ヨ妭鐐瑰湪瑙勮寖涓潪蹇呴』椤癸紝鍘嗗彶鏁版嵁锛堟柊澧炲垪涔嬪墠閲囬泦鐨勶級涓虹┖锛屾樉绀� '-'銆� -->
-      <el-table-column label="鍖诲槺鍙�" align="center" prop="doctorAdviceNo" min-width="110px">
-        <template #default="scope">
-          {{ scope.row.doctorAdviceNo || '-' }}
-        </template>
-      </el-table-column>
-<!--
-      <el-table-column label="缂磋垂" align="center" prop="paid">
-        <template #default="scope">
-          {{scope.row.paid == 1 ? "宸蹭粯" : ""}}
-        </template>
-      </el-table-column>
--->
       <el-table-column label="濮撳悕" align="center" min-width="160px">
         <template #default="scope">
-          {{scope.row.patName}} <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" />
+          {{ scope.row.patName }} <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" />
           <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="棰勭害鏃ユ湡" align="center" prop="bookDate" :formatter="dateFormatter2" width="120px" />
+      <el-table-column label="棰勭害鏃堕棿娈�" align="center" prop="bookTimeslot" width="100px">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
+        </template>
+      </el-table-column>
+      <el-table-column label="妫�鏌ラ」鐩�" align="center" prop="bookCheckType" min-width="120px">
+        <template #default="scope">
+          {{ getCheckTypeName(scope.row.bookCheckType) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="缂磋垂" align="center" prop="paid">
+        <template #default="scope">
+          {{ scope.row.paid == 1 ? "宸蹭粯" : "" }}
         </template>
       </el-table-column>
       <!-- 闇�姹�1锛氱姸鎬� -->
@@ -177,11 +129,8 @@
            鐘舵�� '0'锛堟湭鐧昏锛夋槸鍚堟硶鍊硷紝鐪熷�煎垽鏂細鎶婂畠璇垽涓�"鏃犳暟鎹�"鑰屾樉绀� '-' -->
       <el-table-column label="鐘舵��" align="center" prop="status" width="110px">
         <template #default="scope">
-          <dict-tag
-            v-if="scope.row.status !== null && scope.row.status !== undefined && scope.row.status !== ''"
-            :type="DICT_TYPE.ECG_STATUS"
-            :value="scope.row.status"
-          />
+          <dict-tag v-if="scope.row.status !== null && scope.row.status !== undefined && scope.row.status !== ''"
+            :type="DICT_TYPE.ECG_STATUS" :value="scope.row.status" />
           <span v-else>-</span>
         </template>
       </el-table-column>
@@ -200,62 +149,39 @@
       <el-table-column label="寮�鍗曞尰甯�" align="center" prop="doctor" min-width="100px">
         <template #default="scope">{{ scope.row.doctor || '-' }}</template>
       </el-table-column>
-      <el-table-column
-          label="棰勭害鏃ユ湡"
-          align="center"
-          prop="bookDate"
-          :formatter="dateFormatter2"
-          width="120px"
-      />
-      <el-table-column label="棰勭害鏃堕棿娈�" align="center" prop="bookTimeslot" width="100px">
+      <!-- 闇�姹�1锛氬尰鍢卞彿锛圚IS observationRequest.id.item[root=2.16.156.10011.1.28]锛夈��
+           璇ヨ妭鐐瑰湪瑙勮寖涓潪蹇呴』椤癸紝鍘嗗彶鏁版嵁锛堟柊澧炲垪涔嬪墠閲囬泦鐨勶級涓虹┖锛屾樉绀� '-'銆� -->
+      <el-table-column label="鍖诲槺鍙�" align="center" prop="doctorAdviceNo" min-width="110px">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
+          {{ scope.row.doctorAdviceNo || '-' }}
         </template>
       </el-table-column>
-      <el-table-column label="棰勭害妫�鏌ョ被鍨�" align="center" prop="bookCheckType" min-width="120px">
-        <template #default="scope">
-          {{getCheckTypeName(scope.row.bookCheckType)}}
-        </template>
-      </el-table-column>
-      <el-table-column label="鐢熸棩" align="center" prop="patBirthday" :formatter="dateFormatter2" width="110px"/>
-      <el-table-column label="鎵嬫満" align="center" prop="patMobile" />
-<!--      <el-table-column label="鐢佃瘽" align="center" prop="patPhone" />-->
-<!--      <el-table-column label="韬唤璇佸彿" align="center" prop="patIdentityId" />-->
-      <el-table-column label="鍦板潃" align="center" prop="patAddr" />
       <el-table-column label="鐧昏鏃堕棿" align="center" prop="registerDate" />
       <el-table-column label="绉戝浠g爜" align="center" prop="patDeptCode" />
       <el-table-column label="绉戝鍚嶇О" align="center" prop="patDeptDesc" />
       <el-table-column label="鐥呭尯浠g爜" align="center" prop="patWardCode" />
       <el-table-column label="鐥呭尯鍚嶇О" align="center" prop="patWardDesc" />
       <el-table-column label="搴婂彿" align="center" prop="patBedNo" />
+      <el-table-column label="鐢熸棩" align="center" prop="patBirthday" :formatter="dateFormatter2" width="110px" />
+      <el-table-column label="鎵嬫満" align="center" prop="patMobile" />
+      <!--      <el-table-column label="鐢佃瘽" align="center" prop="patPhone" />-->
+      <!--      <el-table-column label="韬唤璇佸彿" align="center" prop="patIdentityId" />-->
+      <el-table-column label="鍦板潃" align="center" prop="patAddr" />
       <el-table-column label="鎿嶄綔" align="center" min-width="120px">
         <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="openForm('update', scope.row.id)"
-            v-hasPermi="['ecg:appointment:update']"
-          >
+          <el-button link type="primary" @click="openForm('update', scope.row.id)"
+            v-hasPermi="['ecg:appointment:update']">
             缂栬緫
           </el-button>
-          <el-button
-            link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-            v-hasPermi="['ecg:appointment:delete']"
-          >
+          <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['ecg:appointment:delete']">
             鍒犻櫎
           </el-button>
         </template>
       </el-table-column>
     </el-table>
     <!-- 鍒嗛〉 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
+      @pagination="getList" />
   </ContentWrap>
 
   <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
@@ -263,15 +189,15 @@
 </template>
 
 <script setup lang="ts">
-import {DICT_TYPE} from '@/utils/dict'
+import { DICT_TYPE } from '@/utils/dict'
 import { dateFormatter2 } from '@/utils/formatTime'
 // 闇�姹�1锛氬勾榫� / 璺濅粖澶╂暟 / 寮�鍗曟棩鏈熸牸寮忓寲锛堝簱涓棤瀵瑰簲鍒楋紝闇�瀹炴椂璁$畻锛�
 import { formatAge, formatDaysFromOrder, formatDateTime, resolveCardNo } from '@/utils/patientInfo'
 import download from '@/utils/download'
 import { AppointmentApi, AppointmentVO } from '@/api/ecg/appointment'
 import AppointmentForm from './AppointmentForm.vue'
-import {useCheckTypeStore} from "@/store/modules/checkType";
-import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
+import { useCheckTypeStore } from "@/store/modules/checkType";
+import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
 
 /** 棰勭害 鍒楄〃 */
 defineOptions({ name: 'Appointment' })
@@ -286,7 +212,7 @@
   pageNo: 1,
   pageSize: 10,
   applyNo: undefined,
-  registerTime:undefined,
+  registerTime: undefined,
   patId: undefined,
   patName: undefined,
   patGender: undefined,
@@ -307,9 +233,9 @@
 })
 const queryFormRef = ref() // 鎼滅储鐨勮〃鍗�
 const opeionregister = ref([
-  {value:'鍏ㄩ儴',label:'鍏ㄩ儴'},
-  {value:'涓婂崍',label:'涓婂崍'},
-  {value:'涓嬪崍',label:'涓嬪崍'}
+  { value: '鍏ㄩ儴', label: '鍏ㄩ儴' },
+  { value: '涓婂崍', label: '涓婂崍' },
+  { value: '涓嬪崍', label: '涓嬪崍' }
 ]) // 鎼滅储鐨勮〃鍗�
 const exportLoading = ref(false) // 瀵煎嚭鐨勫姞杞戒腑
 
@@ -355,7 +281,7 @@
     message.success(t('common.delSuccess'))
     // 鍒锋柊鍒楄〃
     await getList()
-  } catch {}
+  } catch { }
 }
 
 /** 瀵煎嚭鎸夐挳鎿嶄綔 */
diff --git a/src/views/ecg/callingscreen/bigscreen2.vue b/src/views/ecg/callingscreen/bigscreen2.vue
index 58a132c..57bfe3f 100644
--- a/src/views/ecg/callingscreen/bigscreen2.vue
+++ b/src/views/ecg/callingscreen/bigscreen2.vue
@@ -1,5 +1,5 @@
 <!--
-涓嶅垎妫�鏌ョ被鍨嬬殑瀹炵幇鐗堟湰 - 鏆傛椂淇濈暀
+涓嶅垎妫�鏌ラ」鐩殑瀹炵幇鐗堟湰 - 鏆傛椂淇濈暀
 -->
 <script setup lang="ts">
 
diff --git a/src/views/ecg/checktype/CheckTypeForm.vue b/src/views/ecg/checktype/CheckTypeForm.vue
index 2d95175..8e2badf 100644
--- a/src/views/ecg/checktype/CheckTypeForm.vue
+++ b/src/views/ecg/checktype/CheckTypeForm.vue
@@ -1,77 +1,128 @@
 <template>
-  <Dialog :title="dialogTitle" v-model="dialogVisible">
+  <Dialog :title="dialogTitle" v-model="dialogVisible" width="900px">
+    <!--
+      闇�姹�9锛氱紪杈戦〉鐢便�屼竴鍒楀竷灞�銆嶆敼涓恒�屼竴琛屼袱鍒楀竷灞�銆嶏紝閬垮厤椤甸潰杩囬暱銆�
+      鐢� el-row / el-col 瀹炵幇锛氶粯璁ゆ瘡椤� :span="12"锛堝崐琛岋級锛�
+      浠ヤ笅涓夐」**鍗曞崰涓�琛�** :span="24"锛�
+        路 鏄剧ず鎮h�呮潯鐮侊紙澶氶�夛紝闇�瑕佹í鍚戠┖闂达級
+        路 鎺掗槦搴忓彿瑙勫垯锛堝甫涓夎璇存槑鏂囧瓧锛�
+        路 浜插拰椤圭洰锛堝閫夛紝椤圭洰澶氭椂涓�琛屾斁涓嶄笅锛�
+    -->
     <el-form
       ref="formRef"
       :model="formData"
       :rules="formRules"
-      label-width="140px"
+      label-width="130px"
       v-loading="formLoading"
     >
-      <el-form-item label="妫�鏌ョ被鍨嬪悕" prop="name">
-        <el-input v-model="formData.name" placeholder="璇疯緭鍏ユ鏌ョ被鍨嬪悕" />
-      </el-form-item>
-      <el-form-item label="妫�鏌ョ被鍨嬪��" prop="value">
-        <el-input v-model="formData.value" placeholder="璇疯緭鍏ユ鏌ョ被鍨嬪��" />
-      </el-form-item>
-      <el-form-item label="鍏佽鍑嗗涓汉鏁�" prop="readyNum">
-        <el-input v-model="formData.readyNum" placeholder="璇疯緭鍏ュ厑璁稿噯澶囦腑浜烘暟" />
-      </el-form-item>
-      <el-form-item label="闇�瑕佽澶囬鐢�" prop="needDevReady">
-        <el-switch
-            v-model="formData.needDevReady"
-            :active-value="1"
-            :inactive-value="0"
-        />
-      </el-form-item>
-      <el-form-item label="鍙彿鍒�" prop="callingColumn">
-        <el-input v-model="formData.callingColumn" placeholder="璇疯緭鍏ュ彨鍙峰垪" />
-      </el-form-item>
-      <el-form-item label="鏄剧ず鎮h�呮潯鐮�" prop="displayBarcode">
-        <el-checkbox-group v-model="formData.displayBarcode">
-          <el-checkbox
-              v-for="(dict, index) in getIntDictOptions(DICT_TYPE.ECG_PAT_SOURCE)"
-              :key="index"
-              :label="dict.label"
-              :value=dict.value
-          />
-        </el-checkbox-group>
-      </el-form-item>
-      <el-form-item label="闇�瑕佺‘璐�" prop="expenseRecognition">
-        <el-switch
-            v-model="formData.expenseRecognition"
-            :active-value="1"
-            :inactive-value="0"
-        />
-      </el-form-item>
-      <el-form-item label="鏃舵棰勭害瑙勫畾浜烘暟" prop="timeslotBookNum">
-        <el-input v-model="formData.timeslotBookNum" placeholder="璇疯緭鍏ユ椂娈甸绾﹁瀹氫汉鏁�" />
-      </el-form-item>
-      <el-form-item label="姣忔椂娈甸鐣欎汉鏁�" prop="timeslotReservedNum">
-        <el-input v-model="formData.timeslotReservedNum" placeholder="璇疯緭鍏ユ瘡鏃舵棰勭暀浜烘暟" />
-      </el-form-item>
-      <el-form-item label="棰勭害娉ㄦ剰浜嬮」" prop="notes">
-        <el-input v-model="formData.notes" placeholder="璇疯緭鍏ラ绾︽敞鎰忎簨椤�" />
-      </el-form-item>
-      <el-form-item label="搴忓彿鍓嶇紑" prop="seqPrefix">
-        <el-input v-model="formData.seqPrefix" placeholder="璇疯緭鍏ュ簭鍙峰墠缂�" />
-      </el-form-item>
-      <!-- 闇�姹傦細鎺掗槦搴忓彿瑙勫垯锛堢鍒版椂濡備綍缁欐偅鑰呮帓闃熷簭鍙凤級 -->
-      <el-form-item label="鎺掗槦搴忓彿瑙勫垯" prop="seqRule">
-        <el-select v-model="formData.seqRule" placeholder="璇烽�夋嫨鎺掗槦搴忓彿瑙勫垯" class="w-full">
-          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_SEQ_RULE)"
-                     :key="dict.value" :label="dict.label" :value="dict.value" />
-        </el-select>
-        <div class="text-12px text-gray-500 leading-5 mt-1">
-          棰勭害鍙凤細鐢ㄩ绾︾郴缁熶笅鍙戠殑鍙凤紝绛惧埌涓嶅啀鍒嗛厤锛�<br />
-          绛惧埌搴忓彿锛氬綋澶╁悓妫�鏌ョ被鍨嬪唴杩炵画閫掑锛堢 1 涓鍒�=1 鍙凤級锛屾瘡 9 涓彿棰勭暀 1 涓粰鍔犳�ワ紱<br />
-          鏃舵鍙凤細鎸夐绾︽椂闂存缁欏彿锛�<b>涓嶉�夋椂榛樿姝ら」</b>锛屼笌鏀归�犲墠琛屼负涓�鑷达級銆�
-        </div>
-      </el-form-item>
-      <el-form-item label="浜插拰鐨勬鏌ョ被鍨�" prop="affinityCheckTypes">
-        <el-checkbox-group v-model="formData.affinityCheckTypes">
-          <el-checkbox v-for="checkTypeVO in checkTypeStore.getCheckTypeOptions()" :value="checkTypeVO.value" :key="checkTypeVO.value">{{checkTypeVO.label}}</el-checkbox>
-        </el-checkbox-group>
-      </el-form-item>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="妫�鏌ラ」鐩悕绉�" prop="name">
+            <el-input v-model="formData.name" placeholder="璇疯緭鍏ユ鏌ラ」鐩悕绉�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="妫�鏌ラ」鐩��" prop="value">
+            <el-input v-model="formData.value" placeholder="璇疯緭鍏ユ鏌ラ」鐩��" />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="鎺掑簭搴忓彿" prop="sort">
+            <el-input-number
+              v-model="formData.sort"
+              :min="0"
+              class="!w-full"
+              placeholder="瓒婂皬瓒婇潬鍓�"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍏佽鍑嗗涓汉鏁�" prop="readyNum">
+            <el-input v-model="formData.readyNum" placeholder="璇疯緭鍏ュ厑璁稿噯澶囦腑浜烘暟" />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="闇�瑕佽澶囬鐢�" prop="needDevReady">
+            <el-switch v-model="formData.needDevReady" :active-value="1" :inactive-value="0" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="闇�瑕佺‘璐�" prop="expenseRecognition">
+            <el-switch v-model="formData.expenseRecognition" :active-value="1" :inactive-value="0" />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="鍙彿鍒�" prop="callingColumn">
+            <el-input v-model="formData.callingColumn" placeholder="璇疯緭鍏ュ彨鍙峰垪" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="搴忓彿鍓嶇紑" prop="seqPrefix">
+            <el-input v-model="formData.seqPrefix" placeholder="璇疯緭鍏ュ簭鍙峰墠缂�" />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="鏃舵棰勭害瑙勫畾浜烘暟" prop="timeslotBookNum">
+            <el-input v-model="formData.timeslotBookNum" placeholder="璇疯緭鍏ユ椂娈甸绾﹁瀹氫汉鏁�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="姣忔椂娈甸鐣欎汉鏁�" prop="timeslotReservedNum">
+            <el-input v-model="formData.timeslotReservedNum" placeholder="璇疯緭鍏ユ瘡鏃舵棰勭暀浜烘暟" />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="棰勭害娉ㄦ剰浜嬮」" prop="notes">
+            <el-input v-model="formData.notes" placeholder="璇疯緭鍏ラ绾︽敞鎰忎簨椤�" />
+          </el-form-item>
+        </el-col>
+
+        <!-- 鈫撯啌鈫� 浠ヤ笅涓夐」鎸夎姹傘�屽崟鍗犱竴琛屻�� 鈫撯啌鈫� -->
+        <el-col :span="24">
+          <el-form-item label="鏄剧ず鎮h�呮潯鐮�" prop="displayBarcode">
+            <el-checkbox-group v-model="formData.displayBarcode">
+              <el-checkbox
+                  v-for="(dict, index) in getIntDictOptions(DICT_TYPE.ECG_PAT_SOURCE)"
+                  :key="index"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+
+        <!-- 闇�姹傦細鎺掗槦搴忓彿瑙勫垯锛堢鍒版椂濡備綍缁欐偅鑰呮帓闃熷簭鍙凤級 -->
+        <el-col :span="24">
+          <el-form-item label="鎺掗槦搴忓彿瑙勫垯" prop="seqRule">
+            <el-select v-model="formData.seqRule" placeholder="璇烽�夋嫨鎺掗槦搴忓彿瑙勫垯" class="w-full">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.ECG_SEQ_RULE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+            <div class="text-12px text-gray-500 leading-5 mt-1">
+              棰勭害鍙凤細鐢ㄩ绾︾郴缁熶笅鍙戠殑鍙凤紝绛惧埌涓嶅啀鍒嗛厤锛�<br />
+              绛惧埌搴忓彿锛氬綋澶╁悓妫�鏌ラ」鐩唴杩炵画閫掑锛堢 1 涓鍒�=1 鍙凤級锛屾瘡 9 涓彿棰勭暀 1 涓粰鍔犳�ワ紱<br />
+              鏃舵鍙凤細鎸夐绾︽椂闂存缁欏彿锛�<b>涓嶉�夋椂榛樿姝ら」</b>锛屼笌鏀归�犲墠琛屼负涓�鑷达級銆�
+            </div>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="浜插拰椤圭洰" prop="affinityCheckTypes">
+            <el-checkbox-group v-model="formData.affinityCheckTypes">
+              <el-checkbox v-for="checkTypeVO in checkTypeStore.getCheckTypeOptions()" :value="checkTypeVO.value" :key="checkTypeVO.value">{{checkTypeVO.label}}</el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
     </el-form>
     <template #footer>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">纭� 瀹�</el-button>
@@ -84,7 +135,7 @@
 import {useCheckTypeStore} from "@/store/modules/checkType";
 import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
 
-/** 妫�鏌ョ被鍨� 琛ㄥ崟 */
+/** 妫�鏌ラ」鐩� 琛ㄥ崟 */
 defineOptions({ name: 'CheckTypeForm' })
 
 const { t } = useI18n() // 鍥介檯鍖�
@@ -111,7 +162,9 @@
   notes: undefined,
   seqPrefix: undefined,
   // 鎺掗槦搴忓彿瑙勫垯锛氱暀绌哄嵆鎸夊悗绔粯璁わ紙鏃舵鍙凤級澶勭悊锛屼笌鏀归�犲墠琛屼负涓�鑷�
-  seqRule: undefined
+  seqRule: undefined,
+  // 闇�姹�9锛氭帓搴忓簭鍙凤紙瓒婂皬瓒婇潬鍓嶏級
+  sort: 0
 })
 const formRules = reactive({
 })
@@ -175,7 +228,8 @@
     affinityCheckTypes: [],
     notes: undefined,
     seqPrefix: undefined,
-    seqRule: undefined
+    seqRule: undefined,
+    sort: 0
   }
   formRef.value?.resetFields()
 }
diff --git a/src/views/ecg/checktype/QueueSequenceForm.vue b/src/views/ecg/checktype/QueueSequenceForm.vue
new file mode 100644
index 0000000..25f1ca5
--- /dev/null
+++ b/src/views/ecg/checktype/QueueSequenceForm.vue
@@ -0,0 +1,392 @@
+<template>
+  <!--
+    棰勭害鏃舵缁存姢锛坬ueue_sequence锛�
+
+    鍏ュ彛锛氭鏌ラ」鐩鐞嗗垪琛� 鈫� 鎿嶄綔鍒椼�岄绾︽椂娈点�嶆寜閽�
+    鍔熻兘锛氬**鏌愪竴涓鏌ラ」鐩�**鐨勯绾︽椂娈佃鍒欏仛澧� / 鍒� / 鏀�
+
+    鑳屾櫙锛氳琛ㄥ師鍏堟瘡澶╄嚜鍔ㄧ敓鎴愶紝鐜板凡鏀逛负鎵嬪伐缁存姢锛屾鍓嶆病鏈夌淮鎶ょ晫闈€��
+  -->
+  <Dialog :title="dialogTitle" v-model="dialogVisible" width="1000px">
+    <!-- 椤堕儴璇存槑锛氳繖浜涘瓧娈电殑鍚箟涓�"姣忔棩閲嶇疆"鐨勫叧绯� -->
+    <el-alert type="info" :closable="false" class="mb-10px">
+      <template #title>
+        <div class="text-13px leading-6">
+          姝e湪缁存姢妫�鏌ラ」鐩細<b>{{ checkTypeName }}</b>
+          <span class="text-gray-500">锛堟鏌ラ」鐩�� {{ checkTypeValue }}锛屽叡 {{ list.length }} 涓椂娈碉級</span>
+        </div>
+      </template>
+      <div class="text-12px leading-5">
+        路 <b>璧峰搴忓彿</b>锛氭瘡澶╄嚜鍔ㄩ噸缃椂鍥炲埌璇ュ�硷紱<b>涓婇檺</b>锛氬埌杈惧悗璇ユ椂娈佃涓恒�屽凡婊°�嶏紝鎮h�呯鍒颁細椤哄欢鍒板悗缁椂娈点��<br />
+        路 <b>褰撳墠搴忓彿</b>锛氬凡鍙戝埌鍑犲彿锛屼竴鑸棤闇�鎵嬪伐鏀癸紙姣忔棩閲嶇疆浼氳嚜鍔ㄥ洖鍒�"璧峰搴忓彿"锛夈��<br />
+        路 <b>搴忓彿涓婇檺蹇呴』澶т簬璧峰搴忓彿</b>锛屽惁鍒欒鏃舵姘歌繙鏃犳硶鍙栧彿銆�<br />
+        路 鍚屼竴妫�鏌ラ」鐩笅<b>鍚屼竴鏃舵鍙兘鏈変竴鏉¤鍒�</b>锛岄噸澶嶆坊鍔犱細琚嫆缁濄��
+      </div>
+    </el-alert>
+
+    <div class="mb-10px">
+      <el-button type="primary" @click="openForm('create')" :disabled="!checkTypeValue">
+        <Icon icon="ep:plus" class="mr-5px" /> 鏂板鏃舵
+      </el-button>
+      <el-button @click="getList" :loading="loading">
+        <Icon icon="ep:refresh" class="mr-5px" /> 鍒锋柊
+      </el-button>
+      <span v-if="changedCount > 0" class="ml-10px text-13px text-orange-500">
+        鏈宸蹭慨鏀� {{ changedCount }} 涓椂娈碉紝鐐广�屽埛鏂般�嶅彲鏀惧純鏈繚瀛樼殑灞曠ず鏀瑰姩
+      </span>
+    </div>
+
+    <el-table v-loading="loading" :data="list" :stripe="true" border height="420px">
+      <el-table-column label="鏃舵" align="center" min-width="130px">
+        <template #default="scope">
+          <b>{{ formatTimeSlot(scope.row.timeSlot) }}</b>
+          <div class="text-11px text-gray-400">{{ scope.row.timeSlot }}</div>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="鏅��-璧峰搴忓彿" align="center" min-width="120px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueSet"
+            :min="0"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="鏅��-涓婇檺" align="center" min-width="110px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueFull"
+            :min="1"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="鏅��-褰撳墠搴忓彿" align="center" min-width="115px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueNo"
+            :min="0"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="VIP-璧峰搴忓彿" align="center" min-width="115px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueVipSet"
+            :min="0"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="VIP-涓婇檺" align="center" min-width="105px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueVipFull"
+            :min="1"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="VIP-褰撳墠搴忓彿" align="center" min-width="110px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.queueVipNo"
+            :min="0"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="markChanged(scope.row)"
+          />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="鐘舵��" align="center" width="90px">
+        <template #default="scope">
+          <el-tag v-if="isFull(scope.row)" type="danger" size="small">宸叉弧</el-tag>
+          <el-tag v-else type="success" size="small">鍙彇鍙�</el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="鎿嶄綔" align="center" width="140px" fixed="right">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            :loading="savingId === scope.row.id"
+            @click="handleRowSave(scope.row)"
+          >
+            淇濆瓨
+          </el-button>
+          <el-button link type="primary" @click="openForm('update', scope.row)">缂栬緫</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 鏂板 / 缂栬緫琛ㄥ崟 -->
+    <Dialog v-model="formVisible" :title="formTitle" width="520px" append-to-body>
+      <el-form
+        ref="formRef"
+        :model="formData"
+        :rules="formRules"
+        label-width="120px"
+        v-loading="formLoading"
+      >
+        <el-form-item label="鏃舵" prop="timeSlot">
+          <el-select
+            v-model="formData.timeSlot"
+            placeholder="璇烽�夋嫨棰勭害鏃舵"
+            class="w-full"
+            filterable
+            allow-create
+            default-first-option
+          >
+            <el-option
+              v-for="opt in timeSlotOptions"
+              :key="opt.value"
+              :label="opt.label"
+              :value="opt.value"
+            />
+          </el-select>
+          <div class="text-12px text-gray-500 leading-5 mt-1">
+            閫夐」鏉ヨ嚜瀛楀吀 <code>ecg_book_timeslot</code>锛涗篃鏀寔鐩存帴杈撳叆璧峰/缁撴潫鏃堕棿鍚庡洖杞︽柊寤恒��
+          </div>
+        </el-form-item>
+        <el-form-item label="鏅��-璧峰搴忓彿" prop="queueSet">
+          <el-input-number v-model="formData.queueSet" :min="0" class="w-full" />
+        </el-form-item>
+        <el-form-item label="鏅��-涓婇檺" prop="queueFull">
+          <el-input-number v-model="formData.queueFull" :min="1" class="w-full" />
+        </el-form-item>
+        <el-form-item label="VIP-璧峰搴忓彿" prop="queueVipSet">
+          <el-input-number v-model="formData.queueVipSet" :min="0" class="w-full" />
+        </el-form-item>
+        <el-form-item label="VIP-涓婇檺" prop="queueVipFull">
+          <el-input-number v-model="formData.queueVipFull" :min="1" class="w-full" />
+        </el-form-item>
+        <el-form-item label="鏅��-褰撳墠搴忓彿">
+          <el-input-number v-model="formData.queueNo" :min="0" class="w-full" />
+          <div class="text-12px text-gray-500 leading-5 mt-1">
+            鏂板鏃舵鏃跺缓璁笌銆屾櫘閫�-璧峰搴忓彿銆嶄竴鑷淬��
+          </div>
+        </el-form-item>
+        <el-form-item label="VIP-褰撳墠搴忓彿">
+          <el-input-number v-model="formData.queueVipNo" :min="0" class="w-full" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="submitForm" type="primary" :disabled="formLoading">纭� 瀹�</el-button>
+        <el-button @click="formVisible = false">鍙� 娑�</el-button>
+      </template>
+    </Dialog>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+import { ElMessageBox } from 'element-plus'
+import {
+  QueueSequenceApi,
+  QueueSequenceVO,
+  formatTimeSlot,
+  parseTimeSlot
+} from '@/api/ecg/queuesequence'
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+
+/** 棰勭害鏃舵缁存姢 寮圭獥 */
+defineOptions({ name: 'QueueSequenceForm' })
+
+const message = useMessage() // 娑堟伅寮圭獥
+
+const dialogVisible = ref(false) // 涓诲脊绐�
+const loading = ref(false) // 鍒楄〃鍔犺浇涓�
+const list = ref<QueueSequenceVO[]>([]) // 鏌愭鏌ラ」鐩笅鐨勫叏閮ㄦ椂娈�
+const checkTypeValue = ref<number>() // 褰撳墠缁存姢鐨勬鏌ラ」鐩��
+const checkTypeName = ref<string>('') // 妫�鏌ラ」鐩悕绉帮紙浠呯敤浜庡睍绀猴級
+const changedRows = ref<Set<number>>(new Set()) // 宸茶鏀瑰姩浣嗘湭淇濆瓨鐨勮 id
+const savingId = ref<number>() // 姝e湪淇濆瓨鐨勮 id
+
+const dialogTitle = computed(
+  () => `棰勭害鏃舵缁存姢${checkTypeName.value ? ' - ' + checkTypeName.value : ''}`
+)
+const changedCount = computed(() => changedRows.value.size)
+
+/** 鏃舵涓嬫媺閫夐」锛氬彇鑷瓧鍏� ecg_book_timeslot锛坴alue 涓� HHMMHHMM 鏁板瓧瀛楃涓诧紝label 褰㈠ 08:00-08:30锛� */
+const timeSlotOptions = computed(() => {
+  const opts = getIntDictOptions(DICT_TYPE.ECG_BOOK_TIMESLOT) || []
+  return opts
+    .map((d: any) => {
+      const value = Number(d.value)
+      const label = (d.label || '').trim()
+      return {
+        value,
+        label: label ? `${label}锛�${value}锛塦 : `${formatTimeSlot(value)}锛�${value}锛塦
+      }
+    })
+    .filter((o: any) => !Number.isNaN(o.value))
+})
+
+// ==================== 琛ㄥ崟锛堟柊澧�/缂栬緫锛� ====================
+const formVisible = ref(false)
+const formTitle = ref('')
+const formLoading = ref(false)
+const formRef = ref()
+const formData = ref<QueueSequenceVO>({})
+
+const formRules = reactive({
+  timeSlot: [{ required: true, message: '鏃舵涓嶈兘涓虹┖', trigger: 'change' }],
+  queueSet: [{ required: true, message: '鏅�氳捣濮嬪簭鍙蜂笉鑳戒负绌�', trigger: 'blur' }],
+  queueFull: [
+    { required: true, message: '鏅�氬簭鍙蜂笂闄愪笉鑳戒负绌�', trigger: 'blur' },
+    {
+      validator: (_rule: any, value: any, callback: any) => {
+        const set = formData.value.queueSet
+        if (value !== undefined && value !== null && set !== undefined && set !== null && value <= set) {
+          callback(new Error('涓婇檺蹇呴』澶т簬璧峰搴忓彿锛屽惁鍒欒鏃舵鏃犳硶鍙栧彿'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ]
+})
+
+/** 鎵撳紑缁存姢寮圭獥 */
+const open = async (checkTypeVO: any) => {
+  checkTypeValue.value = checkTypeVO?.value
+  checkTypeName.value = checkTypeVO?.name ?? ''
+  changedRows.value = new Set()
+  dialogVisible.value = true
+  await getList()
+}
+
+defineExpose({ open })
+
+/** 鍔犺浇璇ユ鏌ラ」鐩笅鐨勫叏閮ㄦ椂娈� */
+const getList = async () => {
+  if (!checkTypeValue.value) {
+    list.value = []
+    return
+  }
+  loading.value = true
+  try {
+    const data = await QueueSequenceApi.getTimeslotByCheckType(checkTypeValue.value)
+    // 鍚庣鎸� id 杩斿洖锛涜繖閲屾寜 timeSlot 鍗囧簭锛屼究浜庢寜鏃堕棿椤哄簭妫�瑙�
+    list.value = (data || []).sort(
+      (a: QueueSequenceVO, b: QueueSequenceVO) => (a.timeSlot ?? 0) - (b.timeSlot ?? 0)
+    )
+    changedRows.value = new Set()
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 琛屽唴鏀瑰姩鏍囪 */
+const markChanged = (row: QueueSequenceVO) => {
+  if (row.id) {
+    const s = new Set(changedRows.value)
+    s.add(row.id)
+    changedRows.value = s
+  }
+}
+
+/** 璇ユ椂娈垫槸鍚﹀凡婊★紙褰撳墠搴忓彿 >= 涓婇檺锛� */
+const isFull = (row: QueueSequenceVO) =>
+  (row.queueNo ?? 0) >= (row.queueFull ?? 0) && (row.queueFull ?? 0) > 0
+
+/** 琛屽唴淇濆瓨锛堝彧鏀规暟鍊硷紝涓嶅姩鏃舵锛� */
+const handleRowSave = async (row: QueueSequenceVO) => {
+  if (!row.id) return
+  if ((row.queueFull ?? 0) <= (row.queueSet ?? 0)) {
+    message.error(`鏃舵 ${formatTimeSlot(row.timeSlot)}锛氫笂闄愬繀椤诲ぇ浜庤捣濮嬪簭鍙穈)
+    return
+  }
+  savingId.value = row.id
+  try {
+    await QueueSequenceApi.updateQueueSequence({ ...row, checkType: checkTypeValue.value })
+    message.success('淇濆瓨鎴愬姛')
+    const s = new Set(changedRows.value)
+    s.delete(row.id)
+    changedRows.value = s
+  } finally {
+    savingId.value = undefined
+  }
+}
+
+/** 鎵撳紑鏂板/缂栬緫琛ㄥ崟 */
+const openForm = (type: string, row?: QueueSequenceVO) => {
+  formVisible.value = true
+  formTitle.value = type === 'create' ? '鏂板棰勭害鏃舵' : '缂栬緫棰勭害鏃舵'
+  if (type === 'update' && row) {
+    formData.value = { ...row }
+  } else {
+    formData.value = {
+      checkType: checkTypeValue.value,
+      timeSlot: undefined,
+      queueSet: 0,
+      queueFull: 10,
+      queueNo: 0,
+      queueVipSet: 0,
+      queueVipFull: 10,
+      queueVipNo: 0
+    }
+  }
+}
+
+/** 鎻愪氦琛ㄥ崟 */
+const submitForm = async () => {
+  if (!formRef.value) return
+  await formRef.value.validate()
+  formLoading.value = true
+  try {
+    const data = { ...formData.value, checkType: checkTypeValue.value }
+    if (data.id) {
+      await QueueSequenceApi.updateQueueSequence(data)
+      message.success('淇敼鎴愬姛')
+    } else {
+      await QueueSequenceApi.createQueueSequence(data)
+      message.success('鏂板鎴愬姛')
+    }
+    formVisible.value = false
+    await getList()
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 鍒犻櫎鏃舵 */
+const handleDelete = async (row: QueueSequenceVO) => {
+  if (!row.id) return
+  try {
+    await ElMessageBox.confirm(
+      `纭鍒犻櫎鏃舵銆�${formatTimeSlot(row.timeSlot)}銆戠殑棰勭害瑙勫垯鍚楋紵` +
+        `鍒犻櫎鍚� HIS 鑻ヤ粛涓嬪彂璇ユ椂娈碉紝绛惧埌灏嗚嚜鍔ㄩ『寤跺埌鍚庣画鍙敤鏃舵銆俙,
+      '鎻愮ず',
+      { confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning' }
+    )
+  } catch {
+    return // 鐢ㄦ埛鍙栨秷
+  }
+  await QueueSequenceApi.deleteQueueSequence(row.id)
+  message.success('鍒犻櫎鎴愬姛')
+  await getList()
+}
+</script>
diff --git a/src/views/ecg/checktype/index.vue b/src/views/ecg/checktype/index.vue
index 84681eb..0dac641 100644
--- a/src/views/ecg/checktype/index.vue
+++ b/src/views/ecg/checktype/index.vue
@@ -6,100 +6,17 @@
       :model="queryParams"
       ref="queryFormRef"
       :inline="true"
-      label-width="68px"
+      label-width="80px"
     >
-      <el-form-item label="妫�鏌ョ被鍨嬪悕" prop="name">
+      <el-form-item label="椤圭洰鍚嶇О" prop="name">
         <el-input
           v-model="queryParams.name"
-          placeholder="璇疯緭鍏ユ鏌ョ被鍨嬪悕"
+          placeholder="璇疯緭鍏ユ鏌ラ」鐩悕绉�"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
-      </el-form-item>
-      <el-form-item label="妫�鏌ョ被鍨嬪��" prop="value">
-        <el-input
-          v-model="queryParams.value"
-          placeholder="璇疯緭鍏ユ鏌ョ被鍨嬪��"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="鍏佽鍑嗗涓汉鏁�" prop="readyNum">
-        <el-input
-          v-model="queryParams.readyNum"
-          placeholder="璇疯緭鍏ュ厑璁稿噯澶囦腑浜烘暟"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          value-format="YYYY-MM-DD HH:mm:ss"
-          type="daterange"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-          class="!w-220px"
-        />
-      </el-form-item>
-      <el-form-item label="鍙彿鍒�" prop="callingColumn">
-        <el-input
-          v-model="queryParams.callingColumn"
-          placeholder="璇疯緭鍏ュ彨鍙峰垪"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="鏄惁鏄剧ず鎮h�呮潯鐮�" prop="displayBarcode">
-        <el-input
-          v-model="queryParams.displayBarcode"
-          placeholder="璇疯緭鍏ユ槸鍚︽樉绀烘偅鑰呮潯鐮�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="鏄惁闇�瑕佺‘璐�" prop="expenseRecognition">
-        <el-input
-          v-model="queryParams.expenseRecognition"
-          placeholder="璇疯緭鍏ユ槸鍚﹂渶瑕佺‘璐�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="鏃舵棰勭害瑙勫畾浜烘暟" prop="timeslotBookNum">
-        <el-input
-          v-model="queryParams.timeslotBookNum"
-          placeholder="璇疯緭鍏ユ椂娈甸绾﹁瀹氫汉鏁�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="姣忔椂娈甸鐣欎汉鏁�" prop="timeslotReservedNum">
-        <el-input
-          v-model="queryParams.timeslotReservedNum"
-          placeholder="璇疯緭鍏ユ瘡鏃舵棰勭暀浜烘暟"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="浜插拰鐨勬鏌ョ被鍨�" prop="affinityCheckTypes">
-        <el-input
-          v-model="queryParams.affinityCheckTypes"
-          placeholder="璇疯緭鍏ヤ翰鍜岀殑妫�鏌ョ被鍨�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
+      </el-form-item>      
       <el-form-item>
         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button>
         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button>
@@ -127,10 +44,22 @@
   <!-- 鍒楄〃 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="妫�鏌ョ被鍨嬪悕" align="center" prop="name" width="180px"/>
-      <el-table-column label="妫�鏌ョ被鍨嬪��" align="center" prop="value" />
-      <el-table-column label="鍏佽鍑嗗涓汉鏁�" align="center" prop="readyNum" />
+      <!-- 闇�姹�9锛氫笉鍐嶆樉绀烘暟鎹簱 id锛涙敼涓烘樉绀�**鍙紪杈�**鐨勩�屾帓搴忓簭鍙枫�嶏紙瓒婂皬瓒婇潬鍓嶏級 -->
+      <el-table-column label="鎺掑簭搴忓彿" align="center" prop="sort" width="130px">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.sort"
+            :min="0"
+            :controls="false"
+            size="small"
+            style="width: 100%"
+            @change="handleSortChange(scope.row)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="椤圭洰鍚嶇О" align="center" prop="name" width="180px"/>
+      <el-table-column label="椤圭洰鍊�" align="center" prop="value" />
+      <el-table-column label="鍊欒瘖浜烘暟" align="center" prop="readyNum" />
 <!--      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" :formatter="dateFormatter" width="180px />-->
       <el-table-column label="闇�瑕佽澶囬鐢�" align="center" prop="needDevReady">
         <template #default="scope">
@@ -138,21 +67,29 @@
         </template>
       </el-table-column>
       <el-table-column label="鍙彿鍒�" align="center" prop="callingColumn" />
-      <el-table-column label="鏄惁鏄剧ず鎮h�呮潯鐮�" align="center" prop="displayBarcode" />
-      <el-table-column label="鏄惁闇�瑕佺‘璐�" align="center" prop="expenseRecognition" />
-      <el-table-column label="鏃舵棰勭害瑙勫畾浜烘暟" align="center" prop="timeslotBookNum" />
-      <el-table-column label="姣忔椂娈甸鐣欎汉鏁�" align="center" prop="timeslotReservedNum" />
+      <el-table-column label="鏄剧ず鎮h�呮潯鐮�" align="center" prop="displayBarcode" />
+      <el-table-column label="闇�瑕佺‘璐�" align="center" prop="expenseRecognition" />
+      <el-table-column label="鏃舵棰勭害浜烘暟" align="center" prop="timeslotBookNum" />
+      <el-table-column label="鏃舵棰勭暀浜烘暟" align="center" prop="timeslotReservedNum" />
       <el-table-column label="棰勭害娉ㄦ剰浜嬮」" align="center" prop="notes" />
       <el-table-column label="搴忓彿鍓嶇紑" align="center" prop="seqPrefix" />
-      <el-table-column label="浜插拰鐨勬鏌ョ被鍨�" align="center" prop="affinityCheckTypes" >
+      <el-table-column label="浜插拰椤圭洰" align="center" prop="affinityCheckTypes" >
         <template #default="scope">
           <div v-for="(checkType, subIndex) in scope.row.affinityCheckTypes" :key="subIndex">
             {{getCheckTypeName(checkType)}}
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="鎿嶄綔" align="center" min-width="120px">
+      <el-table-column label="鎿嶄綔" align="center" min-width="200px" fixed="right">
         <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openQueueSequenceForm(scope.row)"
+            v-hasPermi="['ecg:check-type:update']"
+          >
+            棰勭害鏃舵
+          </el-button>
           <el-button
             link
             type="primary"
@@ -183,6 +120,9 @@
 
   <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
   <CheckTypeForm ref="formRef" @success="getList" />
+
+  <!-- 棰勭害鏃舵缁存姢寮圭獥锛氱淮鎶よ妫�鏌ラ」鐩悇鏃舵鐨勫彇鍙疯鍒欙紙澧�/鍒�/鏀癸級 -->
+  <QueueSequenceForm ref="queueSequenceFormRef" />
 </template>
 
 <script setup lang="ts">
@@ -190,10 +130,11 @@
 import download from '@/utils/download'
 import { CheckTypeApi, CheckTypeVO } from '@/api/ecg/checktype'
 import CheckTypeForm from './CheckTypeForm.vue'
+import QueueSequenceForm from './QueueSequenceForm.vue'
 import {useCheckTypeStore} from "@/store/modules/checkType";
 import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
 
-/** 妫�鏌ョ被鍨� 鍒楄〃 */
+/** 妫�鏌ラ」鐩� 鍒楄〃 */
 defineOptions({ name: 'CheckType' })
 
 const message = useMessage() // 娑堟伅寮圭獥
@@ -221,6 +162,29 @@
 })
 const queryFormRef = ref() // 鎼滅储鐨勮〃鍗�
 const exportLoading = ref(false) // 瀵煎嚭鐨勫姞杞戒腑
+
+/** 棰勭害鏃舵缁存姢寮圭獥 */
+const queueSequenceFormRef = ref()
+/** 鎵撳紑銆岄绾︽椂娈点�嶇淮鎶ゅ脊绐楋紙浼犲叆鏁磋锛屼究浜庢樉绀烘鏌ラ」鐩悕绉帮級 */
+const openQueueSequenceForm = (row: CheckTypeVO) => {
+  queueSequenceFormRef.value.open(row)
+}
+
+/**
+ * 闇�姹�9锛氬垪琛ㄥ唴鐩存帴淇敼銆屾帓搴忓簭鍙枫�嶅悗淇濆瓨銆�
+ *
+ * 浠呮彁浜� id 涓� sort 涓や釜瀛楁 鈥斺�� 鍚庣 update 涓恒�屾寜闈炵┖瀛楁鏇存柊銆嶏紝
+ * 鍏朵綑瀛楁浼� null 涓嶄細琚鐩栵紝閬垮厤鎶婃暣琛屾暟鎹洖鍐欓�犳垚鎰忓銆�
+ */
+const handleSortChange = async (row: CheckTypeVO) => {
+  try {
+    await CheckTypeApi.updateCheckType({ id: row.id, sort: row.sort } as CheckTypeVO)
+    message.success('鎺掑簭宸叉洿鏂�')
+    await getList()   // 閲嶆柊鎷夊彇锛屼娇鍒楄〃椤哄簭鎸夋柊鐨� sort 鎺掑ソ
+  } catch {
+    await getList()   // 澶辫触鏃跺洖婊氭樉绀�
+  }
+}
 
 /** 鏌ヨ鍒楄〃 */
 const getList = async () => {
@@ -273,7 +237,7 @@
     // 鍙戣捣瀵煎嚭
     exportLoading.value = true
     const data = await CheckTypeApi.exportCheckType(queryParams)
-    download.excel(data, '妫�鏌ョ被鍨�.xls')
+    download.excel(data, '妫�鏌ラ」鐩�.xls')
   } catch {
   } finally {
     exportLoading.value = false
diff --git a/src/views/ecg/devmanage/index.vue b/src/views/ecg/devmanage/index.vue
index 09006f2..78949fa 100644
--- a/src/views/ecg/devmanage/index.vue
+++ b/src/views/ecg/devmanage/index.vue
@@ -1,135 +1,60 @@
 <template>
   <ContentWrap>
     <!-- 鎼滅储宸ヤ綔鏍� -->
-    <el-form
-        class="-mb-15px"
-        :model="queryParams"
-        ref="queryFormRef"
-        :inline="true"
-        label-width="100px"
-    >
+    <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="100px">
       <el-form-item label="璁惧閮ㄩ棬缂栧彿" prop="devId">
-        <el-input
-            v-model="queryParams.devCodeDept"
-            placeholder="璇疯緭鍏ヨ澶囬儴闂ㄧ紪鍙�"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-240px"
-        />
+        <el-input v-model="queryParams.devCodeDept" placeholder="璇疯緭鍏ヨ澶囬儴闂ㄧ紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="璁惧鍖婚櫌缂栧彿" prop="devId">
-        <el-input
-            v-model="queryParams.devCodeHosp"
-            placeholder="璇疯緭鍏ヨ澶囧尰闄㈢紪鍙�"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-240px"
-        />
+        <el-input v-model="queryParams.devCodeHosp" placeholder="璇疯緭鍏ヨ澶囧尰闄㈢紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="璁惧鍥烘湁缂栧彿" prop="devId">
-        <el-input
-            v-model="queryParams.devCodeIntrinsic"
-            placeholder="璇疯緭鍏ヨ澶囧浐鏈夌紪鍙�"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-240px"
-        />
+        <el-input v-model="queryParams.devCodeIntrinsic" placeholder="璇疯緭鍏ヨ澶囧浐鏈夌紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
 
       <el-form-item label="鐘舵��" prop="state">
-        <el-select
-            v-model="queryParams.state"
-            multiple
-            placeholder="璇烽�夋嫨鐘舵��"
-            clearable
-            class="!w-240px"
-        >
-          <el-option
-              v-for="dict in DevStateOptions"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-          />
+        <el-select v-model="queryParams.state" multiple placeholder="璇烽�夋嫨鐘舵��" clearable class="!w-240px">
+          <el-option v-for="dict in DevStateOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鍒嗙被鍚�" prop="category">
-        <el-select
-            v-model="queryParams.category"
-            placeholder="璇烽�夋嫨鍒嗙被鍚�"
-            clearable
-            class="!w-240px"
-            @change="categoryChanged"
-        >
-          <el-option
-              v-for="dict in categoryOptions"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-          />
+        <el-select v-model="queryParams.category" placeholder="璇烽�夋嫨鍒嗙被鍚�" clearable class="!w-240px"
+          @change="categoryChanged">
+          <el-option v-for="dict in categoryOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鍝佺墝" prop="brand">
-        <el-select
-            v-model="queryParams.brand"
-            placeholder="璇烽�夋嫨鍝佺墝"
-            clearable
-            class="!w-240px"
-            @change="brandChanged"
-        >
-          <el-option
-              v-for="dict in brandOptions"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-          />
+        <el-select v-model="queryParams.brand" placeholder="璇烽�夋嫨鍝佺墝" clearable class="!w-240px" @change="brandChanged">
+          <el-option v-for="dict in brandOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鍨嬪彿" prop="model">
-        <el-select
-            v-model="queryParams.model"
-            placeholder="璇烽�夋嫨鍨嬪彿"
-            clearable
-            class="!w-240px"
-        >
-          <el-option
-              v-for="dict in modelOptions"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-          />
+        <el-select v-model="queryParams.model" placeholder="璇烽�夋嫨鍨嬪彿" clearable class="!w-240px">
+          <el-option v-for="dict in modelOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
 
       <el-form-item label="閲囪喘鏃ユ湡" prop="purchaseDate">
-        <el-date-picker
-            v-model="queryParams.purchaseDate"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            type="daterange"
-            start-placeholder="寮�濮嬫棩鏈�"
-            end-placeholder="缁撴潫鏃ユ湡"
-            :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-            class="!w-220px"
-        />
+        <el-date-picker v-model="queryParams.purchaseDate" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+          start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
       </el-form-item>
 
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button>
-        <el-button
-            type="primary"
-            plain
-            @click="openForm('create')"
-            v-hasPermi="['ecg:device:create']"
-        >
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" /> 鎼滅储
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆
+        </el-button>
+        <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['ecg:device:create']">
           <Icon icon="ep:plus" class="mr-5px" /> 鏂板
         </el-button>
-        <el-button
-            type="success"
-            plain
-            @click="handleExport"
-            :loading="exportLoading"
-            v-hasPermi="['ecg:device:export']"
-        >
+        <el-button type="success" plain @click="handleExport" :loading="exportLoading"
+          v-hasPermi="['ecg:device:export']">
           <Icon icon="ep:download" class="mr-5px" /> 瀵煎嚭
         </el-button>
       </el-form-item>
@@ -151,24 +76,22 @@
           <dict-tag :type="DICT_TYPE.ECG_DEV_BRAND" :value="scope.row.brand" />
         </template>
       </el-table-column>
-      <el-table-column label="鍨嬪彿" align="center" prop="model" width="100px"/>
+      <el-table-column label="鍨嬪彿" align="center" prop="model" width="100px" />
       <el-table-column label="鐘舵��" align="center" prop="lost" width="80px">
         <template #default="scope">
-          <span>{{tranlateDevState(scope.row.state)}}</span>
+          <span>{{ tranlateDevState(scope.row.state) }}</span>
         </template>
       </el-table-column>
+      <el-table-column label="鐘舵�佹棩鏈�" align="center" prop="stateDate" :formatter="dateFormatter2" width="120px" />
 
-      <el-table-column label="鎮h��" align="center" prop="patDetails" width="400px">
+      <el-table-column label="浣跨敤鎮h��" align="center" prop="patDetails" width="400px">
         <template #default="scope">
-          <span>{{scope.row.patDetails?.name}} {{scope.row.patDetails?.mobile}} {{scope.row.patDetails?.wardDesc}} {{scope.row.patDetails?.bedNo}}</span>
+          <span>{{ scope.row.patDetails?.name }} {{ scope.row.patDetails?.mobile }} {{ scope.row.patDetails?.wardDesc }}
+            {{ scope.row.patDetails?.bedNo }}</span>
         </template>
       </el-table-column>
-
-      <el-table-column label="鐘舵�佹棩鏈�" align="center" prop="stateDate" :formatter="dateFormatter2" width="120px"/>
-      <el-table-column label="閲囪喘鏃ユ湡" align="center" prop="purchaseDate" :formatter="dateFormatter2" width="120px"/>
-
+      <el-table-column label="閲囪喘鏃ユ湡" align="center" prop="purchaseDate" :formatter="dateFormatter2" width="120px" />
       <el-table-column label="澶囨敞" align="center" prop="comment" width="100px" />
-
       <!--
             <el-table-column
                 label="鍒涘缓鏃堕棿"
@@ -180,7 +103,7 @@
       -->
       <el-table-column label="鎿嶄綔" align="center" min-width="170px">
         <template #default="scope">
-<!--
+          <!--
           <el-button
               link
               type="primary"
@@ -191,40 +114,21 @@
             鏌ユ偅鑰�
           </el-button>
 -->
-          <el-button
-              link
-              type="primary"
-              @click="openForm('update', scope.row.id)"
-              v-hasPermi="['ecg:device:update']"
-          >
+          <el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['ecg:device:update']">
             缂栬緫
           </el-button>
-          <el-button
-              link
-              type="primary"
-              @click="openForm('devState', scope.row.id)"
-              v-hasPermi="['ecg:device:update']"
-          >
+          <el-button link type="primary" @click="openForm('devState', scope.row.id)" v-hasPermi="['ecg:device:update']">
             鏀圭姸鎬�
           </el-button>
-          <el-button
-              link
-              type="danger"
-              @click="handleDelete(scope.row.id)"
-              v-hasPermi="['ecg:device:delete']"
-          >
+          <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['ecg:device:delete']">
             鍒犻櫎
           </el-button>
         </template>
       </el-table-column>
     </el-table>
     <!-- 鍒嗛〉 -->
-    <Pagination
-        :total="total"
-        v-model:page="queryParams.pageNo"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-    />
+    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
+      @pagination="getList" />
   </ContentWrap>
 
   <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
@@ -233,13 +137,13 @@
 
 <script setup lang="ts">
 import { ElMessageBox } from 'element-plus'
-import {getStrDictOptions, DICT_TYPE, DictDataType} from '@/utils/dict'
-import {dateFormatter2} from '@/utils/formatTime'
-import {DevStateOptions, tranlateDevState} from "@/utils/statusFormatter";
+import { getStrDictOptions, DICT_TYPE, DictDataType } from '@/utils/dict'
+import { dateFormatter2 } from '@/utils/formatTime'
+import { DevStateOptions, tranlateDevState } from "@/utils/statusFormatter";
 import download from '@/utils/download'
-import {DeviceApi, DeviceVO, DevModelApi, OptionsVO} from '@/api/ecg/devmanage'
+import { DeviceApi, DeviceVO, DevModelApi, OptionsVO } from '@/api/ecg/devmanage'
 import DeviceForm from './DeviceForm.vue'
-import {DevRentApi} from "@/api/ecg/devrent";
+import { DevRentApi } from "@/api/ecg/devrent";
 
 /** 璁惧 鍒楄〃 */
 defineOptions({ name: 'Device' })
@@ -318,7 +222,7 @@
     message.success(t('common.delSuccess'))
     // 鍒锋柊鍒楄〃
     await getList()
-  } catch {}
+  } catch { }
 }
 
 /** 瀵煎嚭鎸夐挳鎿嶄綔 */
@@ -337,7 +241,7 @@
 }
 
 const categoryChanged = async () => {
-  const data = await DevModelApi.getBrandOption(queryParams.category??'')
+  const data = await DevModelApi.getBrandOption(queryParams.category ?? '')
   brandOptions.value = data
 
   queryParams.brand = ''
@@ -348,7 +252,7 @@
 }
 
 const brandChanged = async () => {
-  const data = await DevModelApi.getModelOption(queryParams.category??'', queryParams.brand??'')
+  const data = await DevModelApi.getModelOption(queryParams.category ?? '', queryParams.brand ?? '')
   modelOptions.value = data
 
   queryParams.model = ''
@@ -357,7 +261,7 @@
 }
 
 /** 鍒濆鍖� **/
-onMounted( async () => {
+onMounted(async () => {
   const data = await getStrDictOptions(DICT_TYPE.ECG_DEV_CATEGORY)
   categoryOptions.value = data
 
diff --git a/src/views/ecg/devrent/index.vue b/src/views/ecg/devrent/index.vue
index cef7a19..4284912 100644
--- a/src/views/ecg/devrent/index.vue
+++ b/src/views/ecg/devrent/index.vue
@@ -2,63 +2,30 @@
 <template>
   <ContentWrap>
     <!-- 鎼滅储宸ヤ綔鏍� -->
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="120px"
-    >
+    <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
       <el-form-item label="璁惧缂栧彿" prop="devId">
-        <el-input
-          v-model="queryParams.devId"
-          placeholder="璇疯緭鍏ヨ澶囩紪鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎮h�呯紪鍙�" prop="patId">
-        <el-input
-          v-model="queryParams.patId"
-          placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎮h�呭悕绉�" prop="patName">
-        <el-input
-          v-model="queryParams.patName"
-          placeholder="璇疯緭鍏ユ偅鑰呭悕绉�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="妫�鏌�&瑁呮満鏃堕棿" prop="rentTime">
-        <el-date-picker
-          v-model="queryParams.rentTime"
-          value-format="YYYY-MM-DD HH:mm:ss"
-          type="daterange"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-          class="!w-220px"
-        />
+        <el-date-picker v-model="queryParams.rentTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+          start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
       </el-form-item>
       <el-form-item label="鎷嗘満鏃堕棿" prop="returnTime">
-        <el-date-picker
-          v-model="queryParams.returnTime"
-          value-format="YYYY-MM-DD HH:mm:ss"
-          type="daterange"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
-          class="!w-220px"
-        />
+        <el-date-picker v-model="queryParams.returnTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+          start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
       </el-form-item>
-<!--
+      <!--
       <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
@@ -72,15 +39,14 @@
       </el-form-item>
 -->
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button>
-        <el-button
-          type="success"
-          plain
-          @click="handleExport"
-          :loading="exportLoading"
-          v-hasPermi="['ecg:dev-rent:export']"
-        >
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" /> 鎼滅储
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆
+        </el-button>
+        <el-button type="success" plain @click="handleExport" :loading="exportLoading"
+          v-hasPermi="['ecg:dev-rent:export']">
           <Icon icon="ep:download" class="mr-5px" /> 瀵煎嚭
         </el-button>
       </el-form-item>
@@ -91,9 +57,42 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
       <el-table-column label="id" align="center" prop="id" />
-      <el-table-column label="璁惧缂栧彿" align="center" prop="devId" />
+
+      <el-table-column label="妫�鏌ラ」鐩�" align="center" prop="checkType" width="100px">
+        <template #default="scope">
+          <span>{{ getCheckTypeName(scope.row.checkType) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="妫�鏌ョ姸鎬�" align="center" prop="state" width="90px">
+        <template #default="scope">
+          <span>{{ tranlateCheckState(scope.row.state) }}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="鎮h�呯紪鍙�" align="center" prop="patId" />
       <el-table-column label="鎮h�呭悕绉�" align="center" prop="patName" />
+      <el-table-column label="鏉ユ簮" align="center" width="90px">
+        <template #default="scope">
+          <dict-tag v-if="scope.row.patSrc !== undefined && scope.row.patSrc !== null" :type="DICT_TYPE.ECG_PAT_SOURCE"
+            :value="scope.row.patSrc" />
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+
+      <!-- 璁惧鐩稿叧鍒楋紙涓庛�屽鑰愩�嶅悓绾э紝鍘熷厛琚敊璇祵濂楄繘銆屽鑰愩�嶅垪鍐咃紝瀵艰嚧 Vue 缂栬瘧鎶�
+           "Extraneous children found when component already has a slot"锛� -->
+      <el-table-column label="璁惧缂栧彿" align="center" prop="devId" />
+      <el-table-column label="妫�鏌�&瑁呮満鏃堕棿" align="center"
+        prop="rentTime" :formatter="dateFormatter" width="180px" />
+      <el-table-column label="鎷嗘満鏃堕棿" align="center" prop="returnTime" :formatter="dateFormatter" width="180px" />
+      <el-table-column label="骞叉壈鏁�" align="center" prop="interference" />
+      <el-table-column label="鍩虹嚎绮�" align="center" prop="baseline" />
+      <el-table-column label="鑴辫惤" align="center" prop="detachment" />
+
+      <el-table-column label="澶氳��" align="center" width="110px">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" />
+        </template>
+      </el-table-column>
       <!-- 闇�姹�1锛氶棬璇婂彿 + 鍖诲槺鍙凤紙姝ゅ墠杩欎袱涓〉闈㈤仐婕忎簡璇ュ垪锛屾湰娆¤ˉ榻愶級
            鏍囩鐢便�屽氨璇婂崱鍙枫�嶆敼涓恒�岄棬璇婂彿銆嶏紙缁忕‘璁わ級锛歮edical_card 鍏ㄥ簱涓虹┖锛�
            璇ュ垪瀹為檯鏄剧ず outpatient_no锛堣瑙併�婇儴缃叉竻鍗曘��5.1锛夈�� -->
@@ -110,13 +109,12 @@
           {{ scope.row.doctorAdviceNo || '-' }}
         </template>
       </el-table-column>
-
       <!-- 闇�姹�1锛氳ˉ榻愭偅鑰呬俊鎭紙鍚庣 DevRentRespVO 宸叉墿瀛楁骞跺洖濉級 -->
       <el-table-column label="鎬у埆" align="center" width="70px">
         <template #default="scope">
           <!-- 1鐢�/2濂筹紱0 鎴栫己澶憋紙HIS 鏈彁渚涳紝瀹炴祴搴撲腑鏈� 2123 琛�=0锛夋樉绀�"鏈煡" -->
-          <dict-tag v-if="scope.row.patGender === 1 || scope.row.patGender === 2"
-                    :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.patGender" />
+          <dict-tag v-if="scope.row.patGender === 1 || scope.row.patGender === 2" :type="DICT_TYPE.SYSTEM_USER_SEX"
+            :value="scope.row.patGender" />
           <span v-else>鏈煡</span>
         </template>
       </el-table-column>
@@ -125,13 +123,6 @@
       </el-table-column>
       <el-table-column label="骞撮緞" align="center" width="80px">
         <template #default="scope">{{ formatAge(scope.row.patBirthday) || '-' }}</template>
-      </el-table-column>
-      <el-table-column label="鏉ユ簮" align="center" width="90px">
-        <template #default="scope">
-          <dict-tag v-if="scope.row.patSrc !== undefined && scope.row.patSrc !== null"
-                    :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc" />
-          <span v-else>-</span>
-        </template>
       </el-table-column>
       <el-table-column label="鐥呭尯" align="center" min-width="110px">
         <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template>
@@ -156,40 +147,10 @@
       <el-table-column label="寮�鍗曞尰甯�" align="center" min-width="100px">
         <template #default="scope">{{ scope.row.doctor || '-' }}</template>
       </el-table-column>
-      <el-table-column label="澶氳��" align="center" width="110px">
-        <template #default="scope">
-          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" />
-        </template>
-      </el-table-column>
-      <el-table-column label="妫�鏌ョ被鍨�" align="center" prop="checkType" width="100px">
-        <template #default="scope">
-          <span>{{getCheckTypeName(scope.row.checkType)}}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="妫�鏌ョ姸鎬�" align="center" prop="state" width="90px">
-        <template #default="scope">
-          <span>{{tranlateCheckState(scope.row.state)}}</span>
-        </template>
-      </el-table-column>
-        <el-table-column
-        label="妫�鏌�&瑁呮満鏃堕棿"
-        align="center"
-        prop="rentTime"
-        :formatter="dateFormatter"
-        width="180px"
-      />
-      <el-table-column
-        label="鎷嗘満鏃堕棿"
-        align="center"
-        prop="returnTime"
-        :formatter="dateFormatter"
-        width="180px"
-      />
-      <el-table-column label="骞叉壈鏁�" align="center" prop="interference" />
-      <el-table-column label="鍩虹嚎绮�" align="center" prop="baseline" />
-      <el-table-column label="鑴辫惤" align="center" prop="detachment" />
+
+
       <el-table-column label="澶囨敞" align="center" prop="remark" />
-<!--
+      <!--
       <el-table-column
         label="鍒涘缓鏃堕棿"
         align="center"
@@ -198,7 +159,7 @@
         width="180px"
       />
 -->
-<!--
+      <!--
       <el-table-column label="鎿嶄綔" align="center" min-width="120px">
         <template #default="scope">
           <el-button
@@ -222,12 +183,8 @@
 -->
     </el-table>
     <!-- 鍒嗛〉 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
+      @pagination="getList" />
   </ContentWrap>
 
   <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
@@ -239,8 +196,8 @@
 import download from '@/utils/download'
 import { DevRentApi, DevRentVO } from '@/api/ecg/devrent'
 import DevRentForm from './DevRentForm.vue'
-import {tranlateCheckState} from "../../../utils/statusFormatter";
-import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
+import { tranlateCheckState } from "../../../utils/statusFormatter";
+import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
 // 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤癸紙瀛楀吀 + 骞撮緞/璺濅粖澶╂暟绛夊疄鏃惰绠楋級
 import { DICT_TYPE } from '@/utils/dict'
 import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo'
@@ -311,7 +268,7 @@
     message.success(t('common.delSuccess'))
     // 鍒锋柊鍒楄〃
     await getList()
-  } catch {}
+  } catch { }
 }
 
 /** 瀵煎嚭鎸夐挳鎿嶄綔 */
diff --git a/src/views/ecg/doctor/DevDataEntry.vue b/src/views/ecg/doctor/DevDataEntry.vue
index ac809e3..ad99029 100644
--- a/src/views/ecg/doctor/DevDataEntry.vue
+++ b/src/views/ecg/doctor/DevDataEntry.vue
@@ -1,5 +1,6 @@
 <template>
     <el-form
+      class="patient-compact-form"
       ref="formRef"
       :model="formData"
       :rules="formRules"
@@ -328,7 +329,16 @@
 }
 
 const getSelectedRent = async (rentId) => {
-  formData.value = await DevRentApi.getDevRent(rentId)
+  // 鈿狅笍 鍘熷疄鐜版槸鏁翠綋鏇挎崲 formData锛屼細鎶婃偅鑰呬俊鎭啿鎴� null锛堣瑙� DevReadyPanel 涓悓绫讳慨澶嶇殑璇存槑锛�
+  const _record = await DevRentApi.getDevRent(rentId)
+  if (_record) {
+    const _merged = { ...formData.value } as Record<string, any>
+    Object.keys(_record as Record<string, any>).forEach((k) => {
+      const v = (_record as Record<string, any>)[k]
+      if (v !== null && v !== undefined && v !== '') _merged[k] = v
+    })
+    formData.value = _merged as typeof formData.value
+  }
 }
 
 /** 鍒濆鍖� **/
@@ -338,3 +348,16 @@
 })
 
 </script>
+
+<style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細琛ㄥ崟鍐呭鎸ゅ崰浜嗕笅鏂硅褰曡〃鏍肩殑绌洪棿 鈥斺�� 鍘嬬缉琛岄棿璺濄��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   鏈〉琛ㄥ崟鍚� 18 椤规偅鑰呬俊鎭紙4 鍒� = 5 琛岋級+ 9 椤硅澶囦俊鎭紝
+   浠呴棿璺濆氨瑕佷笂鐧� px锛屾妸 el-table 鎸ゅ埌鐪嬩笉瑙併��
+   杩欓噷缁熶竴鍘嬪埌 4px銆傛敞鎰� :deep 鏄繀闇�鐨勶紙el-form-item 鏄湰缁勪欢鐨勫瓙缁勪欢娓叉煋锛夈��
+   ========================================================================== */
+.patient-compact-form :deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/src/views/ecg/doctor/DevDismantle.vue b/src/views/ecg/doctor/DevDismantle.vue
index 2570b4d..5272561 100644
--- a/src/views/ecg/doctor/DevDismantle.vue
+++ b/src/views/ecg/doctor/DevDismantle.vue
@@ -1,42 +1,41 @@
 <!--鎷嗘満鐣岄潰-->
 <template>
     <el-form
+      class="patient-compact-form"
       ref="formRef"
       :model="formData"
       :rules="formRules"
       label-width="100px"
       v-loading="formLoading"
     >
+      <!-- ===== 缂栬緫鍖猴紙闇�瑕佸綍鍏ョ殑瀛楁锛�===== -->
       <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="鎮h�呯紪鍙�" prop="patId">
+        <el-col :span="6">
+        <el-form-item label="鐢宠鍗曞彿" prop="applyNo">
+          <el-input v-model="formData.applyNo" placeholder="璇疯緭鍏ョ敵璇峰崟鍙�" />
+        </el-form-item>
+      </el-col>
+       <el-col :span="6">
+        <el-form-item label="妫�鏌ラ」鐩�" prop="">
+          {{ formData?.checkType && getCheckTypeName(formData?.checkType) }}
+        </el-form-item>
+      </el-col>      
+        <el-col :span="6">
+          <el-form-item label="鎮h�呯紪鍙�" prop="">
             <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
           </el-form-item>
-          <el-form-item label="鎮h�呭悕绉�" prop="patName">
-            <el-input v-model="formData.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" />
-          </el-form-item>
-          <el-form-item label="鎮h�呮弿杩�" prop="patDeptDesc">
-            绉戝: {{ formData?.patDetails?.deptDesc || '-' }} 鐥呭尯: {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} 搴婁綅: {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }}
-          </el-form-item>
-          <!-- 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤癸紙鍚庣 DevRentRespVO 宸叉墿瀛楁骞跺洖濉級 -->
-          <PatientInfoBlock :data="formData" check-type-field="checkType" />
-          <el-form-item label="瑁呮満鏃堕棿" prop="rentTime">
-            <el-date-picker
-                v-model="formData.rentTime"
-                type="date"
-                value-format="x"
-                placeholder="閫夋嫨瑁呮満鏃堕棿"
-                :readonly="true"
-            />
-          </el-form-item>
         </el-col>
-        <el-col :span="12">
+      <el-col :span="6">
+        <el-form-item label="鎮h�呭鍚�" prop="patName">
+          <el-input v-model="formData.episodeId" placeholder="璇疯緭鍏ユ偅鑰呭鍚�" />
+        </el-form-item>
+      </el-col>    
+        <el-col :span="6">
           <el-form-item label="璁惧缂栧彿" prop="devId">
             <el-input v-model="formData.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" @input="getRentInfoByDevId" />
           </el-form-item>
-          <el-form-item label="璁惧鎻忚堪" prop="">
-            {{formData?.brand + "&nbsp;&nbsp;" + formData?.model + " " + tranlateDevState(formData?.devState)}}
-          </el-form-item>
+        </el-col>
+        <el-col :span="6">
           <el-form-item label="鎷嗘満鏃堕棿" prop="returnTime">
             <el-date-picker
                 v-model="formData.returnTime"
@@ -45,36 +44,36 @@
                 placeholder="閫夋嫨鎷嗘満鏃堕棿"
             />
           </el-form-item>
-          <el-form-item label="澶囨敞" prop="remark">
-            <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
-          </el-form-item>
         </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
+        <el-col :span="6">
           <el-form-item label="骞叉壈鏁�" prop="interference">
             <el-input v-model="formData.interference" placeholder="璇疯緭鍏ュ共鎵版暟" />
           </el-form-item>
         </el-col>
-        <el-col :span="12">
+        <el-col :span="6">
           <el-form-item label="鑴辫惤" prop="detachment">
-            <el-switch
-                v-model="formData.detachment"
-                :active-value="1"
-                :inactive-value="0"
-            />
+            <el-switch v-model="formData.detachment" :active-value="1" :inactive-value="0" />
           </el-form-item>
         </el-col>
-        <el-col :span="12">
+        <el-col :span="6">
           <el-form-item label="鍩虹嚎绮�" prop="baseline">
-            <el-switch
-                v-model="formData.baseline"
-                :active-value="1"
-                :inactive-value="0"
-            />
+            <el-switch v-model="formData.baseline" :active-value="1" :inactive-value="0" />
           </el-form-item>
         </el-col>
       </el-row>
+
+      <!-- ===== 鎮h�呬俊鎭紙闇�姹�1锛�18 椤圭粺涓�灞曠ず锛�**涓�琛屽洓鍒�**锛�=====
+           鍚庣 DevRentRespVO 宸叉墿瀛楁骞跺洖濉� -->
+      <PatientInfoBlock :data="formData" check-type-field="checkType" :span="6" />
+
+      <!-- ===== 璁惧淇℃伅锛堜竴琛屽洓鍒楋級=====
+           銆岃澶囩紪鍙� / 鎷嗘満鏃堕棿 / 骞叉壈鏁� / 鑴辫惤 / 鍩虹嚎绮椼�嶅凡鍦ㄤ笂鏂圭紪杈戝尯褰曞叆锛�
+           姝ゅ鍙灞曠ず鍏朵綑璁惧瀛楁锛堣鏈烘椂闂淬�佺櫥璁版椂闂淬�佽澶囨弿杩扮瓑锛� -->
+      <DeviceInfoBlock :data="formData" time-label-mode="dismantle" :span="6" />
+
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
+      </el-form-item>
     </el-form>
     <el-button @click="submitForm" type="primary" :disabled="formLoading">鎷嗘満瀹屾垚</el-button>
     <el-button @click="resetForm()">閲� 缃�</el-button>
@@ -156,6 +155,7 @@
 import {tranlateDevState} from "../../../utils/statusFormatter";
 // 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭粺涓�灞曠ず鍧�
 import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue";
+import DeviceInfoBlock from "@/views/ecg/doctor/components/DeviceInfoBlock.vue";
 
 /** 瑁呮満鎷嗘満 琛ㄥ崟 */
 defineOptions({ name: 'DevrDismantle' })
@@ -379,7 +379,16 @@
 }
 
 const getSelectedRent = async (rentId) => {
-  formData.value = await DevRentApi.getDevRent(rentId)
+  // 鈿狅笍 鍘熷疄鐜版槸鏁翠綋鏇挎崲 formData锛屼細鎶婃偅鑰呬俊鎭啿鎴� null锛堣瑙� DevReadyPanel 涓悓绫讳慨澶嶇殑璇存槑锛�
+  const _record = await DevRentApi.getDevRent(rentId)
+  if (_record) {
+    const _merged = { ...formData.value } as Record<string, any>
+    Object.keys(_record as Record<string, any>).forEach((k) => {
+      const v = (_record as Record<string, any>)[k]
+      if (v !== null && v !== undefined && v !== '') _merged[k] = v
+    })
+    formData.value = _merged as typeof formData.value
+  }
 }
 
 /** 鍒濆鍖� **/
@@ -389,3 +398,16 @@
 })
 
 </script>
+
+<style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細琛ㄥ崟鍐呭鎸ゅ崰浜嗕笅鏂硅褰曡〃鏍肩殑绌洪棿 鈥斺�� 鍘嬬缉琛岄棿璺濄��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   鏈〉琛ㄥ崟鍚� 18 椤规偅鑰呬俊鎭紙4 鍒� = 5 琛岋級+ 9 椤硅澶囦俊鎭紝
+   浠呴棿璺濆氨瑕佷笂鐧� px锛屾妸 el-table 鎸ゅ埌鐪嬩笉瑙併��
+   杩欓噷缁熶竴鍘嬪埌 4px銆傛敞鎰� :deep 鏄繀闇�鐨勶紙el-form-item 鏄湰缁勪欢鐨勫瓙缁勪欢娓叉煋锛夈��
+   ========================================================================== */
+.patient-compact-form :deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/src/views/ecg/doctor/DevInstall.vue b/src/views/ecg/doctor/DevInstall.vue
index dc24d8f..95f6ed4 100644
--- a/src/views/ecg/doctor/DevInstall.vue
+++ b/src/views/ecg/doctor/DevInstall.vue
@@ -7,6 +7,7 @@
 import TitlePanel from "@/views/ecg/doctor/components/TitlePanel.vue";
 import DevInstallPanel from "@/views/ecg/doctor/components/DevInstallPanel.vue";
 import QueuePanel from "@/views/ecg/doctor/components/QueuePanel.vue";
+import DoctorPageLayout from "@/components/DoctorPageLayout/src/DoctorPageLayout.vue";
 import {DoctorApi, PatientStatisticVO, RoomBedVO} from '@/api/ecg/doctor';
 import {QueueVO} from "@/api/ecg/queue";
 import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
@@ -173,7 +174,7 @@
   try {
     await ElMessageBox.confirm(
       `纭畾鎾ら攢銆�${last.patName || last.patId}銆嶇殑瀹屾垚鎿嶄綔鍚楋紵璇ユ偅鑰呭皢鍥炲埌鍊欒瘖鍖恒�俙,
-      '鎾ら攢瀹屾垚',
+      '鎾ら攢',
       { type: 'warning', confirmButtonText: '纭畾鎾ら攢', cancelButtonText: '鍙栨秷' }
     )
   } catch {
@@ -186,7 +187,7 @@
       patId: last.patId,
       checkType: last.bookCheckType
     } as any)
-    ElMessage.success(msg || '宸叉挙閿�瀹屾垚')
+    ElMessage.success(msg || '宸叉挙閿�')
     await initLoad()
   } finally {
     undoFlag.value = false
@@ -273,23 +274,36 @@
 </script>
 
 <template>
-  <el-container>
-    <el-header style="background-color: var(--el-color-primary-light-7); font-size: 24px">
+  <!--
+    甯冨眬浼樺寲锛氬姛鑳芥寜閽浐瀹氬湪椤甸潰搴曢儴锛屼笉鍐嶇敤 position:absolute 娴湪鍐呭涓娿��
+    璇﹁ components/DoctorPageLayout锛堜笌鍙彿妫�鏌�/璁惧棰嗙敤椤靛叡鐢ㄥ悓涓�甯冨眬锛夈��
+  -->
+  <DoctorPageLayout>
+    <template #header>
       <TitlePanel :titleType=2 :room="roomBedVO" :patientStatistic="patientStat" />
-    </el-header>
-    <el-container style="height: 100%;">
-      <el-main style="border: solid var(--el-color-primary-light-7)">
-        <DevInstallPanel :room="roomBedVO" ref="devInstallPanelRef" @event_dev_install="onEventDevInstall"/>
-      </el-main>
-      <el-aside width="400px" style="border: solid var(--el-color-primary-light-7)">
-          <QueuePanel :room="roomBedVO" :queue="patientList" @event_RecallFinish="onEventRecallFinish"/>
-      </el-aside>
-    </el-container>
-    <el-container class="right-bottom">
+    </template>
+
+    <DevInstallPanel
+      :room="roomBedVO"
+      ref="devInstallPanelRef"
+      :undo-disabled="undoFlag"
+      :undo-loading="undoFlag"
+      @event_dev_install="onEventDevInstall"
+      @event_undo_finish="undoFinish"
+    />
+
+    <template #aside>
+      <QueuePanel :room="roomBedVO" :queue="patientList" @event_RecallFinish="onEventRecallFinish"/>
+    </template>
+
+
+    <!-- 搴曢儴鎺т欢锛氳嚜鍔� + 鍔熻兘鎸夐挳 + 鍋滄鍊欒瘖锛屾暣缁勯潬鍙� -->
+    <template #footer>
+      <!-- 鑷姩 澶嶉�夋 -->
       <el-checkbox label="鑷姩&nbsp;" v-model="autoCall" />
       <el-button :disabled="finishFlag" type="primary" @click="finishNextPatient">鍙彿</el-button>
       <el-button :disabled="passFlag" type="primary" @click="passNextPatient">杩囧彿</el-button>
-      <el-button  type="primary" @click="callAgain">閲嶅彨</el-button>
+      <el-button type="primary" @click="callAgain">閲嶅彨</el-button>
       <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{state?'鏆傚仠':'鎭㈠'}}</el-button>
       <!-- 闇�姹�3锛氬仠姝㈠�欒瘖寮�鍏筹紙宸叉湁鍊欒瘖鐥呬汉缁х画鍙彿锛屼絾涓嶅啀鏂板鍊欒瘖鐥呬汉锛� -->
       <el-switch
@@ -298,23 +312,19 @@
         active-text="鍋滄鍊欒瘖"
         inactive-text="姝e父鎺ヨ瘖"
         inline-prompt
-        style="margin-left: 12px; --el-switch-on-color: #e6a23c"
+        style="--el-switch-on-color: #e6a23c"
         @change="onStopReadyChange"
       />
-      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿 / 鎾ら攢瀹屾垚锛堝潎鍥炲埌鍊欒瘖鍖猴級 -->
+
+      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿锛堝洖鍒板�欒瘖鍖猴級銆�
+           闇�姹�11锛氥�屾挙閿�瀹屾垚銆嶅凡鏀瑰悕涓恒�屾挙閿�銆嶏紝骞剁Щ鍒般�屽凡瀹屾垚瑁呮満璁板綍鍒楄〃銆嶇殑鏈�鍓嶉潰銆� -->
       <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">鎾ら攢鍙彿</el-button>
-      <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">鎾ら攢瀹屾垚</el-button>
-    </el-container>
-  </el-container>
+    </template>
+  </DoctorPageLayout>
 </template>
 
-<style scoped lang="scss">
-.right-bottom {
-  position: absolute;
-  bottom: 50px;
-  right: 80px;
-  //background-color: #f00;
-  //color: #fff;
-  //padding: 10px;
-}
-</style>
+<!--
+  鍘熷厛杩欓噷鏈� .right-bottom { position:absolute; bottom:50px; right:80px }锛�
+  姝f槸"璁板綍鍒楄〃鍙橀暱鍚庣洊浣忓姛鑳芥寜閽�"鐨勬牴鍥狅紙鎸夐挳鑴辩鏂囨。娴併�佷笉鍗犲竷灞�绌洪棿锛夈��
+  鐜版敼鐢� DoctorPageLayout 鐨� #footer 鎵胯浇锛氭甯告枃妗f祦涓殑鍥哄畾搴曟爮锛屾棤闇�鍋忕Щ銆�
+-->
diff --git a/src/views/ecg/doctor/Routine.vue b/src/views/ecg/doctor/Routine.vue
index 5b1db4c..e7c327c 100644
--- a/src/views/ecg/doctor/Routine.vue
+++ b/src/views/ecg/doctor/Routine.vue
@@ -7,6 +7,7 @@
 
 import TitlePanel from '@/views/ecg/doctor/components/TitlePanel.vue'
 import QueuePanel from '@/views/ecg/doctor/components/QueuePanel.vue'
+import DoctorPageLayout from '@/components/DoctorPageLayout/src/DoctorPageLayout.vue'
 import { DoctorApi, PatientStatisticVO, RoomBedVO, } from '@/api/ecg/doctor'
 import { QueueVO } from '@/api/ecg/queue'
 import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
@@ -129,8 +130,8 @@
   }
   try {
     await ElMessageBox.confirm(
-      `纭畾鎾ら攢銆�${last.patName || last.patId}銆嶇殑妫�鏌ュ畬鎴愬悧锛熻鎮h�呭皢鍥炲埌鍊欒瘖鍖恒�俙,
-      '鎾ら攢妫�鏌ュ畬鎴�',
+      `纭畾鎾ら攢銆�${last.patName || last.patId}銆嶇殑銆屽畬鎴愩�嶇姸鎬佸悧锛熻鎮h�呭皢鍥炲埌鍊欒瘖鍖恒�俙,
+      '鎾ら攢',
       { type: 'warning', confirmButtonText: '纭畾鎾ら攢', cancelButtonText: '鍙栨秷' }
     )
   } catch {
@@ -143,7 +144,7 @@
       patId: last.patId,
       checkType: last.bookCheckType
     } as any)
-    ElMessage.success(msg || '宸叉挙閿�妫�鏌ュ畬鎴�')
+    ElMessage.success(msg || '宸叉挙閿�')
     await initLoad()
   } finally {
     undoFlag.value = false
@@ -170,6 +171,35 @@
   try {
     patientList.value = await DoctorApi.passNextPatient(roomBedVO)
     patientStat.value = await DoctorApi.getPatientStatistic(roomBedVO)
+
+    // ========================================================================
+    // 銆愪慨澶嶃�戣繃鍙峰悗鍚屾牱瑕�**娓呯┖宸︿笂鏂规偅鑰呬俊鎭�**锛岃〃绀哄彲浠ュ彨涓嬩竴浣嶄簡銆�
+    //
+    // 鍘熷厛鍙皟 getOnstagePatient()锛岃�岃鏂规硶鍦ㄦ壘涓嶅埌 status===30 鐨勬偅鑰呮椂
+    // **浠�涔堥兘涓嶅仛**锛堝畠鍐呴儴閭h setOnStagePatient(undefined) 鏄娉ㄩ噴鎺夌殑锛夛紝
+    // 浜庢槸杩囧彿鍚庡乏涓婅浠嶇暀鐫�涓婁竴浣嶆偅鑰呯殑淇℃伅锛屽尰鐢熶細浠ヤ负杩樺湪澶勭悊浠栥��
+    // 杩欓噷涓庛�屾鏌ュ畬鎴愩��(onEventRoutine) 淇濇寔涓�鑷寸殑鏀跺熬鍔ㄤ綔銆�
+    // ========================================================================
+    onStagePatient = {
+      id: 0,
+      patId: '',
+      patName: '',
+      patGender: 0,
+      bookTimeslot: 0,
+      bookCheckType: 0,
+      isVip: 0,
+      seqNum: 0,
+      bookSeqNum: 0,
+      passed: 0,
+      expired: 0,
+      jumpFlag: 0,
+      roomId: 0,
+      roomName: '',
+      bedNo: '',
+      status: 0
+    }
+    routimePanelRef.value?.setPatient(undefined)
+
     getOnstagePatient()
   } finally {
     passFlag.value = false
@@ -313,23 +343,37 @@
 </script>
 
 <template>
-  <el-container>
-    <el-header style="background-color: var(--el-color-primary-light-7); font-size: 24px">
+  <!--
+    甯冨眬浼樺寲锛氬姛鑳芥寜閽浐瀹氬湪椤甸潰搴曢儴锛屼笉鍐嶇敤 position:absolute 娴湪鍐呭涓娿��
+    路 鏍囬鏍忓浐瀹氬湪椤堕儴
+    路 涓棿鍖猴紙鎮h�呬俊鎭� + 宸插畬鎴愯褰曞垪琛級涓烘粴鍔ㄥ尯锛屾偅鑰呬俊鎭敱 RoutinePanel 鍐呴儴璁句负
+      sticky 閽夊湪椤堕儴锛屽彧鏈夎褰曞垪琛ㄦ粴鍔�
+    路 鍙充晶鎮h�呴槦鍒楃嫭绔嬫粴鍔�
+    路 銆屽彨鍙�/杩囧彿/閲嶅彨/鏆傚仠/鎾ら攢鍙彿銆嶇瓑鎸夐挳杩� #footer锛屽浐瀹氬湪搴曢儴锛屾案涓嶈璁板綍鍒楄〃閬尅
+    璇﹁ components/DoctorPageLayout銆�
+  -->
+  <DoctorPageLayout>
+    <template #header>
       <TitlePanel :titleType="0" :room="roomBedVO" :patientStatistic="patientStat" />
-    </el-header>
-    <el-container style="height: 100%">
-      <el-main style="border: solid var(--el-color-primary-light-7)">
-        <RoutinePanel :room="roomBedVO" :setappointmentId="setappointmentId" ref="routimePanelRef" @event_routine="onEventRoutine" />
-      </el-main>
-      <el-aside width="400px" style="border: solid var(--el-color-primary-light-7)">
-        <QueuePanel
-          :room="roomBedVO"
-          :queue="patientList"
-          @event_RecallFinish="onEventRecallFinish"
-        />
-      </el-aside>
-    </el-container>
-    <el-container class="right-bottom">
+    </template>
+
+    <RoutinePanel
+      :room="roomBedVO"
+      :setappointmentId="setappointmentId"
+      ref="routimePanelRef"
+      :undo-disabled="undoFlag"
+      :undo-loading="undoFlag"
+      @event_routine="onEventRoutine"
+      @event_undo_finish="undoFinish"
+    />
+
+    <template #aside>
+      <QueuePanel :room="roomBedVO" :queue="patientList" @event_RecallFinish="onEventRecallFinish" />
+    </template>
+
+    <!-- 搴曢儴鎺т欢锛氳嚜鍔� + 鍔熻兘鎸夐挳 + 鍋滄鍊欒瘖锛屾暣缁勯潬鍙� -->
+    <template #footer>
+      <!-- 鑷姩 澶嶉�夋 -->
       <el-checkbox label="鑷姩&nbsp;" v-model="autoCall" />
       <el-button :disabled="finishFlag" type="primary" @click="finishNextPatient">鍙彿</el-button>
       <el-button :disabled="passFlag" type="primary" @click="passNextPatient">杩囧彿</el-button>
@@ -344,23 +388,18 @@
         active-text="鍋滄鍊欒瘖"
         inactive-text="姝e父鎺ヨ瘖"
         inline-prompt
-        style="margin-left: 12px; --el-switch-on-color: #e6a23c"
+        style="--el-switch-on-color: #e6a23c"
         @change="onStopReadyChange"
       />
-      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿 / 鎾ら攢妫�鏌ュ畬鎴愶紙鍧囧洖鍒板�欒瘖鍖猴級 -->
+      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿锛堝洖鍒板�欒瘖鍖猴級銆�
+           闇�姹�11锛氥�屾挙閿�瀹屾垚銆嶅凡鏀瑰悕涓恒�屾挙閿�銆嶏紝骞剁Щ鍒般�屽凡瀹屾垚妫�鏌ヨ褰曞垪琛ㄣ�嶇殑鏈�鍓嶉潰銆� -->
       <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">鎾ら攢鍙彿</el-button>
-      <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">鎾ら攢瀹屾垚</el-button>
-    </el-container>
-  </el-container>
+    </template>
+  </DoctorPageLayout>
 </template>
 
-<style scoped lang="scss">
-.right-bottom {
-  position: absolute;
-  bottom: 50px;
-  right: 80px;
-  //background-color: #f00;
-  //color: #fff;
-  //padding: 10px;
-}
-</style>
+<!--
+  鍘熷厛杩欓噷鏈� .right-bottom { position:absolute; bottom:50px; right:80px }锛�
+  姝f槸"璁板綍鍒楄〃鍙橀暱鍚庣洊浣忓姛鑳芥寜閽�"鐨勬牴鍥狅紙鎸夐挳鑴辩鏂囨。娴併�佷笉鍗犲竷灞�绌洪棿锛夈��
+  鐜版敼鐢� DoctorPageLayout 鐨� #footer 鎵胯浇锛氭甯告枃妗f祦涓殑鍥哄畾搴曟爮锛屾棤闇�鍋忕Щ銆�
+-->
diff --git a/src/views/ecg/doctor/components/DevInstallPanel.vue b/src/views/ecg/doctor/components/DevInstallPanel.vue
index cf4b4ae..77c7038 100644
--- a/src/views/ecg/doctor/components/DevInstallPanel.vue
+++ b/src/views/ecg/doctor/components/DevInstallPanel.vue
@@ -1,54 +1,72 @@
 <template>
-  <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
-    <el-form-item label="妫�鏌ラ」鐩�" prop="">
-      {{ getCheckTypeName(formData.checkType) }}
-    </el-form-item>
+  <el-form class="patient-compact-form" ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
+    <!-- ===== 缂栬緫鍖猴紙闇�瑕佸綍鍏ョ殑瀛楁锛�===== -->
     <el-row :gutter="20">
+      <el-col :span="6">
+        <el-form-item label="妫�鏌ラ」鐩�" prop="">
+          {{ getCheckTypeName(formData.checkType) }}
+        </el-form-item>
+      </el-col>
       <el-col :span="12">
         <el-form-item label="鎮h�呯紪鍙�" prop="patId">
           <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
-          <!--        <Qrcode v-if="formData.patId !== undefined && formData.patId !== ''" :text="formData.patId" logo="/logo.gif" width=100 />-->
           <Barcode v-if="displayBarCode" :value="displayBarCode" :width=100 />
           <el-button @click="copyBarcode()">澶嶅埗</el-button>
         </el-form-item>
-        <el-form-item label="鎮h�呭悕绉�" prop="patName">
-          <el-input v-model="formData.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" />
-        </el-form-item>
-        <el-form-item label="鎮h�呮弿杩�" prop="patDetails">
-          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patSrc ?? formData.patDetails?.source ?? ''" />
-          {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }}
-        </el-form-item>
-        <!-- 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭粺涓�灞曠ず锛堝悗绔凡浠庨绾﹀崟骞抽摵鍥炲~锛宻etPatient 宸茶祴鍊煎埌 formData锛� -->
-        <PatientInfoBlock :data="formData" check-type-field="checkType" :span="12" />
-        <el-form-item label="瑁呮満鏃堕棿" prop="rentTime">
-          <el-date-picker v-model="formData.rentTime" type="date" value-format="x" placeholder="閫夋嫨瑁呮満鏃堕棿" />
-        </el-form-item>
       </el-col>
-      <el-col :span="12">
+      <el-col :span="6">
         <el-form-item label="璁惧缂栧彿" prop="devId">
           <el-input v-model="formData.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" @input="getDevInfo" />
         </el-form-item>
-        <el-form-item label="璁惧鎻忚堪" prop="">
-          {{ devInfo?.brand || '-' }} {{ devInfo?.model || '-' }} {{ tranlateDevState(devInfo?.state) }}
-        </el-form-item>
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
-        </el-form-item>
-        <el-form-item label="澶氳�愯嵂" prop="tolerance">
-          <!-- 闇�姹�6锛氱粺涓�璧板瓧鍏� ecg_tolerance锛�0=鏃� 1=澶氳�� 2=澶氶噸鑰愯嵂锛夛紱NULL 鎸�"鏃�"鏄剧ず锛圦12锛� -->
-          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" />
-        </el-form-item>
       </el-col>
     </el-row>
+
+    <!-- ===== 鎮h�呬俊鎭紙闇�姹�1锛�18 椤圭粺涓�灞曠ず锛屼竴琛屽洓鍒楋級=====
+         鍚庣 DevRentRespVO 宸蹭粠棰勭害鍗曞钩閾哄洖濉紝setPatient 宸茶祴鍊煎埌 formData -->
+    <PatientInfoBlock :data="formData" check-type-field="checkType" :span="6" />
+
+    <!-- ===== 璁惧淇℃伅锛堜竴琛屽洓鍒楋級===== -->
+    <DeviceInfoBlock :data="formData" :device="devInfo" time-label-mode="install" :span="6">
+      <template #rentTime>
+        <el-date-picker v-model="formData.rentTime" type="date" value-format="x" placeholder="閫夋嫨瑁呮満鏃堕棿" />
+      </template>
+    </DeviceInfoBlock>
+
+    <el-form-item label="澶囨敞" prop="remark">
+      <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
+    </el-form-item>
   </el-form>
-  <el-button @click="submitForm" type="primary" :disabled="formLoading">瑁呮満瀹屾垚</el-button>
-  <el-button @click="resetForm()">閲� 缃�</el-button>
-  <el-button @click="cancelInstall" :disabled="formLoading">鏀惧純瑁呮満</el-button>
+  <div class="patient-actions">
+  <el-button size="small" @click="submitForm" type="primary" :disabled="formLoading">瑁呮満瀹屾垚</el-button>
+  <el-button size="small" @click="resetForm()">閲� 缃�</el-button>
+  <el-button size="small" @click="cancelInstall" :disabled="formLoading">鏀惧純瑁呮満</el-button>
+  </div>
 
   <!-- 鍖荤敓瑁呮満鍒楄〃 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @row-click="onRowClick">
-      <el-table-column label="id" align="center" prop="id" />
+  <div class="records-host">
+    <ContentWrap class="records-wrap">
+    <el-table
+      v-loading="loading"
+      :data="list"
+      :stripe="true"
+      :show-overflow-tooltip="true"
+      @row-click="onRowClick"
+    >
+      <!-- 闇�姹�11锛堜慨姝o級锛氥�屾挙閿�銆嶄綔涓�**宸插畬鎴愯鏈鸿褰曞垪琛ㄧ殑绗竴鍒�**锛堣〃澶存彃妲斤級锛�
+           鍙嚭鐜颁竴娆★紝浣滅敤浜庢渶杩戜竴浣嶅凡瀹屾垚鎮h�咃紝璇箟涓庡悗绔� lastFinishedPatient 涓�鑷淬�� -->
+      <el-table-column label="鎾ら攢" align="center" width="90px" fixed="left">
+        <template #header>
+          <el-button
+            link
+            type="warning"
+            :disabled="undoDisabled"
+            :loading="undoLoading"
+            @click="$emit('event_undo_finish')"
+          >
+            鎾ら攢
+          </el-button>
+        </template>
+      </el-table-column>
       <el-table-column label="瑁呮満鎯呭喌" align="center" prop="lost">
         <template #default="scope">
           <span v-if="scope.row.jobType === 10">"宸茶鏈�"</span>
@@ -86,10 +104,15 @@
         </template>
       </el-table-column>-->
     </el-table>
+    </ContentWrap>
     <!-- 鍒嗛〉 -->
-    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
-      @pagination="getList" />
-  </ContentWrap>
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
 
 </template>
 
@@ -106,9 +129,11 @@
 import { useCheckTypeStore } from "@/store/modules/checkType";
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { tranlateDevState } from "../../../../utils/statusFormatter";
-import { getCheckTypeName } from "../../../../utils/checkTypeFormatter";
+import { getCheckTypeName, needDevReady } from "../../../../utils/checkTypeFormatter";
+import { useRoomStore } from '@/store/modules/room'
 // 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭粺涓�灞曠ず鍧�
 import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue";
+import DeviceInfoBlock from "@/views/ecg/doctor/components/DeviceInfoBlock.vue";
 
 /** 璁惧瑁呮満 琛ㄥ崟 */
 defineComponent({ name: 'DevInstallPanel' })
@@ -117,8 +142,22 @@
   room: {
     type: Object as PropType<RoomBedVO>,
     required: true
+  },
+  /** 闇�姹�11锛氳褰曞垪琛ㄧ涓�鍒椼�屾挙閿�銆嶆寜閽殑绂佺敤鎬侊紙鐢辩埗椤甸潰鎺у埗锛� */
+  undoDisabled: {
+    type: Boolean,
+    required: false,
+    default: false
+  },
+  /** 闇�姹�11锛氳褰曞垪琛ㄧ涓�鍒椼�屾挙閿�銆嶆寜閽殑 loading锛堢敱鐖堕〉闈㈡帶鍒讹級 */
+  undoLoading: {
+    type: Boolean,
+    required: false,
+    default: false
   }
 })
+
+const emit = defineEmits(['event_dev_install', 'event_undo_finish'])
 
 const { t } = useI18n() // 鍥介檯鍖�
 const message = useMessage() // 娑堟伅寮圭獥
@@ -154,8 +193,6 @@
   patName: [{ required: true, message: '鎮h�呭悕涓嶈兘涓虹┖', trigger: 'blur' }]
 })
 
-
-const emit = defineEmits(['event_dev_install']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
 
 const checkTypeStore = useCheckTypeStore()
 
@@ -193,6 +230,17 @@
 
 /** 鎻愪氦琛ㄥ崟 */
 const submitForm = async () => {
+  // 銆愬畧鍗�戣鏈哄彈鐞嗙殑鏄�屽凡棰嗙敤銆嶆偅鑰咃紝鍏舵鏌ラ」鐩繀椤诲睘浜庨渶瑕佽澶囬鐢ㄧ殑娴佺▼銆�
+  // 涓� DevReadyPanel 鍚屼竴瀹堝崼锛歚check_type.need_dev_ready` 鍦ㄥ悗绔粠鏈鏍¢獙锛�
+  // 浜哄伐鎶婂父瑙勫績鐢靛浘杩欑被鎮h�呮媺杩涙潵浼氶�犳垚"妫�鏌ョ被鎮h�呭嚭鐜板湪璁惧娴佺▼"鐨勬贩涔便��
+  if (formData.value.checkType != null && !needDevReady(formData.value.checkType)) {
+    const ctName = getCheckTypeName(formData.value.checkType) || String(formData.value.checkType)
+    message.warning(
+      `銆�${ctName}銆嶄笉闇�瑕佽澶囬鐢紝涓嶈兘鍔炵悊瑁呮満銆傝纭鏄惁搴斿埌銆屽彨鍙锋鏌ャ�嶉〉闈㈠鐞嗚鎮h�呫�俙
+    )
+    return
+  }
+
   // 鏍¢獙琛ㄥ崟
   await formRef.value.validate()
   // 鎻愪氦璇锋眰
@@ -297,7 +345,16 @@
   if (data == null)
     return
 
-  formData.value = data  //涓嶈兘鏁翠釜璧嬪�硷紝 榛樿瑁呮満鏃堕棿琚竻绌�
+  // 鈿狅笍 鍘熷疄鐜版槸鏁翠綋鏇挎崲 formData锛屼細鎶婃偅鑰呬俊鎭啿鎴� null锛�
+  //   瀹炴祴 GET /ecg/dev-rent/get 鐨勫搷搴旈噷锛岄櫎 patName 澶栫殑鎮h�呭瓧娈靛叏鏄� null
+  //   锛坉ev_rent 琛ㄤ笉瀛樿繖浜涘垪锛屼笖璇ヨ矾寰勬湭浠� appointment 鍥炲~锛夈��
+  //   鏁呮敼涓恒�屽彧瑕嗙洊闈炵┖瀛楁銆嶏紝淇濈暀宸插洖濉殑鎮h�呬俊鎭紙PatientInfoBlock 渚濊禆锛夈��
+  const _merged = { ...formData.value } as Record<string, any>
+  Object.keys(data as Record<string, any>).forEach((k) => {
+    const v = (data as Record<string, any>)[k]
+    if (v !== null && v !== undefined && v !== '') _merged[k] = v
+  })
+  formData.value = _merged as typeof formData.value  //涓嶈兘鏁翠釜璧嬪�硷紝 榛樿瑁呮満鏃堕棿琚竻绌�
   if (formData.value == null)
     return
 
@@ -315,6 +372,10 @@
 const loading = ref(true) // 鍒楄〃鐨勫姞杞戒腑
 const list = ref<JobRecordVO[]>([]) // 鍒楄〃鐨勬暟鎹�
 const total = ref(0) // 鍒楄〃鐨勬�婚〉鏁�
+// 褰撳墠璇婂淇℃伅锛堢敤浜庡彇璇婂寮�灞曠殑妫�鏌ラ」鐩仛鍏滃簳锛岃 syncRoomCheckTypes锛�
+const roomStore = useRoomStore()
+
+
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
@@ -327,10 +388,37 @@
   jobTime: [curDayStart(), curDayEnd()],
   summary: undefined,
   remark: undefined,
-  createTime: []
+  createTime: [],
+  // ========================================================================
+  // 鎸�**褰撳墠璇婂寮�灞曠殑妫�鏌ラ」鐩�**闅旂宸插畬鎴愯褰曘��
+  //
+  // 鑳屾櫙锛歚job_record` 琛ㄥ彧鏈� doc_id + check_type锛�**娌℃湁 room_id**锛�
+  // 鑰� /ecg/job-record/doctor-page 鏄己鍒舵寜鐧诲綍鍖荤敓鏌�"鑷繁鐨勮褰�"銆�
+  // 浜庢槸鍚屼竴鍖荤敓鍦ㄥ涓瘖瀹ゅ潗璇婃椂锛堝 1鍙烽棬璇� ct=[100,1100]銆�6鍙烽棬璇� ct=[400] 骞虫澘杩愬姩蹇冪數锛夛紝
+  // 鍙彿妫�鏌ラ〉浼氭妸**澶氫釜璇婂鐨勮褰曟贩鍦ㄤ竴璧�**鏄剧ず 鈥斺�� 姝f槸鐢ㄦ埛鍙嶉鐨勭幇璞°��
+  //
+  // 鐢卞悇椤甸潰锛圧outine.vue / index.vue / DevInstall.vue锛夊湪 onMounted 鏃�
+  // 鐢ㄥ綋鍓嶈瘖瀹ょ殑 checkTypes 璧嬪�硷紝骞跺湪姣忔鏌ヨ鍓嶅悓姝ワ紝纭繚鍒囪瘖瀹ゅ悗绔嬪嵆鐢熸晥銆�
+  // ========================================================================
+  checkTypes: undefined as number[] | undefined
 })
+
+/**
+ * 鎶娿�屽綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩�嶅悓姝ュ埌鏌ヨ鏉′欢锛屽疄鐜板凡瀹屾垚璁板綍鎸夎瘖瀹ら殧绂汇��
+ * 瑙� queryParams.checkTypes 鐨勮鏄庛��
+ */
+const syncRoomCheckTypes = () => {
+  // 浼樺厛鐢ㄩ〉闈紶鍏ョ殑璇婂淇℃伅锛涗负绌烘椂鍥為��鍒� store锛堟洿鍙潬锛岃 TitlePanel 鍚屽璇存槑锛�
+  const fromProp = props.room?.checkTypes
+  const types = (Array.isArray(fromProp) && fromProp.length > 0)
+    ? fromProp
+    : roomStore.room?.checkTypes
+  queryParams.checkTypes = (Array.isArray(types) && types.length > 0) ? [...types] : undefined
+}
 /** 鏌ヨ鍒楄〃 */
 const getList = async () => {
+  // 鏌ヨ鍓嶅悓姝ュ綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩紝淇濊瘉鍙樉绀烘湰璇婂鐨勮褰�
+  syncRoomCheckTypes()
   loading.value = true
   try {
     const data = await JobRecordApi.getJobRecordDoctorPage(queryParams)
@@ -415,3 +503,72 @@
 })
 
 </script>
+
+<style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細琛ㄥ崟鍐呭鎸ゅ崰浜嗕笅鏂硅褰曡〃鏍肩殑绌洪棿 鈥斺�� 鍘嬬缉琛岄棿璺濄��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   鏈〉琛ㄥ崟鍚� 18 椤规偅鑰呬俊鎭紙4 鍒� = 5 琛岋級+ 9 椤硅澶囦俊鎭紝
+   浠呴棿璺濆氨瑕佷笂鐧� px锛屾妸 el-table 鎸ゅ埌鐪嬩笉瑙併��
+   杩欓噷缁熶竴鍘嬪埌 4px銆傛敞鎰� :deep 鏄繀闇�鐨勶紙el-form-item 鏄湰缁勪欢鐨勫瓙缁勪欢娓叉煋锛夈��
+   ========================================================================== */
+.patient-compact-form :deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖鸿嚜韬笉婊氬姩锛堟粴鍔ㄦ潯鍦ㄨ褰曡〃鏍间笂锛夛紝鍥犳**涓嶉渶瑕� position:sticky** 鈥斺��
+   鐩存帴浣滀负 flex 鐨勫浐瀹氶」锛坒lex:none锛夊嵆鍙缁堢暀鍦ㄩ《閮ㄣ��
+   鑳屾櫙涓嶉�忔槑锛屼繚璇佷笌涓嬫柟璁板綍琛ㄦ牸瑙嗚鍒嗙銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  flex: none;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖猴紙.doctor-page__content锛夎嚜韬粴鍔紝鎵�浠ヨ繖閲屽繀椤荤敤 position:sticky
+   鎵嶈兘璁� 18 椤规偅鑰呬俊鎭湪璁板綍鍒楄〃婊氬姩鏃朵繚鎸佸彲瑙併��
+   鑳屾櫙涓嶉�忔槑锛岄伩鍏嶆粴鍔ㄥ唴瀹逛粠琛ㄥ崟椤归棿闅欓�忓嚭銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  position: sticky;
+  top: 0;
+  z-index: 3;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+/* ==========================================================================
+   鎮h�呮搷浣滃姛鑳藉潡锛氫綅浜庛�屾偅鑰呬俊鎭�嶄笌銆屽凡瀹屾垚璁板綍鍒楄〃銆嶄箣闂达紝鐙珛鎴愬潡銆�
+   闇�姹傦細鍚勫姛鑳芥寜閽紙妫�鏌ュ畬鎴� / 鏀惧純妫�鏌� / 閲嶇疆 / 鐭ユ儏鍚屾剰涔� 鈥︼級**鎺掑湪涓�琛�**銆�
+   鍋氭硶锛歠lex + gap锛屽苟 **绂佹鎹㈣**锛坒lex-wrap:nowrap锛夛紱
+   鎸夐挳鐢� size="small" 浠ュ绾冲叏閮ㄦ寜閽紱鍗充娇瀹藉害涓嶈冻涔熶笉鎶樿銆�
+   涓婁笅杈规 + 搴曡壊锛屼娇瀹冧笌鎮h�呬俊鎭�佽褰曞垪琛ㄥ湪瑙嗚涓婂垎鍖恒��
+   ========================================================================== */
+.patient-actions {
+  display: flex;
+  flex: none;
+  flex-wrap: nowrap;
+  gap: 8px;
+  align-items: center;
+  /* 涓婁笅鐣欑櫧 + 鍒嗛殧绾匡紝褰㈡垚鐙珛鍔熻兘鍧� */
+  padding: 6px 4px;
+  margin-bottom: 6px;
+  background-color: var(--el-bg-color);
+  border-top: 1px solid var(--el-border-color-lighter);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+
+  /* Element Plus 缁欑浉閭� el-button 榛樿鍔犱簡 margin-left:12px锛屼細涓� gap 鍙犲姞锛屾竻鎺� */
+  :deep(.el-button + .el-button) {
+    margin-left: 0;
+  }
+}
+</style>
diff --git a/src/views/ecg/doctor/components/DevReadyPanel.vue b/src/views/ecg/doctor/components/DevReadyPanel.vue
index 831a7fb..6860dea 100644
--- a/src/views/ecg/doctor/components/DevReadyPanel.vue
+++ b/src/views/ecg/doctor/components/DevReadyPanel.vue
@@ -4,6 +4,7 @@
 <!--  褰撳墠鎮h��: {{patient?.patId}} {{isStringEmpty(patient?.patName)?'鏃�':patient.patName}}-->
 
     <el-form
+      class="patient-compact-form"
       ref="formRef"
       :model="formData"
       :rules="formRules"
@@ -11,60 +12,44 @@
       v-loading="formLoading"
    
     >
-     <el-row>
-    <el-col :span="12">
-      <el-form-item label="妫�鏌ラ」鐩�" prop="">
-        {{getCheckTypeName(formData.checkType)}}
-      </el-form-item>
-      </el-col>
-      <el-col :span="12">
-      <el-form-item label="鎮h�呯紪鍙�" prop="patId" >
-        <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
-        <Barcode v-if="displayBarCode" :value="displayBarCode" :width=100 />
-        <el-button @click="copyBarcode()">澶嶅埗</el-button>
-      </el-form-item>
-      </el-col>
-      <el-col :span="12">
-      <el-form-item label="鎮h�呭悕绉�" prop="patName">
-        <el-input v-model="formData.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" />
-      </el-form-item>
-     </el-col>
-     <!-- 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭粺涓�灞曠ず锛堝悗绔凡浠庨绾﹀崟骞抽摵鍥炲~锛宻etPatient 宸茶祴鍊煎埌 formData锛� -->
-     <PatientInfoBlock :data="formData" check-type-field="checkType" :span="12" />
-      <el-col :span="12">
-  
-      <el-form-item label="鎮h�呮弿杩�" prop="patDeptDesc">
-        <dict-tag v-if="formData.patSrc ?? formData.patDetails?.source" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="formData.patSrc ?? formData.patDetails?.source" />
-        {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }} {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }}
-      </el-form-item>
-           </el-col>
-      <el-col :span="12">
-      <el-form-item label="璁惧缂栧彿" prop="devId">
-        <el-input v-model="formData.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" @input="getDevInfo"/>
-      </el-form-item>
-           </el-col>
-      <el-col :span="12">
-      <el-form-item label="璁惧鎻忚堪" prop="">
-        {{ devInfo?.brand||'-' }} {{ devInfo?.model||'-' }} {{ tranlateDevState(devInfo?.state) }}
-      </el-form-item>
-           </el-col>
-      <el-col :span="12">
-      <el-form-item label="棰嗙敤鏃堕棿" prop="rentTime">
-        <el-date-picker
-          v-model="formData.rentTime"
-          type="date"
-          value-format="x"
-          placeholder="閫夋嫨棰嗙敤鏃堕棿"
-        />
-      </el-form-item>
-           </el-col>
-      <el-col :span="12">
-       <el-form-item label="澶氳�愯嵂" prop="tolerance">
-         <!-- 闇�姹�6锛氱粺涓�璧板瓧鍏� ecg_tolerance锛�0=鏃� 1=澶氳�� 2=澶氶噸鑰愯嵂锛夛紱NULL 鎸�"鏃�"鏄剧ず锛圦12锛� -->
-         <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" />
-        </el-form-item>
-             </el-col>
+      <!-- ===== 缂栬緫鍖猴紙闇�瑕佸綍鍏ョ殑瀛楁锛�===== -->
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <el-form-item label="妫�鏌ラ」鐩�" prop="">
+            {{getCheckTypeName(formData.checkType)}}
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鎮h�呯紪鍙�" prop="patId">
+            <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
+            <Barcode v-if="displayBarCode" :value="displayBarCode" :width=100 />
+            <el-button @click="copyBarcode()">澶嶅埗</el-button>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="璁惧缂栧彿" prop="devId">
+            <el-input v-model="formData.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" @input="getDevInfo"/>
+          </el-form-item>
+        </el-col>
       </el-row>
+
+      <!-- ===== 鎮h�呬俊鎭紙闇�姹�1锛�18 椤圭粺涓�灞曠ず锛屼竴琛屽洓鍒楋級=====
+           鍚庣 DevRentRespVO 宸蹭粠棰勭害鍗曞钩閾哄洖濉紝setPatient 宸茶祴鍊煎埌 formData -->
+      <PatientInfoBlock :data="formData" check-type-field="checkType" :span="6" />
+
+      <!-- ===== 璁惧淇℃伅锛堜竴琛屽洓鍒楋級=====
+           璁惧缂栧彿鍦ㄤ笂鏂圭紪杈戝尯宸插綍鍏ワ紝姝ゅ鍙灞曠ず鍏朵綑璁惧瀛楁 -->
+      <DeviceInfoBlock :data="formData" :device="devInfo" time-label-mode="ready" :span="6">
+        <template #rentTime>
+          <el-date-picker
+            v-model="formData.rentTime"
+            type="date"
+            value-format="x"
+            placeholder="閫夋嫨棰嗙敤鏃堕棿"
+          />
+        </template>
+      </DeviceInfoBlock>
+
       <el-form-item label="澶囨敞" prop="remark">
         <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
       </el-form-item>
@@ -78,18 +63,41 @@
 -->
         
     </el-form>
-    <el-button @click="submitForm" type="primary" :disabled="formLoading">棰嗙敤瀹屾垚</el-button>
+    <div class="patient-actions">
+    <el-button size="small" @click="submitForm" type="primary" :disabled="formLoading">棰嗙敤瀹屾垚</el-button>
     <el-checkbox style="margin-left:10px" label="鑷姩&nbsp;" v-model="autoPrint" />
-    <el-button @click="printBill(formData.patDetails?.appointmentId)">鎵撳嵃灏忕エ</el-button>
-    <el-button @click="cancelReady"  :disabled="formLoading">鏀惧純棰嗙敤</el-button>
-    <el-button @click="resetForm()">閲� 缃�</el-button>
-    <el-button v-if="needAutoFeeConfirm(formData.checkType)" @click="feeConfirm"  :disabled="formLoading">纭垂</el-button>
-    <el-button v-if="needAutoFeeConfirm(formData.checkType)" @click="feeCancel"  :disabled="formLoading">鍙栨秷纭垂</el-button>
+    <el-button size="small" @click="printBill(formData.patDetails?.appointmentId)">鎵撳嵃灏忕エ</el-button>
+    <el-button size="small" @click="cancelReady"  :disabled="formLoading">鏀惧純棰嗙敤</el-button>
+    <el-button size="small" @click="resetForm()">閲� 缃�</el-button>
+    <el-button size="small" v-if="needAutoFeeConfirm(formData.checkType)" @click="feeConfirm"  :disabled="formLoading">纭垂</el-button>
+    <el-button size="small" v-if="needAutoFeeConfirm(formData.checkType)" @click="feeCancel"  :disabled="formLoading">鍙栨秷纭垂</el-button>
+    </div>
 
   <!-- 鍖荤敓瑁呮満鍒楄〃 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @row-click="onRowClick" >
-<!--      <el-table-column label="id" align="center" prop="id" />-->
+  <div class="records-host">
+    <ContentWrap class="records-wrap">
+    <el-table
+      v-loading="loading"
+      :data="list"
+      :stripe="true"
+      :show-overflow-tooltip="true"
+      @row-click="onRowClick"
+    >
+      <!-- 闇�姹�11锛堜慨姝o級锛氥�屾挙閿�銆嶄綔涓�**宸插畬鎴愰鐢ㄨ褰曞垪琛ㄧ殑绗竴鍒�**锛堣〃澶存彃妲斤級锛�
+           鍙嚭鐜颁竴娆★紝浣滅敤浜庢渶杩戜竴浣嶅凡瀹屾垚鎮h�咃紝璇箟涓庡悗绔� lastFinishedPatient 涓�鑷淬�� -->
+      <el-table-column label="鎾ら攢" align="center" width="90px" fixed="left">
+        <template #header>
+          <el-button
+            link
+            type="warning"
+            :disabled="undoDisabled"
+            :loading="undoLoading"
+            @click="$emit('event_undo_finish')"
+          >
+            鎾ら攢
+          </el-button>
+        </template>
+      </el-table-column>
       <el-table-column label="纭垂" align="center" prop="paid">
         <template #default="scope">
           {{scope.row.paid == 1 ? "宸茬‘璐�" : ""}}
@@ -147,6 +155,7 @@
       </el-table-column>
 -->
     </el-table>
+    </ContentWrap>
     <!-- 鍒嗛〉 -->
     <Pagination
         :total="total"
@@ -154,7 +163,7 @@
         v-model:limit="queryParams.pageSize"
         @pagination="getList"
     />
-  </ContentWrap>
+  </div>
 
 </template>
 
@@ -175,9 +184,11 @@
 import {calGender, getBookBeginTime} from "@/utils";
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import {tranlateDevState} from "@/utils/statusFormatter";
-import {getCheckTypeName, needAutoFeeConfirm} from "../../../../utils/checkTypeFormatter";
+import {getCheckTypeName, needAutoFeeConfirm, needDevReady} from "../../../../utils/checkTypeFormatter";
+import { useRoomStore } from '@/store/modules/room'
 // 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭粺涓�灞曠ず鍧�
 import PatientInfoBlock from "@/views/ecg/doctor/components/PatientInfoBlock.vue";
+import DeviceInfoBlock from "@/views/ecg/doctor/components/DeviceInfoBlock.vue";
 
 /** 璁惧棰嗙敤 琛ㄥ崟 */
 defineComponent({ name: 'DevReadyPanel' })
@@ -186,10 +197,22 @@
   room: {
     type: Object as PropType<RoomBedVO>,
     required: true
+  },
+  /** 闇�姹�11锛氳褰曞垪琛ㄧ涓�鍒椼�屾挙閿�銆嶆寜閽殑绂佺敤鎬侊紙鐢辩埗椤甸潰鎺у埗锛� */
+  undoDisabled: {
+    type: Boolean,
+    required: false,
+    default: false
+  },
+  /** 闇�姹�11锛氳褰曞垪琛ㄧ涓�鍒椼�屾挙閿�銆嶆寜閽殑 loading锛堢敱鐖堕〉闈㈡帶鍒讹級 */
+  undoLoading: {
+    type: Boolean,
+    required: false,
+    default: false
   }
 })
 
-const emit = defineEmits(['event_dev_ready']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
+const emit = defineEmits(['event_dev_ready', 'event_undo_finish'])
 
 const { t } = useI18n() // 鍥介檯鍖�
 const message = useMessage() // 娑堟伅寮圭獥
@@ -251,7 +274,16 @@
     return
 
   // formDate 瀵瑰簲  DevRent
-  formData.value = data
+  // 鈿狅笍 鍘熷疄鐜版槸鏁翠綋鏇挎崲 formData锛屼細鎶婃偅鑰呬俊鎭啿鎴� null锛�
+  //   瀹炴祴 GET /ecg/dev-rent/get 鐨勫搷搴旈噷锛岄櫎 patName 澶栫殑鎮h�呭瓧娈靛叏鏄� null
+  //   锛坉ev_rent 琛ㄤ笉瀛樿繖浜涘垪锛屼笖璇ヨ矾寰勬湭浠� appointment 鍥炲~锛夈��
+  //   鏁呮敼涓恒�屽彧瑕嗙洊闈炵┖瀛楁銆嶏紝淇濈暀宸插洖濉殑鎮h�呬俊鎭紙PatientInfoBlock 渚濊禆锛夈��
+  const _merged = { ...formData.value } as Record<string, any>
+  Object.keys(data as Record<string, any>).forEach((k) => {
+    const v = (data as Record<string, any>)[k]
+    if (v !== null && v !== undefined && v !== '') _merged[k] = v
+  })
+  formData.value = _merged as typeof formData.value
 
   // 棰嗙敤鏃堕棿  閲囩敤褰撳墠鏃堕棿
   formData.value.rentTime = new Date().getTime()
@@ -259,6 +291,27 @@
 
 /** 鎻愪氦琛ㄥ崟 */
 const submitForm = async () => {
+  // ==========================================================================
+  // 銆愬畧鍗�戙�岃澶囬鐢ㄣ�嶅彧鍙楃悊**闇�瑕佽澶囬鐢�**鐨勬鏌ラ」鐩��
+  //
+  // 鑳屾櫙锛歚check_type.need_dev_ready`锛堟槸鍚﹂渶瑕佽澶囬鐢級鍦ㄥ悗绔�**浠庢湭琚牎楠�**锛�
+  // 鍖荤敓鍙湪鏈〉鎵嬪姩杈撳叆鎮h�呯紪鍙凤紝鎶�**甯歌蹇冪數鍥�(ct=100) / 甯歌蹇冪數鍚戦噺鍥�(ct=1100)**
+  // 杩欑被 needDevReady=0 鐨勬偅鑰呮媺杩涙潵骞剁偣銆岄鐢ㄥ畬鎴愩�嶏紝
+  // 琛ㄧ幇涓�"甯歌蹇冪數鍥俱�佸績鐢靛悜閲忓浘鎮h�呭嚭鐜板湪璁惧棰嗙敤妯″潡"鐨勬贩涔便��
+  //
+  // 瀹炴祴锛堢湡瀹炴帴鍙o級锛�119/D1 绛夎澶囧噯澶囧伐浣嶇殑 get-to-be-installed-list 杩斿洖绌猴紝
+  // 璇存槑**鑷姩鍒嗘祦鏄寜宸ヤ綅 checkTypes 杩囨护鐨勩�佹病鏈夐棶棰�**锛�
+  // 娣蜂贡鏉ヨ嚜"浜哄伐鎶婁笉灞炰簬鏈祦绋嬬殑鎮h�呮媺杩涙潵"銆�
+  // ==========================================================================
+  if (formData.value.checkType != null && !needDevReady(formData.value.checkType)) {
+    const ctName = getCheckTypeName(formData.value.checkType) || String(formData.value.checkType)
+    message.warning(
+      `銆�${ctName}銆嶄笉闇�瑕佽澶囬鐢紝涓嶈兘鍦ㄨ澶囬鐢ㄦā鍧楀姙鐞嗐�俙 +
+      `璇风‘璁ゆ槸鍚﹀簲鍒般�屽彨鍙锋鏌ャ�嶉〉闈㈠鐞嗚鎮h�呫�俙
+    )
+    return
+  }
+
   // 鏍¢獙琛ㄥ崟
   await formRef.value.validate()
   // 鎻愪氦璇锋眰
@@ -381,6 +434,10 @@
 const loading = ref(true) // 鍒楄〃鐨勫姞杞戒腑
 const list = ref<JobRecordVO[]>([]) // 鍒楄〃鐨勬暟鎹�
 const total = ref(0) // 鍒楄〃鐨勬�婚〉鏁�
+// 褰撳墠璇婂淇℃伅锛堢敤浜庡彇璇婂寮�灞曠殑妫�鏌ラ」鐩仛鍏滃簳锛岃 syncRoomCheckTypes锛�
+const roomStore = useRoomStore()
+
+
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
@@ -393,11 +450,39 @@
   jobTime: [curDayStart(), curDayEnd()],
   summary: undefined,
   remark: undefined,
-  createTime: []
+  createTime: [],
+  // ========================================================================
+  // 鎸�**褰撳墠璇婂寮�灞曠殑妫�鏌ラ」鐩�**闅旂宸插畬鎴愯褰曘��
+  //
+  // 鑳屾櫙锛歚job_record` 琛ㄥ彧鏈� doc_id + check_type锛�**娌℃湁 room_id**锛�
+  // 鑰� /ecg/job-record/doctor-page 鏄己鍒舵寜鐧诲綍鍖荤敓鏌�"鑷繁鐨勮褰�"銆�
+  // 浜庢槸鍚屼竴鍖荤敓鍦ㄥ涓瘖瀹ゅ潗璇婃椂锛堝 1鍙烽棬璇� ct=[100,1100]銆�6鍙烽棬璇� ct=[400] 骞虫澘杩愬姩蹇冪數锛夛紝
+  // 鍙彿妫�鏌ラ〉浼氭妸**澶氫釜璇婂鐨勮褰曟贩鍦ㄤ竴璧�**鏄剧ず 鈥斺�� 姝f槸鐢ㄦ埛鍙嶉鐨勭幇璞°��
+  //
+  // 鐢卞悇椤甸潰锛圧outine.vue / index.vue / DevInstall.vue锛夊湪 onMounted 鏃�
+  // 鐢ㄥ綋鍓嶈瘖瀹ょ殑 checkTypes 璧嬪�硷紝骞跺湪姣忔鏌ヨ鍓嶅悓姝ワ紝纭繚鍒囪瘖瀹ゅ悗绔嬪嵆鐢熸晥銆�
+  // ========================================================================
+  checkTypes: undefined as number[] | undefined
 })
+
+/**
+ * 鎶娿�屽綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩�嶅悓姝ュ埌鏌ヨ鏉′欢锛屽疄鐜板凡瀹屾垚璁板綍鎸夎瘖瀹ら殧绂汇��
+ * 瑙� queryParams.checkTypes 鐨勮鏄庛��
+ */
+const syncRoomCheckTypes = () => {
+  // 浼樺厛鐢ㄩ〉闈紶鍏ョ殑璇婂淇℃伅锛涗负绌烘椂鍥為��鍒� store锛堟洿鍙潬锛岃 TitlePanel 鍚屽璇存槑锛�
+  const fromProp = props.room?.checkTypes
+  const types = (Array.isArray(fromProp) && fromProp.length > 0)
+    ? fromProp
+    : roomStore.room?.checkTypes
+  queryParams.checkTypes = (Array.isArray(types) && types.length > 0) ? [...types] : undefined
+}
+
 
 /** 鏌ヨ鍒楄〃 */
 const getList = async () => {
+  // 鏌ヨ鍓嶅悓姝ュ綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩紝淇濊瘉鍙樉绀烘湰璇婂鐨勮褰�
+  syncRoomCheckTypes()
   loading.value = true
   try {
     const data = await JobRecordApi.getJobRecordDoctorPage(queryParams)
@@ -596,3 +681,71 @@
 
 </script>
 
+<style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細琛ㄥ崟鍐呭鎸ゅ崰浜嗕笅鏂硅褰曡〃鏍肩殑绌洪棿 鈥斺�� 鍘嬬缉琛岄棿璺濄��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   鏈〉琛ㄥ崟鍚� 18 椤规偅鑰呬俊鎭紙4 鍒� = 5 琛岋級+ 9 椤硅澶囦俊鎭紝
+   浠呴棿璺濆氨瑕佷笂鐧� px锛屾妸 el-table 鎸ゅ埌鐪嬩笉瑙併��
+   杩欓噷缁熶竴鍘嬪埌 4px銆傛敞鎰� :deep 鏄繀闇�鐨勶紙el-form-item 鏄湰缁勪欢鐨勫瓙缁勪欢娓叉煋锛夈��
+   ========================================================================== */
+.patient-compact-form :deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖鸿嚜韬笉婊氬姩锛堟粴鍔ㄦ潯鍦ㄨ褰曡〃鏍间笂锛夛紝鍥犳**涓嶉渶瑕� position:sticky** 鈥斺��
+   鐩存帴浣滀负 flex 鐨勫浐瀹氶」锛坒lex:none锛夊嵆鍙缁堢暀鍦ㄩ《閮ㄣ��
+   鑳屾櫙涓嶉�忔槑锛屼繚璇佷笌涓嬫柟璁板綍琛ㄦ牸瑙嗚鍒嗙銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  flex: none;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖猴紙.doctor-page__content锛夎嚜韬粴鍔紝鎵�浠ヨ繖閲屽繀椤荤敤 position:sticky
+   鎵嶈兘璁� 18 椤规偅鑰呬俊鎭湪璁板綍鍒楄〃婊氬姩鏃朵繚鎸佸彲瑙併��
+   鑳屾櫙涓嶉�忔槑锛岄伩鍏嶆粴鍔ㄥ唴瀹逛粠琛ㄥ崟椤归棿闅欓�忓嚭銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  position: sticky;
+  top: 0;
+  z-index: 3;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+/* ==========================================================================
+   鎮h�呮搷浣滃姛鑳藉潡锛氫綅浜庛�屾偅鑰呬俊鎭�嶄笌銆屽凡瀹屾垚璁板綍鍒楄〃銆嶄箣闂达紝鐙珛鎴愬潡銆�
+   闇�姹傦細鍚勫姛鑳芥寜閽紙妫�鏌ュ畬鎴� / 鏀惧純妫�鏌� / 閲嶇疆 / 鐭ユ儏鍚屾剰涔� 鈥︼級**鎺掑湪涓�琛�**銆�
+   鍋氭硶锛歠lex + gap锛屽苟 **绂佹鎹㈣**锛坒lex-wrap:nowrap锛夛紱
+   鎸夐挳鐢� size="small" 浠ュ绾冲叏閮ㄦ寜閽紱鍗充娇瀹藉害涓嶈冻涔熶笉鎶樿銆�
+   涓婁笅杈规 + 搴曡壊锛屼娇瀹冧笌鎮h�呬俊鎭�佽褰曞垪琛ㄥ湪瑙嗚涓婂垎鍖恒��
+   ========================================================================== */
+.patient-actions {
+  display: flex;
+  flex: none;
+  flex-wrap: nowrap;
+  gap: 8px;
+  align-items: center;
+  /* 涓婁笅鐣欑櫧 + 鍒嗛殧绾匡紝褰㈡垚鐙珛鍔熻兘鍧� */
+  padding: 6px 4px;
+  margin-bottom: 6px;
+  background-color: var(--el-bg-color);
+  border-top: 1px solid var(--el-border-color-lighter);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+
+  /* Element Plus 缁欑浉閭� el-button 榛樿鍔犱簡 margin-left:12px锛屼細涓� gap 鍙犲姞锛屾竻鎺� */
+  :deep(.el-button + .el-button) {
+    margin-left: 0;
+  }
+}
+</style>
diff --git a/src/views/ecg/doctor/components/DeviceInfoBlock.vue b/src/views/ecg/doctor/components/DeviceInfoBlock.vue
new file mode 100644
index 0000000..6fc60d1
--- /dev/null
+++ b/src/views/ecg/doctor/components/DeviceInfoBlock.vue
@@ -0,0 +1,151 @@
+<!--
+  璁惧淇℃伅灞曠ず鍧楋紙闇�姹傦細璁惧棰嗙敤 / 瑁呮満 / 鎷嗘満 椤甸潰鐨勯澶栧唴瀹癸級
+
+  缁熶竴灞曠ず浠ヤ笅璁惧鐩稿叧瀛楁锛�**涓�琛屽洓鍒�**锛屼笌 PatientInfoBlock 鐨勬爡鏍间竴鑷达級锛�
+    璁惧缂栧彿銆佽澶囨弿杩般�侀鐢ㄦ椂闂淬�佽鏈烘椂闂淬�佹媶鏈烘椂闂淬�佸共鎵版暟銆佽劚钀姐�佸熀绾跨矖銆佸娉�
+
+  璁捐瑕佺偣锛�
+    1) **鏃堕棿鏍囩鎸夐〉闈㈣嚜閫傚簲**锛氬悓涓�鍒� `rent_time` 鍦�"璁惧棰嗙敤"椤垫槸銆岄鐢ㄦ椂闂淬�嶃��
+       鍦�"瑁呮満/鎷嗘満"椤垫槸銆岃鏈烘椂闂淬�嶏紱`return_time` 鍦ㄦ媶鏈洪〉鏄�屾媶鏈烘椂闂淬�嶃��
+       鐢� `timeLabelMode` 鍐冲畾锛岄伩鍏嶅悇椤甸潰鍚勫啓涓�濂楁爣绛捐�屽彛寰勪笉涓�銆�
+    2) **璁惧鎻忚堪鍙栧�煎吋瀹逛袱绉嶆潵婧�**锛�
+        路 `device` 鈥斺�� 閫氳繃 DeviceApi 鏌ュ埌鐨勮澶囧璞★紙鍚� category/brand/model/state锛�
+        路 鏁版嵁瀵硅薄涓婄殑 `brand/model/devState` 鈥斺�� DevRentRespVO 宸插甫涓婏紙鎷嗘満椤电敤杩欎釜锛�
+    3) 璁惧缂栧彿/鏃堕棿/璐ㄩ噺瀛楁**鍙兘闇�瑕佸綍鍏�**锛屾晠鎻愪緵鍏峰悕鎻掓Ы锛�
+        `devId` / `rentTime` / `returnTime` / `entryTime` / `interference` / `detachment` / `baseline` / `remark`
+       鐖堕〉闈笉浼犳彃妲芥椂鎸�**鍙鏂囨湰**娓叉煋銆�
+-->
+<script setup lang="ts">
+import { computed } from 'vue'
+import { formatDateTime } from '@/utils/patientInfo'
+import { tranlateDevState } from '@/utils/statusFormatter'
+
+const props = defineProps<{
+  /** 鏁版嵁瀵硅薄锛圖evRentVO / 琛ㄥ崟 formData锛夛紝瀛楁鍚嶄笌鍚庣 DevRentRespVO 涓�鑷� */
+  data: any
+  /** 閫氳繃璁惧鎺ュ彛鏌ュ埌鐨勮澶囧璞★紙鍙�夛紱鎻愪緵鏃朵紭鍏堢敤浜庛�岃澶囨弿杩般�嶏級 */
+  device?: any
+  /**
+   * 鏃堕棿瀛楁鐨勬爣绛炬ā寮忥細
+   *   'ready'    鈥斺�� 璁惧棰嗙敤椤碉紙rentTime=棰嗙敤鏃堕棿锛�
+   *   'install'  鈥斺�� 瑁呮満椤碉紙rentTime=瑁呮満鏃堕棿锛�
+   *   'dismantle'鈥斺�� 鎷嗘満椤碉紙rentTime=瑁呮満鏃堕棿銆乺eturnTime=鎷嗘満鏃堕棿锛�
+   */
+  timeLabelMode?: 'ready' | 'install' | 'dismantle'
+  /** 姣忓垪鏍呮牸瀹藉害锛堥粯璁� 6 = 涓�琛屽洓鍒楋級 */
+  span?: number
+}>()
+
+const d = computed(() => props.data || {})
+const colSpan = computed(() => props.span ?? 6)
+const mode = computed(() => props.timeLabelMode ?? 'install')
+
+/** 棰嗙敤鏃堕棿鐨勬爣绛� */
+const rentTimeLabel = computed(() => (mode.value === 'ready' ? '棰嗙敤鏃堕棿' : '瑁呮満鏃堕棿'))
+/** 褰掕繕鏃堕棿鐨勬爣绛撅紙鎷嗘満椤垫墠鏈夋剰涔夛級 */
+const returnTimeLabel = computed(() => (mode.value === 'dismantle' ? '鎷嗘満鏃堕棿' : '鎷嗘満鏃堕棿'))
+
+/** 璁惧鎻忚堪锛氫紭鍏堢敤璁惧鎺ュ彛瀵硅薄锛屽叾娆$敤鏁版嵁瀵硅薄鑷甫鐨� brand/model/devState */
+const deviceDesc = computed(() => {
+  const src = props.device ?? d.value
+  const parts = [src?.brand, src?.model].filter((v: any) => v !== undefined && v !== null && v !== '')
+  const stateText = tranlateDevState(src?.state ?? d.value?.devState)
+  const text = parts.join(' ')
+  if (!text && !stateText) return '-'
+  return `${text}${text && stateText ? ' ' : ''}${stateText ?? ''}`.trim() || '-'
+})
+
+/** 鍙栫涓�涓湁鍊肩殑鍊欓�夛紝绌哄垯杩斿洖 '-' */
+function pick(...vals: any[]): any {
+  for (const v of vals) {
+    if (v !== undefined && v !== null && v !== '') return v
+  }
+  return '-'
+}
+
+const devId = computed(() => pick(d.value.devId))
+const interference = computed(() => pick(d.value.interference))
+const detachment = computed(() => pick(d.value.detachment))
+const baseline = computed(() => pick(d.value.baseline))
+const remark = computed(() => pick(d.value.remark))
+const rentTime = computed(() => formatDateTime(d.value.rentTime) || '-')
+const returnTime = computed(() => formatDateTime(d.value.returnTime) || '-')
+const entryTime = computed(() => formatDateTime(d.value.entryTime) || '-')
+
+/** 甯冨皵绫诲瓧娈碉紙鑴辫惤/鍩虹嚎绮楋級鏄剧ず涓� 鏄�/鍚︼紱鍏跺畠鍊煎師鏍锋樉绀� */
+function yesNo(v: any): string {
+  if (v === '-' || v === undefined || v === null || v === '') return '-'
+  const s = String(v).trim()
+  if (s === '1' || s === 'true') return '鏄�'
+  if (s === '0' || s === 'false') return '鍚�'
+  return s
+}
+</script>
+
+<template>
+  <el-row :gutter="20">
+    <!-- 璁惧缂栧彿锛堝彲缂栬緫鏃剁敱鐖堕〉闈㈤�氳繃鎻掓Ы瑕嗙洊锛� -->
+    <el-col :span="colSpan">
+      <el-form-item label="璁惧缂栧彿">
+        <slot name="devId">{{ devId }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item label="璁惧鎻忚堪">
+        {{ deviceDesc }}
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item :label="rentTimeLabel">
+        <slot name="rentTime">{{ rentTime }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item label="鐧昏鏃堕棿">
+        <slot name="entryTime">{{ entryTime }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item :label="returnTimeLabel">
+        <slot name="returnTime">{{ returnTime }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item label="骞叉壈鏁�">
+        <slot name="interference">{{ interference }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item label="鑴辫惤">
+        <slot name="detachment">{{ yesNo(detachment) }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="colSpan">
+      <el-form-item label="鍩虹嚎绮�">
+        <slot name="baseline">{{ yesNo(baseline) }}</slot>
+      </el-form-item>
+    </el-col>
+
+    <el-col :span="24">
+      <el-form-item label="澶囨敞">
+        <slot name="remark">{{ remark }}</slot>
+      </el-form-item>
+    </el-col>
+  </el-row>
+</template>
+
+<style scoped lang="scss">
+/* 涓� PatientInfoBlock 淇濇寔涓�鑷达細鍘嬬缉琛岄棿璺濓紝閬垮厤琛ㄥ崟鎸ゅ崰涓嬫柟 el-table
+   锛圗lement Plus 榛樿 el-form-item margin-bottom 涓� 18px锛� */
+.el-form-item,
+:deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/src/views/ecg/doctor/components/PatientInfoBlock.vue b/src/views/ecg/doctor/components/PatientInfoBlock.vue
index f8713d4..da162af 100644
--- a/src/views/ecg/doctor/components/PatientInfoBlock.vue
+++ b/src/views/ecg/doctor/components/PatientInfoBlock.vue
@@ -87,124 +87,190 @@
 </script>
 
 <template>
-  <el-row :gutter="20">
-    <el-col :span="colSpan">
-      <el-form-item label="灏辫瘖娴佹按鍙�">
-        {{ d.episodeId || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col v-if="showSeqNum" :span="colSpan">
-      <el-form-item label="鎺掗槦搴忓彿">
-        {{ pick(d.seqNum, d.bookSeqNum) ?? '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鐢宠缂栧彿">
-        {{ d.applyNo || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <!-- 鏍囩鐢便�屽氨璇婂崱鍙枫�嶆敼涓恒�岄棬璇婂彿銆嶏紙缁忕‘璁わ紝璇﹁銆婇儴缃叉竻鍗曘��5.1锛夛細
+  <div class="patient-info-block">
+    <!--
+      鎮h�呮爣璇嗗ご锛堥啋鐩樉绀哄綋鍓嶆偅鑰咃級銆�
+      鑳屾櫙锛氶渶姹�1 鐨� 18 椤逛俊鎭潡閲岋紝濮撳悕鍙崰鍏朵腑涓�鏍笺�佷笌鍏跺畠瀛楁鍚屾牱瀛楀彿锛�
+      鏌ョ湅鏃跺鏄�"鐪嬩笉鍒板鍚�"銆傝繖閲屾妸瀹冨崟鐙彁鍑烘潵鍋氭垚鏍囬琛岋紝
+      骞跺甫涓婃偅鑰呯紪鍙� / 鎺掗槦搴忓彿 / 鐘舵�侊紝淇濊瘉"褰撳墠鏄皝"涓�鐪煎彲瑙併��
+      鍚勯〉闈紙鍙彿妫�鏌ャ�佽澶囬鐢ㄣ�佽鏈恒�佹媶鏈恒�侀绾︾鍒帮級鍏辩敤鏈粍浠讹紝鏁呬竴鑷寸敓鏁堛��
+    -->
+    <div class="patient-identity">
+      <span class="pi-name">{{ d.patName || '鈥�' }}</span>
+      <span class="pi-item">鎮h�呯紪鍙凤細{{ d.patId || '-' }}</span>
+      <span class="pi-item">灏辫瘖鍙凤細{{ d.episodeId || '-' }}</span>
+      <span v-if="showSeqNum" class="pi-item">
+        鎺掗槦搴忓彿锛歿{ pick(d.seqNum, d.bookSeqNum) ?? '-' }}
+      </span>
+      <span v-if="d.status !== undefined && d.status !== null && statusDict" class="pi-item">
+        鐘舵�侊細<dict-tag :type="statusDict" :value="d.status" />
+      </span>
+      <span class="pi-item pi-warn" v-if="d.passed === 1 || d.passed === '1'">锛堝凡杩囧彿锛�</span>
+    </div>
+
+    <el-row :gutter="20">
+      <el-col :span="colSpan">
+        <el-form-item label="濮撳悕">
+          {{ d.patName || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="灏辫瘖鍙�">
+          {{ d.episodeId || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col v-if="showSeqNum" :span="colSpan">
+        <el-form-item label="鎺掗槦搴忓彿">
+          {{ pick(d.seqNum, d.bookSeqNum) ?? '-' }}
+        </el-form-item>
+      </el-col><el-col :span="colSpan">
+        <!-- 鏍囩鐢便�屽氨璇婂崱鍙枫�嶆敼涓恒�岄棬璇婂彿銆嶏紙缁忕‘璁わ紝璇﹁銆婇儴缃叉竻鍗曘��5.1锛夛細
            HIS 鍦ㄥ崱鍙锋Ы浣嶄紶绌猴紝medical_card 鍏ㄥ簱 159,116 琛屾棤涓�闈炵┖锛�
            璇ヤ綅缃疄闄呭睍绀� outpatient_no銆俢ardNo.from 鏍囨敞鍊肩殑鐪熷疄鏉ユ簮锛�
            鐢ㄤ簬鍖哄垎娣峰湪璇ュ瓧娈甸噷鐨勮韩浠借瘉鍙� / 浣忛櫌鍙枫�� -->
-      <el-form-item label="闂ㄨ瘖鍙�">
-        <span>{{ cardNo.value }}</span>
-        <el-tag v-if="cardNo.from" size="small" type="info" effect="plain" class="ml-1">
-          {{ cardNo.from }}
-        </el-tag>
-      </el-form-item>
-    </el-col>
+        <el-form-item label="闂ㄨ瘖鍙�">
+          <span>{{ cardNo.value }}</span>
+          <el-tag v-if="cardNo.from" size="small" type="info" effect="plain" class="ml-1">
+            {{ cardNo.from }}
+          </el-tag>
+        </el-form-item>
+      </el-col> <el-col :span="colSpan">
+        <el-form-item label="鐘舵��">
+          <dict-tag v-if="d.status !== undefined && d.status !== null && statusDict" :type="statusDict"
+            :value="d.status" />
+          <span v-else>-</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鐢宠缂栧彿">
+          {{ d.applyNo || '-' }}
+        </el-form-item>
+      </el-col><el-col :span="colSpan">
+        <el-form-item label="椤圭洰">
+          {{ checkType ? getCheckTypeName(checkType) : '-' }}
+        </el-form-item>
+      </el-col>
 
-    <el-col :span="colSpan">
-      <el-form-item label="濮撳悕">
-        {{ d.patName || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鎬у埆">
-        <!-- 1 鐢� / 2 濂筹紱0 鎴栫己澶憋紙HIS 鏈彁渚涳紝瀹炴祴搴撲腑鏈� 2123 琛� = 0锛夋樉绀�"鏈煡"銆�
+      <el-col :span="colSpan">
+        <el-form-item label="澶氳��">
+          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="d.tolerance ?? 0" />
+        </el-form-item>
+      </el-col><el-col :span="colSpan">
+        <el-form-item label="鏉ユ簮">
+          <dict-tag v-if="source !== undefined" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="source" />
+          <span v-else>-</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鎬у埆">
+          <!-- 1 鐢� / 2 濂筹紱0 鎴栫己澶憋紙HIS 鏈彁渚涳紝瀹炴祴搴撲腑鏈� 2123 琛� = 0锛夋樉绀�"鏈煡"銆�
              娉ㄦ剰涓嶈兘鐩存帴鎶� 0 浜ょ粰 dict-tag 鈥斺�� 瀛楀吀閲屾病鏈� 0 杩欎竴椤癸紝浼氭覆鏌撴垚绌虹櫧銆� -->
-        <dict-tag v-if="d.patGender === 1 || d.patGender === 2 || d.patGender === '1' || d.patGender === '2'"
-                  :type="DICT_TYPE.SYSTEM_USER_SEX" :value="d.patGender" />
-        <span v-else>鏈煡</span>
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鍑虹敓鏃ユ湡">
-        {{ formatDateOnly(d.patBirthday) || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="骞撮緞">
-        {{ formatAge(d.patBirthday) || '-' }}
-      </el-form-item>
-    </el-col>
+          <dict-tag v-if="d.patGender === 1 || d.patGender === 2 || d.patGender === '1' || d.patGender === '2'"
+            :type="DICT_TYPE.SYSTEM_USER_SEX" :value="d.patGender" />
+          <span v-else>鏈煡</span>
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鍑虹敓鏃ユ湡">
+          {{ formatDateOnly(d.patBirthday) || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="骞撮緞">
+          {{ formatAge(d.patBirthday) || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鎮h�呯數璇�">
+          {{ phone }}
+        </el-form-item>
+      </el-col>
 
-    <el-col :span="colSpan">
-      <el-form-item label="椤圭洰">
-        {{ checkType ? getCheckTypeName(checkType) : '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鏉ユ簮">
-        <dict-tag v-if="source !== undefined" :type="DICT_TYPE.ECG_PAT_SOURCE" :value="source" />
-        <span v-else>-</span>
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鐥呭尯">
-        {{ ward }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鐥呭簥鍙�">
-        {{ patBed }}
-      </el-form-item>
-    </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鐥呭尯">
+          {{ ward }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="鐥呭簥鍙�">
+          {{ patBed }}
+        </el-form-item>
+      </el-col>
 
-    <el-col :span="colSpan">
-      <el-form-item label="鎮h�呯數璇�">
-        {{ phone }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鐧昏鏃堕棿">
-        {{ formatDateTime(d.registerDate) || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="寮�鍗曟棩鏈�">
-        {{ formatDateTime(d.doctorTime) || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="璺濅粖澶╂暟">
-        {{ formatDaysFromOrder(d.doctorTime) || '-' }}
-      </el-form-item>
-    </el-col>
-
-    <el-col :span="colSpan">
-      <el-form-item label="寮�鍗曞尰甯�">
-        {{ d.doctor || '-' }}
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="鐘舵��">
-        <dict-tag v-if="d.status !== undefined && d.status !== null && statusDict"
-                  :type="statusDict" :value="d.status" />
-        <span v-else>-</span>
-      </el-form-item>
-    </el-col>
-    <el-col :span="colSpan">
-      <el-form-item label="澶氳��">
-        <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="d.tolerance ?? 0" />
-      </el-form-item>
-    </el-col>
-    <el-col v-if="showAdvice" :span="colSpan">
-      <el-form-item label="鍖诲槺鍙�">
-        {{ d.doctorAdviceNo || '-' }}
-      </el-form-item>
-    </el-col>
-  </el-row>
+      <el-col :span="colSpan">
+        <el-form-item label="鐧昏鏃堕棿">
+          {{ formatDateTime(d.registerDate) || '-' }}
+        </el-form-item>
+      </el-col><el-col :span="colSpan">
+        <el-form-item label="寮�鍗曞尰甯�">
+          {{ d.doctor || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="寮�鍗曟棩鏈�">
+          {{ formatDateTime(d.doctorTime) || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col :span="colSpan">
+        <el-form-item label="璺濅粖澶╂暟">
+          {{ formatDaysFromOrder(d.doctorTime) || '-' }}
+        </el-form-item>
+      </el-col>
+      <el-col v-if="showAdvice" :span="colSpan">
+        <el-form-item label="鍖诲槺鍙�">
+          {{ d.doctorAdviceNo || '-' }}
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </div>
 </template>
+
+<style scoped lang="scss">
+/* ==========================================================================
+   绱у噾鎺掔増锛氭湰缁勪欢姣忎釜鐣岄潰閮借鐢紝18 椤规寜 4 鍒� = 5 琛屻��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   5 琛岀害 90px 绾棿璺濓紝浼氭妸涓嬫柟 el-table 鎸ゆ帀锛堢敤鎴峰弽棣�"琛ㄥ崟鎸ゅ崰琛ㄦ牸"锛夈��
+   杩欓噷缁熶竴鍘嬪埌 4px锛屽苟鏀剁揣鏍囪瘑澶淬��
+   鈿狅笍 `.el-form-item` 鏄湰缁勪欢娓叉煋鍑虹殑鍏冪礌锛堟ā鏉跨洿鎺ュ啓浜� el-form-item锛夛紝
+      甯� scoped 灞炴�э紝鏁呬笉甯� :deep 涔熻兘鍛戒腑锛涘悓鏃朵繚鐣� :deep 鍏滃簳銆�
+   ========================================================================== */
+.el-form-item,
+:deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+
+/* 鎮h�呮爣璇嗗ご锛氳"褰撳墠鏄摢浣嶆偅鑰�"涓�鐪煎彲瑙� */
+.patient-identity {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 2px 16px;
+  margin-bottom: 6px;
+  padding: 3px 10px;
+  border-left: 3px solid var(--el-color-primary);
+  background-color: var(--el-color-primary-light-9);
+  border-radius: 4px;
+
+  .pi-name {
+    font-size: 16px;
+    font-weight: 700;
+    color: var(--el-color-primary);
+    margin-right: 4px;
+    line-height: 22px;
+  }
+
+  .pi-item {
+    font-size: 13px;
+    color: var(--el-text-color-regular);
+    display: inline-flex;
+    align-items: center;
+    gap: 4px;
+    line-height: 22px;
+  }
+
+  .pi-warn {
+    color: var(--el-color-danger);
+    font-weight: 600;
+  }
+}
+</style>
diff --git a/src/views/ecg/doctor/components/QueuePanel.vue b/src/views/ecg/doctor/components/QueuePanel.vue
index 663b521..2562362 100644
--- a/src/views/ecg/doctor/components/QueuePanel.vue
+++ b/src/views/ecg/doctor/components/QueuePanel.vue
@@ -45,25 +45,110 @@
   message.info(data)
 }
 
+/**
+ * 闇�姹傦細鍙充晶鎮h�呭垪琛ㄨ鎶娿�屽氨璇婁腑 / 宸茶繃鍙� / 鍊欒瘖涓�嶇敤涓嶅悓棰滆壊鍖哄垎锛屾柟渚垮尰鐢熻瘑鍒��
+ *
+ * 棰滆壊鏂规锛堝乏渚ц壊鏉� + 娴呰壊搴� + 宸︿晶绔栫嚎锛夛細
+ *   路 灏辫瘖涓�(30)      鈥斺�� 钃濊壊锛堜富鑹诧級  锛氭鍦ㄧ湅鐨勬偅鑰咃紝鏈�閱掔洰
+ *   路 宸茶繃鍙�(3/5)     鈥斺�� 绾㈣壊          锛氶渶瑕佸叧娉紙鍙兘宸查敊杩囧彨鍙凤級
+ *   路 鍊欒瘖涓�(20/15)   鈥斺�� 缁胯壊          锛氭甯哥瓑寰�
+ *   路 鍏朵粬            鈥斺�� 鐏拌壊          锛氭帓闃熶腑/浜插拰/宸查鐢�/瀹夎涓瓑
+ *
+ * 涔嬫墍浠ヤ笉鍙潬 dict-tag 鐨勬枃瀛楋細鍖荤敓鎵竴鐪煎垪琛ㄦ椂瑕佽兘**蹇�熷畾浣�**褰撳墠灏辫瘖鑰呬笌杩囧彿鑰咃紝
+ * 棰滆壊姣旀枃瀛楁洿蹇��
+ */
+const rowClass = (item: any): string => {
+  const st = Number(item?.status)
+  if (st === 30) return 'row-onstage'            // 灏辫瘖涓�
+  if (st === 3 || st === 5) return 'row-passed'  // 宸茶繃鍙凤紙鍚�"宸茶繃鍙�-鎺掗槦"锛�
+  if (st === 20 || st === 15) return 'row-ready' // 鍊欒瘖涓� / 宸插彫鍥�
+  return 'row-other'
+}
 </script>
 
 <template>
-<div v-for="(item, index) in queue" :key="index">
-  <span style="display:inline-block; width:30px;"> {{item.seqNum}} </span>
-  <span style="display:inline-block; width:40px;"> {{getCheckTypeSeqPrefix(item.bookCheckType)}}{{item.bookSeqNum}} </span>
-  <span style="display:inline-block; width:70px;"> &nbsp; {{item.patName}}{{item.passed === 0 ? "":"*"}} </span>
-  <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="item.patGender" />
-<!--  {{item.roomName}} {{item.bedNo}}-->
-  {{getCheckTypeName(item.bookCheckType)}}
-  <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="item.status" />
-  <el-button v-if="item.status === 5 || item.status === 7" @click="recall(item)"> 鍙洖 </el-button>
+<div class="queue-list">
+  <div
+    v-for="(item, index) in queue"
+    :key="index"
+    class="queue-row"
+    :class="rowClass(item)"
+  >
+    <span class="col-seq"> {{item.seqNum}} </span>
+    <span class="col-bookseq"> {{getCheckTypeSeqPrefix(item.bookCheckType)}}{{item.bookSeqNum}} </span>
+    <span class="col-name"> &nbsp; {{item.patName}}{{item.passed === 0 ? "":"*"}} </span>
+    <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="item.patGender" />
+    {{getCheckTypeName(item.bookCheckType)}}
+    <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="item.status" />
+    <el-button v-if="item.status === 5 || item.status === 7" size="small" @click="recall(item)"> 鍙洖 </el-button>
+  </div>
 </div>
 </template>
 
+
 <style scoped lang="scss">
-div {
+/* 娉ㄦ剰锛氬師鍏堝啓鐨勬槸鍏ㄥ眬 `div { padding-left: 5px; padding-bottom: 5px; }`锛�
+   scoped 鍙姞灞炴�ч�夋嫨鍣ㄣ�佷粛浼氬懡涓湰缁勪欢鍐�**鎵�鏈�** div锛堝惈 dict-tag/el-button 鍐呴儴锛夛紝
+   杩欓噷鏀逛负鍙綔鐢ㄤ簬鏈垪琛ㄧ殑琛屽厓绱犮�� */
+.queue-list {
   padding-left: 5px;
-  padding-bottom: 5px;
 }
 
+.queue-row {
+  padding: 3px 6px;
+  margin-bottom: 3px;
+  border-left: 4px solid transparent;
+  border-radius: 3px;
+  line-height: 22px;
+}
+
+/* 灏辫瘖涓細钃濊壊锛堜富鑹诧級鈥斺�� 褰撳墠姝e湪澶勭悊鐨勬偅鑰� */
+.row-onstage {
+  background-color: var(--el-color-primary-light-8);
+  border-left-color: var(--el-color-primary);
+
+  .col-name {
+    font-weight: 700;
+    color: var(--el-color-primary);
+  }
+}
+
+/* 宸茶繃鍙凤細绾㈣壊 鈥斺�� 闇�鎻愰啋鍖荤敓娉ㄦ剰 */
+.row-passed {
+  background-color: var(--el-color-danger-light-8);
+  border-left-color: var(--el-color-danger);
+
+  .col-name {
+    font-weight: 600;
+    color: var(--el-color-danger);
+  }
+}
+
+/* 鍊欒瘖涓� / 宸插彫鍥烇細缁胯壊 鈥斺�� 姝e父绛夊緟 */
+.row-ready {
+  background-color: var(--el-color-success-light-8);
+  border-left-color: var(--el-color-success);
+}
+
+/* 鍏朵粬鐘舵�侊細鐏拌壊锛屽急鍖栨樉绀� */
+.row-other {
+  background-color: var(--el-fill-color-light);
+  border-left-color: var(--el-border-color);
+  color: var(--el-text-color-secondary);
+}
+
+.col-seq,
+.col-bookseq,
+.col-name {
+  display: inline-block;
+}
+.col-seq {
+  width: 30px;
+}
+.col-bookseq {
+  width: 40px;
+}
+.col-name {
+  width: 70px;
+}
 </style>
diff --git a/src/views/ecg/doctor/components/RoutinePanel.vue b/src/views/ecg/doctor/components/RoutinePanel.vue
index bfebfcd..cc50adb 100644
--- a/src/views/ecg/doctor/components/RoutinePanel.vue
+++ b/src/views/ecg/doctor/components/RoutinePanel.vue
@@ -1,157 +1,95 @@
 <!-- 甯歌妫�鏌� 鍖荤敓鐣岄潰-->
 <template>
-  <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
+  <el-form class="patient-compact-form" ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
+    <!-- ===== 缂栬緫鍖猴紙闇�瑕佸綍鍏ョ殑瀛楁锛�===== -->
     <el-row :gutter="20">
       <el-col :span="6">
-        <el-form-item label="鎮h�呯紪鍙�" prop="patId">
-          <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
-          <!--        
-          <Qrcode v-if="formData.patId !== undefined && formData.patId !== ''" :text="formData.patId" logo="/logo.gif" width=100 />
-          <Barcode v-if="displayBarCode" :value="displayBarCode" :width="100" />
-          <el-button @click="copyBarcode()">澶嶅埗</el-button>
-          -->
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="鎮h�呭悕绉�" prop="patName">
-          <el-input v-model="formData.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" />
-        </el-form-item>
-      </el-col><el-col :span="6">
-        <el-form-item label="鎬у埆">
-          {{ genderText }}
-        </el-form-item>
-      </el-col>
-
-      <el-col :span="6">
-        <el-form-item label="鑱旂郴鐢佃瘽" prop="episodeId">
-          <!-- 淇锛氬師璇� `patDetails.mobile`锛坬ueue 琛ㄧ殑 JSON 蹇収锛屽彧鍚� source/mobile/wardDesc/bedNo 鍥涘瓧娈碉級銆�
-               鑰� setPatient 宸叉妸鍚庣浠� appointment 鍥炲~鐨�**骞抽摵瀛楁** `patMobile` 璧嬭繘 formData锛�
-               鏁呭簲浠ュ钩閾哄瓧娈典紭鍏堬紝patDetails 浠呬綔鏃ф暟鎹洖閫�銆� -->
-          {{ formData.patMobile || formData?.patDetails?.mobile || '-' }}
-        </el-form-item>
-      </el-col>
-    </el-row>
-    <el-row>
-      <el-col :span="6">
-        <el-form-item label="灏辫瘖缂栧彿" prop="episodeId">
-          <el-input v-model="formData.episodeId" placeholder="璇疯緭鍏ユ偅鑰呭氨璇婄紪鍙�" />
-        </el-form-item>
-      </el-col><el-col :span="6">
-        <el-form-item label="鍑虹敓鏃ユ湡">
-          {{ fmtDate(formData.patBirthday) }}
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="骞撮緞">
-          {{ ageText }}
-        </el-form-item>
-      </el-col><el-col :span="6">
-        <el-form-item label="寮�鍗曞尰甯�">
-          {{ formData.doctor }}
-        </el-form-item>
-      </el-col>
-
-
-    </el-row>
-    <el-row><el-col :span="6">
         <el-form-item label="鐢宠鍗曞彿" prop="applyNo">
           <el-input v-model="formData.applyNo" placeholder="璇疯緭鍏ョ敵璇峰崟鍙�" />
         </el-form-item>
       </el-col>
-      <el-col :span="18">
-        <el-form-item label="绉戝鐥呭尯" prop="patDetails">
-          <!-- 淇锛氭潵婧愪笌鐥呭尯/搴婂彿鍘熻 `patDetails.*`锛坬ueue 琛ㄧ殑 JSON 蹇収锛屽彲鑳芥粸鍚庝笖甯哥己鐥呭尯锛夛紝
-               鏀逛负**骞抽摵瀛楁浼樺厛**锛堝悗绔凡浠� appointment 鍥炲~ patSrc/patWardDesc/patBedNo锛夛紝
-               patDetails 浠呬綔鏃ф暟鎹洖閫�銆� -->
-          <dict-tag v-if="formData.patSrc ?? formData.patDetails?.source"
-                    :type="DICT_TYPE.ECG_PAT_SOURCE"
-                    :value="formData.patSrc ?? formData.patDetails?.source" />
-          {{ formData.patWardDesc || formData?.patDetails?.wardDesc || '-' }}
-          - {{ formData.patBedNo || formData?.patDetails?.bedNo || '-' }}
-        </el-form-item></el-col>
-
-
+       <el-col :span="6">
+        <el-form-item label="妫�鏌ラ」鐩�" prop="">
+          {{ formData?.checkType && getCheckTypeName(formData?.checkType) }}
+        </el-form-item>
+      </el-col>      
+        <el-col :span="6">
+        <el-form-item label="鎮h�呯紪鍙�" prop="patId">
+          <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getRentInfoByPatId" />
+          <Barcode v-if="displayBarCode" :value="displayBarCode" :width="100" />
+          <el-button @click="copyBarcode()">澶嶅埗</el-button>
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
+        <el-form-item label="鎮h�呭鍚�" prop="patName">
+          <el-input v-model="formData.episodeId" placeholder="璇疯緭鍏ユ偅鑰呭鍚�" />
+        </el-form-item>
+      </el-col>        
     </el-row>
-    <el-row>
-      <el-col :span="6">
-        <el-form-item label="寮�鍗曟棩鏈�">
-          {{ fmtDate(formData.doctorTime) }}
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="璺濅粖澶╂暟">
-          {{ daysFromOrder }}
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="鍖诲槺鍙�">
-          <!-- 淇锛氭澶勫師鍏堢粦瀹氱殑鏄� `formData.applyNo`锛堢敵璇峰崟鍙凤級锛�
-               涓庛�屽尰鍢卞彿銆嶆槸**涓や釜涓嶅悓鐨勬爣璇�**锛�
-                 鐢宠鍗曞彿 apply_no           = HIS root 2.16.156.10011.1.24锛屼緥 2126091700011
-                 鍖诲槺鍙�   doctor_advice_no   = HIS root 2.16.156.10011.1.28锛屼緥 112663505
-               鍘熷啓娉曟槸鎶婄敵璇峰崟鍙峰啋鍏呮垚鍖诲槺鍙凤紝灞炰簬閿欒灞曠ず銆�
-               鐜版敼涓鸿鍚庣鏂伴噰闆嗙殑 doctorAdviceNo锛堣鑺傜偣瑙勮寖涓潪蹇呴』椤癸紝鍘嗗彶鏁版嵁涓虹┖ 鈫� 鏄剧ず '-'锛夈�� -->
-          {{ formData.doctorAdviceNo || '-' }}
-        </el-form-item>
-      </el-col><el-col :span="6">
-        <el-form-item label="鐧昏鏃堕棿">
-          {{ fmtDate(formData.registerDate) }}
-        </el-form-item>
-      </el-col>
 
-    </el-row>
-    <!-- 闇�姹�1锛氳ˉ榻愭湰闈㈡澘鍘熷厛缂哄け鐨勪袱椤癸紙鎺掗槦搴忓彿銆佺姸鎬侊級锛屼娇 18 椤归綈鍏� -->
-    <el-row>
-      <el-col :span="6">
-        <el-form-item label="鎺掗槦搴忓彿">
-          {{ formData?.seqNum ?? formData?.bookSeqNum ?? '-' }}
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="鐘舵��">
-          <dict-tag v-if="formData?.status !== undefined && formData?.status !== null"
-                    :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="formData.status" />
-          <span v-else>-</span>
-        </el-form-item>
-      </el-col>
-    </el-row>
-    <el-row>
+    <!-- ===== 鎮h�呬俊鎭紙闇�姹�1锛�18 椤圭粺涓�灞曠ず锛�**涓�琛屽洓鍒�**锛�=====
+         鍘熷厛鏈潰鏉挎妸 18 椤规墜鍐欏湪澶氳 el-col锛坰pan=6/18 娣锋帓锛夛紝
+         鐜扮粺涓�鏀圭敤 PatientInfoBlock 缁勪欢锛屼笌棰勭害绛惧埌/璁惧棰嗙敤/瑁呮満/鎷嗘満鍚勯〉**鍙e緞涓�鑷�**銆� -->
+    <PatientInfoBlock :data="formData" check-type-field="checkType" :span="6" />
+    <el-row>     
       <el-col :span="6">
         <el-form-item label="妫�鏌ユ椂闂�" prop="rentTime">
           <el-date-picker v-model="formData.rentTime" type="date" value-format="x" placeholder="閫夋嫨鏃堕棿" />
         </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="妫�鏌ラ」鐩�" prop="">
-          {{ formData?.checkType && getCheckTypeName(formData?.checkType) }}
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
-        <el-form-item label="澶氳�愯嵂" prop="tolerance">
-          <!-- 闇�姹�6锛氱粺涓�璧板瓧鍏� ecg_tolerance锛�0=鏃� 1=澶氳�� 2=澶氶噸鑰愯嵂锛夛紱
-               NULL 鎸�"鏃�"鏄剧ず锛圦12锛夈�傚師鍏堢‖缂栫爜"鍚�/鏄�/鏈煡"涓夊垎鏀紝涓庡瓧鍏搁噸澶嶄笖鏂囨涓嶇銆� -->
-          <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="formData.tolerance ?? 0" />
-        </el-form-item>
-      </el-col>
-      <el-col :span="6">
+      </el-col> 
+      <el-col :span="18">
         <el-form-item label="澶囨敞" prop="remark">
           <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" />
         </el-form-item>
       </el-col>
     </el-row>
   </el-form>
-  <el-button @click="submitForm" type="primary" :disabled="formLoading">妫�鏌ュ畬鎴�</el-button>
-  <el-button @click="cancelInstall" :disabled="formLoading">鏀惧純妫�鏌�</el-button>
-  <el-button @click="resetForm()">閲� 缃�</el-button>
-  <el-button @click="yddownload()" :loading="yddownloadLoading" :disabled="yddownloadLoading">骞虫澘杩愬姩蹇冪數鍥剧煡鎯呭悓鎰忎功</el-button>
-  <el-button @click="sgdownload()" :loading="sgdownloadLoading" :disabled="sgdownloadLoading">椋熺蹇冭剰鐢电敓鐞嗚瘖鐤楃煡鎯呭悓鎰忎功</el-button>
-  <el-button v-if="needAutoFeeConfirm(formData.checkType)" @click="feeConfirm" :disabled="formLoading">纭垂</el-button>
-  <el-button v-if="needAutoFeeConfirm(formData.checkType)" @click="feeCancel" :disabled="formLoading">鍙栨秷纭垂</el-button>
+  <div class="patient-actions">
+  <el-button size="small" @click="submitForm" type="primary" :disabled="formLoading">妫�鏌ュ畬鎴�</el-button>
+  <el-button size="small" @click="cancelInstall" :disabled="formLoading">鏀惧純妫�鏌�</el-button>
+  <el-button size="small" @click="resetForm()">閲� 缃�</el-button>
+  <el-button size="small" @click="yddownload()" :loading="yddownloadLoading" :disabled="yddownloadLoading">骞虫澘杩愬姩蹇冪數鍥剧煡鎯呭悓鎰忎功</el-button>
+  <el-button size="small" @click="sgdownload()" :loading="sgdownloadLoading" :disabled="sgdownloadLoading">椋熺蹇冭剰鐢电敓鐞嗚瘖鐤楃煡鎯呭悓鎰忎功</el-button>
+  <el-button size="small" v-if="needAutoFeeConfirm(formData.checkType)" @click="feeConfirm" :disabled="formLoading">纭垂</el-button>
+  <el-button size="small" v-if="needAutoFeeConfirm(formData.checkType)" @click="feeCancel" :disabled="formLoading">鍙栨秷纭垂</el-button>
+  </div>
 
   <!-- 鍖荤敓瑁呮満鍒楄〃 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @row-click="onRowClick">
-      <!--      <el-table-column label="id" align="center" prop="id" />-->
+  <!--
+    宸插畬鎴愯褰曞垪琛ㄣ��
+    婊氬姩鏂瑰紡锛�**涓棿鍐呭鍖鸿嚜韬粴鍔�**锛�.doctor-page__content 涓� overflow-y:auto锛夛紝
+    鎮h�呬俊鎭敤 sticky 鍥哄畾鍦ㄩ《閮紱搴曢儴 footer 鐢� DoctorPageLayout 鍥哄畾锛屾棤闇�婊氬姩鍗冲彲瑙併��
+    锛堟浘灏濊瘯璁� el-table 鍐呴儴婊氬姩浠ュ浐瀹氳〃澶达紝浣嗘湰椤圭洰 Element Plus 2.7.0 涓�
+       height/maxHeight 鍧囨湭鐢熸晥锛屽凡鍥為��锛岃瑙併�婇儴缃叉竻鍗曘��5.3.15銆傦級
+  -->
+  <div class="records-host">
+    <ContentWrap class="records-wrap">
+      <el-table
+        v-loading="loading"
+        :data="list"
+        :stripe="true"
+        :show-overflow-tooltip="true"
+        @row-click="onRowClick"
+      >
+      <!--
+        闇�姹�11锛堜慨姝o級锛氭妸銆屾挙閿�銆嶆斁鍦�**宸插畬鎴愭鏌ヨ褰曞垪琛ㄧ殑绗竴鍒�**閲屻��
+        鍘熷厛鏀惧湪琛ㄦ牸涓婃柟鐨勭嫭绔嬫寜閽锛屼綅缃笉瀵� 鈥斺�� 鐜版敼涓鸿鍒楃殑**琛ㄥご鎻掓Ы**锛�
+        浣垮叾鎴愪负琛ㄦ牸鐨勭涓�鍒楋紙涓斿彧鍑虹幇涓�娆★紝浣滅敤浜庢渶杩戜竴浣嶅凡瀹屾垚鎮h�咃紝
+        璇箟涓庡悗绔� lastFinishedPatient 涓�鑷达級銆�
+      -->
+      <el-table-column label="鎾ら攢" align="center" width="90px" fixed="left">
+        <template #header>
+          <el-button
+            link
+            type="warning"
+            :disabled="undoDisabled"
+            :loading="undoLoading"
+            @click="$emit('event_undo_finish')"
+          >
+            鎾ら攢
+          </el-button>
+        </template>
+      </el-table-column>
       <el-table-column label="妫�鏌ョ姸鎬�" align="center" prop="lost">
         <template #default="scope">
           <span v-if="scope.row.jobType === 60">宸叉鏌�</span>
@@ -190,11 +128,16 @@
         </template>
       </el-table-column>
 -->
-    </el-table>
+      </el-table>
+    </ContentWrap>
     <!-- 鍒嗛〉 -->
-    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
-      @pagination="getList" />
-  </ContentWrap>
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
 </template>
 
 <script setup lang="ts">
@@ -212,6 +155,15 @@
 import { Barcode } from '@/components/Barcode'
 import { useCheckTypeStore } from '@/store/modules/checkType'
 import { getCheckTypeName, needAutoFeeConfirm } from '../../../../utils/checkTypeFormatter'
+import { useRoomStore } from '@/store/modules/room'
+// 鈿狅笍 蹇呴』鏄惧紡 import锛歚unplugin-vue-components` 鐨� globs 鍙鐩�
+//    `src/components/**`锛堣 build/vite/index.ts 鐨� Components({ globs: [...] }))锛�
+//    鍥犳 src/components/ 涓嬬殑 Dialog銆丆ontentWrap銆丳agination 绛夊彲鑷姩寮曞叆锛�
+//    浣� **src/views/** 涓嬬殑鏈粍浠跺繀椤绘墜鍐� import**銆�
+//    鑻ユ紡鍐欙紝Vue 浼氭妸瀹冨綋鎴愩�屾湭鐭ユ爣绛俱��**闈欓粯涓嶆覆鏌�**锛堝彧鏈夋帶鍒跺彴 warning锛夛紝
+//    鑰� vite build 涓� ESLint 閮戒笉浼氭姤閿� 鈥斺�� 瀹炴祴鍥犳敼閫犳椂璇垹鏈 import锛�
+//    瀵艰嚧銆屽彨鍙锋鏌ャ�嶉〉闈㈡偅鑰呬俊鎭�**鏁村潡娑堝け**銆�
+import PatientInfoBlock from '@/views/ecg/doctor/components/PatientInfoBlock.vue'
 
 /** 璁惧瑁呮満 琛ㄥ崟 */
 defineComponent({ name: 'RoutinePanel' })
@@ -225,10 +177,24 @@
     type: [String, Number],
     required: false,
     default: null
+  },
+  /**
+   * 闇�姹�11锛氳褰曞垪琛ㄧ涓�鍒楃殑銆屾挙閿�銆嶆寜閽姸鎬侊紝鐢辩埗椤甸潰鎺у埗
+   * 锛堟挙閿�鍔ㄤ綔璇锋眰鍚庣銆侀渶瑕� loading 涓庣鐢ㄦ�侊紝閫昏緫淇濈暀鍦ㄧ埗椤甸潰锛夈��
+   */
+  undoDisabled: {
+    type: Boolean,
+    required: false,
+    default: false
+  },
+  undoLoading: {
+    type: Boolean,
+    required: false,
+    default: false
   }
 })
 
-const emit = defineEmits(['event_routine']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
+const emit = defineEmits(['event_routine', 'event_undo_finish'])
 
 const checkTypeStore = useCheckTypeStore()
 
@@ -486,6 +452,10 @@
 const loading = ref(true) // 鍒楄〃鐨勫姞杞戒腑
 const list = ref<JobRecordVO[]>([]) // 鍒楄〃鐨勬暟鎹�
 const total = ref(0) // 鍒楄〃鐨勬�婚〉鏁�
+// 褰撳墠璇婂淇℃伅锛堢敤浜庡彇璇婂寮�灞曠殑妫�鏌ラ」鐩仛鍏滃簳锛岃 syncRoomCheckTypes锛�
+const roomStore = useRoomStore()
+
+
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
@@ -498,10 +468,37 @@
   jobTime: [curDayStart(), curDayEnd()],
   summary: undefined,
   remark: undefined,
-  createTime: []
+  createTime: [],
+  // ========================================================================
+  // 鎸�**褰撳墠璇婂寮�灞曠殑妫�鏌ラ」鐩�**闅旂宸插畬鎴愯褰曘��
+  //
+  // 鑳屾櫙锛歚job_record` 琛ㄥ彧鏈� doc_id + check_type锛�**娌℃湁 room_id**锛�
+  // 鑰� /ecg/job-record/doctor-page 鏄己鍒舵寜鐧诲綍鍖荤敓鏌�"鑷繁鐨勮褰�"銆�
+  // 浜庢槸鍚屼竴鍖荤敓鍦ㄥ涓瘖瀹ゅ潗璇婃椂锛堝 1鍙烽棬璇� ct=[100,1100]銆�6鍙烽棬璇� ct=[400] 骞虫澘杩愬姩蹇冪數锛夛紝
+  // 鍙彿妫�鏌ラ〉浼氭妸**澶氫釜璇婂鐨勮褰曟贩鍦ㄤ竴璧�**鏄剧ず 鈥斺�� 姝f槸鐢ㄦ埛鍙嶉鐨勭幇璞°��
+  //
+  // 鐢卞悇椤甸潰锛圧outine.vue / index.vue / DevInstall.vue锛夊湪 onMounted 鏃�
+  // 鐢ㄥ綋鍓嶈瘖瀹ょ殑 checkTypes 璧嬪�硷紝骞跺湪姣忔鏌ヨ鍓嶅悓姝ワ紝纭繚鍒囪瘖瀹ゅ悗绔嬪嵆鐢熸晥銆�
+  // ========================================================================
+  checkTypes: undefined as number[] | undefined
 })
+
+/**
+ * 鎶娿�屽綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩�嶅悓姝ュ埌鏌ヨ鏉′欢锛屽疄鐜板凡瀹屾垚璁板綍鎸夎瘖瀹ら殧绂汇��
+ * 瑙� queryParams.checkTypes 鐨勮鏄庛��
+ */
+const syncRoomCheckTypes = () => {
+  // 浼樺厛鐢ㄩ〉闈紶鍏ョ殑璇婂淇℃伅锛涗负绌烘椂鍥為��鍒� store锛堟洿鍙潬锛岃 TitlePanel 鍚屽璇存槑锛�
+  const fromProp = props.room?.checkTypes
+  const types = (Array.isArray(fromProp) && fromProp.length > 0)
+    ? fromProp
+    : roomStore.room?.checkTypes
+  queryParams.checkTypes = (Array.isArray(types) && types.length > 0) ? [...types] : undefined
+}
 /** 鏌ヨ鍒楄〃 */
 const getList = async () => {
+  // 鏌ヨ鍓嶅悓姝ュ綋鍓嶈瘖瀹ゅ紑灞曠殑妫�鏌ラ」鐩紝淇濊瘉鍙樉绀烘湰璇婂鐨勮褰�
+  syncRoomCheckTypes()
   loading.value = true
   try {
     const data = await JobRecordApi.getJobRecordDoctorPage(queryParams)
@@ -516,8 +513,36 @@
   if (cur !== null) getSelectedRent(cur.rentId)
 }
 
+/**
+ * 鐐瑰嚮銆屽凡瀹屾垚妫�鏌ヨ褰曘�嶇殑鏌愪竴琛岋細鍙妸**璇ユ潯璁板綍**鐨勪俊鎭悎鍏ヨ〃鍗曘��
+ *
+ * 鈿狅笍 鍘熷疄鐜版槸 `formData.value = await DevRentApi.getDevRent(rentId)` 鈥斺�� **鏁翠釜鏇挎崲**銆�
+ * 鑰屽疄娴� `GET /ecg/dev-rent/get` 鐨勫搷搴旈噷锛岄櫎 `patName` 澶栫殑鎮h�呭瓧娈�**鍏ㄦ槸 null**锛�
+ *   {"patName":"鈥�","patGender":null,"patBirthday":null,"registerDate":null,"doctor":null,
+ *    "patMobile":null,"patPhone":null,"patWardDesc":null,"patBedNo":null,"outpatientNo":null,
+ *    "patIdentityId":null,"doctorAdviceNo":null,"tolerance":null}
+ * 鍘熷洜锛歚dev_rent` 琛�**涓嶅瓨**杩欎簺瀛楁锛屽畠浠槸鐢� `DevRentServiceImpl` 浠� appointment
+ * 鍥炲~鐨勶紱鑰� `/dev-rent/get` 杩欐潯璺緞**娌℃湁鍋氬洖濉�**銆�
+ *
+ * 鍚庢灉锛氬尰鐢熶竴鐐硅褰曡锛孭atientInfoBlock 閲岄櫎濮撳悕澶栫殑淇℃伅**鍏ㄩ儴鍙樻垚 '-'**锛�
+ * 琛ㄧ幇涓�"鎮h�呬俊鎭己澶�"銆�
+ *
+ * 淇锛�**淇濈暀褰撳墠鎮h�呬俊鎭�**锛屽彧鐢ㄨ繑鍥炵殑璁板綍瀛楁瑕嗙洊锛堜粎褰撹繑鍥炲�间负闈炵┖鏃讹級銆�
+ */
 const getSelectedRent = async (rentId) => {
-  formData.value = await DevRentApi.getDevRent(rentId)
+  const record = await DevRentApi.getDevRent(rentId)
+  if (!record) return
+  const merged = { ...formData.value } as Record<string, any>
+  Object.keys(record as Record<string, any>).forEach((k) => {
+    const v = (record as Record<string, any>)[k]
+    // 鍙鐩�"纭湁鍊�"鐨勫瓧娈碉紝閬垮厤鐢� null 鍐叉帀宸插洖濉ソ鐨勬偅鑰呬俊鎭�
+    if (v !== null && v !== undefined && v !== '') {
+      merged[k] = v
+    }
+  })
+  // 璁板綍閲屽彲鑳藉畬鍏ㄦ病鏈夋偅鑰呭瓧娈碉紝姝ゆ椂淇濈暀鍘熸偅鑰呬俊鎭�
+  if (!merged.patName) merged.patName = formData.value.patName
+  formData.value = merged as typeof formData.value
 }
 
 const cancelInstall = async () => {
@@ -603,3 +628,72 @@
   getList()
 })
 </script>
+
+<style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細琛ㄥ崟鍐呭鎸ゅ崰浜嗕笅鏂硅褰曡〃鏍肩殑绌洪棿 鈥斺�� 鍘嬬缉琛岄棿璺濄��
+   Element Plus 榛樿 `.el-form-item { margin-bottom: 18px }`锛�
+   鏈〉琛ㄥ崟鍚� 18 椤规偅鑰呬俊鎭紙4 鍒� = 5 琛岋級+ 9 椤硅澶囦俊鎭紝
+   浠呴棿璺濆氨瑕佷笂鐧� px锛屾妸 el-table 鎸ゅ埌鐪嬩笉瑙併��
+   杩欓噷缁熶竴鍘嬪埌 4px銆傛敞鎰� :deep 鏄繀闇�鐨勶紙el-form-item 鏄湰缁勪欢鐨勫瓙缁勪欢娓叉煋锛夈��
+   ========================================================================== */
+.patient-compact-form :deep(.el-form-item) {
+  margin-bottom: 4px;
+}
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖鸿嚜韬笉婊氬姩锛堟粴鍔ㄦ潯鍦ㄨ褰曡〃鏍间笂锛夛紝鍥犳**涓嶉渶瑕� position:sticky** 鈥斺��
+   鐩存帴浣滀负 flex 鐨勫浐瀹氶」锛坒lex:none锛夊嵆鍙缁堢暀鍦ㄩ《閮ㄣ��
+   鑳屾櫙涓嶉�忔槑锛屼繚璇佷笌涓嬫柟璁板綍琛ㄦ牸瑙嗚鍒嗙銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  flex: none;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+
+
+/* ==========================================================================
+   鎮h�呬俊鎭浐瀹氬湪鍐呭鍖洪《閮ㄣ��
+   鍐呭鍖猴紙.doctor-page__content锛夎嚜韬粴鍔紝鎵�浠ヨ繖閲屽繀椤荤敤 position:sticky
+   鎵嶈兘璁� 18 椤规偅鑰呬俊鎭湪璁板綍鍒楄〃婊氬姩鏃朵繚鎸佸彲瑙併��
+   鑳屾櫙涓嶉�忔槑锛岄伩鍏嶆粴鍔ㄥ唴瀹逛粠琛ㄥ崟椤归棿闅欓�忓嚭銆�
+   ========================================================================== */
+:deep(.doctor-page__content) > .patient-compact-form {
+  position: sticky;
+  top: 0;
+  z-index: 3;
+  padding-bottom: 4px;
+  background-color: var(--el-bg-color);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+}
+
+/* ==========================================================================
+   鎮h�呮搷浣滃姛鑳藉潡锛氫綅浜庛�屾偅鑰呬俊鎭�嶄笌銆屽凡瀹屾垚璁板綍鍒楄〃銆嶄箣闂达紝鐙珛鎴愬潡銆�
+   闇�姹傦細鍚勫姛鑳芥寜閽紙妫�鏌ュ畬鎴� / 鏀惧純妫�鏌� / 閲嶇疆 / 鐭ユ儏鍚屾剰涔� 鈥︼級**鎺掑湪涓�琛�**銆�
+   鍋氭硶锛歠lex + gap锛屽苟 **绂佹鎹㈣**锛坒lex-wrap:nowrap锛夛紱
+   鎸夐挳鐢� size="small" 浠ュ绾冲叏閮ㄦ寜閽紱鍗充娇瀹藉害涓嶈冻涔熶笉鎶樿銆�
+   涓婁笅杈规 + 搴曡壊锛屼娇瀹冧笌鎮h�呬俊鎭�佽褰曞垪琛ㄥ湪瑙嗚涓婂垎鍖恒��
+   ========================================================================== */
+.patient-actions {
+  display: flex;
+  flex: none;
+  flex-wrap: nowrap;
+  gap: 8px;
+  align-items: center;
+  /* 涓婁笅鐣欑櫧 + 鍒嗛殧绾匡紝褰㈡垚鐙珛鍔熻兘鍧� */
+  padding: 6px 4px;
+  margin-bottom: 6px;
+  background-color: var(--el-bg-color);
+  border-top: 1px solid var(--el-border-color-lighter);
+  border-bottom: 1px solid var(--el-border-color-lighter);
+
+  /* Element Plus 缁欑浉閭� el-button 榛樿鍔犱簡 margin-left:12px锛屼細涓� gap 鍙犲姞锛屾竻鎺� */
+  :deep(.el-button + .el-button) {
+    margin-left: 0;
+  }
+}
+</style>
diff --git a/src/views/ecg/doctor/components/TitlePanel.vue b/src/views/ecg/doctor/components/TitlePanel.vue
index 9bb66ee..dc65eca 100644
--- a/src/views/ecg/doctor/components/TitlePanel.vue
+++ b/src/views/ecg/doctor/components/TitlePanel.vue
@@ -2,6 +2,7 @@
 import {defineComponent, PropType} from "vue";
 import {PatientStatisticVO, RoomBedVO} from "@/api/ecg/doctor";
 import {useCheckTypeStore} from "@/store/modules/checkType";
+import {useRoomStore} from "@/store/modules/room";
 import {getCheckTypeName} from "../../../../utils/checkTypeFormatter";
 
 defineComponent({
@@ -21,47 +22,162 @@
 })
 
 const checkTypeStore = useCheckTypeStore();
+const roomStore = useRoomStore();
+
+/**
+ * 鏈伐浣嶅紑灞曠殑妫�鏌ラ」鐩紙璇婃柇闂锛�"鏍囬鏍忎笉鏄剧ず妫�鏌ラ」鐩�"锛夈��
+ *
+ * 浼樺厛鍙栭〉闈紶鍏ョ殑 `props.room.checkTypes`锛�**涓虹┖鏃跺洖閫�鍒� store**銆�
+ *
+ * 涓轰粈涔堣鍏滃簳锛歚props.room` 鏄皟鐢ㄦ柟鑷繁鐨勪竴涓瓧闈㈤噺瀵硅薄
+ * 锛堝 Routine.vue 鐨� `const roomBedVO: RoomBedVO = { 鈥�, checkTypes: null }`锛夛紝
+ * 瀹冨湪 `onMounted` 閲屾墠琚祴鍊� `roomStore.room.checkTypes`銆傚彧瑕佽繖鏉¤祴鍊奸摼璺�
+ * 鏈変换浣曚竴鐜病璧板埌锛堜緥濡傚埛鏂板悗 store 鎭㈠涓嶅畬鏁淬�侀〉闈㈡湭璧� onMounted 鐨勮祴鍊煎垎鏀級锛�
+ * 鏍囬鏍忓氨浼�**闈欓粯鍦颁粈涔堥兘涓嶆樉绀�**銆傝�� store 閲岀殑璇婂淇℃伅涓�瀹氭惡甯� checkTypes
+ * 锛堢敱銆岃瘖瀹ら�夋嫨銆嶅啓鍏ュ苟鎸佷箙鍖栵級锛屽洜姝ょ敤瀹冨厹搴曟洿鍙潬銆�
+ */
+const roomCheckTypes = computed<number[]>(() => {
+  const fromProp = props.room?.checkTypes
+  if (Array.isArray(fromProp) && fromProp.length > 0) {
+    return fromProp
+  }
+  const fromStore = roomStore.room?.checkTypes
+  return Array.isArray(fromStore) ? fromStore : []
+})
+
+/**
+ * 鎶婅宸ヤ綅鏀寔鐨勬鏌ラ」鐩悕鎷兼垚涓�涓诧紝渚涙爣棰樻爮**涓�琛�**灞曠ず銆�
+ *
+ * 涓轰粈涔堢敤妯℃澘瀛楃涓茶�屼笉鏄� v-for + span锛氬師鍏堟鏌ラ」鐩灞傚浜嗕竴涓潡绾� div锛�
+ * 瀵艰嚧蹇呯劧鎹㈣锛坋l-header 鍙湁 40px 楂橈紝涓よ浼氭孩鍑猴級銆�
+ * 鎷兼垚鍗曚釜鏂囨湰鑺傜偣鍚庯紝閰嶅悎 CSS `white-space:nowrap` + `text-overflow:ellipsis`
+ * 鍗冲彲绋冲畾淇濇寔涓�琛岋紝瓒呴暱鏃剁渷鐣ュ彿鎴柇銆�
+ */
+const checkTypeNames = computed(() =>
+  roomCheckTypes.value
+    .map((checkType) => getCheckTypeName(checkType))
+    .filter((name) => !!name)
+    .join('  ')
+)
+
+/**
+ * 璇婂鍚� + 宸ヤ綅鍙� + 棰嗙敤/瀹夎鏍囪銆傚悓鏍峰湪 props 涓虹┖鏃跺洖閫�鍒� store锛�
+ * 閬垮厤鏍囬鏍忓乏渚ф暣鍧楀彉绌猴紙涓� roomCheckTypes 涓�鑷寸殑鍏滃簳鎬濊矾锛夈��
+ */
+const roomIdentity = computed(() => {
+  const fromProp = props.room
+  const roomName = fromProp?.roomName || roomStore.room?.roomName || ''
+  const bedNo = fromProp?.bedNo || roomStore.room?.bedNo || ''
+  const opType = fromProp?.opType ?? roomStore.room?.opType
+  const opTag = opType === 1 ? '棰嗙敤' : opType === 2 ? '瀹夎' : ''
+  return [roomName, bedNo, opTag].filter((s) => !!s).join(' ')
+})
 
 </script>
 
 <template>
-<div class="mytitle">
-    <div>
-      <img v-if="titleType !== room.opType"
-           src="@/assets/imgs/error.png"
-           alt="绂佹璁块棶鏈〉闈紝褰撳墠宸ヤ綅涓嶇鍚堣姹�"
-           width="20px"
-      />
-      {{room.roomName || ''}} {{room.bedNo || ''}} {{room.opType === 1?"棰嗙敤":""}} {{room.opType === 2?"瀹夎":""}}
-      <div>
-        <span v-for="(checkType, subIndex) in room.checkTypes" :key="subIndex">
-          {{getCheckTypeName(checkType)}} &nbsp;
-        </span>
-      </div>
-    </div>
-    <div v-if="titleType === 0">
-      宸叉鏌{patientStatistic.finishedNum??0}}
-      鍑嗗涓瓄{patientStatistic.readyNum??0}}
-      杩囧彿{{patientStatistic.passedNum??0}}
-      鎺掗槦涓瓄{patientStatistic.queuingNum??0}}
-    </div>
-    <div v-if="titleType === 1">
-      宸插彂鏀緖{patientStatistic.receivedNum??0}}
-      鍑嗗涓瓄{patientStatistic.readyNum??0}}
-      杩囧彿{{patientStatistic.passedNum??0}}
-      鎺掗槦涓瓄{patientStatistic.queuingNum??0}}
-    </div>
-    <div v-if="titleType === 2">
-      宸茶鏈簕{patientStatistic.finishedNum??0}}
-      寰呰鏈簕{patientStatistic.receivedNum??0}}
-    </div>
-</div>
+  <!--
+    闇�姹傦細鏍囬鏍忕殑銆岃瘖瀹ゅ悕绉� / 宸ヤ綅鍙� / 妫�鏌ラ」鐩�嶈鎺掑湪**涓�琛�**锛堝銆�6鍙烽棬璇� F1 骞虫澘杩愬姩蹇冪數銆嶏級锛�
+    鍙充晶鐨勭粺璁′俊鎭篃鐣欏湪鍚屼竴琛屻��
 
+    鍘熷厛鐨勭粨鏋勬槸锛�
+      <div> {{roomName}} {{bedNo}} 鈥�  <div><span v-for=妫�鏌ラ」鐩�/></div> </div>
+    鍏朵腑妫�鏌ラ」鐩闈㈠浜嗕竴涓�**鍧楃骇 div**锛屽洜姝ゆ鏌ラ」鐩繀鐒舵崲鍒扮浜岃锛�
+    鑰� el-header 鍙湁 40px 楂橈紝涓よ浼氭孩鍑恒��
+
+    鐜版敼涓猴細
+      路 宸︿晶鏁村潡鐢� `display:flex; align-items:center; white-space:nowrap`锛屽叏閮ㄨ鍐呮帓鍒楋紱
+      路 瓒呴暱鏃剁敤**鐪佺暐鍙�**鎴柇锛堜笉鎹㈣銆佷笉鎾戠牬 40px 楂樺害锛夛紱
+      路 鍙充晶缁熻 flex:none 闈犲彸锛屽苟鍏佽鑷鏀剁缉銆�
+  -->
+  <div class="mytitle">
+    <!-- 宸︼細宸ヤ綅鏍囪瘑 + 妫�鏌ラ」鐩紝鍏ㄩ儴涓�琛� -->
+    <div class="mytitle__left">
+      <img
+        v-if="titleType !== room.opType"
+        class="mytitle__warn"
+        src="@/assets/imgs/error.png"
+        alt="绂佹璁块棶鏈〉闈紝褰撳墠宸ヤ綅涓嶇鍚堣姹�"
+      />
+      <span class="mytitle__room">
+        {{ roomIdentity }}
+      </span>
+      <!-- 妫�鏌ラ」鐩細鏈夊�兼墠娓叉煋锛堥伩鍏嶅嚭鐜颁竴涓┖鐧藉崰浣嶏級 -->
+      <span v-if="checkTypeNames" class="mytitle__checktypes">
+        {{ checkTypeNames }}
+      </span>
+    </div>
+
+    <!-- 鍙筹細缁熻淇℃伅锛堝悓涓�琛屾渶鍙筹級 -->
+    <div class="mytitle__stat">
+      <template v-if="titleType === 0">
+        宸叉鏌{ patientStatistic.finishedNum ?? 0 }}
+        鍑嗗涓瓄{ patientStatistic.readyNum ?? 0 }}
+        杩囧彿{{ patientStatistic.passedNum ?? 0 }}
+        鎺掗槦涓瓄{ patientStatistic.queuingNum ?? 0 }}
+      </template>
+      <template v-else-if="titleType === 1">
+        宸插彂鏀緖{ patientStatistic.receivedNum ?? 0 }}
+        鍑嗗涓瓄{ patientStatistic.readyNum ?? 0 }}
+        杩囧彿{{ patientStatistic.passedNum ?? 0 }}
+        鎺掗槦涓瓄{ patientStatistic.queuingNum ?? 0 }}
+      </template>
+      <template v-else-if="titleType === 2">
+        宸茶鏈簕{ patientStatistic.finishedNum ?? 0 }}
+        寰呰鏈簕{ patientStatistic.receivedNum ?? 0 }}
+      </template>
+    </div>
+  </div>
 </template>
 
 <style scoped lang="scss">
 .mytitle {
   display: flex;
+  align-items: center;
   justify-content: space-between;
+  height: 100%;
+  /* 鏍囬鏍忓彧鏈� 40px 楂橈細鏁磋涓嶆崲琛岋紝瓒呴暱鐢ㄧ渷鐣ュ彿 */
+  overflow: hidden;
+  font-size: 18px;
+  line-height: 1;
+}
+
+/* 宸︼細宸ヤ綅鏍囪瘑 + 妫�鏌ラ」鐩紝鍏ㄩ儴鎺掑湪涓�琛� */
+.mytitle__left {
+  display: flex;
+  align-items: center;
+  flex: 1;
+  gap: 10px;
+  min-width: 0; /* 鍏佽鏀剁缉锛岄厤鍚堢渷鐣ュ彿 */
+  white-space: nowrap;
+}
+
+.mytitle__warn {
+  flex: none;
+  width: 20px;
+  height: 20px;
+}
+
+/* 璇婂鍚� + 宸ヤ綅鍙凤細浼樺厛瀹屾暣鏄剧ず锛屽疄鍦ㄦ斁涓嶄笅鎵嶆埅鏂� */
+.mytitle__room {
+  flex: none;
+  font-weight: 600;
+}
+
+/* 妫�鏌ラ」鐩細鍗犳弧鍓╀綑绌洪棿锛岃秴闀挎埅鏂� */
+.mytitle__checktypes {
+  flex: 0 1 auto;
+  min-width: 0;
+  overflow: hidden;
+  color: var(--el-color-primary);
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* 鍙筹細缁熻淇℃伅 */
+.mytitle__stat {
+  flex: none;
+  padding-left: 12px;
+  white-space: nowrap;
 }
 </style>
diff --git a/src/views/ecg/doctor/index.vue b/src/views/ecg/doctor/index.vue
index ade5683..a8ee93a 100644
--- a/src/views/ecg/doctor/index.vue
+++ b/src/views/ecg/doctor/index.vue
@@ -8,6 +8,7 @@
 
 import TitlePanel from "@/views/ecg/doctor/components/TitlePanel.vue";
 import QueuePanel from "@/views/ecg/doctor/components/QueuePanel.vue";
+import DoctorPageLayout from "@/components/DoctorPageLayout/src/DoctorPageLayout.vue";
 import {DoctorApi, PatientStatisticVO, RoomBedVO} from '@/api/ecg/doctor';
 import {QueueVO} from "@/api/ecg/queue";
 import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
@@ -135,8 +136,8 @@
   }
   try {
     await ElMessageBox.confirm(
-      `纭畾鎾ら攢銆�${last.patName || last.patId}銆嶇殑妫�鏌ュ畬鎴愬悧锛熻鎮h�呭皢鍥炲埌鍊欒瘖鍖恒�俙,
-      '鎾ら攢妫�鏌ュ畬鎴�',
+      `纭畾鎾ら攢銆�${last.patName || last.patId}銆嶇殑銆屽畬鎴愩�嶇姸鎬佸悧锛熻鎮h�呭皢鍥炲埌鍊欒瘖鍖恒�俙,
+      '鎾ら攢',
       { type: 'warning', confirmButtonText: '纭畾鎾ら攢', cancelButtonText: '鍙栨秷' }
     )
   } catch {
@@ -149,7 +150,7 @@
       patId: last.patId,
       checkType: last.bookCheckType
     } as any)
-    ElMessage.success(msg || '宸叉挙閿�妫�鏌ュ畬鎴�')
+    ElMessage.success(msg || '宸叉挙閿�')
     await initLoad()
   } finally {
     undoFlag.value = false
@@ -270,23 +271,36 @@
 </script>
 
 <template>
-  <el-container>
-    <el-header style="background-color: var(--el-color-primary-light-7); font-size: 24px">
+  <!--
+    甯冨眬浼樺寲锛氬姛鑳芥寜閽浐瀹氬湪椤甸潰搴曢儴锛屼笉鍐嶇敤 position:absolute 娴湪鍐呭涓娿��
+    璇﹁ components/DoctorPageLayout锛堜笌鍙彿妫�鏌�/瑁呮満椤靛叡鐢ㄥ悓涓�甯冨眬锛夈��
+  -->
+  <DoctorPageLayout>
+    <template #header>
       <TitlePanel :titleType=1 :room="roomBedVO" :patientStatistic="patientStat" />
-    </el-header>
-    <el-container style="height: 100%;">
-      <el-main style="border: solid var(--el-color-primary-light-7)">
-        <DevReadyPanel :room="roomBedVO" ref="devReadyPanelRef" @event_dev_ready="onEventDevReady"/>
-      </el-main>
-      <el-aside width="400px" style="border: solid var(--el-color-primary-light-7)">
-          <QueuePanel :room="roomBedVO" :queue="patientList" @event_RecallFinish="onEventRecallFinish"/>
-      </el-aside>
-    </el-container>
-    <el-container class="right-bottom">
+    </template>
+
+    <DevReadyPanel
+      :room="roomBedVO"
+      ref="devReadyPanelRef"
+      :undo-disabled="undoFlag"
+      :undo-loading="undoFlag"
+      @event_dev_ready="onEventDevReady"
+      @event_undo_finish="undoFinish"
+    />
+
+    <template #aside>
+      <QueuePanel :room="roomBedVO" :queue="patientList" @event_RecallFinish="onEventRecallFinish"/>
+    </template>
+
+
+    <!-- 搴曢儴鎺т欢锛氳嚜鍔� + 鍔熻兘鎸夐挳 + 鍋滄鍊欒瘖锛屾暣缁勯潬鍙� -->
+    <template #footer>
+      <!-- 鑷姩 澶嶉�夋 -->
       <el-checkbox label="鑷姩&nbsp;" v-model="autoCall" />
       <el-button :disabled="finishFlag" type="primary" @click="finishNextPatient">鍙彿</el-button>
       <el-button :disabled="passFlag" type="primary" @click="passNextPatient">杩囧彿</el-button>
-      <el-button  type="primary" @click="callAgain">閲嶅彨</el-button>
+      <el-button type="primary" @click="callAgain">閲嶅彨</el-button>
       <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{state?'鏆傚仠':'鎭㈠'}}</el-button>
       <!-- 闇�姹�3锛氬仠姝㈠�欒瘖寮�鍏筹紙宸叉湁鍊欒瘖鐥呬汉缁х画鍙彿锛屼絾涓嶅啀鏂板鍊欒瘖鐥呬汉锛� -->
       <el-switch
@@ -295,23 +309,19 @@
         active-text="鍋滄鍊欒瘖"
         inactive-text="姝e父鎺ヨ瘖"
         inline-prompt
-        style="margin-left: 12px; --el-switch-on-color: #e6a23c"
+        style="--el-switch-on-color: #e6a23c"
         @change="onStopReadyChange"
       />
-      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿 / 鎾ら攢妫�鏌ュ畬鎴愶紙鍧囧洖鍒板�欒瘖鍖猴級 -->
+
+      <!-- 闇�姹�2锛氭挙閿�璇偣鍙彿锛堝洖鍒板�欒瘖鍖猴級銆�
+           闇�姹�11锛氥�屾挙閿�瀹屾垚銆嶅凡鏀瑰悕涓恒�屾挙閿�銆嶏紝骞剁Щ鍒般�屽凡瀹屾垚棰嗙敤璁板綍鍒楄〃銆嶇殑鏈�鍓嶉潰銆� -->
       <el-button :disabled="undoFlag" type="warning" plain @click="undoCall">鎾ら攢鍙彿</el-button>
-      <el-button :disabled="undoFlag" type="warning" plain @click="undoFinish">鎾ら攢瀹屾垚</el-button>
-    </el-container>
-  </el-container>
+    </template>
+  </DoctorPageLayout>
 </template>
 
-<style scoped lang="scss">
-.right-bottom {
-  position: absolute;
-  bottom: 50px;
-  right: 80px;
-  //background-color: #f00;
-  //color: #fff;
-  //padding: 10px;
-}
-</style>
+<!--
+  鍘熷厛杩欓噷鏈� .right-bottom { position:absolute; bottom:50px; right:80px }锛�
+  姝f槸"璁板綍鍒楄〃鍙橀暱鍚庣洊浣忓姛鑳芥寜閽�"鐨勬牴鍥狅紙鎸夐挳鑴辩鏂囨。娴併�佷笉鍗犲竷灞�绌洪棿锛夈��
+  鐜版敼鐢� DoctorPageLayout 鐨� #footer 鎵胯浇锛氭甯告枃妗f祦涓殑鍥哄畾搴曟爮锛屾棤闇�鍋忕Щ銆�
+-->
diff --git a/src/views/ecg/queue/QueueForm.vue b/src/views/ecg/queue/QueueForm.vue
index 0112c65..e982e23 100644
--- a/src/views/ecg/queue/QueueForm.vue
+++ b/src/views/ecg/queue/QueueForm.vue
@@ -21,7 +21,7 @@
       <el-form-item label="棰勭害鏃堕棿娈�" prop="bookTimeslot">
         <el-input v-model="formData.bookTimeslot" placeholder="璇疯緭鍏ラ绾︽椂闂存" />
       </el-form-item>
-      <el-form-item label="棰勭害妫�鏌ョ被鍨�" prop="bookCheckType">
+      <el-form-item label="棰勭害妫�鏌ラ」鐩�" prop="bookCheckType">
         <el-radio-group v-model="formData.bookCheckType">
           <el-radio :value="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
         </el-radio-group>
diff --git a/src/views/ecg/queue/index.vue b/src/views/ecg/queue/index.vue
index b1d5f8f..6e071dd 100644
--- a/src/views/ecg/queue/index.vue
+++ b/src/views/ecg/queue/index.vue
@@ -1,108 +1,53 @@
 <template>
   <ContentWrap>
     <!-- 鎼滅储宸ヤ綔鏍� -->
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="68px"
-    >
+    <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
       <el-form-item label="鎮h�呯紪鍙�" prop="patId">
-        <el-input
-          v-model="queryParams.patId"
-          placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎮h�呭鍚�" prop="patName">
-        <el-input
-          v-model="queryParams.patName"
-          placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.patName" placeholder="璇疯緭鍏ユ偅鑰呭鍚�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="棰勭害鏃舵" prop="bookTimeslot">
-        <el-select
-          v-model="queryParams.bookTimeslot"
-          placeholder="璇疯緭鍏ラ绾︽椂娈�"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.ECG_BOOK_TIMESLOT)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
+        <el-select v-model="queryParams.bookTimeslot" placeholder="璇疯緭鍏ラ绾︽椂娈�" clearable class="!w-240px">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_BOOK_TIMESLOT)" :key="dict.value"
+            :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="妫�鏌ョ被鍨�" prop="bookCheckType">
-        <el-select
-          v-model="queryParams.bookCheckType"
-          placeholder="璇烽�夋嫨妫�鏌ョ被鍨�"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in checkTypeStore.getCheckTypeOptions()"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
+      <el-form-item label="妫�鏌ラ」鐩�" prop="bookCheckType">
+        <el-select v-model="queryParams.bookCheckType" placeholder="璇烽�夋嫨妫�鏌ラ」鐩�" clearable class="!w-240px">
+          <el-option v-for="dict in checkTypeStore.getCheckTypeOptions()" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="鎺掗槦搴忓彿" prop="seqNum">
-        <el-input
-          v-model="queryParams.seqNum"
-          placeholder="璇疯緭鍏ユ帓闃熷簭鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.seqNum" placeholder="璇疯緭鍏ユ帓闃熷簭鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="鎺掗槦鐘舵��" prop="status">
-        <el-select
-          multiple
-          v-model="queryParams.status"
-          placeholder="璇烽�夋嫨鎺掗槦鐘舵��"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.ECG_QUEUE_STATUS)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
+        <el-select multiple v-model="queryParams.status" placeholder="璇烽�夋嫨鎺掗槦鐘舵��" clearable class="!w-240px">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ECG_QUEUE_STATUS)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="璇婂缂栧彿" prop="roomId">
-        <el-input
-          v-model="queryParams.roomId"
-          placeholder="璇疯緭鍏ヨ瘖瀹ょ紪鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.roomId" placeholder="璇疯緭鍏ヨ瘖瀹ょ紪鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item label="璇婄枟搴婂彿" prop="bedNo">
-        <el-input
-          v-model="queryParams.bedNo"
-          placeholder="璇疯緭鍏ヨ瘖鐤楀簥鍙�"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
+        <el-input v-model="queryParams.bedNo" placeholder="璇疯緭鍏ヨ瘖鐤楀簥鍙�" clearable @keyup.enter="handleQuery"
+          class="!w-240px" />
       </el-form-item>
       <el-form-item>
-        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button>
-        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button>
-<!--
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" /> 鎼滅储
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆
+        </el-button>
+        <!--
         <el-button
           type="primary"
           plain
@@ -112,7 +57,7 @@
           <Icon icon="ep:plus" class="mr-5px" /> 鏂板
         </el-button>
 -->
-<!--
+        <!--
         <el-button
           type="success"
           plain
@@ -132,7 +77,7 @@
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
       <el-table-column label="鎿嶄綔" align="center" min-width="120px">
         <template #default="scope">
-<!--          <el-button
+          <!--          <el-button
               link
               type="primary"
               @click="openAppointmentForm('preview', scope.row.patId, scope.row.bookCheckType)"
@@ -150,41 +95,51 @@
                       鍒犻櫎
                     </el-button>
           -->
-          <el-button
-              link
-              type="danger"
-              @click="handleJump(scope.row)"
-              v-if="scope.row.status === 10"
-              v-hasPermi="['ecg:queue:jump']"
-          >
-            {{scope.row.jumpFlag === 0? "鍔犳��" : "鍙栨秷鍔犳��"}}
+          <el-button link type="danger" @click="handleJump(scope.row)" v-if="scope.row.status === 10"
+            v-hasPermi="['ecg:queue:jump']">
+            {{ scope.row.jumpFlag === 0 ? "鍔犳��" : "鍙栨秷鍔犳��" }}
           </el-button>
-          <el-button
-              link
-              type="danger"
-              @click="recall(scope.row)"
-              v-if="scope.row.status === 3 || scope.row.status === 5 || scope.row.status === 7"
-              v-hasPermi="['ecg:queue:recall']"
-          >
+          <el-button link type="danger" @click="recall(scope.row)"
+            v-if="scope.row.status === 3 || scope.row.status === 5 || scope.row.status === 7"
+            v-hasPermi="['ecg:queue:recall']">
             鍙洖
           </el-button>
-          <el-button
-              link
-              type="danger"
-              @click="passWaitingPatient(scope.row)"
-              v-if="scope.row.status === 10"
-              v-hasPermi="['ecg:queue:pass']"
-          >
+          <el-button link type="danger" @click="passWaitingPatient(scope.row)" v-if="scope.row.status === 10"
+            v-hasPermi="['ecg:queue:pass']">
             杩囧彿
           </el-button>
         </template>
       </el-table-column>
-<!--      <el-table-column label="id" align="center" prop="id" />-->
-      <el-table-column label="灏辫瘖娴佹按鍙�" align="center" prop="episodeId" min-width="110px"/>
-      <el-table-column label="鐢宠鍙�" align="center" prop="applyNo" min-width="110px"/>
+      <!--      <el-table-column label="id" align="center" prop="id" />-->
+      <el-table-column label="鐢宠鍗曞彿" align="center" prop="applyNo" min-width="110px" />      
       <el-table-column label="鎺掗槦搴忓彿" align="center" prop="seqNum" />
       <el-table-column label="棰勭害鍙�" align="center" prop="bookSeqNum" />
+      <el-table-column label="杩囧彿鏍囪" align="center" prop="passed" />
       <el-table-column label="鎮h�呯紪鍙�" align="center" prop="patId" />
+      <el-table-column label="鎮h�呭鍚�" align="center" prop="patName" min-width="90px" /><el-table-column label="妫�鏌ラ」鐩�"
+        align="center" prop="bookCheckType" min-width="100px">
+        <template #default="scope">
+          {{ getCheckTypeName(scope.row.bookCheckType) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="鏉ユ簮" align="center" width="90px">
+        <template #default="scope">
+          <!-- 浼樺厛鐢ㄩ绾﹀崟骞抽摵鍊硷紝鍥為��鍒� patDetails 蹇収 -->
+          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE" :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" />
+        </template>
+      </el-table-column>
+      <el-table-column label="棰勭害鏃舵" align="center" prop="bookTimeslot" min-width="100px">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
+        </template>
+      </el-table-column>
+      <el-table-column label="鐘舵��" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="VIP" align="center" prop="isVip" />
+      <el-table-column label="灏辫瘖鍙�" align="center" prop="episodeId" min-width="110px" />
       <!-- 鏈垪鏍囩鐢便�屽氨璇婂崱鍙枫�嶆敼涓恒�岄棬璇婂彿銆嶏紙缁忕‘璁わ級銆傚師鍥狅紙璇﹁銆婇儴缃叉竻鍗曘��5.1锛夛細
            HIS 鍦ㄥ崱鍙锋Ы浣嶄紶绌猴紝medical_card 鍏ㄥ簱 159,116 琛�**鏃犱竴闈炵┖**锛�
            瀹炴祴璇ュ垪 99.9% 鏄剧ず鐨勬槸 outpatient_no锛�65% 褰㈠韬唤璇併��35% 涓洪棬璇婂彿锛夈��
@@ -204,16 +159,8 @@
           {{ scope.row.doctorAdviceNo || '-' }}
         </template>
       </el-table-column>
-      <el-table-column label="鎮h�呭鍚�" align="center" prop="patName" min-width="90px" />
       <el-table-column label="鎬у埆" align="center" prop="patGender" width="70px">
         <template #default="scope">{{ genderFormat(scope.row.patGender) }}</template>
-      </el-table-column>
-      <el-table-column label="鏉ユ簮" align="center" width="90px">
-        <template #default="scope">
-          <!-- 浼樺厛鐢ㄩ绾﹀崟骞抽摵鍊硷紝鍥為��鍒� patDetails 蹇収 -->
-          <dict-tag :type="DICT_TYPE.ECG_PAT_SOURCE"
-                    :value="scope.row.patSrc ?? scope.row.patDetails?.source ?? 0" />
-        </template>
       </el-table-column>
       <el-table-column label="鍑虹敓鏃ユ湡" align="center" min-width="110px">
         <template #default="scope">{{ formatDateOnly(scope.row.patBirthday) }}</template>
@@ -221,11 +168,7 @@
       <el-table-column label="骞撮緞" align="center" width="80px">
         <template #default="scope">{{ formatAge(scope.row.patBirthday) }}</template>
       </el-table-column>
-      <el-table-column label="妫�鏌ョ被鍨�" align="center" prop="bookCheckType" min-width="100px">
-        <template #default="scope">
-          {{getCheckTypeName(scope.row.bookCheckType)}}
-        </template>
-      </el-table-column>
+
       <el-table-column label="鐥呭尯" align="center" min-width="110px">
         <template #default="scope">{{ scope.row.patWardDesc || scope.row.patDetails?.wardDesc || '-' }}</template>
       </el-table-column>
@@ -253,43 +196,22 @@
       <el-table-column label="寮�鍗曞尰甯�" align="center" prop="doctor" min-width="100px">
         <template #default="scope">{{ scope.row.doctor || '-' }}</template>
       </el-table-column>
-      <el-table-column label="棰勭害鏃舵" align="center" prop="bookTimeslot" min-width="100px">
+
+      <el-table-column label="澶氳�愯嵂" width="150" align="center" prop="tolerance">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.ECG_BOOK_TIMESLOT" :value="scope.row.bookTimeslot" />
-        </template>
-      </el-table-column>
-      <el-table-column label="鐘舵��" align="center" prop="status" >
-        <template #default="scope">
-          <dict-tag :type="DICT_TYPE.ECG_QUEUE_STATUS" :value="scope.row.status" />
-        </template>
-      </el-table-column>
-      <el-table-column label="澶氳�愯嵂" width="150" align="center" prop="tolerance" >
-         <template #default="scope">
           <!-- 闇�姹�6锛氬鑰愯蛋瀛楀吀锛汵ULL 鎸�"鏃�"鏄剧ず锛圦12锛� -->
           <dict-tag :type="DICT_TYPE.ECG_TOLERANCE" :value="scope.row.tolerance ?? 0" />
         </template>
       </el-table-column>
-      <el-table-column label="VIP" align="center" prop="isVip" />
-      <el-table-column label="杩囧彿鏍囪" align="center" prop="passed" />
       <el-table-column label="杩囨湡鏍囪" align="center" prop="expired" />
       <el-table-column label="璇婂缂栧彿" align="center" prop="roomId" />
       <el-table-column label="璇婂鍚嶇О" align="center" prop="roomName" />
       <el-table-column label="璇婄枟搴婂彿" align="center" prop="bedNo" />
-      <el-table-column
-        label="鍒涘缓鏃堕棿"
-        align="center"
-        prop="createTime"
-        :formatter="dateFormatter"
-        width="180px"
-      />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
     </el-table>
     <!-- 鍒嗛〉 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
+      @pagination="getList" />
   </ContentWrap>
 
   <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
@@ -303,12 +225,12 @@
 import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { QueueApi, QueueVO } from '@/api/ecg/queue'
-import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
-import {DoctorApi, PatientVO} from "@/api/ecg/doctor";
-import {useCheckTypeStore} from "@/store/modules/checkType";
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { DoctorApi, PatientVO } from "@/api/ecg/doctor";
+import { useCheckTypeStore } from "@/store/modules/checkType";
 import AppointmentForm from "@/views/ecg/appointment/AppointmentForm.vue";
-import {genderFormat} from "@/utils/stringUtil";
-import {getCheckTypeName} from "../../../utils/checkTypeFormatter";
+import { genderFormat } from "@/utils/stringUtil";
+import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
 // 闇�姹�1锛氭偅鑰呬俊鎭� 18 椤圭殑鍏叡鏍煎紡鍖栵紙骞撮緞銆佽窛浠婂ぉ鏁扮瓑锛�
 import { formatAge, formatDaysFromOrder, formatDateTime, formatDateOnly, resolveCardNo } from '@/utils/patientInfo'
 
@@ -385,11 +307,11 @@
     message.success(t('common.delSuccess'))
     // 鍒锋柊鍒楄〃
     await getList()
-  } catch {}
+  } catch { }
 }
 
 /** 鎻掗槦鎸夐挳鎿嶄綔 */
-const handleJump = async (item: QueueVO ) => {
+const handleJump = async (item: QueueVO) => {
   try {
     if (item.jumpFlag === 0)
       item.jumpFlag = 1
@@ -400,7 +322,7 @@
     message.success(data)
     // 鍒锋柊鍒楄〃
     await getList()
-  } catch {}
+  } catch { }
 }
 
 const passWaitingPatient = async (item: QueueVO) => {
diff --git a/src/views/ecg/room/RoomForm.vue b/src/views/ecg/room/RoomForm.vue
index 141b9f6..b6a8d3d 100644
--- a/src/views/ecg/room/RoomForm.vue
+++ b/src/views/ecg/room/RoomForm.vue
@@ -24,7 +24,7 @@
         <el-input v-model="formData.ip" placeholder="璇疯緭鍏ヨ瘖瀹P" />
       </el-form-item>
 
-      <el-form-item label="妫�鏌ョ被鍨�" prop="checkTypes">
+      <el-form-item label="妫�鏌ラ」鐩�" prop="checkTypes">
         <el-checkbox-group v-model="formData.checkTypes">
           <el-checkbox v-for="checkTypeVO in checkTypeStore.getCheckTypeOptions()" :value="checkTypeVO.value" :key="checkTypeVO.value">{{checkTypeVO.label}}</el-checkbox>
         </el-checkbox-group>
diff --git a/src/views/ecg/room/RoomSetting.vue b/src/views/ecg/room/RoomSetting.vue
index 34b2fc5..258617f 100644
--- a/src/views/ecg/room/RoomSetting.vue
+++ b/src/views/ecg/room/RoomSetting.vue
@@ -1,27 +1,27 @@
 <template>
   <el-container>
-    <el-main>
-      <div style="display: flex; flex-wrap: wrap; justify-content: center; margin-bottom: 20px">
-        <div class=wrap v-for="(value, key) in bedMap" :key="key">
+    <el-main class="room-setting-main">
+      <div class="card-area">
+        <div class="wrap" v-for="(value, key) in bedMap" :key="key">
           <RoomStatus :title="key" :bedList="value"  @refresh="getList"/>
         </div>
       </div>
-      <div style="display: flex; flex-wrap: wrap; justify-content: center; margin-bottom: 20px">
-        <el-button @click="startBiz" > 鎵嬪姩寮�璇� </el-button>
-        <el-button @click="closeBiz" > 鎵嬪姩闂瘖 </el-button>
-        <el-button @click="resetRoom" > 閲嶇疆璇婂 </el-button>
-        <el-button @click="resetSchedule" > 閲嶇疆瀹氭椂浠诲姟 </el-button>
-        <el-button @click="refresh" > 鍒锋柊 </el-button>
+      <div class="btn-area">
+        <el-button size="small" @click="startBiz" > 鎵嬪姩寮�璇� </el-button>
+        <el-button size="small" @click="closeBiz" > 鎵嬪姩闂瘖 </el-button>
+        <el-button size="small" @click="resetRoom" > 閲嶇疆璇婂 </el-button>
+        <el-button size="small" @click="resetSchedule" > 閲嶇疆瀹氭椂浠诲姟 </el-button>
+        <el-button size="small" @click="refresh" > 鍒锋柊 </el-button>
       </div>
     </el-main>
-    <el-aside width="250px">
+    <el-aside width="210px" class="monitor-aside">
       <div>寮�璇婃椂闂达細{{ openingPeriod }}  {{ monitorInfo?.openingFlag }}  </div>
       <div>宸ヤ綅姒傚喌锛� {{monitorInfo?.openingBedNum}} {{monitorInfo?.docBedNum}} {{monitorInfo?.routingBedNum}} </div>
       <div v-for="(value, key) in monitorInfo.checkTypeBedInfo" :key="key">
         {{ getCheckTypeName(Number(key)) }}  {{ value }}
       </div>
       <div>宸ヤ綅姒傚喌锛氬紑鏀剧殑宸ヤ綅  鏈夊尰鐢熷伐浣�  鍙備笌鍒嗘祦宸ヤ綅</div>
-      <div>妫�鏌ョ被鍨� 寮�鏀剧殑宸ヤ綅 (妫�鏌�/棰嗙敤 | 瀹夎)  鏈夊尰鐢熷伐浣� (妫�鏌�/棰嗙敤 | 瀹夎)</div>
+      <div>妫�鏌ラ」鐩� 寮�鏀剧殑宸ヤ綅 (妫�鏌�/棰嗙敤 | 瀹夎)  鏈夊尰鐢熷伐浣� (妫�鏌�/棰嗙敤 | 瀹夎)</div>
     </el-aside>
   </el-container>
 </template>
@@ -92,7 +92,6 @@
 
 /** 鍒濆鍖� **/
 onMounted(() => {
-  debugger
   getList()
   getOpeningPeriod()
   getMonitorInfo()
@@ -101,7 +100,37 @@
 </script>
 
 <style scoped lang="scss">
+/* ==========================================================================
+   闇�姹傦細寮�璇婅缃〉闈㈠崱鐗囧お澶э紝瑕佷笉婊氬姩榧犳爣灏辫兘鐪嬪叏銆�
+   鍗$墖鏈韩宸插湪 RoomStatus 閲屽帇缂╋紙148px 瀹� / 鍥剧墖闄愰珮 46px锛夛紝
+   杩欓噷鍐嶆敹绱у竷灞�澶栬竟璺濅笌鍙充晶鐩戞帶鏍忥紝鍑忓皯鏁翠綋绾靛悜鍗犵敤銆�
+   ========================================================================== */
+.room-setting-main {
+  padding: 8px 12px;
+}
+
+.card-area {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  margin-bottom: 8px;
+}
+
 .wrap {
-  margin-right: 20px;
+  margin: 0 6px;
+}
+
+.btn-area {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  margin-bottom: 8px;
+}
+
+/* 鍙充晶鐩戞帶淇℃伅锛氬瓧鍙锋敹绱э紝閬垮厤鎹㈣鎾戦珮 */
+.monitor-aside {
+  padding: 8px 10px;
+  font-size: 12px;
+  line-height: 18px;
 }
 </style>
diff --git a/src/views/ecg/room/index.vue b/src/views/ecg/room/index.vue
index 6182195..f60c38c 100644
--- a/src/views/ecg/room/index.vue
+++ b/src/views/ecg/room/index.vue
@@ -68,7 +68,7 @@
       <el-table-column label="璇婂鍚嶇О" align="center" prop="roomName" />
       <el-table-column label="璇婄枟搴婄紪鍙�" align="center" prop="bedNo" />
       <el-table-column label="璇婂IP" align="center" prop="ip" />
-      <el-table-column label="妫�鏌ョ被鍨�" align="center" prop="checkTypes" width="180px">
+      <el-table-column label="妫�鏌ラ」鐩�" align="center" prop="checkTypes" width="180px">
         <template #default="scope">
           <div v-for="(checkType, subIndex) in scope.row.checkTypes" :key="subIndex">
             {{getCheckTypeName(checkType)}}

--
Gitblit v1.9.3