Kaynağa Gözat

电子病历,住院医生

DESKTOP-0GD05B0\Administrator 3 yıl önce
ebeveyn
işleme
27b5ccd73e

+ 55 - 49
src/components/med-tec-mod/RefundForProjectEntry.vue

@@ -3,61 +3,67 @@
                 v-model="modelValue"
                 width="100%"
                 @closed="emit('update:modelValue',false)">
-    数量:{{ chargeAmount }} 金额: {{
-      chargeFee.toLocaleString('zh', {
-        style: 'currency',
-        currency: 'cny',
-        currencyDisplay: 'name'
-      })
-    }}
-    <el-button @click="confirmRefund" icon="Delete" type="danger">确认退费</el-button>
-    <br>
-    <div v-if="isDrug">
-      药房:
-      <el-select v-model="groupNo">
-        <el-option value="71" label="门诊"/>
-        <el-option value="73" label="住院"/>
-      </el-select>
-    </div>
+    <page-layer>
+      <template #header>
+        数量:{{ chargeAmount }} 金额: {{
+          chargeFee.toLocaleString('zh', {
+            style: 'currency',
+            currency: 'cny',
+            currencyDisplay: 'name'
+          })
+        }}
+        <div v-if="isDrug">
+          药房:
+          <el-select v-model="groupNo">
+            <el-option value="71" label="门诊"/>
+            <el-option value="73" label="住院"/>
+          </el-select>
+        </div>
+        <el-button @click="confirmRefund" icon="Delete" type="danger">确认退费</el-button>
+      </template>
 
-    <xc-table :local-data="props.list" :height="400">
-      <el-table-column fixed='left' label="操作">
-        <template #default="scope">
-          <el-button @click="deleteData(scope.row,scope.row.$index)" icon="Delete" type="danger">删除</el-button>
-        </template>
-      </el-table-column>
-      <el-table-column label="流水号" prop="detailSn" width="70px"></el-table-column>
-      <el-table-column label="医嘱号" prop="orderNo" width="70px"></el-table-column>
-      <el-table-column label="录入日期" prop="chargeDate" width="70px"></el-table-column>
-      <el-table-column label="项目编码" prop="chargeCodeMx"></el-table-column>
-      <el-table-column label="项目名称" prop="chargeName"></el-table-column>
-      <el-table-column label="规格" prop="specification"></el-table-column>
-      <el-table-column label="药品名称" prop="drugname"></el-table-column>
-      <el-table-column label="执行科室" prop="execDept"></el-table-column>
-      <el-table-column label="申请科室" prop="deptCode"></el-table-column>
-      <el-table-column label="金额" prop="chargeFee"></el-table-column>
-      <el-table-column label="数量" prop="chargeAmount"></el-table-column>
-      <el-table-column label="状态" prop="chargeStatus">
-        <template #default="scope">
-          {{ costState(scope.row.chargeStatus) }}
-        </template>
-      </el-table-column>
-      <el-table-column label="录入人" prop="opName"></el-table-column>
-      <el-table-column label="账单码" prop="billItemName"></el-table-column>
-      <el-table-column label="是否退费" prop="tuiFeiFlag">
-        <template #default="scope">
-          <span v-html="conversionRefundFlag(scope.row.oriDetailSn)" style="color:red;"></span>
-          <br>
-          <span v-if="scope.row.oriDetailSn > 0">
+      <template #mainMaxContentHeight>
+        <xc-table :local-data="props.list" :height="400">
+          <el-table-column fixed="'left'" label="操作">
+            <template #default="scope">
+              <el-button @click="deleteData(scope.row,scope.row.$index)" icon="Delete" type="danger">删除</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column label="流水号" prop="detailSn" width="70px"></el-table-column>
+          <el-table-column label="医嘱号" prop="orderNo" width="70px"></el-table-column>
+          <el-table-column label="录入日期" prop="chargeDate" width="70px"></el-table-column>
+          <el-table-column label="项目编码" prop="chargeCodeMx"></el-table-column>
+          <el-table-column label="项目名称" prop="chargeName"></el-table-column>
+          <el-table-column label="规格" prop="specification"></el-table-column>
+          <el-table-column label="药品名称" prop="drugname"></el-table-column>
+          <el-table-column label="执行科室" prop="execDept"></el-table-column>
+          <el-table-column label="申请科室" prop="deptCode"></el-table-column>
+          <el-table-column label="金额" prop="chargeFee"></el-table-column>
+          <el-table-column label="数量" prop="chargeAmount"></el-table-column>
+          <el-table-column label="状态" prop="chargeStatus">
+            <template #default="scope">
+              {{ costState(scope.row.chargeStatus) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="录入人" prop="opName"></el-table-column>
+          <el-table-column label="账单码" prop="billItemName"></el-table-column>
+          <el-table-column label="是否退费" prop="tuiFeiFlag">
+            <template #default="scope">
+              <span v-html="conversionRefundFlag(scope.row.oriDetailSn)" style="color:red;"></span>
+              <br>
+              <span v-if="scope.row.oriDetailSn > 0">
                     <span style="color: #e6a23c">退费数据</span> <br/>
                     <span style="color: teal">
                       原流水号为 <br/>
                       【 {{ scope.row.oriDetailSn }} 】
                     </span>
                   </span>
-        </template>
-      </el-table-column>
-    </xc-table>
+            </template>
+          </el-table-column>
+        </xc-table>
+
+      </template>
+    </page-layer>
   </xc-dialog-v2>
 </template>
 
@@ -66,8 +72,8 @@ import XcDialogV2 from "@/components/xiao-chan/dialog/XcDialogV2";
 import XcTable from "@/components/xiao-chan/xc-table/XcTable";
 import {conversionRefundFlag, costState} from "@/utils/computed";
 import {ElMessageBox} from "element-plus";
-import sleep from "@/utils/sleep";
 import {xiangMuTuiFei} from "@/api/inpatient/xiang-mu-lu-ru";
+import PageLayer from "@/layout/PageLayer";
 
 const props = defineProps({
   modelValue: {

+ 36 - 24
src/components/zhu-yuan-yi-sheng/emr/EmrSidebar.vue

@@ -1,28 +1,31 @@
 <template>
   <el-input v-model="filterText" placeholder="节点过滤" @input="filterChange" clearable/>
+
   <el-radio-group v-model="templateType" @change="typeChange">
     <el-radio-button :label="0">全院模板</el-radio-button>
     <el-radio-button :label="1">科室模板</el-radio-button>
     <el-radio-button :label="2">患者数据</el-radio-button>
   </el-radio-group>
-  <el-tree :data="treeData"
-           :props="defaultProps"
-           @node-click="handleNodeClick"
-           node-key="_id"
-           ref="treeRef"
-           :filter-node-method="filterNode"
-           default-expand-all>
-    <template #default="{ node, data }">
-      <el-icon v-if="data.submit">
-        <Lock/>
-      </el-icon>
-      <el-icon v-else>
-        <Folder v-if="data.children"/>
-        <Document v-else/>
-      </el-icon>
-      {{ data.name }}
-    </template>
-  </el-tree>
+  <div :style="{maxHeight : maxHeight - 100 + 'px'}" style="overflow: auto;max-width: 294px" class="down-tree">
+    <el-tree :data="treeData"
+             :props="defaultProps"
+             @node-click="handleNodeClick"
+             node-key="_id"
+             ref="treeRef"
+             :filter-node-method="filterNode"
+             default-expand-all>
+      <template #default="{ node, data }">
+        <el-icon v-if="data.submit">
+          <Lock/>
+        </el-icon>
+        <el-icon v-else>
+          <Folder v-if="data.children"/>
+          <Document v-else/>
+        </el-icon>
+        {{ data.name }}
+      </template>
+    </el-tree>
+  </div>
 </template>
 
 <script setup name='EmrSidebar'>
@@ -31,6 +34,12 @@ import {huanZheXinXi} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/
 import {getPatientData, queryWhetherThePatientHasASpecifiedMedicalRecord} from "@/api/zhu-yuan-yi-sheng/emr-patient";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
 
+const props = defineProps({
+  maxHeight: {
+    type: Number
+  }
+})
+
 const emit = defineEmits(['nodeClick', 'typeChange'])
 
 let treeData = $ref([])
@@ -151,11 +160,10 @@ const deleteTheSpecifiedNode = (id) => {
 let findNode = false
 const diseaseDurationRecordTime = (id, list) => {
   findNode = false
-  console.log(id, list)
-  寻找病历根据文档id(id, list, returnData.patientTree)
+  findMedicalRecordById(id, list, returnData.patientTree)
 }
 
-const 寻找病历根据文档id = (id, roundTimes, list) => {
+const findMedicalRecordById = (id, roundTimes, list) => {
   for (let i = 0, len = list.length; i < len; i++) {
     if (findNode) return;
     let item = list[i]
@@ -166,7 +174,7 @@ const 寻找病历根据文档id = (id, roundTimes, list) => {
     }
 
     if (item.children) {
-      寻找病历根据文档id(id, roundTimes, item.children)
+      findMedicalRecordById(id, roundTimes, item.children)
     }
   }
 }
@@ -197,6 +205,10 @@ defineExpose({
 
 </script>
 
-<style scoped>
-
+<style scoped lang="scss">
+.down-tree {
+  :deep(.el-tree-node.is-expanded > .el-tree-node__children) {
+    display: inline;
+  }
+}
 </style>

+ 32 - 19
src/components/zhu-yuan-yi-sheng/emr/EmrSnippet.vue

@@ -1,23 +1,25 @@
 <template>
   <div>
     <el-input v-model="filterText" placeholder="节点过滤" @input="filterChange" clearable/>
-    <el-tree :data="snippetData"
-             :props="defaultProps"
-             @node-click="handleNodeClick"
-             node-key="_id"
-             ref="treeRef"
-             :filter-node-method="filterNode"
-             @node-contextmenu="fragmentPreview"
-             :expand-on-click-node="false"
-             default-expand-all>
-      <template #default="{ node, data }">
-        <el-icon>
-          <Folder v-if="data.children"/>
-          <Document v-else/>
-        </el-icon>
-        {{ data.name }}
-      </template>
-    </el-tree>
+    <div :style="{maxHeight : maxHeight - 40 + 'px'}" style="overflow: auto;max-width: 294px" class="down-tree">
+      <el-tree :data="snippetData"
+               :props="defaultProps"
+               @node-click="handleNodeClick"
+               node-key="_id"
+               ref="treeRef"
+               :filter-node-method="filterNode"
+               @node-contextmenu="fragmentPreview"
+               :expand-on-click-node="false"
+               default-expand-all>
+        <template #default="{ node, data }">
+          <el-icon>
+            <Folder v-if="data.children"/>
+            <Document v-else/>
+          </el-icon>
+          {{ data.name }}
+        </template>
+      </el-tree>
+    </div>
     <el-dialog v-model="dialog" title="效果预览" top="2%" width="60%">
       <div>
         <iframe src="/emr/runtime/#/editor"
@@ -35,6 +37,13 @@ import {getSnippet} from "@/api/zhu-yuan-yi-sheng/emr-api";
 import {getWindowSize} from "@/utils/window-size";
 import {EMRInteractive} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-init";
 
+
+const props = defineProps({
+  maxHeight: {
+    type: Number
+  }
+})
+
 const emit = defineEmits(['nodeClick'])
 let patientData = {}
 
@@ -107,6 +116,10 @@ defineExpose({
 
 </script>
 
-<style scoped>
-
+<style scoped lang="scss">
+.down-tree {
+  :deep(.el-tree-node.is-expanded > .el-tree-node__children) {
+    display: inline;
+  }
+}
 </style>

+ 7 - 0
src/router/modules/dashboard.js

@@ -8,6 +8,13 @@ const route = [
         hideMenu: true,
         meta: {title: '登录', hideTabs: true},
     },
+    {
+        path: '/emrEditor',
+        name: 'emrEditor',
+        component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/Home.vue')),
+        hideMenu: true,
+        meta: {title: '电子病历', hideTabs: true},
+    },
     {
         path: '/triageRoomScreen',
         component: createNameComponent(() => import('@/views/clinic/triage/RoomScreen.vue')),

+ 6 - 0
src/utils/websocket.js

@@ -8,6 +8,8 @@ const socketUrl = import.meta.env.VITE_SOCKET_URL
 let webSocket = null
 let globalCallback = new Map()
 
+let unwantedSocket = ['emrEditor']
+
 export function closeWebSocket() {
     store.commit('user/closeSid')
     if (webSocket !== null) {
@@ -40,6 +42,10 @@ function sendAMessage(name, data) {
 }
 
 export function initWebSocket(sid, force) {
+    if (unwantedSocket.includes(router.currentRoute.value.path)) {
+        return
+    }
+
     if ('WebSocket' in window) {
         if (webSocket === null || force) {
             const url = socketUrl + sid

+ 7 - 8
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/EmrMain.vue

@@ -25,21 +25,22 @@
     <el-container>
 
       <el-aside style="background-color: white">
-        <emr-sidebar @nodeClick="nodeClick" ref="emrSidebarRef"/>
+        <emr-sidebar @nodeClick="nodeClick" ref="emrSidebarRef" :max-height="maxHeight"/>
       </el-aside>
-
       <el-main v-loading="loaded">
         <el-row>
           <el-col :span="20">
             <div class="emr-iframe">
-              <iframe id="emrIframe"
-                      ref="emrRef"
-                      :src="caseHistoryUrl"/>
+              <iframe
+                  ref="emrRef"
+                  :height="maxHeight - 80 + 'px' "
+                  :src="caseHistoryUrl"/>
             </div>
           </el-col>
           <el-col :span="4" style="background-color: white">
             <emr-snippet @node-click="clickSnippet"
                          ref="emrSnippetRef"
+                         :max-height="maxHeight"
                          :patientData="patientData"/>
           </el-col>
         </el-row>
@@ -422,17 +423,16 @@ const clickToSubmitTheMedicalRecord = () => {
 
 }
 
+let maxHeight = window.innerHeight
 
 onMounted(() => {
   nextTick(async () => {
-
     patientData = await getEmrInpatientData({
       patNo: huanZheXinXi.value.inpatientNo,
       times: huanZheXinXi.value.admissTimes
     })
     emrSidebarRef.value.queryData()
     getCurrentPersonnelInformation(patientData)
-    console.log(patientData)
     patientId = huanZheXinXi.value.inpatientNo
     currentEmr.value = new EMRInteractive(patientData, emrEvent);
     emrSnippetRef.value.setPatientData(patientData)
@@ -458,6 +458,5 @@ onBeforeRouteLeave((to, from, next) => {
 <style scoped>
 .emr-iframe, iframe {
   width: 100%;
-  height: 680px;
 }
 </style>

+ 3 - 3
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/YiZhuLuRu.vue

@@ -306,14 +306,14 @@ const addYiZhuClick = () => {
  */
 const openElectronicMedicalRecord = () => {
   if (youWuXuanZheHuanZhe()) return
-  router.push({
-    name: 'dianZiBingLi',
+  let routeData = router.resolve({
+    name: 'emrEditor',
     query: {
-      //   path: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
       patNo: huanZheXinXi.value.inpatientNo,
       times: huanZheXinXi.value.admissTimes
     },
   })
+  window.open(routeData.href, '_blank');
 }
 
 const dianJiYiZhuChaoZuo = ({actOrderNo, orderName}, flag, name) => {