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/doctor/components/DevInstallPanel.vue |  241 +++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 199 insertions(+), 42 deletions(-)

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>

--
Gitblit v1.9.3