You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

583 lines
21 KiB

package com.gaotao.common.utils;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gaotao.modules.api.service.InterfaceCallLogService;
import com.gaotao.modules.automatedWarehouse.mapper.WcsIntegrationMapper;
import com.gaotao.modules.warehouse.entity.PalletData;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* AGV接口调用工具类
* 基于Lothar V4.13接口文档实现
*/
@Setter
@Getter
@Component
public class AgvClientUtil {
//中山agv的交互site
private static final String thisSite="55";
/**
* -- GETTER --
* 获取AGV基础URL
* -- SETTER --
* 设置AGV基础URL
*/
@Value("${custom.agv-url}")
private String agvUrl;
@Autowired
private InterfaceCallLogService interfaceCallLogService;
@Autowired
private WcsIntegrationMapper wcsIntegrationMapper;
/**
*1. 发送任务 - 创建APR搬运任务
* @param taskId 任务唯一标识
* @param targets 任务目标点名称集合
* @param configId 任务配置名称(可选)
* @param priority 任务优先级1-9(可选)
* @return 响应结果
*/
public void createTask(String taskId, List<String> targets, String configId, Integer priority) {
String url = agvUrl + "/rpc/createTask";
Map<String, Object> request = new HashMap<>();
request.put("taskId", taskId);
request.put("targets", targets);
if(targets.size()<2){
throw new RuntimeException("站点数据不足,必须是2个站点以上。");
}
PalletData checkPallet= wcsIntegrationMapper.getPalletDataByStation(thisSite,targets.get(0));
if(checkPallet==null){
throw new RuntimeException("栈板数据不存在,请检查栈板数据。");
}
//2点任务和3点任务是不一样的模板
switch (checkPallet.getPalletFamily()) {
case "A01":
configId="Steel_Pallet"+"_"+targets.size();
break;
case "A02":
configId="Boxed_Pallet"+"_"+targets.size();
break;
case "A03":
configId="Flat_Pallet"+"_"+targets.size();
break;
}
if (configId != null) {
request.put("configId", configId);
}else {
request.put("configId", "Steel_Pallet");
}
if (priority != null) {
request.put("priority", priority);
}
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"createTask",
requestJson,
"55",
taskId,
"AGV创建任务接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url,jsonBody,null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code!=200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
// 调用AGV接口
// ResponseData response = HttpClientUtil.doPostByRaw(url, request);
//
// // 更新接口日志结果
// if (logId != null) {
// String responseJson = response != null ? JSONObject.toJSONString(response) : "null";
// interfaceCallLogService.updateCallResult(logId, responseJson, "SUCCESS", null, null);
// }
//
// return response;
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
public void modifyPutPoint(String taskId, String target) {
String url = agvUrl + "/rpc/modifyPutPoint";
Map<String, Object> request = new HashMap<>();
request.put("taskId", taskId);
request.put("target", target);
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"modifyPutPoint",
requestJson,
"55",
taskId,
"修改目标点"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url,jsonBody,null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code!=200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
// 调用AGV接口
// ResponseData response = HttpClientUtil.doPostByRaw(url, request);
//
// // 更新接口日志结果
// if (logId != null) {
// String responseJson = response != null ? JSONObject.toJSONString(response) : "null";
// interfaceCallLogService.updateCallResult(logId, responseJson, "SUCCESS", null, null);
// }
//
// return response;
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
* 2 继续任务 - 继续执行等待中的任务
* @param taskId 任务唯一编号
*/
public void continueTask(String taskId) {
String url = agvUrl + "/rpc/continueTask";
Map<String, Object> request = new HashMap<>();
request.put("taskId", taskId);
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"continueTask",
requestJson,
"55",
taskId,
"AGV继续任务接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
*3. 取消任务 - 取消APR搬运任务
* @param taskId 任务唯一标识
*/
public void cancelTask(String taskId) {
String url = agvUrl + "/rpc/cancelTask";
Map<String, Object> request = new HashMap<>();
request.put("taskId", taskId);
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"cancelTask",
requestJson,
"55",
taskId,
"AGV取消任务接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
*4. 任务回调 - 任务执行到关键节点上报
* @param taskId 任务唯一标识
* @param deviceId APR编号
* @param targetPoint APR到达的目标点
*/
public void feedbackTask(String taskId, String deviceId, String targetPoint) {
String url = agvUrl + "/feedbackTask";
Map<String, Object> request = new HashMap<>();
request.put("taskId", taskId);
request.put("deviceId", deviceId);
request.put("targetPoint", targetPoint);
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"feedbackTask",
requestJson,
"55",
taskId,
"AGV任务回调接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
*5. APR查询 - 获取在线小车状态
* @return 在线小车数据
*/
public Object getOnlineRobot() {
String url = agvUrl + "/rpc/getOnlineRobot";
try {
String ifsResponse = HttpUtils.doGet(url, null, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
// 返回数据部分
return jsonNode.get("data");
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
/**
* 6地图信息
* @param mapName 地图名称(可选)
* @return 地图信息数据
*/
public Object getMapInfo(String mapName) {
String url = agvUrl + "/rpc/getMapInfo";
Map<String, Object> request = new HashMap<>();
if (mapName != null) {
request.put("mapName", mapName);
}
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"getMapInfo",
requestJson,
"55",
mapName,
"AGV获取地图信息接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
// 返回数据部分
JsonNode dataNode = jsonNode.get("data");
return dataNode != null ? dataNode : null;
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
*7. APR故障信息查询
* @return 故障信息数据
*/
public Object getAlarms() {
String url = agvUrl + "/rpc/getAlarms";
Map<String, Object> request = new HashMap<>();
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"getAlarms",
requestJson,
"55",
null,
"AGV获取故障信息接口"
);
String ifsResponse = HttpUtils.doGet(url, null, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
// 返回数据部分
return jsonNode.get("data");
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
* 8 APR申请进出交管区
* @param areaName 交管区编号
* @param type 1进入申请,2-离开告知
* @param agvNo APR编号
*/
public void applyTrafficCtlArea(String areaName, Integer type, String agvNo) {
String url = agvUrl + "/applyTrafficCtlArea";
Map<String, Object> request = new HashMap<>();
request.put("areaName", areaName);
request.put("type", type);
if (agvNo != null) {
request.put("agvNo", agvNo);
}
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"applyTrafficCtlArea",
requestJson,
"55",
areaName,
"AGV申请进出交管区接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
* 9. APR申请进出设备区域
* @param deviceName 设备编号
* @param type 1进入申请,2-离开告知
* @param taskId APR正在执行的任务编号(可选)
* @param action APR将要在此设备区域执行的动作,get-取货,put-放货(可选)
* @param agvNo APR编号(可选)
*/
public void applyDeviceArea(String deviceName, Integer type, String taskId, String action, String agvNo) {
String url = agvUrl + "/applyDeviceArea";
Map<String, Object> request = new HashMap<>();
request.put("deviceName", deviceName);
request.put("type", type);
if (taskId != null) {
request.put("taskId", taskId);
}
if (action != null) {
request.put("action", action);
}
if (agvNo != null) {
request.put("agvNo", agvNo);
}
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"applyDeviceArea",
requestJson,
"55",
deviceName,
"AGV申请进出设备区域接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
/**
*10储位信息
* @param storageNames 目标储位名称列表(可选)
* @param areaNames 目标区域名称列表(可选)
* @param mapNames 目标地图名称列表(可选)
*/
public void getMapStorage(List<String> storageNames, List<String> areaNames, List<String> mapNames) {
String url = agvUrl + "/getMapStorage";
Map<String, Object> request = new HashMap<>();
if (storageNames != null) {
request.put("storageNames", storageNames);
}
if (areaNames != null) {
request.put("areaNames", areaNames);
}
if (mapNames != null) {
request.put("mapNames", mapNames);
}
Long logId = null;
try {
// 记录接口调用日志
String requestJson = JSONObject.toJSONString(request);
logId = interfaceCallLogService.logInterfaceCall(
"AgvClientUtil",
"getMapStorage",
requestJson,
"55",
null,
"AGV获取储位信息接口"
);
ObjectMapper objectMapper = new ObjectMapper();
String jsonBody = objectMapper.writeValueAsString(request);
String ifsResponse = HttpUtils.doPost(url, jsonBody, null);
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(ifsResponse);
int code = jsonNode.get("code").asInt();
String msg = jsonNode.get("msg").asText();
if(code != 200){
throw new RuntimeException("调用AGV接口失败,错误码:"+code+",错误信息:"+msg);
}
} catch (Exception e) {
// 更新接口日志错误信息
if (logId != null) {
interfaceCallLogService.updateCallResult(logId, null, "FAILED", e.getMessage(), null);
}
throw new RuntimeException(e.getMessage());
}
}
}