diff --git a/acs/nladmin-system/pom.xml b/acs/nladmin-system/pom.xml
index 0e88bab..17c1f36 100644
--- a/acs/nladmin-system/pom.xml
+++ b/acs/nladmin-system/pom.xml
@@ -420,12 +420,34 @@
lucene-analyzers-smartcn
${lucene.version}
+
+ org.bouncycastle
+ bcprov-jdk15on
+ 1.70
+
org.apache.lucene
lucene-queryparser
${lucene.version}
+
+ org.springframework.boot
+ spring-boot-starter-integration
+
+
+ org.springframework.integration
+ spring-integration-stream
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+
+
+ com.hivemq
+ hivemq-mqtt-client
+ 1.3.3
+
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java
index 974f2e7..cfd82d5 100644
--- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java
@@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.nl.acs.device_driver.shangdianke.PhotoelectricDetectionDeviceDriver;
+import org.nl.acs.device_driver.sdk.PhotoelectricDetectionDeviceDriver;
import org.nl.acs.log.service.DeviceExecuteLogService;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java
index 485b4ff..3042831 100644
--- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java
@@ -3,6 +3,7 @@ package org.nl.acs.agv.server;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import org.nl.acs.agv.server.dto.AgvDto;
+import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.instruction.service.dto.Instruction;
import java.util.Map;
@@ -13,7 +14,115 @@ import java.util.Map;
* @Date: 2022-08-15
*/
public interface XianGongAgvService {
- Map findAllAgvFromCache();
+ /**
+ * 下发叉车运单
+ *
+ * @param dto
+ * @return
+ */
+ public UnifiedResponse sendOrderSequencesToForklift(Instruction dto);
+
+ /**
+ * 下发运单序列
+ *
+ * @param inst
+ * @return
+ * @throws Exception
+ */
+ public UnifiedResponse sendOrderSequencesToXZ(Instruction inst);
+
+ /**
+ * 追加运单
+ *
+ * @param inst
+ * @return
+ * @throws Exception
+ */
+ public UnifiedResponse addOrderSequences(Instruction inst);
+
+ /**
+ * @param reqParam
+ * @param
+ * @return
+ * @throws Exception
+ */
+ public UnifiedResponse markComplete(JSONObject reqParam);
+
+ /**
+ * 查询AGV状态
+ *
+ * @return
+ */
+ public UnifiedResponse queryXZAgvDeviceStatus(String vehicles, Class type);
+
+ /**
+ * @param type
+ * @param
+ * @return
+ */
+ public UnifiedResponse queryXZAgvInstStatus(Class type);
+
+ /**
+ * 根据运单号查询运单状态
+ *
+ * @param type
+ * @param
+ * @return
+ */
+ public UnifiedResponse queryXZAgvInstStatusByCode(String instCode, Class type);
+
+
+ /**
+ * 删除先知任务
+ *
+ * @param instCode
+ * @return
+ */
+ public UnifiedResponse deleteXZAgvInst(String instCode);
+
+
+ /**
+ * 查询场景中指定机器人信息
+ */
+ public UnifiedResponse getRobotInfo(String robotCode, Class type);
+
+
+ /**
+ * 占用互斥组
+ *
+ * @param reqParam
+ * @param
+ * @return
+ */
+ public UnifiedResponse getBlockGroup(JSONObject reqParam);
+
+ /**
+ * 查询互斥组状态
+ *
+ * @param reqParam
+ * @param
+ * @return
+ */
+ public UnifiedResponse blockGroupStatus(JSONObject reqParam);
+
+
+ /**
+ * 释放互斥组
+ *
+ * @param reqParam
+ * @param
+ * @return
+ */
+ public UnifiedResponse releaseBlockGroup(JSONObject reqParam);
+
+
+ /**
+ * 查询所有AGV
+ *
+ * @return
+ */
+ public Map findAllAgvFromCache();
+
/**
* 查询自动门状态
*
@@ -24,59 +133,38 @@ public interface XianGongAgvService {
/**
* 先工agv 等待点请求
- *AGV->ACS
- * @param
+ * AGV->ACS
+ *
+ * @param param
* @return
*/
public String waitPointRequest(String param);
- /**
- * acs->agv
- * 关闭运单系列
- * @param code
- * @return
- */
- public HttpResponse markComplete(String code);
/**
- * 查询AGV状态
- * @return
- */
- public HttpResponse queryXZAgvDeviceStatus();
-
- public HttpResponse queryXZAgvInstStatus();
-
- /**
- * 删除先知任务
- *
- * @param instCode
- * @return
- */
- public HttpResponse deleteXZAgvInst(String instCode);
-
-
- /**
- * 下发运单序列
+ * 组织json数据
*
* @param inst
* @return
* @throws Exception
*/
- public HttpResponse sendOrderSequencesToXZ(Instruction inst) throws Exception;
+ public String sendOrderSequencesParam(Instruction inst);
- public HttpResponse addOrderSequences(Instruction inst) throws Exception;
/**
- * 组织json数据
+ * 创建
*
- * @param
+ * @param inst
+ * @param type
* @return
- * @throws Exception
*/
- public String sendOrderSequencesParam(Instruction inst) throws Exception;
-
-
public JSONObject createOrederData(Instruction inst, String type);
- JSONObject xgAGVWaitPointRequest(JSONObject requestParam);
+ /**
+ * 请求取货放货
+ *
+ * @param requestParam
+ * @return
+ */
+ public JSONObject xgAGVWaitPointRequest(JSONObject requestParam);
}
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java
index 383b27c..aeac37c 100644
--- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java
@@ -14,7 +14,9 @@ import org.nl.acs.agv.server.AgvWaitUtil;
import org.nl.acs.agv.server.XianGongAgvService;
import org.nl.acs.agv.server.dto.AgvDto;
import org.nl.acs.config.AcsConfig;
+import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.wms.service.AcsToWmsService;
+import org.nl.acs.ext.xg.XgHttpUtil;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.opc.Device;
@@ -49,12 +51,103 @@ public class XianGongAgvServiceImpl implements XianGongAgvService {
private AgvWaitUtil agvWaitUtil;
@Autowired
private TaskService taskService;
+ @Autowired
+ private XgHttpUtil xgHttpUtil;
private Map AGVDeviceStatus = new HashMap<>();
@Value("${server.port}")
public int port;
+ @Override
+ public UnifiedResponse sendOrderSequencesToXZ(Instruction inst) {
+ JSONObject reqParam = new JSONObject();
+ reqParam.put("id", inst.getInstruction_code());
+ reqParam.put("complete", true);
+ reqParam.put("blocks", createBlocksData(inst));
+ reqParam.put("priority", inst.getPriority());
+ String path = "/setOrder";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+ @Override
+ public UnifiedResponse sendOrderSequencesToForklift(Instruction inst) {
+ JSONObject reqParam = new JSONObject();
+ reqParam.put("id", inst.getInstruction_code());
+ reqParam.put("complete", true);
+ reqParam.put("blocks", createBlocksForklift(inst));
+ reqParam.put("priority", inst.getPriority());
+ String path = "/setOrder";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+ @Override
+ public UnifiedResponse markComplete(JSONObject reqParam) {
+ String path = "/markComplete";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+
+ @Override
+ public UnifiedResponse queryXZAgvDeviceStatus(String vehicles, Class type) {
+ String path = "/robotsStatus" + vehicles == null ? "" : "?vehicles = " + vehicles;
+ return xgHttpUtil.sendGetRequest(path, type);
+ }
+
+
+ @Override
+ public UnifiedResponse queryXZAgvInstStatus(Class type) {
+ String path = "/orders?page=1&size=80&orderBy=createTime&orderMethod=descending";
+ return xgHttpUtil.sendGetRequest(path, type);
+ }
+
+ @Override
+ public UnifiedResponse queryXZAgvInstStatusByCode(String instCode, Class type) {
+ String path = "/orderDetails/" + instCode;
+ return xgHttpUtil.sendGetRequest(path, type);
+ }
+
+
+ @Override
+ public UnifiedResponse deleteXZAgvInst(String instCode) {
+ //String path = "/api/route/transportOrders/" + instCode + "/withdrawal";
+ String path = "/terminate";
+ JSONObject reqParam = new JSONObject();
+ reqParam.put("id", instCode);
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+ @Override
+ public UnifiedResponse addOrderSequences(Instruction inst) {
+ JSONObject addOrder = createOrederData(inst, "1");
+ String path = "/api/route/transportOrders/" + inst.getInstruction_code();
+ return xgHttpUtil.sendPostRequest(path, addOrder);
+ }
+
+ @Override
+ public UnifiedResponse getRobotInfo(String robotCode, Class type) {
+ String path = "/robotsStatus?vehicles=" + robotCode;
+ return xgHttpUtil.sendGetRequest(path, type);
+ }
+
+ @Override
+ public UnifiedResponse getBlockGroup(JSONObject reqParam) {
+ String path = "/getBlockGroup";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+ @Override
+ public UnifiedResponse releaseBlockGroup(JSONObject reqParam) {
+ String path = "/releaseBlockGroup";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
+ @Override
+ public UnifiedResponse blockGroupStatus(JSONObject reqParam) {
+ String path = "/blockGroupStatus";
+ return xgHttpUtil.sendPostRequest(path, reqParam);
+ }
+
@Override
public String waitPointRequest(String param) {
log.info("收到AGV请求参数:{}", param);
@@ -99,186 +192,185 @@ public class XianGongAgvServiceImpl implements XianGongAgvService {
}
- @Override
- public HttpResponse markComplete(String code) {
- String api = "/api/route/orderSequences/" + code + "/markComplete";
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+// @Override
+// public HttpResponse markComplete(String code) {
+// String api = "/api/route/orderSequences/" + code + "/markComplete";
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+//
+// agvurl = agvurl + ":" + agvport + "/api/route/orderSequences/" + code + "/markComplete";
+// log.info("关闭agv运单序列请求:{}", agvurl);
+//
+// HttpResponse result = HttpRequest.post(agvurl)
+// //.body(String.valueOf(orderjo))//表单内容
+// .timeout(20000)//超时,毫秒
+// .execute();
+// log.info("关闭agv运单序列请求反馈:{}", result);
+//
+// return result;
+// } else {
+// return null;
+// }
+//
+// }
- agvurl = agvurl + ":" + agvport + "/api/route/orderSequences/" + code + "/markComplete";
- log.info("关闭agv运单序列请求:{}", agvurl);
+// @Override
+// public HttpResponse queryXZAgvDeviceStatus() {
+//
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+//
+// String agvurl1 = agvurl + ":" + agvport + "/api/route/vehicles";
+// String agvurl2 = agvurl + ":" + agvport + "/api/route/vehicleDetails";
+//
+// HttpResponse result = HttpRequest.get(agvurl1)
+// .timeout(20000)//超时,毫秒
+// .execute();
+//
+//
+// HttpResponse result2 = HttpRequest.get(agvurl2)
+// .timeout(20000)//超时,毫秒
+// .execute();
+//
+// System.out.println("查询agv状态数据:" + result.body());
+// if (result.getStatus() == 200) {
+// JSONArray ja = (JSONArray) JSONArray.parse(result.body());
+//
+// for (int i = 0; i < ja.size(); i++) {
+// JSONObject jo = (JSONObject) ja.get(i);
+// String name = jo.getString("name");
+// String state = jo.getString("state");
+// String energyLevel = jo.getString("energyLevel");
+// String transportOrder = jo.getString("transportOrder");
+// JSONObject detailjo = (JSONObject) JSONObject.parse(result2.body());
+// JSONObject item = (JSONObject) detailjo.get(name);
+// String x = item.getString("x");
+// String y = item.getString("y");
+// String angle = item.getString("angle");
+// AgvDto dto = new AgvDto();
+// dto.setName(name);
+// dto.setEnergyLevel(energyLevel);
+// dto.setState(state);
+// dto.setTransportOrder(transportOrder);
+// dto.setPositionAngle(angle);
+// dto.setPositionX(x);
+// dto.setPositionY(y);
+// if (AGVDeviceStatus.containsKey(name)) {
+// AGVDeviceStatus.remove(name);
+// AGVDeviceStatus.put(name, dto);
+// } else {
+// AGVDeviceStatus.put(name, dto);
+// }
+// }
+// }
+// return result;
+// } else {
+// return null;
+// }
+//
+//
+// }
- HttpResponse result = HttpRequest.post(agvurl)
- //.body(String.valueOf(orderjo))//表单内容
- .timeout(20000)//超时,毫秒
- .execute();
- log.info("关闭agv运单序列请求反馈:{}", result);
+// @Override
+// public HttpResponse queryXZAgvInstStatus() {
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+//
+// agvurl = agvurl + ":" + agvport + "/orders?page=1&size=200";
+//
+// HttpResponse result = HttpRequest.get(agvurl)
+// .timeout(20000)//超时,毫秒
+// .execute();
+// log.info("queryXZAgvInstStatus----查询agv指令数据:{}" + result.body());
+// return result;
+// } else {
+//
+// return null;
+// }
+// }
- return result;
- } else {
- return null;
- }
+// @Override
+// public HttpResponse deleteXZAgvInst(String instCode) {
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+//
+// JSONObject param = new JSONObject();
+// param.put("id", instCode);
+// param.put("disableVehicle", false);
+// agvurl = agvurl + ":" + agvport + "/terminate";
+// log.info("删除agv指令请求agvurl:{}", agvurl);
+// try {
+// HttpResponse result = HttpRequest.post(agvurl)
+// .body(param.toJSONString())
+// .timeout(20000)//超时,毫秒
+// .execute();
+// log.info("删除agv指令请求反馈:{}", result);
+// return result;
+// } catch (Exception e) {
+// log.error("取消AGV指令信息错误:{}", e.getMessage());
+// throw new BadRequestException(e.getMessage());
+// }
+// } else {
+// return null;
+// }
+// }
+// @Override
+// public HttpResponse sendOrderSequencesToXZ(Instruction inst) throws Exception {
+// JSONObject jo = new JSONObject();
+// jo.put("id", inst.getInstruction_code());
+// jo.put("complete", true);
+// jo.put("blocks", createBlocksData(inst));
+// jo.put("priority", inst.getPriority());
+// log.info("任务号:{},指令号{},下发agv订单序列参数:{}", inst.getTask_code(), inst.getInstruction_code(), jo.toString());
+//
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+// agvurl = agvurl + ":" + agvport + "/setOrder";
+//
+// HttpResponse result = HttpRequest.post(agvurl)
+// .body(String.valueOf(jo))//表单内容
+// .timeout(20000)//超时,毫秒
+// .execute();
+// log.info(agvurl);
+// log.info("任务号:{},指令号{},状态{},下发agv订单序列反馈:{}", inst.getTask_code(), inst.getInstruction_code(), result.getStatus(), result.body());
+// return result;
+// } else {
+// return null;
+// }
+// }
- }
+// @Override
+// public HttpResponse addOrderSequences(Instruction inst) throws Exception {
+// JSONObject orderjo = createOrederData(inst, "1");
+// log.info("指令号:{},追加agv订单序列参数:{}", inst.getInstruction_code(), orderjo.toString());
+//
+// if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
+// String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
+// String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
+//
+// agvurl = agvurl + ":" + agvport + "/api/route/transportOrders/" + inst.getInstruction_code();
+//
+// HttpResponse result = HttpRequest.post(agvurl)
+// .body(String.valueOf(orderjo))//表单内容
+// .timeout(20000)//超时,毫秒
+// .execute();
+// log.info(agvurl);
+// log.info("任务号:{},指令号{},状态{},追加agv订单序列参数:{}", inst.getTask_code(), inst.getInstruction_code(), result.getStatus(), result.body());
+//
+// return result;
+// } else {
+// return null;
+// }
+// }
@Override
- public HttpResponse queryXZAgvDeviceStatus() {
-
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
-
- String agvurl1 = agvurl + ":" + agvport + "/api/route/vehicles";
- String agvurl2 = agvurl + ":" + agvport + "/api/route/vehicleDetails";
-
- HttpResponse result = HttpRequest.get(agvurl1)
- .timeout(20000)//超时,毫秒
- .execute();
-
-
- HttpResponse result2 = HttpRequest.get(agvurl2)
- .timeout(20000)//超时,毫秒
- .execute();
-
- System.out.println("查询agv状态数据:" + result.body());
- if (result.getStatus() == 200) {
- JSONArray ja = (JSONArray) JSONArray.parse(result.body());
-
- for (int i = 0; i < ja.size(); i++) {
- JSONObject jo = (JSONObject) ja.get(i);
- String name = jo.getString("name");
- String state = jo.getString("state");
- String energyLevel = jo.getString("energyLevel");
- String transportOrder = jo.getString("transportOrder");
- JSONObject detailjo = (JSONObject) JSONObject.parse(result2.body());
- JSONObject item = (JSONObject) detailjo.get(name);
- String x = item.getString("x");
- String y = item.getString("y");
- String angle = item.getString("angle");
- AgvDto dto = new AgvDto();
- dto.setName(name);
- dto.setEnergyLevel(energyLevel);
- dto.setState(state);
- dto.setTransportOrder(transportOrder);
- dto.setPositionAngle(angle);
- dto.setPositionX(x);
- dto.setPositionY(y);
- if (AGVDeviceStatus.containsKey(name)) {
- AGVDeviceStatus.remove(name);
- AGVDeviceStatus.put(name, dto);
- } else {
- AGVDeviceStatus.put(name, dto);
- }
- }
- }
- return result;
- } else {
- return null;
- }
-
-
- }
-
- @Override
- public HttpResponse queryXZAgvInstStatus() {
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
-
- agvurl = agvurl + ":" + agvport + "/orders?page=1&size=200";
-
- HttpResponse result = HttpRequest.get(agvurl)
- .timeout(20000)//超时,毫秒
- .execute();
- log.info("queryXZAgvInstStatus----查询agv指令数据:{}" + result.body());
- return result;
- } else {
-
- return null;
- }
- }
-
- @Override
- public HttpResponse deleteXZAgvInst(String instCode) {
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
-
- JSONObject param = new JSONObject();
- param.put("id", instCode);
- param.put("disableVehicle", false);
- agvurl = agvurl + ":" + agvport + "/terminate";
- log.info("删除agv指令请求agvurl:{}", agvurl);
- try {
- HttpResponse result = HttpRequest.post(agvurl)
- .body(param.toJSONString())
- .timeout(20000)//超时,毫秒
- .execute();
- log.info("删除agv指令请求反馈:{}", result);
- return result;
- } catch (Exception e) {
- log.error("取消AGV指令信息错误:{}", e.getMessage());
- throw new BadRequestException(e.getMessage());
- }
- } else {
- return null;
- }
- }
-
- @Override
- public HttpResponse sendOrderSequencesToXZ(Instruction inst) throws Exception {
- JSONObject jo = new JSONObject();
- jo.put("id", inst.getInstruction_code());
- jo.put("complete", true);
- jo.put("blocks", createBlocksData(inst));
- jo.put("priority", inst.getPriority());
- log.info("任务号:{},指令号{},下发agv订单序列参数:{}", inst.getTask_code(), inst.getInstruction_code(), jo.toString());
-
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
- agvurl = agvurl + ":" + agvport + "/setOrder";
-
- HttpResponse result = HttpRequest.post(agvurl)
- .body(String.valueOf(jo))//表单内容
- .timeout(20000)//超时,毫秒
- .execute();
- log.info(agvurl);
- log.info("任务号:{},指令号{},状态{},下发agv订单序列反馈:{}", inst.getTask_code(), inst.getInstruction_code(), result.getStatus(), result.body());
- return result;
- } else {
- return null;
- }
- }
-
- @Override
- public HttpResponse addOrderSequences(Instruction inst) throws Exception {
- JSONObject orderjo = createOrederData(inst, "1");
- log.info("指令号:{},追加agv订单序列参数:{}", inst.getInstruction_code(), orderjo.toString());
-
- if (StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
- String agvurl = paramService.findByCode(AcsConfig.AGV_URL).getValue();
- String agvport = paramService.findByCode(AcsConfig.AGV_PORT).getValue();
-
- agvurl = agvurl + ":" + agvport + "/api/route/transportOrders/" + inst.getInstruction_code();
-
- HttpResponse result = HttpRequest.post(agvurl)
- .body(String.valueOf(orderjo))//表单内容
- .timeout(20000)//超时,毫秒
- .execute();
- log.info(agvurl);
- log.info("任务号:{},指令号{},状态{},追加agv订单序列参数:{}", inst.getTask_code(), inst.getInstruction_code(), result.getStatus(), result.body());
-
- return result;
- } else {
- return null;
- }
- }
-
- @Override
- public String sendOrderSequencesParam(Instruction inst) throws Exception {
+ public String sendOrderSequencesParam(Instruction inst) {
JSONObject jo = new JSONObject();
jo.put("intendedVehicle", "");
jo.put("category", "Park");
@@ -725,4 +817,137 @@ public class XianGongAgvServiceImpl implements XianGongAgvService {
throw new BadRequestException("请求失败,IN OUT 站点错误!");
}
+
+ /**
+ * 叉车运单动作块
+ *
+ * @param inst
+ * @return
+ */
+ private JSONArray createBlocksForklift(Instruction inst) {
+ JSONArray ja = new JSONArray();
+ //起点
+ Device startDevice = deviceAppService.findDeviceByCode(inst.getStart_device_code());
+ //忽略取货校验
+ if ("true".equals(startDevice.getExtraValue().get("ignore_pickup_check"))) {
+ //取货前等待
+ JSONObject jo = new JSONObject();
+ //动作块id
+ jo.put("blockId", IdUtil.simpleUUID());
+ //目的地名称
+ jo.put("location", inst.getStart_point_code() + "INGET");
+ //执行脚本
+ jo.put("operation", "script");
+ jo.put("id", inst.getStart_point_code() + "INGET");
+ //通信脚本,动作前后与现场设备交互的场景
+ jo.put("script_name", "userpy/interact.py");
+ JSONObject script_args = new JSONObject();
+ //更改为现场设备IP及PORT
+// script_args.put("addr", addr);
+ JSONObject data = new JSONObject();
+ JSONObject reach = new JSONObject();
+ reach.put("task_code", inst.getInstruction_code());
+ reach.put("address", inst.getStart_point_code() + "INGET");
+ data.put("reach", reach);
+ script_args.put("data", data);
+ script_args.put("protocol", "HTTP");
+ jo.put("script_args", script_args);
+ ja.add(jo);
+ }
+ //货叉加载货物,会将叉车状态变成载货中
+ JSONObject jo1 = new JSONObject();
+ jo1.put("blockId", IdUtil.simpleUUID());
+ jo1.put("location", inst.getStart_point_code());
+ jo1.put("operation", "ForkLoad");
+ //行走高度
+ jo1.put("start_height", "0.1");
+ //取货高度
+// jo1.put("end_height", inst.getStart_height());
+ //升起信号
+ jo1.put("operationArgs", new JSONObject() {{
+ put("recognize", true);
+ }});
+ ja.add(jo1);
+
+ //取货完成等待
+ if ("true".equals(startDevice.getExtraValue().get("ignore_pickup_check"))) {
+ JSONObject jo2 = new JSONObject();
+ jo2.put("blockId", IdUtil.simpleUUID());
+ jo2.put("location", inst.getStart_point_code() + "OUTGET");
+ jo2.put("operation", "script");
+ jo2.put("id", inst.getStart_point_code() + "OUTGET");
+ jo2.put("script_name", "userpy/interact.py");
+ JSONObject script_args2 = new JSONObject();
+// script_args2.put("addr", addr);
+ JSONObject data2 = new JSONObject();
+ JSONObject reach2 = new JSONObject();
+ reach2.put("task_code", inst.getInstruction_code());
+ reach2.put("address", inst.getStart_point_code() + "OUTGET");
+ data2.put("reach", reach2);
+ script_args2.put("data", data2);
+ script_args2.put("protocol", "HTTP");
+ jo2.put("script_args", script_args2);
+ ja.add(jo2);
+ }
+
+ //起点
+ Device nextDevice = deviceAppService.findDeviceByCode(inst.getNext_device_code());
+ //忽略放货校验
+ if ("true".equals(nextDevice.getExtraValue().get("ignore_release_check"))) {
+ //放货前等待
+ JSONObject jo3 = new JSONObject();
+ jo3.put("blockId", IdUtil.simpleUUID());
+ jo3.put("location", inst.getNext_point_code() + "INPUT");
+ jo3.put("operation", "script");
+ jo3.put("id", inst.getNext_point_code() + "INPUT");
+ jo3.put("script_name", "userpy/interact.py");
+ JSONObject script_args3 = new JSONObject();
+// script_args3.put("addr", addr);
+ JSONObject data3 = new JSONObject();
+ JSONObject reach3 = new JSONObject();
+ reach3.put("task_code", inst.getInstruction_code());
+ reach3.put("address", inst.getNext_point_code() + "INPUT");
+ data3.put("reach", reach3);
+ script_args3.put("data", data3);
+ script_args3.put("protocol", "HTTP");
+ jo3.put("script_args", script_args3);
+ ja.add(jo3);
+ }
+
+
+ //ForkUnload(货叉卸载货物,会将叉车的状态变成非载货中)
+ JSONObject jo2 = new JSONObject();
+ jo2.put("blockId", IdUtil.simpleUUID());
+ jo2.put("location", inst.getStart_point_code());
+ jo2.put("operation", "ForkUnload");
+ //行走高度
+ jo2.put("start_height", "0.2");
+ //放货高度
+// jo2.put("end_height", inst.getNext_height());
+ ja.add(jo2);
+
+
+ //忽略放货校验
+ if ("true".equals(nextDevice.getExtraValue().get("ignore_release_check"))) {
+ //放货完成等待
+ com.alibaba.fastjson.JSONObject jo5 = new com.alibaba.fastjson.JSONObject();
+ jo5.put("blockId", IdUtil.simpleUUID());
+ jo5.put("location", inst.getNext_point_code() + "OUTPUT");
+ jo5.put("operation", "script");
+ jo5.put("id", inst.getNext_point_code() + "OUTPUT");
+ jo5.put("script_name", "userpy/interact.py");
+ com.alibaba.fastjson.JSONObject script_args5 = new com.alibaba.fastjson.JSONObject();
+// script_args5.put("addr", addr);
+ com.alibaba.fastjson.JSONObject data5 = new com.alibaba.fastjson.JSONObject();
+ com.alibaba.fastjson.JSONObject reach5 = new com.alibaba.fastjson.JSONObject();
+ reach5.put("task_code", inst.getInstruction_code());
+ reach5.put("address", inst.getNext_point_code() + "OUTPUT");
+ data5.put("reach", reach5);
+ script_args5.put("data", data5);
+ script_args5.put("protocol", "HTTP");
+ jo5.put("script_args", script_args5);
+ ja.add(jo5);
+ }
+ return ja;
+ }
}
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device.xls b/acs/nladmin-system/src/main/java/org/nl/acs/device.xls
index 7e2a183..182aa3b 100644
Binary files a/acs/nladmin-system/src/main/java/org/nl/acs/device.xls and b/acs/nladmin-system/src/main/java/org/nl/acs/device.xls differ
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
index 24663ad..b827afc 100644
--- a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
@@ -11,7 +11,9 @@ import com.alibaba.fastjson.JSONObject;
public enum DriverTypeEnum {
ORDINARY_SITE(1, "standard_ordinary_site", "普通站点", "station"),
STANDARD_STORAGE(2, "standard_storage", "标准版-货架", "storage"),
- PHOTOELECTRIC_DETECTION_DEVICE_DRIVER(3, "photoelectric_detection_station", "光电检测站点", "station");
+ PHOTOELECTRIC_DETECTION_DEVICE_DRIVER(3, "photoelectric_detection_station", "光电检测站点", "station"),
+ XIANGONG_AGV_DEVICE_DRIVER(4, "xg_agv", "仙工AGV", "agv"),
+ RGV_DEVICE_DRIVER(5, "rgv_station", "RGV", "rgv");
//驱动索引
private int index;
//驱动编码
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/OpcDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/OpcDto.java
index 37f526f..8972c4b 100644
--- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/OpcDto.java
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/OpcDto.java
@@ -27,6 +27,8 @@ public class OpcDto implements Serializable {
*/
private String opc_name;
+ private String topic;
+
/**
* OPC地址
*/
diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/DeviceDriverBaseReader.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/DeviceDriverBaseReader.java
new file mode 100644
index 0000000..b1bb64d
--- /dev/null
+++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/DeviceDriverBaseReader.java
@@ -0,0 +1,221 @@
+package org.nl.acs.device_driver;
+
+import com.alibaba.fastjson.JSON;
+import org.nl.acs.device_driver.utils.ArrayComparisonUtil;
+import org.nl.acs.device_driver.utils.ArrayConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * @Description
+ * @Author Gengby
+ * @Date 2024/4/1
+ */
+public interface DeviceDriverBaseReader {
+
+ public static final Logger LOGGER = LoggerFactory.getLogger(DeviceDriverBaseReader.class);
+
+ public static final boolean ENABLE_LOGGING_FLAG = true;
+
+ public static final String PRE_LAST = "last";
+
+ public static final Map, Map> FIELD_CACHE = new ConcurrentHashMap<>();
+
+ public static final Map, Supplier>> DEFAULT_VALUES_SUPPLIERS = createDefaultValuesSuppliers();
+
+ public static final List> LIMIT_CLASS_TYPE_LIST = Arrays.asList(double.class, Double.class, Float.class, float.class);
+
+ public static final List> ARRAY_CLASS_TYPE_LIST = Arrays.asList(int[].class, Integer[].class, byte[].class, Byte[].class, short[].class, Short[].class, long[].class, Long[].class, float[].class, Float[].class, double[].class, Double[].class, char[].class, Character[].class, boolean[].class, Boolean[].class, String[].class);
+
+ static Map, Supplier>> createDefaultValuesSuppliers() {
+ Map, Supplier>> defaultMap = new HashMap<>();
+ defaultMap.put(int.class, () -> 0);
+ defaultMap.put(Integer.class, () -> 0);
+ defaultMap.put(int[].class, () -> new int[0]);
+ defaultMap.put(Integer[].class, () -> new Integer[0]);
+ defaultMap.put(double.class, () -> 0.0d);
+ defaultMap.put(Double.class, () -> 0.0d);
+ defaultMap.put(double[].class, () -> new double[0]);
+ defaultMap.put(Double[].class, () -> new Double[0]);
+ defaultMap.put(long.class, () -> 0L);
+ defaultMap.put(Long.class, () -> 0L);
+ defaultMap.put(long[].class, () -> new long[0]);
+ defaultMap.put(Long[].class, () -> new Long[0]);
+ defaultMap.put(boolean.class, () -> false);
+ defaultMap.put(Boolean.class, () -> Boolean.FALSE);
+ defaultMap.put(boolean[].class, () -> new boolean[0]);
+ defaultMap.put(Boolean[].class, () -> new Boolean[0]);
+ defaultMap.put(byte.class, () -> (byte) 0);
+ defaultMap.put(Byte.class, () -> (byte) 0);
+ defaultMap.put(byte[].class, () -> new byte[0]);
+ defaultMap.put(Byte[].class, () -> new Byte[0]);
+ defaultMap.put(char.class, () -> '\u0000');
+ defaultMap.put(Character.class, () -> '\u0000');
+ defaultMap.put(char[].class, () -> new char[0]);
+ defaultMap.put(Character[].class, () -> new Character[0]);
+ defaultMap.put(short.class, () -> (short) 0);
+ defaultMap.put(Short.class, () -> (short) 0);
+ defaultMap.put(short[].class, () -> new short[0]);
+ defaultMap.put(Short[].class, () -> new Short[0]);
+ defaultMap.put(float.class, () -> 0.0f);
+ defaultMap.put(Float.class, () -> 0.0f);
+ defaultMap.put(float[].class, () -> new float[0]);
+ defaultMap.put(Float[].class, () -> new Float[0]);
+ defaultMap.put(String.class, () -> "");
+ defaultMap.put(String[].class, () -> new String[0]);
+ return defaultMap;
+ }
+
+ static Map, Supplier>> getLimitPlacesValue(Class> filedType, T value) {
+ Map, Supplier>> limitMap = new HashMap<>();
+ Map, Function