feat: expose lineage QC API and wire viewer in outbound material dialog
Add GET /cell-products/{id}/lineage-qc, frontend client, readonly dialog,
and a 查看质检 action on outbound cell rows.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
40d93934a9
commit
33c4408557
4 files changed
+372
-10
No files matched your search
+44
-10
@@ -21,10 +21,22 @@
|
||||
<span class="material-summary-label">申请单号</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.applicationNo || '—' }}</span>
|
||||
</div>
|
||||
<div class="material-summary-row">
|
||||
<span class="material-summary-label">患者姓名</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.patientName || '—' }}</span>
|
||||
</div>
|
||||
<template v-if="showPatient">
|
||||
<div class="material-summary-row">
|
||||
<span class="material-summary-label">患者姓名</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.patientName || '—' }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="material-summary-row">
|
||||
<span class="material-summary-label">课题名称</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.projectTitle || '—' }}</span>
|
||||
</div>
|
||||
<div class="material-summary-row">
|
||||
<span class="material-summary-label">客户名称</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.customerName || '—' }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<div class="material-summary-row">
|
||||
<span class="material-summary-label">{{ pickupTimeLabel }}</span>
|
||||
<span class="material-summary-value">{{ scheduleSummary.infusionTime || '—' }}</span>
|
||||
@@ -99,12 +111,16 @@
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
min-width="100"
|
||||
min-width="200"
|
||||
align="center"
|
||||
header-align="center"
|
||||
fixed="right"
|
||||
>
|
||||
<template #default="{ $index }">
|
||||
<template #default="{ row, $index }">
|
||||
<el-button type="primary" link @click="openLineageQc(row)">
|
||||
<el-icon><View /></el-icon>
|
||||
查看质检
|
||||
</el-button>
|
||||
<el-button type="danger" link @click="removeCellRow($index)">
|
||||
<el-icon><Delete /></el-icon>
|
||||
删除
|
||||
@@ -406,6 +422,8 @@
|
||||
/>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<CellProductLineageQcDialog v-model="lineageQcVisible" :product-id="lineageQcProductId" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -434,6 +452,7 @@
|
||||
import { cellProductStatusLabel, cellProductStatusTagType } from '@/utils/status-tag-registry'
|
||||
import { resolveCellProductSpecDisplay } from '@/utils/cell-product-spec'
|
||||
import { getPilotBizConfig, resolvePilotBizType } from '@/config/pilot-biz-type'
|
||||
import CellProductLineageQcDialog from '@/components/business/cell-product-lineage-qc-dialog/index.vue'
|
||||
|
||||
type AttachmentLike = {
|
||||
fileName?: string
|
||||
@@ -473,13 +492,15 @@
|
||||
scheduleSummary?: {
|
||||
applicationNo?: string
|
||||
patientName?: string
|
||||
projectTitle?: string
|
||||
customerName?: string
|
||||
infusionTime?: string
|
||||
}
|
||||
}>()
|
||||
|
||||
const pickupTimeLabel = computed(
|
||||
() => getPilotBizConfig(resolvePilotBizType(props.bizType)).pickupTimeLabel
|
||||
)
|
||||
const bizConfig = computed(() => getPilotBizConfig(resolvePilotBizType(props.bizType)))
|
||||
const pickupTimeLabel = computed(() => bizConfig.value.pickupTimeLabel)
|
||||
const showPatient = computed(() => bizConfig.value.showPatient)
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:modelValue', val: boolean): void
|
||||
@@ -504,6 +525,9 @@
|
||||
const previewUrl = ref('')
|
||||
const previewType = ref<'image' | 'video'>('image')
|
||||
|
||||
const lineageQcVisible = ref(false)
|
||||
const lineageQcProductId = ref('')
|
||||
|
||||
const minioBaseUrl = (import.meta.env.VITE_MINIO_BASE_URL || '').replace(/\/$/, '')
|
||||
|
||||
let paperRowSeq = 0
|
||||
@@ -608,6 +632,16 @@
|
||||
cellRows.value.splice(index, 1)
|
||||
}
|
||||
|
||||
function openLineageQc(row: OutboundReleaseCellRow) {
|
||||
const id = String(row.cellProductId || '')
|
||||
if (!id) {
|
||||
ElMessage.warning('缺少细胞产品信息')
|
||||
return
|
||||
}
|
||||
lineageQcProductId.value = id
|
||||
lineageQcVisible.value = true
|
||||
}
|
||||
|
||||
function isCellRowSelectable(row: Record<string, any>) {
|
||||
const ids = new Set(cellRows.value.map((c) => c.cellProductId))
|
||||
return !ids.has(row.id)
|
||||
@@ -807,7 +841,7 @@
|
||||
border-radius: 8px;
|
||||
border: 1px solid #e2e8f0;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: 8px 20px;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user