Browse Source

完成部分电子病历查询的率

xiaochan 6 months ago
parent
commit
9db84b6e99

+ 2 - 2
src/components/cy/date-range/CyDateRange.vue

@@ -53,7 +53,7 @@ const props = withDefaults(
       end?: string;
       clearable?: boolean;
       unlinkPanels?: boolean;
-      shortcutsIndex?: number | null;
+      shortcutsIndex?: number | string | null;
     }>(),
     {
       start: "startTime",
@@ -102,7 +102,7 @@ const dateRange: WritableComputedRef<string[]> = computed({
 onMounted(() => {
   if (props.shortcutsIndex != null) {
     // @ts-ignore
-    dateRange.value = shortcuts[props.shortcutsIndex].value;
+    dateRange.value = shortcuts[XEUtils.toNumber(props.shortcutsIndex)].value;
   }
 });
 </script>

+ 1 - 5
src/components/zhu-yuan-yi-sheng/emr/EmrLeaveHospitalPatient.vue

@@ -33,7 +33,7 @@ import {getListOfDischargedPatients} from "@/api/zhu-yuan-yi-sheng/emr-patient";
 import XcTable from "@/components/xiao-chan/xc-table/XcTable.vue";
 import {
   emrMitt, emrStateEnum,
-   openEmr,
+  openEmr,
   query
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
 
@@ -87,7 +87,3 @@ onMounted(() => {
 })
 
 </script>
-
-<style scoped lang="scss">
-
-</style>

+ 1 - 1
src/views/archive/index.tsx

@@ -26,7 +26,7 @@ type Socket = {
 
 const useSocket = (cb: Socket) => {
   const socketUrl = ref();
-  let socket: UseWebSocketReturn = null;
+  let socket: UseWebSocketReturn<any> = null;
 
   function newSocket() {
     socket?.close?.();

+ 0 - 1
src/views/emr-manage/query-centre/rectify/index.vue

@@ -6,7 +6,6 @@ import {emrServerHttp} from "@/api/emr-control/request";
 import {VxeGridProps} from "vxe-table";
 import {
   emrStateEnum, getEmrUrl,
-  getInEmrUrl
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
 
 defineOptions({

+ 87 - 0
src/views/emr-manage/query-centre/various-rate/Details.vue

@@ -0,0 +1,87 @@
+<script setup lang="tsx">
+import {
+  getEmrUrlAllPatient
+} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
+import XcElOption from "@/components/xiao-chan/xc-el-option/XcElOption.vue";
+import XEUtils from "xe-utils";
+import tableTitle from "./tableTitle";
+
+const props = defineProps<{
+  data: any[];
+  name: string;
+  mainName: string;
+}>();
+
+
+const filter = [{code: 0, name: "全部"}, {code: 1, name: "错误"}, {code: 2, name: "符合"}]
+const selectVal = ref(1)
+
+const patInfoColumn = [
+  {field: "inpatientNo", title: "住院号"},
+  {field: "admissTimes", title: "住院次数"}
+]
+
+function getColumns() {
+  let tmp = tableTitle[props.name]
+
+  if (tmp) {
+    tmp = [
+      ...patInfoColumn,
+      ...tmp
+    ]
+  } else {
+    tmp = patInfoColumn
+  }
+  return [
+    ...tmp,
+    {
+      fixed: 'right', title: '详情', width: 100, slots: {
+        default: ({row}) => <el-button type="primary" onClick=
+            {() => {
+              getEmrUrlAllPatient(row.inpatientNo, row.admissTimes)
+            }}>详情</el-button>,
+      }
+    }
+  ];
+}
+
+const gridBind = reactive({
+  data: props.data,
+  columns: getColumns(),
+  height: "100%",
+  scrollY: {
+    enabled: true,
+    gt: 0
+  },
+  showOverflow: true,
+})
+
+const tmpData = computed(() => {
+  if (selectVal.value === 0) {
+    return props.data
+  }
+  return XEUtils.filter(props.data, (i) => {
+    if (selectVal.value === 1) {
+      return i.flag === false;
+    }
+    return i.flag
+  })
+})
+</script>
+
+<template>
+  <div class="layout_container" style="height: 60vh">
+    <header>
+      <el-select v-model="selectVal" style="width: 120px;">
+        <xc-el-option :data="filter"/>
+      </el-select>
+    </header>
+    <div class="layout_main">
+      <vxe-grid v-bind="gridBind" :data="tmpData" style="flex: 1;"/>
+    </div>
+  </div>
+</template>
+
+<style lang="scss">
+
+</style>

+ 0 - 47
src/views/emr-manage/query-centre/various-rate/QueryParams.vue

@@ -1,47 +0,0 @@
-<script setup lang="ts">
-import CyDateRange from "@/components/cy/date-range/CyDateRange.vue";
-import useCompRef from "@/utils/useCompRef";
-import {ElForm} from "element-plus";
-
-const props = defineProps<{
-  queryData: any
-}>()
-
-const elFormRef = useCompRef(ElForm)
-const rules = {
-  admissDate: [{required: true, trigger: 'blur', message: "必填",}],
-  dieDate: [{required: true, trigger: 'blur', message: "必填"}],
-  opDate: [{required: true, trigger: 'blur', message: "必填"}],
-}
-
-const queryData = reactive({
-  admissDate: [],
-  dieDate: [],
-  opDate: [],
-});
-
-defineExpose({
-  confirm: async () => {
-    await elFormRef.value.validate();
-    return queryData
-  }
-})
-</script>
-
-<template>
-  <el-form ref="elFormRef" :model="props.queryData" :rules="rules">
-    <el-form-item label="入院" prop="admissDate">
-      <CyDateRange v-model="props.queryData.admissDate"/>
-    </el-form-item>
-    <el-form-item label="出院" prop="dieDate">
-      <CyDateRange v-model="props.queryData.dieDate"/>
-    </el-form-item>
-    <el-form-item label="手术" prop="opDate">
-      <CyDateRange v-model="props.queryData.opDate"/>
-    </el-form-item>
-  </el-form>
-</template>
-
-<style lang="scss">
-
-</style>

+ 52 - 36
src/views/emr-manage/query-centre/various-rate/index.vue

@@ -1,18 +1,16 @@
-<script setup lang="ts">
+<script setup lang="tsx">
 import {emrServerHttp} from "@/api/emr-control/request";
 import {VxeGridProps} from "vxe-table";
-import XEUtils from "xe-utils";
-import CyDateRange from "@/components/cy/date-range/CyDateRange.vue";
 import {xcMessage} from "@/utils/xiaochan-element-plus";
+import {useDialog} from "@/components/cy/CyDialog/index";
+import Details from './Details.vue'
+import {dayjs} from "element-plus";
 
 defineOptions({
   name: "variousRate"
 });
 
-const queryData = reactive({
-  start: "",
-  end: "",
-});
+const queryData = ref(['2025-01', '2025-01']);
 
 const tableRef = ref()
 const tableGrid = reactive<VxeGridProps<any>>({
@@ -39,12 +37,30 @@ const tableGrid = reactive<VxeGridProps<any>>({
     {field: '终极分子', title: '终极分子', width: 100},
     {field: '终极分母', title: '终极分母', width: 100},
     {field: '终极比值', title: '终极比值', width: 100},
+    {
+      fixed: 'right', title: '详情', width: 100, slots: {
+        default: ({row}) => <el-button type="primary" onClick=
+            {() => {
+              useDialog(Details, {
+                dialogProps: {
+                  title: row.二级指标,
+                  width: "90%"
+                },
+                params: {
+                  data: row.患者详情,
+                  name: row.二级指标,
+                  mainName: row.一级指标,
+                }
+              })
+            }}>详情</el-button>,
+      }
+    }
   ],
   columnConfig: {resizable: true}
 })
 
 async function openParams() {
-  if (queryData.start == '') {
+  if (queryData.value === null) {
     xcMessage.warning("请选择时间范围")
     return
   }
@@ -52,35 +68,28 @@ async function openParams() {
   const tmp = await emrServerHttp({
     method: "get",
     url: "/queryEmr/variousRate",
-    params: {...queryData}
+    params: {
+      start: dayjs(queryData.value[0]).format('YYYY-MM-DD'),
+      end: dayjs(queryData.value[1]).format('YYYY-MM-DD'),
+    }
   }).catch(() => {
-    return {}
+    return []
   });
-
-  if (XEUtils.isEmpty(tmp)) {
-    tableGrid.data = []
-  } else {
-    let tmpData = []
-    let mergeCells = []
-    for (const key in tmp) {
-      const item = tmp[key];
-      if (XEUtils.isArray(item)) {
-        item.forEach(i => {
-          i.一级指标 = key
-        })
-      }
-      const currentLength = tmpData.length;
-      mergeCells.push({
-        row: currentLength,
-        col: 1,
-        rowspan: item.length,
-        colspan: 1
-      })
-      tableGrid.mergeCells = mergeCells
-      tmpData.push(...item)
-      tableGrid.data = tmpData
-    }
-  }
+  const tmpData = []
+  const mergeCells = []
+  let currentRowIndex = 0;
+  tmp.forEach((item) => {
+    tmpData.push(...item);
+    mergeCells.push({
+      row: currentRowIndex,
+      col: 1,
+      rowspan: item.length,
+      colspan: 1
+    })
+    currentRowIndex += item.length
+  })
+  tableGrid.data = tmpData
+  tableGrid.mergeCells = mergeCells
   tableGrid.loading = false;
 }
 
@@ -89,7 +98,14 @@ async function openParams() {
 <template>
   <div class="layout_container">
     <header>
-      <CyDateRange v-model="queryData" start="start" end="end"/>
+      <el-date-picker
+          v-model="queryData"
+          unlink-panels
+          type="monthrange"
+          range-separator="To"
+          start-placeholder="开始月份"
+          end-placeholder="结束月份"
+      />
       <el-button type="primary" v-el-btn="openParams">查询</el-button>
       <el-button @click="() => tableRef.exportData()">导出</el-button>
     </header>

+ 22 - 0
src/views/emr-manage/query-centre/various-rate/tableTitle.ts

@@ -0,0 +1,22 @@
+const 病历书写时效性指标 = [
+    {field: "start", title: "第一次医嘱时间"},
+    {field: "end", title: "创建病历时间"},
+    {field: "between", title: "相差(小时)"}
+]
+
+const tableTitle = {
+    入院记录24小时完成率: 病历书写时效性指标,
+    手术记录24小时内完成率: 病历书写时效性指标,
+    出院记录24小时内完成率: [
+        {field: "start", title: "出院时间"},
+        {field: "end", title: "创建病历时间"},
+        {field: "between", title: "相差(小时)"}
+    ],
+    病案首页24小时内完成率: [
+        {field: "start", title: "出院时间"},
+        {field: "end", title: "点击质控时间"},
+        {field: "between", title: "相差(小时)"}
+    ]
+}
+
+export default tableTitle;

File diff suppressed because it is too large
+ 608 - 593
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init.ts


+ 1 - 11
src/views/settings/UserInfo.vue

@@ -103,7 +103,7 @@
 </template>
 
 <script setup>
-import {computed, onActivated, onDeactivated, ref} from 'vue'
+import {computed, onActivated, ref} from 'vue'
 import {
   checkAdvice,
   dismissUserBadge,
@@ -116,7 +116,6 @@ import {genTextPortrait} from '@/utils/portrait'
 import {ElMessage, ElMessageBox} from 'element-plus'
 import router from '@/router'
 import Cookies from 'js-cookie'
-import {setCallback} from '@/utils/websocket'
 import changePassword from "@/components/system/password-layer";
 
 
@@ -212,18 +211,12 @@ const replyAdvice = () => {
   })
 }
 
-const callback = () => {
-  getMyAdvices().then((res) => {
-    myAdvices.value = res
-  })
-}
 
 onActivated(() => {
   getUserInfo().then((res) => {
     userInfo.value = res
     getMyAdvices().then((res2) => {
       myAdvices.value = res2
-      setCallback(callback)
       if (isAdmin.value) {
         currentStatus.value = '0'
       }
@@ -231,9 +224,6 @@ onActivated(() => {
   })
 })
 
-onDeactivated(() => {
-  setCallback(null)
-})
 </script>
 
 <style scoped>

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