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 + " " + 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="鑷姩 " 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="鑷姩 " 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="鑷姩 " 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;"> {{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"> {{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)}}
- </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="鑷姩 " 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