修改部分接口

This commit is contained in:
靳中伟 2025-07-17 15:47:56 +08:00
parent 7ebf10fc12
commit de82ddf7cd
19 changed files with 1093 additions and 54 deletions

View File

@ -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" //库位名称
}
]
}

View File

@ -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 | 库区名称 |

View File

@ -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):
"""获取可用层数"""

View File

@ -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):
"""

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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="是否锁定")

View File

@ -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,

View File

@ -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 = {

View File

@ -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,

View File

@ -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,