Parcourir la source

优化住院患者分布

xiaochan il y a 1 an
Parent
commit
b5699ee432

+ 0 - 5
index.html

@@ -7,11 +7,6 @@
     <link rel="stylesheet" href="./src/icons/iconfont.css"/>
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 
-<!--    <script type="text/javascript"-->
-<!--            src="https://api.map.baidu.com/api?v=2.0&ak=B74ya3RGhwWIdc8dwN2SfZOYD9G8kXiu"></script>-->
-<!--    <script src="src/assets/http_mapv.baidu.com_build_mapv.js"></script>-->
-
-
     <title>工作集成平台</title>
 </head>
 <body>

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

@@ -9,7 +9,7 @@ const route = [
         meta: {title: '登录', hideTabs: true},
     },
     {
-      path: '/todayClinicResource',
+        path: '/todayClinicResource',
         component: createNameComponent(() => import('@/views/single-page/TodayClinicResource.vue')),
         hideMenu: true,
         meta: {title: '今日号源', hideTabs: true},
@@ -420,7 +420,7 @@ const route = [
             },
             {
                 path: 'inpatientAddrAnalyze',
-                component: createNameComponent(() => import('@/views/reports/InpatientAddrAnalyze.vue')),
+                component: createNameComponent(() => import('@/views/reports/patient-distribution/patient-distribution.vue')),
                 meta: {title: '住院患者分布'},
             },
             {

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

@@ -602,7 +602,7 @@ const editJudgment = async () => {
       distinguishCancelAndClose: true,
       dangerouslyUseHTMLString: true,
     }).then(() => {
-      setEditorModel(EditorMode.READONLY)
+      setEditorModel('readonly')
     }).catch(async (value) => {
       if (value === 'cancel') {
         try {
@@ -610,11 +610,11 @@ const editJudgment = async () => {
           await openRefreshDialog()
           emrSocket.value.documentChange(documentId.value);
         } catch (e) {
-          setEditorModel(EditorMode.READONLY)
+          setEditorModel('readonly')
           xcMessage.error('踢出失败', e)
         }
       } else {
-        setEditorModel(EditorMode.READONLY)
+        setEditorModel('readonly')
       }
     })
   }
@@ -622,7 +622,7 @@ const editJudgment = async () => {
 }
 
 
-const setEditorModel = (val: EditorMode = EditorMode.FREE) => {
+const setEditorModel = (val: EditorMode = 'free') => {
   try {
     editor.setEditorMode(val)
     readonlyPattern()
@@ -682,7 +682,7 @@ const forceTheRecipientToBeKickedOut = (forceRefreshUserInfo: string) => {
     saveSuccess: false
   }
   sendEmrSocketMessageAndHighlight('收到消息,正在保存病历中...', 0, forceRefreshUserInfo)
-  setEditorModel(EditorMode.READONLY)
+  setEditorModel('readonly')
   refreshSaveEmr().then((val) => {
     sendEmrSocketMessageAndHighlight('病历保存成功。', 1, forceRefreshUserInfo)
     tempForceRefreshData.saveSuccess = val
@@ -716,6 +716,7 @@ const clickSaveData = async () => {
   try {
     const validator = editor.getValidator();
     const valid = validator.valid();
+
     if (valid) {
       xcMessage.error("有必填项不能为空,请仔细检查,红色输入框。")
       return
@@ -1047,9 +1048,9 @@ const 入院病历 = 'ruyuanjiluzhuanyong'
  */
 function generalMedicalRecords() {
   if (emrEditCreateLimit.isEdit(createId)) {
-    setEditorModel(EditorMode.FREE)
+    setEditorModel('free')
   } else {
-    setEditorModel(EditorMode.READONLY)
+    setEditorModel('readonly')
   }
 }
 
@@ -1066,7 +1067,7 @@ const setEditorModeFun = () => {
         let areas = emrDoc.getNodesByCode(null, 'area')
         // 如果没有数据说明的历史数据历史数据就不能用下面的逻辑
         if (XEUtils.isArray(areas)) {
-          setEditorModel(EditorMode.FREE)
+          setEditorModel('free')
           let edit = emrEditCreateLimit.isEdit(createId)
           XEUtils.arrayEach(areas, (item, key) => {
             if (edit) {
@@ -1123,7 +1124,7 @@ const courseSegmentLocking = async () => {
   if (!isCourse()) {
     return
   }
-  setEditorModel(EditorMode.FREE)
+  setEditorModel('free')
   if (XEUtils.isEmpty(documentId.value)) {
     return
   }
@@ -1546,7 +1547,7 @@ const currentEditorFunc = XEUtils.debounce(() => {
         }).catch(() => {
 
         })
-        setEditorModel(EditorMode.READONLY)
+        setEditorModel('readonly')
       }
     })
   }
@@ -1619,7 +1620,7 @@ const emrMittInit = () => {
   })
 
   emrMitt.on('setEditorReadonly', () => {
-    setEditorModel(EditorMode.READONLY)
+    setEditorModel('readonly')
   })
 
 }

+ 6 - 19
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/edit.ts

@@ -15,24 +15,7 @@ interface Validator {
     message: string;
 }
 
-export enum EditorMode {
-    /**
-     * 该模式下只允许编辑smarttext 、checkfield等form表单相关组件的值,可用于门诊病历
-     */
-    FORM = 'from',
-    /**
-     * 该模式下可以对文档任何文本、组件进行操作,一般用于电子病历书写
-     */
-    FREE = 'free',
-    /**
-     * 该模式只能对文档进行查看,不可操作
-     */
-    READONLY = 'readonly',
-    /**
-     * 设计模式,用于模版的编辑 此模式下组件的可删除属性约束无效
-     */
-    DESIGN = 'design'
-}
+export type EditorMode = 'from' | 'free' | 'readonly' | 'design';
 
 export interface DataElements {
     [key: string]: {
@@ -68,7 +51,7 @@ interface NodesByCode {
     }
 }
 
-export declare interface EditType {
+export declare type EditType = {
 
     documentData: {
         _id: string
@@ -98,6 +81,10 @@ export declare interface EditType {
         valid: () => Validator[]
     };
 
+    /**
+     * {Boolean} includeEmptyValue 是否获取非必填并且不是数据元 值为空的元素 默认 false
+     * @param val type 要获取的编码类型 默认 code。  code|business|internal|dataElement, 一般不用dataElement,当指定的编码类型不存在时返回 code
+     */
     getDataElements: (val: 'code' | 'business' | 'internal' | 'dataElement') => DataElements;
 
     /**

+ 0 - 259
src/views/reports/InpatientAddrAnalyze.vue

@@ -1,259 +0,0 @@
-<template>
-  <div class="main">
-    <div class="search">
-      <div class="left_blank"/>
-
-      <transition name="el-zoom-in-center">
-        <div class="search_main" v-show="showSearch">
-
-          <el-select style="width: 60px;margin-left: 5px" v-model="patientType">
-            <el-option :value="1" label="住院"/>
-            <el-option :value="2" label="门诊"/>
-          </el-select>
-          <el-date-picker
-              :disabled="!(patientType === 1 && inHospital=== 2)"
-              v-model="dateRange"
-              :shortcuts="shortcuts"
-              end-placeholder="结束日期"
-              placeholder="选择日期"
-              range-separator="至"
-              start-placeholder="开始日期"
-              style="width: 220px;top:3px"
-              type="daterange"/>
-
-          <el-select style="width: 60px" v-model="inHospital" :disabled="patientType === 2">
-            <el-option :value="1" label="在院"/>
-            <el-option :value="2" label="出院"/>
-          </el-select>
-
-          <el-button icon="Search" type="primary" @click="queryData"/>
-
-        </div>
-      </transition>
-
-      <div class="search_icon 小手指" @click="showSearch = !showSearch">
-        <el-icon>
-          <ArrowLeftBold v-show="showSearch"/>
-          <ArrowRightBold v-show="!showSearch"/>
-        </el-icon>
-      </div>
-
-    </div>
-    <div id="allmap" style="height: 100%;width: 100%"></div>
-    <transition name="el-fade-in-linear">
-      <div class="patient_info" v-show="showInfoWindow">
-        <el-icon class="close 小手指" @click="closePatientInfoWindow">
-          <CircleClose/>
-        </el-icon>
-        <div class="title" @click="locateThePatient">
-          患者信息
-        </div>
-        <div class="body">
-          <span>
-          患者姓名:{{ patientInfo.name }}
-          </span>
-          <span>
-          门诊/住院号: {{ patientInfo.patNo }}
-          </span>
-
-        </div>
-      </div>
-    </transition>
-  </div>
-</template>
-
-
-<script setup>
-import {patientAddress} from "@/api/reports/patient-distribution-address";
-import {shortcuts} from '@/data/shortcuts'
-import {getDateRangeFormatDate} from "@/utils/date";
-import thyy from '@/assets/csthyylogoplain.png'
-
-let thyyLocation = new BMap.Point(112.96716239793697, 28.309655062968343)
-
-let patientInfo = $ref('')
-let showInfoWindow = $ref(false)
-
-let showSearch = $ref(false)
-let dateRange = $ref([])
-let inHospital = $ref(1)
-let patientType = $ref(1)
-
-const createADrawing = (data) => {
-  map.clearOverlays()
-  createAHospitalLogo()
-
-  let points = []
-
-  for (let i = 0, len = data.length; i < len; i++) {
-    let item = data[i];
-    points.push({
-      geometry: {
-        type: 'Point',
-        patientData: item,
-        coordinates: [item.longitude, item.latitude]
-      },
-    })
-  }
-
-  const dataSet = new mapv.DataSet(points);
-
-  const options = {
-    shadowColor: 'rgba(255, 250, 50, 1)',
-    shadowBlur: 10,
-    // 非聚合点的颜色和大小,未设置icon或icon获取失败时使用
-    fillStyle: 'rgba(255, 50, 0, 1.0)',
-    size: 50 / 3 / 2, // 非聚合点的半径
-    minSize: 8, // 聚合点最小半径
-    maxSize: 31, // 聚合点最大半径
-    globalAlpha: 0.8, // 透明度
-    clusterRadius: 150, // 聚合像素半径
-    maxClusterZoom: 18, // 最大聚合的级别
-    maxZoom: 19, // 最大显示级别
-    minPoints: 5, // 最少聚合点数,点数多于此值才会被聚合
-    extent: 400, // 聚合的细腻程度,越高聚合后点越密集
-    label: { // 聚合文本样式
-      show: true, // 是否显示
-      fillStyle: 'white',
-    },
-    gradient: {0: "blue", 0.5: "#28f51a", 1.0: "rgb(255,0,0)"}, // 聚合图标渐变色
-    draw: 'cluster',
-    methods: {
-      click(point) {
-        if (point?.geometry?.patientData) {
-          deletePreviousPunctuation()
-          map.removeOverlay(new BMap.Point(patientInfo.longitude, patientInfo.latitude))
-          showInfoWindow = true
-          patientInfo = point?.geometry?.patientData
-          patientInfo.mapPoint = new BMap.Point(patientInfo.longitude, patientInfo.latitude)
-          locateThePatient()
-          marker()
-        }
-      }
-    }
-  }
-  new mapv.baiduMapLayer(map, dataSet, options);
-}
-
-const locateThePatient = () => {
-  map.panTo(patientInfo.mapPoint)
-}
-
-const marker = () => {
-  const marker = new BMap.Marker(patientInfo.mapPoint);
-  marker.id = patientInfo.patNo
-  map.addOverlay(marker)
-}
-
-const closePatientInfoWindow = () => {
-  showInfoWindow = false
-  deletePreviousPunctuation()
-}
-
-const deletePreviousPunctuation = () => {
-  let data = map.getOverlays()
-  for (let i = 0; i < data.length; i++) {
-    let item = data[i]
-    if (data[i].id) {
-      if (data[i].id === patientInfo.patNo) {
-        map.removeOverlay(item)
-      }
-    }
-  }
-}
-
-const queryData = () => {
-  let dateS = getDateRangeFormatDate(dateRange)
-  map.panTo(thyyLocation)
-  patientAddress(patientType, inHospital, dateS.startTime, dateS.endTime).then((res) => {
-    createADrawing(res)
-  })
-}
-
-const createAHospitalLogo = () => {
-  const myIcon = new BMap.Icon(thyy, new BMap.Size(40, 40));
-  myIcon.setImageSize(new BMap.Size(40, 40))
-  const marker = new BMap.Marker(thyyLocation, {
-    icon: myIcon
-  });
-  map.addOverlay(marker);
-}
-
-onMounted(() => {
-  window.map = new BMap.Map("allmap", {
-    enableMapClick: false
-  }); // 创建Map实例
-  map.centerAndZoom(thyyLocation, 15); // 初始化地图,设置中心点坐标和地图级别
-  map.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
-
-  queryData()
-
-})
-
-
-</script>
-
-<style scoped lang="scss">
-.main {
-  position: relative;
-  width: 100%;
-  height: 100%;
-
-  .search {
-    margin: 5px;
-    position: absolute;
-    top: 0;
-    left: 0;
-    display: flex;
-    z-index: 10;
-    background-color: white;
-    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-    line-height: 40px;
-
-    .search_main {
-      padding: 5px;
-    }
-
-    .search_icon {
-      padding: 5px;
-    }
-  }
-
-  .patient_info {
-    position: absolute;
-    top: 0;
-    right: 0;
-    margin: 5px;
-    padding: 5px;
-    border-radius: 5px;
-    font-size: 16px;
-    width: 220px;
-    text-align: center;
-    background-color: white;
-    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-
-    .close {
-      position: absolute;
-      left: 0;
-      top: 0;
-    }
-
-    .title {
-      background-color: #0a84fd;
-      border-radius: 5px;
-      color: white;
-      margin: 5px;
-      padding: 5px;
-    }
-
-    .body {
-      color: #000000;
-      font-size: 12px;
-      text-align: left;
-      margin: 5px;
-    }
-
-  }
-}
-
-</style>

+ 146 - 0
src/views/reports/patient-distribution/baidumap.html

@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+    <script type="text/javascript"
+            src="https://api.map.baidu.com/api?v=2.0&ak=B74ya3RGhwWIdc8dwN2SfZOYD9G8kXiu"></script>
+    <script src="https://mapv.baidu.com/build/mapv.min.js"></script>
+
+    <meta charset="UTF-8">
+    <title>你好</title>
+
+</head>
+<style>
+    html, body {
+        height: 100%;
+        width: 100%;
+        margin: 0;
+        padding: 0;
+        box-sizing: border-box;
+    }
+</style>
+<body>
+<div id="allmap" style="height: 100%;width: 100%"></div>
+</body>
+
+<script>
+    const thyyLocation = new BMap.Point(112.96716239793697, 28.309655062968343)
+    let thyy = null
+    let event = null
+    let patientInfo = null
+
+    function setIcon(val) {
+        thyy = val
+    }
+
+    function eventFunc(data) {
+        event = data
+    }
+
+    function createADrawing(data) {
+        map.clearOverlays()
+        createAHospitalLogo()
+
+        let points = []
+
+        for (let i = 0, len = data.length; i < len; i++) {
+            let item = data[i];
+            points.push({
+                geometry: {
+                    type: 'Point',
+                    patientData: item,
+                    coordinates: [item.longitude, item.latitude]
+                },
+            })
+        }
+
+        const dataSet = new mapv.DataSet(points);
+
+        const options = {
+            shadowColor: 'rgba(255, 250, 50, 1)',
+            shadowBlur: 10,
+            // 非聚合点的颜色和大小,未设置icon或icon获取失败时使用
+            fillStyle: 'rgba(255, 50, 0, 1.0)',
+            size: 50 / 3 / 2, // 非聚合点的半径
+            minSize: 8, // 聚合点最小半径
+            maxSize: 31, // 聚合点最大半径
+            globalAlpha: 0.8, // 透明度
+            clusterRadius: 150, // 聚合像素半径
+            maxClusterZoom: 18, // 最大聚合的级别
+            maxZoom: 19, // 最大显示级别
+            minPoints: 5, // 最少聚合点数,点数多于此值才会被聚合
+            extent: 400, // 聚合的细腻程度,越高聚合后点越密集
+            label: { // 聚合文本样式
+                show: true, // 是否显示
+                fillStyle: 'white',
+            },
+            gradient: {0: "blue", 0.5: "#28f51a", 1.0: "rgb(255,0,0)"}, // 聚合图标渐变色
+            draw: 'cluster',
+            methods: {
+                click(point) {
+                    if (point?.geometry?.patientData) {
+                        deletePreviousPunctuation()
+                        // 清空上一次的患者信息
+                        if (patientInfo !== null) {
+                            map.removeOverlay(new BMap.Point(patientInfo.longitude, patientInfo.latitude))
+                        }
+                        // 复制下一次患者信息
+                        patientInfo = point?.geometry?.patientData
+                        patientInfo.mapPoint = new BMap.Point(patientInfo.longitude, patientInfo.latitude)
+                        event['pointClick'](patientInfo)
+                        locateThePatient()
+                        marker()
+                    }
+                }
+            }
+        }
+        new mapv.baiduMapLayer(map, dataSet, options);
+
+    }
+
+
+    function deletePreviousPunctuation() {
+        let data = map.getOverlays()
+        for (let i = 0; i < data.length; i++) {
+            let item = data[i]
+            if (data[i].id) {
+                if (data[i].id === patientInfo.patNo) {
+                    map.removeOverlay(item)
+                }
+            }
+        }
+    }
+
+    function locateThePatient() {
+        map.panTo(patientInfo.mapPoint)
+    }
+
+    const marker = () => {
+        const marker = new BMap.Marker(patientInfo.mapPoint);
+        marker.id = patientInfo.patNo
+        map.addOverlay(marker)
+    }
+
+    function createAHospitalLogo() {
+        map.clearOverlays()
+        const myIcon = new BMap.Icon(thyy, new BMap.Size(40, 40));
+        myIcon.setImageSize(new BMap.Size(40, 40))
+        const marker = new BMap.Marker(thyyLocation, {
+            icon: myIcon
+        });
+        map.addOverlay(marker);
+    }
+
+
+    window.onload = () => {
+        // 创建Map实例
+        window.map = new BMap.Map("allmap", {
+            enableMapClick: false
+        });
+        // 初始化地图,设置中心点坐标和地图级别
+        map.centerAndZoom(thyyLocation, 15);
+        // 开启鼠标滚轮缩放
+        map.enableScrollWheelZoom(true);
+    }
+</script>
+</html>

+ 202 - 0
src/views/reports/patient-distribution/patient-distribution.vue

@@ -0,0 +1,202 @@
+<script setup lang="ts">
+import {computed, nextTick, onMounted, Ref, ref} from "vue";
+import {shortcuts} from '@/data/shortcuts'
+import {elDateRangeAddTime} from "@/utils/moment-utils";
+import {patientAddress} from "@/api/reports/patient-distribution-address";
+import thyy from '@/assets/csthyylogoplain.png'
+
+interface MyIframe {
+  contentWindow: {
+    createADrawing: (data: any) => void,
+    setIcon: (data: any) => void
+    eventFunc: (data: any) => void
+    locateThePatient: () => void
+    deletePreviousPunctuation: () => void
+  },
+  onload: () => void
+}
+
+const eventFunc = {
+  "pointClick": (data) => {
+    patInfo.value = data
+    showInfoWindow.value = true
+  }
+}
+
+const iframeRef: Ref<MyIframe> = ref()
+const patientType = ref<number>(1)
+const dateRange = ref<Date[]>([])
+const inHospital = ref<number>(1)
+const showInfoWindow = ref<boolean>()
+const showSearch = ref<boolean>(false)
+
+const dateDisabled = computed(() => {
+  return patientType.value === 1 && inHospital.value === 1
+})
+
+const patInfo = ref<{
+  name: string
+  patNo: string
+}>({
+  name: "", patNo: ""
+})
+
+const locateThePatient = () => {
+  iframeRef.value.contentWindow.locateThePatient()
+}
+
+const closePatientInfoWindow = () => {
+  showInfoWindow.value = false
+  iframeRef.value.contentWindow.deletePreviousPunctuation()
+}
+
+const queryData = () => {
+  const {start, end} = elDateRangeAddTime(dateRange.value)
+  patientAddress(patientType.value, inHospital.value, start, end).then(res => {
+    iframeRef.value.contentWindow.createADrawing(res)
+  })
+}
+
+onMounted(async () => {
+  await nextTick()
+  iframeRef.value.onload = () => {
+    iframeRef.value.contentWindow.eventFunc(eventFunc)
+    iframeRef.value.contentWindow.setIcon(thyy)
+    queryData()
+  }
+})
+
+</script>
+
+<template>
+  <div class="baidu_main">
+    <div class="baidu_search_box">
+      <transition name="el-zoom-in-center">
+        <div class="baidu_search" v-show="showSearch">
+          <el-select style="width: 60px;" v-model="patientType">
+            <el-option :value="1" label="住院"/>
+            <el-option :value="2" label="门诊"/>
+          </el-select>
+          <el-divider style="height: 100%" direction="vertical"/>
+          <el-date-picker
+              :disabled="dateDisabled"
+              v-model="dateRange"
+              :shortcuts="shortcuts"
+              end-placeholder="结束日期"
+              placeholder="选择日期"
+              range-separator="至"
+              start-placeholder="开始日期"
+              style="width: 220px;"
+              type="daterange"/>
+          <el-divider style="height: 100%" direction="vertical"/>
+          <el-select style="width: 60px" v-model="inHospital" :disabled="patientType === 2">
+            <el-option :value="1" label="在院"/>
+            <el-option :value="2" label="出院"/>
+          </el-select>
+          <el-button icon="Search" type="primary" @click="queryData"/>
+        </div>
+      </transition>
+
+      <div class="search_icon 小手指" @click="showSearch = !showSearch">
+        <el-icon>
+          <ArrowLeftBold v-show="showSearch"/>
+          <ArrowRightBold v-show="!showSearch"/>
+        </el-icon>
+      </div>
+    </div>
+
+    <div class="baidu_patinfo" v-show="showInfoWindow">
+      <el-icon class="close 小手指" @click="closePatientInfoWindow">
+        <CircleClose/>
+      </el-icon>
+      <div class="title 小手指" @click="locateThePatient">
+        患者信息
+      </div>
+      <div class="body">
+          <span>
+          患者姓名:{{ patInfo.name }}
+          </span>
+        <span>
+          门诊/住院号: {{ patInfo.patNo }}
+          </span>
+      </div>
+
+    </div>
+    <iframe ref="iframeRef" style="width: 100%;height: 100%"
+            src="/src/views/reports/patient-distribution/baidumap.html" class="baidu_iframe"/>
+  </div>
+
+</template>
+
+<style scoped lang="scss">
+
+.baidu_main {
+  height: 100%;
+  width: 100%;
+  position: relative;
+
+
+  .baidu_search_box {
+
+    .baidu_search {
+      display: flex;
+      align-content: center;
+    }
+
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    background-color: white;
+    padding: 5px;
+
+    .search_icon {
+      display: flex;
+      align-content: center;
+      padding: 5px;
+    }
+  }
+
+
+  .baidu_patinfo {
+    position: absolute;
+    top: 0;
+    right: 0;
+    margin: 5px;
+    padding: 5px;
+    border-radius: 5px;
+    font-size: 16px;
+    width: 220px;
+    text-align: center;
+    background-color: white;
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+
+    .close {
+      position: absolute;
+      left: 0;
+      top: 0;
+    }
+
+    .title {
+      background-color: #0a84fd;
+      border-radius: 5px;
+      color: white;
+      margin: 5px;
+      padding: 5px;
+    }
+
+    .body {
+      color: #000000;
+      font-size: 12px;
+      text-align: left;
+      margin: 5px;
+    }
+  }
+
+
+  .baidu_iframe {
+    border: 0;
+  }
+}
+
+
+</style>

+ 2 - 19
src/views/settings/Test.vue

@@ -1,25 +1,8 @@
 <template>
-
+  <PatientDistribution/>
 </template>
 
 <script setup lang="ts">
-import sleep from "@/utils/sleep";
-import {onMounted} from "vue";
-
-const ts = async () => {
-  await sleep(2000)
-  // throw new Error('测试')
-}
-
-onMounted(async () => {
-  await ts().catch(() => {
-    throw new Error('111')
-  }).then(res => {
-    console.log(123)
-  })
-  console.log(222)
-
-  console.log()
-})
 
+import PatientDistribution from "@/views/reports/patient-distribution/patient-distribution.vue";
 </script>