Browse Source

添加running需要的store,添加传感器至设备store

dev
zhangjiming 7 months ago
parent
commit
83bcb2e567
  1. 4
      src/pages/Index/Index.vue
  2. 17
      src/pages/Index/Regular/Consumables.vue
  3. 34
      src/store/modules/consumables.ts
  4. 12
      src/store/modules/device.ts
  5. 39
      src/store/modules/running.ts
  6. 55
      src/websocket/socket.ts

4
src/pages/Index/Index.vue

@ -266,11 +266,11 @@ const handleAppEvent = (data: AppEventMessage['data']) => {
} }
}) })
} else if (data.typeName === 'AppIDCardMountEvent') { } else if (data.typeName === 'AppIDCardMountEvent') {
consumableStore.isIdCardInserted = true
consumableStore.setIdCardInserted(true)
idCardInserted.value = true idCardInserted.value = true
EventText.value = 'id卡已插入' EventText.value = 'id卡已插入'
} else if (data.typeName === 'AppIDCardUnmountEvent') { } else if (data.typeName === 'AppIDCardUnmountEvent') {
consumableStore.isIdCardInserted = false
consumableStore.setIdCardInserted(false)
idCardInserted.value = false idCardInserted.value = false
EventText.value = 'id卡已拔出' EventText.value = 'id卡已拔出'
} else if (data.typeName === 'AppTubeholderSettingUpdateEvent') { } else if (data.typeName === 'AppTubeholderSettingUpdateEvent') {

17
src/pages/Index/Regular/Consumables.vue

@ -50,7 +50,7 @@
<div class="plate-area"> <div class="plate-area">
<SpttingPlates <SpttingPlates
:plates="consumableStore.consumableData?.reactionPlateGroup" :plates="consumableStore.consumableData?.reactionPlateGroup"
:temperature="currentTemperature"
:temperature="deviceStore.sensorState?.pboxTemperature || 20"
@updateReactionPlateNum="updateReactionPlateNum" @updateReactionPlateNum="updateReactionPlateNum"
@unloadConsumable="handleUnloadConsumable" @unloadConsumable="handleUnloadConsumable"
/> />
@ -66,7 +66,7 @@
" "
:bufferBig="consumableStore.consumableData.larBottleGroup" :bufferBig="consumableStore.consumableData.larBottleGroup"
:emergencyInfo="emergencyInfo" :emergencyInfo="emergencyInfo"
:wasteStatus="wasteStatus"
:wasteStatus="deviceStore.sensorState?.wasteBinFullFlag || false"
@loadConsumables="handleIsLoad" @loadConsumables="handleIsLoad"
@unloadConsumables="handleUnloadAll" @unloadConsumables="handleUnloadAll"
@updateTipNum="updateTipNum" @updateTipNum="updateTipNum"
@ -143,10 +143,6 @@ const socket = createWebSocket(wsUrl)
const consumableStore = useConsumablesStore() const consumableStore = useConsumablesStore()
const emergencyStore = useEmergencyStore() const emergencyStore = useEmergencyStore()
const deviceStore = useDeviceStore() const deviceStore = useDeviceStore()
//
const currentTemperature = ref(40)
//
const wasteStatus = ref(false)
// //
const isLoading = ref(false) const isLoading = ref(false)
@ -186,14 +182,7 @@ const startWebSocket = () => {
} }
// //
const handleSensorState = (data: SensorStateMessage['data']) => { const handleSensorState = (data: SensorStateMessage['data']) => {
// 使
currentTemperature.value = data.incubateBoxTemperature
wasteStatus.value = data.wasteBinFullFlag
consumableStore.updateWasteStatus(wasteStatus.value)
//
if (currentTemperature.value > 40) {
console.warn('温度过高警告')
}
deviceStore.setSensorState(data)
} }
// //

34
src/store/modules/consumables.ts

@ -12,26 +12,30 @@ import type { ConsumablesStateMessage } from '../../websocket/socket'
export const useConsumablesStore = defineStore( export const useConsumablesStore = defineStore(
'consumables', 'consumables',
() => { () => {
// 定义状态
// const isLoad = ref(false)
// const moveLiquids = ref<TipInfo[]>([])
// const plates = ref<ConsumableGroupBase[]>([])
// const bufferLittles = ref<LittleBottleGroup[]>([])
// const bufferBig = ref<LargeBottleGroup[]>([])
const consumableData = ref<ConsumablesStateMessage['data']>({ const consumableData = ref<ConsumablesStateMessage['data']>({
tips: [{ tipNum: 0 }, { tipNum: 0 }, { tipNum: 0 }], tips: [{ tipNum: 0 }, { tipNum: 0 }, { tipNum: 0 }],
reactionPlateGroup: Array.from({length: 6},() => ({num: 0, isInstall: false})),
littBottleGroup: Array.from({length: 6},() => ({num: 0, isInstall: false})),
larBottleGroup: Array.from({length: 6},() => ({num: 0,isInstall: false})),
reactionPlateGroup: Array.from({ length: 6 }, () => ({
num: 0,
isInstall: false,
})),
littBottleGroup: Array.from({ length: 6 }, () => ({
num: 0,
isInstall: false,
})),
larBottleGroup: Array.from({ length: 6 }, () => ({
num: 0,
isInstall: false,
})),
}) })
//id卡是否插入 //id卡是否插入
const isIdCardInserted = ref(false) const isIdCardInserted = ref(false)
const wasteStatus = ref(false)
// 设置数据的 action // 设置数据的 action
function setConsumablesData(data: ConsumablesStateMessage['data']) { function setConsumablesData(data: ConsumablesStateMessage['data']) {
// isLoad.value = true // 设置为已加载状态 // isLoad.value = true // 设置为已加载状态
consumableData.value = data consumableData.value = data
} }
function updateTipNum(index: number, num: number) { function updateTipNum(index: number, num: number) {
if (index < consumableData.value.tips.length && num >= 0) { if (index < consumableData.value.tips.length && num >= 0) {
consumableData.value.tips[index].tipNum = num consumableData.value.tips[index].tipNum = num
@ -43,24 +47,18 @@ export const useConsumablesStore = defineStore(
} }
} }
function updateWasteStatus(status: boolean) {
wasteStatus.value = status
}
function updateIdCardStatus(status: boolean) {
function setIdCardInserted(status: boolean) {
isIdCardInserted.value = status isIdCardInserted.value = status
} }
return { return {
updateIdCardStatus,
setIdCardInserted,
isIdCardInserted, isIdCardInserted,
consumableData, consumableData,
setConsumablesData, setConsumablesData,
updateReactionPlateNum, updateReactionPlateNum,
updateTipNum, updateTipNum,
updateWasteStatus,
wasteStatus,
} }
}, },
// { // {

12
src/store/modules/device.ts

@ -1,16 +1,26 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { ref } from 'vue' import { ref } from 'vue'
import type { DeviceWorkStateMessage } from '../../websocket/socket'
import type { DeviceWorkStateMessage, SensorStateMessage } from '../../websocket/socket'
export const useDeviceStore = defineStore('device', () => { export const useDeviceStore = defineStore('device', () => {
const deviceState = ref<DeviceWorkStateMessage['data']>({ const deviceState = ref<DeviceWorkStateMessage['data']>({
workState: 'IDLE', workState: 'IDLE',
pending: false, pending: false,
} as DeviceWorkStateMessage['data']) } as DeviceWorkStateMessage['data'])
function setDeviceState(data: DeviceWorkStateMessage['data']) { function setDeviceState(data: DeviceWorkStateMessage['data']) {
deviceState.value = data deviceState.value = data
} }
const sensorState = ref<SensorStateMessage['data'] | undefined>(undefined)
const setSensorState = (data: SensorStateMessage['data']) => {
sensorState.value = data
}
return { return {
deviceState, deviceState,
setDeviceState, setDeviceState,
sensorState,
setSensorState
} }
}) })

39
src/store/modules/running.ts

@ -0,0 +1,39 @@
import {
OptScanModuleStateMessage,
SubTank,
TubeHolderStateMessage,
} from '@/websocket/socket'
import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useRunningStore = defineStore('running', () => {
const subTanks = ref<SubTank[] | undefined>(undefined)
const setSubTanks = (items: SubTank[]) => {
subTanks.value = items
}
const optScanModuleState = ref<OptScanModuleStateMessage['data'] | undefined>(
undefined,
)
const setOptScanModuleState = (data: OptScanModuleStateMessage['data']) => {
optScanModuleState.value = data
}
const tubeHolderState = ref<TubeHolderStateMessage['data'] | undefined>(
undefined,
)
const setTubeHolderState = (data: TubeHolderStateMessage['data']) => {
tubeHolderState.value = data
}
return {
subTanks,
setSubTanks,
optScanModuleState,
setOptScanModuleState,
tubeHolderState,
setTubeHolderState,
}
})

55
src/websocket/socket.ts

@ -6,20 +6,22 @@ interface BaseMessage {
timestamp: number // 时间戳 timestamp: number // 时间戳
} }
export type OptScanModuleState = 'EMPTY' | 'PLATE_IS_READY' | 'SCANNING'
// 耗材状态消息 // 耗材状态消息
interface OptScanModuleStateMessage extends BaseMessage { interface OptScanModuleStateMessage extends BaseMessage {
type: 'OptScanModuleState' type: 'OptScanModuleState'
messageType: 'Report' messageType: 'Report'
dataType: 'OptScanModuleState' dataType: 'OptScanModuleState'
data: { data: {
state: 'EMPTY' | 'OCCUPIED' // 状态
isErrorPlate: boolean // 是否为错误板
state: OptScanModuleState // 状态
isErrorPlate: boolean // 是否为错误板(标识当前光学模组中的反应板存在异常)
bloodType: 'WHOLE_BLOOD' | 'SERUM_OR_PLASMA' // 血液类型 bloodType: 'WHOLE_BLOOD' | 'SERUM_OR_PLASMA' // 血液类型
sampleBarcode: string // 样本条码 sampleBarcode: string // 样本条码
userid: string // 用户ID userid: string // 用户ID
projInfo: ProjectInfo // 项目信息 projInfo: ProjectInfo // 项目信息
sampleId: string // 样本ID sampleId: string // 样本ID
projId: number // 项目ID projId: number // 项目ID
isEmergency: boolean // 是否急诊
} }
timestamp: number timestamp: number
} }
@ -100,24 +102,42 @@ interface EmergencyPosStateMessage extends BaseMessage {
// errors: string[] // 错误信息列表 // errors: string[] // 错误信息列表
// } // }
export type RunningTubeState =
| 'EMPTY'
| 'TO_BE_PROCESSED'
| 'PENDING'
| 'RESOURCE_IS_READY'
| 'PROCESSING'
| 'PROCESSED'
| 'PROCESS_COMPLETE'
| 'ERROR'
export type TubeHolderType =
| 'BloodTube'
| 'MiniTube'
| 'MiniBlood'
| 'BulletTube1P5'
| 'BulletTube0P5'
| 'StoolTestTube'
// 试管架状态消息 // 试管架状态消息
interface TubeHolderStateMessage extends BaseMessage { interface TubeHolderStateMessage extends BaseMessage {
type: 'TubeHolderState' type: 'TubeHolderState'
messageType: 'Report' messageType: 'Report'
dataType: 'TubeHolderState' dataType: 'TubeHolderState'
data: { data: {
tubeHolderType: string
tubeHolderType: TubeHolderType
tubes: Array<{ tubes: Array<{
sampleId: string | null sampleId: string | null
pos: number pos: number
isHighTube: boolean isHighTube: boolean
isEmergency: boolean isEmergency: boolean
bloodType: string
bloodType: 'WHOLE_BLOOD' | 'SERUM_OR_PLASMA'
sampleBarcode: string sampleBarcode: string
userid: string userid: string
projInfo: any[]
projInfo: ProjectInfo[]
projIds: number[] projIds: number[]
state: string
state: RunningTubeState
errors: string[] errors: string[]
}> }>
state: string state: string
@ -131,9 +151,9 @@ interface SensorStateMessage extends BaseMessage {
messageType: 'Report' messageType: 'Report'
dataType: 'SensorState' dataType: 'SensorState'
data: { data: {
pboxTemperature: number // P盒温度
incubateBoxTemperature: number // 孵育温度
wasteBinFullFlag: boolean // 废物箱满标志
pboxTemperature: number //板夹仓温度
incubateBoxTemperature: number // 孵育温度
wasteBinFullFlag: boolean // 废废料仓状态
} }
timestamp: number timestamp: number
} }
@ -146,10 +166,17 @@ interface ProjectInfo {
color: string color: string
} }
export type SubTankState =
| 'EMPTY'
| 'RESERVED'
| 'WAITING_FOR_DROP'
| 'INCUBATING'
| 'INCUBATION_COMPLETE'
| 'ERROR'
// 子槽位信息接口 // 子槽位信息接口
interface Subtank {
export interface SubTank {
pos: string // 位置编号 SPACE01-SPACE20 pos: string // 位置编号 SPACE01-SPACE20
state: 'EMPTY' | 'OCCUPIED' // 槽位状态
state: SubTankState // 槽位状态
bloodType: 'WHOLE_BLOOD' | 'SERUM_OR_PLASMA' // 血液类型 bloodType: 'WHOLE_BLOOD' | 'SERUM_OR_PLASMA' // 血液类型
sampleBarcode: string // 样本条码 sampleBarcode: string // 样本条码
userid: string // 用户ID userid: string // 用户ID
@ -158,8 +185,9 @@ interface Subtank {
projId: number // 项目ID projId: number // 项目ID
startIncubatedTime: number // 开始孵育时间 startIncubatedTime: number // 开始孵育时间
incubatedTimeSec: number // 孵育时间(秒) incubatedTimeSec: number // 孵育时间(秒)
remainTimeSec: number //剩余孵育时间(显示)
errors: string[] // 错误信息列表 errors: string[] // 错误信息列表
isPlaceholder?: boolean // 是否为占位符
// isPlaceholder?: boolean // 是否为占位符
} }
// 孵育板状态消息 // 孵育板状态消息
@ -168,7 +196,7 @@ interface IncubationPlateStateMessage extends BaseMessage {
messageType: 'Report' messageType: 'Report'
dataType: 'IncubationPlateState' dataType: 'IncubationPlateState'
data: { data: {
subtanks: Subtank[] // 20个子槽位信息
subtanks: SubTank[] // 20个子槽位信息
} }
timestamp: number timestamp: number
} }
@ -370,7 +398,6 @@ export type {
SensorStateMessage, SensorStateMessage,
IncubationPlateStateMessage, IncubationPlateStateMessage,
ProjectInfo, ProjectInfo,
Subtank,
AppEventMessage, AppEventMessage,
ConsumablesStateMessage, ConsumablesStateMessage,
ConsumableGroupBase, ConsumableGroupBase,

Loading…
Cancel
Save