mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-05 14:05:12 +00:00
Refactor bioyond_dispensing_station and reaction_station_bioyond YAML configurations
- Removed redundant action value mappings from bioyond_dispensing_station. - Updated goal properties in bioyond_dispensing_station to use enums for target_stack and other parameters. - Changed data types for end_point and start_point in reaction_station_bioyond to use string enums (Start, End). - Simplified descriptions and updated measurement units from μL to mL where applicable. - Removed unused commands from reaction_station_bioyond to streamline the configuration.
This commit is contained in:
@@ -49,16 +49,16 @@ class BioyondReactor:
|
|||||||
class BioyondReactionStation(BioyondWorkstation):
|
class BioyondReactionStation(BioyondWorkstation):
|
||||||
"""Bioyond反应站类
|
"""Bioyond反应站类
|
||||||
|
|
||||||
继承自BioyondWorkstation,提供反应站特定的业务方法
|
继承自BioyondWorkstation,提供反应站特定的业务方法
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config: dict = None, deck=None, protocol_type=None, **kwargs):
|
def __init__(self, config: dict = None, deck=None, protocol_type=None, **kwargs):
|
||||||
"""初始化反应站
|
"""初始化反应站
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
config: 配置字典,应包含workflow_mappings等配置
|
config: 配置字典,应包含workflow_mappings等配置
|
||||||
deck: Deck对象
|
deck: Deck对象
|
||||||
protocol_type: 协议类型(由ROS系统传递,此处忽略)
|
protocol_type: 协议类型(由ROS系统传递,此处忽略)
|
||||||
**kwargs: 其他可能的参数
|
**kwargs: 其他可能的参数
|
||||||
"""
|
"""
|
||||||
if deck is None and config:
|
if deck is None and config:
|
||||||
@@ -123,10 +123,10 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
return json.dumps({"suc": True})
|
return json.dumps({"suc": True})
|
||||||
|
|
||||||
def scheduler_start(self) -> dict:
|
def scheduler_start(self) -> dict:
|
||||||
"""启动调度器 - 启动Bioyond工作站的任务调度器,开始执行队列中的任务
|
"""启动调度器 - 启动Bioyond工作站的任务调度器,开始执行队列中的任务
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: 包含return_info的字典,return_info为整型(1=成功)
|
dict: 包含return_info的字典,return_info为整型(1=成功)
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
BioyondException: 调度器启动失败时抛出异常
|
BioyondException: 调度器启动失败时抛出异常
|
||||||
@@ -137,7 +137,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
self.hardware_interface._logger.info(f"调度器启动结果: {result}")
|
self.hardware_interface._logger.info(f"调度器启动结果: {result}")
|
||||||
|
|
||||||
if result != 1:
|
if result != 1:
|
||||||
error_msg = "启动调度器失败: 有未处理错误,调度无法启动。请检查Bioyond系统状态。"
|
error_msg = "启动调度器失败: 有未处理错误,调度无法启动。请检查Bioyond系统状态。"
|
||||||
self.hardware_interface._logger.error(error_msg)
|
self.hardware_interface._logger.error(error_msg)
|
||||||
raise BioyondException(error_msg)
|
raise BioyondException(error_msg)
|
||||||
|
|
||||||
@@ -152,12 +152,12 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""反应器放入
|
"""反应器放入
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
assign_material_name: 物料名称(不能为空)
|
assign_material_name: 物料名称(不能为空)
|
||||||
cutoff: 粘度上限(需为有效数字字符串,默认 "900000")
|
cutoff: 粘度上限(需为有效数字字符串,默认 "900000")
|
||||||
temperature: 温度设定(°C,范围:-50.00 至 100.00)
|
temperature: 温度设定(C,范围:-50.00 至 100.00)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: JSON 字符串,格式为 {"suc": True}
|
str: JSON 字符串,格式为 {"suc": True}
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
ValueError: 若物料名称无效或 cutoff 格式错误
|
ValueError: 若物料名称无效或 cutoff 格式错误
|
||||||
@@ -177,6 +177,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
if isinstance(temperature, str):
|
if isinstance(temperature, str):
|
||||||
temperature = float(temperature)
|
temperature = float(temperature)
|
||||||
|
|
||||||
|
|
||||||
step_id = WORKFLOW_STEP_IDS["reactor_taken_in"]["config"]
|
step_id = WORKFLOW_STEP_IDS["reactor_taken_in"]["config"]
|
||||||
reactor_taken_in_params = {
|
reactor_taken_in_params = {
|
||||||
"param_values": {
|
"param_values": {
|
||||||
@@ -208,12 +209,19 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""固体进料小瓶
|
"""固体进料小瓶
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
material_id: 粉末类型ID,1=盐(21分钟),2=面粉(27分钟),3=BTDA(38分钟)
|
material_id: 粉末类型ID, Salt=1, Flour=2, BTDA=3
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(NO=1, YES=2)
|
||||||
assign_material_name: 物料名称(用于获取试剂瓶位ID)
|
assign_material_name: 物料名称(用于获取试剂瓶位ID)
|
||||||
temperature: 温度设定(°C)
|
temperature: 温度设定(C)
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
material_map = {"Salt": "1", "Flour": "2", "BTDA": "3", "1": "1", "2": "2", "3": "3"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_material_id = material_map.get(str(material_id), str(material_id))
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
self.append_to_workflow_sequence('{"web_workflow_name": "Solid_feeding_vials"}')
|
self.append_to_workflow_sequence('{"web_workflow_name": "Solid_feeding_vials"}')
|
||||||
material_id_m = self.hardware_interface._get_material_id_by_name(assign_material_name) if assign_material_name else None
|
material_id_m = self.hardware_interface._get_material_id_by_name(assign_material_name) if assign_material_name else None
|
||||||
|
|
||||||
@@ -227,14 +235,14 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"param_values": {
|
"param_values": {
|
||||||
feeding_step_id: {
|
feeding_step_id: {
|
||||||
ACTION_NAMES["solid_feeding_vials"]["feeding"]: [
|
ACTION_NAMES["solid_feeding_vials"]["feeding"]: [
|
||||||
{"m": 0, "n": 3, "Key": "materialId", "Value": material_id},
|
{"m": 0, "n": 3, "Key": "materialId", "Value": mapped_material_id},
|
||||||
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id_m} if material_id_m else {}
|
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id_m} if material_id_m else {}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["solid_feeding_vials"]["observe"]: [
|
ACTION_NAMES["solid_feeding_vials"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -242,7 +250,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.pending_task_params.append(solid_feeding_vials_params)
|
self.pending_task_params.append(solid_feeding_vials_params)
|
||||||
print(f"成功添加固体进料小瓶参数: material_id={material_id}, time={time}min, torque={torque_variation}, temp={temperature:.2f}°C")
|
print(f"成功添加固体进料小瓶参数: material_id={material_id}, time={time}min, torque={torque_variation}, temp={temperature:.2f}C")
|
||||||
print(f"当前队列长度: {len(self.pending_task_params)}")
|
print(f"当前队列长度: {len(self.pending_task_params)}")
|
||||||
return json.dumps({"suc": True})
|
return json.dumps({"suc": True})
|
||||||
|
|
||||||
@@ -260,11 +268,18 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
Args:
|
Args:
|
||||||
volume_formula: 分液公式(μL)
|
volume_formula: 分液公式(μL)
|
||||||
assign_material_name: 物料名称
|
assign_material_name: 物料名称
|
||||||
titration_type: 是否滴定(1=否, 2=是)
|
titration_type: 是否滴定(NO=1, YES=2)
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(NO=1, YES=2)
|
||||||
temperature: 温度(°C)
|
temperature: 温度(C)
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
titration_map = {"NO": "1", "YES": "2", "1": "1", "2": "2"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_titration_type = titration_map.get(str(titration_type), "1")
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
self.append_to_workflow_sequence('{"web_workflow_name": "Liquid_feeding_vials(non-titration)"}')
|
self.append_to_workflow_sequence('{"web_workflow_name": "Liquid_feeding_vials(non-titration)"}')
|
||||||
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
||||||
if material_id is None:
|
if material_id is None:
|
||||||
@@ -282,13 +297,13 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
ACTION_NAMES["liquid_feeding_vials_non_titration"]["liquid"]: [
|
ACTION_NAMES["liquid_feeding_vials_non_titration"]["liquid"]: [
|
||||||
{"m": 0, "n": 3, "Key": "volumeFormula", "Value": volume_formula},
|
{"m": 0, "n": 3, "Key": "volumeFormula", "Value": volume_formula},
|
||||||
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id},
|
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id},
|
||||||
{"m": 0, "n": 3, "Key": "titrationType", "Value": titration_type}
|
{"m": 0, "n": 3, "Key": "titrationType", "Value": mapped_titration_type}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_vials_non_titration"]["observe"]: [
|
ACTION_NAMES["liquid_feeding_vials_non_titration"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -321,11 +336,18 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"total_liquid_volume": 48.00916988195499
|
"total_liquid_volume": 48.00916988195499
|
||||||
}
|
}
|
||||||
如果提供solvents,则从中提取additional_solvent并转换为μL
|
如果提供solvents,则从中提取additional_solvent并转换为μL
|
||||||
titration_type: 是否滴定(1=否, 2=是)
|
titration_type: 是否滴定(NO=1, YES=2)
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(NO=1, YES=2)
|
||||||
temperature: 温度设定(°C)
|
temperature: 温度设定(C)
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
titration_map = {"NO": "1", "YES": "2", "1": "1", "2": "2"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_titration_type = titration_map.get(str(titration_type), "1")
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
# 处理 volume 参数:优先使用直接传入的 volume,否则从 solvents 中提取
|
# 处理 volume 参数:优先使用直接传入的 volume,否则从 solvents 中提取
|
||||||
if not volume and solvents is not None:
|
if not volume and solvents is not None:
|
||||||
# 参数类型转换:如果是字符串则解析为字典
|
# 参数类型转换:如果是字符串则解析为字典
|
||||||
@@ -364,7 +386,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"param_values": {
|
"param_values": {
|
||||||
liquid_step_id: {
|
liquid_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_solvents"]["liquid"]: [
|
ACTION_NAMES["liquid_feeding_solvents"]["liquid"]: [
|
||||||
{"m": 0, "n": 1, "Key": "titrationType", "Value": titration_type},
|
{"m": 0, "n": 1, "Key": "titrationType", "Value": mapped_titration_type},
|
||||||
{"m": 0, "n": 1, "Key": "volume", "Value": volume},
|
{"m": 0, "n": 1, "Key": "volume", "Value": volume},
|
||||||
{"m": 0, "n": 1, "Key": "assignMaterialName", "Value": material_id}
|
{"m": 0, "n": 1, "Key": "assignMaterialName", "Value": material_id}
|
||||||
]
|
]
|
||||||
@@ -372,7 +394,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_solvents"]["observe"]: [
|
ACTION_NAMES["liquid_feeding_solvents"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -408,10 +430,10 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
x_value: 手工输入的x值,格式如 "1-2-3"
|
x_value: 手工输入的x值,格式如 "1-2-3"
|
||||||
feeding_order_data: feeding_order JSON字符串或对象,用于获取m二酐值
|
feeding_order_data: feeding_order JSON字符串或对象,用于获取m二酐值
|
||||||
extracted_actuals: 从报告提取的实际加料量JSON字符串,包含actualTargetWeigh和actualVolume
|
extracted_actuals: 从报告提取的实际加料量JSON字符串,包含actualTargetWeigh和actualVolume
|
||||||
titration_type: 是否滴定(1=否, 2=是),默认2
|
titration_type: 是否滴定(NO=1, YES=2),默认2
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(NO=1, YES=2)
|
||||||
temperature: 温度(°C)
|
temperature: 温度(C)
|
||||||
|
|
||||||
自动公式模板: 1000*(m二酐-x)*V二酐滴定/m二酐滴定
|
自动公式模板: 1000*(m二酐-x)*V二酐滴定/m二酐滴定
|
||||||
其中:
|
其中:
|
||||||
@@ -420,6 +442,13 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
- x = x_value (手工输入)
|
- x = x_value (手工输入)
|
||||||
- m二酐 = feeding_order中type为"main_anhydride"的amount值
|
- m二酐 = feeding_order中type为"main_anhydride"的amount值
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
titration_map = {"NO": "1", "YES": "2", "1": "1", "2": "2"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_titration_type = titration_map.get(str(titration_type), "2")
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
self.append_to_workflow_sequence('{"web_workflow_name": "Liquid_feeding(titration)"}')
|
self.append_to_workflow_sequence('{"web_workflow_name": "Liquid_feeding(titration)"}')
|
||||||
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
||||||
if material_id is None:
|
if material_id is None:
|
||||||
@@ -514,14 +543,14 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
liquid_step_id: {
|
liquid_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_titration"]["liquid"]: [
|
ACTION_NAMES["liquid_feeding_titration"]["liquid"]: [
|
||||||
{"m": 0, "n": 3, "Key": "volumeFormula", "Value": volume_formula},
|
{"m": 0, "n": 3, "Key": "volumeFormula", "Value": volume_formula},
|
||||||
{"m": 0, "n": 3, "Key": "titrationType", "Value": titration_type},
|
{"m": 0, "n": 3, "Key": "titrationType", "Value": mapped_titration_type},
|
||||||
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id}
|
{"m": 0, "n": 3, "Key": "assignMaterialName", "Value": material_id}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_titration"]["observe"]: [
|
ACTION_NAMES["liquid_feeding_titration"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -565,7 +594,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def _simplify_report(self, report) -> Dict[str, Any]:
|
def _simplify_report(self, report) -> Dict[str, Any]:
|
||||||
"""简化实验报告,只保留关键信息,去除冗余的工作流参数"""
|
"""简化实验报告,只保留关键信息,去除冗余的工作流参数"""
|
||||||
if not isinstance(report, dict):
|
if not isinstance(report, dict):
|
||||||
return report
|
return report
|
||||||
|
|
||||||
@@ -588,7 +617,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
'statusName': data.get('statusName'),
|
'statusName': data.get('statusName'),
|
||||||
}
|
}
|
||||||
|
|
||||||
# 提取物料信息(简化版)
|
# 提取物料信息(简化版)
|
||||||
pre_intakes = data.get('preIntakes', [])
|
pre_intakes = data.get('preIntakes', [])
|
||||||
if pre_intakes and isinstance(pre_intakes, list):
|
if pre_intakes and isinstance(pre_intakes, list):
|
||||||
first_intake = pre_intakes[0]
|
first_intake = pre_intakes[0]
|
||||||
@@ -801,7 +830,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
check_interval = int(check_interval) if check_interval else 10
|
check_interval = int(check_interval) if check_interval else 10
|
||||||
if not batch_create_result or batch_create_result == "":
|
if not batch_create_result or batch_create_result == "":
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"batch_create_result参数为空,请确保:\n"
|
"batch_create_result参数为空,请确保:\n"
|
||||||
"1. batch_create节点与wait节点之间正确连接了handle\n"
|
"1. batch_create节点与wait节点之间正确连接了handle\n"
|
||||||
"2. batch_create节点成功执行并返回了结果\n"
|
"2. batch_create节点成功执行并返回了结果\n"
|
||||||
"3. 检查上游batch_create任务是否成功创建了订单"
|
"3. 检查上游batch_create任务是否成功创建了订单"
|
||||||
@@ -822,10 +851,10 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
raise ValueError(f"解析batch_create_result失败: {e}")
|
raise ValueError(f"解析batch_create_result失败: {e}")
|
||||||
if not order_codes or not order_ids:
|
if not order_codes or not order_ids:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"batch_create_result中未找到order_codes或order_ids,或者为空。\n"
|
"batch_create_result中未找到order_codes或order_ids,或者为空。\n"
|
||||||
"可能的原因:\n"
|
"可能的原因:\n"
|
||||||
"1. batch_create任务执行失败(检查任务是否报错)\n"
|
"1. batch_create任务执行失败(检查任务是否报错)\n"
|
||||||
"2. 物料配置问题(如'物料样品板分配失败')\n"
|
"2. 物料配置问题(如'物料样品板分配失败')\n"
|
||||||
"3. Bioyond系统状态异常\n"
|
"3. Bioyond系统状态异常\n"
|
||||||
f"batch_create_result内容: {batch_create_result[:200]}..."
|
f"batch_create_result内容: {batch_create_result[:200]}..."
|
||||||
)
|
)
|
||||||
@@ -882,7 +911,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
if not rep:
|
if not rep:
|
||||||
rep = {"error": "无法获取报告"}
|
rep = {"error": "无法获取报告"}
|
||||||
else:
|
else:
|
||||||
# 简化报告,去除冗余信息
|
# 简化报告,去除冗余信息
|
||||||
rep = self._simplify_report(rep)
|
rep = self._simplify_report(rep)
|
||||||
reports.append({
|
reports.append({
|
||||||
"order_code": oc,
|
"order_code": oc,
|
||||||
@@ -962,9 +991,16 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
assign_material_name: 物料名称(试剂瓶位)
|
assign_material_name: 物料名称(试剂瓶位)
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
||||||
titration_type: 是否滴定(1=否, 2=是)
|
titration_type: 是否滴定(NO=1, YES=2)
|
||||||
temperature: 温度设定(°C)
|
temperature: 温度设定(C)
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
titration_map = {"NO": "1", "YES": "2", "1": "1", "2": "2"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_titration_type = titration_map.get(str(titration_type), "1")
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
self.append_to_workflow_sequence('{"web_workflow_name": "liquid_feeding_beaker"}')
|
self.append_to_workflow_sequence('{"web_workflow_name": "liquid_feeding_beaker"}')
|
||||||
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
||||||
if material_id is None:
|
if material_id is None:
|
||||||
@@ -982,13 +1018,13 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
ACTION_NAMES["liquid_feeding_beaker"]["liquid"]: [
|
ACTION_NAMES["liquid_feeding_beaker"]["liquid"]: [
|
||||||
{"m": 0, "n": 2, "Key": "volume", "Value": volume},
|
{"m": 0, "n": 2, "Key": "volume", "Value": volume},
|
||||||
{"m": 0, "n": 2, "Key": "assignMaterialName", "Value": material_id},
|
{"m": 0, "n": 2, "Key": "assignMaterialName", "Value": material_id},
|
||||||
{"m": 0, "n": 2, "Key": "titrationType", "Value": titration_type}
|
{"m": 0, "n": 2, "Key": "titrationType", "Value": mapped_titration_type}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["liquid_feeding_beaker"]["observe"]: [
|
ACTION_NAMES["liquid_feeding_beaker"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1014,11 +1050,18 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
Args:
|
Args:
|
||||||
assign_material_name: 物料名称(液体种类)
|
assign_material_name: 物料名称(液体种类)
|
||||||
volume: 分液量(μL)
|
volume: 分液量(μL)
|
||||||
titration_type: 是否滴定(1=否, 2=是)
|
titration_type: 是否滴定(NO=1, YES=2)
|
||||||
time: 观察时间(分钟)
|
time: 观察时间(分钟)
|
||||||
torque_variation: 是否观察(int类型, 1=否, 2=是)
|
torque_variation: 是否观察(NO=1, YES=2)
|
||||||
temperature: 温度(°C)
|
temperature: 温度(C)
|
||||||
"""
|
"""
|
||||||
|
# 参数映射
|
||||||
|
titration_map = {"NO": "1", "YES": "2", "1": "1", "2": "2"}
|
||||||
|
torque_map = {"NO": "1", "YES": "2", 1: "1", 2: "2", "1": "1", "2": "2"}
|
||||||
|
|
||||||
|
mapped_titration_type = titration_map.get(str(titration_type), "1")
|
||||||
|
mapped_torque_variation = int(torque_map.get(str(torque_variation), "1"))
|
||||||
|
|
||||||
self.append_to_workflow_sequence('{"web_workflow_name": "drip_back"}')
|
self.append_to_workflow_sequence('{"web_workflow_name": "drip_back"}')
|
||||||
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
material_id = self.hardware_interface._get_material_id_by_name(assign_material_name)
|
||||||
if material_id is None:
|
if material_id is None:
|
||||||
@@ -1034,7 +1077,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"param_values": {
|
"param_values": {
|
||||||
liquid_step_id: {
|
liquid_step_id: {
|
||||||
ACTION_NAMES["drip_back"]["liquid"]: [
|
ACTION_NAMES["drip_back"]["liquid"]: [
|
||||||
{"m": 0, "n": 1, "Key": "titrationType", "Value": titration_type},
|
{"m": 0, "n": 1, "Key": "titrationType", "Value": mapped_titration_type},
|
||||||
{"m": 0, "n": 1, "Key": "assignMaterialName", "Value": material_id},
|
{"m": 0, "n": 1, "Key": "assignMaterialName", "Value": material_id},
|
||||||
{"m": 0, "n": 1, "Key": "volume", "Value": volume}
|
{"m": 0, "n": 1, "Key": "volume", "Value": volume}
|
||||||
]
|
]
|
||||||
@@ -1042,7 +1085,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
observe_step_id: {
|
observe_step_id: {
|
||||||
ACTION_NAMES["drip_back"]["observe"]: [
|
ACTION_NAMES["drip_back"]["observe"]: [
|
||||||
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
{"m": 1, "n": 0, "Key": "time", "Value": time},
|
||||||
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(torque_variation)},
|
{"m": 1, "n": 0, "Key": "torqueVariation", "Value": str(mapped_torque_variation)},
|
||||||
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
{"m": 1, "n": 0, "Key": "temperature", "Value": f"{temperature:.2f}"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1068,14 +1111,21 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
duration: 时间(秒)
|
duration: 时间(秒)
|
||||||
start_step_key: 起点步骤Key (可选, 默认为空则自动选择)
|
start_step_key: 起点步骤Key (可选, 默认为空则自动选择)
|
||||||
end_step_key: 终点步骤Key (可选, 默认为空则自动选择)
|
end_step_key: 终点步骤Key (可选, 默认为空则自动选择)
|
||||||
start_point: 起点计时点 (0=开始前, 1=结束后)
|
start_point: 起点计时点 (Start=0, End=1)
|
||||||
end_point: 终点计时点 (0=开始前, 1=结束后)
|
end_point: 终点计时点 (Start=0, End=1)
|
||||||
"""
|
"""
|
||||||
# 注意:此方法应在添加完起点工作流后,添加终点工作流前调用
|
# 参数映射
|
||||||
|
point_map = {"Start": 0, "End": 1, 0: 0, 1: 1, "0": 0, "1": 1}
|
||||||
|
|
||||||
|
mapped_start_point = point_map.get(start_point, 0)
|
||||||
|
mapped_end_point = point_map.get(end_point, 0)
|
||||||
|
|
||||||
|
# 注意:此方法应在添加完起点工作流后,添加终点工作流前调用
|
||||||
|
|
||||||
|
|
||||||
current_count = len(self._cached_workflow_sequence)
|
current_count = len(self._cached_workflow_sequence)
|
||||||
if current_count == 0:
|
if current_count == 0:
|
||||||
print("⚠️ 无法添加时间约束:当前没有工作流")
|
print("⚠️ 无法添加时间约束:当前没有工作流")
|
||||||
return
|
return
|
||||||
|
|
||||||
start_index = current_count - 1
|
start_index = current_count - 1
|
||||||
@@ -1087,8 +1137,8 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"end_index": end_index,
|
"end_index": end_index,
|
||||||
"end_step_key": end_step_key,
|
"end_step_key": end_step_key,
|
||||||
"duration": duration,
|
"duration": duration,
|
||||||
"start_point": start_point,
|
"start_point": mapped_start_point,
|
||||||
"end_point": end_point
|
"end_point": mapped_end_point
|
||||||
}
|
}
|
||||||
self.pending_time_constraints.append(constraint)
|
self.pending_time_constraints.append(constraint)
|
||||||
print(f"已添加时间约束: Workflow[{start_index}].{start_step_key} -> Workflow[{end_index}].{end_step_key} ({duration}s)")
|
print(f"已添加时间约束: Workflow[{start_index}].{start_step_key} -> Workflow[{end_index}].{end_step_key} ({duration}s)")
|
||||||
@@ -1104,7 +1154,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""
|
"""
|
||||||
id_to_name = {workflow_id: name for name, workflow_id in self.workflow_mappings.items()}
|
id_to_name = {workflow_id: name for name, workflow_id in self.workflow_mappings.items()}
|
||||||
workflow_names = []
|
workflow_names = []
|
||||||
# 使用内部缓存的列表,而不是属性(属性返回 JSON 字符串)
|
# 使用内部缓存的列表,而不是属性(属性返回 JSON 字符串)
|
||||||
for workflow_id in self._cached_workflow_sequence:
|
for workflow_id in self._cached_workflow_sequence:
|
||||||
workflow_name = id_to_name.get(workflow_id, workflow_id)
|
workflow_name = id_to_name.get(workflow_id, workflow_id)
|
||||||
workflow_names.append(workflow_name)
|
workflow_names.append(workflow_name)
|
||||||
@@ -1113,7 +1163,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
def sync_workflow_sequence_from_bioyond(self) -> dict:
|
def sync_workflow_sequence_from_bioyond(self) -> dict:
|
||||||
"""从 Bioyond 系统同步工作流序列
|
"""从 Bioyond 系统同步工作流序列
|
||||||
|
|
||||||
查询 Bioyond 系统中的工作流列表,并更新本地 workflow_sequence
|
查询 Bioyond 系统中的工作流列表,并更新本地 workflow_sequence
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: 包含同步结果的字典
|
dict: 包含同步结果的字典
|
||||||
@@ -1142,7 +1192,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
print(f"[同步工作流序列] 查询返回数据: {workflows_data}")
|
print(f"[同步工作流序列] 查询返回数据: {workflows_data}")
|
||||||
|
|
||||||
if not workflows_data:
|
if not workflows_data:
|
||||||
error_msg = "未能从 Bioyond 系统获取工作流数据(返回为空)"
|
error_msg = "未能从 Bioyond 系统获取工作流数据(返回为空)"
|
||||||
print(f"⚠️ [同步工作流序列] {error_msg}")
|
print(f"⚠️ [同步工作流序列] {error_msg}")
|
||||||
return {
|
return {
|
||||||
"success": False,
|
"success": False,
|
||||||
@@ -1150,7 +1200,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"message": error_msg
|
"message": error_msg
|
||||||
}
|
}
|
||||||
|
|
||||||
# 获取工作流列表 - Bioyond API 返回的字段是 items,不是 list
|
# 获取工作流列表 - Bioyond API 返回的字段是 items,不是 list
|
||||||
workflow_list = workflows_data.get("items", workflows_data.get("list", []))
|
workflow_list = workflows_data.get("items", workflows_data.get("list", []))
|
||||||
print(f"[同步工作流序列] 从 Bioyond 查询到 {len(workflow_list)} 个工作流")
|
print(f"[同步工作流序列] 从 Bioyond 查询到 {len(workflow_list)} 个工作流")
|
||||||
|
|
||||||
@@ -1243,7 +1293,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
|
|
||||||
def hard_delete_merged_workflows(self, workflow_ids: List[str]) -> Dict[str, Any]:
|
def hard_delete_merged_workflows(self, workflow_ids: List[str]) -> Dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
调用新接口:硬删除合并后的工作流
|
调用新接口:硬删除合并后的工作流
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflow_ids: 要删除的工作流ID数组
|
workflow_ids: 要删除的工作流ID数组
|
||||||
@@ -1265,11 +1315,11 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""项目接口通用POST调用
|
"""项目接口通用POST调用
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
endpoint: 接口路径(例如 /api/lims/order/skip-titration-steps)
|
endpoint: 接口路径(例如 /api/lims/order/skip-titration-steps)
|
||||||
data: 请求体中的 data 字段内容
|
data: 请求体中的 data 字段内容
|
||||||
|
|
||||||
返回:
|
返回:
|
||||||
dict: 服务端响应,失败时返回 {code:0,message,...}
|
dict: 服务端响应,失败时返回 {code:0,message,...}
|
||||||
"""
|
"""
|
||||||
request_data = {
|
request_data = {
|
||||||
"apiKey": API_CONFIG["api_key"],
|
"apiKey": API_CONFIG["api_key"],
|
||||||
@@ -1305,11 +1355,11 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""项目接口通用DELETE调用
|
"""项目接口通用DELETE调用
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
endpoint: 接口路径(例如 /api/lims/order/workflows)
|
endpoint: 接口路径(例如 /api/lims/order/workflows)
|
||||||
data: 请求体中的 data 字段内容
|
data: 请求体中的 data 字段内容
|
||||||
|
|
||||||
返回:
|
返回:
|
||||||
dict: 服务端响应,失败时返回 {code:0,message,...}
|
dict: 服务端响应,失败时返回 {code:0,message,...}
|
||||||
"""
|
"""
|
||||||
request_data = {
|
request_data = {
|
||||||
"apiKey": API_CONFIG["api_key"],
|
"apiKey": API_CONFIG["api_key"],
|
||||||
@@ -1359,16 +1409,16 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
for name in web_workflow_list:
|
for name in web_workflow_list:
|
||||||
workflow_id = self.workflow_mappings.get(name, "")
|
workflow_id = self.workflow_mappings.get(name, "")
|
||||||
if not workflow_id:
|
if not workflow_id:
|
||||||
print(f"警告:未找到工作流名称 {name} 对应的 ID")
|
print(f"警告:未找到工作流名称 {name} 对应的 ID")
|
||||||
continue
|
continue
|
||||||
workflows_result.append({"id": workflow_id, "name": name})
|
workflows_result.append({"id": workflow_id, "name": name})
|
||||||
print(f"process_web_workflows 输出: {workflows_result}")
|
print(f"process_web_workflows 输出: {workflows_result}")
|
||||||
return workflows_result
|
return workflows_result
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
print(f"错误:无法解析 web_workflow_json: {e}")
|
print(f"错误:无法解析 web_workflow_json: {e}")
|
||||||
return []
|
return []
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"错误:处理工作流失败: {e}")
|
print(f"错误:处理工作流失败: {e}")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def _build_workflows_with_parameters(self, workflows_result: list) -> list:
|
def _build_workflows_with_parameters(self, workflows_result: list) -> list:
|
||||||
@@ -1376,7 +1426,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
构建带参数的工作流列表
|
构建带参数的工作流列表
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflows_result: 处理后的工作流列表(应为包含 id 和 name 的字典列表)
|
workflows_result: 处理后的工作流列表(应为包含 id 和 name 的字典列表)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
符合新接口格式的工作流参数结构
|
符合新接口格式的工作流参数结构
|
||||||
@@ -1388,24 +1438,24 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
|
|
||||||
for idx, workflow_info in enumerate(workflows_result):
|
for idx, workflow_info in enumerate(workflows_result):
|
||||||
if not isinstance(workflow_info, dict):
|
if not isinstance(workflow_info, dict):
|
||||||
print(f"错误:workflows_result[{idx}] 不是字典,而是 {type(workflow_info)}: {workflow_info}")
|
print(f"错误:workflows_result[{idx}] 不是字典,而是 {type(workflow_info)}: {workflow_info}")
|
||||||
continue
|
continue
|
||||||
workflow_id = workflow_info.get("id")
|
workflow_id = workflow_info.get("id")
|
||||||
if not workflow_id:
|
if not workflow_id:
|
||||||
print(f"警告:workflows_result[{idx}] 缺少 'id' 键")
|
print(f"警告:workflows_result[{idx}] 缺少 'id' 键")
|
||||||
continue
|
continue
|
||||||
workflow_name = workflow_info.get("name", "")
|
workflow_name = workflow_info.get("name", "")
|
||||||
# print(f"\n🔧 处理工作流 [{idx}]: {workflow_name} (ID: {workflow_id})")
|
# print(f"\n🔧 处理工作流 [{idx}]: {workflow_name} (ID: {workflow_id})")
|
||||||
|
|
||||||
if idx >= len(self.pending_task_params):
|
if idx >= len(self.pending_task_params):
|
||||||
# print(f" ⚠️ 无对应参数,跳过")
|
# print(f" ⚠️ 无对应参数,跳过")
|
||||||
workflows_with_params.append({"id": workflow_id})
|
workflows_with_params.append({"id": workflow_id})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
param_data = self.pending_task_params[idx]
|
param_data = self.pending_task_params[idx]
|
||||||
param_values = param_data.get("param_values", {})
|
param_values = param_data.get("param_values", {})
|
||||||
if not param_values:
|
if not param_values:
|
||||||
# print(f" ⚠️ 参数为空,跳过")
|
# print(f" ⚠️ 参数为空,跳过")
|
||||||
workflows_with_params.append({"id": workflow_id})
|
workflows_with_params.append({"id": workflow_id})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -1464,10 +1514,10 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
|
|
||||||
def merge_workflow_with_parameters(self, json_str: str) -> dict:
|
def merge_workflow_with_parameters(self, json_str: str) -> dict:
|
||||||
"""
|
"""
|
||||||
调用新接口:合并工作流并传递参数
|
调用新接口:合并工作流并传递参数
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
json_str: JSON格式的字符串,包含:
|
json_str: JSON格式的字符串,包含:
|
||||||
- name: 工作流名称
|
- name: 工作流名称
|
||||||
- workflows: [{"id": "工作流ID", "stepParameters": {...}}]
|
- workflows: [{"id": "工作流ID", "stepParameters": {...}}]
|
||||||
|
|
||||||
@@ -1477,7 +1527,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
try:
|
try:
|
||||||
data = json.loads(json_str)
|
data = json.loads(json_str)
|
||||||
|
|
||||||
# 在工作流名称后面添加时间戳,避免重复
|
# 在工作流名称后面添加时间戳,避免重复
|
||||||
if "name" in data and data["name"]:
|
if "name" in data and data["name"]:
|
||||||
timestamp = self.hardware_interface.get_current_time_iso8601().replace(":", "-").replace(".", "-")
|
timestamp = self.hardware_interface.get_current_time_iso8601().replace(":", "-").replace(".", "-")
|
||||||
original_name = data["name"]
|
original_name = data["name"]
|
||||||
@@ -1524,7 +1574,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
if result.get("code") == 1:
|
if result.get("code") == 1:
|
||||||
print(f"✅ 工作流合并成功(带参数)")
|
print(f"✅ 工作流合并成功(带参数)")
|
||||||
return result.get("data", {})
|
return result.get("data", {})
|
||||||
else:
|
else:
|
||||||
error_msg = result.get('message', '未知错误')
|
error_msg = result.get('message', '未知错误')
|
||||||
@@ -1545,7 +1595,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def _validate_and_refresh_workflow_if_needed(self, workflow_name: str) -> bool:
|
def _validate_and_refresh_workflow_if_needed(self, workflow_name: str) -> bool:
|
||||||
"""验证工作流ID是否有效,如果无效则重新合并
|
"""验证工作流ID是否有效,如果无效则重新合并
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflow_name: 工作流名称
|
workflow_name: 工作流名称
|
||||||
@@ -1555,7 +1605,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"""
|
"""
|
||||||
print(f"\n🔍 验证工作流ID有效性...")
|
print(f"\n🔍 验证工作流ID有效性...")
|
||||||
if not self._cached_workflow_sequence:
|
if not self._cached_workflow_sequence:
|
||||||
print(f" ⚠️ 工作流序列为空,需要重新合并")
|
print(f" ⚠️ 工作流序列为空,需要重新合并")
|
||||||
return False
|
return False
|
||||||
first_workflow_id = self._cached_workflow_sequence[0]
|
first_workflow_id = self._cached_workflow_sequence[0]
|
||||||
try:
|
try:
|
||||||
@@ -1564,7 +1614,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
print(f" ✅ 工作流ID有效")
|
print(f" ✅ 工作流ID有效")
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
print(f" ⚠️ 工作流ID已过期,需要重新合并")
|
print(f" ⚠️ 工作流ID已过期,需要重新合并")
|
||||||
return False
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f" ❌ 工作流ID验证失败: {e}")
|
print(f" ❌ 工作流ID验证失败: {e}")
|
||||||
@@ -1573,7 +1623,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
|
|
||||||
def process_and_execute_workflow(self, workflow_name: str, task_name: str) -> dict:
|
def process_and_execute_workflow(self, workflow_name: str, task_name: str) -> dict:
|
||||||
"""
|
"""
|
||||||
一站式处理工作流程:解析网页工作流列表,合并工作流(带参数),然后发布任务
|
一站式处理工作流程:解析网页工作流列表,合并工作流(带参数),然后发布任务
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflow_name: 合并后的工作流名称
|
workflow_name: 合并后的工作流名称
|
||||||
@@ -1630,7 +1680,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
start_wf_name = workflow_names_by_index[start_idx]
|
start_wf_name = workflow_names_by_index[start_idx]
|
||||||
end_wf_name = workflow_names_by_index[end_idx]
|
end_wf_name = workflow_names_by_index[end_idx]
|
||||||
|
|
||||||
# 辅助函数:根据名称查找 config 中的 key
|
# 辅助函数:根据名称查找 config 中的 key
|
||||||
def find_config_key(name):
|
def find_config_key(name):
|
||||||
# 1. 直接匹配
|
# 1. 直接匹配
|
||||||
if name in WORKFLOW_STEP_IDS:
|
if name in WORKFLOW_STEP_IDS:
|
||||||
@@ -1702,7 +1752,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"tcmBs": tcm_bs_list
|
"tcmBs": tcm_bs_list
|
||||||
}
|
}
|
||||||
|
|
||||||
# print(f"\n🔄 合并工作流(带参数),名称: {workflow_name}")
|
# print(f"\n🔄 合并工作流(带参数),名称: {workflow_name}")
|
||||||
merged_workflow = self.merge_workflow_with_parameters(json.dumps(merge_data))
|
merged_workflow = self.merge_workflow_with_parameters(json.dumps(merge_data))
|
||||||
|
|
||||||
if not merged_workflow:
|
if not merged_workflow:
|
||||||
@@ -1719,28 +1769,28 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
"paramValues": {}
|
"paramValues": {}
|
||||||
}]
|
}]
|
||||||
|
|
||||||
# 尝试创建订单:无论成功或失败,都需要在本次尝试结束后清理本地队列,避免下一次重复累积
|
# 尝试创建订单:无论成功或失败,都需要在本次尝试结束后清理本地队列,避免下一次重复累积
|
||||||
try:
|
try:
|
||||||
result = self.create_order(json.dumps(order_params))
|
result = self.create_order(json.dumps(order_params))
|
||||||
if not result:
|
if not result:
|
||||||
# 返回错误结果之前先记录情况(稍后由 finally 清理队列)
|
# 返回错误结果之前先记录情况(稍后由 finally 清理队列)
|
||||||
print("⚠️ 创建任务返回空或失败响应,稍后将清理本地队列以避免重复累积")
|
print("⚠️ 创建任务返回空或失败响应,稍后将清理本地队列以避免重复累积")
|
||||||
return self._create_error_result("创建任务失败", "create_order")
|
return self._create_error_result("创建任务失败", "create_order")
|
||||||
finally:
|
finally:
|
||||||
# 无论任务创建成功与否,都要清空本地保存的参数和工作流序列,防止下次重复
|
# 无论任务创建成功与否,都要清空本地保存的参数和工作流序列,防止下次重复
|
||||||
try:
|
try:
|
||||||
self.pending_task_params = []
|
self.pending_task_params = []
|
||||||
self.clear_workflows() # 清空工作流序列,避免重复累积
|
self.clear_workflows() # 清空工作流序列,避免重复累积
|
||||||
print("✅ 已清理 pending_task_params 与 workflow_sequence")
|
print("✅ 已清理 pending_task_params 与 workflow_sequence")
|
||||||
except Exception as _ex:
|
except Exception as _ex:
|
||||||
# 记录清理失败,但不要阻塞原始返回
|
# 记录清理失败,但不要阻塞原始返回
|
||||||
print(f"❌ 清理队列时发生异常: {_ex}")
|
print(f"❌ 清理队列时发生异常: {_ex}")
|
||||||
|
|
||||||
# print(f"\n✅ 任务创建成功: {result}")
|
# print(f"\n✅ 任务创建成功: {result}")
|
||||||
# print(f"\n✅ 任务创建成功")
|
# print(f"\n✅ 任务创建成功")
|
||||||
print(f"{'='*60}\n")
|
print(f"{'='*60}\n")
|
||||||
|
|
||||||
# 返回结果,包含合并后的工作流数据和订单参数
|
# 返回结果,包含合并后的工作流数据和订单参数
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
"success": True,
|
"success": True,
|
||||||
"result": result,
|
"result": result,
|
||||||
@@ -1757,7 +1807,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
preintake_id: 通量ID
|
preintake_id: 通量ID
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Dict[str, Any]: 服务器响应,包含状态码、消息和时间戳
|
Dict[str, Any]: 服务器响应,包含状态码,消息和时间戳
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return self._post_project_api("/api/lims/order/skip-titration-steps", preintake_id)
|
return self._post_project_api("/api/lims/order/skip-titration-steps", preintake_id)
|
||||||
@@ -1774,7 +1824,7 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
temperature: 目标温度 (°C)
|
temperature: 目标温度 (°C)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: JSON 字符串,格式为 {"suc": True/False, "msg": "描述信息"}
|
str: JSON 字符串,格式为 {"suc": True/False, "msg": "描述信息"}
|
||||||
"""
|
"""
|
||||||
if reactor_id not in range(1, 6):
|
if reactor_id not in range(1, 6):
|
||||||
return json.dumps({"suc": False, "msg": "反应器编号必须在 1-5 之间"})
|
return json.dumps({"suc": False, "msg": "反应器编号必须在 1-5 之间"})
|
||||||
@@ -1793,6 +1843,6 @@ class BioyondReactionStation(BioyondWorkstation):
|
|||||||
if resp.status_code == 200:
|
if resp.status_code == 200:
|
||||||
return json.dumps({"suc": True, "msg": "温度设置成功"})
|
return json.dumps({"suc": True, "msg": "温度设置成功"})
|
||||||
else:
|
else:
|
||||||
return json.dumps({"suc": False, "msg": f"温度设置失败,HTTP {resp.status_code}"})
|
return json.dumps({"suc": False, "msg": f"温度设置失败,HTTP {resp.status_code}"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return json.dumps({"suc": False, "msg": f"温度设置异常: {str(e)}"})
|
return json.dumps({"suc": False, "msg": f"温度设置异常: {str(e)}"})
|
||||||
|
|||||||
@@ -5,200 +5,6 @@ bioyond_dispensing_station:
|
|||||||
- bioyond_dispensing_station
|
- bioyond_dispensing_station
|
||||||
class:
|
class:
|
||||||
action_value_mappings:
|
action_value_mappings:
|
||||||
auto-brief_step_parameters:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
data: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
data:
|
|
||||||
type: object
|
|
||||||
required:
|
|
||||||
- data
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: brief_step_parameters参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-compute_experiment_design:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
m_tot: '70'
|
|
||||||
ratio: null
|
|
||||||
titration_percent: '0.03'
|
|
||||||
wt_percent: '0.25'
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
m_tot:
|
|
||||||
default: '70'
|
|
||||||
type: string
|
|
||||||
ratio:
|
|
||||||
type: object
|
|
||||||
titration_percent:
|
|
||||||
default: '0.03'
|
|
||||||
type: string
|
|
||||||
wt_percent:
|
|
||||||
default: '0.25'
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- ratio
|
|
||||||
type: object
|
|
||||||
result:
|
|
||||||
properties:
|
|
||||||
feeding_order:
|
|
||||||
items: {}
|
|
||||||
title: Feeding Order
|
|
||||||
type: array
|
|
||||||
return_info:
|
|
||||||
title: Return Info
|
|
||||||
type: string
|
|
||||||
solutions:
|
|
||||||
items: {}
|
|
||||||
title: Solutions
|
|
||||||
type: array
|
|
||||||
solvents:
|
|
||||||
additionalProperties: true
|
|
||||||
title: Solvents
|
|
||||||
type: object
|
|
||||||
titration:
|
|
||||||
additionalProperties: true
|
|
||||||
title: Titration
|
|
||||||
type: object
|
|
||||||
required:
|
|
||||||
- solutions
|
|
||||||
- titration
|
|
||||||
- solvents
|
|
||||||
- feeding_order
|
|
||||||
- return_info
|
|
||||||
title: ComputeExperimentDesignReturn
|
|
||||||
type: object
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: compute_experiment_design参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-process_order_finish_report:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
report_request: null
|
|
||||||
used_materials: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
report_request:
|
|
||||||
type: string
|
|
||||||
used_materials:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- report_request
|
|
||||||
- used_materials
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: process_order_finish_report参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-project_order_report:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
order_id: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
order_id:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- order_id
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: project_order_report参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-query_resource_by_name:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
material_name: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
material_name:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- material_name
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: query_resource_by_name参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-workflow_sample_locations:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
workflow_id: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
workflow_id:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- workflow_id
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: workflow_sample_locations参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
batch_create_90_10_vial_feeding_tasks:
|
batch_create_90_10_vial_feeding_tasks:
|
||||||
feedback: {}
|
feedback: {}
|
||||||
goal:
|
goal:
|
||||||
@@ -745,7 +551,11 @@ bioyond_dispensing_station:
|
|||||||
description: 目标库位(手动输入,如"A01")
|
description: 目标库位(手动输入,如"A01")
|
||||||
type: string
|
type: string
|
||||||
target_stack:
|
target_stack:
|
||||||
description: 目标堆栈名称(手动输入,如"堆栈1左")
|
description: 目标堆栈名称(从列表选择)
|
||||||
|
enum:
|
||||||
|
- 堆栈1左
|
||||||
|
- 堆栈1右
|
||||||
|
- 站内试剂存放堆栈
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- materials
|
- materials
|
||||||
|
|||||||
@@ -30,16 +30,22 @@ reaction_station.bioyond:
|
|||||||
description: 时间(秒)
|
description: 时间(秒)
|
||||||
type: integer
|
type: integer
|
||||||
end_point:
|
end_point:
|
||||||
default: 0
|
default: Start
|
||||||
description: 终点计时点 (0=开始前, 1=结束后)
|
description: 终点计时点 (Start=开始前, End=结束后)
|
||||||
type: integer
|
enum:
|
||||||
|
- Start
|
||||||
|
- End
|
||||||
|
type: string
|
||||||
end_step_key:
|
end_step_key:
|
||||||
description: 终点步骤Key (可选, 默认为空则自动选择)
|
description: 终点步骤Key (可选, 默认为空则自动选择)
|
||||||
type: string
|
type: string
|
||||||
start_point:
|
start_point:
|
||||||
default: 0
|
default: Start
|
||||||
description: 起点计时点 (0=开始前, 1=结束后)
|
description: 起点计时点 (Start=开始前, End=结束后)
|
||||||
type: integer
|
enum:
|
||||||
|
- Start
|
||||||
|
- End
|
||||||
|
type: string
|
||||||
start_step_key:
|
start_step_key:
|
||||||
description: 起点步骤Key (例如 "feeding", "liquid", 可选, 默认为空则自动选择)
|
description: 起点步骤Key (例如 "feeding", "liquid", 可选, 默认为空则自动选择)
|
||||||
type: string
|
type: string
|
||||||
@@ -52,253 +58,6 @@ reaction_station.bioyond:
|
|||||||
title: add_time_constraint参数
|
title: add_time_constraint参数
|
||||||
type: object
|
type: object
|
||||||
type: UniLabJsonCommand
|
type: UniLabJsonCommand
|
||||||
auto-create_order:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
json_str: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
json_str:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- json_str
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: create_order参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-hard_delete_merged_workflows:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
workflow_ids: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
workflow_ids:
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
type: array
|
|
||||||
required:
|
|
||||||
- workflow_ids
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: hard_delete_merged_workflows参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-merge_workflow_with_parameters:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
json_str: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
json_str:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- json_str
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: merge_workflow_with_parameters参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-process_temperature_cutoff_report:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
report_request: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
report_request:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- report_request
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: process_temperature_cutoff_report参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-process_web_workflows:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
web_workflow_json: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
web_workflow_json:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- web_workflow_json
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: process_web_workflows参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-skip_titration_steps:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
preintake_id: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
preintake_id:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- preintake_id
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: skip_titration_steps参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-sync_workflow_sequence_from_bioyond:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default: {}
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: 从Bioyond系统同步工作流序列
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties: {}
|
|
||||||
required: []
|
|
||||||
type: object
|
|
||||||
result:
|
|
||||||
properties:
|
|
||||||
message:
|
|
||||||
type: string
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
workflows:
|
|
||||||
items:
|
|
||||||
properties:
|
|
||||||
id:
|
|
||||||
type: string
|
|
||||||
name:
|
|
||||||
type: string
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
type: object
|
|
||||||
type: array
|
|
||||||
type: object
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: sync_workflow_sequence_from_bioyond参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-wait_for_multiple_orders_and_get_reports:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
batch_create_result: null
|
|
||||||
check_interval: 10
|
|
||||||
timeout: 7200
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
batch_create_result:
|
|
||||||
type: string
|
|
||||||
check_interval:
|
|
||||||
default: 10
|
|
||||||
type: integer
|
|
||||||
timeout:
|
|
||||||
default: 7200
|
|
||||||
type: integer
|
|
||||||
required: []
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: wait_for_multiple_orders_and_get_reports参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
auto-workflow_step_query:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
workflow_id: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
workflow_id:
|
|
||||||
type: string
|
|
||||||
required:
|
|
||||||
- workflow_id
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: workflow_step_query参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
drip_back:
|
drip_back:
|
||||||
feedback: {}
|
feedback: {}
|
||||||
goal:
|
goal:
|
||||||
@@ -333,13 +92,19 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟)
|
description: 观察时间(分钟)
|
||||||
type: string
|
type: string
|
||||||
titration_type:
|
titration_type:
|
||||||
description: 是否滴定(1=否, 2=是)
|
description: 是否滴定(NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
description: 是否观察 (1=否, 2=是)
|
description: 是否观察 (NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
volume:
|
volume:
|
||||||
description: 分液公式(μL)
|
description: 分液公式(mL)
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- volume
|
- volume
|
||||||
@@ -439,13 +204,19 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟)
|
description: 观察时间(分钟)
|
||||||
type: string
|
type: string
|
||||||
titration_type:
|
titration_type:
|
||||||
description: 是否滴定(1=否, 2=是)
|
description: 是否滴定(NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
description: 是否观察 (1=否, 2=是)
|
description: 是否观察 (NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
volume:
|
volume:
|
||||||
description: 分液公式(μL)
|
description: 分液公式(mL)
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- volume
|
- volume
|
||||||
@@ -489,7 +260,7 @@ reaction_station.bioyond:
|
|||||||
label: Solvents Data From Calculation Node
|
label: Solvents Data From Calculation Node
|
||||||
result: {}
|
result: {}
|
||||||
schema:
|
schema:
|
||||||
description: 液体投料-溶剂。可以直接提供volume(μL),或通过solvents对象自动从additional_solvent(mL)计算volume。
|
description: 液体投料-溶剂。可以直接提供volume(mL),或通过solvents对象自动从additional_solvent(mL)计算volume。
|
||||||
properties:
|
properties:
|
||||||
feedback: {}
|
feedback: {}
|
||||||
goal:
|
goal:
|
||||||
@@ -509,15 +280,21 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟),默认360
|
description: 观察时间(分钟),默认360
|
||||||
type: string
|
type: string
|
||||||
titration_type:
|
titration_type:
|
||||||
default: '1'
|
default: 'NO'
|
||||||
description: 是否滴定(1=否, 2=是),默认1
|
description: 是否滴定(NO=否, YES=是),默认NO
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
default: '2'
|
default: 'YES'
|
||||||
description: 是否观察 (1=否, 2=是),默认2
|
description: 是否观察 (NO=否, YES=是),默认YES
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
volume:
|
volume:
|
||||||
description: 分液量(μL)。可直接提供,或通过solvents参数自动计算
|
description: 分液量(mL)。可直接提供,或通过solvents参数自动计算
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- assign_material_name
|
- assign_material_name
|
||||||
@@ -590,15 +367,21 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟),默认90
|
description: 观察时间(分钟),默认90
|
||||||
type: string
|
type: string
|
||||||
titration_type:
|
titration_type:
|
||||||
default: '2'
|
default: 'YES'
|
||||||
description: 是否滴定(1=否, 2=是),默认2
|
description: 是否滴定(NO=否, YES=是),默认YES
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
default: '2'
|
default: 'YES'
|
||||||
description: 是否观察 (1=否, 2=是),默认2
|
description: 是否观察 (NO=否, YES=是),默认YES
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
volume_formula:
|
volume_formula:
|
||||||
description: 分液公式(μL)。可直接提供固定公式,或留空由系统根据x_value、feeding_order_data、extracted_actuals自动生成
|
description: 分液公式(mL)。可直接提供固定公式,或留空由系统根据x_value、feeding_order_data、extracted_actuals自动生成
|
||||||
type: string
|
type: string
|
||||||
x_value:
|
x_value:
|
||||||
description: 公式中的x值,手工输入,格式为"{{1-2-3}}"(包含双花括号)。用于自动公式计算
|
description: 公式中的x值,手工输入,格式为"{{1-2-3}}"(包含双花括号)。用于自动公式计算
|
||||||
@@ -646,13 +429,19 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟)
|
description: 观察时间(分钟)
|
||||||
type: string
|
type: string
|
||||||
titration_type:
|
titration_type:
|
||||||
description: 是否滴定(1=否, 2=是)
|
description: 是否滴定(NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
description: 是否观察 (1=否, 2=是)
|
description: 是否观察 (NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
volume_formula:
|
volume_formula:
|
||||||
description: 分液公式(μL)
|
description: 分液公式(mL)
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- volume_formula
|
- volume_formula
|
||||||
@@ -821,7 +610,11 @@ reaction_station.bioyond:
|
|||||||
description: 物料名称(用于获取试剂瓶位ID)
|
description: 物料名称(用于获取试剂瓶位ID)
|
||||||
type: string
|
type: string
|
||||||
material_id:
|
material_id:
|
||||||
description: 粉末类型ID,1=盐(21分钟),2=面粉(27分钟),3=BTDA(38分钟)
|
description: 粉末类型ID,Salt=盐(21分钟),Flour=面粉(27分钟),BTDA=BTDA(38分钟)
|
||||||
|
enum:
|
||||||
|
- Salt
|
||||||
|
- Flour
|
||||||
|
- BTDA
|
||||||
type: string
|
type: string
|
||||||
temperature:
|
temperature:
|
||||||
description: 温度设定(°C)
|
description: 温度设定(°C)
|
||||||
@@ -830,7 +623,10 @@ reaction_station.bioyond:
|
|||||||
description: 观察时间(分钟)
|
description: 观察时间(分钟)
|
||||||
type: string
|
type: string
|
||||||
torque_variation:
|
torque_variation:
|
||||||
description: 是否观察 (1=否, 2=是)
|
description: 是否观察 (NO=否, YES=是)
|
||||||
|
enum:
|
||||||
|
- 'NO'
|
||||||
|
- 'YES'
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
- assign_material_name
|
- assign_material_name
|
||||||
@@ -890,32 +686,7 @@ reaction_station.reactor:
|
|||||||
- reactor
|
- reactor
|
||||||
- reaction_station_bioyond
|
- reaction_station_bioyond
|
||||||
class:
|
class:
|
||||||
action_value_mappings:
|
action_value_mappings: {}
|
||||||
auto-update_metrics:
|
|
||||||
feedback: {}
|
|
||||||
goal: {}
|
|
||||||
goal_default:
|
|
||||||
payload: null
|
|
||||||
handles: {}
|
|
||||||
placeholder_keys: {}
|
|
||||||
result: {}
|
|
||||||
schema:
|
|
||||||
description: ''
|
|
||||||
properties:
|
|
||||||
feedback: {}
|
|
||||||
goal:
|
|
||||||
properties:
|
|
||||||
payload:
|
|
||||||
type: object
|
|
||||||
required:
|
|
||||||
- payload
|
|
||||||
type: object
|
|
||||||
result: {}
|
|
||||||
required:
|
|
||||||
- goal
|
|
||||||
title: update_metrics参数
|
|
||||||
type: object
|
|
||||||
type: UniLabJsonCommand
|
|
||||||
module: unilabos.devices.workstation.bioyond_studio.reaction_station:BioyondReactor
|
module: unilabos.devices.workstation.bioyond_studio.reaction_station:BioyondReactor
|
||||||
status_types:
|
status_types:
|
||||||
average_viscosity: Float64
|
average_viscosity: Float64
|
||||||
|
|||||||
Reference in New Issue
Block a user