From 0597029a84b135a0531df411baf12ba46cbe58c9 Mon Sep 17 00:00:00 2001 From: Andy6M Date: Thu, 15 Jan 2026 12:17:29 +0800 Subject: [PATCH] feat: Integrate material search logic and cleanup deprecated files - Update coin_cell_assembly.py with material search dialog handling - Update YB_warehouses.py with latest warehouse configurations - Remove outdated documentation and test data files --- unilabos/devices/workstation/README.md | 4 - .../bioyond_cell/20260108_multi_batch1.xlsx | Bin 10380 -> 0 bytes .../bioyond_cell/20260108_multi_batch2.xlsx | Bin 10367 -> 0 bytes .../bioyond_cell/outbound_template.xlsx | Bin 0 -> 9125 bytes .../bioyond_cell/smiles&molweight.py | 12 -- .../bioyond_cell/solid_materials.csv | 7 - .../bioyond_cell/批量出库模板使用说明.md | 157 ++++++++++++++++++ .../coin_cell_assembly_20260112.xlsx | Bin 18578 -> 0 bytes 8 files changed, 157 insertions(+), 23 deletions(-) delete mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch1.xlsx delete mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch2.xlsx create mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/outbound_template.xlsx delete mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/smiles&molweight.py delete mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/solid_materials.csv create mode 100644 unilabos/devices/workstation/bioyond_studio/bioyond_cell/批量出库模板使用说明.md delete mode 100644 unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly_20260112.xlsx diff --git a/unilabos/devices/workstation/README.md b/unilabos/devices/workstation/README.md index f96ed7f..1c38f40 100644 --- a/unilabos/devices/workstation/README.md +++ b/unilabos/devices/workstation/README.md @@ -1,9 +1,5 @@ # 工作站抽象基类物料系统架构说明 -## 设计理念 - -基于用户需求"请你帮我系统思考一下,工作站抽象基类的物料系统基类该如何构建",我们最终确定了一个**PyLabRobot Deck为中心**的简化架构。 - ### 核心原则 1. **PyLabRobot为物料管理核心**:使用PyLabRobot的Deck系统作为物料管理的基础,利用其成熟的Resource体系 diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch1.xlsx b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch1.xlsx deleted file mode 100644 index 3bd3439954b0fd2a9f47bff32832ab6f4c081d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10380 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 Mg2u)=n%{o?KY37~>Hq)$ diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch2.xlsx b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/20260108_multi_batch2.xlsx deleted file mode 100644 index 9ed74ec2a5cedd89b0be49d6b51f41bbe3e647ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10367 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 diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/outbound_template.xlsx b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/outbound_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f2c42f25a4b0951ab506851ed038cff7acc45936 GIT binary patch literal 9125 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 R000&G354cxEUMpr{T~X}>jD4( literal 0 HcmV?d00001 diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/smiles&molweight.py b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/smiles&molweight.py deleted file mode 100644 index 195e87a..0000000 --- a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/smiles&molweight.py +++ /dev/null @@ -1,12 +0,0 @@ -import pubchempy as pcp - -cas = "21324-40-3" # 示例 -comps = pcp.get_compounds(cas, namespace="name") -if not comps: - raise ValueError("No hit") - -c = comps[0] - -print("Canonical SMILES:", c.canonical_smiles) -print("Isomeric SMILES:", c.isomeric_smiles) -print("MW:", c.molecular_weight) diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/solid_materials.csv b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/solid_materials.csv deleted file mode 100644 index 8db9a5c..0000000 --- a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/solid_materials.csv +++ /dev/null @@ -1,7 +0,0 @@ -material_name -LiPF6 -LiDFOB -DTD -LiFSI -LiPO2F2 - diff --git a/unilabos/devices/workstation/bioyond_studio/bioyond_cell/批量出库模板使用说明.md b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/批量出库模板使用说明.md new file mode 100644 index 0000000..5d11c7b --- /dev/null +++ b/unilabos/devices/workstation/bioyond_studio/bioyond_cell/批量出库模板使用说明.md @@ -0,0 +1,157 @@ +# 批量出库 Excel 模板使用说明 + +**文件**: `outbound_template.xlsx` +**用途**: 配合 `auto_batch_outbound_from_xlsx()` 方法进行批量出库操作 +**API 端点**: `/api/lims/storage/auto-batch-out-bound` + +--- + +## 📋 Excel 列说明 + +| 列名 | 说明 | 示例 | 必填 | +|------|------|------|------| +| `locationId` | **库位 ID(UUID)** | `3a19da43-57b5-294f-d663-154a1cc32270` | ✅ 是 | +| `warehouseId` | **仓库 ID 或名称** | `配液站内试剂仓库` | ✅ 是 | +| `quantity` | **出库数量** | `1.0`, `2.0` | ✅ 是 | +| `x` | **X 坐标(库位横向位置)** | `1`, `2`, `3` | ✅ 是 | +| `y` | **Y 坐标(库位纵向位置)** | `1`, `2`, `3` | ✅ 是 | +| `z` | **Z 坐标(库位层数/高度)** | `1`, `2`, `3` | ✅ 是 | +| `备注说明` | 可选备注信息 | `配液站内试剂仓库-A01` | ❌ 否 | + +### 📐 坐标说明 + +**x, y, z** 是库位在仓库内的**三维坐标**: + +``` +仓库(例如 WH4) +├── Z=1(第1层/加样头面) +│ ├── X=1, Y=1(位置 A) +│ ├── X=2, Y=1(位置 B) +│ ├── X=3, Y=1(位置 C) +│ └── ... +│ +└── Z=2(第2层/原液瓶面) + ├── X=1, Y=1(位置 A) + ├── X=2, Y=1(位置 B) + └── ... +``` + +- **warehouseId**: 指定哪个仓库(WH3, WH4, 配液站等) +- **x, y, z**: 在该仓库内的三维坐标 +- **locationId**: 该坐标位置的唯一 UUID + +### 🎯 起点与终点 + +**重要说明**:批量出库模板**只规定了出库的"起点"**(从哪里取物料),**没有指定"终点"**(放到哪里)。 + +``` +出库流程: +起点(Excel 指定) → ?终点(LIMS/工作流决定) + ↓ +locationId, x, y, z → 由 LIMS 系统或当前工作流自动分配 +``` + +**终点由以下方式确定:** +- **LIMS 系统自动分配**:根据当前任务自动规划目标位置 +- **工作流预定义**:在创建出库任务时已绑定目标位置 +- **暂存区**:默认放到出库暂存区,等待下一步操作 + +💡 **对比**:上料操作(`auto_feeding4to3`)则有 `targetWH` 参数可以指定目标仓库 + +--- + +## 🔍 如何获取 UUID? + +### 方法 1:从配置文件获取 + +参考 `yibin_electrolyte_config.json` 中的 `warehouse_mapping`: + +```json +{ + "warehouse_mapping": { + "配液站内试剂仓库": { + "site_uuids": { + "A01": "3a19da43-57b5-294f-d663-154a1cc32270", + "B01": "3a19da43-57b5-7394-5f49-54efe2c9bef2", + "C01": "3a19da43-57b5-5e75-552f-8dbd0ad1075f" + } + }, + "手动堆栈": { + "site_uuids": { + "A01": "3a19deae-2c7a-36f5-5e41-02c5b66feaea", + "A02": "3a19deae-2c7a-dc6d-c41e-ef285d946cfe" + } + } + } +} +``` + +### 方法 2:通过 API 查询 + +```python +material_info = hardware_interface.material_id_query(workflow_id) +locations = material_info.get("locations", []) +``` + +--- + +## 📝 填写示例 + +### 示例 1:从配液站内试剂仓库出库 + +| locationId | warehouseId | quantity | x | y | z | 备注说明 | +|------------|-------------|----------|---|---|---|----------| +| `3a19da43-57b5-294f-d663-154a1cc32270` | 配液站内试剂仓库 | 1 | 1 | 1 | 1 | A01 位置 | +| `3a19da43-57b5-7394-5f49-54efe2c9bef2` | 配液站内试剂仓库 | 2 | 2 | 1 | 1 | B01 位置 | + +### 示例 2:从手动堆栈出库 + +| locationId | warehouseId | quantity | x | y | z | 备注说明 | +|------------|-------------|----------|---|---|---|----------| +| `3a19deae-2c7a-36f5-5e41-02c5b66feaea` | 手动堆栈 | 1 | 1 | 1 | 1 | A01 | +| `3a19deae-2c7a-dc6d-c41e-ef285d946cfe` | 手动堆栈 | 1 | 1 | 2 | 1 | A02 | + +--- + +## 💻 使用方法 + +```python +from bioyond_cell_workstation import BioyondCellWorkstation + +# 初始化工作站 +workstation = BioyondCellWorkstation(config=config, deck=deck) + +# 调用批量出库方法 +result = workstation.auto_batch_outbound_from_xlsx( + xlsx_path="outbound_template.xlsx" +) +``` + +--- + +## ⚠️ 注意事项 + +1. **locationId 必须是有效的 UUID**,不能使用库位名称 +2. **x, y, z 坐标必须与 locationId 对应**,表示该库位在仓库内的位置 +3. **quantity 必须是数字**,可以是整数或浮点数 +4. Excel 文件必须包含表头行 +5. 空行会被自动跳过 +6. 确保 UUID 与实际库位对应,否则 API 会报错 + +--- + +## 📚 相关文件 + +- **配置文件**: `yibin_electrolyte_config.json` +- **Python 代码**: `bioyond_cell_workstation.py` (L630-695) +- **生成脚本**: `create_outbound_template.py` +- **上料模板**: `material_template.xlsx` + +--- + +## 🔄 重新生成模板 + +```bash +conda activate newunilab +python create_outbound_template.py +``` diff --git a/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly_20260112.xlsx b/unilabos/devices/workstation/coin_cell_assembly/coin_cell_assembly_20260112.xlsx deleted file mode 100644 index d9131f1641e39258cc3f826a3ea8e25f1c57e27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18578 zcmeIa1AAr7wl=)tj%{^pt7F^f*tV^X-LY+V)UnNuZJQlC@9Jmo^X%DRTj!!1Dih{V(o;%EU3bK1L+b2Z>kVJvyniI)P7Y=K(_~)QWuF z{RxBRMq1ex79ZK+FGxap=$0I{D3fbm%)iIY>uhZr1HuN|l;9%$hr7S(;&Lzy44sj6 zVPeNSYHD2OqTvcKVe9FAH_ZT~IyChuv5IU9N>$>Rqhs*-?PjeEsUmLBG1V| z9pGCsJktE7TmIY#&)c?m8fp(*^zj4j9{ITSrdtSUq??G;C-i)4_?X-4Y-(RC@Zxv! z@i*poNC4pD0}P<>A7>k0 zF~WshO1y>+Kg_SkA_+;m2}-mPsrdRyt|2yjFCfKT@1np%Qo#uX6aUuX`#QS1&h!0b znCO0owK5U~jhm#=?MFz;vx5s1HMwK5m_y}uKeFrm-TZx;xReK_Yex)qMRRGM^vEWO z*z9kSTBJ#OH5_QvBD@d`-ZX#BL0OFr!^bL+c_HQVA0ahO9Jwb6lNsL@lZ%hx`NKG6 z&Suikhn)<~maDvnt%>fQaK0*=b6V6GW;=2bd*~Tkci)I)bfLa^)5&EHD-pAzJTgy; z50T~GebcOG{XLfD(a!c z8QR%d{fS$JUj^-E8PPgPeiIVsY;6t5CDeaU&SSF~DDz*GSXw0kqje z)W}Z;VcBQ!4p16J1|GeIqaI;$?%@|U>zxgpYR~57b8!#=5A6K8RN|U*W;u_+QTVS{ zc(g1x9BiL~vwQTU^)-s+Ee?Lhn@7&Ken9eJ8O zPBe@oSnuGt0g#Mj5>us$8D^0{eVI=iCbLWqSCdUSiWq~gRH)?vF-+Z0k@1A1Z z7?NMy@OIq$3v|5QWGLV7kI!Dl9{4wWu|CKR8+Dn!5gB1D*47ezk%mgX{00g0I@Kdp zPEtVUzIl8p)JpKvNP<9uw59YMe;C0=_F5gv*>U9*?&aJj#SjJF`^>YC{sJKc&CN&X zt#tO{Hl)vNE9yQ_y>_$^v$Zr&crW17f(+u4p-CQTsfeTKZlbn!bM^<8YNJ_0p9|C) zrnjyxRjICKBv>4UB>}MvwDVNL>6nKR4^p_KU;y1vpp@3d`r!^E#NeF6scdOtx<;6s z7IM)vBhD7R1J{yEDDT>-xDL-%dor#~o2}OtTh!SmC0hqZDcjE^jyq(UIC(?*{h%bW z$>M8cA^Z{uole_dvU71ofzJvZ2~*@1G?}R*STKdzCy0_p+Hap4eg8*O@#jlSxdEC; zE6`kU0G~jBrt*)F^6v)oU*QD=INJkq`QLq2D#=RsGa_}szK1fpWw@dvFFP|3pM5<= z{4`QewMtIJ;(NP^OWmrYz97v2W*6ddIX>k2z=p5`hI-dSQyPH+?ulxB$qivQelrgC z$?*IKL4Y^}D$3c(X~j7#Lb?-b3t#*&Z8qAMgGWj-?9hT@Vv*aHnGjaX2}T!YOQ$LP zQJ{MrtKai`4pKh*5m4XM^f{f%bpNA8c=aAKC%}Vn`UV?Xk_X-cFnu&fMDy4qdjILV z{nb>~W5TMZ;2CZouR@xjoQ>Bz#QAgRusGp2s(7dU{Is^Om)p)lFQZgltJkz+x0j}S zBSZ6>z>)s%-c>ySN&gEL0FaRb001BV! zz7*lY^x$ziwJD`qU%$?u{&XPMx4|oE)DZak;YD#!M?>T?E!9m*ddO`?p0IqU+OP*5 zmDEZ@1xqZIi`tsJURTK9sa60@w(z^^;KxO7A$QH~^T}J=vRHl@vbQaz5Xp1jS zh-#&P1MU$4SNn{4L35w-PdFPpzeU}`6~^d%S`}?qXZh50X{=U@LO*W01sJZTP%QJ7 zzE@W=FRwx>2WUBmo8}8~p$Yrft{uxvn-;nQ{pT^{B475#K zlU*b~MCQF63D=8ARLOo*wv5<{-8{PT87}*zt2(eUM4T{mq|c+|Tuq@fO(i-{6z6ED zPF-0Za2%BcefM#Y!PD~�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