/#/production/cell-product → 列表「查看」→「来源链路」GET /web/admin/cell-products/{product_id}/chainbackend/app/crud/cell_product.py(get_product_chain)前端 hasChainGraphContent 要求 ancestors 或 descendants 非空。
| 场景 | 条件 |
|---|---|
| 向上(祖先) | 产品有 production_task_id,且该任务投入物能追到 样本 或 父级细胞产品 |
| 向下(后代) | 其它任务 input_type=cell_product 引用了本产品,并有产出物 |
仅当前产品、上下游都为空时,显示「该产品暂无来源及衍生链路信息」。
祖先链样本节点 仅查询 biz_protocol_sample。科研捐赠样本在 biz_research_donation_sample,工单 protocol_sample_id 存的是捐赠样本 ID,导致捐赠路径产品 ancestors 为空。
任务存在 input_type=sample 的投入物时:
reception_source=research_donation → 优先查 biz_research_donation_sample(input_id / input_code / 工单 protocol_sample_id)biz_protocol_sample(同上,并带 tenant_no)捐赠样本节点:
receptionSource = research_donationprotocolNo = 工单上的捐赠单号(donation_no)collectionProtocolId = research_donation_id(供扩展;客户信息由 biz_research_donation_party 填充)customer 来自捐赠当事人表,不依赖 采集协议接口sample_code 一致;input_id 可为空)。protocol_sample_id / sample_code 兜底解析。sample / cell_product 投入,产出 1 个细胞产品。reception_source。cd backend && source venv/bin/activate && python -m pytest tests/test_cell_product_chain.py -v
覆盖:捐赠样本按编码解析、工单样本 ID 兜底、捐赠节点字段。
docs/superpowers/specs/2026-05-24-cell-product-source-chain-design.md