xiaochan 6 месяцев назад
Родитель
Сommit
dac3bc6048

+ 82 - 34
src/views/single-page/InpatientBoardV2/BoardCard.vue

@@ -2,19 +2,18 @@
 import {anonymizeName, getHuloColor, InpatientBoardKey} from "@/views/single-page/InpatientBoardV2/index";
 import type {InpatientBrief} from "@/views/single-page/InpatientBoardV2/index";
 import {ElTag} from 'element-plus';
+import XEUtils from "xe-utils";
+import sleep from "@/utils/sleep";
 
 const {store} = inject(InpatientBoardKey)
 
 const tempInfoKey = {
   patNo: '住院号',
-  birthDate: '出生日期',
-  convertAdmissDate: '入院时间',
-  physician: '管床医生',
-  medTypeName: '医疗类别',
-  indays: '住院天数',
+  convertAdmissDate: '入院',
+  physician: '管床',
+  medTypeName: '类别',
 };
 
-
 function sexName(value: any) {
   if (value == 1) {
     return '男'
@@ -26,44 +25,103 @@ function sexName(value: any) {
 }
 
 function huliFunc(value: InpatientBrief) {
-
-  const Tag = (name) => {
+  const Tag = (name: string) => {
     return <ElTag effect="dark"
                   round
                   size="large"
                   disableTransitions
                   color={getHuloColor(name)}>{() => name}</ElTag>
   }
-
   if (value.sickLevelOrderName) {
-    return Tag(value.sickLevelOrderName)
+    return Tag(value.sickLevelOrderName);
+  }
+  return null
+}
+
+const scrollingInfo = reactive({
+  rowCount: 5,
+  interval: null,
+  currentIndex: 0,
+  maxDataLength: 25,
+  data: [],
+  clear() {
+    clearTimeout(scrollingInfo.interval)
+  },
+});
+
+function hasScrollDiv(divElement) {
+  // 获取div的总高度(包括内容和任何滚动条)
+  const totalHeight = divElement.scrollHeight;
+  // 获取可见区域的高度(不包含任何滚动条)
+  const clientHeight = divElement.clientHeight;
+  // 如果总高度大于可见区域的高度,则说明该div元素有滚动条
+  return totalHeight > clientHeight;
+}
+
+function 开启滚动动画(value) {
+  scrollingInfo.clear();
+  scrollingInfo.interval = setTimeout(() => 动画(value), store.urlQuery.speedBarDisplay * 1000)
+}
+
+async function 动画(value) {
+  const el = store.infoEl.value
+  const items = el.querySelectorAll('.board-row');
+  const item = items[1];
+  if (item) {
+    item.scrollIntoView({
+      block: 'start',
+      inline: 'nearest',
+      behavior: 'smooth'
+    });
+    await nextTick()
+    await sleep(500)
+    const shiftData = scrollingInfo.data.shift();
+    scrollingInfo.currentIndex++
+    el.scrollTop = 0
+    scrollingInfo.data.push(shiftData);
   }
-  if (value.nursingLevel) {
-    return Tag(value.nursingLevel)
+  开启滚动动画(value);
+}
+
+const chunkSize = 3
+
+async function start(data: any[]) {
+  scrollingInfo.clear()
+  const chunk = XEUtils.chunk(data, chunkSize);
+  if (chunk.length === chunkSize) {
+    scrollingInfo.data = [...chunk, ...chunk];
+  } else {
+    scrollingInfo.data = chunk;
+  }
+  await nextTick();
+  if (hasScrollDiv(store.infoEl.value)) {
+    开启滚动动画(scrollingInfo.data)
   }
-  return Tag('未知')
 }
+
+onMounted(() => {
+  store.mutation.boardStart = start
+})
 </script>
 
 <template>
   <div style="overflow: hidden;flex-wrap: wrap;height: 100%"
-       :ref="(el) => store.infoEl.value = el"
+       :ref="(el: any) => store.infoEl.value = el"
   >
-    <div v-for="father in store.scrollingInfo.data"
+    <div v-for="father in scrollingInfo.data"
          class="board-row">
       <div class="board-col" v-for="item in father">
         <div class="board-card">
           <div class="layout_container layout-horizontal board-card-header" style="height: max-content">
             <div class="layout_flex_1-x board-col-header">
               {{ anonymizeName(item.name) }}
-              &nbsp;
               <span style="font-size: 1.25rem">{{ sexName(item.gender) }}</span>
+              <span style="font-size: 1.25rem">{{ item.age }}岁</span>
             </div>
-
             <div style="width: max-content">
               <b style="font-size: 1.25rem">
-                {{ item.bedNo }}
-              </b>&nbsp;&nbsp;
+                {{ item.bedNo }}
+              </b>
               <Component :is="huliFunc(item)"/>
             </div>
           </div>
@@ -75,7 +133,6 @@ function huliFunc(value: InpatientBrief) {
               <div class="layout_flex_1-x" style="padding-left: 6px">{{ item[infoKey] }}</div>
             </div>
           </div>
-          <div class="board-card-footer"></div>
         </div>
       </div>
     </div>
@@ -86,36 +143,27 @@ function huliFunc(value: InpatientBrief) {
 $padding: 0.63rem;
 
 .board-row {
-  display: flex;
+  display: grid;
   padding: 0.31rem 0;
+  grid-template-columns: 1fr 1fr 1fr;
 
   .board-col {
-    flex: 0 0 20%;
+    flex: 0 0 40%;
     padding-left: $padding;
     padding-right: $padding;
     font-size: 0.75rem;
 
     .board-col-header {
-      font-size: 1.88rem;
+      font-size: 1.4rem;
     }
 
     .board-card {
       background: #204698;
     }
 
-    .board-card-header {
-      padding: 0.50rem 0.31rem 0.31rem 0.31rem;
-    }
-
-    .board-card-footer {
-      height: 0.31rem;
-      background-color: #DA5856;
-    }
-
     .board-card-body {
-      font-size: 1rem;
+      font-size: 0.9rem;
       background-color: #162858;
-      padding: 0.31rem;
     }
   }
 }

+ 5 - 24
src/views/single-page/InpatientBoardV2/BoardInfo.vue

@@ -1,7 +1,8 @@
 <script setup lang="ts">
 import {SYSTEM_CONFIG} from "@/utils/public";
-import {InpatientBoardKey} from "@/views/single-page/InpatientBoardV2/index";
-import BoardCard from "@/views/single-page/InpatientBoardV2/BoardCard.vue";
+import {InpatientBoardKey} from "./index";
+import BoardCard from "./BoardCard.vue";
+import BoardTable from "./BoardTable.vue";
 
 const {store} = inject(InpatientBoardKey)!
 
@@ -33,27 +34,7 @@ const {store} = inject(InpatientBoardKey)!
         <BoardCard/>
       </div>
       <div class="右边宽度">
-
-        <div class="layout_display_flex_y">
-          <div class="深度边框 layout_display_flex_y">
-            <div>
-              <b>护理信息:</b>
-            </div>
-            <div class="layout_display_flex_y">
-              <dv-scroll-board v-bind="store.dvTableData.huli" class="layout_h-w_max"/>
-            </div>
-          </div>
-          <div style="height: 1.1rem"></div>
-          <div class="深度边框 layout_display_flex_y">
-            <div>
-              <b>今日手术:</b>
-            </div>
-            <div class="layout_display_flex_y">
-              <dv-scroll-board v-bind="store.dvTableData.operation" class="layout_h-w_max"/>
-            </div>
-          </div>
-        </div>
-
+        <BoardTable/>
       </div>
     </div>
   </div>
@@ -63,7 +44,7 @@ const {store} = inject(InpatientBoardKey)!
 .info_main {
 
   .右边宽度 {
-    width: 23%;
+    width: 70%;
   }
 
   .蓝色底框 {

+ 162 - 0
src/views/single-page/InpatientBoardV2/BoardTable.vue

@@ -0,0 +1,162 @@
+<script setup lang="ts">
+import {InpatientBoardKey} from "@/views/single-page/InpatientBoardV2/index";
+
+const {store} = inject(InpatientBoardKey)
+
+
+</script>
+
+<template>
+  <table>
+    <tr>
+      <td>病人总数</td>
+      <td>{{ store.data.value.length }}人</td>
+      <td>病危</td>
+      <td></td>
+      <td>病重</td>
+      <td></td>
+      <td>绝对卧床</td>
+      <td colspan="2"></td>
+      <td>值班医生</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>今日手术</td>
+      <td></td>
+      <td>明日手术</td>
+      <td></td>
+      <td>入院</td>
+      <td colspan="2"></td>
+      <td>出院</td>
+      <td colspan="3"></td>
+    </tr>
+    <tr>
+      <td>省职</td>
+      <td colspan="4"></td>
+      <td>异地</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>城居</td>
+      <td colspan="10"></td>
+    </tr>
+    <tr>
+      <td>城职</td>
+      <td colspan="10"></td>
+    </tr>
+    <tr>
+      <td>一级护理</td>
+      <td colspan="10"></td>
+    </tr>
+    <tr>
+      <td>二级护理</td>
+      <td colspan="10"></td>
+    </tr>
+    <tr>
+      <td>心电监护</td>
+      <td colspan="4"></td>
+      <td>中心吸氧</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>今日手术</td>
+      <td colspan="4"></td>
+      <td>明日手术</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>灌肠</td>
+      <td>今晚</td>
+      <td></td>
+      <td>明晨</td>
+      <td></td>
+      <td>膀胱冲洗</td>
+      <td></td>
+      <td>PPD皮试</td>
+      <td></td>
+      <td>血液隔离</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>口腔护理</td>
+      <td colspan="4"></td>
+      <td>会阴护理</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>吸痰护理</td>
+      <td colspan="4"></td>
+      <td>造口护理</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>血糖</td>
+      <td>BG</td>
+      <td colspan="3"></td>
+      <td>Tid</td>
+      <td></td>
+      <td>Q6h</td>
+      <td></td>
+      <td>Qd</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>血压</td>
+      <td>QD</td>
+      <td colspan="3"></td>
+      <td>Bid</td>
+      <td colspan="5"></td>
+    </tr>
+    <tr>
+      <td>血压</td>
+      <td>Tid</td>
+      <td colspan="3"></td>
+      <td>Q4h</td>
+      <td></td>
+      <td>Q6h</td>
+      <td></td>
+      <td>Q8h</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>24h出入量</td>
+      <td>24h尿量</td>
+      <td></td>
+      <td>24h出量</td>
+      <td></td>
+      <td>24h入量</td>
+      <td></td>
+      <td colspan="2">24h引流管出量</td>
+      <td colspan="2"></td>
+    </tr>
+    <tr>
+      <td>中长导管</td>
+      <td></td>
+      <td>CVC</td>
+      <td></td>
+      <td>PICC</td>
+      <td></td>
+      <td>过敏史</td>
+      <td colspan="4"></td>
+    </tr>
+  </table>
+</template>
+
+<style scoped>
+table {
+  width: 100%;
+  border-collapse: collapse;
+  border: 1px solid white;
+  height: 100%;
+  table-layout: fixed;
+}
+
+td, td {
+  border: 1px solid white;
+  text-align: center;
+}
+
+td {
+  //background-color: #f2f2f2;
+}
+</style>

+ 1 - 10
src/views/single-page/InpatientBoardV2/Index.vue

@@ -9,10 +9,6 @@ provide(InpatientBoardKey, {
   store: store
 })
 
-const fullscreenEl = ref()
-
-const {toggle} = useFullscreen(fullscreenEl)
-
 </script>
 
 <template>
@@ -47,15 +43,10 @@ const {toggle} = useFullscreen(fullscreenEl)
                            v-model="store.urlQuery.refresh"
                            @change="store.changeInterval"/>
         </el-form-item>
-        <el-form-item>
-          <el-button @click="toggle">全屏</el-button>
-        </el-form-item>
       </el-form>
 
     </header>
-    <div class="layout_main layout_container layout-horizontal"
-         @click="toggle"
-         ref="fullscreenEl">
+    <div class="layout_main layout_container layout-horizontal">
       <BoardInfo/>
     </div>
   </div>

+ 8 - 76
src/views/single-page/InpatientBoardV2/index.ts

@@ -87,20 +87,10 @@ export type InpatientBrief = {
     sickLevelOrderName: string;
     // 患者状态: 0-正常,1-病重,2-病危
     sickLevel: number;
+    leaveHospital: number
 }
 
 export function useInpatientBoard() {
-    const scrollingInfo = reactive({
-        rowCount: 5,
-        interval: XEUtils.noop,
-        currentIndex: 0,
-        maxDataLength: 25,
-        data: [],
-        clear() {
-            clearTimeout(scrollingInfo.interval)
-        },
-    });
-
     const bedCount = ref(0)
     const selectRef = ref()
 
@@ -152,16 +142,8 @@ export function useInpatientBoard() {
             }
 
         })
-
-        console.log(res.huli)
-        // for (let key in res.huli) {
-        //     // @ts-ignore
-        //     dvTableData.huli.config.data.push([key, res.huli[key]])
-        // }
-
     }
 
-
     function changeRouterQuery() {
         const {wardName, ...tmp} = urlQuery
         router.replace({
@@ -191,7 +173,6 @@ export function useInpatientBoard() {
     }
 
     async function setData(value: InpatientBrief[], res) {
-        scrollingInfo.clear()
         if (XEUtils.isArray(value)) {
             data.value = value;
             滚动分组()
@@ -204,61 +185,8 @@ export function useInpatientBoard() {
         time.weekName = getWeek(time.now)
     }
 
-    async function 动画(value) {
-        const el = infoEl.value!
-        const items = el.querySelectorAll('.board-row');
-        const item = items[1];
-        if (item) {
-            item.scrollIntoView({
-                block: 'start',
-                inline: 'nearest',
-                behavior: 'smooth'
-            });
-
-            await nextTick()
-            await sleep(500)
-
-            const shiftData = scrollingInfo.data.shift();
-            scrollingInfo.currentIndex++
-            el.scrollTop = 0
-
-            scrollingInfo.data.push(shiftData);
-        }
-
-
-        开启滚动动画(value);
-    }
-
-    function 开启滚动动画(value) {
-        // if (isDev) {
-        //     return;
-        // }
-        scrollingInfo.clear();
-        scrollingInfo.interval = setTimeout(() => 动画(value), urlQuery.speedBarDisplay * 1000)
-    }
-
-    function hasScrollDiv(divElement) {
-        // 获取div的总高度(包括内容和任何滚动条)
-        const totalHeight = divElement.scrollHeight;
-        // 获取可见区域的高度(不包含任何滚动条)
-        const clientHeight = divElement.clientHeight;
-        // 如果总高度大于可见区域的高度,则说明该div元素有滚动条
-        return totalHeight > clientHeight;
-    }
-
     async function 滚动分组() {
-        scrollingInfo.clear();
-        const chunk = XEUtils.chunk(data.value, 5);
-        if (chunk.length === 5) {
-            scrollingInfo.data = [...chunk, ...chunk];
-        } else {
-            scrollingInfo.data = chunk;
-        }
-
-        await nextTick();
-        if (hasScrollDiv(infoEl.value)) {
-            开启滚动动画(scrollingInfo.data)
-        }
+        mutation.boardStart(data.value)
     }
 
     let interval = setInterval(() => {
@@ -311,6 +239,10 @@ export function useInpatientBoard() {
         }, (60 * 1000) * urlQuery.refresh)
     }
 
+    const mutation = {
+        boardStart: (value: any[]): Promise<void> | number => 0
+    }
+
     onMounted(async () => {
         const query = router.currentRoute.value.query
         urlQuery.speedBarDisplay = XEUtils.toNumber(XEUtils.get(query, 'speedBarDisplay', 3));
@@ -331,10 +263,10 @@ export function useInpatientBoard() {
         infoEl,
         dvTableData,
         changeInterval,
-        scrollingInfo,
         urlQuery,
         handleRefresh,
-        bedCount
+        bedCount,
+        mutation
     }
 }