Bladeren bron

添加患者查询页面

DESKTOP-0GD05B0\Administrator 2 jaren geleden
bovenliggende
commit
1c01a28439

+ 16 - 0
src/api/zhu-yuan-yi-sheng/pat-info-query.js

@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+
+export function getHospWardAndDept() {
+    return request({
+        url: '/patInfo/getHospWardAndDept',
+        method: 'get',
+    })
+}
+
+export function getPatientInfo(data) {
+    return request({
+        url: '/patInfo/getPatientInfo',
+        method: 'post',
+        data
+    })
+}

+ 47 - 0
src/components/pat-info-list/ElectronicMedicalRecord.vue

@@ -0,0 +1,47 @@
+<template>
+  <div style="display: flex;height: 100%;width: 100%">
+    <div style="width: 150px;overflow: auto">
+      <el-tree :data="tree"
+               :props="defaultProps"
+               @node-click="handleNodeClick"
+               node-key="_id"
+               ref="treeRef"
+               highlight-current
+               default-expand-all/>
+    </div>
+    <div style="height: 100%;width:calc(100% - 150px) ">
+      <iframe :src="saveDocumentId" width="100%" height="100%"/>
+    </div>
+  </div>
+</template>
+
+<script setup name='ElectronicMedicalRecord'>
+import {getPatientDataTree} from "@/api/zhu-yuan-yi-sheng/emr-patient";
+
+const props = defineProps({
+  patNo: String,
+  times: Number
+})
+
+const defaultProps = {
+  children: 'children',
+  label: 'name',
+}
+
+const tree = ref([])
+const saveDocumentId = ref('')
+
+const handleNodeClick = (data) => {
+  saveDocumentId.value = `/emr/runtime/?documentId=${data.emrDocumentId}#/`
+}
+
+onMounted(() => {
+  getPatientDataTree(props.patNo, props.times).then((res) => {
+    tree.value = res
+  })
+})
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 21 - 0
src/components/pat-info-list/FirstPageOfMedicalRecord.vue

@@ -0,0 +1,21 @@
+<template>
+  <head-page :dics="props.dics" :patient="props.sheetData"/>
+  <tail-page :dics="props.dics" :patient="props.sheetData" style="margin-left: 70px"/>
+</template>
+
+<script setup name='FirstPageOfMedicalRecord'>
+import HeadPage from "@/components/inpatient/frontsheet-printpage/HeadPage.vue";
+import TailPage from "@/components/inpatient/frontsheet-printpage/TailPage.vue";
+
+const props = defineProps({
+  sheetData: Object,
+  dics: Object
+})
+const patInfo = ref({})
+
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 49 - 0
src/components/xiao-chan/date-picker/XcDatePicker.vue

@@ -0,0 +1,49 @@
+<template>
+  <el-date-picker style="width: 180px"
+                  type="daterange"
+                  @change="change"
+                  :shortcuts="short"
+                  :value-format="format.valueFormat"
+                  v-model="value"/>
+</template>
+
+<script setup name='XcDatePicker'>
+import {shortcuts} from "@/data/shortcuts";
+
+
+const props = defineProps({
+  modelValue: {
+    type: [String, Array],
+    default: ''
+  },
+  type: {
+    type: [String],
+    default: ['daterange']
+  }
+})
+const emits = defineEmits(['update:modelValue'])
+const value = ref('')
+const format = ref({
+  valueFormat: 'YYYY-MM-DD'
+})
+const short = ref()
+
+const change = (val) => {
+  emits('update:modelValue', val)
+}
+
+watch(() => props.modelValue, () => {
+  value.value = props.modelValue
+}, {immediate: true})
+
+onMounted(() => {
+  if (props.type === 'daterange') {
+    short.value = shortcuts
+  }
+})
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 80 - 0
src/components/xiao-chan/select-v4/SelectV4.vue

@@ -0,0 +1,80 @@
+<template>
+  <el-select-v2
+      ref="selectRef"
+      v-model="value"
+      :remote-method="method"
+      filterable
+      remote
+      :options="tempData"
+      :clearable="props.clearable"
+      @change="change"
+      :placeholder="props.placeholder"
+      style="width: 240px"/>
+</template>
+
+<script setup name='SelectV4'>
+const props = defineProps({
+  modelValue: {
+    type: [String, Number],
+    default: null
+  },
+  data: {
+    type: Array,
+    default: []
+  },
+  clearable: {
+    type: Boolean,
+    default: false
+  },
+  placeholder: {
+    type: String,
+    default: '请选择'
+  }
+})
+
+const emits = defineEmits(['update:modelValue'])
+
+const value = ref()
+const tempData = ref([])
+
+const selectRef = ref()
+
+const change = (val) => {
+  emits('update:modelValue', val)
+}
+
+watch(() => props.modelValue, () => {
+  value.value = props.modelValue
+}, {immediate: true})
+
+watch(() => props.data, () => {
+  tempData.value = props.data
+}, {immediate: true})
+
+
+const method = (query) => {
+  if (query) {
+    tempData.value = props.data.filter((item) => {
+      let flag = false;
+      if (item.name && item.name.indexOf(query) > -1) {
+        flag = true;
+      } else if (item.pyCode && item.pyCode.indexOf(query.toLocaleUpperCase()) > -1) {
+        return true;
+      } else if (item.wCode && item.wCode.indexOf(query.toLocaleUpperCase()) > -1) {
+        flag = true;
+      } else {
+        flag = item.code && item.code.indexOf(query) > -1;
+      }
+      return flag;
+    });
+  } else {
+    tempData.value = props.data
+  }
+}
+
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 201 - 9
src/views/hospitalization/zhu-yuan-yi-sheng/PatientInformationInquiry.vue

@@ -1,26 +1,218 @@
 <template>
   <page-layer>
-    <template #header>
-      住院号:
-      <el-input style="width: 120px" v-model="patNo"/>
-      姓名:
-      <el-input style="width: 120px;"/>
+    <template #headerBlock>
+
+      <el-form :inline="true" ref="formRef" :model="param">
+
+        <el-form-item label="住院号" prop="patNo">
+          <el-input v-model="param.patNo" clearable
+                    style="width: 120px"
+                    @blur="param.patNo=$event.target.value.trim()"/>
+        </el-form-item>
+
+        <el-form-item label="姓名" prop="name">
+          <el-input v-model="param.name" clearable
+                    style="width: 120px"
+                    @blur="param.name=$event.target.value.trim()"/>
+        </el-form-item>
+
+        <el-form-item label="入院时间" prop="admissionTime">
+          <xc-date-picker style="width: 180px"
+                          type="daterange"
+                          clearable
+                          v-model="param.admissionTime"/>
+        </el-form-item>
+
+        <el-form-item label="出院时间" prop="dischargeTime">
+          <xc-date-picker style="width: 180px"
+                          type="daterange"
+                          clearable
+                          v-model="param.admissionTime"/>
+        </el-form-item>
+
+        <el-form-item label="科室" prop="dept">
+          <select-v4 :data="deptWardList" style="width: 220px;" clearable v-model="param.dept"/>
+        </el-form-item>
+
+        <el-form-item label="病房" prop="ward">
+          <select-v4 :data="deptWardList" style="width: 220px;" clearable v-model="param.ward"/>
+        </el-form-item>
+
+        <el-form-item>
+          <el-checkbox v-model="param.leaveHospital" label="出院"/>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button @click="queryClick" type="primary">查询</el-button>
+          <el-button @click="reset" type="warning">重置</el-button>
+        </el-form-item>
+      </el-form>
     </template>
 
     <template #main>
+      <xc-table :local-data="patInfoList"
+                :final-height="getWindowSize.h / 1.2">
+        <el-table-column label="操作" fixed="left" width="60">
+          <template #default="{row}">
+            <el-button @click="details(row)" text type="primary" plain>详情</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="住院号" prop="inpatientNo" width="60"/>
+        <el-table-column label="次数" prop="admissTimes" width="30"/>
+        <el-table-column label="床位" prop="bedNo" width="30"/>
+        <el-table-column label="姓名" prop="name">
+          <template #default="{row}">
+            {{ row.name + '(' + row.sexName + ')' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="入院时间" prop="admissDate" width="80"/>
+        <el-table-column label="出院时间" prop="disDate" width="80"/>
+        <el-table-column label="入院病区" prop="admissWardName"/>
+        <el-table-column label="小科室" prop="zkWardName"/>
+        <el-table-column label="年龄" prop="tempAge"/>
+        <el-table-column label="医保身份" prop="responceName"/>
+        <el-table-column label="总费用" prop="totalCharge"/>
+        <el-table-column label="余额" prop="balance"/>
+        <el-table-column label="入院诊断" prop="admissDiagStr"/>
+      </xc-table>
 
+      <el-dialog v-model="dialog"
+                 title="患者详情"
+                 class="dialog-temp"
+                 fullscreen
+                 destroy-on-close>
+        <el-tabs>
+          <el-tab-pane label="首页">
+            <first-page-of-medical-record :dics="dics"
+                                          :sheet-data="sheetData"/>
+          </el-tab-pane>
+          <el-tab-pane label="医嘱">
+            <emr-order-list :pat-no="rowData.patNo" :times="rowData.admissTimes"/>
+          </el-tab-pane>
+          <el-tab-pane label="清单">
+            <charge-list :pat-no="rowData.inpatientNo"
+                         :times="rowData.admissTimes"/>
+          </el-tab-pane>
+          <el-tab-pane label="检验">
+            <inspection-report-index
+                style="font-size: 12px;height: 100%"
+                :pat-no="rowData.patNo"
+                :start="startDate"
+                :end="endDate"/>
+          </el-tab-pane>
+          <el-tab-pane label="检查">
+            <emr-inspect :pat-no="rowData.inpatientNo"
+                         :times="rowData.admissTimes"/>
+          </el-tab-pane>
+          <el-tab-pane label="病历">
+            <electronic-medical-record :pat-no="rowData.inpatientNo"
+                                       :times="rowData.admissTimes"/>
+          </el-tab-pane>
+        </el-tabs>
+      </el-dialog>
     </template>
-
   </page-layer>
 </template>
 
 <script setup name='PatientInformationInquiry'>
 import PageLayer from "@/layout/PageLayer.vue";
+import {getHospWardAndDept, getPatientInfo} from "@/api/zhu-yuan-yi-sheng/pat-info-query";
+import SelectV4 from "@/components/xiao-chan/select-v4/SelectV4.vue";
+import XcDatePicker from "@/components/xiao-chan/date-picker/XcDatePicker.vue";
+import XcTable from "@/components/xiao-chan/xc-table/XcTable.vue";
+import {getWindowSize} from "@/utils/window-size";
+import EmrOrderList from "@/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrOrderList.vue";
+import FirstPageOfMedicalRecord from "@/components/pat-info-list/FirstPageOfMedicalRecord.vue";
+import {getAllDictionary, getSheetInfo} from "@/api/case-front-sheet";
+import ChargeList from '@/components/medical-insurance/charge-list/Index.vue'
+import InspectionReportIndex from "@/views/examination/InspectionReportIndex.vue";
+import {formatDate} from "@/utils/date";
+import {getServerDateApi} from "@/api/public-api";
+import EmrInspect from "@/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrInspect.vue";
+import ElectronicMedicalRecord from "@/components/pat-info-list/ElectronicMedicalRecord.vue";
+import {operations} from "@/data";
+import {autopsies, haveOrNot, yesOrNo} from "@/views/hospitalization/case-front-sheet/common";
+
+
+const param = ref({
+  patNo: '',
+  name: '',
+  leaveHospital: false,
+  admissionTime: [],
+  dischargeTime: [],
+  dept: '',
+  ward: ''
+})
+
+const deptWardList = ref([])
+const formRef = ref(null)
+const patInfoList = ref([])
+const dialog = ref(false)
+const rowData = ref()
+const dics = ref([])
+const sheetData = ref({})
+
+const endDate = ref('')
+const startDate = ref('')
+
+const queryClick = () => {
+  getPatientInfo(param.value).then(res => {
+    patInfoList.value = res
+  })
+}
+const reset = () => {
+  formRef.value?.resetFields()
+}
+
+const details = async (row) => {
+  rowData.value = row
+
+  sheetData.value = await getSheetInfo({
+    bah: row.inpatientNo,
+    times: row.admissTimes,
+    inOutFlag: param.value.leaveHospital ? 2 : 1
+  })
+  startDate.value = formatDate(rowData.value.admissDate)
+  dialog.value = true
+}
+
+onMounted(async () => {
+  getHospWardAndDept().then(res => {
+    deptWardList.value = res
+  })
+
+  getAllDictionary().then(res => {
+    res.getOperations = operations;
+    res.getYesOrNo = yesOrNo;
+    res.getHaveOrNot = haveOrNot;
+    res.getAutopsies = autopsies;
+    dics.value = res
+  })
+
+  endDate.value = formatDate(await getServerDateApi())
+
+})
 
-const patNo = ref('')
-const name = ref('')
 </script>
 
-<style scoped lang="scss">
+<style lang="scss" scoped>
+:deep(.el-dialog__body) {
+  padding: 0 16px;
+  height: calc(100% - 55px);
+}
+
+:deep(.el-tabs) {
+  height: calc(100% - 50px);
+
+  .el-tabs__content {
+    height: calc(100% - 50px);
+  }
+
+  .el-tab-pane {
+    height: calc(100% - 50px);
+    overflow: auto;
+  }
+}
+
 
 </style>