Browse Source

优化运行页面试管状态

master
LiLongLong 3 months ago
parent
commit
6600e5213d
  1. 3
      components.d.ts
  2. 2
      src/pages/Index/Index.vue
  3. 50
      src/pages/Index/Regular/Running.vue
  4. 5
      src/pages/Index/Settings/Device.vue
  5. 3
      src/pages/Index/components/Consumables/MoveLiquidArea.vue
  6. 9
      src/pages/Index/components/Running/SubTank.vue
  7. 92
      src/pages/Index/components/TestTube/Tube.vue
  8. 12
      src/websocket/socket.ts

3
components.d.ts

@ -10,13 +10,16 @@ declare module 'vue' {
Confirm: typeof import('./src/components/Confirm.vue')['default']
ConfirmModal: typeof import('./src/components/ConfirmModal.vue')['default']
DialogModal: typeof import('./src/components/dialogs/DialogModal.vue')['default']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElButton: typeof import('element-plus/es')['ElButton']
ElCol: typeof import('element-plus/es')['ElCol']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElFooter: typeof import('element-plus/es')['ElFooter']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElInput: typeof import('element-plus/es')['ElInput']
ElRow: typeof import('element-plus/es')['ElRow']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTooltip: typeof import('element-plus/es')['ElTooltip']

2
src/pages/Index/Index.vue

@ -1063,7 +1063,7 @@ watch(
.continue-test {
width: 100px;
height: 48px;
font-size: 20px;
font-size: 24px;
}
}
}

50
src/pages/Index/Regular/Running.vue

@ -92,17 +92,32 @@
<tube-item
:tube="showEmergencyTube ? emergencyStore.emergencyInfo : undefined"
:showNum="false"
type="running"
/>
</div>
</div>
<div class="split"></div>
<div class="tube-items">
<tube-item
v-for="(tube, index) in runningStore.tubeHolderState?.tubes || []"
:key="index"
:tube="tube"
:tubeNo="index + 1"
/>
<div v-for="(tube, index) in runningStore.tubeHolderState?.tubes || []">
<el-tooltip effect="light" content="" placement="top">
<template #content>
<div class="tooltip-content" v-if="tube && tube.projIds && tube.projIds.length">
<div class="tube_info"><div class="tube-label">项目名称</div><div>{{tube.projInfo.map(item=> item.projName).join(",")}}</div></div>
<div class="tube_info"><div class="tube-label">项目类型</div><div>{{settingTubeStore.bloodTypeKeyMap[tube.bloodType].name}}</div></div>
<div class="tube_info"><div class="tube-label">状态</div><div>{{emergencyStateDesc[tube.state]}}</div></div>
<div class="tube_info"><div class="tube-label">用户ID</div><div>{{tube.sampleId}}</div></div>
</div>
<div v-else>无项目</div>
</template>
<tube-item
:key="index"
:tube="tube"
:tubeNo="index + 1"
type="running"
/>
</el-tooltip>
</div>
</div>
</div>
<!-- 第二行 -->
@ -178,7 +193,9 @@ import tubeItem from '../components/TestTube/Tube.vue'
import { useRunningStore } from '@/store/modules/running'
import SubTankItem from '../components/Running/SubTank.vue'
import BigBufferDisplay from '../components/Running/BigBufferDisplay.vue'
import {
emergencyStateDesc,
} from '@/websocket/socket'
const consumablesStore = useConsumablesStore()
const runningStore = useRunningStore()
const deviceStore = useDeviceStore()
@ -334,7 +351,11 @@ watch(
height: auto;
column-gap: 5px;
// padding: 0 10px;
}
}
//
@ -576,4 +597,19 @@ watch(
justify-content: center;
}
}
.tooltip-content{
width:13rem;
font-size:1rem;
line-height: 2rem;
}
.tube_info{
display: flex;
.tube-label{
text-align: right;
width: 5.3rem;
font-weight: 600;
}
}
</style>

5
src/pages/Index/Settings/Device.vue

@ -376,6 +376,7 @@ const startTimer = () => {
currentDate.value = now
time.value = format(now, 'yyyy.MM.dd HH:mm:ss');
}, 1000)
console.log('intervalId.value---', intervalId.value)
}
const temperatures = ref<number[]>([])
@ -468,7 +469,9 @@ onUnmounted(() => {
//
const pauseTimer = () => {
if (intervalId.value) {
console.log(111)
console.log('111====', intervalId.value)
// pickerKey.value = new Date().getTime();
clearInterval(intervalId.value);
intervalId.value = null;
}

3
src/pages/Index/components/Consumables/MoveLiquidArea.vue

@ -287,7 +287,8 @@ const activeTab = ref(0)
const router = useRouter()
let showEmergencyModal = ref(false)
const addEmergency = () => {
if (canSetEmergency) {
console.log('canSetEmergency---', canSetEmergency.value)
if (canSetEmergency.value) {
//
if (
consumableStore.consumableData.reactionPlateGroup.every(

9
src/pages/Index/components/Running/SubTank.vue

@ -36,10 +36,10 @@
.rectangular-item {
position: absolute;
left: 50%; //
top: 38rem; //
top: 37rem; //
width: 75px;
height: 170px;
transform-origin: center -5.375rem; //
transform-origin: center -70px; //
border-radius: 12px;
background-color: #dbdbdb;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
@ -196,8 +196,3 @@ const getItemStyle = (item: SubTank) => {
}
}
</script>
<style lang="less" scoped>
.placeholder-text{
color:#bfbfbf
}
</style>

92
src/pages/Index/components/TestTube/Tube.vue

@ -1,46 +1,48 @@
<template>
<div
class="tube-item"
@click="$emit('clickTubeItem', tubeNo || tube.tubeIndex)"
@click="$emit('clickTubeItem', tubeNo || (tube && tube.tubeIndex))"
>
<span v-if="!!showNum" class="order">{{
tubeNo ? tubeNo : tube.tubeIndex + 1
}}</span>
<div class="tube-circle" v-if="projIdsOfTube(tube).length === 0">
<span class="add-symbol">+</span>
<div class="tube-circle-empty" v-if="type === 'running'">
<img src="@/assets/running/stop_s.svg" alt="empty" />
</div>
<span v-else class="add-symbol">+</span>
</div>
<div class="tube-project" v-else>
<canvas class="canvas" ref="canvas" width="58" height="58"></canvas>
<div class="text-layer">
<span>{{
projIdsOfTube(tube).length === 1
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]].projName
: ''
: projIdsOfTube(tube).length === 2
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[1]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[1]].projName
<div class="tube-project" v-else @click="showProjInfo(tube)">
<canvas class="canvas" ref="canvas" width="58" height="58"></canvas>
<div class="text-layer">
<span>{{
projIdsOfTube(tube).length === 1
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]].projName
: ''
: projIdsOfTube(tube).length === 2
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[1]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[1]].projName
: ''
: ''
}}</span>
<span class="blood-text">{{
tube && tube.bloodType ? settingTubeStore.bloodTypeKeyMap[tube.bloodType]?.name : ''
}}</span>
<span>{{
projIdsOfTube(tube).length === 2
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]].projName
: ''
: ''
}}</span>
<span class="blood-text">{{
tube && tube.bloodType ? settingTubeStore.bloodTypeKeyMap[tube.bloodType]?.name : ''
}}</span>
<span>{{
projIdsOfTube(tube).length === 2
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]]
? settingTubeStore.projectIdMap[projIdsOfTube(tube)[0]].projName
: ''
: ''
}}</span>
</div>
}}</span>
</div>
</div>
<!-- <span v-if="showUserId" class="user-id">{{ tube && tube.userid || '-' }}</span> -->
<el-tooltip v-if="showUserId" :content="tube && tube.userid || '-'" placement="top" trigger="click">
<!-- <span class="user-id">{{ tube && tube.userid || '-' }}</span> -->
<span class="user-id">{{ tube && tube.userid || '-' }}</span>
</el-tooltip>
<span v-if="type === 'running'" class="user-id" :style="`color:${tube && emergencyStateColor[tube.state]}`">{{tube && tube.projIds && tube.projIds.length && emergencyStateDesc[tube.state] || ''}}</span>
<span v-else class="user-id">{{ tube && tube.userid || '-' }}</span>
</div>
</template>
@ -48,7 +50,10 @@
import { ref, watch, useTemplateRef, nextTick, computed } from 'vue'
import * as R from 'ramda'
import { useConsumablesStore, useSettingTestTubeStore } from '@/store'
import {
emergencyStateDesc,
emergencyStateColor
} from '@/websocket/socket'
/*
tube: {userid,projId:number[],bloodType}
*/
@ -59,6 +64,7 @@ const props = defineProps({
showNum: { type: Boolean, default: true },
showUserId: {type: Boolean, default: true},
tubeNo: { type: Number },
type: {type: String}
})
const emit = defineEmits(['clickTubeItem'])
const settingTubeStore = useSettingTestTubeStore()
@ -69,10 +75,11 @@ const projIdsOfTube = (tube) => {
}
const canvas = useTemplateRef('canvas')
const tubeData = ref()
watch(
() => props.tube,
(newVal) => {
tubeData.value = props.tube
const projIds = projIdsOfTube(props.tube)
if (projIds.length > 0) {
nextTick(() => {
@ -90,6 +97,10 @@ watch(
{ immediate: true },
)
function showProjInfo(tube){
console.log('-----------------------', tubeData.value, tube)
}
function drawPieChart(ctx, data) {
let total = data.reduce((acc, val) => acc + val.value, 0)
let currentAngle = data.length === 2 ? 0 : -0.5 * Math.PI // Start from the top (12 o'clock position)
@ -139,6 +150,21 @@ function drawPieChart(ctx, data) {
}
margin-bottom: 6px;
}
.tube-circle-empty{
width: 72px;
height: 72px;
border-radius: 999px;
border: solid 1px gray;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 6px;
background:#f1f1f1;
margin-top: 5px;
border: 0px solid;
}
.tube-project {
position: relative;
.text-layer {
@ -168,4 +194,8 @@ function drawPieChart(ctx, data) {
text-overflow: ellipsis;
margin-left: 0.7rem;
}
.tube_info{
display:flex
}
</style>

12
src/websocket/socket.ts

@ -163,10 +163,20 @@ export const emergencyStateDesc = {
PENDING: '已挂起',
RESOURCE_IS_READY: '已就绪',
PROCESSING: '处理中',
PROCESS_COMPLETE: '处理完成',
PROCESS_COMPLETE: '完成',
ERROR: '出错',
}
export const emergencyStateColor = {
EMPTY: '',
TO_BE_PROCESSED: '#56ccab',
PENDING: '#a793ec',
RESOURCE_IS_READY: '#17b60d',
PROCESSING: '#e35958',
PROCESS_COMPLETE: '#773f16',
ERROR: '#e93527',
}
// 急诊位状态消息
interface EmergencyPosStateMessage extends BaseMessage {
type: 'EmergencyPosState'

Loading…
Cancel
Save