Browse Source

添加激活状态判断

feature/user-0111
zhangjiming 7 months ago
parent
commit
adebabd5fe
  1. 3
      src/assets/icon_cross_gray.svg
  2. 148
      src/pages/Index/Regular/TestTube.vue
  3. 97
      src/pages/Index/components/TestTube/TestTubeRack.vue
  4. 2
      src/services/Index/index.ts
  5. 7
      src/services/Index/testTube.ts

3
src/assets/icon_cross_gray.svg

@ -0,0 +1,3 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3571 11L22 19.6429L19.6429 22L11 13.3571L2.35714 22L0 19.6429L8.64286 11L1.40497e-06 2.35714L2.35714 0L11 8.64286L19.6429 0L22 2.35714L13.3571 11Z" fill="#999999"/>
</svg>

148
src/pages/Index/Regular/TestTube.vue

@ -12,8 +12,9 @@
:index="index"
:projects="projectsAvailable"
:bloodTypes="bloodTypes"
@delete:rack="deleteHandle"
@clickTubeItem="updateTubeSettingsHandler"
@delete:rack="deleteTubeRack"
@active:rack="handleActivateChange"
@clickTubeItem="updateTubeSettings"
/>
</div>
<!-- 添加试管架按钮 -->
@ -31,8 +32,8 @@
<div v-for="proj in projectsAvailable" :key="proj.projName">
<div
class="project-item"
:class="{ active: isElemActive(proj) }"
:style="elemStyle(proj)"
:class="{ active: isProjElemActive(proj) }"
:style="styleOfProjElem(proj)"
@click="clickProjectItem(proj)"
>
<span class="proj-name">{{ proj.projName }}</span>
@ -72,7 +73,8 @@ import {
deleteTube,
updateTubeConfig,
getBloodTypes,
} from '../../../services/Index/Test-tube/test-tube'
updateTubeActivationStatus,
} from '../../../services/Index/testTube'
// import type { DataItem, TubeSetting } from '../../../types/Index/index'
// import { ConsumableGroupBase } from '../../../websocket/socket'
import {
@ -106,12 +108,12 @@ onMounted(() => {
const onClickTubeItem = (rackIdx, tubeIdx) => {
console.log(rackIdx, tubeIdx)
}
const isElemActive = (proj) => {
const isProjElemActive = (proj) => {
return selectedProjIds.value.includes(proj.projId)
}
const elemStyle = (proj) => {
const active = isElemActive(proj)
const styleOfProjElem = (proj) => {
const active = isProjElemActive(proj)
if (active) {
return {
border: 'solid 1px #FFF',
@ -220,7 +222,6 @@ const getTubeData = async () => {
}
loading.value = false
}
const selectedProject = ref(null)
//
const handleChangeUser = async (uuid) => {
@ -231,15 +232,22 @@ const handleChangeUser = async (uuid) => {
)
if (!selectedTube) return
testTubeStore.setTubeInfo(selectedTube)
await updateTubeSettingsHandler()
await updateTubeSettings()
router.push({
path: '/index/change-user',
})
}
//
const deleteHandle = async (idx) => {
const deleteTubeRack = async (idx) => {
const rack = tubeRacks.value[idx]
if (rack.state !== 'INACTIVE') {
ElMessage({
message: '试管架处理激活状态,不可删除',
type: 'error',
})
return
}
const res = await deleteTube(rack.uuid)
if (res.success) {
tubeRacks.value = tubeRacks.value.filter((v, i) => i !== idx)
@ -272,106 +280,48 @@ const addTubeRack = async () => {
}
//
const handleActivateChange = (update) => {
//: { uuid: string; active: boolean }
const rack = tubeRacks.value.find((t) => t.uuid === update.uuid)
if (rack) {
rack.active = update.active
const handleActivateChange = async (index) => {
const rack = tubeRacks.value[index]
if (rack.state === 'LOCKED') {
ElMessage({
message: '试管已锁定,不能修改',
type: 'error',
})
return
}
}
const handleSampleUpdate = async ({
projectIds, // number[]
bloodType, // string
}) => {
// Promise<void>
if (selectedSampleIdsInParent.value.length > 0) {
// tubeRacks
const updatedTubeRacks = JSON.parse(JSON.stringify(tubeRacks.value))
// tubeRack
const targetTubeRack = updatedTubeRacks.find(
// t: DataItem
(t) => t.uuid === UUID.value,
)
if (targetTubeRack) {
targetTubeRack.tubeSettings = targetTubeRack.tubeSettings.map(
//tube; TubeSetting
(tube) => {
if (selectedSampleIdsInParent.value.includes(tube.tubeIndex)) {
return {
...tube,
projId: [...projectIds],
bloodType: bloodType,
}
}
return tube
},
)
//
tubeRacks.value = []
await nextTick()
tubeRacks.value = updatedTubeRacks //
console.log(
'🚀 ~ handleSampleUpdate ~ updatedTubeRacks:',
updatedTubeRacks,
)
const selectedTube = updatedTubeRacks.find((t) => t.uuid === UUID.value)
console.log('🚀 ~ handleSampleUpdate ~ selectedTube:', selectedTube)
testTubeStore.setTubeInfo(selectedTube)
console.log(
'🚀 ~ handleSampleUpdate ~ testTubeStore.$state.tubeInfo:',
testTubeStore.$state.tubeInfo,
)
selectedProject.value = null //
await nextTick()
ElMessage({
message: '样本信息已更新',
type: 'success',
duration: 2000,
})
}
let destState = rack.state === 'INACTIVE' ? 'ACTIVE' : 'INACTIVE'
const res = await updateTubeActivationStatus({
uuid: rack.uuid,
active: destState === 'ACTIVE',
})
if (res.success) {
tubeRacks.value = tubeRacks.value.map((rack, idx) => {
if (idx === index) {
rack.state = destState
}
return rack
})
} else {
ElMessage({
message: '请先选择样本后再选择项目',
type: 'warning',
duration: 2000,
message: '更改激活状态失败',
type: 'error',
})
}
}
// ID
const selectedSampleIdsInParent = ref([]) //<number[]>
const showProjectSelector = ref(false)
//
const handleUpdateSelectedSamples = ({
sampleIds, //number[]
uuid,
}) => {
//
const tubeRack = tubeRacks.value.find((tube) => tube.uuid === uuid)
if (tubeRack) {
// sampleIds
if (sampleIds.length === 0) {
showProjectSelector.value = false
selectedSampleIdsInParent.value = []
} else {
selectedSampleIdsInParent.value = sampleIds
showProjectSelector.value = true
}
}
}
//
const updateTubeSettingsHandler = async (rackIdx, tubeIdx) => {
const updateTubeSettings = async (rackIdx, tubeIdx) => {
if (!selectedBloodTypeKey.value) {
ElMessage.error('请选择血液类型')
return
}
const rack = tubeRacks.value[rackIdx]
if (rack.state !== 'INACTIVE') {
ElMessage({
message: '试管架已激活,不能修改',
type: 'error',
})
return
}
if (tubeIdx < rack.tubeSettings.length) {
const setting = rack.tubeSettings[tubeIdx]
const updSetting = {

97
src/pages/Index/components/TestTube/TestTubeRack.vue

@ -1,9 +1,13 @@
<template>
<div class="test-tube-rack">
<div class="test-tube-rack" :class="{ locked: tubeRack.state === 'LOCKED' }">
<!--状态-->
<div class="tube-rack-state">
<div class="tube-rack-state" @click="$emit('active:rack', index)">
<div class="status-icon">
<img src="@/assets/Vector.svg" alt="Status Icon" v-if="tubeRack.state==='INACTIVE'" />
<img
src="@/assets/Vector.svg"
alt="Status Icon"
v-if="tubeRack.state === 'INACTIVE'"
/>
<img src="@/assets/Active-Vector.svg" alt="Status Icon" v-else />
</div>
</div>
@ -11,15 +15,29 @@
<!--试管区-->
<section class="tube-list">
<div v-for="(tube, idx) in tubeRack.tubeSettings">
<Tube :tube="tube" :index="idx" :projects="projects" :bloodTypes="bloodTypes" @clickTubeItem="onClickTubeItem" />
<Tube
:tube="tube"
:index="idx"
:projects="projects"
:bloodTypes="bloodTypes"
@clickTubeItem="onClickTubeItem"
/>
</div>
</section>
</div>
<div class="test-tube-rack-op">
<div class="rack-op">修改试管架</div>
<div
class="test-tube-rack-op"
:class="{ active: tubeRack.state !== 'INACTIVE' }"
>
<div class="rack-op rack-edit">修改试管架</div>
<div class="rack-op">编辑患者信息</div>
<div class="rack-op rack-del" @click="$emit('delete:rack', index)">
<img src="@/assets/icon_cross.svg" alt="del" />
<img
v-if="tubeRack.state === 'INACTIVE'"
src="@/assets/icon_cross.svg"
alt="del"
/>
<img v-else src="@/assets/icon_cross_gray.svg" alt="del" />
<span>删除试管架</span>
</div>
</div>
@ -28,10 +46,10 @@
<script setup>
import Tube from './Tube.vue'
const props = defineProps(['tubeRack', 'index', 'projects', 'bloodTypes'])
const emit = defineEmits(['delete:rack', 'clickTubeItem'])
const emit = defineEmits(['delete:rack', 'active:rack', 'clickTubeItem'])
const onClickTubeItem = (idx) => {
emit('clickTubeItem', props.index, idx)
emit('clickTubeItem', props.index, idx)
}
</script>
@ -41,18 +59,24 @@ const onClickTubeItem = (idx) => {
height: 150px;
display: flex;
align-items: center;
&.locked {
background-color: #C8C8C8;
}
.tube-rack-state {
align-self: stretch;
width: 100px;
display: flex;
align-items: center;
justify-content: center;
.status-icon img {
width: 56px;
width: 56px;
}
}
.split {
width: 1px;
height: 80px;
background-color: rgb(192,192,192);
background-color: rgb(192, 192, 192);
margin-right: 10px;
}
@ -64,27 +88,38 @@ const onClickTubeItem = (idx) => {
}
@op-bar-height: 68px;
.test-tube-rack-op {
height: @op-bar-height;
background-color: rgb(235,235,235);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 40px;
height: @op-bar-height;
background-color: rgb(235, 235, 235);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 40px;
font-size: 22px;
font-weight: 600;
font-size: 22px;
font-weight: 600;
&.active {
color: #999;
.rack-op {
align-self: stretch;
line-height: @op-bar-height;
&.rack-del {
display: flex;
align-items: center;
img {
width: 20px;
margin-right: 8px;
}
color: red;
}
&.rack-del {
color: #999;
}
}
}
.rack-op {
align-self: stretch;
line-height: @op-bar-height;
&.rack-edit {
color: #999;
}
&.rack-del {
display: flex;
align-items: center;
img {
width: 20px;
margin-right: 8px;
}
color: red;
}
}
}
</style>

2
src/services/Index/index.ts

@ -1,7 +1,7 @@
export * from './regular'
export * from './emergency'
export * from './history'
export * from './Test-tube/test-tube'
export * from './testTube'
export * from './user-manage'
export * from './idCard'
export * from './init'

7
src/services/Index/Test-tube/test-tube.ts → src/services/Index/testTube.ts

@ -1,5 +1,5 @@
import apiClient from '../../../utils/axios'
import type { TubeActivationStatus, TubeSetting } from '../../../types/Index'
import apiClient from '../../utils/axios'
import type { TubeActivationStatus, TubeSetting } from '../../types/Index'
/*
"data": [
{
@ -88,7 +88,8 @@ export const updateTubeActivationStatus = async (
try {
const res = await apiClient.post(
'/api/v1/app/appTubeSettingMgr/updateActiveState',
data,
null,
{ params: data },
)
return res.data
} catch (error) {
Loading…
Cancel
Save