feat(agv): 扩展AGV控制协议定义,新增18个功能模块

- 添加详细的Protobuf消息定义和注释文档
- 新增基本信息查询、电池状态、位置查询等功能模块
- 增加地图上传下载、控制权管理、运动控制等核心功能
- 实现导航任务、站点管理、任务状态查询等高级特性
- 完善AGV服务接口定义,整合所有AGV相关命令
- 提供详细的API参数说明和使用注意事项
This commit is contained in:
lixiaolong 2026-06-25 17:25:34 +08:00
parent fe68120f71
commit 87d691f927
9 changed files with 82236 additions and 481 deletions

View File

@ -19,7 +19,7 @@ import java.util.List;
* @author cmvr-iot * @author cmvr-iot
* @since 2026-06-05 * @since 2026-06-05
*/ */
@Api(tags = "巡检任务执行日志管理") @Api(tags = "智能巡检-巡检任务执行日志管理")
@RestController @RestController
@RequestMapping("/inspection/taskLog") @RequestMapping("/inspection/taskLog")
public class InspectionTaskLogController extends BaseController public class InspectionTaskLogController extends BaseController

View File

@ -45,6 +45,15 @@ public interface EdgeAgvService {
*/ */
AgvCommand.AgvDownloadMapResult robotConfigDownloadMap(EdgeCommonVO edgeCommonVO, String mapName); AgvCommand.AgvDownloadMapResult robotConfigDownloadMap(EdgeCommonVO edgeCommonVO, String mapName);
/**
* 上传地图从服务器上传地图到机器人
*
* @param edgeCommonVO 边缘通用参数
* @param mapContent 地图内容
* @return 上传结果
*/
AgvCommand.AgvUploadMapResult robotConfigUploadMap(EdgeCommonVO edgeCommonVO, String mapContent);
/** /**
* 获取电池状态 * 获取电池状态
@ -53,4 +62,87 @@ public interface EdgeAgvService {
* @return 电池状态 * @return 电池状态
*/ */
AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO); AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO);
/**
* 单点站点自动规划导航命令码3051
* 从起始站点自动规划路径到目标站点支持多种操作类型顶升货叉滚筒等
* 注意此命令会取消当前正在执行的任务严禁用于多车调度场景
*
* @param edgeCommonVO 边缘通用参数
* @param sourceId 起始站点ID"SELF_POSITION"表示当前位置
* @param targetId 目标站点ID"SELF_POSITION"表示原地执行操作
* @param taskId 任务ID可选建议提供
* @param operation 操作类型"JackLoad"顶升装载"ForkUnload"货叉卸载等可选
* @param jackHeight 顶升高度仅当operation为顶升相关时有效可选
* @return 导航任务下发结果
*/
AgvCommand.RobotGoTargetResData robotGoTarget(EdgeCommonVO edgeCommonVO, String sourceId, String targetId,
String taskId, String operation, Double jackHeight);
/**
* 暂停当前导航任务命令码3001
* 暂停AGV当前正在执行的导航任务AGV将减速停止
*
* @param edgeCommonVO 边缘通用参数
* @return 暂停结果
*/
AgvCommand.RobotTaskPauseCommand.Feedback.Result robotTaskPause(EdgeCommonVO edgeCommonVO);
/**
* 继续当前导航任务命令码3002
* 恢复之前被暂停的导航任务AGV将继续执行
*
* @param edgeCommonVO 边缘通用参数
* @return 继续结果
*/
AgvCommand.RobotTaskResumeCommand.Feedback.Result robotTaskResume(EdgeCommonVO edgeCommonVO);
/**
* 取消当前导航任务命令码3003
* 完全取消当前正在执行或暂停的导航任务
*
* @param edgeCommonVO 边缘通用参数
* @return 取消结果
*/
AgvCommand.RobotTaskCancelCommand.Feedback.Result robotTaskCancel(EdgeCommonVO edgeCommonVO);
/**
* 查询当前实时导航状态命令码1020
* 获取AGV当前导航任务的详细状态包括任务进度已经过站点剩余站点等
*
* @param edgeCommonVO 边缘通用参数
* @param simple 是否仅返回任务状态true=仅task_statusfalse=全量信息
* @return 导航状态信息
*/
AgvCommand.RobotStatusTaskResData getRobotStatusTaskCurrent(EdgeCommonVO edgeCommonVO, boolean simple);
/**
* 查询当前地图站点列表命令码1301
* 获取当前加载地图中的所有站点信息包括站点坐标类型描述等
*
* @param edgeCommonVO 边缘通用参数
* @return 站点列表信息
*/
AgvCommand.QueryStationListResult queryStationList(EdgeCommonVO edgeCommonVO);
/**
* 切换载入地图命令码2022
* 将AGV切换到指定的地图目标地图必须已存在于机器人中
* 切换后需要等待地图加载完成才能执行导航任务
*
* @param edgeCommonVO 边缘通用参数
* @param mapName 目标地图名称必填仅允许字母数字-_
* @return 切换地图结果
*/
AgvCommand.RobotLoadMapResult robotLoadMap(EdgeCommonVO edgeCommonVO, String mapName);
/**
* 查询地图载入状态命令码1022
* 查询当前地图加载的状态可用于判断地图是否加载完成
* 状态值0=失败1=成功2=加载中加载中时禁止执行重定位操作
*
* @param edgeCommonVO 边缘通用参数
* @return 地图加载状态
*/
AgvCommand.RobotQueryLoadMapStatusResult queryLoadMapStatus(EdgeCommonVO edgeCommonVO);
} }

View File

@ -78,6 +78,28 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
return result; return result;
} }
@Override
public AgvCommand.AgvUploadMapResult robotConfigUploadMap(EdgeCommonVO edgeCommonVO, String mapContent) {
if (StrUtil.isBlank(mapContent)) {
throw new GlobalException("地图内容不能为空");
}
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotConfigUploadMapRequestData requestData = AgvCommand.RobotConfigUploadMapRequestData.newBuilder()
.setMapContent(mapContent)
.build();
AgvCommand.RobotConfigUploadMapCommand.Request request = AgvCommand.RobotConfigUploadMapCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setData(requestData)
.build();
AgvCommand.AgvUploadMapResult result = executeGrpcCall(() -> stub.robotConfigUploadMap(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("上传地图失败: " + result.getErrMsg());
}
return result;
}
@Override @Override
public AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO) { public AgvCommand.AgvBatteryStatus getBatteryStatus(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient( AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
@ -92,6 +114,155 @@ public class EdgeAgvServiceImpl implements EdgeAgvService {
return executeGrpcCall(() -> stub.getBatteryStatus(request)).getStatus(); return executeGrpcCall(() -> stub.getBatteryStatus(request)).getStatus();
} }
@Override
public AgvCommand.RobotGoTargetResData robotGoTarget(EdgeCommonVO edgeCommonVO, String sourceId, String targetId,
String taskId, String operation, Double jackHeight) {
if (StrUtil.isBlank(sourceId)) {
throw new GlobalException("起始站点ID不能为空");
}
if (StrUtil.isBlank(targetId)) {
throw new GlobalException("目标站点ID不能为空");
}
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
// 构建请求数据
AgvCommand.RobotGoTargetReqData.Builder dataBuilder = AgvCommand.RobotGoTargetReqData.newBuilder()
.setSourceId(sourceId)
.setId(targetId);
// 设置可选参数
if (StrUtil.isNotBlank(taskId)) {
dataBuilder.setTaskId(taskId);
}
if (StrUtil.isNotBlank(operation)) {
dataBuilder.setOperation(operation);
}
if (jackHeight != null) {
dataBuilder.setJackHeight(jackHeight);
}
AgvCommand.RobotGoTargetCommand.Request request = AgvCommand.RobotGoTargetCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setData(dataBuilder.build())
.build();
AgvCommand.RobotGoTargetResData result = executeGrpcCall(() -> stub.robotGoTarget(request)).getData();
if (result.getRetCode() != 0) {
throw new GlobalException("单点导航任务下发失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotTaskPauseCommand.Feedback.Result robotTaskPause(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotTaskPauseCommand.Request request = AgvCommand.RobotTaskPauseCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build();
AgvCommand.RobotTaskPauseCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskPause(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("暂停导航任务失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotTaskResumeCommand.Feedback.Result robotTaskResume(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotTaskResumeCommand.Request request = AgvCommand.RobotTaskResumeCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build();
AgvCommand.RobotTaskResumeCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskResume(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("继续导航任务失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotTaskCancelCommand.Feedback.Result robotTaskCancel(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotTaskCancelCommand.Request request = AgvCommand.RobotTaskCancelCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build();
AgvCommand.RobotTaskCancelCommand.Feedback.Result result = executeGrpcCall(() -> stub.robotTaskCancel(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("取消导航任务失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotStatusTaskResData getRobotStatusTaskCurrent(EdgeCommonVO edgeCommonVO, boolean simple) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotStatusTaskReqData requestData = AgvCommand.RobotStatusTaskReqData.newBuilder()
.setSimple(simple)
.build();
AgvCommand.RobotStatusTaskCurrentCommand.Request request = AgvCommand.RobotStatusTaskCurrentCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setData(requestData)
.build();
return executeGrpcCall(() -> stub.robotStatusTaskCurrent(request)).getData();
}
@Override
public AgvCommand.QueryStationListResult queryStationList(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.QueryStationListCommand.Request request = AgvCommand.QueryStationListCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build();
AgvCommand.QueryStationListResult result = executeGrpcCall(() -> stub.queryStationList(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("查询站点列表失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotLoadMapResult robotLoadMap(EdgeCommonVO edgeCommonVO, String mapName) {
if (StrUtil.isBlank(mapName)) {
throw new GlobalException("地图名称不能为空");
}
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotLoadMapRequestData requestData = AgvCommand.RobotLoadMapRequestData.newBuilder()
.setMapName(mapName)
.build();
AgvCommand.RobotLoadMapCommand.Request request = AgvCommand.RobotLoadMapCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.setData(requestData)
.build();
AgvCommand.RobotLoadMapResult result = executeGrpcCall(() -> stub.robotLoadMap(request)).getStatus();
if (result.getRetCode() != 0) {
throw new GlobalException("切换地图失败: " + result.getErrMsg());
}
return result;
}
@Override
public AgvCommand.RobotQueryLoadMapStatusResult queryLoadMapStatus(EdgeCommonVO edgeCommonVO) {
AgvServiceGrpc.AgvServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
edgeCommonVO.getTerminalId(), AgvServiceGrpc.AgvServiceBlockingStub.class);
AgvCommand.RobotQueryLoadMapStatusCommand.Request request = AgvCommand.RobotQueryLoadMapStatusCommand.Request.newBuilder()
.setHeader(EdgeCommonUtil.buildRequest(edgeCommonVO.getDeviceId()))
.build();
return executeGrpcCall(() -> stub.queryLoadMapStatus(request)).getStatus();
}
/** /**
* 执行gRPC调用并处理异常 * 执行gRPC调用并处理异常
* *

View File

@ -24,7 +24,7 @@ public final class AgvServiceOuterClass {
static { static {
java.lang.String[] descriptorData = { java.lang.String[] descriptorData = {
"\n\032cmvr/api/agv_service.proto\022\010cmvr.api\032\032" + "\n\032cmvr/api/agv_service.proto\022\010cmvr.api\032\032" +
"cmvr/api/agv_command.proto2\252\004\n\nAgvServic" + "cmvr/api/agv_command.proto2\244\021\n\nAgvServic" +
"e\022f\n\rGetStatusInfo\022).cmvr.api.GetAgvStat" + "e\022f\n\rGetStatusInfo\022).cmvr.api.GetAgvStat" +
"usInfoCommand.Request\032*.cmvr.api.GetAgvS" + "usInfoCommand.Request\032*.cmvr.api.GetAgvS" +
"tatusInfoCommand.Feedback\022m\n\020GetBatteryS" + "tatusInfoCommand.Feedback\022m\n\020GetBatteryS" +
@ -38,7 +38,49 @@ public final class AgvServiceOuterClass {
"r.api.RobotConfigDownloadMapCommand.Feed" + "r.api.RobotConfigDownloadMapCommand.Feed" +
"back\022a\n\014GetMapStatus\022\'.cmvr.api.RobotSta" + "back\022a\n\014GetMapStatus\022\'.cmvr.api.RobotSta" +
"tusMapCommand.Request\032(.cmvr.api.RobotSt" + "tusMapCommand.Request\032(.cmvr.api.RobotSt" +
"atusMapCommand.Feedbackb\006proto3" "atusMapCommand.Feedback\022u\n\024RobotConfigUp" +
"loadMap\022-.cmvr.api.RobotConfigUploadMapC" +
"ommand.Request\032..cmvr.api.RobotConfigUpl" +
"oadMapCommand.Feedback\022f\n\017RobotConfigLoc" +
"k\022(.cmvr.api.RobotConfigLockCommand.Requ" +
"est\032).cmvr.api.RobotConfigLockCommand.Fe" +
"edback\022y\n\024GetCurrentLockStatus\022/.cmvr.ap" +
"i.RobotStatusCurrentLockCommand.Request\032" +
"0.cmvr.api.RobotStatusCurrentLockCommand" +
".Feedback\022o\n\022RobotMotionControl\022+.cmvr.a" +
"pi.RobotMotionControlCommand.Request\032,.c" +
"mvr.api.RobotMotionControlCommand.Feedba" +
"ck\022]\n\014RobotLoadMap\022%.cmvr.api.RobotLoadM" +
"apCommand.Request\032&.cmvr.api.RobotLoadMa" +
"pCommand.Feedback\022y\n\022QueryLoadMapStatus\022" +
"0.cmvr.api.RobotQueryLoadMapStatusComman" +
"d.Request\0321.cmvr.api.RobotQueryLoadMapSt" +
"atusCommand.Feedback\022i\n\020QueryStationList" +
"\022).cmvr.api.QueryStationListCommand.Requ" +
"est\032*.cmvr.api.QueryStationListCommand.F" +
"eedback\022l\n\021RobotGoTargetList\022*.cmvr.api." +
"RobotGoTargetListCommand.Request\032+.cmvr." +
"api.RobotGoTargetListCommand.Feedback\022{\n" +
"\026RobotStatusTaskCurrent\022/.cmvr.api.Robot" +
"StatusTaskCurrentCommand.Request\0320.cmvr." +
"api.RobotStatusTaskCurrentCommand.Feedba" +
"ck\022{\n\026RobotStatusTaskPackage\022/.cmvr.api." +
"RobotStatusTaskPackageCommand.Request\0320." +
"cmvr.api.RobotStatusTaskPackageCommand.F" +
"eedback\022`\n\rRobotGoTarget\022&.cmvr.api.Robo" +
"tGoTargetCommand.Request\032\'.cmvr.api.Robo" +
"tGoTargetCommand.Feedback\022i\n\020RobotContro" +
"lStop\022).cmvr.api.RobotControlStopCommand" +
".Request\032*.cmvr.api.RobotControlStopComm" +
"and.Feedback\022c\n\016RobotTaskPause\022\'.cmvr.ap" +
"i.RobotTaskPauseCommand.Request\032(.cmvr.a" +
"pi.RobotTaskPauseCommand.Feedback\022f\n\017Rob" +
"otTaskResume\022(.cmvr.api.RobotTaskResumeC" +
"ommand.Request\032).cmvr.api.RobotTaskResum" +
"eCommand.Feedback\022f\n\017RobotTaskCancel\022(.c" +
"mvr.api.RobotTaskCancelCommand.Request\032)" +
".cmvr.api.RobotTaskCancelCommand.Feedbac" +
"kb\006proto3"
}; };
descriptor = com.google.protobuf.Descriptors.FileDescriptor descriptor = com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData, .internalBuildGeneratedFileFrom(descriptorData,

View File

@ -1,109 +1,161 @@
/**
* @file agv_command.proto
* @brief AGV Protobuf
* SeerSRC API
*
* @note gRPC AgvService
*/
syntax = "proto3"; syntax = "proto3";
import "cmvr/api/common.proto"; import "cmvr/api/common.proto";
package cmvr.api; package cmvr.api;
// AGV状态信息 // ============================================================================
// 1. 1000, 0x03E8
// ============================================================================
/**
* @brief AGV
* @note API 10000x03E8
*/
message AgvStatusInfo { message AgvStatusInfo {
optional string id = 1; // AGV ID optional string id = 1; ///< AGV ID
optional string vehicle_id = 2; // ID optional string vehicle_id = 2; ///< "agv_001"
optional string version = 3; // optional string version = 3; ///<
optional string model = 4; // optional string model = 4; ///< "SRC-1100"
optional string dsp_version = 5; // DSP版本 optional string dsp_version = 5; ///< DSP
optional string current_ip = 6; // IP地址 optional string current_ip = 6; ///< IP
optional string mac = 7; // MAC地址 optional string mac = 7; ///< MAC
optional int32 rssi = 8; // optional int32 rssi = 8; ///< Wi-Fi 0~100
optional int32 ret_code = 9; // optional int32 ret_code = 9; ///< 0
optional string err_msg = 10; // optional string err_msg = 10; ///<
} }
// AGV状态命令 /**
* @brief AGV /
* @note IDheader.device_id AgvStatusInfo
*/
message GetAgvStatusInfoCommand { message GetAgvStatusInfoCommand {
message Request { message Request {
CommandHeader.Request header = 1; CommandHeader.Request header = 1; ///< device_id
} }
message Feedback { message Feedback {
CommandHeader.Feedback header = 1; CommandHeader.Feedback header = 1; ///< success/error_message/timestamp
AgvStatusInfo status = 2; AgvStatusInfo status = 2; ///< AGV
} }
} }
// ===================== ===================== // ============================================================================
// 2. 1007, 0x03EF
// ============================================================================
/**
* @brief
* @note API 10070x03EF/
*/
message AgvBatteryStatus { message AgvBatteryStatus {
optional double battery_level = 1; // [0,1] optional double battery_level = 1; ///< 0~1 0%~100%
optional double battery_temp = 2; // optional double battery_temp = 2; ///<
optional bool charging = 3; // optional bool charging = 3; ///<
optional double voltage = 4; // V optional double voltage = 4; ///< V
optional double current = 5; // A optional double current = 5; ///< A
optional double max_charge_voltage = 6; // -1= optional double max_charge_voltage = 6; ///< -1
optional double max_charge_current = 7; // -1= optional double max_charge_current = 7; ///< -1
optional bool manual_charge = 8; // optional bool manual_charge = 8; ///< SRC-2000
optional bool auto_charge = 9; // optional bool auto_charge = 9; ///< SRC-2000
optional int32 battery_cycle = 10; // optional int32 battery_cycle = 10; ///< BMS
optional string battery_user_data = 11; // optional string battery_user_data = 11; ///<
optional string extra = 12; // optional string extra = 12; ///<
optional int32 ret_code = 13; // optional int32 ret_code = 13; ///< 0
optional string create_on = 14; // optional string create_on = 14; ///< ISO 8601
optional string err_msg = 15; // optional string err_msg = 15; ///<
} }
/**
* @brief
*/
message RobotStatusBatteryRequestData { message RobotStatusBatteryRequestData {
optional bool simple = 1; // true: false:false optional bool simple = 1; ///< true=false= false
} }
/**
* @brief
*/
message RobotStatusBatteryCommand { message RobotStatusBatteryCommand {
message Request { message Request {
CommandHeader.Request header = 1; CommandHeader.Request header = 1; ///<
RobotStatusBatteryRequestData data = 2; RobotStatusBatteryRequestData data = 2; ///<
} }
message Feedback { message Feedback {
CommandHeader.Feedback header = 1; CommandHeader.Feedback header = 1; ///<
AgvBatteryStatus status = 2; AgvBatteryStatus status = 2; ///<
} }
} }
// ============================================================================
// 3. 1004, 0x03EC
// ============================================================================
// ===================== ===================== /**
* @brief
* @note API 10040x03EC姿
*/
message AgvRobotLocation { message AgvRobotLocation {
optional double x = 1; // X坐标(m) optional double x = 1; ///< X
optional double y = 2; // Y坐标(m) optional double y = 2; ///< Y
optional double angle = 3; // 姿(rad) optional double angle = 3; ///<
optional double confidence = 4; // [0,1] optional double confidence = 4; ///< 0~1
optional string current_station = 5; // ID optional string current_station = 5; ///< ID
optional string last_station = 6; // ID optional string last_station = 6; ///< ID
optional int32 loc_method = 7; // optional int32 loc_method = 7; ///< 0=, 1=, 2=, 3=...
optional int32 ret_code = 8; // optional int32 ret_code = 8; ///< 0
optional string create_on = 9; // optional string create_on = 9; ///<
optional string err_msg = 10; // optional string err_msg = 10; ///<
} }
/**
* @brief
*/
message RobotStatusLocCommand { message RobotStatusLocCommand {
message Request { message Request {
CommandHeader.Request header = 1; CommandHeader.Request header = 1; ///<
} }
message Feedback { message Feedback {
CommandHeader.Feedback header = 1; CommandHeader.Feedback header = 1; ///<
AgvRobotLocation status = 2; AgvRobotLocation status = 2; ///<
} }
} }
// ===================== ===================== // ============================================================================
// 4. 4011, 0x0FAB
// ============================================================================
/**
* @brief
*/
message RobotConfigDownloadMapRequestData { message RobotConfigDownloadMapRequestData {
optional string map_name = 1; // optional string map_name = 1; ///<
} }
/**
* @brief
*/
message AgvDownloadMapResult { message AgvDownloadMapResult {
optional int32 ret_code = 1; optional int32 ret_code = 1; ///< 0
optional string create_on = 2; optional string create_on = 2; ///<
optional string err_msg = 3; optional string err_msg = 3; ///<
optional string map_content = 4; // JSON文本 optional string map_content = 4; ///< JSON
} }
/**
* @brief
*/
message RobotConfigDownloadMapCommand { message RobotConfigDownloadMapCommand {
message Request { message Request {
CommandHeader.Request header = 1; CommandHeader.Request header = 1;
@ -116,26 +168,36 @@ message RobotConfigDownloadMapCommand {
} }
// ============================================================================
// 5. 1300, 0x0514
// ============================================================================
// /**
* @brief
*/
message MapFileInfo { message MapFileInfo {
optional string name = 1; optional string name = 1; ///<
optional string modified = 2; optional string modified = 2; ///<
optional int64 size = 3; optional int64 size = 3; ///<
} }
// /**
* @brief
* @note API 13000x0514
*/
message AgvMapStatus { message AgvMapStatus {
optional string current_map = 1; optional string current_map = 1; ///<
optional string current_map_md5 = 2; optional string current_map_md5 = 2; ///< MD5
repeated string maps = 3; repeated string maps = 3; ///<
repeated MapFileInfo map_files_info = 4; repeated MapFileInfo map_files_info = 4; ///<
optional int32 ret_code = 5; optional int32 ret_code = 5; ///< 0
optional string create_on = 6; optional string create_on = 6; ///<
optional string err_msg = 7; optional string err_msg = 7; ///<
} }
// /**
* @brief
*/
message RobotStatusMapCommand { message RobotStatusMapCommand {
message Request { message Request {
CommandHeader.Request header = 1; CommandHeader.Request header = 1;
@ -144,4 +206,701 @@ message RobotStatusMapCommand {
CommandHeader.Feedback header = 1; CommandHeader.Feedback header = 1;
AgvMapStatus status = 2; AgvMapStatus status = 2;
} }
}
// ============================================================================
// 6. 4010, 0x0FAA
// ============================================================================
/**
* @brief
*/
message RobotConfigUploadMapRequestData {
optional string map_content = 1; ///< JSON
}
/**
* @brief
*/
message AgvUploadMapResult {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotConfigUploadMapCommand {
message Request {
CommandHeader.Request header = 1;
RobotConfigUploadMapRequestData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
AgvUploadMapResult status = 2;
}
}
// ============================================================================
// 7. 4005, 0x0FA5
// ============================================================================
/**
* @brief
*/
message RobotConfigLockRequestData {
optional string nick_name = 1; ///< /
}
/**
* @brief
*/
message AgvLockResult {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotConfigLockCommand {
message Request {
CommandHeader.Request header = 1;
RobotConfigLockRequestData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
AgvLockResult status = 2;
}
}
// ============================================================================
// 8. 1060, 0x0424
// ============================================================================
/**
* @brief
* @note API 10600x0424
*/
message AgvCurrentLockStatus {
optional bool locked = 1; ///<
optional string ip = 2; ///< IP
optional int32 port = 3; ///<
optional uint32 type = 4; ///< 0=default, 2=roboshop, 0xDD=srd
optional string nick_name = 5; ///<
optional int64 time_t = 6; ///< Unix
optional string desc = 7; ///<
optional int32 ret_code = 8; ///< 0
optional string create_on = 9; ///<
optional string err_msg = 10; ///<
}
/**
* @brief
*/
message RobotStatusCurrentLockCommand {
message Request {
CommandHeader.Request header = 1;
}
message Feedback {
CommandHeader.Feedback header = 1;
AgvCurrentLockStatus status = 2;
}
}
// ============================================================================
// 9. 2010, 0x07DA
// ============================================================================
/**
* @brief
* @note 20100x07DA
* vx/vy/w steer/real_steer
* duration = -1
*/
message RobotMotionControlRequestData {
optional double vx = 1; ///< X 线m/s
optional double vy = 2; ///< Y 线m/s
optional double w = 3; ///< rad/s
optional double steer = 4; ///< rad
optional double real_steer = 5; ///< steer
optional int64 duration = 6; ///< ms-1
}
/**
* @brief
*/
message RobotMotionControlResult {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotMotionControlCommand {
message Request {
CommandHeader.Request header = 1;
RobotMotionControlRequestData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotMotionControlResult status = 2;
}
}
// ============================================================================
// 10. 2022, 0x07E6
// ============================================================================
/**
* @brief
* @note 20220x07E6
*/
message RobotLoadMapRequestData {
optional string map_name = 1; ///< -_
}
/**
* @brief
*/
message RobotLoadMapResult {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotLoadMapCommand {
message Request {
CommandHeader.Request header = 1;
RobotLoadMapRequestData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotLoadMapResult status = 2;
}
}
// ============================================================================
// 11. 1022, 0x03FE
// ============================================================================
/**
* @brief
* @note 10220x03FEloadmap_status: 0=, 1=, 2=
* 2
*/
message RobotQueryLoadMapStatusResult {
optional int32 loadmap_status = 1; ///< 0=, 1=, 2=
optional int32 ret_code = 2; ///< 0
optional string create_on = 3; ///<
optional string err_msg = 4; ///<
}
/**
* @brief
*/
message RobotQueryLoadMapStatusCommand {
message Request {
CommandHeader.Request header = 1;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotQueryLoadMapStatusResult status = 2;
}
}
// ============================================================================
// 12. 1301, 0x0515
// ============================================================================
/**
* @brief
*/
message StationItem {
optional string id = 1; ///< ID
optional string type = 2; ///< "LocationMark", "ChargePoint"
optional double x = 3; ///< X
optional double y = 4; ///< Y
optional double r = 5; ///<
optional string desc = 6; ///<
optional string executor = 7; ///<
optional string prepoint = 8; ///< ID
optional string recfile = 9; ///<
optional bool spin = 10; ///<
optional bool use_down_pgv = 11; ///< 使 PGV
}
/**
* @brief
*/
message QueryStationListResult {
repeated StationItem stations = 1; ///<
optional int32 ret_code = 2; ///< 0
optional string create_on = 3; ///<
optional string err_msg = 4; ///<
}
/**
* @brief
*/
message QueryStationListCommand {
message Request {
CommandHeader.Request header = 1;
}
message Feedback {
CommandHeader.Feedback header = 1;
QueryStationListResult status = 2;
}
}
// ============================================================================
// 13. 3066, 0x0BFA
// ============================================================================
/**
* @brief
* @note 3066 move_task_list
* source_id id
*/
message MoveTaskItem {
optional string task_id = 1; ///< ID
optional string source_id = 2; ///< ID
optional string id = 3; ///< ID
optional string operation = 4; ///< "JackLoad"
optional double jack_height = 5; ///<
}
/**
* @brief
*/
message RobotGoTargetListRequestData {
repeated MoveTaskItem move_task_list = 1; ///<
}
/**
* @brief
* @note ret_code=0
*/
message RobotGoTargetListResult {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotGoTargetListCommand {
message Request {
CommandHeader.Request header = 1;
RobotGoTargetListRequestData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotGoTargetListResult status = 2;
}
}
// ============================================================================
// 14. 1020, 0x03FC
// ============================================================================
/**
* @brief 1020
*/
message RobotStatusTaskReqData {
optional bool simple = 1; ///< true= task_statusfalse=
}
/**
* @brief
*/
message NavContainerItem {
optional string container_name = 1; ///<
optional string desc = 2; ///<
optional string goods_id = 3; ///< ID
optional bool has_goods = 4; ///<
}
/**
* @brief 1020
*/
message RobotStatusTaskResData {
optional int32 task_status = 1; ///< 0=NONE, 1=WAITING, 2=RUNNING, 3=SUSPENDED, 4=COMPLETED, 5=FAILED, 6=CANCELED
optional int32 task_type = 2; ///< 0=, 1=, 2=, 3=, 7=
optional string target_id = 3; ///< IDtask_type 2/3
repeated double target_point = 4; ///< [x, y, r]task_type 1
repeated string finished_path = 5; ///<
repeated string unfinished_path = 6; ///<
optional string move_status_info = 7; ///<
repeated NavContainerItem containers = 8; ///<
optional int32 ret_code = 9; ///< 0
optional string create_on = 10; ///<
optional string err_msg = 11; ///<
}
/**
* @brief
*/
message RobotStatusTaskCurrentCommand {
message Request {
CommandHeader.Request header = 1;
RobotStatusTaskReqData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotStatusTaskResData data = 2;
}
}
// ============================================================================
// 15. 1110, 0x0456
// ============================================================================
/**
* @brief 1110
*/
message QueryTaskStatusPackageReqData {
repeated string task_ids = 1; ///< ID +
}
/**
* @brief
*/
message SingleTaskStatusItem {
optional string task_id = 1; ///< ID
optional int32 status = 2; ///< task_status
optional int32 type = 3; ///< task_type
}
/**
* @brief
*/
message TaskStatusPackage {
optional string closest_target = 1; ///< ID
optional string source_name = 2; ///<
optional string target_name = 3; ///<
optional double percentage = 4; ///< 0~100
optional double distance = 5; ///<
optional string info = 6; ///<
repeated SingleTaskStatusItem task_status_list = 7; ///<
}
/**
* @brief 1110
*/
message QueryTaskStatusPackageResData {
optional TaskStatusPackage task_status_package = 1; ///<
optional int32 ret_code = 2; ///< 0
optional string create_on = 3; ///<
optional string err_msg = 4; ///<
}
/**
* @brief
*/
message RobotStatusTaskPackageCommand {
message Request {
CommandHeader.Request header = 1;
QueryTaskStatusPackageReqData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
QueryTaskStatusPackageResData data = 2;
}
}
// ============================================================================
// 16. 3051, 0x0BEB
// ============================================================================
/**
* @brief DI
*/
message DIItem {
int32 id = 1; ///< DI
bool status = 2; ///< true=, false=
}
/**
* @brief DO
*/
message DOItem {
int32 id = 1; ///< DO
bool status = 2; ///< true=, false=
}
/**
* @brief
*/
message SoundArgs {
optional string name = 1; ///<
optional int32 loop = 2; ///< 0=, 1=
optional int32 stop = 3; ///< 1=
}
/**
* @brief WaitDI
*/
message WaitDIArgs {
repeated DIItem DI = 1; ///< DI
optional double timeout = 2; ///< 0
}
/**
* @brief SetDO
*/
message SetDOArgs {
repeated DOItem do_list = 1; ///< DO
}
/**
* @brief PGV
*/
message PgvParam {
optional bool use_pgv = 1; ///< 使 PGV
optional bool use_down_pgv = 2; ///< 使 PGV
optional double pgv_adjust_dist = 3; ///<
optional double pgv_adjust_cx = 4; ///< X
optional double pgv_adjust_cy = 5; ///< Y
optional double pgv_x_adjust = 6; ///< X
}
/**
* @brief +
*/
message FreeGoPoint {
double x = 1; ///< X
double y = 2; ///< Y
double theta = 3; ///<
}
/**
* @brief
*/
message ScriptArgs {
map<string, string> str_kv = 1; ///<
map<string, double> num_kv = 2; ///<
repeated DOItem do_list = 3; ///< DO
repeated DIItem di_list = 4; ///< DI
}
/**
* @brief 3051
* @warning /
*
* warning/error
* freego
*/
message RobotGoTargetReqData {
// -------- --------
string source_id = 1; ///< ID"SELF_POSITION"
string id = 2; ///< ID"SELF_POSITION" operation
optional string task_id = 3; ///< ID
// -------- --------
optional double angle = 4; ///<
optional string method = 5; ///< "forward" "backward"
optional double max_speed = 6; ///< 线m/s0 使
optional double max_wspeed = 7; ///< rad/s
optional double max_acc = 8; ///< m/s²
optional double max_wacc = 9; ///< rad/s²
optional int64 duration = 10; ///<
optional int32 orientation = 11; ///< 使
optional bool spin = 12; ///<
optional int64 delay = 13; ///< 0
optional int32 start_rot_dir = 14; ///< -1=, 0=, 1=
optional int32 end_rot_dir = 15; ///< -1=, 0=, 1=
optional double reach_dist = 16; ///<
optional double reach_angle = 17; ///<
optional string skill_name = 18; ///< "Action" "GotoSpecifiedPose"
// -------- PGV --------
optional PgvParam pgv = 19; ///<
// -------- --------
optional string operation = 20; ///< JackLoad/ForkUnload/RollerLoad/HookLoad/WaitDI/SetDO/sound/Script
optional double jack_height = 21; ///<
optional double start_height = 22; ///<
optional double end_height = 23; ///<
optional double fork_mid_height = 24; ///<
optional double fork_dist = 25; ///<
optional string direction = 26; ///< "left"/"right"/"front"/"back"
optional bool recognize = 27; ///<
optional string recfile = 28; ///< "shelf/s0002.shelf"
// -------- --------
optional SoundArgs sounds_args = 29; ///<
// -------- WaitDI / SetDO --------
optional WaitDIArgs wait_di_args = 30; ///< WaitDI
optional SetDOArgs set_do_args = 31; ///< SetDO
// -------- --------
optional string script_name = 32; ///<
optional ScriptArgs script_args = 33; ///<
optional int32 script_stage = 34; ///< 0=, 1=, 2=, 3=
// -------- GoByOdometer --------
optional double move_angle = 35; ///<
optional double speed_w = 36; ///< rad/s
optional int32 loc_mode = 37; ///< 1=, 0=
// -------- --------
optional FreeGoPoint freego = 38; ///< id
}
/**
* @brief 3051
*/
message RobotGoTargetResData {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotGoTargetCommand {
message Request {
CommandHeader.Request header = 1;
RobotGoTargetReqData data = 2;
}
message Feedback {
CommandHeader.Feedback header = 1;
RobotGoTargetResData data = 2;
}
}
// ============================================================================
// 17. 2000, 0x07D0
// ============================================================================
/**
* @brief
* @note 20000x07D0
*/
message RobotControlStopRequestData
{
}
/**
* @brief
*/
message RobotControlStopResult
{
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
/**
* @brief
*/
message RobotControlStopCommand
{
message Request
{
CommandHeader.Request header = 1;
RobotControlStopRequestData data = 2;
}
message Feedback
{
CommandHeader.Feedback header = 1;
RobotControlStopResult status = 2;
}
}
// ============================================================================
// 18. // 3001/3002/3003
// ============================================================================
/**
* @brief 3001, 0x0BB9
* @note
*/
message RobotTaskPauseCommand {
message Request {
CommandHeader.Request header = 1;
// data
}
message Feedback {
CommandHeader.Feedback header = 1;
/**
* @brief
*/
message Result {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
Result status = 2;
}
}
/**
* @brief 3002, 0x0BBA
* @note
*/
message RobotTaskResumeCommand {
message Request {
CommandHeader.Request header = 1;
// data
}
message Feedback {
CommandHeader.Feedback header = 1;
/**
* @brief
*/
message Result {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
Result status = 2;
}
}
/**
* @brief 3003, 0x0BBB
* @note
*/
message RobotTaskCancelCommand {
message Request {
CommandHeader.Request header = 1;
// data
}
message Feedback {
CommandHeader.Feedback header = 1;
/**
* @brief
*/
message Result {
optional int32 ret_code = 1; ///< 0
optional string create_on = 2; ///<
optional string err_msg = 3; ///<
}
Result status = 2;
}
} }

View File

@ -1,3 +1,8 @@
/**
* @file agv_service.proto
* @brief AGV服务的gRPC接口AGV相关命令
* gRPCAGVServiceImpl
*/
syntax = "proto3"; syntax = "proto3";
import "cmvr/api/agv_command.proto"; import "cmvr/api/agv_command.proto";
@ -14,6 +19,56 @@ service AgvService {
rpc RobotConfigDownloadMap(RobotConfigDownloadMapCommand.Request) returns (RobotConfigDownloadMapCommand.Feedback); rpc RobotConfigDownloadMap(RobotConfigDownloadMapCommand.Request) returns (RobotConfigDownloadMapCommand.Feedback);
rpc GetMapStatus(RobotStatusMapCommand.Request) returns (RobotStatusMapCommand.Feedback); rpc GetMapStatus(RobotStatusMapCommand.Request) returns (RobotStatusMapCommand.Feedback);
rpc RobotConfigUploadMap(RobotConfigUploadMapCommand.Request) returns (RobotConfigUploadMapCommand.Feedback);
//
rpc RobotConfigLock(RobotConfigLockCommand.Request) returns (RobotConfigLockCommand.Feedback);
//
rpc GetCurrentLockStatus(RobotStatusCurrentLockCommand.Request) returns (RobotStatusCurrentLockCommand.Feedback);
//
rpc RobotMotionControl(RobotMotionControlCommand.Request) returns (RobotMotionControlCommand.Feedback);
// 2022
rpc RobotLoadMap(RobotLoadMapCommand.Request) returns (RobotLoadMapCommand.Feedback);
// 1022
rpc QueryLoadMapStatus(RobotQueryLoadMapStatusCommand.Request) returns (RobotQueryLoadMapStatusCommand.Feedback);
// 1301
rpc QueryStationList(QueryStationListCommand.Request) returns (QueryStationListCommand.Feedback);
// 3066
rpc RobotGoTargetList(RobotGoTargetListCommand.Request) returns (RobotGoTargetListCommand.Feedback);
// 1020 robot_status_task_req
// 1020 robot_status_task_req
rpc RobotStatusTaskCurrent(RobotStatusTaskCurrentCommand.Request) returns (RobotStatusTaskCurrentCommand.Feedback);
// 1110 robot_status_task_status_package_req
rpc RobotStatusTaskPackage(RobotStatusTaskPackageCommand.Request) returns (RobotStatusTaskPackageCommand.Feedback);
// 3051 robot_task_gotarget_req 0x0BEB
rpc RobotGoTarget(RobotGoTargetCommand.Request) returns (RobotGoTargetCommand.Feedback);
// 0x07D0
rpc RobotControlStop(RobotControlStopCommand.Request) returns (RobotControlStopCommand.Feedback);
// 3001 (0x0BB9)
rpc RobotTaskPause(RobotTaskPauseCommand.Request) returns (RobotTaskPauseCommand.Feedback);
// 3002 (0x0BBA)
rpc RobotTaskResume(RobotTaskResumeCommand.Request) returns (RobotTaskResumeCommand.Feedback);
// 3003 (0x0BBB)
rpc RobotTaskCancel(RobotTaskCancelCommand.Request) returns (RobotTaskCancelCommand.Feedback);
} }

View File

@ -204,19 +204,21 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
throw new GlobalException("地图文件路径不存在"); throw new GlobalException("地图文件路径不存在");
} }
// TODO: 从文件路径读取地图内容 // 从文件路径读取地图内容
// 这里需要根据实际存储方式实现
String mapContent = readMapFile(map.getMapFilePath()); String mapContent = readMapFile(map.getMapFilePath());
if (StrUtil.isBlank(mapContent)) {
throw new GlobalException("地图文件内容为空");
}
EdgeCommonVO edgeCommonVO = new EdgeCommonVO(); EdgeCommonVO edgeCommonVO = new EdgeCommonVO();
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setTerminalId(robot.getTerminalId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
// cmvr.api.AgvCommand.AgvUploadMapResult result = edgeAgvService.robotConfigUploadMap(edgeCommonVO, mapContent); AgvCommand.AgvUploadMapResult result = edgeAgvService.robotConfigUploadMap(edgeCommonVO, mapContent);
//
// if (result.getRetCode() != 0) { if (result.getRetCode() != 0) {
// throw new GlobalException("上传地图失败: " + result.getErrMsg()); throw new GlobalException("上传地图失败: " + result.getErrMsg());
// } }
return "上传成功"; return "上传成功";
} }
@ -240,7 +242,7 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
edgeCommonVO.setTerminalId(robot.getTerminalId()); edgeCommonVO.setTerminalId(robot.getTerminalId());
edgeCommonVO.setDeviceId(robot.getRobotCode()); edgeCommonVO.setDeviceId(robot.getRobotCode());
cmvr.api.AgvCommand.AgvDownloadMapResult result = edgeAgvService.robotConfigDownloadMap(edgeCommonVO, mapName); AgvCommand.AgvDownloadMapResult result = edgeAgvService.robotConfigDownloadMap(edgeCommonVO, mapName);
// 保存地图到数据库 // 保存地图到数据库
// InspectionMap inspectionMap = new InspectionMap(); // InspectionMap inspectionMap = new InspectionMap();
@ -248,20 +250,17 @@ public class InspectionRobotServiceImpl extends ServiceImpl<InspectionRobotMappe
// inspectionMap.setMapName(mapName); // inspectionMap.setMapName(mapName);
// inspectionMap.setMapSourceRobotId(robotId); // inspectionMap.setMapSourceRobotId(robotId);
// inspectionMap.setMapSourceName(mapName); // inspectionMap.setMapSourceName(mapName);
//
// // TODO: 将地图内容保存到文件系统并返回文件路径 // TODO: 将地图内容保存到文件系统并返回文件路径
// // String filePath = saveMapToFile(result.getMapContent(), mapName); // String filePath = saveMapToFile(result.getMapContent(), mapName);
// // inspectionMap.setMapFilePath(filePath); // inspectionMap.setMapFilePath(filePath);
//
// inspectionMap.setStatus("0"); // inspectionMap.setStatus("0");
// inspectionMap.setCreateTime(DateUtils.getNowDate()); // inspectionMap.setCreateTime(DateUtils.getNowDate());
// inspectionMap.setCreateBy(SecurityUtils.getUsername()); // inspectionMap.setCreateBy(SecurityUtils.getUsername());
// //
// inspectionMapMapper.insertInspectionMap(inspectionMap); // inspectionMapMapper.insertInspectionMap(inspectionMap);
return result.getMapContent(); return result.getMapContent();
} }