import { DEVICE_STATES } from '@/libs/utils' import { syncSendCmd } from 'apis/system' import { PARSSURE_DATA } from 'libs/constant' import { defineStore } from 'pinia' import { computed, ref } from 'vue' // 传感器数据初始值 const h2O2Data: Home.DisplayrelyMgrParams[] = [{ type: 'inside', title: '仓内', temp: 0, rh: 0, rs: 0, h2o2: 0, chartId: 'inside', }] // 消毒状态初始值 const initDisinfectState = { curStateRemainTimeS: 0, h2o2SensorData: h2O2Data, injectedVelocity: 0, nlog: 0, state: DEVICE_STATES.IDLE, statedisplayName: '空闲', tlog: 0, } /** * 主页数据管理模块 * @module useHomeStore */ export const useHomeStore = defineStore('home', () => { // 状态定义 const h2O2SensorData = ref(h2O2Data) const pressureConfig = ref(PARSSURE_DATA) const curStateRemainTime = ref() const disinfectionState = ref(initDisinfectState) // 当前设备消毒状态 let renderTimer: any const defaultIntensityValue = ref(0) /** * @function updateHomeData * @param {Home.DisplayrelyMgr[]} data - 当前设备所有环境数据(仓内、探头) * @desc 更新环境传感器数据(温度、湿度、过氧化氢浓度等) */ const updateHomeData = (data: Home.DisplayrelyMgr[]) => { if (data && data.length) { data.forEach((item, index) => { h2O2SensorData.value[index] = { ...h2O2SensorData.value[index], ...item, } }) } } const updatePressureConfig = (data: Home.ParssureData) => { pressureConfig.value = data || PARSSURE_DATA } /** * @function updatePressure * @param {Array} pressureData - 压力配置数据 [压力类型, 压力值] * @desc 更新压力类型及对应压力值配置 */ const updatePressure = async (pressureData: string | number[]) => { if (pressureData && pressureData.length) { const type = pressureData[0] const pressureTypeParams = { className: 'PipelinePressureControl', fnName: 'setType', params: { type }, } syncSendCmd(pressureTypeParams) // 正压或负压时保存设置的压力值 if (type === 'positivePressure' || type === 'negativePressure') { const intensity = pressureData[1] const intensityParams = { className: 'PipelinePressureControl', fnName: 'setIntensity', params: { intensity: Number(intensity) }, } syncSendCmd(intensityParams) } } } /** * @function updateHomeDisinfectionState * @param {Home.DisinfectState} disinfectState - 当前消毒状态信息 * @desc 更新消毒状态信息,每3秒更新一次传感器数据 */ const updateHomeDisinfectionState = (disinfectState: Home.DisinfectState) => { disinfectionState.value = disinfectState if (!renderTimer) { renderTimer = setTimeout(() => { h2O2SensorData.value = [...disinfectionState.value.h2o2SensorData]// 创建副本 // updateHomeData(disinfectionState.value.h2o2SensorData) renderTimer = null }, 3000) as unknown as NodeJS.Timeout // 类型断言兼容不同环境 } } /** * @function updateHomeRemainTime * @param {string} timer - 当前状态剩余时间 * @desc 更新当前消毒状态剩余时间 */ const updateHomeRemainTime = (timer: string) => { curStateRemainTime.value = timer } /** * @computed isDeviceIdle * @returns {boolean} - 设备是否处于空闲或已完成状态 * @desc 判断设备是否处于空闲或已完成状态 */ const isDeviceIdle = computed(() => { return disinfectionState.value.state.toLocaleLowerCase() === DEVICE_STATES.IDLE || disinfectionState.value.state === DEVICE_STATES.FINISHED }) const updateDefaultIntensityValue = (value: number) => { defaultIntensityValue.value = value } return { isDeviceIdle, h2O2SensorData, updateHomeData, updatePressure, disinfectionState, curStateRemainTime, updateHomeDisinfectionState, pressureConfig, updatePressureConfig, updateHomeRemainTime, defaultIntensityValue, updateDefaultIntensityValue, } })