From e3cb827f0049135166f6fe554368f90eeecf432d Mon Sep 17 00:00:00 2001 From: zhangjiming Date: Thu, 9 Jan 2025 14:30:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=AF=95=E7=AE=A1?= =?UTF-8?q?=E6=9E=B6=E5=9B=BE=E6=A0=87=EF=BC=8C=E5=BD=93=E5=89=8D=E5=B7=B2?= =?UTF-8?q?=E9=A2=84=E8=AE=A2=E9=A1=B9=E7=9B=AE=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icon_cross.svg | 3 ++ src/pages/Index/Regular/TestTube.vue | 34 ++++++++++++++++++++-- .../components/Running/EmergencyResultDialog.vue | 4 +-- .../Index/components/TestTube/TestTubeRack.vue | 14 ++++++++- 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/assets/icon_cross.svg diff --git a/src/assets/icon_cross.svg b/src/assets/icon_cross.svg new file mode 100644 index 0000000..955e969 --- /dev/null +++ b/src/assets/icon_cross.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/Index/Regular/TestTube.vue b/src/pages/Index/Regular/TestTube.vue index 3b1a0f7..c8cb72d 100644 --- a/src/pages/Index/Regular/TestTube.vue +++ b/src/pages/Index/Regular/TestTube.vue @@ -36,7 +36,9 @@ @click="clickProjectItem(proj)" > {{ proj.projName }} - {{ proj.num }} + {{ + `${projIdCntMap[proj.projId] || 0}/${proj.num}` + }} @@ -159,6 +161,31 @@ const projectsAvailable = computed(() => { return projArr }) + +const projIdCntMap = computed(() => { + return R.reduce( + (acc, curr) => { + const projIdCntRack = R.reduce( + (ac, cur) => { + cur.projId.forEach((pId) => { + ac[pId] = (ac[pId] || 0) + 1 + }) + return ac + }, + {}, + curr.tubeSettings, + ) + + Object.keys(projIdCntRack).forEach((k) => { + acc[k] = (acc[k] || 0) + projIdCntRack[k] + }) + return acc + }, + {}, + tubeRacks.value, + ) +}) + const getBloodTypeData = async () => { loading.value = true const res = await getBloodTypes() @@ -443,7 +470,7 @@ const updateTubeSettingsHandler = async (rackIdx, tubeIdx) => { display: flex; .project-item { border-radius: 8px; - padding: 6px 10px; + padding: 4px 10px; margin-right: 8px; display: flex; flex-direction: column; @@ -451,6 +478,7 @@ const updateTubeSettingsHandler = async (rackIdx, tubeIdx) => { min-width: 50px; .proj-name { font-weight: 600; + font-size: 1.2rem; } } } @@ -466,6 +494,8 @@ const updateTubeSettingsHandler = async (rackIdx, tubeIdx) => { padding: 10px; margin-right: 8px; color: @active-color; + font-weight: 600; + font-size: 1.2rem; &.active { color: #fff; background-color: @active-color; diff --git a/src/pages/Index/components/Running/EmergencyResultDialog.vue b/src/pages/Index/components/Running/EmergencyResultDialog.vue index f03f360..0abeb24 100644 --- a/src/pages/Index/components/Running/EmergencyResultDialog.vue +++ b/src/pages/Index/components/Running/EmergencyResultDialog.vue @@ -42,11 +42,11 @@ defineProps({ result: { type: Object, - required: true, + // required: true, }, visible: { type: Boolean, - required: true, + // required: true, }, }) diff --git a/src/pages/Index/components/TestTube/TestTubeRack.vue b/src/pages/Index/components/TestTube/TestTubeRack.vue index 645e23a..bb76c72 100644 --- a/src/pages/Index/components/TestTube/TestTubeRack.vue +++ b/src/pages/Index/components/TestTube/TestTubeRack.vue @@ -18,7 +18,10 @@
修改试管架
编辑患者信息
-
删除试管架
+
+ del + 删除试管架 +
@@ -73,6 +76,15 @@ const onClickTubeItem = (idx) => { .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; + } } } From adebabd5fea47dd31a782997e2b707468a1db71b Mon Sep 17 00:00:00 2001 From: zhangjiming Date: Thu, 9 Jan 2025 15:56:05 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icon_cross_gray.svg | 3 + src/pages/Index/Regular/TestTube.vue | 148 +++++++-------------- .../Index/components/TestTube/TestTubeRack.vue | 97 +++++++++----- src/services/Index/Test-tube/test-tube.ts | 114 ---------------- src/services/Index/index.ts | 2 +- src/services/Index/testTube.ts | 115 ++++++++++++++++ 6 files changed, 234 insertions(+), 245 deletions(-) create mode 100644 src/assets/icon_cross_gray.svg delete mode 100644 src/services/Index/Test-tube/test-tube.ts create mode 100644 src/services/Index/testTube.ts diff --git a/src/assets/icon_cross_gray.svg b/src/assets/icon_cross_gray.svg new file mode 100644 index 0000000..13096d2 --- /dev/null +++ b/src/assets/icon_cross_gray.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/Index/Regular/TestTube.vue b/src/pages/Index/Regular/TestTube.vue index c8cb72d..afc507d 100644 --- a/src/pages/Index/Regular/TestTube.vue +++ b/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" /> @@ -31,8 +32,8 @@
{{ proj.projName }} @@ -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 - 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([]) // - -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 = { diff --git a/src/pages/Index/components/TestTube/TestTubeRack.vue b/src/pages/Index/components/TestTube/TestTubeRack.vue index bb76c72..d6a8056 100644 --- a/src/pages/Index/components/TestTube/TestTubeRack.vue +++ b/src/pages/Index/components/TestTube/TestTubeRack.vue @@ -1,9 +1,13 @@ - - diff --git a/src/pages/Index/TestTube/TubeUserId.vue b/src/pages/Index/TestTube/TubeUserId.vue new file mode 100644 index 0000000..8a45f1c --- /dev/null +++ b/src/pages/Index/TestTube/TubeUserId.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/src/pages/Index/components/TestTube/TestTubeRack.vue b/src/pages/Index/components/TestTube/TestTubeRack.vue index d6a8056..28e1100 100644 --- a/src/pages/Index/components/TestTube/TestTubeRack.vue +++ b/src/pages/Index/components/TestTube/TestTubeRack.vue @@ -30,7 +30,7 @@ :class="{ active: tubeRack.state !== 'INACTIVE' }" >
修改试管架
-
编辑患者信息
+
编辑患者信息
import Tube from './Tube.vue' const props = defineProps(['tubeRack', 'index', 'projects', 'bloodTypes']) -const emit = defineEmits(['delete:rack', 'active:rack', 'clickTubeItem']) +const emit = defineEmits(['delete:rack', 'active:rack','patient:edit', 'clickTubeItem']) const onClickTubeItem = (idx) => { emit('clickTubeItem', props.index, idx) diff --git a/src/pages/Index/components/TestTube/Tube.vue b/src/pages/Index/components/TestTube/Tube.vue index b95a394..861cf78 100644 --- a/src/pages/Index/components/TestTube/Tube.vue +++ b/src/pages/Index/components/TestTube/Tube.vue @@ -1,6 +1,6 @@ @@ -34,7 +34,21 @@ tube: {userid,projId:number[],bloodType} projects: [{projId,projName,color}] bloodTypes: [{key,name}] */ -const props = defineProps(['tube', 'index', 'projects', 'bloodTypes']) +const props = defineProps({ + tube: { + type: Object, + }, + index: { + type: Number, + }, + projects: { + type: Array, + }, + bloodTypes: { + type: Array, + }, + showNum: { type: Boolean, default: true }, +}) const emit = defineEmits(['clickTubeItem']) const projIdMap = computed(() => { @@ -108,37 +122,43 @@ function drawPieChart(ctx, data) {