Browse Source

电子病历解锁重复退出当前的病历,检验检查删除优化,草药问题,和优化表格

xiaochan 2 years ago
parent
commit
fc228af201

File diff suppressed because it is too large
+ 555 - 354
package-lock.json


+ 3 - 1
package.json

@@ -14,8 +14,8 @@
   "dependencies": {
     "@babel/standalone": "7.14.8",
     "@element-plus/icons-vue": "^2.0.6",
-    "@vitejs/plugin-legacy": "^1.8.2",
     "@kjgl77/datav-vue3": "^1.3.3",
+    "@vitejs/plugin-legacy": "^1.8.2",
     "@vueuse/core": "^9.6.0",
     "axios": "^0.27.2",
     "clipboard": "^2.0.11",
@@ -35,6 +35,8 @@
     "vue-router": "^4.0.16",
     "vue3-json-viewer": "^2.2.2",
     "vuex": "^4.0.2",
+    "vxe-table": "^4.3.14",
+    "xe-utils": "^3.5.7",
     "xlsx": "^0.17.0"
   },
   "devDependencies": {

+ 2 - 2
src/api/zhu-yuan-yi-sheng/emr-socket.js

@@ -40,11 +40,11 @@ export function repeatedlyOpenTheSamePatient(sid) {
     })
 }
 
-export function emrSocketUnlockApi(sid) {
+export function emrSocketUnlockApi(sid, documentId) {
     return request({
         url: '/Emr/emrSocketUnlock',
         method: 'get',
-        params: {sid}
+        params: {sid, documentId}
     })
 }
 

+ 2 - 18
src/components/inpatient/XiangMuLuRu.vue

@@ -320,27 +320,11 @@
                                 <el-table-column label="项目代码" prop="chargeCodeMx"></el-table-column>
                                 <el-table-column label="项目名称" prop="chargeName"></el-table-column>
                                 <el-table-column label="单位" prop="spec"></el-table-column>
-                                <el-table-column label="执行科室" prop="deptCode">
-                                    <template #default="scope">
-                                        <el-select v-model="scope.row.deptCode" filterable style="width: 90%">
-                                            <el-option v-for="item in deptData" :key="item.code" :label="item.name"
-                                                       :value="item.code">
-                                                <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
-                                                <el-divider direction="vertical"></el-divider>
-                                                <span>{{ item.name }}</span></el-option
-                                            >
-                                        </el-select>
-                                    </template>
-                                </el-table-column>
+                                <el-table-column label="执行科室" prop="deptCode"/>
                                 <el-table-column label="国家编码" prop="nationalCode"></el-table-column>
                                 <el-table-column label="国家名称" prop="nationalName"></el-table-column>
                                 <el-table-column label="单价" prop="chargeAmount"></el-table-column>
-                                <el-table-column label="数量" prop="amount">
-                                    <template #default="scope">
-                                        <el-input-number v-model="scope.row.amount" :min="1"
-                                                         :precision="1"></el-input-number>
-                                    </template>
-                                </el-table-column>
+                                <el-table-column label="数量" prop="amount"/>
                                 <el-table-column label="金额">
                                     <template #default="scope">
                                         {{ (scope.row.chargeAmount * scope.row.amount).toFixed(2) }}

+ 81 - 98
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrGroupConsultation.vue

@@ -1,127 +1,110 @@
 <template>
-  <div style="height: 5%"/>
-  <div style="height: 95%">
-    <el-auto-resizer>
-      <template #default="{ height, width }">
-        <div style="display: flex">
-          <div style="width: 50%">
-            <xc-table-v3 :height="height"
-                         :data="rightData"
-                         @row-click="rowClick"
-                         :columns="rightColumns"/>
-          </div>
-          <div class="right_main">
-            <el-button @click="copyClick">复制</el-button>
-            <el-form>
-              <el-form-item label="病情简介:">
-                <el-input v-model="hzData.reqComment" :rows="3" type="textarea"/>
-              </el-form-item>
-              <el-form-item label="目前主要诊断:">
-                <el-input v-model="hzData.hzZd" :rows="3" type="textarea"/>
-              </el-form-item>
-              <el-form-item label="会诊目的:">
-                <el-input v-model="hzData.hzMd" :rows="3" type="textarea"/>
-              </el-form-item>
-              <el-form-item label="会诊意见:">
-                <el-input v-model="hzData.hzComment" :rows="3" type="textarea"/>
-              </el-form-item>
-            </el-form>
-          </div>
-        </div>
-      </template>
-    </el-auto-resizer>
-  </div>
+    <div style="height: 5%"/>
+    <div style="height: 95%">
+        <el-auto-resizer>
+            <template #default="{ height, width }">
+                <div style="display: flex">
+                    <div style="width: 50%">
+                        <vxe-table :data="rightData"
+                                   :row-config="{isHover : true, isCurrent: true,height: 24}"
+                                   :height="height"
+                                   :tooltip-config="{showAll: true}"
+                                   show-overflow
+                                   @cell-click="rowClick">
+                            <vxe-column title="申请时间"
+                                        field="inputDate"
+                                        width="120"
+                                        :formatter="formatTime"/>
+                            <vxe-column title="科室" field="deptName"/>
+                            <vxe-column title="接受日期" field="hzDate"
+                                        width="120"
+                                        :formatter="formatTime"/>
+                            <vxe-column title="接受医生" field="hzDoctor2Name"/>
+                            <vxe-column title="申请人" field="inputName"/>
+                            <vxe-column title="申请科室" field="reqDeptName"/>
+                            <vxe-column title="类别" field="hzLevelName"/>
+                            <vxe-column title="医生" field="hzDoctor1Name"/>
+                        </vxe-table>
+                    </div>
+                    <div class="right_main">
+                        <el-button @click="copyClick">复制</el-button>
+                        <el-form>
+                            <el-form-item label="病情简介:">
+                                <el-input v-model="hzData.reqComment" :rows="3" type="textarea"/>
+                            </el-form-item>
+                            <el-form-item label="目前主要诊断:">
+                                <el-input v-model="hzData.hzZd" :rows="3" type="textarea"/>
+                            </el-form-item>
+                            <el-form-item label="会诊目的:">
+                                <el-input v-model="hzData.hzMd" :rows="3" type="textarea"/>
+                            </el-form-item>
+                            <el-form-item label="会诊意见:">
+                                <el-input v-model="hzData.hzComment" :rows="3" type="textarea"/>
+                            </el-form-item>
+                        </el-form>
+                    </div>
+                </div>
+            </template>
+        </el-auto-resizer>
+    </div>
 </template>
 
 <script setup name='EmrGroupConsultation'>
 // 电子病历 查询会诊
 import {chaKanHuiZhenShenQing} from "@/api/case-front-sheet";
 import {patInfo} from './emr-tools-store'
-import XcTableV3 from "@/components/xiao-chan/xc-table-v3/XcTableV3.vue";
 import {getHuanZheXinXi} from "@/api/case-front-sheet/jie-shou-hui-zhen";
 import store from "@/store";
 import {
-  copyEnum,
-  setEmrCopy
+    copyEnum,
+    setEmrCopy
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
 import {xcMessage} from "@/utils/xiaochan-element-plus";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
+import XEUtils from 'xe-utils'
 
 const rightData = ref([])
-const rightColumns = ref([
-  {
-    title: '申请时间',
-    key: 'inputDate'
-  },
-  {
-    title: '次数',
-    key: 'deptName'
-  },
-  {
-    title: '接受日期',
-    key: 'hzDate'
-  },
-  {
-    title: '接受医生',
-    key: 'hzDoctor2Name'
-  },
-  {
-    title: '申请人',
-    key: 'inputName'
-  },
-  {
-    title: '申请科室',
-    key: 'reqDeptName'
-  },
-  {
-    title: '类别',
-    key: 'hzLevelName'
-  },
-  {
-    title: '医生',
-    key: 'hzDoctor1Name'
-  }
-])
 
 const hzData = ref({})
 const query = () => {
-  chaKanHuiZhenShenQing(patInfo.value.inpatientNo, patInfo.value.admissTimes).then((res) => {
-    console.log(res)
-    rightData.value = res
-  })
+    chaKanHuiZhenShenQing(patInfo.value.inpatientNo, patInfo.value.admissTimes).then((res) => {
+        rightData.value = res
+    })
 }
 
-const rowClick = (val) => {
-  getHuanZheXinXi(val.admissTimes, val.reqTimes, val.inpatientNo).then((res) => {
-    console.log(res)
-    hzData.value = res
-  })
+const rowClick = ({row}) => {
+    getHuanZheXinXi(row.admissTimes, row.reqTimes, row.inpatientNo).then((res) => {
+        hzData.value = res
+    })
 }
 
-
 const copyClick = () => {
-  let temp = hzData.value
-  if (!temp.inpatientNo) {
-    BizException(ExceptionEnum.MESSAGE_ERROR, "请先获取患者信息。")
-  }
-  let data = {
-    '会诊科室': [
-      {code: temp.reqDept1, name: temp.reqDept1Name}
-    ],
-    '会诊医生': [
-      {code: temp.hzDoctor2, name: temp.hzDoctor2Name}
-    ],
-    '会诊意见': temp.hzComment,
-    '编辑者': [
-      {code: store.state.user.info.code, name: store.state.user.info.name}
-    ]
-  }
-  setEmrCopy(copyEnum.会诊, data)
-  xcMessage.success('复制成功。')
+    let temp = hzData.value
+    if (!temp.inpatientNo) {
+        BizException(ExceptionEnum.MESSAGE_ERROR, "请先获取患者信息。")
+    }
+    let data = {
+        '会诊科室': [
+            {code: temp.reqDept1, name: temp.reqDept1Name}
+        ],
+        '会诊医生': [
+            {code: temp.hzDoctor2, name: temp.hzDoctor2Name}
+        ],
+        '会诊意见': temp.hzComment,
+        '编辑者': [
+            {code: store.state.user.info.code, name: store.state.user.info.name}
+        ]
+    }
+    setEmrCopy(copyEnum.会诊, data)
+    xcMessage.success('复制成功。')
+}
+
+const formatTime = ({cellValue}) => {
+    return XEUtils.toDateString(cellValue, 'yy-MM-dd HH:ss')
 }
 
 onMounted(() => {
-  query()
+    query()
 })
 
 

+ 9 - 9
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrInspect.vue

@@ -4,10 +4,14 @@
         <div class="side-class">
             <el-auto-resizer>
                 <template #default="{ height }">
-                    <xc-table-v3 :height="height"
-                                 :data="sideData"
-                                 :columns="sideColumns"
-                                 @row-click="sideRow"/>
+                    <vxe-table :data="sideData"
+                               :height="height"
+                               show-overflow
+                               :row-config="{isHover : true, isCurrent: true,height: 24}"
+                               @cell-click="sideRow">
+                        <vxe-column title="日期" field="startTime" width="135"/>
+                        <vxe-column title="名称" field="orderName"/>
+                    </vxe-table>
                 </template>
             </el-auto-resizer>
         </div>
@@ -65,16 +69,12 @@ const props = defineProps({
 })
 
 const sideData = ref([])
-const sideColumns = [
-    {key: 'startTime', title: "日期", width: 135},
-    {key: 'orderName', title: "名称"},
-]
 
 const record = ref({
     checkWhatYouSee: '',
     diagnosticOpinion: ''
 })
-const sideRow = (row) => {
+const sideRow = ({row}) => {
     queryCheckTextResults(row.inpatientNo, row.reqNo).then((res) => {
         record.value = res.record
         record.value.row = row

+ 25 - 25
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrOperation.vue

@@ -1,40 +1,40 @@
 <template>
-  <div style="height: 5%"></div>
-  <div style="height: 95%">
-    <el-auto-resizer>
-      <template #default="{ height, width }">
-        <xc-table-v3 :data="props.emrData['手术']" :height="height">
-          <el-table-column label="操作" fixed="left" width="50">
-            <template #default="{row}">
-              <el-button text @click="emits('to-fill-in-data',row)" type="primary">填充</el-button>
+    <div style="height: 5%"></div>
+    <div style="height: 95%">
+        <el-auto-resizer>
+            <template #default="{ height, width }">
+                <vxe-table :data="props.emrData['手术']" :height="height" show-overflow
+                           :row-config="{isHover : true, isCurrent: true,height: 24}">
+                    <vxe-column title="操作" fixed="left" width="50">
+                        <template #default="{row}">
+                            <el-button text @click="emits('to-fill-in-data',row)" type="primary">填充</el-button>
+                        </template>
+                    </vxe-column>
+                    <vxe-column title="手术日期" field="手术日期"/>
+                    <vxe-column title="拟行手术名称" prop="拟行手术名称"/>
+                    <vxe-column title="术前诊断名称" prop="术前诊断名称"/>
+                    <vxe-column title="一助" prop="第一助手名称" width="90"/>
+                    <vxe-column title="二助" prop="第二助手名称" width="90"/>
+                    <vxe-column title="三助" prop="第三助手名称" width="90"/>
+                    <vxe-column title="麻醉方式名称" prop="麻醉方式名称"/>
+                </vxe-table>
             </template>
-          </el-table-column>
-          <el-table-column label="手术日期" prop="手术日期"/>
-          <el-table-column label="拟行手术名称" prop="拟行手术名称"/>
-          <el-table-column label="术前诊断名称" prop="术前诊断名称"/>
-          <el-table-column label="一助" prop="第一助手名称" width="90"/>
-          <el-table-column label="二助" prop="第二助手名称" width="90"/>
-          <el-table-column label="三助" prop="第三助手名称" width="90"/>
-          <el-table-column label="麻醉方式名称" prop="麻醉方式名称"/>
-        </xc-table-v3>
-      </template>
-    </el-auto-resizer>
-  </div>
+        </el-auto-resizer>
+    </div>
 </template>
 
 <script setup name='EmrOperation'>
-import XcTableV3 from "@/components/xiao-chan/xc-table-v3/XcTableV3.vue";
 
 const props = defineProps({
-  emrData: {
-    type: Object
-  }
+    emrData: {
+        type: Object
+    }
 })
 
 const emits = defineEmits(['to-fill-in-data'])
 
 onMounted(() => {
-  console.log(props.emrData['手术'])
+    console.log(props.emrData['手术'])
 })
 
 </script>

+ 33 - 6
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrOrderList.vue

@@ -18,10 +18,38 @@
     <div style="height: 95%">
         <el-auto-resizer>
             <template #default="{ height, width }">
-                <xc-table-v3 :columns="columns"
-                             :data="tempList"
-                             :height="height"
-                             ref="tableRef"/>
+                <vxe-table :data="tempList"
+                           :height="height"
+                           align="left"
+                           border
+                           :row-config="{isHover : true, isCurrent: true,height: 24,useKey :  'actOrderNo'}"
+                           show-overflow
+                           ref="tableRef">
+                    <vxe-column type="checkbox" width="30"/>
+                    <vxe-column type="seq" width="40"/>
+                    <vxe-column title="开始时间" field="startTime" width="150"/>
+                    <vxe-column title="医嘱号" field="actOrderNo" width="90"/>
+                    <vxe-column title="组" field="orderGroup" width="35">
+                        <template #default="{row}">
+                            <span style="color: red">{{ row.orderGroup }}</span>
+                        </template>
+                    </vxe-column>
+                    <vxe-column title="医嘱名称" field="orderName" width="220"/>
+                    <vxe-column title="嘱托" field="instruction" width="90"/>
+                    <vxe-column title="频率" field="frequCode" width="90"/>
+                    <vxe-column title="给药方式" field="supplyCodeName" width="90"/>
+                    <vxe-column title="申请科室" field="deptName" width="90"/>
+                    <vxe-column title="执行科室" field="execUnitName" width="90"/>
+                    <vxe-colgroup title="确认">
+                        <vxe-column title="确认医生" field="signerName" width="120"/>
+                        <vxe-column title="确认护士" field="executer1" width="120"/>
+                    </vxe-colgroup>
+                    <vxe-colgroup title="停止">
+                        <vxe-column title="停止时间" field="endTime" width="120"/>
+                        <vxe-column title="停止医生" field="modifierName" width="120"/>
+                    </vxe-colgroup>
+
+                </vxe-table>
             </template>
         </el-auto-resizer>
     </div>
@@ -145,7 +173,7 @@ const open = () => {
 }
 
 const copyClick = () => {
-    let tempData = tableRef.value.table().getSelectionRows()
+    let tempData = tableRef.value.getCheckboxRecords(true)
     let str = ''
     if (tempData.length > 0) {
         for (let i = 0; i < tempData.length; i++) {
@@ -179,7 +207,6 @@ const copyClick = () => {
 
 onMounted(() => {
     open()
-    console.log(props)
 })
 
 </script>

+ 10 - 13
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrTest.vue

@@ -90,10 +90,15 @@
             <template #default="{ height, width }">
                 <div style="display: flex">
                     <div class="sidebar">
-                        <xc-table-v3 :height="height"
-                                     @row-click="sidebarRow"
-                                     :data="sidebarList"
-                                     :columns="sidebarColums"/>
+                        <vxe-table :height="height"
+                                   :row-config="{isHover : true, isCurrent: true,height: 24}"
+                                   show-overflow
+                                   @cell-click="sidebarRow"
+                                   :data="sidebarList">
+                            <vxe-column title="名称" field="aply_CTNT"/>
+                            <vxe-column title="时间" field="ordr_CREATE_DATE" width="180"/>
+                        </vxe-table>
+
                     </div>
                     <div class="main">
                         <el-table :data="mainList"
@@ -144,7 +149,6 @@ import {getServerDateApi} from "@/api/public-api";
 import {queryInspectionDetail, queryInspectionsIndex} from '@/api/inspections'
 import {patInfo} from './emr-tools-store'
 import {onMounted, ref} from "vue";
-import XcTableV3 from "@/components/xiao-chan/xc-table-v3/XcTableV3.vue";
 import {xcMessage} from '@/utils/xiaochan-element-plus'
 import TestDescribe from "@/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/TestDescribe.vue";
 import {getDateRangeFormatDate} from '@/utils/date'
@@ -181,17 +185,10 @@ const query = async () => {
         console.log(res)
     })
 }
-
-const sidebarColums = [
-    {title: '名称', key: 'aply_CTNT'},
-    {title: '时间', key: 'ordr_CREATE_DATE', width: 180}
-]
-
-
 const expands = ref([])
 let currentReportForm = {}
 
-const sidebarRow = (row) => {
+const sidebarRow = ({row}) => {
     currentReportForm = row
     queryInspectionDetail(row.ordr_ID).then((res) => {
         mainList.value = res['inspectionItems']

+ 120 - 8
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrYzTemperature.vue

@@ -12,11 +12,80 @@
     <div style="height: 90%">
         <el-auto-resizer>
             <template #default="{ height, width }">
-                <xc-table-v3 :height="height"
-                             :columns="columns"
-                             @row-click="rowClick"
-                             :highlight-row="{key,rowKey: 'tempDate'}"
-                             :data="listRef"/>
+                <vxe-table :height="height"
+                           border
+                           class="hl-style"
+                           header-row-class-name="padding_zero"
+                           :column-config="{resizable: true}"
+                           :row-config="{ height: 24}"
+                           show-overflow
+                           :row-class-name="rowClassName"
+                           @cell-click="rowClick"
+                           :data="listRef">
+                    <vxe-column field="recDateStr" title="日期" width="94">
+                        <template #default="{row,rowIndex}">
+                            <component :is="dateDisplay(row,row.recDateStr,rowIndex)"/>
+                        </template>
+                    </vxe-column>
+                    <vxe-column title="时间" width="94">
+                        <template #default="{row,rowIndex}">
+                            <component :is="timePlsy(row,row.recDateStr,rowIndex)"/>
+                        </template>
+                    </vxe-column>
+                    <vxe-column field="patientState" title="病情" width="50"/>
+                    <vxe-column title="体温">
+                        <template #default="{row}">
+                            <template v-if="stringIsBlank(row.temperature1)">
+                                <span></span>
+                            </template>
+                            <template v-else>
+                                {{ row.temperature1 }}{{ row.temperature1Type }}
+                            </template>
+                        </template>
+                    </vxe-column>
+
+                    <vxe-colgroup title="次/min">
+                        <vxe-column field="heart" title="心率" width="40"/>
+                        <vxe-column field="pulse1" title="脉搏" width="40"/>
+                    </vxe-colgroup>
+
+                    <vxe-column field="breathe1" title="呼吸" width="40"/>
+                    <vxe-column field="pressure1AmAndPm" title="血压" width="55"/>
+                    <vxe-column field="spo2" title="Sp02%" width="50"/>
+                    <vxe-column field="mind" title="意识" width="40"/>
+
+                    <vxe-colgroup title="入量">
+                        <vxe-column field="col1Name" title="名称" width="100"/>
+                        <vxe-column field="col1Am" title="ml" width="40"/>
+                    </vxe-colgroup>
+
+                    <vxe-colgroup title="出量">
+                        <vxe-column field="col2Name" title="名称" width="80"/>
+                        <vxe-column field="ml" title="col2Am" width="40"/>
+                        <vxe-column field="ml" title="颜色" width="40"/>
+                        <vxe-column field="ml" title="状态" width="40"/>
+                    </vxe-colgroup>
+
+                    <vxe-column field="skin" title="皮肤" width="40"/>
+
+
+                    <vxe-colgroup title="管道">
+                        <vxe-column field="tubesName" title="管道名称" width="90"/>
+                        <vxe-column field="tubesStatus" title="管道情况" width="90"/>
+                    </vxe-colgroup>
+
+                    <vxe-column field="glu" title="血糖" width="40"/>
+                    <vxe-column field="otherInfo" title="护理措施及效果" width="240"/>
+
+                    <vxe-column field="userid" title="护士" width="70">
+                        <template #default="{row,rowIndex}">
+                            <component :is="timePlsy(row,row.userid , rowIndex)"/>
+                        </template>
+                    </vxe-column>
+
+                </vxe-table>
+
+
             </template>
         </el-auto-resizer>
     </div>
@@ -31,6 +100,32 @@ import {patInfo} from './emr-tools-store'
 import {stringIsBlank} from '@/utils/blank-utils'
 import {stringNotBlank} from "@/utils/blank-utils";
 
+const dateDisplay = (row, cellData, index) => {
+    console.log(cellData)
+    let temp = listRef.value[index - 1]
+    if (temp === null || typeof temp === 'undefined') {
+        return <span>{cellData}</span>
+    }
+    if (row.tempDate === temp.tempDate) {
+        return <span></span>
+    } else if (cellData === temp.recDateStr) {
+        return <span></span>
+    } else {
+        return <span>{cellData}</span>
+    }
+}
+
+const timePlsy = (row, cellData, index) => {
+    let temp = listRef.value[index - 1]
+    if (temp === null || typeof temp === 'undefined') {
+        return <span>{cellData}</span>
+    }
+    if (row.tempDate === temp.tempDate) {
+        return <span></span>
+    } else {
+        return <span>{cellData}</span>
+    }
+}
 
 const columns: XcColumn[] = [
     {
@@ -212,8 +307,8 @@ const mapRef: Ref = ref({})
 const key: Ref<string> = ref('')
 const otherInfo: Ref<string> = ref('')
 
-const rowClick = (val) => {
-    key.value = val.tempDate
+const rowClick = ({row}) => {
+    key.value = row.tempDate
     let item = mapRef.value[key.value]
     let str = ''
     if (stringNotBlank(item.patientState)) {
@@ -279,11 +374,28 @@ const query = () => {
         })
 }
 
+const rowClassName = ({row}) => {
+    console.log(row)
+    if (key.value === row.tempDate) {
+        return 'current'
+    }
+    return ''
+}
+
 onMounted(() => {
     query()
 })
 </script>
 
-<style scoped lang="scss">
+<style lang="scss">
+.padding_zero {
+  th {
+    padding: 0 !important;
+  }
+}
 
+.hl-style .current {
+  background-color: #187;
+  color: #fff;
+}
 </style>

+ 9 - 1
src/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/emr-tools-store.ts

@@ -1,3 +1,11 @@
-import {ref} from 'vue'
+import {reactive, ref} from 'vue'
+import {VxeGridProps} from "vxe-table";
 
 export const patInfo = ref()
+
+
+export const gridOptions  = reactive<VxeGridProps>({
+    border: true,
+    showOverflow: true,
+
+})

+ 143 - 143
src/components/zhu-yuan-yi-sheng/emr/web-socket/EmrWebSocket.vue

@@ -1,37 +1,37 @@
 <template>
-  <div class="chat_room"
-       ref="roomRef"
-       @click="dialog = true">
-    <div class="count">
-      {{ userSize }}
+    <div class="chat_room"
+         ref="roomRef"
+         @click="dialog = true">
+        <div class="count">
+            {{ userSize }}
+        </div>
     </div>
-  </div>
 
-  <emr-chat-box
-      v-if="dialog"
-      ref="dialogRef"
-      :current-editor-user="props.currentEditorUser"
-      @closed="dialog = false"
-      :user-list="userList"
-      :sid="sid"/>
+    <emr-chat-box
+            v-if="dialog"
+            ref="dialogRef"
+            :current-editor-user="props.currentEditorUser"
+            @closed="dialog = false"
+            :user-list="userList"
+            :sid="sid"/>
 
 
-  <el-dialog v-model="errDialog" title="与服务器断开连接"
-             :show-close="false"
-             :close-on-press-escape="false"
-             :close-on-click-modal="false">
-    <div v-loading="errDialog"
-         element-loading-text="正在尝试重新连接..."
-         style="width: 100%;height: 400px"/>
+    <el-dialog v-model="errDialog" title="与服务器断开连接"
+               :show-close="false"
+               :close-on-press-escape="false"
+               :close-on-click-modal="false">
+        <div v-loading="errDialog"
+             element-loading-text="正在尝试重新连接..."
+             style="width: 100%;height: 400px"/>
 
-  </el-dialog>
+    </el-dialog>
 
 </template>
 
 <script setup name='EmrWebSocket' lang="ts">
 import {stringIsBlank} from "@/utils/blank-utils";
 import store from "@/store";
-import {ref, defineProps, onMounted, nextTick, computed,  onBeforeUnmount} from 'vue'
+import {ref, defineProps, onMounted, nextTick, computed, onBeforeUnmount} from 'vue'
 import {xcMessage} from '@/utils/xiaochan-element-plus'
 import {getRoomPeople, sendAMessage} from '@/api/zhu-yuan-yi-sheng/emr-socket'
 import {ElNotification} from "element-plus";
@@ -39,14 +39,14 @@ import EmrChatBox from "@/components/zhu-yuan-yi-sheng/emr/web-socket/EmrChatBox
 import {$ref} from "vue/macros";
 
 const props = defineProps({
-  patInfo: {
-    type: Object,
-    default: null
-  },
-  currentEditorUser: {
-    type: Object,
-    default: null
-  }
+    patInfo: {
+        type: Object,
+        default: null
+    },
+    currentEditorUser: {
+        type: Object,
+        default: null
+    }
 })
 const roomRef = ref<HTMLElement | null>(null)
 
@@ -62,176 +62,176 @@ let userData = store.state.user.info
 let sid = $ref(null)
 
 const onmessageFunc = {
-  "connect": async (data) => {
-    await queryTheNumberOfPeopleInTheRoom()
-    xcMessage.success('连接成功')
-  },
-  "connectToJoin": async (val) => {
-    await queryTheNumberOfPeopleInTheRoom()
-    let userInfo = userMap.value[val]
-    ElNotification({
-      type: 'success',
-      title: '有新的连接加入',
-      dangerouslyUseHTMLString: true,
-      message: `<span>姓名:${userInfo.name}</span>
+    "connect": async (data) => {
+        await queryTheNumberOfPeopleInTheRoom()
+        xcMessage.success('连接成功')
+    },
+    "connectToJoin": async (val) => {
+        await queryTheNumberOfPeopleInTheRoom()
+        let userInfo = userMap.value[val]
+        ElNotification({
+            type: 'success',
+            title: '有新的连接加入',
+            dangerouslyUseHTMLString: true,
+            message: `<span>姓名:${userInfo.name}</span>
                 <br>
                 <span>科室:${userInfo.deptName}</span>`
-    })
-    console.log("连接加入 %s, 数据 %o", val, userMap.value)
-  },
-  "exitEmrEditor": async (val) => {
-    let userInfo = userMap.value[val]
-    ElNotification({
-      type: 'error',
-      title: '有连接退出',
-      dangerouslyUseHTMLString: true,
-      message: `<span>姓名:${userInfo.name}</span>
+        })
+        console.log("连接加入 %s, 数据 %o", val, userMap.value)
+    },
+    "exitEmrEditor": async (val) => {
+        let userInfo = userMap.value[val]
+        ElNotification({
+            type: 'error',
+            title: '有连接退出',
+            dangerouslyUseHTMLString: true,
+            message: `<span>姓名:${userInfo.name}</span>
                 <br>
                 <span>科室:${userInfo.deptName}</span>`
-    })
-    console.log("连接退出 %s,数据 %o", val, userMap.value)
-    await queryTheNumberOfPeopleInTheRoom()
-  },
-  "message": async (val) => {
-    if (dialog.value) {
-      dialogRef.value.queryJump();
-    }
-    dialog.value = true
-    console.log("接受消息 %o", val)
-  },
-  "notice": (val) => {
-    ElNotification({
-      type: 'success',
-      title: '查看或编辑',
-      message: val
-    })
-  },
-  "closeSoctek": (val) => {
-    if (navigator.userAgent.indexOf("Firefox") !== -1 || navigator.userAgent.indexOf("Chrome") !== -1) {
-      window.location.href = "about:blank";
-      window.close();
-    } else {
-      window.opener = null;
-      window.open("", "_self");
-      window.close();
+        })
+        console.log("连接退出 %s,数据 %o", val, userMap.value)
+        await queryTheNumberOfPeopleInTheRoom()
+    },
+    "message": async (val) => {
+        if (dialog.value) {
+            dialogRef.value.queryJump();
+        }
+        dialog.value = true
+        console.log("接受消息 %o", val)
+    },
+    "notice": (val) => {
+        ElNotification({
+            type: 'success',
+            title: '查看或编辑',
+            message: val
+        })
+    },
+    "closeSoctek": (val) => {
+        if (navigator.userAgent.indexOf("Firefox") !== -1 || navigator.userAgent.indexOf("Chrome") !== -1) {
+            window.location.href = "about:blank";
+            window.close();
+        } else {
+            window.opener = null;
+            window.open("", "_self");
+            window.close();
+        }
     }
-  }
 }
 
 const userSize = computed(() => {
-  return Object.keys(userMap.value).length
+    return Object.keys(userMap.value).length
 })
 
 const userList = computed(() => {
-  return Object.values(userMap.value)
+    return Object.values(userMap.value)
 })
 
 const queryTheNumberOfPeopleInTheRoom = async () => {
-  userMap.value = await getRoomPeople(sid) as any
+    userMap.value = await getRoomPeople(sid) as any
 }
 
 function initWebSocket(patNo, times) {
-  if (stringIsBlank(patNo)) {
-    return null
-  }
+    if (stringIsBlank(patNo)) {
+        return null
+    }
 
-  if ('WebSocket' in window) {
-    sid = 'emr_' + patNo.trim() + '_' + times;
-    const url = SOCKET_URL + sid + '?userCode=' + userData.code;
-    webSocket = new WebSocket(url);
-  } else {
-    alert('该浏览器不支持websocket!');
-    webSocket = 'unsupport';
-  }
+    if ('WebSocket' in window) {
+        sid = 'emr_' + patNo.trim() + '_' + times;
+        const url = SOCKET_URL + sid + '?userCode=' + userData.code;
+        webSocket = new WebSocket(url);
+    } else {
+        alert('该浏览器不支持websocket!');
+        webSocket = 'unsupport';
+    }
 
-  webSocket.onopen = async () => {
-    errDialog.value = false
-  }
+    webSocket.onopen = async () => {
+        errDialog.value = false
+    }
 
 
-  webSocket.onmessage = async function (e) {
-    let data = JSON.parse(e.data)
-    for (let key in data) {
-      onmessageFunc[key](data[key])
-    }
+    webSocket.onmessage = async function (e) {
+        let data = JSON.parse(e.data)
+        for (let key in data) {
+            onmessageFunc[key](data[key])
+        }
 
-  }
+    }
 
-  webSocket.onclose = () => {
-    errDialog.value = true
-    initWebSocket(props.patInfo.inpatientNo, props.patInfo.admissTimes)
-  }
+    webSocket.onclose = () => {
+        errDialog.value = true
+        initWebSocket(props.patInfo.inpatientNo, props.patInfo.admissTimes)
+    }
 
 }
 
 const medicalRecordSwitching = async (name) => {
-  await sendAMessage(sid, "notice", name)
+    await sendAMessage(sid, "notice", name)
 }
 
 
 let documentSocket = null
 let documentSid = null
 const documentChange = (id) => {
-  documentSid = 'documentEmr_' + id + '_' + userData.code
-  if (documentSocket != null) {
-    documentSocket.close()
-    documentSocket = null
-  } else {
-    if ('WebSocket' in window) {
-      initDocumentSocket()
+    documentSid = 'documentEmr_' + id + '_' + userData.code
+    if (documentSocket != null) {
+        documentSocket.close()
+        documentSocket = null
     } else {
-      alert('该浏览器不支持websocket!');
-      documentSocket = null;
+        if ('WebSocket' in window) {
+            initDocumentSocket()
+        } else {
+            alert('该浏览器不支持websocket!');
+            documentSocket = null;
+        }
     }
-  }
 }
 
 const initDocumentSocket = () => {
-  if (documentSid == null) return
-  let temp = SOCKET_URL + documentSid
+    if (documentSid == null) return
+    let temp = SOCKET_URL + documentSid
 
-  documentSocket = new WebSocket(temp)
+    documentSocket = new WebSocket(temp)
 
-  documentSocket.onopen = () => {
-    console.log('连接成功')
-  }
+    documentSocket.onopen = () => {
+        console.log('连接成功')
+    }
 
-  documentSocket.onclose = () => {
-    initDocumentSocket()
-  }
+    documentSocket.onclose = () => {
+        initDocumentSocket()
+    }
 
 }
 
 const clearDocument = () => {
-  if (documentSocket != null) {
-    documentSocket.close()
-    documentSocket = null
-    documentSid = null
-  }
+    if (documentSocket != null) {
+        documentSocket.close()
+        documentSocket = null
+        documentSid = null
+    }
 }
 
 const clearSocket = () => {
-  if (webSocket != null) {
-    webSocket.close()
-    webSocket = null
-  }
+    if (webSocket != null) {
+        webSocket.close()
+        webSocket = null
+    }
 }
 
 onMounted(async () => {
-  await nextTick()
-  initWebSocket(props.patInfo.inpatientNo, props.patInfo.admissTimes)
+    await nextTick()
+    initWebSocket(props.patInfo.inpatientNo, props.patInfo.admissTimes)
 })
 
 onBeforeUnmount(() => {
-  clearDocument()
-  clearSocket()
+    clearDocument()
+    clearSocket()
 })
 
 defineExpose({
-  medicalRecordSwitching,
-  documentChange,
-  clearDocument,
-  clearSocket
+    medicalRecordSwitching,
+    documentChange,
+    clearDocument,
+    clearSocket
 })
 
 </script>

File diff suppressed because it is too large
+ 513 - 513
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/DialogDiseases.vue


+ 15 - 2
src/main.js

@@ -13,6 +13,8 @@ import JsonViewer from "vue3-json-viewer";
 import "vue3-json-viewer/dist/index.css";
 import DataVVue3 from '@kjgl77/datav-vue3'
 import tip from '@/instructions/tip'
+import VXETable from 'vxe-table'
+import 'vxe-table/lib/style.css'
 
 addRoutes()
 
@@ -20,12 +22,23 @@ const app = createApp(App)
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
     app.component(key, component)
 }
+tip(app)
+
+VXETable.setup({
+    version: 0,
+    zIndex: 99999, // 想多高就设置多高
+    table: {
+        autoResize: true
+    }
+})
+
 app.use(ElementPlus, {locale: zhCn, size: store.state.app.elementSize})
 app.use(store)
 app.use(router)
 app.use(DataVVue3)
-tip(app)
-
+app.use(VXETable)
 app.use(JsonViewer);
 app.mount('#app')
 
+
+

+ 12 - 2
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/Home.vue

@@ -60,7 +60,7 @@ import {
     applicationData, canIUnlockIt,
     completeModeSwitch,
     conciseMode,
-    emrConfig,
+    emrConfig, emrMitt,
     query,
     resolveRoute, unlockEnum
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
@@ -73,6 +73,7 @@ import {stringIsBlank} from "@/utils/blank-utils";
 import EmrQualityControlRelieve
     from "@/components/zhu-yuan-yi-sheng/emr/EmrQualityControlRelieve/EmrQualityControlRelieve.vue";
 import {getMyUnlockByPatNo} from "@/api/zhu-yuan-yi-sheng/emr-control-rule";
+import store from "@/store";
 
 const patInfoRef = ref(null)
 const patInfoRefOld = ref(null)
@@ -256,7 +257,16 @@ channel.addEventListener('message', (event) => {
 })
 
 const emrSocketUnlock = async () => {
-    await emrSocketUnlockApi('emr_' + query.value.patNo.trim() + '_' + query.value.times)
+    let documentSid = ''
+    try {
+        let editor = emrMitt.emit('editor')
+        let id = editor.documentData._id
+        let userData = store.state.user.info
+        documentSid = 'documentEmr_' + id + '_' + userData.code
+    } catch {
+
+    }
+    await emrSocketUnlockApi('emr_' + query.value.patNo.trim() + '_' + query.value.times, documentSid)
     show = false
     location.reload()
     await routerFunc()

+ 2 - 2
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/TemplateMaintenance.vue

@@ -138,7 +138,7 @@
             </el-col>
             <el-col :span="span">
                 <el-form-item class="bi_tian" label="执行科室:" prop="execUnit">
-                    <xc-table-v3
+                    <XcSelectV3
                             style="width: 120px"
                             v-model="yiZhuData"
                             :data="zhiXingKeShiData"
@@ -339,7 +339,7 @@ import YaoPingXiangQing from '@/components/zhu-yuan-yi-sheng/he-li-yong-yao/YaoP
 import Sleep from '@/utils/sleep'
 import {BizException, ExceptionEnum} from '@/utils/BizException'
 import {setScrollTop} from "@/utils/el-table-scroll";
-import XcTableV3 from "@/components/xiao-chan/select-v3/XcSelectV3.vue"
+import XcSelectV3 from "@/components/xiao-chan/select-v3/XcSelectV3.vue"
 import {xcMessage} from "@/utils/xiaochan-element-plus";
 import XcComboGrid from "@/components/xiao-chan/combo-grid/XcComboGrid";
 import XcSelect from "@/components/xiao-chan/select/XcSelect";

Some files were not shown because too many files changed in this diff