Explorar el Código

优化住院医生,和电子病历

DESKTOP-0GD05B0\Administrator hace 2 años
padre
commit
6bcac180af

+ 26 - 18
package-lock.json

@@ -390,11 +390,6 @@
       "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
       "dev": true
     },
-    "@popperjs/core": {
-      "version": "npm:@sxzz/popperjs-es@2.11.7",
-      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
-      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
-    },
     "@rollup/plugin-node-resolve": {
       "version": "13.1.1",
       "resolved": "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz",
@@ -916,6 +911,27 @@
         "whatwg-fetch": "^3.6.2"
       },
       "dependencies": {
+        "@vue/vue-loader-v15": {
+          "version": "npm:vue-loader@15.10.0",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.0.tgz",
+          "integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
+          "dev": true,
+          "requires": {
+            "@vue/component-compiler-utils": "^3.1.0",
+            "hash-sum": "^1.0.2",
+            "loader-utils": "^1.1.0",
+            "vue-hot-reload-api": "^2.3.0",
+            "vue-style-loader": "^4.1.0"
+          },
+          "dependencies": {
+            "hash-sum": {
+              "version": "1.0.2",
+              "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+              "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+              "dev": true
+            }
+          }
+        },
         "array-union": {
           "version": "2.1.0",
           "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
@@ -1285,19 +1301,6 @@
       "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz",
       "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw=="
     },
-    "@vue/vue-loader-v15": {
-      "version": "npm:vue-loader@15.10.0",
-      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.0.tgz",
-      "integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
-      "dev": true,
-      "requires": {
-        "@vue/component-compiler-utils": "^3.1.0",
-        "hash-sum": "^1.0.2",
-        "loader-utils": "^1.1.0",
-        "vue-hot-reload-api": "^2.3.0",
-        "vue-style-loader": "^4.1.0"
-      }
-    },
     "@vue/web-component-wrapper": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
@@ -2900,6 +2903,11 @@
         "normalize-wheel-es": "^1.2.0"
       },
       "dependencies": {
+        "@popperjs/core": {
+          "version": "npm:@sxzz/popperjs-es@2.11.7",
+          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+        },
         "@sxzz/popperjs-es": {
           "version": "npm:@sxzz/popperjs-es@2.11.7",
           "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",

+ 8 - 0
src/api/inpatient/xiang-mu-lu-ru.js

@@ -150,4 +150,12 @@ export function xiuGaiZiFeiBiaoZhi(data) {
     })
 }
 
+export function drugRefundForm(groupNo, patNo, times) {
+    return request({
+        url: '/xmlr/drugRefundForm',
+        method: 'get',
+        params: {groupNo, patNo, times},
+    })
+}
+
 

+ 7 - 0
src/api/public-api.js

@@ -157,3 +157,10 @@ export function getSystemAnnouncement() {
         method: 'get',
     });
 }
+
+export function getUuid() {
+    return request({
+        url: '/publicApi/getUuid',
+        method: 'get',
+    })
+}

+ 8 - 0
src/api/zhu-yuan-yi-sheng/emr-patient.js

@@ -41,3 +41,11 @@ export function queryWhetherThePatientHasASpecifiedMedicalRecord(data) {
         data
     })
 }
+
+export function extractDataElement(data) {
+    return request({
+        url: url + 'extractDataElement',
+        method: 'post',
+        data
+    })
+}

+ 59 - 34
src/components/inpatient/XiangMuLuRu.vue

@@ -89,7 +89,7 @@
                        @click="riQiPaiXu === 'DESC' ? (riQiPaiXu = 'ASC') : (riQiPaiXu = 'DESC')"
             >{{ riQiPaiXu === 'DESC' ? '日期降序' : '日期升序' }}
             </el-button>
-            <el-select v-model="feiYongLeiXingCode" style="width: 70px">
+            <el-select v-model="feiYongLeiXingCode" style="width: 70px" @change="queryFeiYong">
               <el-option v-for="item in feiYongLeiXing" :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>
@@ -112,6 +112,8 @@
             </el-select>
             <el-button icon="Search" type="primary" @click="queryFeiYong">查询</el-button>
             <el-button icon="Delete" type="danger" @click="xiangMuTuiFeiClick">退费</el-button>
+            <!--            <el-button icon="Printer" type="primary" @click="点击打印退药单">打印退药单</el-button>-->
+            <print-the-drug-return-form v-if="退药单弹框" :patient="patient" @close="退药单弹框 = false"/>
             <el-button v-if="store.state.user.info.roles.findIndex((i) => i === 1 || i === 8) > -1" type="warning"
                        @click="sheZhiWeiYiVBao">设为医保
             </el-button>
@@ -355,6 +357,31 @@
         </el-dialog>
       </el-main>
     </el-container>
+
+    <el-dialog v-model="refundConfirmation.dialog" title="退费确认">
+      <el-form label-width="80">
+        <el-form-item label="数量">
+          {{ refundConfirmation.chargeAmount }}
+        </el-form-item>
+        <el-form-item label="价格">
+          {{ refundConfirmation.chargeFee }}
+        </el-form-item>
+
+        <el-form-item label="选择药房" v-if="feiYongLeiXingCode === 1">
+          <el-select v-model="patient.groupNo">
+            <el-option value="71" label="门诊"/>
+            <el-option value="73" label="住院"/>
+          </el-select>
+        </el-form-item>
+
+      </el-form>
+
+      <template #footer>
+        <el-button type="primary" @click="refundConfirmation.dialog = false">取消</el-button>
+        <el-button type="danger" @click="confirmRefund">确认</el-button>
+      </template>
+    </el-dialog>
+
   </el-container>
 </template>
 
@@ -366,7 +393,6 @@ import {
   cheXiaoTuiFei,
   getChargeCode,
   getHuanZheFeiYong,
-  getMuBanXinXi,
   getPyCode,
   queryDanGeXiangMu,
   shangChuanMuBan,
@@ -384,6 +410,7 @@ import {getDept} from '@/api/public-api'
 import {baseinfo} from '@/data/inpatient'
 import {listIsBlank} from '@/utils/blank-utils'
 import Sleep from "@/utils/sleep";
+import PrintTheDrugReturnForm from "@/components/med-tec-mod/PrintTheDrugReturnForm";
 
 const props = defineProps({
   init: {
@@ -409,7 +436,7 @@ const riQiPaiXu = ref('DESC')
 const quanXian = store.state.user.info.roles
 const activeName = ref('1')
 
-const feiYongLeiXingCode = ref(0)
+const feiYongLeiXingCode = ref(1)
 
 /**
  * 录入费用 表格
@@ -576,7 +603,11 @@ const cptTableDataHuanZheFeiYong = ref([])
 /**
  *  项目退费
  */
-
+let refundConfirmation = $ref({
+  dialog: false,
+  chargeFee: 0,
+  chargeAmount: 0
+})
 const xiangMuTuiFeiClick = () => {
   if (typeof patient.value.list !== 'undefined') {
     let chargeFee = 0
@@ -586,23 +617,9 @@ const xiangMuTuiFeiClick = () => {
       chargeFee += patient.value.list[i].chargeFee
     }
     if (patient.value.list.length > 0) {
-      ElMessageBox.confirm(
-          `退费数量为:<span style='color:red'>【${chargeAmount}】</span> ,总价格为:<span style='color:#E6A23C'>【${chargeFee.toFixed(2)}】</span>`,
-          '请认真核对',
-          {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning',
-            dangerouslyUseHTMLString: true,
-          }
-      )
-          .then(() => {
-            xiangMuTuiFei(patient.value).then((res) => {
-              queryFeiYong()
-            })
-          })
-          .catch(() => {
-          })
+      refundConfirmation.dialog = true
+      refundConfirmation.chargeFee = chargeFee
+      refundConfirmation.chargeAmount = chargeAmount
     } else {
       ElMessage.warning({
         message: '请先选择退费数据',
@@ -617,6 +634,22 @@ const xiangMuTuiFeiClick = () => {
   }
 }
 
+
+const confirmRefund = () => {
+
+  if (feiYongLeiXingCode.value === 1) {
+    if (!patient.value.groupNo) {
+      ElMessage.error('请先选择药房。')
+      return
+    }
+  }
+
+  xiangMuTuiFei(patient.value).then((res) => {
+    queryFeiYong()
+    refundConfirmation.dialog = false
+  })
+}
+
 const cheXiaoTuiFeiClick = (index, row) => {
   cheXiaoTuiFei(row.inpatientNo, row.admissTimes, row.ledgerSn, row.detailSn).then(() => {
   })
@@ -624,15 +657,6 @@ const cheXiaoTuiFeiClick = (index, row) => {
 
 //////////////////////////////////// 以上全部是 已录入项目 //////////////////////////////////////////////////////////////////////////////
 
-/**
- * 点击获取模板信息
- */
-const muBanXiangQing = ref([])
-const getMuBanXinXiClick = (row) => {
-  getMuBanXinXi(row.name, row.opIdCode).then((res) => {
-    muBanXiangQing.value = res
-  })
-}
 
 /**
  * 获取项目模板详情的数据
@@ -653,11 +677,7 @@ const xuanZeXiangMuTable = (param) => {
 }
 
 const muBanCurrentPage = ref(1)
-const muBanPageSize = ref(10)
 
-const muBanHandleCurrentChange = (val) => {
-  muBanCurrentPage.value = val
-}
 
 /**
  * 删除项目
@@ -898,6 +918,11 @@ const conversionRefundFlag = (val) => {
   }
 }
 
+let 退药单弹框 = $ref(false)
+const 点击打印退药单 = () => {
+  退药单弹框 = true
+}
+
 </script>
 
 <style></style>

+ 80 - 0
src/components/med-tec-mod/PrintTheDrugReturnForm.vue

@@ -0,0 +1,80 @@
+<template>
+  <el-dialog v-model="dialog" title="退药单" @closed="emit('close')">
+    药房:
+    <el-select v-model="groupNo" @change="查询药品退药单">
+      <el-option value="71" label="门诊"/>
+      <el-option value="73" label="住院"/>
+    </el-select>
+
+    <div>
+
+      <table>
+        <thead>
+        <tr>
+          <th colspan="6">{{ groupNo === '71' ? '门诊退药单' : '住院退药单' }}</th>
+        </tr>
+        <tr>
+          <th colspan="6">
+            <div>
+              药单类别: 护士退药单
+            </div>
+            <!--            <div>-->
+            <!--              请领科室 : {{ store.state.user.info.deptName }}-->
+            <!--            </div>-->
+          </th>
+
+        </tr>
+
+        </thead>
+        <tbody>
+
+        </tbody>
+      </table>
+
+    </div>
+
+  </el-dialog>
+</template>
+
+<script setup name='PrintTheDrugReturnForm'>
+
+import {getLodop, initLodop} from '@/utils/c-lodop'
+import {drugRefundForm} from '@/api/inpatient/xiang-mu-lu-ru'
+import store from '@/store'
+import sleep from "@/utils/sleep";
+
+const emit = defineEmits(['close'])
+const props = defineProps({
+  patient: {
+    type: Object
+  }
+})
+
+let groupNo = $ref('71')
+
+
+let dialog = $ref(true)
+
+const 查询药品退药单 = () => {
+  drugRefundForm(groupNo, '0409324', 1).then((res) => {
+    console.log(res)
+  })
+  console.log(groupNo)
+}
+
+onMounted(() => {
+  nextTick(() => {
+    sleep(1000).then(() => {
+      查询药品退药单()
+    })
+
+  })
+
+  initLodop()
+})
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

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

@@ -13,6 +13,10 @@
            :filter-node-method="filterNode"
            default-expand-all>
     <template #default="{ node, data }">
+      <el-icon>
+        <Folder v-if="data.children"/>
+        <Document v-else/>
+      </el-icon>
       {{ data.name }}
     </template>
   </el-tree>
@@ -41,29 +45,50 @@ const defaultProps = {
 let templateType = $ref(0)
 
 const handleNodeClick = async (val, property, event) => {
+  let temp = {}
+  if (templateType === 0) {
+    temp = {
+      documentId: null,
+      categoryCode: val.code,
+      categroyId: val._id,
+      patientId: null,
+      name: val.name
+    }
+  } else if (templateType === 2) {
+    temp = {
+      documentId: val.emrDocumentId,
+      categoryCode: val.emrCategoryCode,
+      categroyId: null,
+      patientId: null,
+      name: val.emrName
+    }
+  }
   let str = JSON.stringify(val)
-
-  if (val.code) {
+  if (val.children) {
+    return
+  }
+  if (val.labels) {
     // 根据 这个编码来限制是不是唯一一个
-    if (val.code.includes('【唯一】') && templateType !== 2) {
+    if (val.labels.includes('唯一') && templateType !== 2) {
       let flag = await queryWhetherThePatientHasASpecifiedMedicalRecord({
         patNo: huanZheXinXi.value.inpatientNo,
         times: huanZheXinXi.value.admissTimes,
         emrCategoryCode: val.code
       })
-
       if (flag) {
-        BizException(ExceptionEnum.LOGICAL_ERROR, '此病历只能填写一次。')
+        BizException(ExceptionEnum.LOGICAL_ERROR, '此病历只能创建一次。')
       }
     }
   }
 
-  if (val.roundTime) {
-    emit('nodeClick', val, property.parent.data, templateType);
+  if (val.jump) {
+    temp.code = val.code
+    temp.value = val.value
+    emit('nodeClick', temp, true, templateType);
   } else {
     if (key !== str) {
       key = str
-      emit('nodeClick', val, null, templateType);
+      emit('nodeClick', temp, false, templateType);
     }
   }
 
@@ -121,22 +146,10 @@ const deleteTheSpecifiedNode = (id) => {
 }
 
 let findNode = false
-const diseaseDurationRecordTime = (ward_round_time, name, id) => {
-  if (!ward_round_time) {
-    return
-  }
-  let roundTimes = []
-  for (let i = 0; i < ward_round_time.length; i++) {
-    let item = ward_round_time[i]
-    roundTimes.push({
-      name: item.element.name + item.value,
-      value: item.value,
-      roundTime: true,
-      code: name
-    })
-  }
+const diseaseDurationRecordTime = (id, list) => {
   findNode = false
-  寻找病历根据文档id(id, roundTimes, returnData.patientTree)
+  console.log(id, list)
+  寻找病历根据文档id(id, list, returnData.patientTree)
 }
 
 const 寻找病历根据文档id = (id, roundTimes, list) => {

+ 43 - 30
src/components/zhu-yuan-yi-sheng/emr/EmrSnippet.vue

@@ -1,22 +1,32 @@
 <template>
-  <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/>
-  <el-dialog v-model="dialog" title="效果预览" top="2%" width="60%">
-    <div>
-      <iframe src="/emr/runtime/#/editor"
-              style="width: 100%"
-              :style="{height: getWindowSize.h / 1.2 + 'px'}"
-              ref="emrRef"/>
-    </div>
-  </el-dialog>
+  <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>
+    <el-dialog v-model="dialog" title="效果预览" top="2%" width="60%">
+      <div>
+        <iframe src="/emr/runtime/#/editor"
+                style="width: 100%"
+                :style="{height: getWindowSize.h / 1.2 + 'px'}"
+                ref="emrRef"/>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script setup name='EmrSnippet'>
@@ -25,13 +35,8 @@ 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({
-  patientData: {
-    type: Object
-  }
-})
-
 const emit = defineEmits(['nodeClick'])
+let patientData = {}
 
 let snippetData = $ref([])
 let dialog = $ref(false)
@@ -45,11 +50,10 @@ const defaultProps = {
   label: 'name',
 }
 
+
 const editorEvents = {
-  'loaded': (event) => {
-    if (!currentEmr.value) {
-      currentEmr.value.callMethod('setDocument', selectedData, true, true)
-    }
+  'ready': (event) => {
+    currentEmr.value.callMethod('setDocument', selectedData, true, true)
   }
 }
 
@@ -74,16 +78,21 @@ const handleNodeClick = (node, object, event) => {
 const fragmentPreview = (event, data, node) => {
   selectedData = data
   dialog = true
-  if (currentEmr.value) {
+  if (currentEmr.value !== null) {
     currentEmr.value.callMethod('setDocument', selectedData, true, true)
   } else {
     nextTick(() => {
-      currentEmr.value = new EMRInteractive(props.patientData, editorEvents);
+      currentEmr.value = new EMRInteractive(patientData, editorEvents);
       emrRef.value.parentElement.emr = currentEmr.value
     });
+
   }
 }
 
+const setPatientData = (val) => {
+  patientData = val
+}
+
 
 onMounted(() => {
   getSnippet().then((res) => {
@@ -92,6 +101,10 @@ onMounted(() => {
   })
 })
 
+defineExpose({
+  setPatientData
+})
+
 </script>
 
 <style scoped>

+ 24 - 24
src/router/modules/dashboard.js

@@ -473,10 +473,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/YiZhuLuRu.vue')),
                         meta: {
                             title: '医嘱录入',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                     {
@@ -484,10 +484,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/HuiZhenShenQing.vue')),
                         meta: {
                             title: '会诊申请',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                     {
@@ -495,10 +495,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/jian-cha-jian-yan-shen-qing/JianChaShenQing.vue')),
                         meta: {
                             title: '检查申请',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                     {
@@ -506,10 +506,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/jian-cha-jian-yan-shen-qing/JianYanShenQing.vue')),
                         meta: {
                             title: '检验申请',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                     {
@@ -517,10 +517,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/shou-shu-shen-qing/ShouShuShenQing.vue')),
                         meta: {
                             title: '查看手术',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                     {
@@ -528,10 +528,10 @@ const route = [
                         component: createNameComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/cao-yao-yi-zhu/ChaXunChaoYaoYiZhu.vue')),
                         meta: {
                             title: '查看草药医嘱',
-                            hideTabs: true,
-                            passRule: true,
-                            activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
-                            parentName: '住院医生',
+                            // hideTabs: true,
+                            // passRule: true,
+                            // activeMenu: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
+                            // parentName: '住院医生',
                         },
                     },
                 ],

+ 65 - 66
src/views/dictionary/EmrDataMaintenance.vue

@@ -27,73 +27,72 @@
           <el-table-column prop="sqlSentence" label="语句内容" show-overflow-tooltip/>
         </el-table-column>
       </xc-table>
-    </template>
-
-    <el-drawer v-model="editData.dialog"
-               :title="editData.title"
-               @closed="close"
-               size="90%">
-      <el-row>
-
-        <el-col :span="12">
-          <el-form :model="editData.data" :label-width="90" :rules="rules" ref="formRef">
-
-            <el-form-item prop="patNo" label="住院号">
-              <el-input v-model="editData.data.patNo" @blur="editData.data.patNo = $event.target.value.trim()"
-                        placeholder="请输入住院号"/>
-            </el-form-item>
-
-            <el-form-item prop="patNo" label="住院次数">
-              <el-input-number style="width: 100%;" :min="1" :precision="0" v-model="editData.data.times"
-                               placeholder="请输入住院次数"/>
-            </el-form-item>
-
-            <el-form-item prop="name" label="名称">
-              <el-input v-model="editData.data.name" @blur="editData.data.name = $event.target.value.trim()"
-                        placeholder="请输入名称"/>
-            </el-form-item>
-
-            <el-form-item prop="dataType" label="数据类型">
-              <el-radio-group v-model="editData.data.dataType">
-                <el-radio :label="0">对象</el-radio>
-                <el-radio :label="1">数组</el-radio>
-              </el-radio-group>
-            </el-form-item>
-
-            <el-form-item prop="groupName" label="分组名称" v-if="editData.data.dataType === 1">
-              <el-input v-model="editData.data.groupName" @blur="editData.data.groupName = $event.target.value.trim()"
-                        placeholder="请输入分组名称"/>
-            </el-form-item>
-
-            <el-form-item prop="sqlSentence" label="语句内容">
-              <el-input v-model="editData.data.sqlSentence" type="textarea"
-                        :autosize="{ minRows: 30, maxRows: 40 }"
-                        placeholder="请输入sql语句" @change="editData.passedTheTest = false"/>
-            </el-form-item>
-
-          </el-form>
-        </el-col>
-
-        <el-col :span="12">
-          <JsonViewer :value="checkData" style="height: 100%" copyable :expandDepth="3"/>
-        </el-col>
-
-      </el-row>
-
-
-      <template #footer>
-        <div>
-          <el-button type="primary" plain @click="testSql">测试sql</el-button>
-          <el-button type="primary" @click="confirm">确认</el-button>
-          <el-button @click="close">取消</el-button>
-        </div>
-      </template>
-    </el-drawer>
-
-    <el-dialog v-model="returnValue.dialog" title="该患者的数据" draggable>
-      <JsonViewer :value="returnValue.data" style="height: 100%" copyable :expandDepth="3"/>
-    </el-dialog>
 
+      <el-drawer v-model="editData.dialog"
+                 :title="editData.title"
+                 @closed="close"
+                 size="90%">
+        <el-row>
+
+          <el-col :span="12">
+            <el-form :model="editData.data" :label-width="90" :rules="rules" ref="formRef">
+
+              <el-form-item prop="patNo" label="住院号">
+                <el-input v-model="editData.data.patNo" @blur="editData.data.patNo = $event.target.value.trim()"
+                          placeholder="请输入住院号"/>
+              </el-form-item>
+
+              <el-form-item prop="patNo" label="住院次数">
+                <el-input-number style="width: 100%;" :min="1" :precision="0" v-model="editData.data.times"
+                                 placeholder="请输入住院次数"/>
+              </el-form-item>
+
+              <el-form-item prop="name" label="名称">
+                <el-input v-model="editData.data.name" @blur="editData.data.name = $event.target.value.trim()"
+                          placeholder="请输入名称"/>
+              </el-form-item>
+
+              <el-form-item prop="dataType" label="数据类型">
+                <el-radio-group v-model="editData.data.dataType">
+                  <el-radio :label="0">对象</el-radio>
+                  <el-radio :label="1">数组</el-radio>
+                </el-radio-group>
+              </el-form-item>
+
+              <el-form-item prop="groupName" label="分组名称" v-if="editData.data.dataType === 1">
+                <el-input v-model="editData.data.groupName" @blur="editData.data.groupName = $event.target.value.trim()"
+                          placeholder="请输入分组名称"/>
+              </el-form-item>
+
+              <el-form-item prop="sqlSentence" label="语句内容">
+                <el-input v-model="editData.data.sqlSentence" type="textarea"
+                          :autosize="{ minRows: 30, maxRows: 40 }"
+                          placeholder="请输入sql语句" @change="editData.passedTheTest = false"/>
+              </el-form-item>
+
+            </el-form>
+          </el-col>
+
+          <el-col :span="12">
+            <JsonViewer :value="checkData" style="height: 100%" copyable :expandDepth="3"/>
+          </el-col>
+
+        </el-row>
+
+
+        <template #footer>
+          <div>
+            <el-button type="primary" plain @click="testSql">测试sql</el-button>
+            <el-button type="primary" @click="confirm">确认</el-button>
+            <el-button @click="close">取消</el-button>
+          </div>
+        </template>
+      </el-drawer>
+
+      <el-dialog v-model="returnValue.dialog" title="该患者的数据" draggable>
+        <JsonViewer :value="returnValue.data" style="height: 100%" copyable :expandDepth="3"/>
+      </el-dialog>
+    </template>
   </page-layer>
 </template>
 

+ 0 - 80
src/views/hospitalization/zhu-yuan-yi-sheng/Home.vue

@@ -76,86 +76,6 @@ const currentPagePosition = (val) => {
 }
 
 
-const data = [
-  {
-    label: 'Level one 1',
-    children: [
-      {
-        label: 'Level two 1-1',
-        children: [
-          {
-            label: 'Level three 1-1-1',
-          },
-        ],
-      },
-    ],
-  },
-  {
-    label: 'Level one 2',
-    children: [
-      {
-        label: 'Level two 2-1',
-        children: [
-          {
-            label: 'Level three 2-1-1',
-          },
-        ],
-      },
-      {
-        label: 'Level two 2-2',
-        children: [
-          {
-            label: 'Level three 2-2-1',
-          },
-        ],
-      },
-    ],
-  },
-  {
-    label: 'Level one 3',
-    children: [
-      {
-        label: 'Level two 3-1',
-        children: [
-          {
-            label: 'Level three 3-1-1',
-          },
-        ],
-      },
-      {
-        label: 'Level two 3-2',
-        children: [
-          {
-            label: 'Level three 3-2-1',
-          },
-        ],
-      },
-    ],
-  },
-]
-
-let 找到 = false
-
-const 查找 = (id, data) => {
-  if (找到) return;
-  for (let i = 0, len = data.length; i < len; i++) {
-    if (找到) return;
-    let item = data[i]
-    if (item.label === id) {
-      找到 = true
-    }
-
-    if (item.children) {
-      查找(id, item.children)
-    }
-  }
-}
-
-查找('Level three 2-1-1', data)
-
-console.log(data)
-
-
 </script>
 
 <style lang="scss" scoped>

+ 51 - 20
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-init.js

@@ -1,29 +1,55 @@
 import {ElMessage, ElMessageBox} from "element-plus";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
 import {deletePatientEmrByDocumentId, existCourseRecord, insertEmrData} from "@/api/zhu-yuan-yi-sheng/emr-patient";
+import store from '@/store'
 
 export let courseOfDisease = 'bingchengjiluzhuanyong'
 
-export function EMRInteractive(data, endiorEvent) {
+export function EMRInteractive(data, editorEvent) {
     this.setEditor = (editor, runtime) => {
         this.editor = editor;
         this.runtime = runtime;
+        for (let key in editorEvent) {
+            editor.on(key, function (...args) {
+                editorEvent[key](...args)
+            })
+        }
+    };
 
-        editor.on('loaded', function (event) {
-            endiorEvent[event.name](event)
-        })
+    this.getEditor = () => {
+        return this.editor
+    }
 
-        editor.on('contentchange', function (event) {
-            endiorEvent[event.name](event)
+    this.deleteElement = (params) => {
+        this.editor.execute('execFn', {
+            value: {
+                fn: function () {
+                    let EMR = this.editor.getScriptRuntime().EMR
+                    let emrDoc = EMR.getDocument()
+                    let components = emrDoc.getComponentsByCode(params);
+                    components.forEach((component) => {
+                        let view = component.target;
+                        let viewDom = view.el;
+                        let viewParagraphDom = viewDom.parentElement;
+                        viewDom.remove();
+                        if (viewParagraphDom.textContent === "") {
+                            viewParagraphDom.remove()
+                        }
+                    })
+                },
+                scope: this, params: params
+            }
         })
+    }
 
-    };
+    this.getRoot = () => {
+        return this.editor.model.document.getRoot()
+    }
 
     this.callMethod = (name, ...value) => {
         return this.editor[name](...value)
     }
 
-
     this.insertSnippet = (content, styles) => {
         //病历片段相关参数
         let insertContent = {
@@ -32,7 +58,7 @@ export function EMRInteractive(data, endiorEvent) {
             // 样式
             styles: styles,
             isFragment: true,
-            // 默认
+            // 就是在这里填充的
             defaultData: data
         }
         this.editor.execute("insertContents", insertContent);
@@ -42,11 +68,18 @@ export function EMRInteractive(data, endiorEvent) {
         return {
             endpoints: {
                 app: "/bdp/dataservice/api",
+                his: import.meta.env.VITE_BASE_URL,
             }, input: {
-                user: data.user_code, name: data.name
+                user: store.state.user.info.code,
+                name: store.state.user.info.name
             }, login: {
-                token: data.user_token
-            }, data
+                token: store.state.user.info.token,
+                user: {
+                    id: store.state.user.info.code,
+                    name: store.state.user.info.name,
+                }
+            },
+            data
         };
     };
 
@@ -69,16 +102,15 @@ export function EMRInteractive(data, endiorEvent) {
         this.runtime.saveDocument(data, (res) => {
             insertEmrData(value).then(() => {
                 successfullySaved()
-            }).catch(async (e) => {
-                await ElMessageBox.alert('保存失败,请重新保存,' + e, '提示', {
+            }).catch((e) => {
+                ElMessageBox.alert('保存失败,请重新保存,' + e, '提示', {
                     type: "warning"
+                }).finally(() => {
+                    failedToSave(value.emrDocumentId)
                 })
-                failedToSave(value.emrDocumentId)
             })
         }, (err) => {
-
             ElMessage.error("emr保存失败," + err)
-
         });
 
     };
@@ -94,14 +126,13 @@ export function EMRInteractive(data, endiorEvent) {
     };
 
     this.printDocument = (showPreview, docs = null) => {
-
         this.editor && this.editor.execute("print", {
-
             value: {
                 showPreview
             }
-
         })
     };
+
+
 }
 

+ 188 - 73
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/index.vue

@@ -38,7 +38,9 @@
           </el-col>
 
           <el-col :span="4" style="background-color: white">
-            <emr-snippet @node-click="clickSnippet" :patientData="patientData"/>
+            <emr-snippet @node-click="clickSnippet"
+                         ref="emrSnippetRef"
+                         :patientData="patientData"/>
           </el-col>
 
         </el-row>
@@ -51,7 +53,6 @@
 </template>
 
 <script setup name="emr">
-
 import {huanZheXinXi} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
 import {getEmrInpatientData} from "@/api/dictionary/emr-data-maintenance-api";
 import EmrSidebar from "@/components/zhu-yuan-yi-sheng/emr/EmrSidebar.vue";
@@ -65,13 +66,16 @@ import {BizException, ExceptionEnum} from "@/utils/BizException";
 import router from '@/router'
 import EmrSnippet from "@/components/zhu-yuan-yi-sheng/emr/EmrSnippet.vue";
 import store from "@/store";
-import {existCourseRecord} from "@/api/zhu-yuan-yi-sheng/emr-patient";
+import {existCourseRecord, extractDataElement} from "@/api/zhu-yuan-yi-sheng/emr-patient";
+import {onBeforeRouteLeave} from "vue-router";
+import {getUuid} from "@/api/public-api";
 
 const emit = defineEmits(['refreshPage'])
 
 const currentEmr = ref(null)
 const emrRef = ref(null)
 
+
 let categoryCode = $ref('')
 // 文档 id 唯一值
 let documentId = $ref('')
@@ -79,16 +83,19 @@ let patientId = $ref('')
 let categroyId = $ref('')
 let templateName = $ref('')
 let caseHistoryUrl = $ref('')
+let editor = {}
 // 患者历史记录
 let times = $ref(huanZheXinXi.value.admissTimes)
 // 侧边栏
-let emrSidebarRef = $ref(null)
+const emrSidebarRef = ref(null)
+// 片段预览
+const emrSnippetRef = ref(null)
 // 是否加载完成了
 let loaded = $ref(false)
 // 是否 改变了数据
 let isEditorChange = $ref(false)
 // 患者数据
-let patientData = $ref({})
+let patientData = {}
 // 是否开启审阅模式
 let reviewMode = $ref(false)
 // 跳转定位
@@ -98,16 +105,6 @@ let jumpPositioning = {
   code: null
 }
 
-const updateCaseHistoryUrl = (val) => {
-  let valCode = val.code ? val.code : val.emrCategoryCode;
-  loaded = true
-  isEditorChange = false
-  documentId = val.emrDocumentId;
-  categoryCode = valCode
-  templateName = val.name
-  caseHistoryUrl = `/emr/runtime/?documentId=${documentId}&categoryCode=${categoryCode}&categroyId=${categroyId}&patientId=${patientId}#/`
-}
-
 
 const refreshPage = () => {
   checkEmrChange(() => {
@@ -120,33 +117,46 @@ const clickSaveData = async () => {
   if (flag && !documentId && categoryCode === courseOfDisease) {
     BizException(ExceptionEnum.MESSAGE_ERROR, '该患者已经存在病程记录,请勿填写.')
   }
-
   waitForLoadingToComplete()
-
   let data = {
     // 这个是 唯一 id 我是在本地生成的
-    emrDocumentId: documentId ? documentId : uuid(31, 62),
+    emrDocumentId: documentId ? documentId : await getUuid(),
     emrCategoryCode: categoryCode,
     patNo: huanZheXinXi.value.inpatientNo,
     times: huanZheXinXi.value.admissTimes,
     emrName: templateName
   }
-
   objectValuesCannotBeNull(data)
-
   ElMessageBox.prompt('请输入保存的名称', '提示', {
     inputErrorMessage: '长度为2 - 20 个,汉字',
     inputPattern: /^\S{2,20}$/,
     inputValue: templateName
-  }).then(async ({value}) => {
+  }).then(({value}) => {
     data.name = value
-    await currentEmr.value.saveDocument(data, () => {
+    let dataElement = JSON.stringify(editor.getDataElements('business'))
+    let tempData = {
+      patNo: huanZheXinXi.value.inpatientNo,
+      times: huanZheXinXi.value.admissTimes,
+      categoryCode: categoryCode,
+      dataElement: dataElement
+    }
+    extractDataElement(tempData)
+    //  记得删除这里才能保存
+    // return
+
+    currentEmr.value.saveDocument(data, () => {
       isEditorChange = false
-      emrSidebarRef.queryData()
+      emrSidebarRef.value.queryData()
+      updateCaseHistoryUrl({
+        emrDocumentId: '',
+        code: '',
+        emrCategoryCode: '',
+      })
     }, (err) => {
       documentId = err
       isEditorChange = true
     })
+
   }).catch(() => {
 
   })
@@ -175,6 +185,9 @@ const testPrint = () => {
   currentEmr.value.printDocument(true, null);
 }
 
+/**
+ * 点击删除数据
+ */
 const clickDelete = () => {
   waitForLoadingToComplete()
   whetherThereIsAMedicalRecordId()
@@ -182,8 +195,8 @@ const clickDelete = () => {
     type: 'warning'
   }).then(() => {
     currentEmr.value.deleteDocument(documentId, function () {
-      emrSidebarRef.deleteTheSpecifiedNode(documentId)
-      nodeClick({}, 2)
+      emrSidebarRef.value.queryData()
+      updateCaseHistoryUrl({})
     });
   }).catch(() => {
 
@@ -197,12 +210,14 @@ const whetherThereIsAMedicalRecordId = () => {
   }
 }
 
+/**
+ * 查询历史信息
+ */
 const resetData = () => {
   checkEmrChange(() => {
-    nodeClick({}, 0)
-    emrSidebarRef.queryHistory(times);
+    updateCaseHistoryUrl({})
+    emrSidebarRef.value.queryHistory(times);
   })
-
 }
 
 
@@ -211,7 +226,7 @@ const checkEmrChange = (cb) => {
     ElMessageBox.confirm("您改变了数据是否要保存,不保存可能会丢失数据。", '提示', {
       type: "warning",
       cancelButtonText: '放弃修改',
-      confirmButtonText: '保存',
+      confirmButtonText: '保存病历',
       distinguishCancelAndClose: true,
     }).then(() => {
       clickSaveData()
@@ -227,15 +242,15 @@ const checkEmrChange = (cb) => {
   }
 }
 
-const nodeClick = (val, parent, templateType) => {
-  if (val.roundTime) {
-    if (documentId === parent.emrDocumentId) {
+const nodeClick = (val, jumpOrNot, templateType) => {
+  if (jumpOrNot) {
+    if (val.documentId === documentId) {
       positioningTime(val.value, val.code)
     } else {
-      updateCaseHistoryUrl(parent);
+      updateCaseHistoryUrl(val);
       jumpPositioning = {
         value: val.value,
-        code: val.code
+        code: val.code,
       }
     }
   } else {
@@ -245,6 +260,21 @@ const nodeClick = (val, parent, templateType) => {
   }
 }
 
+const updateCaseHistoryUrl = (val) => {
+  loaded = true
+  isEditorChange = false
+  documentId = val.documentId;
+  categoryCode = val.categoryCode
+  templateName = val.name
+  categroyId = val.categroyId
+  caseHistoryUrl = `/emr/runtime/?documentId=${documentId}&categoryCode=${categoryCode}&categroyId=${categroyId}&patientId=${patientId}#/`
+}
+
+/**
+ * 跳转到指定的地方
+ * @param val 值
+ * @param code 业务编码/内部编码/组件编码
+ */
 const positioningTime = (val, code) => {
   let componentView = currentEmr.value.callMethod('getElementByValue', code, val);
   if (componentView) {
@@ -258,7 +288,7 @@ const positioningTime = (val, code) => {
 
 const clickBack = () => {
   checkEmrChange(() => {
-    router.go(-1)
+    router.push('/inpatient/zhuYuanYiSheng/yiZhuLuRu')
   })
 }
 
@@ -268,81 +298,159 @@ const monitorPageRefresh = (event) => {
   }
 }
 
+/**
+ * 点击插入片段
+ * @param content
+ * @param styles
+ */
 const clickSnippet = ({content, styles}) => {
+  currentEmr.value.callMethod('setCursor', 'AREA_END')
   currentEmr.value.insertSnippet(content, styles, patientData)
 }
 
-
+let userData = store.state.user.info
 /**
  * 获取当前用户的信息
  * @param data
  */
 const getCurrentPersonnelInformation = (data) => {
-  let userData = store.state.user.info
-
-  patientData.user_selection = [{code: userData.code, name: userData.name}]
-  patientData.user_code = userData.code
-  patientData.user_name = userData.name
-
-  patientData.user_dept_selection = [{code: userData.deptCode, name: userData.deptName}]
-  patientData.user_dept_code = userData.deptCode
-  patientData.user_dept_name = userData.deptName
+  patientData['编辑者'] = [{code: userData.code, name: userData.name}]
+  patientData['编辑者编码'] = userData.code
+  patientData['编辑者姓名'] = userData.name
 
+  patientData['编辑者科室'] = [{code: userData.deptCode, name: userData.deptName}]
+  patientData['编辑者科室编码'] = userData.deptCode
+  patientData['编辑者科室名称'] = userData.deptName
   patientData.user_token = userData.token
-
 }
 
 const emrEvent = {
+
   'loaded': (event) => {
+    editor = currentEmr.value.getEditor()
     loaded = false
-    if (times !== huanZheXinXi.value.admissTimes) {
-      // 如果住院次数不一致 那么就是历史记录 那就只能只读了
-      currentEmr.value.callMethod('setEditorMode', 'readonly')
-    } else {
-      // 设置成编辑模式
-      currentEmr.value.callMethod('setEditorMode', 'free')
-    }
-    if (jumpPositioning.code) {
-      positioningTime(jumpPositioning.value, jumpPositioning.code)
-      jumpPositioning.code = null
-    }
-    let whetherToLocate = categoryCode.match(/【锚点-(\S*)】/)
-    if (whetherToLocate && whetherToLocate.length > 1) {
-      let elName = whetherToLocate[1]
-      let emrElData = currentEmr.value.callMethod('getElementsData')
-      console.log(emrElData)
-      emrSidebarRef.diseaseDurationRecordTime(emrElData[elName], elName, documentId);
-    }
-
+    setEditorModeFun()
+    setTheProgressAnchor()
+    courseSegmentLocking()
+    deleteDataElement()
   },
+
   'contentchange': (event) => {
     // 判断内容是否改变
     isEditorChange = true
-    emrSidebarRef.changeTemplateType(2)
+    emrSidebarRef.value.changeTemplateType(2)
+  },
+
+  'insertFragment': (evt, view, nodes, fragment, defaultData) => {
+    // 只有是片段才需要 添加这个
+    if (nodes[0] && nodes[0].view.type === 'area') {
+      nodes[0].view.setAttribute('userInfo', {code: userData.code, name: userData.name})
+    }
+  },
+
+}
+
+
+const setEditorModeFun = () => {
+  if (times !== huanZheXinXi.value.admissTimes) {
+    // 如果住院次数不一致 那么就是历史记录 那就只能只读了
+    currentEmr.value.callMethod('setEditorMode', 'readonly')
+  } else {
+    // 设置成编辑模式
+    currentEmr.value.callMethod('setEditorMode', 'free')
   }
 }
 
+/**
+ * 设置跳转锚点
+ */
+const setTheProgressAnchor = () => {
+  if (jumpPositioning.code) {
+    positioningTime(jumpPositioning.value, jumpPositioning.code)
+    jumpPositioning.code = null
+  }
+}
 
-onMounted(() => {
+/**
+ * 病程记录专用,
+ * 设置段落锁定,和设置跳转锚点
+ */
+const courseSegmentLocking = () => {
+  if (!categoryCode.includes('shoucibingchengjilu')) {
+    return
+  }
+  let root = currentEmr.value.getRoot()
+  if (documentId) {
+    let courseTitles = []
+    let loginUserCode = 'abc'
+    let modelService = editor.ModelService
+    let walker, values
+    for (let node of root.getChildren()) {
+      if (node.view && node.type === 'area') {
+        if (!walker) {
+          walker = modelService.createTreeWalker(node);
+        } else {
+          modelService.setWalkerRoot(walker, node);
+        }
+        values = modelService.getElementsDataFromWalker(walker, '编辑者');
+        // node.view.el.firstElementChild.textContent 如果title不是数据元
+        // values['查房标题'].value 如果title是数据元
+        courseTitles.push({
+          code: '查房时间',
+          name: values['查房标题']?.value,
+          value: values['查房时间'].value,
+          emrDocumentId: documentId,
+          emrCategoryCode: categoryCode,
+          jump: true
+        })
+        // let editorName = modelService.getElementsDataFromWalker(walker, '编辑者姓名');
+        console.log(values)
+
+        if (node.getAttribute('userInfo.code') !== loginUserCode) {
+          node.view.setReadonly(true);
+          node.view.setDeletable(false);
+        }
+      }
+    }
+    emrSidebarRef.value.diseaseDurationRecordTime(documentId, courseTitles)
+  } else {
+    for (let node of root.getChildren()) {
+      if (node.view && node.type === 'area') {
+        node.view.setAttribute('userInfo', {code: userData.code, name: userData.name})
+      }
+    }
+  }
+}
 
-  nextTick(async () => {
+/**
+ * 删除数据元,
+ * 根据男性女性删除 月经史 数据元
+ */
+const deleteDataElement = () => {
+  if (categoryCode === 'ruyuanjiluzhuanyong') {
+    if (patientData['性别名称'] === '男') {
+      currentEmr.value.deleteElement(['月经史'])
+    }
+  }
+}
 
+onMounted(() => {
+  nextTick(async () => {
     patientData = await getEmrInpatientData({
       patNo: huanZheXinXi.value.inpatientNo,
       times: huanZheXinXi.value.admissTimes
     })
-
     getCurrentPersonnelInformation(patientData)
-
-
+    console.log(patientData)
     patientId = huanZheXinXi.value.inpatientNo
     currentEmr.value = new EMRInteractive(patientData, emrEvent);
-    emrRef.value.parentElement.emr = currentEmr.value
 
+    emrSnippetRef.value.setPatientData(patientData)
+
+    emrRef.value.parentElement.emr = currentEmr.value
     window.addEventListener('beforeunload', monitorPageRefresh)
 
   })
-
 })
 
 onDeactivated(() => {
@@ -350,6 +458,13 @@ onDeactivated(() => {
 })
 
 
+onBeforeRouteLeave((to, from, next) => {
+  checkEmrChange(() => {
+    next();
+  })
+})
+
+
 </script>
 
 <style scoped>

+ 52 - 39
src/views/settings/Test.vue

@@ -1,55 +1,68 @@
 <template>
-  <div style="display: flex;justify-content: space-between">
-
-    <xc-select :data="data" v-model="ts" :name="['code','name']"></xc-select>
-
-    <xc-table-v3 clearable v-model="ts" :data="data" :remote-method="搜索">
-      <xc-table-column label="编码" prop="code"/>
-      <xc-table-column label="名称" prop="name"/>
-    </xc-table-v3>
-
-    <xc-table-v3 clearable v-model="ts" :data="data" :remote-method="搜索">
-      <xc-table-column label="编码" prop="code"/>
-      <xc-table-column label="名称" prop="name"/>
-    </xc-table-v3>
-
-    <el-button @click="填充数据">填充数据</el-button>
-    <el-button @click="ts.code = null">设置值</el-button>
-
+  <div style="border: 1px solid; height: 500px;width: 560px" id="test">
+    <table>
+      <thead>
+      <tr>
+        <th colspan="7">
+          <div style="font-size: 20px;margin: 5px">护士退药单</div>
+        </th>
+      </tr>
+      <tr>
+        <th>单号</th>
+        <th>编码</th>
+        <th>名称</th>
+        <th>规格</th>
+        <th>数量</th>
+        <th>零售价</th>
+        <th>金额</th>
+      </tr>
+      </thead>
+
+      <tbody>
+      <tr v-for="(value,key) in list">
+        <td :rowspan="value.length">
+          {{ key }}
+        </td>
+      </tr>
+
+
+      </tbody>
+
+    </table>
 
   </div>
-
-
 </template>
 
 <script setup name='Test'>
-import XcTableColumn from "@/components/xc/table-v3/XcTableColumn.vue";
-import XcTableV3 from "@/components/xc/table-v3/XcTableV3.vue";
+import {drugRefundForm} from "@/api/inpatient/xiang-mu-lu-ru";
+
+let list = $ref()
 
-let ts = $ref({
-  code: null,
-  name: ''
+drugRefundForm('71', '0409324', 1).then((res) => {
+  console.log(res)
+  list = res
 })
 
-let data = $ref([])
+</script>
 
-const 搜索 = (val) => {
-  data = Array.from(Array(61).keys()).map(i => ({
-    code: val + i + 1,
-    name: val + i,
-  }))
-}
+<style lang="scss" scoped>
 
-const 填充数据 = () => {
-  data = Array.from(Array(17).keys()).map(i => ({
-    code: i,
-    name: 'name ' + i,
-  }))
-}
+#test {
 
-</script>
+  table, tr, td {
+    border-collapse: collapse;
+  }
 
-<style lang="scss">
+  table {
+    width: 100%;
+
+    th {
+      border: 1px solid #000;
+      text-align: center;
+    }
+  }
+
+}
 
 
 </style>