eight
2024-09-05 45e97b23aa5b6a29ccb65c0935d87ca3eb920ad0
update
已添加1个文件
已修改3个文件
206 ■■■■■ 文件已修改
src/api/ecg/queue/index.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/ecg/screen/index.ts 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ecg/callingscreen/bigscreen.vue 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ecg/callingscreen/roomscreen.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/ecg/queue/index.ts
@@ -68,11 +68,6 @@
  //
  resetSchedule: async () => {
    return await request.get({ url: `/ecg/queue/reset-scheduler` })
  },
  //
  getRoomScreenData: async () => {
    return await request.get({ url: `/ecg/queue/room-screen-data` })
  }
}
src/api/ecg/screen/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
import request from '@/config/axios'
export  const statusMap  = new Map([
  [20, "准备中"],
  [30, "就诊中"],
  [50, "过号"]
]);
// å«å· VO
export interface CallingVO {
  patId: string // æ‚£è€…编号
  patName: string // æ‚£è€…姓名
  patGender: number // æ‚£è€…性别
  bookCheckType: number // é¢„约检查类型
  seqNum: number // æŽ’队序号
  status: number // 10:排队中 20:候诊准备 30:就诊中 40:就诊完成 50:过号 60:过期
  passed: number // è¿‡å·æ ‡è®°
  expired: number // é¢„约过期标记
  jumpFlag: number //插队标记
  roomId: number // è¯Šå®¤ç¼–号
  roomName: string // è¯Šå®¤åç§°
  bedNo: string // è¯Šç–—床编号
}
// æŽ’队 API
export const ScreenApi = {
  //
  getRoomScreenData: async () => {
    return await request.get({ url: `/ecg/screen/room-screen-data` })
  },
  getBigScreenData: async () => {
    return await request.get({ url: `/ecg/screen/calling-data` })
  }
}
src/views/ecg/callingscreen/bigscreen.vue
@@ -1,67 +1,53 @@
<script setup lang="ts">
import {ScreenApi, statusMap, CallingVO} from "@/api/ecg/screen";
defineOptions({ name: 'bigscreen' })
  const tableData = [{
      date: '2016-05-02',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1518 å¼„'
    }, {
      date: '2016-05-04',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1517 å¼„'
    }, {
      date: '2016-05-01',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1519 å¼„'
    }, {
      date: '2016-05-03',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1516 å¼„'
    }]
const listReady = ref<CallingVO[]>([]) // åˆ—表的数据
const listWaiting = ref<CallingVO[]>([]) // åˆ—表的数据
const listPassed = ref<CallingVO[]>([]) //
  const names = ["Alice", "Bob", "Charlie", "David", "Eve", "Frank", "Grace",
    "特朗普", "马卡龙", "普金", "穆迪老仙", "拜登", "卡特"]
  const visibleCount = 5 // å¯åŒæ—¶æ˜¾ç¤ºçš„名字数量
  const startIndex = ref<number>(0);
const getList = async () => {
  const data = await ScreenApi.getBigScreenData()
  listReady.value = data[1]
  listWaiting.value = data[2]
  listPassed.value = data[3]
}
  const visibleNames : string[] =  computed(() => {
    const endIndex = (startIndex.value + visibleCount) % names.length;
    if (endIndex > startIndex.value) {
      return names.slice(startIndex.value, endIndex);
    } else {
      return [...names.slice(startIndex.value), ...names.slice(0, endIndex)];
    }
  })
const startScrolling = () => {
  setInterval(() => {
    // console.info("...")
    getList();
  }, 3000); // æ¯ä¸¤ç§’滚动一次
}
  const startScrolling = () => {
    setInterval(() => {
      // console.info("...")
      startIndex.value = (startIndex.value + visibleCount) % names.length;
    }, 3000); // æ¯ä¸¤ç§’滚动一次
  }
onMounted( () => {
  startScrolling()
})
  onMounted( () => {
    startScrolling()
  })
const speak = (msg) => {
  //const msg = new SpeechSynthesisUtterance(`请${this.currentNumber}号就诊`);
  const repeatNum = 3
  var speech = new SpeechSynthesisUtterance()
  speech.text = msg
  speech.pitch = 1 // èŽ·å–å¹¶è®¾ç½®è¯è¯­çš„éŸ³è°ƒ(0-2 é»˜è®¤1,值越大越尖锐,越低越低沉)
  speech.rate = 0.9 // èŽ·å–å¹¶è®¾ç½®è¯´è¯çš„é€Ÿåº¦(0.1-10 é»˜è®¤1,值越大语速越快,越小语速越慢)
  speech.volume = 100 // èŽ·å–å¹¶è®¾ç½®è¯´è¯çš„éŸ³é‡
  speech.lang = 'zh-CN' // è®¾ç½®æ’­æ”¾è¯­è¨€
  const speak = (msg) => {
    //const msg = new SpeechSynthesisUtterance(`请${this.currentNumber}号就诊`);
    const repeatNum = 3
    var speech = new SpeechSynthesisUtterance()
    speech.text = msg
    speech.pitch = 1 // èŽ·å–å¹¶è®¾ç½®è¯è¯­çš„éŸ³è°ƒ(0-2 é»˜è®¤1,值越大越尖锐,越低越低沉)
    speech.rate = 0.9 // èŽ·å–å¹¶è®¾ç½®è¯´è¯çš„é€Ÿåº¦(0.1-10 é»˜è®¤1,值越大语速越快,越小语速越慢)
    speech.volume = 100 // èŽ·å–å¹¶è®¾ç½®è¯´è¯çš„éŸ³é‡
    speech.lang = 'zh-CN' // è®¾ç½®æ’­æ”¾è¯­è¨€
    // å¢žåŠ æŽ§åˆ¶æ’­æ”¾æ¬¡æ•°
    let count = 1
  utterance.onend = function() {
    console.log("Speech ended");
  };
  // å¢žåŠ æŽ§åˆ¶æ’­æ”¾æ¬¡æ•°
  let count = 1
  speechSynthesis.speak(speech)
  while (count < repeatNum) {
    speechSynthesis.speak(speech)
    while (count < repeatNum) {
      speechSynthesis.speak(speech)
      count++
    }
    count++
  }
}
</script>
@@ -71,32 +57,56 @@
    <el-container>
      <el-aside width="500px">
        <el-table
            :data="tableData"
            :data="listReady"
            stripe
            :show-header="false"
            style="width: 100%">
          <el-table-column
              prop="date"
              label="日期"
              width="180"/>
          <el-table-column
              prop="name"
              label="姓名"
              width="180"/>
          <el-table-column
              prop="address"
              label="地址"/>
              prop="patName"
              label="患者姓名"
              width="80"/>
          <el-table-column label="状态" align="center" prop="status" width="80">
            <template #default="scope">
              {{ statusMap.get(scope.row.status) }}
            </template>
          </el-table-column>
        </el-table>
      </el-aside>
      <el-container>
        <el-main>
          <div class="name-scroller">
            <div class="name-box">
              <span v-for="(name, index) in visibleNames" :key="index">{{ name }}</span>
            </div>
          </div>
          <el-table
            :data="listWaiting"
            stripe
            :show-header="false"
            style="width: 100%">
            <el-table-column
              prop="patName"
              label="患者姓名"
              width="80"/>
            <el-table-column label="状态" align="center" prop="status" width="80">
              <template #default="scope">
                {{ statusMap.get(scope.row.status) }}
              </template>
            </el-table-column>
          </el-table>
        </el-main>
        <el-footer>Footer</el-footer>
        <el-footer>
          <el-table
            :data="listPassed"
            stripe
            :show-header="false"
            style="width: 100%">
            <el-table-column
              prop="patName"
              label="患者姓名"
              width="80"/>
            <el-table-column label="状态" align="center" prop="status" width="80">
              <template #default="scope">
                {{ statusMap.get(scope.row.status) }}
              </template>
            </el-table-column>
          </el-table>
        </el-footer>
      </el-container>
    </el-container>
    <el-button @click="speak('请 ç‰¹æœ—æ™® åˆ°äºŒå·è¯Šå®¤ å°±è¯Š')" >叫号</el-button>
src/views/ecg/callingscreen/roomscreen.vue
@@ -1,13 +1,13 @@
<script setup lang="ts">
import {QueueApi, QueueVO} from "@/api/ecg/queue";
import {RoomBedVO} from "@/api/ecg/doctor";
import {DICT_TYPE} from "@/utils/dict";
import {RoomApi} from "@/api/ecg/room";
import {CallingVO, statusMap, ScreenApi} from "@/api/ecg/screen";
defineOptions({ name: 'roomscreen' })
const list = ref<QueueVO[]>([]) // åˆ—表的数据
const list = ref<CallingVO[]>([]) // åˆ—表的数据
const roomBed : RoomBedVO = ref<RoomBedVO>({
  roomId : null,
@@ -15,14 +15,8 @@
  bedNo: null
})
const statusMap  = new Map([
  [20, "准备中"],
  [30, "就诊中"],
  [50, "过号"]
]);
const getList = async () => {
  const data = await QueueApi.getRoomScreenData()
  const data = await ScreenApi.getRoomScreenData()
  list.value = data
}
@@ -47,7 +41,7 @@
<template>
  <el-container>
    <el-aside width="200px">Aside</el-aside>
    <el-aside width="200px">A----</el-aside>
    <el-container>
      <el-header>{{ roomBed.roomName }}</el-header>
      <el-main>
@@ -67,7 +61,7 @@
          </el-table-column>
        </el-table>
      </el-main>
      <el-footer>Footer</el-footer>
      <el-footer>F----</el-footer>
    </el-container>
  </el-container>
</template>