diff --git a/backend/app/api/production.py b/backend/app/api/production.py index 0d61af07..b56074ec 100644 --- a/backend/app/api/production.py +++ b/backend/app/api/production.py @@ -2800,6 +2800,19 @@ async def get_cell_product_chain( return success_response(chain) +@router.get("/cell-products/{product_id}/lineage-qc") +async def get_cell_product_lineage_qc( + product_id: str, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + data = cell_product_svc.get_product_lineage_qc(db, product_id, tenant_no) + if not data: + raise HTTPException(status_code=404, detail="细胞产品不存在") + return success_response(data) + + @router.post("/cell-products") async def create_cell_product( body: CellProductCreate, diff --git a/web-admin/src/api/cell-product.ts b/web-admin/src/api/cell-product.ts index cdfa371c..11cd1402 100644 --- a/web-admin/src/api/cell-product.ts +++ b/web-admin/src/api/cell-product.ts @@ -76,3 +76,54 @@ export function fetchCheckCellProductCode(productCode: string, excludeId?: strin export function fetchCellProductChain(productId: string) { return request.get({ url: `/web/admin/cell-products/${productId}/chain` }) } + +export type CellProductLineageQcTask = { + id?: string + taskNo?: string + itemName?: string + itemCode?: string + taskType?: string + taskStatus?: string + taskStatusLabel?: string + conclusion?: string + conclusionLabel?: string + remark?: string + completedTime?: string + companyName?: string + results?: Array<{ paramName?: string; paramValue?: string; paramUnit?: string }> + attachmentFiles?: Array<{ fileName?: string; fileUrl?: string; fileType?: string }> +} + +export type CellProductLineageQcWorkOrder = { + id?: string + workOrderNo?: string + workOrderType?: string + workOrderStatus?: string + workOrderStatusLabel?: string + tasks?: CellProductLineageQcTask[] +} + +export type CellProductLineageQcNode = { + nodeType?: 'sample' | 'cell_product' | string + id?: string + label?: string + productName?: string + passage?: string | null + receptionSource?: string | null + receptionSourceLabel?: string | null + isCurrent?: boolean + workOrders?: CellProductLineageQcWorkOrder[] +} + +export type CellProductLineageQc = { + productId?: string + productCode?: string + productName?: string + nodes?: CellProductLineageQcNode[] +} + +export function fetchCellProductLineageQc(productId: string) { + return request.get({ + url: `/web/admin/cell-products/${productId}/lineage-qc` + }) +} diff --git a/web-admin/src/components/business/cell-product-lineage-qc-dialog/index.vue b/web-admin/src/components/business/cell-product-lineage-qc-dialog/index.vue new file mode 100644 index 00000000..239fe861 --- /dev/null +++ b/web-admin/src/components/business/cell-product-lineage-qc-dialog/index.vue @@ -0,0 +1,264 @@ + + + + + + + diff --git a/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue b/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue index 3b713387..b7d72f62 100644 --- a/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue +++ b/web-admin/src/views/pilot-service/outbound-release-review/OutboundReleaseMaterialDialog.vue @@ -21,10 +21,22 @@ 申请单号 {{ scheduleSummary.applicationNo || '—' }} -
- 患者姓名 - {{ scheduleSummary.patientName || '—' }} -
+ +
{{ pickupTimeLabel }} {{ scheduleSummary.infusionTime || '—' }} @@ -99,12 +111,16 @@ -