Browse Source

添加电子病历的默认信息

DESKTOP-MINPJAU\Administrator 3 years ago
parent
commit
8f7f5873c5

+ 87 - 0
package-lock.json

@@ -13,6 +13,7 @@
         "@vitejs/plugin-legacy": "^1.8.2",
         "@vueuse/core": "^8.7.5",
         "axios": "^0.27.2",
+        "clipboard": "^2.0.11",
         "dayjs": "^1.10.6",
         "echarts": "^5.2.0",
         "element-plus": "^2.2.6",
@@ -27,6 +28,7 @@
         "sortablejs": "^1.14.0",
         "vue": "^3.2.37",
         "vue-router": "^4.0.16",
+        "vue3-json-viewer": "^2.2.2",
         "vuex": "^4.0.2",
         "xlsx": "^0.17.0"
       },
@@ -3024,6 +3026,16 @@
         "node": ">=6"
       }
     },
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "node_modules/clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/clipboardy/download/clipboardy-2.3.0.tgz?cache=0&sync_timestamp=1634141778549&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fclipboardy%2Fdownload%2Fclipboardy-2.3.0.tgz",
@@ -3972,6 +3984,11 @@
         "node": ">=0.4.0"
       }
     },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "node_modules/depd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@@ -5036,6 +5053,14 @@
         "node": ">=4"
       }
     },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -7977,6 +8002,11 @@
       "integrity": "sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==",
       "dev": true
     },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
     "node_modules/select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@@ -8684,6 +8714,11 @@
       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
       "dev": true
     },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "node_modules/to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -9564,6 +9599,17 @@
         "typescript": "*"
       }
     },
+    "node_modules/vue3-json-viewer": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/vue3-json-viewer/-/vue3-json-viewer-2.2.2.tgz",
+      "integrity": "sha512-56l3XDGggnpwEqZieXsSMhNT4NhtO6d7zuSAxHo4i0UVxymyY2jRb7UMQOU1ztChKALZCAzX7DlgrsnEhxu77A==",
+      "dependencies": {
+        "clipboard": "^2.0.10"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/vuex": {
       "version": "4.0.2",
       "resolved": "https://registry.nlark.com/vuex/download/vuex-4.0.2.tgz?cache=0&sync_timestamp=1623945218026&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvuex%2Fdownload%2Fvuex-4.0.2.tgz",
@@ -12631,6 +12677,16 @@
       "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
       "dev": true
     },
+    "clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/clipboardy/download/clipboardy-2.3.0.tgz?cache=0&sync_timestamp=1634141778549&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fclipboardy%2Fdownload%2Fclipboardy-2.3.0.tgz",
@@ -13362,6 +13418,11 @@
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
     },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "depd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@@ -14113,6 +14174,14 @@
       "dev": true,
       "peer": true
     },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "requires": {
+        "delegate": "^3.1.2"
+      }
+    },
     "graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -16343,6 +16412,11 @@
       "integrity": "sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==",
       "dev": true
     },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@@ -16917,6 +16991,11 @@
       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
       "dev": true
     },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -17548,6 +17627,14 @@
         "@volar/vue-typescript": "0.38.2"
       }
     },
+    "vue3-json-viewer": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/vue3-json-viewer/-/vue3-json-viewer-2.2.2.tgz",
+      "integrity": "sha512-56l3XDGggnpwEqZieXsSMhNT4NhtO6d7zuSAxHo4i0UVxymyY2jRb7UMQOU1ztChKALZCAzX7DlgrsnEhxu77A==",
+      "requires": {
+        "clipboard": "^2.0.10"
+      }
+    },
     "vuex": {
       "version": "4.0.2",
       "resolved": "https://registry.nlark.com/vuex/download/vuex-4.0.2.tgz?cache=0&sync_timestamp=1623945218026&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvuex%2Fdownload%2Fvuex-4.0.2.tgz",

+ 2 - 0
package.json

@@ -14,6 +14,7 @@
     "@vitejs/plugin-legacy": "^1.8.2",
     "@vueuse/core": "^8.7.5",
     "axios": "^0.27.2",
+    "clipboard": "^2.0.11",
     "dayjs": "^1.10.6",
     "echarts": "^5.2.0",
     "element-plus": "^2.2.6",
@@ -28,6 +29,7 @@
     "sortablejs": "^1.14.0",
     "vue": "^3.2.37",
     "vue-router": "^4.0.16",
+    "vue3-json-viewer": "^2.2.2",
     "vuex": "^4.0.2",
     "xlsx": "^0.17.0"
   },

+ 46 - 0
src/api/dictionary/emr-data-maintenance-api.js

@@ -0,0 +1,46 @@
+import request from '../../utils/request'
+
+let url = '/EmrDataMaintenance/'
+
+
+export function fetchCountryDictionary(currentPage, pageSize, total) {
+    return request({
+        url: url + 'getElectronicMedicalRecordDataElementSql',
+        method: 'get',
+        params: {currentPage, pageSize, total}
+    })
+}
+
+export function testSqlAPi(data) {
+    return request({
+        url: url + 'testSql',
+        method: 'post',
+        data
+    })
+}
+
+export function addData(data) {
+    return request({
+        url: url + 'addData',
+        method: 'post',
+        data
+    })
+}
+
+export function updateData(data) {
+    return request({
+        url: url + 'updateData',
+        method: 'post',
+        data
+    })
+}
+
+
+export function getEmrInpatientData(data) {
+    return request({
+        url: url + 'getEmrInpatientData',
+        method: 'post',
+        data
+    })
+}
+

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

@@ -0,0 +1,11 @@
+import request from "@/utils/request";
+
+let url = '/Emr/'
+
+
+export function getEmrTree() {
+    return request({
+        url: url + 'getEmrTree',
+        method: 'get',
+    })
+}

+ 1 - 0
src/components/xc/xc-table/XcTable.vue

@@ -138,6 +138,7 @@ const currentChange = (val) => {
 const sizeChange = (val) => {
   props.data.pageSize = val
   props.data.currentPage = 1
+  props.data.total = 0
   emit('sizeChange', val)
   tableRef.value.setScrollTop(0)
 }

+ 7 - 3
src/icons/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2473230 */
-  src: url('iconfont.woff2?t=1652941134239') format('woff2'),
-       url('iconfont.woff?t=1652941134239') format('woff'),
-       url('iconfont.ttf?t=1652941134239') format('truetype');
+  src: url('iconfont.woff2?t=1658306999852') format('woff2'),
+       url('iconfont.woff?t=1658306999852') format('woff'),
+       url('iconfont.ttf?t=1658306999852') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-dianzibingli:before {
+  content: "\e746";
+}
+
 .icon-shoushubuwei:before {
   content: "\e7ba";
 }

BIN
src/icons/iconfont.ttf


BIN
src/icons/iconfont.woff


BIN
src/icons/iconfont.woff2


+ 4 - 0
src/main.js

@@ -9,6 +9,9 @@ import router, {addRoutes} from './router'
 import * as Component from '@/components/index.ts'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import zhCn from 'element-plus/es/locale/lang/zh-cn'
+import JsonViewer from "vue3-json-viewer";
+import "vue3-json-viewer/dist/index.css";
+
 
 addRoutes()
 
@@ -19,6 +22,7 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
 app.use(ElementPlus, {locale: zhCn, size: store.state.app.elementSize})
 app.use(store)
 app.use(router)
+app.use(JsonViewer);
 app.mount('#app')
 
 // 注册全局组件

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

@@ -212,6 +212,11 @@ const route = [
                 component: createNameComponent(() => import('@/views/dictionary/ShouShuBuWeiWeiHu.vue')),
                 meta: {title: '手术部位维护', icon: 'iconfont icon-shoushubuwei'},
             },
+            {
+                path: 'emrDataMaintenance',
+                component: createNameComponent(() => import('@/views/dictionary/EmrDataMaintenance.vue')),
+                meta: {title: '电子病历数据源维护', icon: 'iconfont icon-dianzibingli'},
+            },
         ],
     },
     {

+ 233 - 0
src/views/dictionary/EmrDataMaintenance.vue

@@ -0,0 +1,233 @@
+<template>
+  测试用住院号:
+  <el-input v-model="editData.data.patNo" style="width: 120px;" placeholder="请输入住院号"/>
+  测试用住院次数:
+  <el-input-number style="width: 120px;" :min="1" :precision="0" v-model="editData.data.times"
+                   placeholder="请输入住院次数"/>
+  <el-button @click="openDialog(true,null)">新增数据</el-button>
+  <el-button @click="testWhetherPatientDataIsNormal">测试全部数据</el-button>
+  <xc-table :data="data" @currentChange="queryChange" @sizeChange="queryChange">
+    <el-table-column label="操作" width="80">
+      <template #default="scope">
+        <el-button type="warning" @click="openDialog(false,scope.row)">编辑</el-button>
+        <!--        <el-button type="danger">删除</el-button>-->
+      </template>
+    </el-table-column>
+    <el-table-column prop="delFlag" label="删除" width="30"/>
+    <el-table-column prop="id" label="uuid" width="40"/>
+    <el-table-column prop="name" label="数据名称" width="80" show-overflow-tooltip/>
+    <el-table-column prop="sqlSentence" label="语句内容" show-overflow-tooltip/>
+  </xc-table>
+
+  <el-drawer v-model="editData.dialog"
+             :title="editData.title"
+             :show-close="false"
+             :close-on-press-escape="false"
+             :close-on-click-modal="false"
+             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" 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" placeholder="请输入名称"/>
+          </el-form-item>
+
+          <el-form-item prop="sqlSentence" label="语句内容">
+            <el-input v-model="editData.data.sqlSentence" type="textarea"
+                      :autosize="{ minRows: 30, maxRows: 4 }"
+                      placeholder="请输入sql语句" @change="editData.passedTheTest = false"/>
+          </el-form-item>
+
+        </el-form>
+      </el-col>
+
+      <el-col :span="12">
+        <JsonViewer :value="checkData" style="height: 100%" copyable boxed sort theme="jv-light"/>
+      </el-col>
+
+    </el-row>
+
+
+    <template #footer>
+      <div>
+        <el-button type="primary" @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="该患者的数据">
+    <JsonViewer :value="returnValue.data" style="height: 100%" copyable boxed sort theme="jv-light"/>
+  </el-dialog>
+
+</template>
+
+<script setup name='EmrDataMaintenance'>
+import XcTable from "@/components/xc/xc-table/XcTable.vue";
+import {
+  addData,
+  fetchCountryDictionary,
+  getEmrInpatientData,
+  testSqlAPi, updateData
+} from "@/api/dictionary/emr-data-maintenance-api";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+let data = $ref({
+  data: [],
+  currentPage: 1,
+  pageSize: 30,
+  total: 0
+})
+
+let editData = $ref({
+  dialog: false,
+  title: '新增数据',
+  isEdit: false,
+  passedTheTest: false,
+  data: {
+    id: '',
+    delFlag: '',
+    name: '',
+    sqlSentence: '',
+    patNo: '014807',
+    times: 3,
+  }
+});
+
+let returnValue = $ref({
+  dialog: false,
+  data: ''
+})
+
+let checkData = $ref('')
+
+onMounted(() => {
+  queryData()
+
+})
+
+
+const queryData = () => {
+  fetchCountryDictionary(data.currentPage, data.pageSize, data.total).then((res) => {
+    data.data = res.records
+    data.total = data.total === 0 ? res.total : data.total
+  })
+}
+
+const queryChange = () => {
+  queryData()
+}
+
+const testWhetherPatientDataIsNormal = () => {
+  getEmrInpatientData({patNo: editData.data.patNo, times: editData.data.times}).then((res) => {
+    returnValue.dialog = true
+    returnValue.data = res
+
+  })
+}
+
+const openDialog = (isAdd, row) => {
+  checkData = ''
+  if (isAdd) {
+    editData = {
+      dialog: true,
+      title: '新增数据',
+      isEdit: false,
+      data: {
+        id: '',
+        delFlag: '',
+        name: '',
+        sqlSentence: '',
+        patNo: editData.data.patNo,
+        times: editData.data.times,
+      }
+    }
+  } else {
+    editData = {
+      dialog: true,
+      isEdit: true,
+      title: '编辑数据',
+      data: {
+        id: row.id,
+        delFlag: row.delFlag,
+        name: row.name,
+        sqlSentence: row.sqlSentence,
+        patNo: editData.data.patNo,
+        times: editData.data.times,
+      }
+    }
+
+  }
+}
+
+let formRef = $ref(null)
+const rules = ref({
+  patNo: [{required: true, message: '请输入住院号', trigger: 'blur'}],
+  times: [{required: true, message: '请输入住院次数', trigger: 'blur'}],
+  name: [{required: true, message: '请输入名称', trigger: 'blur'}],
+  sqlSentence: [{required: true, message: '请输入sql语句', trigger: 'blur'}],
+})
+
+const testSql = () => {
+  if (!formRef) return
+  formRef.validate(async (valid) => {
+    if (valid) {
+      testSqlAPi(editData.data).then((res) => {
+        if (res) {
+          checkData = res;
+        }
+        editData.passedTheTest = true
+      }).catch(e => {
+        editData.passedTheTest = false
+      })
+    }
+  })
+}
+
+const confirm = () => {
+  if (!formRef) return
+  formRef.validate(async (valid) => {
+    if (valid) {
+      if (editData.passedTheTest) {
+        ElMessageBox.confirm('请确认返回数据的准确性。', '提示', {
+          type: 'warning',
+        }).then(async () => {
+          if (editData.isEdit) {
+            await updateData(editData.data)
+          } else {
+            await addData(editData.data);
+          }
+          editData.dialog = false
+        }).catch(() => {
+
+        })
+      } else {
+        ElMessage.error("请先通过数据测试.")
+      }
+
+    }
+  })
+}
+
+const close = () => {
+  editData.dialog = false
+  editData.passedTheTest = false
+}
+</script>
+
+<style scoped>
+
+</style>

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

@@ -1,33 +1,139 @@
 <template>
-  <div :style="{height: windowSize.h / 1.1 + 'px'}" style="width: 100%;">
-    <iframe style="width: 100%;height: 100%;border: 0" :src="caseHistoryUrl">
-
-    </iframe>
-  </div>
+  <el-container>
+    <el-header>
+      <el-button type="primary" @click="testSave">testSave</el-button>
+      <el-button type="primary" @click="testPrint">testPrint</el-button>
+      <el-button type="primary" @click="testDelete">testDelete</el-button>
+      <el-button type="primary" @click="getAppContext">getAppContext</el-button>
+    </el-header>
+    <el-main>
+      <div class="emr-iframe" name="emr">
+        <iframe id="emrIframe"
+                :src="caseHistoryUrl"/>
+      </div>
+    </el-main>
+  </el-container>
 </template>
 
-<script setup name='index'>
+<script>
+
+import {huanZheXinXi} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
 import store from "@/store";
-import {huanZheXinXi, youWuXuanZheHuanZhe} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
+import {uuid} from "@/utils/getUuid";
+import {getEmrTree} from "@/api/zhu-yuan-yi-sheng/emr-api";
+import {getEmrInpatientData} from "@/api/dictionary/emr-data-maintenance-api";
+
+export default {
+  setup() {
+
+    const currentEmr = ref(null)
+    const caseHistoryUrl = ref('')
+
+    const testSave = () => {
+      currentEmr.value.saveDocument(null);
+    }
+
+    const testPrint = () => {
+      currentEmr.value.printDocument(null);
+    }
+
+    const testDelete = () => {
+      currentEmr.value.deleteDocument(null);
+    }
 
-const windowSize = computed(() => {
-  return store.state.app.windowSize
-})
+    const getAppContext = () => {
+      console.log(currentEmr.value.getAppContext());
+    }
 
-let caseHistoryUrl = $ref('')
 
-watch(() => huanZheXinXi.value, () => {
-      if (youWuXuanZheHuanZhe()) return
-      caseHistoryUrl = `http://172.16.32.122:8001/emr/runtime/#/?documentId=&categoryCode=de3d5335c2b311ebb37d8c1645d540b7&patientId=${huanZheXinXi.value.inpatientNo}`;
-      console.log(caseHistoryUrl)
-      console.log(huanZheXinXi.value)
-    },
-    {immediate: true, deep: true}
-)
+    const getCaseHistoryUrl = (documentId, categoryCode, categroyId, patientId) => {
+      caseHistoryUrl.value = `/emr/runtime/?documentId=${documentId}&categoryCode=${categoryCode}&categroyId=${categroyId}&patientId=${patientId}#/`;
+    }
+    onMounted(() => {
+      nextTick(async () => {
+        getCaseHistoryUrl('', '', '824abb40070511edbc820dada413ba28', huanZheXinXi.value.inpatientNo)
+        currentEmr.value = new EMRInteractive(await getEmrInpatientData({
+          patNo: huanZheXinXi.value.inpatientNo,
+          times: huanZheXinXi.value.admissTimes
+        }));
+        const iframe = document.getElementById('emrIframe')
+        iframe.parentElement.emr = currentEmr.value
 
+        getEmrTree().then((res) => {
+          console.log(res)
+        })
+
+      })
+    })
+
+    return {
+      testSave,
+      testPrint,
+      testDelete,
+      caseHistoryUrl,
+      getAppContext
+    }
+  }
+}
+
+
+function EMRInteractive(data) {
+  this.setEditor = (editor, runtime) => {
+    this.editor = editor;
+    this.runtime = runtime;
+  };
+
+  this.getAppContext = () => {
+    return {
+      endpoints: {
+        app: "/bdp/dataservice/api",
+      },
+      input: {
+        user: store.state.user.info.code,
+        name: store.state.user.info.name
+      },
+      login: {
+        token: store.state.user.info.token
+      },
+      data
+    };
+  };
+
+  this.saveDocument = (cb) => {
+    let data = this.editor.getDocument();
+    data.properties.categoryCode = '3f3e2d6006ff11edbc820dada413ba28';
+    data.properties.patientId = huanZheXinXi.value.inpatientNo;
+    data.properties.creator = store.state.user.info.code;
+    data.properties.createTime = new Date()
+    data.properties.modifier = store.state.user.info.code;
+    data.properties.modifyTime = new Date()
+    this.runtime.saveDocument(
+        data,
+        (res) => {
+          console.log("emr保存成功", res);
+        },
+        (err) => {
+          console.log("emr保存失败", err);
+        }
+    );
+  };
+  this.deleteDocument = (cb) => {
+    let documentId = '3f3e2d6006ff11edbc820dada413ba28';
+    this.runtime.delDocument(documentId, (res) => {
+      console.log(res)
+    });
+  };
+  this.printDocument = (showPreview, docs = null) => {
+    console.log(showPreview, docs)
+    console.log('print document.')
+  };
+}
 
 </script>
 
 <style scoped>
-
+.emr-iframe, iframe {
+  width: 100%;
+  height: 700px;
+}
 </style>

+ 9 - 6
src/views/settings/Test.vue

@@ -7,7 +7,8 @@
     </el-header>
     <el-main>
       <div class="emr-iframe" name="emr">
-        <iframe id="emrIframe" src="/emr/runtime/?documentId=&categoryCode=3f3e2d6006ff11edbc820dada413ba28&patientId=testpatient"></iframe>
+        <iframe id="emrIframe"
+                src="/emr/runtime/?documentId=&categoryCode=3f3e2d6006ff11edbc820dada413ba28&patientId=testpatient"></iframe>
       </div>
     </el-main>
   </el-container>
@@ -15,6 +16,8 @@
 
 <script>
 
+import {huanZheXinXi} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
+
 export default {
   setup() {
 
@@ -86,7 +89,7 @@ function EMRInteractive() {
     console.log('save document.', this)
 
     let data = this.editor.getDocument();
-    data.properties.categoryCode='3f3e2d6006ff11edbc820dada413ba28';
+    data.properties.categoryCode = '3f3e2d6006ff11edbc820dada413ba28';
     data.properties.patientId = 'testpatient';
     this.runtime.saveDocument(
         data,
@@ -113,8 +116,8 @@ function EMRInteractive() {
 </script>
 
 <style scoped>
-  .emr-iframe,iframe {
-    width: 100%;
-    height: 700px;
-  }
+.emr-iframe, iframe {
+  width: 100%;
+  height: 700px;
+}
 </style>

+ 19 - 11
src/views/utilities/ParseJson.vue

@@ -11,12 +11,17 @@
             </el-checkbox>
           </div>
           <div style="height: 10px"></div>
-          <div style="padding: 4px"><el-radio v-model="type" label="JSON" @change="onTypeChange">JSON</el-radio></div>
-          <div style="padding: 4px"><el-radio v-model="type" label="XML" @change="onTypeChange">XML</el-radio></div>
+          <div style="padding: 4px">
+            <el-radio v-model="type" label="JSON" @change="onTypeChange">JSON</el-radio>
+          </div>
+          <div style="padding: 4px">
+            <el-radio v-model="type" label="XML" @change="onTypeChange">XML</el-radio>
+          </div>
         </el-col>
         <el-col :span="8">
           <pre :style="preStyle" class="formatted-body">
-              <el-input v-model="originContent" type="textarea" rows="30" :placeholder="placeholder" @input="executeFormat"></el-input>
+              <el-input v-model="originContent" type="textarea" rows="30" :placeholder="placeholder"
+                        @input="executeFormat"></el-input>
           </pre>
         </el-col>
         <el-col :span="14">
@@ -28,8 +33,8 @@
 </template>
 
 <script>
-import { computed, ref } from 'vue'
-import { useStore } from 'vuex'
+import {computed, ref} from 'vue'
+import {useStore} from 'vuex'
 
 export default {
   setup() {
@@ -70,12 +75,12 @@ export default {
     const formatXml = () => {
       let text = originContent.value
       text =
-        '\n' +
-        text
-          .replace(/(<\w+)(\s.*?>)/g, function ($0, name, props) {
-            return name + ' ' + props.replace(/\s+(\w+=)/g, ' $1')
-          })
-          .replace(/>\s*?</g, '>\n<')
+          '\n' +
+          text
+              .replace(/(<\w+)(\s.*?>)/g, function ($0, name, props) {
+                return name + ' ' + props.replace(/\s+(\w+=)/g, ' $1')
+              })
+              .replace(/>\s*?</g, '>\n<')
       //   text = text
       //     .replace(/\n/g, '\r')
       //     .replace(/<!--(.+?)-->/g, '<!--' + escape(text) + '-->')
@@ -135,6 +140,7 @@ export default {
       try {
         if (type.value === 'JSON') {
           formattedResult.value = JSON.stringify(JSON.parse(originContent.value), null, 2)
+          console.log(formattedResult.value)
           trueJson.value = true
         } else {
           if (originContent.value.indexOf('<') === -1 || originContent.value.indexOf('</') === -1 || originContent.value.indexOf('>') === -1) {
@@ -171,11 +177,13 @@ pre {
   white-space: pre-wrap;
   word-wrap: break-word;
 }
+
 .formatted-body {
   background: #60a6ec8a;
   border-radius: 8px;
   padding: 10px;
 }
+
 .formatted-result {
   border-radius: 8px;
   padding: 10px;

+ 12 - 1
vite.config.js

@@ -39,7 +39,18 @@ export default defineConfig({
         })
     ],
     server: {
-        host: '0.0.0.0',
+        proxy: {
+            '/emr/runtime': {
+                target: 'http://172.16.32.122:8001', //这里配置运行时服务地址
+                secure: false, //如果运行时服务是https,此处配置为true
+                changeOrigin: true //支持跨域调用,这里配置为true
+            },
+            '/bdp/dataservice/api': {
+                target: 'http://172.16.32.183:8888', //这里配置运行时服务地址
+                secure: false, //如果运行时服务是https,此处配置为true
+                changeOrigin: true //支持跨域调用,这里配置为true
+            },
+        }
     },
     build: {
         chunkSizeWarningLimit: 1000,