mirror of
https://github.com/deepmodeling/Uni-Lab-OS
synced 2026-05-24 19:06:29 +00:00
Compare commits
3 Commits
a34ffcaeb9
...
feature/or
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e212dc7781 | ||
|
|
96c4be17dc | ||
|
|
44afc7733b |
@@ -180,8 +180,8 @@ class ItemizedCarrier(ResourcePLR):
|
|||||||
break
|
break
|
||||||
|
|
||||||
if idx is None:
|
if idx is None:
|
||||||
# 反序列化时无法匹配 site(名称或坐标均不符),退回父类默认分配,不更新 site 跟踪
|
# 反序列化时无法匹配 site(名称或坐标均不符)。
|
||||||
super().assign_child_resource(resource, location=location, reassign=reassign)
|
# WareHouse 通过 sites 追踪占用,无需将子资源加入 PLR 子树,直接跳过避免命名冲突。
|
||||||
return
|
return
|
||||||
|
|
||||||
if not reassign and self.sites[idx] is not None:
|
if not reassign and self.sites[idx] is not None:
|
||||||
|
|||||||
@@ -606,7 +606,10 @@ class ResourceTreeSet(object):
|
|||||||
},
|
},
|
||||||
"rotation": {"x": 0, "y": 0, "z": 0, "type": "Rotation"},
|
"rotation": {"x": 0, "y": 0, "z": 0, "type": "Rotation"},
|
||||||
"category": res.config.get("category", plr_type),
|
"category": res.config.get("category", plr_type),
|
||||||
"children": [node_to_plr_dict(child, has_model) for child in node.children],
|
# WareHouse 通过 sites 字符串追踪占位,不依赖 PLR children tree。
|
||||||
|
# 将 WareHouse 子节点排除在外,避免同名载架出现在多个 WareHouse 下时
|
||||||
|
# PLR _check_naming_conflicts 报命名冲突。
|
||||||
|
"children": [] if res.type == "warehouse" else [node_to_plr_dict(child, has_model) for child in node.children],
|
||||||
"parent_name": res.parent_instance_name,
|
"parent_name": res.parent_instance_name,
|
||||||
}
|
}
|
||||||
if has_model:
|
if has_model:
|
||||||
@@ -868,13 +871,34 @@ class ResourceTreeSet(object):
|
|||||||
f"已存在,跳过"
|
f"已存在,跳过"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 移除本地有但远端已不存在的物料(以远端为准)
|
||||||
|
remote_material_names = {m.res_content.name for m in remote_child.children}
|
||||||
|
removed_count = 0
|
||||||
|
for child in list(local_sub_device.children):
|
||||||
|
if child.res_content.name not in remote_material_names:
|
||||||
|
local_sub_device.children.remove(child)
|
||||||
|
removed_count += 1
|
||||||
|
logger.info(
|
||||||
|
f"移除远端已不存在的物料: '{remote_root_id}/{remote_child_name}/{child.res_content.name}'"
|
||||||
|
)
|
||||||
|
|
||||||
if added_count > 0:
|
if added_count > 0:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Device '{remote_root_id}/{remote_child_name}': "
|
f"Device '{remote_root_id}/{remote_child_name}': "
|
||||||
f"从远端同步了 {added_count} 个物料子树"
|
f"从远端同步了 {added_count} 个物料子树"
|
||||||
)
|
)
|
||||||
|
if removed_count > 0:
|
||||||
|
logger.info(
|
||||||
|
f"Device '{remote_root_id}/{remote_child_name}': "
|
||||||
|
f"移除了 {removed_count} 个远端已删除的物料"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
# 二级物料已存在,比较三级子节点是否缺失
|
# 二级物料已存在,比较三级子节点是否缺失
|
||||||
|
if remote_child_name not in local_children_map:
|
||||||
|
logger.warning(
|
||||||
|
f"物料 '{remote_root_id}/{remote_child_name}' 在远端存在但本地不存在,跳过"
|
||||||
|
)
|
||||||
|
continue
|
||||||
local_material = local_children_map[remote_child_name]
|
local_material = local_children_map[remote_child_name]
|
||||||
local_material_children_map = {child.res_content.name: child for child in
|
local_material_children_map = {child.res_content.name: child for child in
|
||||||
local_material.children}
|
local_material.children}
|
||||||
@@ -890,11 +914,28 @@ class ResourceTreeSet(object):
|
|||||||
f"物料 '{remote_root_id}/{remote_child_name}/{remote_sub_name}' "
|
f"物料 '{remote_root_id}/{remote_child_name}/{remote_sub_name}' "
|
||||||
f"已存在,跳过"
|
f"已存在,跳过"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 移除本地有但远端已不存在的子物料(以远端为准)
|
||||||
|
remote_sub_names = {s.res_content.name for s in remote_child.children}
|
||||||
|
removed_count = 0
|
||||||
|
for child in list(local_material.children):
|
||||||
|
if child.res_content.name not in remote_sub_names:
|
||||||
|
local_material.children.remove(child)
|
||||||
|
removed_count += 1
|
||||||
|
logger.info(
|
||||||
|
f"移除远端已不存在的子物料: '{remote_root_id}/{remote_child_name}/{child.res_content.name}'"
|
||||||
|
)
|
||||||
|
|
||||||
if added_count > 0:
|
if added_count > 0:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"物料 '{remote_root_id}/{remote_child_name}': "
|
f"物料 '{remote_root_id}/{remote_child_name}': "
|
||||||
f"从远端同步了 {added_count} 个子物料"
|
f"从远端同步了 {added_count} 个子物料"
|
||||||
)
|
)
|
||||||
|
if removed_count > 0:
|
||||||
|
logger.info(
|
||||||
|
f"物料 '{remote_root_id}/{remote_child_name}': "
|
||||||
|
f"移除了 {removed_count} 个远端已删除的子物料"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
# 情况1: 一级节点是物料(不是 device)
|
# 情况1: 一级节点是物料(不是 device)
|
||||||
# 检查是否已存在
|
# 检查是否已存在
|
||||||
|
|||||||
@@ -15,92 +15,92 @@
|
|||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"api_key": "YOUR_API_KEY",
|
"api_key": "<BIOYOND_API_KEY>",
|
||||||
"api_host": "http://your-api-host:port",
|
"api_host": "http://<BIOYOND_HOST>:<BIOYOND_PORT>",
|
||||||
"material_type_mappings": {
|
"material_type_mappings": {
|
||||||
"BIOYOND_PolymerStation_1FlaskCarrier": [
|
"BIOYOND_PolymerStation_1FlaskCarrier": [
|
||||||
"烧杯",
|
"烧杯",
|
||||||
"uuid-placeholder-flask"
|
"<UUID_FLASK_CARRIER_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_1BottleCarrier": [
|
"BIOYOND_PolymerStation_1BottleCarrier": [
|
||||||
"试剂瓶",
|
"试剂瓶",
|
||||||
"uuid-placeholder-bottle"
|
"<UUID_BOTTLE_CARRIER_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_6StockCarrier": [
|
"BIOYOND_PolymerStation_6StockCarrier": [
|
||||||
"分装板",
|
"分装板",
|
||||||
"uuid-placeholder-stock-6"
|
"<UUID_6STOCK_CARRIER_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_Liquid_Vial": [
|
"BIOYOND_PolymerStation_Liquid_Vial": [
|
||||||
"10%分装小瓶",
|
"10%分装小瓶",
|
||||||
"uuid-placeholder-liquid-vial"
|
"<UUID_LIQUID_VIAL_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_Solid_Vial": [
|
"BIOYOND_PolymerStation_Solid_Vial": [
|
||||||
"90%分装小瓶",
|
"90%分装小瓶",
|
||||||
"uuid-placeholder-solid-vial"
|
"<UUID_SOLID_VIAL_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_8StockCarrier": [
|
"BIOYOND_PolymerStation_8StockCarrier": [
|
||||||
"样品板",
|
"样品板",
|
||||||
"uuid-placeholder-stock-8"
|
"<UUID_8STOCK_CARRIER_TYPE>"
|
||||||
],
|
],
|
||||||
"BIOYOND_PolymerStation_Solid_Stock": [
|
"BIOYOND_PolymerStation_Solid_Stock": [
|
||||||
"样品瓶",
|
"样品瓶",
|
||||||
"uuid-placeholder-solid-stock"
|
"<UUID_SOLID_STOCK_TYPE>"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"warehouse_mapping": {
|
"warehouse_mapping": {
|
||||||
"粉末堆栈": {
|
"粉末堆栈": {
|
||||||
"uuid": "uuid-placeholder-powder-stack",
|
"uuid": "<UUID_POWDER_WAREHOUSE>",
|
||||||
"site_uuids": {
|
"site_uuids": {
|
||||||
"A01": "uuid-placeholder-powder-A01",
|
"A01": "<UUID_POWDER_A01>",
|
||||||
"A02": "uuid-placeholder-powder-A02",
|
"A02": "<UUID_POWDER_A02>",
|
||||||
"A03": "uuid-placeholder-powder-A03",
|
"A03": "<UUID_POWDER_A03>",
|
||||||
"A04": "uuid-placeholder-powder-A04",
|
"A04": "<UUID_POWDER_A04>",
|
||||||
"B01": "uuid-placeholder-powder-B01",
|
"B01": "<UUID_POWDER_B01>",
|
||||||
"B02": "uuid-placeholder-powder-B02",
|
"B02": "<UUID_POWDER_B02>",
|
||||||
"B03": "uuid-placeholder-powder-B03",
|
"B03": "<UUID_POWDER_B03>",
|
||||||
"B04": "uuid-placeholder-powder-B04",
|
"B04": "<UUID_POWDER_B04>",
|
||||||
"C01": "uuid-placeholder-powder-C01",
|
"C01": "<UUID_POWDER_C01>",
|
||||||
"C02": "uuid-placeholder-powder-C02",
|
"C02": "<UUID_POWDER_C02>",
|
||||||
"C03": "uuid-placeholder-powder-C03",
|
"C03": "<UUID_POWDER_C03>",
|
||||||
"C04": "uuid-placeholder-powder-C04",
|
"C04": "<UUID_POWDER_C04>",
|
||||||
"D01": "uuid-placeholder-powder-D01",
|
"D01": "<UUID_POWDER_D01>",
|
||||||
"D02": "uuid-placeholder-powder-D02",
|
"D02": "<UUID_POWDER_D02>",
|
||||||
"D03": "uuid-placeholder-powder-D03",
|
"D03": "<UUID_POWDER_D03>",
|
||||||
"D04": "uuid-placeholder-powder-D04"
|
"D04": "<UUID_POWDER_D04>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"溶液堆栈": {
|
"溶液堆栈": {
|
||||||
"uuid": "uuid-placeholder-liquid-stack",
|
"uuid": "<UUID_SOLUTION_WAREHOUSE>",
|
||||||
"site_uuids": {
|
"site_uuids": {
|
||||||
"A01": "uuid-placeholder-liquid-A01",
|
"A01": "<UUID_SOLUTION_A01>",
|
||||||
"A02": "uuid-placeholder-liquid-A02",
|
"A02": "<UUID_SOLUTION_A02>",
|
||||||
"A03": "uuid-placeholder-liquid-A03",
|
"A03": "<UUID_SOLUTION_A03>",
|
||||||
"A04": "uuid-placeholder-liquid-A04",
|
"A04": "<UUID_SOLUTION_A04>",
|
||||||
"B01": "uuid-placeholder-liquid-B01",
|
"B01": "<UUID_SOLUTION_B01>",
|
||||||
"B02": "uuid-placeholder-liquid-B02",
|
"B02": "<UUID_SOLUTION_B02>",
|
||||||
"B03": "uuid-placeholder-liquid-B03",
|
"B03": "<UUID_SOLUTION_B03>",
|
||||||
"B04": "uuid-placeholder-liquid-B04",
|
"B04": "<UUID_SOLUTION_B04>",
|
||||||
"C01": "uuid-placeholder-liquid-C01",
|
"C01": "<UUID_SOLUTION_C01>",
|
||||||
"C02": "uuid-placeholder-liquid-C02",
|
"C02": "<UUID_SOLUTION_C02>",
|
||||||
"C03": "uuid-placeholder-liquid-C03",
|
"C03": "<UUID_SOLUTION_C03>",
|
||||||
"C04": "uuid-placeholder-liquid-C04",
|
"C04": "<UUID_SOLUTION_C04>",
|
||||||
"D01": "uuid-placeholder-liquid-D01",
|
"D01": "<UUID_SOLUTION_D01>",
|
||||||
"D02": "uuid-placeholder-liquid-D02",
|
"D02": "<UUID_SOLUTION_D02>",
|
||||||
"D03": "uuid-placeholder-liquid-D03",
|
"D03": "<UUID_SOLUTION_D03>",
|
||||||
"D04": "uuid-placeholder-liquid-D04"
|
"D04": "<UUID_SOLUTION_D04>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"试剂堆栈": {
|
"试剂堆栈": {
|
||||||
"uuid": "uuid-placeholder-reagent-stack",
|
"uuid": "<UUID_REAGENT_WAREHOUSE>",
|
||||||
"site_uuids": {
|
"site_uuids": {
|
||||||
"A01": "uuid-placeholder-reagent-A01",
|
"A01": "<UUID_REAGENT_A01>",
|
||||||
"A02": "uuid-placeholder-reagent-A02",
|
"A02": "<UUID_REAGENT_A02>",
|
||||||
"A03": "uuid-placeholder-reagent-A03",
|
"A03": "<UUID_REAGENT_A03>",
|
||||||
"A04": "uuid-placeholder-reagent-A04",
|
"A04": "<UUID_REAGENT_A04>",
|
||||||
"B01": "uuid-placeholder-reagent-B01",
|
"B01": "<UUID_REAGENT_B01>",
|
||||||
"B02": "uuid-placeholder-reagent-B02",
|
"B02": "<UUID_REAGENT_B02>",
|
||||||
"B03": "uuid-placeholder-reagent-B03",
|
"B03": "<UUID_REAGENT_B03>",
|
||||||
"B04": "uuid-placeholder-reagent-B04"
|
"B04": "<UUID_REAGENT_B04>"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user