|
|
@ -133,6 +133,74 @@ |
|
|
|
</div> |
|
|
|
</el-dialog> |
|
|
|
|
|
|
|
<el-dialog |
|
|
|
class="event-report-dialog" |
|
|
|
v-model="showEventReportDlg" |
|
|
|
width="600" |
|
|
|
:show-close="false" |
|
|
|
> |
|
|
|
<template #header> |
|
|
|
<div class="report-title"> |
|
|
|
{{ currEventReport ? currEventReport.prompt.title : '' }} |
|
|
|
</div> |
|
|
|
<div class="report-desc"> |
|
|
|
{{ currEventReport ? currEventReport.prompt.info : '' }} |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<div class="report-detail"> |
|
|
|
<div |
|
|
|
v-if=" |
|
|
|
currEventReport && currEventReport.prompt.detailInfoType === 'Forms' |
|
|
|
" |
|
|
|
> |
|
|
|
<div |
|
|
|
class="report-form-item" |
|
|
|
v-for="(item, index) in currEventReport.prompt.detailInfo" |
|
|
|
:key="index" |
|
|
|
> |
|
|
|
<span>{{ item.name + ' :' }}</span> |
|
|
|
<span>{{ item.description }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div |
|
|
|
v-else-if=" |
|
|
|
currEventReport && currEventReport.prompt.detailInfoType === 'Table' |
|
|
|
" |
|
|
|
> |
|
|
|
<div class="report-table-container"> |
|
|
|
<div class="report-table-header"> |
|
|
|
<div |
|
|
|
v-for="(item, index) in currEventReport.prompt.detailInfo |
|
|
|
.header" |
|
|
|
:key="index" |
|
|
|
> |
|
|
|
<span>{{ item }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="report-table-rows"> |
|
|
|
<div |
|
|
|
class="report-table-row" |
|
|
|
v-for="(row, index) in currEventReport.prompt.detailInfo.vars" |
|
|
|
:key="index" |
|
|
|
> |
|
|
|
<div v-for="(col, idx) in row" :key="idx"> |
|
|
|
{{ col.val }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<span v-else> |
|
|
|
{{ currEventReport ? currEventReport.prompt.detailInfo : '' }} |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
<template #footer> |
|
|
|
<div class="dialog-footer"> |
|
|
|
<el-button type="primary" @click="onConfirmReport"> 确定 </el-button> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
</el-dialog> |
|
|
|
|
|
|
|
<InitWarn |
|
|
|
v-if="showModal" |
|
|
|
:visible="showModal" |
|
|
@ -223,7 +291,7 @@ |
|
|
|
</template> |
|
|
|
<script setup lang="ts"> |
|
|
|
import { useRouter } from 'vue-router' |
|
|
|
import { ref, onMounted } from 'vue' |
|
|
|
import { ref, onMounted, computed } from 'vue' |
|
|
|
import { ElDialog } from 'element-plus' |
|
|
|
import { Time, InitWarn, LoadingModal } from './components/Consumables' |
|
|
|
import { |
|
|
@ -235,10 +303,13 @@ import { |
|
|
|
getInitState, |
|
|
|
initDevice, |
|
|
|
saveMountedCardInfo, |
|
|
|
openBuzzer, |
|
|
|
closeBuzzer, |
|
|
|
getProjectInfo, |
|
|
|
getBloodTypes, |
|
|
|
confirmPromptInfo, |
|
|
|
reportTable, |
|
|
|
reportForm, |
|
|
|
reportText, |
|
|
|
} from '../../services/index' |
|
|
|
import { User } from '../../types/Index' |
|
|
|
import { |
|
|
@ -254,6 +325,7 @@ import type { |
|
|
|
ConsumablesStateMessage, |
|
|
|
DeviceWorkStateMessage, |
|
|
|
EmergencyPosStateMessage, |
|
|
|
EventReport, |
|
|
|
FooterMessageState, |
|
|
|
IncubationPlateStateMessage, |
|
|
|
OptScanModuleStateMessage, |
|
|
@ -308,31 +380,41 @@ const wsEvent = createWebSocket(eventUrl.wsUrl) |
|
|
|
const stateUrl = getServerInfo('/api/v1/app/ws/state') |
|
|
|
const wsState = createWebSocket(stateUrl.wsUrl) |
|
|
|
|
|
|
|
const eventReports = ref<EventReport[]>([]) |
|
|
|
const showEventReportDlg = ref(false) |
|
|
|
const currEventReport = computed(() => { |
|
|
|
return eventReports.value.length > 0 ? eventReports.value[0] : undefined |
|
|
|
}) |
|
|
|
const onConfirmReport = async () => { |
|
|
|
if (eventReports.value.length > 0) { |
|
|
|
const report = eventReports.value.shift() |
|
|
|
const res = await confirmPromptInfo(report!.eventId) |
|
|
|
if (res && res.success) { |
|
|
|
// do nothing |
|
|
|
} else { |
|
|
|
res && res.data && res.data.info && console.error(res.data.info) |
|
|
|
} |
|
|
|
} |
|
|
|
if (eventReports.value.length === 0) { |
|
|
|
showEventReportDlg.value = false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 处理应用事件消息 |
|
|
|
const handleAppEvent = (data: AppEventMessage['data']) => { |
|
|
|
console.log('🚀 ~ handleAppEvent ~ data:', data) |
|
|
|
if (data.typeName === 'AppPromptEvents' && data.prompt) { |
|
|
|
data.prompt.forEach(async (item) => { |
|
|
|
if (item.type === 'Error') { |
|
|
|
showErrorModal.value = true |
|
|
|
ErrorMessage.value = item.info |
|
|
|
await openBuzzer() |
|
|
|
} else if (item.type === 'Warn') { |
|
|
|
showWarnModal.value = true |
|
|
|
WarnMessage.value = item.info |
|
|
|
} |
|
|
|
}) |
|
|
|
if (data.typeName === 'AppPromptEvent') { |
|
|
|
eventReports.value.push(data) |
|
|
|
showEventReportDlg.value = true |
|
|
|
} else if (data.typeName === 'AppIDCardMountEvent') { |
|
|
|
// let mock = reportText |
|
|
|
// eventReports.value.push(mock) |
|
|
|
// showEventReportDlg.value = true |
|
|
|
consumableStore.setIdCardInserted(true) |
|
|
|
idCardInserted.value = true |
|
|
|
// EventText.value = 'id卡已插入' |
|
|
|
} else if (data.typeName === 'AppIDCardUnmountEvent') { |
|
|
|
consumableStore.setIdCardInserted(false) |
|
|
|
idCardInserted.value = false |
|
|
|
// EventText.value = 'id卡已拔出' |
|
|
|
} else if (data.typeName === 'AppTubeholderSettingUpdateEvent') { |
|
|
|
// EventText.value = '试管架配置更新' |
|
|
|
eventBus.emit('AppTubeSettingUpdateEvent') |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -501,10 +583,7 @@ const startTest = async () => { |
|
|
|
if (res && res.success) { |
|
|
|
await untilDeviceReady() |
|
|
|
} else { |
|
|
|
res && |
|
|
|
res.data && |
|
|
|
res.data.info && |
|
|
|
eMessage.error(res.data.info) |
|
|
|
res && res.data && res.data.info && eMessage.error(res.data.info) |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('开始测试失败:', error) |
|
|
@ -519,10 +598,7 @@ const pauseTest = async () => { |
|
|
|
if (res && res.success) { |
|
|
|
await untilDeviceReady() |
|
|
|
} else { |
|
|
|
res && |
|
|
|
res.data && |
|
|
|
res.data.info && |
|
|
|
eMessage.error(res.data.info) |
|
|
|
res && res.data && res.data.info && eMessage.error(res.data.info) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -534,10 +610,7 @@ const stopTest = async () => { |
|
|
|
if (res && res.success) { |
|
|
|
await untilDeviceReady() |
|
|
|
} else { |
|
|
|
res && |
|
|
|
res.data && |
|
|
|
res.data.info && |
|
|
|
eMessage.error(res.data.info) |
|
|
|
res && res.data && res.data.info && eMessage.error(res.data.info) |
|
|
|
} |
|
|
|
} |
|
|
|
//继续测试 |
|
|
@ -548,10 +621,7 @@ const continueTest = async () => { |
|
|
|
if (res && res.success) { |
|
|
|
await untilDeviceReady() |
|
|
|
} else { |
|
|
|
res && |
|
|
|
res.data && |
|
|
|
res.data.info && |
|
|
|
eMessage.error(res.data.info) |
|
|
|
res && res.data && res.data.info && eMessage.error(res.data.info) |
|
|
|
} |
|
|
|
} |
|
|
|
const handleConfirm = async () => { |
|
|
@ -839,4 +909,61 @@ onMounted(() => { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.event-report-dialog { |
|
|
|
font-size: 1.5rem; |
|
|
|
.report-title { |
|
|
|
font-size: 30px; |
|
|
|
margin: 18px 0; |
|
|
|
} |
|
|
|
.report-desc { |
|
|
|
font-size: 26px; |
|
|
|
} |
|
|
|
.report-detail { |
|
|
|
font-size: 22px; |
|
|
|
margin-bottom: 14px; |
|
|
|
.report-form-item { |
|
|
|
display: flex; |
|
|
|
gap: 20px; |
|
|
|
margin: 0 20px; |
|
|
|
padding: 20px; |
|
|
|
border-bottom: 1px solid lightgray; |
|
|
|
} |
|
|
|
.report-table-container { |
|
|
|
} |
|
|
|
.report-table-header { |
|
|
|
// background-color: lightgray; |
|
|
|
display: flex; |
|
|
|
text-align: left; |
|
|
|
font-size: 22px; |
|
|
|
height: 45px; |
|
|
|
line-height: $height; |
|
|
|
padding: 0 20px; |
|
|
|
> * { |
|
|
|
flex: 1 1 33%; |
|
|
|
font-weight: 600; |
|
|
|
} |
|
|
|
} |
|
|
|
.report-table-row { |
|
|
|
display: flex; |
|
|
|
text-align: left; |
|
|
|
height: 45px; |
|
|
|
line-height: $height; |
|
|
|
padding: 0 20px; |
|
|
|
> * { |
|
|
|
flex: 1 1 33%; |
|
|
|
} |
|
|
|
&:nth-child(even) { |
|
|
|
background-color: rgb(250, 250, 250); |
|
|
|
} |
|
|
|
&:nth-child(odd) { |
|
|
|
background-color: #f2f2f2; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
.dialog-footer .el-button { |
|
|
|
height: 50px; |
|
|
|
width: 100px; |
|
|
|
font-size: 1.5rem; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |