修改部分接口
This commit is contained in:
parent
7ebf10fc12
commit
de82ddf7cd
@ -94,53 +94,49 @@
|
||||
"operate_points": [
|
||||
{
|
||||
"station_name": "STATION-A-001",
|
||||
"storage_location_name": "库位A001",
|
||||
"area_name": "一般存储区B",
|
||||
"max_layers": 2,
|
||||
"layers": [
|
||||
{
|
||||
"layer_name": "1-1"
|
||||
"layer_name": "1-1" // 库位名称
|
||||
},
|
||||
{
|
||||
"layer_name": "1-2"
|
||||
"layer_name": "1-2" // 库位名称
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"station_name": "STATION-B-001",
|
||||
"storage_location_name": "库位B002",
|
||||
"area_name": "一般存储区B",
|
||||
"max_layers": 1,
|
||||
"layers": [
|
||||
{
|
||||
"layer_name": "2-1"
|
||||
"layer_name": "2-1" //库位名称
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"station_name": "STATION-B-004",
|
||||
"storage_location_name": "库位B004",
|
||||
"area_name": "一般存储区C",
|
||||
"max_layers": 3,
|
||||
"layers": [
|
||||
{
|
||||
"layer_name": "4-1"
|
||||
"layer_name": "4-1" //库位名称
|
||||
},
|
||||
{
|
||||
"layer_name": "4-2"
|
||||
"layer_name": "4-2" // 库位名称
|
||||
},
|
||||
{
|
||||
"layer_name": "4-3"
|
||||
"layer_name": "4-3"// 库位名称
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"station_name": "STATION-B-003",
|
||||
"storage_location_name": "库位B003",
|
||||
"max_layers": 1,
|
||||
"layers": [
|
||||
{
|
||||
"layer_name": "3-1"
|
||||
"layer_name": "3-1" //库位名称
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -31,7 +31,6 @@
|
||||
| scene_id | string | 否 | 场景ID |
|
||||
| storage_area_id | string | 否 | 库区ID |
|
||||
| station_name | string | 否 | 站点名称(支持模糊搜索) |
|
||||
| storage_location_name | string | 否 | 库位名称(支持模糊搜索) |
|
||||
| layer_name | string | 否 | 层名称(支持模糊搜索) |
|
||||
| is_disabled | boolean | 否 | 是否禁用 |
|
||||
| is_occupied | boolean | 否 | 是否占用 |
|
||||
@ -82,7 +81,6 @@
|
||||
},
|
||||
"operate_point_id": "637defff-4670-4574-a73e-033bc94941a5",
|
||||
"station_name": "STATION-B-004",
|
||||
"storage_location_name": "库位B004",
|
||||
"scene_id": "1936411520272753371",
|
||||
"storage_area_id": "df28bb5a-f88f-4825-93e6-a1dae7c34bb1",
|
||||
"storage_area_type": "general",
|
||||
@ -141,7 +139,6 @@
|
||||
| ------------------------- | ------- | -------------------------------- |
|
||||
| operate_point_id | string | 动作点ID |
|
||||
| station_name | string | 站点名称 |
|
||||
| storage_location_name | string | 库位名称 |
|
||||
| scene_id | string | 场景ID |
|
||||
| storage_area_id | string | 库区ID |
|
||||
| storage_area_type | string | 库区类型 |
|
||||
@ -405,7 +402,6 @@ GET /api/vwed-operate-point/list?scene_id=scene-001&is_occupied=false&page=1&pag
|
||||
"operate_point_info": {
|
||||
"id": "point-001",
|
||||
"station_name": "存储站点A",
|
||||
"storage_location_name": "A1库位",
|
||||
"scene_id": "scene-001",
|
||||
"area_name": "密集存储区"
|
||||
},
|
||||
@ -454,7 +450,6 @@ GET /api/vwed-operate-point/list?scene_id=scene-001&is_occupied=false&page=1&pag
|
||||
| --------------------- | ------ | ------------ |
|
||||
| id | string | 动作点ID |
|
||||
| station_name | string | 站点名称 |
|
||||
| storage_location_name | string | 库位名称 |
|
||||
| scene_id | string | 场景ID |
|
||||
| area_name | string | 库区名称 |
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -23,7 +23,7 @@ class OperatePoint(BaseModel):
|
||||
|
||||
id = Column(CHAR(64), primary_key=True, comment='动作点ID')
|
||||
station_name = Column(String(64), nullable=False, comment='动作站点名称')
|
||||
storage_location_name = Column(String(64), nullable=False, comment='库位名称')
|
||||
# storage_location_name = Column(String(64), nullable=False, comment='库位名称')
|
||||
scene_id = Column(String(64), nullable=False, comment='场景ID')
|
||||
|
||||
# 原有字段
|
||||
@ -65,7 +65,7 @@ class OperatePoint(BaseModel):
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return f"<OperatePoint(id={self.id}, station_name={self.station_name}, storage_location_name={self.storage_location_name}, storage_area_id={self.storage_area_id}, storage_area_type={self.storage_area_type}, area_name={self.area_name})>"
|
||||
return f"<OperatePoint(id={self.id}, station_name={self.station_name}, storage_area_id={self.storage_area_id}, storage_area_type={self.storage_area_type}, area_name={self.area_name})>"
|
||||
|
||||
def get_available_layers(self):
|
||||
"""获取可用层数"""
|
||||
|
@ -23,11 +23,11 @@ class OperatePointLayer(BaseModel):
|
||||
id = Column(CHAR(64), primary_key=True, comment='层ID')
|
||||
operate_point_id = Column(CHAR(64), ForeignKey('vwed_operate_point.id'), nullable=False, comment='动作点ID')
|
||||
station_name = Column(String(64), nullable=False, comment='动作点名称')
|
||||
storage_location_name = Column(String(64), nullable=False, comment='库位名称')
|
||||
# storage_location_name = Column(String(64), nullable=False, comment='库位名称')
|
||||
area_name = Column(String(64), nullable=True, comment='库区名称')
|
||||
scene_id = Column(String(64), nullable=False, comment='场景ID(冗余字段)')
|
||||
layer_index = Column(Integer, nullable=False, comment='层索引(从1开始)')
|
||||
layer_name = Column(String(64), comment='层名称')
|
||||
layer_name = Column(String(64), comment='库位名称')
|
||||
|
||||
# 货物状态
|
||||
is_occupied = Column(Boolean, nullable=False, default=False, comment='是否占用')
|
||||
@ -66,7 +66,7 @@ class OperatePointLayer(BaseModel):
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return f"<OperatePointLayer(id={self.id}, operate_point_id={self.operate_point_id}, station_name={self.station_name}, storage_location_name={self.storage_location_name}, area_name={self.area_name}, scene_id={self.scene_id}, layer_index={self.layer_index})>"
|
||||
return f"<OperatePointLayer(id={self.id}, operate_point_id={self.operate_point_id}, station_name={self.station_name}, area_name={self.area_name}, scene_id={self.scene_id}, layer_index={self.layer_index})>"
|
||||
|
||||
def can_store_goods(self, weight=None, volume=None):
|
||||
"""
|
||||
|
1072
logs/app.log
1072
logs/app.log
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -30,7 +30,6 @@ class OperatePointLayerData(BaseModel):
|
||||
class OperatePointData(BaseModel):
|
||||
"""动作点数据"""
|
||||
station_name: str = Field(..., description="动作站点名称")
|
||||
storage_location_name: str = Field(..., description="库位名称")
|
||||
area_name: Optional[str] = Field(None, description="所属库区名称")
|
||||
max_layers: int = Field(1, ge=1, description="最大层数")
|
||||
position_x: Optional[int] = Field(None, description="X坐标")
|
||||
@ -39,7 +38,7 @@ class OperatePointData(BaseModel):
|
||||
content: Optional[str] = Field("", description="内容")
|
||||
tags: Optional[str] = Field("", description="标签")
|
||||
description: Optional[str] = Field(None, description="动作点描述")
|
||||
layers: Optional[List[OperatePointLayerData]] = Field(None, description="分层数据")
|
||||
layers: Optional[List[OperatePointLayerData]] = Field(None, description="库位名称")
|
||||
|
||||
@validator('layers')
|
||||
def validate_layers(cls, v, values):
|
||||
@ -85,10 +84,6 @@ class MapDataPushRequest(BaseModel):
|
||||
if len(station_names) != len(set(station_names)):
|
||||
raise ValueError("动作站点名称不能重复")
|
||||
|
||||
# 检查库位名称是否重复
|
||||
storage_location_names = [point.storage_location_name for point in v]
|
||||
if len(storage_location_names) != len(set(storage_location_names)):
|
||||
raise ValueError("库位名称不能重复")
|
||||
|
||||
return v
|
||||
|
||||
|
@ -94,7 +94,6 @@ class StorageLocationInfo(BaseModel):
|
||||
# 动作点信息(直接平铺)
|
||||
operate_point_id: Optional[str] = Field(None, description="所属动作点ID")
|
||||
station_name: Optional[str] = Field(None, description="动作站点名称")
|
||||
storage_location_name: Optional[str] = Field(None, description="库位名称")
|
||||
scene_id: Optional[str] = Field(None, description="场景ID")
|
||||
storage_area_id: Optional[str] = Field(None, description="所属库区ID")
|
||||
storage_area_type: Optional[str] = Field(None, description="库区类型")
|
||||
@ -112,8 +111,7 @@ class StorageLocationListRequest(BaseModel):
|
||||
scene_id: Optional[str] = Field(None, description="场景ID")
|
||||
storage_area_id: Optional[str] = Field(None, description="库区ID")
|
||||
station_name: Optional[str] = Field(None, description="站点名称(支持模糊搜索)")
|
||||
storage_location_name: Optional[str] = Field(None, description="库位名称(支持模糊搜索)")
|
||||
layer_name: Optional[str] = Field(None, description="层名称(支持模糊搜索)")
|
||||
layer_name: Optional[str] = Field(None, description="库位名称(支持模糊搜索)")
|
||||
is_disabled: Optional[bool] = Field(None, description="是否禁用")
|
||||
is_occupied: Optional[bool] = Field(None, description="是否占用")
|
||||
is_locked: Optional[bool] = Field(None, description="是否锁定")
|
||||
|
@ -78,7 +78,6 @@ async def get_storage_location_list(
|
||||
scene_id: Optional[str] = Query(None, description="场景ID"),
|
||||
storage_area_id: Optional[str] = Query(None, description="库区ID"),
|
||||
station_name: Optional[str] = Query(None, description="站点名称(支持模糊搜索)"),
|
||||
storage_location_name: Optional[str] = Query(None, description="库位名称(支持模糊搜索)"),
|
||||
layer_name: Optional[str] = Query(None, description="层名称(支持模糊搜索)"),
|
||||
is_disabled: Optional[bool] = Query(None, description="是否禁用"),
|
||||
is_occupied: Optional[bool] = Query(None, description="是否占用"),
|
||||
@ -99,7 +98,6 @@ async def get_storage_location_list(
|
||||
- 场景ID:根据场景筛选库位
|
||||
- 库区ID:根据库区筛选库位
|
||||
- 站点名称:支持模糊搜索
|
||||
- 库位名称:支持模糊搜索
|
||||
- 层名称:支持模糊搜索
|
||||
- 是否禁用:筛选禁用/启用的库位
|
||||
- 是否占用:筛选已占用/空闲的库位
|
||||
@ -121,7 +119,6 @@ async def get_storage_location_list(
|
||||
scene_id: 场景ID
|
||||
storage_area_id: 库区ID
|
||||
station_name: 站点名称
|
||||
storage_location_name: 库位名称
|
||||
layer_name: 层名称
|
||||
is_disabled: 是否禁用
|
||||
is_occupied: 是否占用
|
||||
@ -142,7 +139,6 @@ async def get_storage_location_list(
|
||||
scene_id=scene_id,
|
||||
storage_area_id=storage_area_id,
|
||||
station_name=station_name,
|
||||
storage_location_name=storage_location_name,
|
||||
layer_name=layer_name,
|
||||
is_disabled=is_disabled,
|
||||
is_occupied=is_occupied,
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -193,7 +193,7 @@ class RobotBlockHandler(BlockHandler):
|
||||
"""调用外部API的通用方法"""
|
||||
return await call_robot_api(api_name, params)
|
||||
|
||||
async def _validate_and_convert_key_route(self, key_route: str, map_id: str) -> tuple[bool, str, str]:
|
||||
async def _validate_and_convert_key_route(self, key_route: str, map_id: str, flag: bool = False) -> tuple[bool, str, str]:
|
||||
"""
|
||||
校验并转换keyRoute参数
|
||||
|
||||
@ -240,7 +240,8 @@ class RobotBlockHandler(BlockHandler):
|
||||
station_name = operate_point_layer.station_name
|
||||
logger.info(f"keyRoute '{key_route}' 识别为库位,对应的动作点: {station_name},场景ID: {map_id}")
|
||||
return True, station_name, ""
|
||||
|
||||
if flag:
|
||||
return True, key_route, ""
|
||||
# 都不匹配,返回错误
|
||||
error_msg = f"keyRoute '{key_route}' 在场景 {map_id} 中既不是有效的动作点名称也不是有效的库位名称"
|
||||
logger.error(error_msg)
|
||||
@ -745,7 +746,7 @@ class SelectAgvBlockHandler(RobotBlockHandler):
|
||||
|
||||
# 校验并转换keyRoute参数
|
||||
# print(f"input_params >>>>>>>>>>>>>>>>>>>>>>>>>>>> key_route: {key_route}, map_id: {map_id}")
|
||||
is_valid, key_station_name, error_msg = await self._validate_and_convert_key_route(key_route, map_id)
|
||||
is_valid, key_station_name, error_msg = await self._validate_and_convert_key_route(key_route, map_id, flag=True)
|
||||
# print(f"output_params >>>>>>>>>>>>>>>>>>>>>>>>>>>> key_station_name: {key_station_name}, error_msg: {error_msg}")
|
||||
if not is_valid:
|
||||
result = {
|
||||
|
@ -76,14 +76,8 @@ class MapDataService:
|
||||
duplicate_stations.append(point_data.station_name)
|
||||
logger.warning(f"发现在请求中重复的站点名称: {point_data.station_name}")
|
||||
continue
|
||||
|
||||
if point_data.storage_location_name in seen_location_names:
|
||||
duplicate_stations.append(f"{point_data.station_name}(库位名重复)")
|
||||
logger.warning(f"发现在请求中重复的库位名称: {point_data.storage_location_name}")
|
||||
continue
|
||||
|
||||
|
||||
seen_station_names.add(point_data.station_name)
|
||||
seen_location_names.add(point_data.storage_location_name)
|
||||
valid_operate_points.append(point_data)
|
||||
|
||||
# 处理动作点数据 - 增量更新
|
||||
@ -232,7 +226,6 @@ class MapDataService:
|
||||
|
||||
if existing_point:
|
||||
# 更新现有动作点
|
||||
existing_point.storage_location_name = point_data.storage_location_name
|
||||
existing_point.storage_area_id = storage_area.id if storage_area else None
|
||||
existing_point.storage_area_type = storage_area.area_type if storage_area else None
|
||||
existing_point.area_name = point_data.area_name
|
||||
@ -252,9 +245,8 @@ class MapDataService:
|
||||
new_point = OperatePoint(
|
||||
id=str(uuid.uuid4()),
|
||||
station_name=point_data.station_name,
|
||||
storage_location_name=point_data.storage_location_name,
|
||||
scene_id=scene_id,
|
||||
storage_area_id=storage_area.id if storage_area else None,
|
||||
# storage_area_id=storage_area.id if storage_area else None,
|
||||
storage_area_type=storage_area.area_type if storage_area else None,
|
||||
area_name=point_data.area_name,
|
||||
max_layers=point_data.max_layers,
|
||||
@ -321,7 +313,6 @@ class MapDataService:
|
||||
id=str(uuid.uuid4()),
|
||||
operate_point_id=operate_point.id,
|
||||
station_name=operate_point.station_name,
|
||||
storage_location_name=operate_point.storage_location_name,
|
||||
area_name=operate_point.area_name,
|
||||
scene_id=operate_point.scene_id,
|
||||
layer_index=layer_index,
|
||||
|
@ -60,11 +60,8 @@ class OperatePointService:
|
||||
if request.station_name:
|
||||
query = query.filter(OperatePointLayer.station_name.like(f"%{request.station_name}%"))
|
||||
|
||||
|
||||
# 库位名称模糊搜索
|
||||
if request.storage_location_name:
|
||||
query = query.filter(OperatePointLayer.storage_location_name.like(f"%{request.storage_location_name}%"))
|
||||
|
||||
# 层名称模糊搜索
|
||||
if request.layer_name:
|
||||
query = query.filter(OperatePointLayer.layer_name.like(f"%{request.layer_name}%"))
|
||||
|
||||
@ -161,7 +158,6 @@ class OperatePointService:
|
||||
if include_operate_point_info and layer.operate_point:
|
||||
storage_location_info.operate_point_id = layer.operate_point.id
|
||||
storage_location_info.station_name = layer.operate_point.station_name
|
||||
storage_location_info.storage_location_name = layer.operate_point.storage_location_name
|
||||
storage_location_info.scene_id = layer.operate_point.scene_id
|
||||
storage_location_info.storage_area_id = layer.operate_point.storage_area_id
|
||||
storage_location_info.storage_area_type = layer.operate_point.storage_area_type.value if layer.operate_point.storage_area_type else None
|
||||
@ -1068,7 +1064,6 @@ class OperatePointService:
|
||||
operate_point_info = {
|
||||
"id": layer.operate_point.id,
|
||||
"station_name": layer.operate_point.station_name,
|
||||
"storage_location_name": layer.operate_point.storage_location_name,
|
||||
"scene_id": layer.operate_point.scene_id,
|
||||
"storage_area_id": layer.operate_point.storage_area_id,
|
||||
"storage_area_type": layer.operate_point.storage_area_type.value if layer.operate_point.storage_area_type else None,
|
||||
|
Loading…
x
Reference in New Issue
Block a user