Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
ca84915
更新Bioyond工作站配置,添加新的物料类型映射和载架定义,优化物料查询逻辑
ZiWei09 Oct 29, 2025
df6bcab
添加Bioyond实验配置文件,定义物料类型映射和设备配置
ZiWei09 Oct 29, 2025
b41bb1e
更新bioyond_warehouse_reagent_stack方法,修正试剂堆栈尺寸和布局描述
ZiWei09 Oct 30, 2025
77d55bf
更新Bioyond实验配置,修正物料类型映射,优化设备配置
ZiWei09 Oct 30, 2025
f7bcee5
更新Bioyond资源同步逻辑,优化物料入库流程,增强错误处理和日志记录
ZiWei09 Oct 30, 2025
a3a21f8
更新Bioyond资源,添加配液站和反应站专用载架,优化仓库工厂函数的排序方式
ZiWei09 Oct 30, 2025
b7656ba
更新Bioyond资源,添加配液站和反应站相关载架,优化试剂瓶和样品瓶配置
ZiWei09 Oct 30, 2025
fae1780
更新Bioyond实验配置,修正试剂瓶载架ID,确保与设备匹配
ZiWei09 Oct 30, 2025
8bbbd09
更新Bioyond资源,移除反应站单烧杯载架,添加反应站单烧瓶载架分类
ZiWei09 Oct 30, 2025
5cf0209
Refactor Bioyond resource synchronization and update bottle carrier d…
ZiWei09 Oct 30, 2025
cc82c8d
更新Bioyond仓库工厂,添加排序方式支持,优化坐标计算逻辑
ZiWei09 Oct 30, 2025
ec1c8e7
更新Bioyond载架和甲板配置,调整样品板尺寸和仓库坐标
ZiWei09 Oct 30, 2025
02f26d8
更新Bioyond资源同步,增强占用位置日志信息,修正坐标转换逻辑
ZiWei09 Oct 30, 2025
4a44157
更新Bioyond反应站和分配站配置,调整材料类型映射和ID,移除不必要的项
ZiWei09 Oct 30, 2025
ddae839
support name change during materials change
Xuwznln Oct 31, 2025
30a3ad6
fix json dumps
Xuwznln Oct 31, 2025
1316c0d
correct tip
Xuwznln Oct 31, 2025
515dc9b
优化调度器API路径,更新相关方法描述
ZiWei09 Nov 5, 2025
1584dd2
更新 BIOYOND 载架相关文档,调整 API 以支持自带试剂瓶的载架类型,修复资源获取时的子物料处理逻辑
ZiWei09 Nov 5, 2025
db1227e
实现资源删除时的同步处理,优化出库操作逻辑
ZiWei09 Nov 5, 2025
3f7319b
修复 ItemizedCarrier 中的可见性逻辑
ZiWei09 Nov 5, 2025
1bd115c
保存 Bioyond 原始信息到 unilabos_extra,以便出库时查询
ZiWei09 Nov 6, 2025
585eb06
根据 resource.capacity 判断是试剂瓶(载架)还是多瓶载架,走不同的奔曜转换
TablewareBox Nov 6, 2025
de5c7bd
Fix bioyond bottle_carriers ordering
TablewareBox Nov 6, 2025
0de983d
优化 Bioyond 物料同步逻辑,增强坐标解析和位置更新处理
ZiWei09 Nov 6, 2025
7f86d4f
disable slave connect websocket
Xuwznln Nov 7, 2025
1630394
correct remove_resource stats
Xuwznln Nov 7, 2025
10ee017
change uuid logger to trace level
Xuwznln Nov 7, 2025
309137d
enable slave mode
Xuwznln Nov 7, 2025
a6f25d8
refactor(bioyond): 统一资源命名并优化物料同步逻辑
ZiWei09 Nov 8, 2025
1000834
feat(warehouses): 为仓库函数添加col_offset和layout参数
ZiWei09 Nov 8, 2025
9c9cf86
refactor: 更新实验配置中的物料类型映射命名
ZiWei09 Nov 9, 2025
d84ece5
fix: 更新实验配置中的载体名称从6VialCarrier到6StockCarrier
ZiWei09 Nov 9, 2025
6587c0d
feat(bioyond): 实现物料创建与入库分离逻辑
ZiWei09 Nov 11, 2025
f97175d
fix(reaction_station): 修正液体进料烧杯体积单位并增强返回结果
ZiWei09 Nov 11, 2025
314ad48
feat(dispensing_station): 在任务创建返回结果中添加order_params信息
ZiWei09 Nov 11, 2025
7c01821
fix(dispensing_station): 修改90%物料分配逻辑从分成3份改为直接使用
ZiWei09 Nov 12, 2025
bd50534
feat(bioyond): 添加任务编码和任务ID的输出,支持批量任务创建后的状态监控
ZiWei09 Nov 13, 2025
46dcbd0
refactor(registry): 简化设备配置中的任务结果处理逻辑
ZiWei09 Nov 13, 2025
c007257
feat(工作站): 添加HTTP报送服务和任务完成状态跟踪
ZiWei09 Nov 13, 2025
b6a8d86
refactor(dispensing_station): 移除wait_for_order_completion_and_get_rep…
ZiWei09 Nov 13, 2025
7acbe7c
fix: 更新任务报告API错误
ZiWei09 Nov 13, 2025
632955f
fix(workstation_http_service): 修复状态查询中device_id获取逻辑
ZiWei09 Nov 13, 2025
e1a5a57
fix(bioyond_studio): 改进物料入库失败时的错误处理和日志记录
ZiWei09 Nov 14, 2025
0bd211e
refactor(bioyond): 优化瓶架载体的分配逻辑和注释说明
ZiWei09 Nov 14, 2025
66bdc26
fix(bioyond_rpc): 修复物料入库成功时无data字段返回空的问题
ZiWei09 Nov 14, 2025
dd73c45
Merge branch 'dev' into HR
Xuwznln Nov 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions test/experiments/ICCAS506.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
{
"nodes": [
{
"id": "dispensing_station_bioyond",
"name": "dispensing_station_bioyond",
"children": [
"Bioyond_Dispensing_Deck"
],
"parent": null,
"type": "device",
"class": "bioyond_dispensing_station",
"config": {
"config": {
"api_key": "DE9BDDA0",
"api_host": "http://192.168.1.200:44400",
"material_type_mappings": {
"BIOYOND_PolymerStation_1FlaskCarrier": [
"烧杯",
"3a14196b-24f2-ca49-9081-0cab8021bf1a"
],
"BIOYOND_PolymerStation_1BottleCarrier": [
"试剂瓶",
"3a14196b-8bcf-a460-4f74-23f21ca79e72"
],
"BIOYOND_PolymerStation_6StockCarrier": [
"分装板",
"3a14196e-5dfe-6e21-0c79-fe2036d052c4"
],
"BIOYOND_PolymerStation_Liquid_Vial": [
"10%分装小瓶",
"3a14196c-76be-2279-4e22-7310d69aed68"
],
"BIOYOND_PolymerStation_Solid_Vial": [
"90%分装小瓶",
"3a14196c-cdcf-088d-dc7d-5cf38f0ad9ea"
],
"BIOYOND_PolymerStation_8StockCarrier": [
"样品板",
"3a14196e-b7a0-a5da-1931-35f3000281e9"
],
"BIOYOND_PolymerStation_Solid_Stock": [
"样品瓶",
"3a14196a-cf7d-8aea-48d8-b9662c7dba94"
]
}
},
"deck": {
"data": {
"_resource_child_name": "Bioyond_Dispensing_Deck",
"_resource_type": "unilabos.resources.bioyond.decks:BIOYOND_PolymerPreparationStation_Deck"
}
},
"protocol_type": []
},
"data": {}
},
{
"id": "Bioyond_Dispensing_Deck",
"name": "Bioyond_Dispensing_Deck",
"sample_id": null,
"children": [],
"parent": "dispensing_station_bioyond",
"type": "deck",
"class": "BIOYOND_PolymerPreparationStation_Deck",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"config": {
"type": "BIOYOND_PolymerPreparationStation_Deck",
"setup": true,
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"type": "Rotation"
}
},
"data": {}
},
{
"id": "reaction_station_bioyond",
"name": "reaction_station_bioyond",
"parent": null,
"children": [
"Bioyond_Deck"
],
"type": "device",
"class": "reaction_station.bioyond",
"config": {
"config": {
"api_key": "DE9BDDA0",
"api_host": "http://192.168.1.200:44402",
"workflow_mappings": {
"reactor_taken_out": "3a16081e-4788-ca37-eff4-ceed8d7019d1",
"reactor_taken_in": "3a160df6-76b3-0957-9eb0-cb496d5721c6",
"Solid_feeding_vials": "3a160877-87e7-7699-7bc6-ec72b05eb5e6",
"Liquid_feeding_vials(non-titration)": "3a167d99-6158-c6f0-15b5-eb030f7d8e47",
"Liquid_feeding_solvents": "3a160824-0665-01ed-285a-51ef817a9046",
"Liquid_feeding(titration)": "3a16082a-96ac-0449-446a-4ed39f3365b6",
"liquid_feeding_beaker": "3a16087e-124f-8ddb-8ec1-c2dff09ca784",
"Drip_back": "3a162cf9-6aac-565a-ddd7-682ba1796a4a"
},
"material_type_mappings": {
"BIOYOND_PolymerStation_Reactor": [
"反应器",
"3a14233b-902d-0d7b-4533-3f60f1c41c1b"
],
"BIOYOND_PolymerStation_1BottleCarrier": [
"试剂瓶",
"3a14233b-56e3-6c53-a8ab-fcaac163a9ba"
],
"BIOYOND_PolymerStation_1FlaskCarrier": [
"烧杯",
"3a14233b-f0a9-ba84-eaa9-0d4718b361b6"
],
"BIOYOND_PolymerStation_6StockCarrier": [
"样品板",
"3a142339-80de-8f25-6093-1b1b1b6c322e"
],
"BIOYOND_PolymerStation_Solid_Vial": [
"90%分装小瓶",
"3a14233a-26e1-28f8-af6a-60ca06ba0165"
],
"BIOYOND_PolymerStation_Liquid_Vial": [
"10%分装小瓶",
"3a14233a-84a3-088d-6676-7cb4acd57c64"
],
"BIOYOND_PolymerStation_TipBox": [
"枪头盒",
"3a143890-9d51-60ac-6d6f-6edb43c12041"
]
}
},
"deck": {
"data": {
"_resource_child_name": "Bioyond_Deck",
"_resource_type": "unilabos.resources.bioyond.decks:BIOYOND_PolymerReactionStation_Deck"
}
},
"protocol_type": []
},
"data": {}
},
{
"id": "Bioyond_Deck",
"name": "Bioyond_Deck",
"children": [],
"parent": "reaction_station_bioyond",
"type": "deck",
"class": "BIOYOND_PolymerReactionStation_Deck",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"config": {
"type": "BIOYOND_PolymerReactionStation_Deck",
"setup": true,
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"type": "Rotation"
}
},
"data": {}
}
]
}
34 changes: 32 additions & 2 deletions test/experiments/dispensing_station_bioyond.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,37 @@
"config": {
"config": {
"api_key": "DE9BDDA0",
"api_host": "http://192.168.1.200:44388"
"api_host": "http://192.168.1.200:44388",
"material_type_mappings": {
"BIOYOND_PolymerStation_1FlaskCarrier": [
"烧杯",
"3a14196b-24f2-ca49-9081-0cab8021bf1a"
],
"BIOYOND_PolymerStation_1BottleCarrier": [
"试剂瓶",
"3a14196b-8bcf-a460-4f74-23f21ca79e72"
],
"BIOYOND_PolymerStation_6StockCarrier": [
"分装板",
"3a14196e-5dfe-6e21-0c79-fe2036d052c4"
],
"BIOYOND_PolymerStation_Liquid_Vial": [
"10%分装小瓶",
"3a14196c-76be-2279-4e22-7310d69aed68"
],
"BIOYOND_PolymerStation_Solid_Vial": [
"90%分装小瓶",
"3a14196c-cdcf-088d-dc7d-5cf38f0ad9ea"
],
"BIOYOND_PolymerStation_8StockCarrier": [
"样品板",
"3a14196e-b7a0-a5da-1931-35f3000281e9"
],
"BIOYOND_PolymerStation_Solid_Stock": [
"样品瓶",
"3a14196a-cf7d-8aea-48d8-b9662c7dba94"
]
}
},
"deck": {
"data": {
Expand Down Expand Up @@ -50,4 +80,4 @@
"data": {}
}
]
}
}
52 changes: 22 additions & 30 deletions test/experiments/reaction_station_bioyond.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,41 +24,33 @@
"Drip_back": "3a162cf9-6aac-565a-ddd7-682ba1796a4a"
},
"material_type_mappings": {
"烧杯": [
"BIOYOND_PolymerStation_1FlaskCarrier",
"3a14196b-24f2-ca49-9081-0cab8021bf1a"
"BIOYOND_PolymerStation_Reactor": [
"反应器",
"3a14233b-902d-0d7b-4533-3f60f1c41c1b"
],
"试剂瓶": [
"BIOYOND_PolymerStation_1BottleCarrier",
""
"BIOYOND_PolymerStation_1BottleCarrier": [
"试剂瓶",
"3a14233b-56e3-6c53-a8ab-fcaac163a9ba"
],
"样品板": [
"BIOYOND_PolymerStation_6StockCarrier",
"3a14196e-b7a0-a5da-1931-35f3000281e9"
"BIOYOND_PolymerStation_1FlaskCarrier": [
"烧杯",
"3a14233b-f0a9-ba84-eaa9-0d4718b361b6"
],
"分装板": [
"BIOYOND_PolymerStation_6VialCarrier",
"3a14196e-5dfe-6e21-0c79-fe2036d052c4"
"BIOYOND_PolymerStation_6StockCarrier": [
"样品板",
"3a142339-80de-8f25-6093-1b1b1b6c322e"
],
"样品瓶": [
"BIOYOND_PolymerStation_Solid_Stock",
"3a14196a-cf7d-8aea-48d8-b9662c7dba94"
"BIOYOND_PolymerStation_Solid_Vial": [
"90%分装小瓶",
"3a14233a-26e1-28f8-af6a-60ca06ba0165"
],
"90%分装小瓶": [
"BIOYOND_PolymerStation_Solid_Vial",
"3a14196c-cdcf-088d-dc7d-5cf38f0ad9ea"
"BIOYOND_PolymerStation_Liquid_Vial": [
"10%分装小瓶",
"3a14233a-84a3-088d-6676-7cb4acd57c64"
],
"10%分装小瓶": [
"BIOYOND_PolymerStation_Liquid_Vial",
"3a14196c-76be-2279-4e22-7310d69aed68"
],
"枪头盒": [
"BIOYOND_PolymerStation_TipBox",
""
],
"反应器": [
"BIOYOND_PolymerStation_Reactor",
""
"BIOYOND_PolymerStation_TipBox": [
"枪头盒",
"3a143890-9d51-60ac-6d6f-6edb43c12041"
]
}
},
Expand Down Expand Up @@ -97,4 +89,4 @@
"data": {}
}
]
}
}
25 changes: 16 additions & 9 deletions unilabos/devices/workstation/bioyond_studio/bioyond_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,14 @@ def material_inbound(self, material_id: str, location_id: str) -> dict:
})

if not response or response['code'] != 1:
if response:
error_msg = response.get('message', '未知错误')
print(f"[ERROR] 物料入库失败: code={response.get('code')}, message={error_msg}")
else:
print(f"[ERROR] 物料入库失败: API 无响应")
return {}
return response.get("data", {})
# 入库成功时,即使没有 data 字段,也返回成功标识
return response.get("data") or {"success": True}

def delete_material(self, material_id: str) -> dict:
"""
Expand Down Expand Up @@ -501,7 +507,7 @@ def order_report(self, json_str: str) -> dict:
return {}

response = self.post(
url=f'{self.host}/api/lims/order/order-report',
url=f'{self.host}/api/lims/order/project-order-report',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
Expand Down Expand Up @@ -678,7 +684,7 @@ def scheduler_start(self) -> int:
def scheduler_pause(self) -> int:
"""描述:暂停调度器"""
response = self.post(
url=f'{self.host}/api/lims/scheduler/scheduler-pause',
url=f'{self.host}/api/lims/scheduler/pause',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
Expand All @@ -689,8 +695,9 @@ def scheduler_pause(self) -> int:
return response.get("code", 0)

def scheduler_continue(self) -> int:
"""描述:继续调度器"""
response = self.post(
url=f'{self.host}/api/lims/scheduler/scheduler-continue',
url=f'{self.host}/api/lims/scheduler/continue',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
Expand All @@ -703,7 +710,7 @@ def scheduler_continue(self) -> int:
def scheduler_stop(self) -> int:
"""描述:停止调度器"""
response = self.post(
url=f'{self.host}/api/lims/scheduler/scheduler-stop',
url=f'{self.host}/api/lims/scheduler/stop',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
Expand All @@ -714,9 +721,9 @@ def scheduler_stop(self) -> int:
return response.get("code", 0)

def scheduler_reset(self) -> int:
"""描述:重置调度器"""
"""描述:复位调度器"""
response = self.post(
url=f'{self.host}/api/lims/scheduler/scheduler-reset',
url=f'{self.host}/api/lims/scheduler/reset',
params={
"apiKey": self.api_key,
"requestTime": self.get_current_time_iso8601(),
Expand All @@ -734,7 +741,7 @@ def _load_material_cache(self):
print("正在加载材料列表缓存...")

# 加载所有类型的材料:耗材(0)、样品(1)、试剂(2)
material_types = [1, 2]
material_types = [0, 1, 2]

for type_mode in material_types:
print(f"正在加载类型 {type_mode} 的材料...")
Expand Down Expand Up @@ -788,4 +795,4 @@ def refresh_material_cache(self):

def get_available_materials(self):
"""获取所有可用的材料名称列表"""
return list(self.material_cache.keys())
return list(self.material_cache.keys())
Loading
Loading