Browse Source

rev:更新主分支

master
耿宝印 11 months ago
parent
commit
3bea9aa95a
  1. 6
      acs/nladmin-system/pom.xml
  2. 134
      acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java
  3. 581
      acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java
  4. 4
      acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
  5. 49
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/xg_agv/XianGongAgvDefinition.java
  6. 139
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/xg_agv/XianGongAgvDeviceDriver.java
  7. 133
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/ItemProtocol.java
  8. 243
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/RGVDeviceDriver.java
  9. 77
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/RGVStationDefinition.java
  10. 57
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/ItemProtocol.java
  11. 43
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/PhotoelectricDetectionDeviceDriver.java
  12. 5
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/PhotoelectricDetectionStationDefinition.java
  13. 10
      acs/nladmin-system/src/main/java/org/nl/acs/ext/RequestAdapter.java
  14. 12
      acs/nladmin-system/src/main/java/org/nl/acs/ext/ResponseAdapter.java
  15. 37
      acs/nladmin-system/src/main/java/org/nl/acs/ext/UnifiedResponse.java
  16. 93
      acs/nladmin-system/src/main/java/org/nl/acs/ext/log/OtherToInterfaceLogAspect.java
  17. 12
      acs/nladmin-system/src/main/java/org/nl/acs/ext/log/OthersToInterfaceLog.java
  18. 123
      acs/nladmin-system/src/main/java/org/nl/acs/ext/log/ToOtherInterfaceLogAspect.java
  19. 12
      acs/nladmin-system/src/main/java/org/nl/acs/ext/log/ToOthersInterfaceLog.java
  20. 35
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/IpUtil.java
  21. 133
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsHttpUtil.java
  22. 20
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsRequestAdapter.java
  23. 31
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsResponseAdapter.java
  24. 27
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java
  25. 5
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java
  26. 1
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java
  27. 18
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java
  28. 48
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java
  29. 135
      acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgHttpUtil.java
  30. 21
      acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgRequestAdapter.java
  31. 44
      acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgResponseAdapter.java
  32. 3
      acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java
  33. 43
      acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
  34. 32
      acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/wql/QINST_QUERY.wql
  35. 4
      acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
  36. 2
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/LogMessageConstant.java
  37. 22
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/LuceneAppender.java
  38. 19
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/DeviceLogTypeEnum.java
  39. 36
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java
  40. 1
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java
  41. 107
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java
  42. 91
      acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java
  43. 64
      acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCleanLuceneLog.java
  44. 153
      acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXGTaskStatus.java
  45. 122
      acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java
  46. 45
      acs/nladmin-ui/src/views/acs/device/config.vue
  47. 551
      acs/nladmin-ui/src/views/acs/device/driver/rgv_station.vue
  48. 103
      acs/nladmin-ui/src/views/acs/device/driver/xg/xg_agv.vue
  49. 32
      acs/nladmin-ui/src/views/monitor/interface/api/lucene.js
  50. 162
      acs/nladmin-ui/src/views/monitor/interface/index.vue
  51. 134
      acs/nladmin-ui/src/views/monitor/interface/search.vue
  52. 64
      acs/nladmin-ui/src/views/monitor/interface/time.vue
  53. 16
      acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js
  54. 63
      acs/nladmin-ui/src/views/monitor/lucene/index.vue
  55. 173
      acs/nladmin-ui/src/views/monitor/lucene/search.vue

6
acs/nladmin-system/pom.xml

@ -108,7 +108,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version> <!-- 更新到最新版本 -->
</dependency>
<!-- https://mvnrepository.com/artifact/commons-configuration/commons-configuration -->
<dependency>
<groupId>commons-configuration</groupId>

134
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,38 +14,63 @@ import java.util.Map;
* @Date: 2022-08-15
*/
public interface XianGongAgvService {
Map<String, AgvDto> findAllAgvFromCache();
/**
* 查询自动门状态
* 下发叉车运单
*
* @param device
* @param dto
* @return
*/
public String queryDoorStatus(String device);
public <T> UnifiedResponse<T> sendOrderSequencesToForklift(Instruction dto);
/**
* 先工agv 等待点请求
*AGV->ACS
* @param
* 下发运单序列
*
* @param inst
* @return
* @throws Exception
*/
public String waitPointRequest(String param);
public <T> UnifiedResponse<T> sendOrderSequencesToXZ(Instruction inst);
/**
* acs->agv
* 关闭运单系列
* @param code
* 追加运单
*
* @param inst
* @return
* @throws Exception
*/
public HttpResponse markComplete(String code);
public <T> UnifiedResponse<T> addOrderSequences(Instruction inst);
/**
* @param reqParam
* @param <T>
* @return
* @throws Exception
*/
public <T> UnifiedResponse<T> markComplete(JSONObject reqParam);
/**
* 查询AGV状态
*
* @return
*/
public <T> UnifiedResponse<T> queryXZAgvDeviceStatus(String vehicles, Class<T> type);
/**
* @param type
* @param <T>
* @return
*/
public <T> UnifiedResponse<T> queryXZAgvInstStatus(Class<T> type);
/**
* 根据运单号查询运单状态
*
* @param type
* @param <T>
* @return
*/
public HttpResponse queryXZAgvDeviceStatus();
public <T> UnifiedResponse<T> queryXZAgvInstStatusByCode(String instCode, Class<T> type);
public HttpResponse queryXZAgvInstStatus();
/**
* 删除先知任务
@ -52,31 +78,93 @@ public interface XianGongAgvService {
* @param instCode
* @return
*/
public HttpResponse deleteXZAgvInst(String instCode);
public <T> UnifiedResponse<T> deleteXZAgvInst(String instCode);
/**
* 下发运单序列
* 查询场景中指定机器人信息
*/
public <T> UnifiedResponse<T> getRobotInfo(String robotCode, Class<T> type);
/**
* 占用互斥组
*
* @param inst
* @param reqParam
* @param <T>
* @return
*/
public <T> UnifiedResponse<T> getBlockGroup(JSONObject reqParam);
/**
* 查询互斥组状态
*
* @param reqParam
* @param <T>
* @return
*/
public <T> UnifiedResponse<T> blockGroupStatus(JSONObject reqParam);
/**
* 释放互斥组
*
* @param reqParam
* @param <T>
* @return
*/
public <T> UnifiedResponse<T> releaseBlockGroup(JSONObject reqParam);
/**
* 查询所有AGV
*
* @return
*/
public Map<String, AgvDto> findAllAgvFromCache();
/**
* 查询自动门状态
*
* @param device
* @return
*/
public String queryDoorStatus(String device);
/**
* 先工agv 等待点请求
* AGV->ACS
*
* @param param
* @return
* @throws Exception
*/
public HttpResponse sendOrderSequencesToXZ(Instruction inst) throws Exception;
public String waitPointRequest(String param);
public HttpResponse addOrderSequences(Instruction inst) throws Exception;
/**
* 组织json数据
*
* @param
* @param inst
* @return
* @throws Exception
*/
public String sendOrderSequencesParam(Instruction inst) throws Exception;
public String sendOrderSequencesParam(Instruction inst);
/**
* 创建
*
* @param inst
* @param type
* @return
*/
public JSONObject createOrederData(Instruction inst, String type);
JSONObject xgAGVWaitPointRequest(JSONObject requestParam);
/**
* 请求取货放货
*
* @param requestParam
* @return
*/
public JSONObject xgAGVWaitPointRequest(JSONObject requestParam);
}

581
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<String, AgvDto> AGVDeviceStatus = new HashMap<>();
@Value("${server.port}")
public int port;
@Override
public <T> UnifiedResponse<T> 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 <T> UnifiedResponse<T> 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 <T> UnifiedResponse<T> markComplete(JSONObject reqParam) {
String path = "/markComplete";
return xgHttpUtil.sendPostRequest(path, reqParam);
}
@Override
public <T> UnifiedResponse<T> queryXZAgvDeviceStatus(String vehicles, Class<T> type) {
String path = "/robotsStatus" + vehicles == null ? "" : "?vehicles = " + vehicles;
return xgHttpUtil.sendGetRequest(path, type);
}
@Override
public <T> UnifiedResponse<T> queryXZAgvInstStatus(Class<T> type) {
String path = "/orders?page=1&size=80&orderBy=createTime&orderMethod=descending";
return xgHttpUtil.sendGetRequest(path, type);
}
@Override
public <T> UnifiedResponse<T> queryXZAgvInstStatusByCode(String instCode, Class<T> type) {
String path = "/orderDetails/" + instCode;
return xgHttpUtil.sendGetRequest(path, type);
}
@Override
public <T> UnifiedResponse<T> 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 <T> UnifiedResponse<T> addOrderSequences(Instruction inst) {
JSONObject addOrder = createOrederData(inst, "1");
String path = "/api/route/transportOrders/" + inst.getInstruction_code();
return xgHttpUtil.sendPostRequest(path, addOrder);
}
@Override
public <T> UnifiedResponse<T> getRobotInfo(String robotCode, Class<T> type) {
String path = "/robotsStatus?vehicles=" + robotCode;
return xgHttpUtil.sendGetRequest(path, type);
}
@Override
public <T> UnifiedResponse<T> getBlockGroup(JSONObject reqParam) {
String path = "/getBlockGroup";
return xgHttpUtil.sendPostRequest(path, reqParam);
}
@Override
public <T> UnifiedResponse<T> releaseBlockGroup(JSONObject reqParam) {
String path = "/releaseBlockGroup";
return xgHttpUtil.sendPostRequest(path, reqParam);
}
@Override
public <T> UnifiedResponse<T> 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();
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;
}
}
// @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;
// }
//
// }
// @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 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"))) {
//放货完成等待
JSONObject jo5 = new 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");
JSONObject script_args5 = new JSONObject();
// script_args5.put("addr", addr);
JSONObject data5 = new JSONObject();
JSONObject reach5 = new 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;
}
}

4
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;
//驱动编码

49
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/xg_agv/XianGongAgvDefinition.java

@ -0,0 +1,49 @@
package org.nl.acs.device_driver.basedriver.agv.xg_agv;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.DeviceDriverDefinition;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceType;
import org.springframework.stereotype.Service;
import java.util.LinkedList;
import java.util.List;
/**
* 仙工AGV驱动
*/
@Service
public class XianGongAgvDefinition implements DeviceDriverDefinition {
@Override
public String getDriverCode() {
return "xg_agv";
}
@Override
public String getDriverName() {
return "标准版-仙工Agv";
}
@Override
public String getDriverDescription() {
return "标准版-仙工Agv";
}
@Override
public DeviceDriver getDriverInstance(Device device) {
return (new XianGongAgvDeviceDriver()).setDevice(device).setDriverDefinition(this);
}
@Override
public Class<? extends DeviceDriver> getDeviceDriverType() {
return XianGongAgvDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList();
types.add(DeviceType.agv);
return types;
}
}

139
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/xg_agv/XianGongAgvDeviceDriver.java

@ -0,0 +1,139 @@
package org.nl.acs.device_driver.basedriver.agv.xg_agv;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.RouteableDeviceDriver;
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.acs.opc.Device;
import org.nl.modules.wql.util.SpringContextHolder;
/**
* 仙工AGV
*/
@Slf4j
@Data
@RequiredArgsConstructor
public class XianGongAgvDeviceDriver extends AbstractOpcDeviceDriver implements
DeviceDriver,
ExecutableDeviceDriver,
RouteableDeviceDriver,
DeviceStageMonitor {
private final InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class);
/**
* 当前设备号
*/
private String currentDeviceCode;
/**
* 当前执行任务号
*/
private String taskCode = "0";
/**
* 电量
*/
private Double battery_level = 0.0d;
/**
* 角度
*/
private Double angle = 0.0d;
/**
* 当前机器人X坐标
*/
private Double x = 0.0d;
/**
* 当前机器人Y坐标
*/
private Double y = 0.0d;
/**
* 当前开机时间 ms
*/
private Integer time = 0;
/**
* 累计运行时间 ms
*/
private Integer total_time = 0;
/**
* 今日累计行驶里程, 单位 m
*/
private Double today_odo = 0.0d;
/**
* 累计行驶里程
*/
private Integer odo = 0;
/**
* AGV当前状态码
*/
private Integer status = 0;
/**
* AGV当前状态对应名称
*/
private String statusName = this.status == 1 ? "工作中" : this.status == 2 ? "充电中" : this.status == 3 ? "故障" : this.status == 4 ? "休息中" : this.status == 5 ? "关机" : "未知状态";
/**
* 当天执行任务数量
*/
private Integer todayTaskNum = 0;
/**
* 近一个月执行任务数量
*/
private Integer monthTaskNum = 0;
@Override
public Device getDevice() {
return this.device;
}
@Override
public void execute() throws Exception {
this.currentDeviceCode = this.getDeviceCode();
this.todayTaskNum = instructionService.findTodayTaskNumByAgvCar(this.currentDeviceCode);
this.monthTaskNum = instructionService.findMonthTaskNumByAgvCar(this.currentDeviceCode);
Thread.sleep(5000);
}
@Override
public JSONObject getDeviceStatusName() {
JSONObject jo = new JSONObject();
jo.put("device_code", this.currentDeviceCode);
jo.put("device_name", this.currentDeviceCode);
jo.put("task_code", this.taskCode);
jo.put("battery_level", (this.battery_level * 100) + "%");
jo.put("angle", this.angle);
jo.put("time", this.time / 1000 / 1.0 / 3600);
jo.put("total_time", this.total_time / 1000 / 1.0 / 3600);
jo.put("today_odo", this.today_odo);
jo.put("odo", this.odo);
jo.put("x", this.x);
jo.put("y", this.y);
jo.put("status", this.statusName);
//jo.put("status_name", this.statusName);
jo.put("todayTaskNum", this.todayTaskNum);
jo.put("monthTaskNum", this.monthTaskNum);
return jo;
}
@Override
public void setDeviceStatus(JSONObject data) {
}
}

133
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/ItemProtocol.java

@ -0,0 +1,133 @@
package org.nl.acs.device_driver.rgv;
import lombok.Getter;
import lombok.Setter;
import org.nl.acs.device_driver.shangdianke.PhotoelectricDetectionDeviceDriver;
@Getter
@Setter
public class ItemProtocol {
public static final String ITEM_HEARTBEAT = "heartbeat";
public static final String ITEM_MODE = "mode";
public static final String ITEM_STATUS = "status";
public static final String ITEM_ERROR = "error";
public static final String ITEM_ENERGY_LEVEL = "energyLevel";
public static final String ITEM_TASK_CODE = "taskCode";
public static final String ITEM_START_DEVICE_CODE = "startDeviceCode";
public static final String ITEM_NEXT_DEVICE_CODE = "nextDeviceCode";
public static final String ITEM_VEHICLE_CODE = "vehicleCode";
public static final String ITEM_X = "x";
public static final String ITEM_Y = "y";
public static final String ITEM_ACTION = "action";
public static final String ITEM_TODAY_TASK_NUM = "todayTaskNum";
public static final String ITEM_ALL_TASK_NUM = "allTaskNum";
boolean isOnline;
private final RGVDeviceDriver driver;
public ItemProtocol(RGVDeviceDriver driver) {
this.driver = driver;
}
public int getOpcIntegerValue(String protocol) {
Integer value = this.driver.getIntegeregerValue(protocol);
if (value == null) {
this.isOnline = false;
return 0;
} else {
this.isOnline = true;
return value;
}
}
public Double getOpcDoubleValue(String protocol) {
Double value = this.driver.getDoubleValue(protocol);
if (value == null) {
this.isOnline = false;
return 0.0d;
} else {
this.isOnline = true;
return value;
}
}
public String getOpcStringValue(String protocol) {
String value = this.driver.getStringValue(protocol);
if (value == null) {
this.isOnline = false;
return "";
} else {
this.isOnline = true;
return value;
}
}
public int getHeartbeat() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_HEARTBEAT);
}
public int getMode() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_MODE);
}
public int getStatus() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_STATUS);
}
public int getError() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_ERROR);
}
public Double getEnergyLevel() {
return this.getOpcDoubleValue(ItemProtocol.ITEM_ENERGY_LEVEL);
}
public int getTaskCode() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_TASK_CODE);
}
public String getStartDeviceCode() {
return this.getOpcStringValue(ItemProtocol.ITEM_START_DEVICE_CODE);
}
public String getNextDeviceCode() {
return this.getOpcStringValue(ItemProtocol.ITEM_NEXT_DEVICE_CODE);
}
public String getVehicleCode() {
return this.getOpcStringValue(ItemProtocol.ITEM_VEHICLE_CODE);
}
public Double getX() {
return this.getOpcDoubleValue(ItemProtocol.ITEM_X);
}
public Double getY() {
return this.getOpcDoubleValue(ItemProtocol.ITEM_Y);
}
public int getAction() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_ACTION);
}
public int getTodayTaskNum() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_TODAY_TASK_NUM);
}
public int getAllTaskNum() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_ALL_TASK_NUM);
}
}

243
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/RGVDeviceDriver.java

@ -0,0 +1,243 @@
package org.nl.acs.device_driver.rgv;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.device_driver.*;
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.modules.lucene.service.LuceneExecuteLogService;
import org.nl.modules.lucene.service.dto.LuceneLogDto;
import org.nl.modules.wql.util.SpringContextHolder;
/**
* @author zhangjiangwei
*/
@Slf4j
@Getter
@Setter
@RequiredArgsConstructor
public class RGVDeviceDriver extends AbstractOpcDeviceDriver implements
DeviceDriver,
ExecutableDeviceDriver,
RouteableDeviceDriver,
DeviceStageMonitor,
StandardRequestMethod,
HeartbeatableDeviceDriver {
private final ItemProtocol itemProtocol = new ItemProtocol(this);
private final LuceneExecuteLogService logService = SpringContextHolder.getBean(LuceneExecuteLogService.class);
/**
* 心跳
*/
private int heartbeat = 0;
private int lastHeartbeat = 0;
/**
* 工作模式
*/
private int mode = 0;
private int lastMode = 0;
/**
* 工作状态
*/
private int status = 0;
private int lastStatus = 0;
/**
* 报警信息
*/
private int error = 0;
private int lastError = 0;
/**
* 当前电量
*/
private Double energyLevel = 0.0d;
private Double lastEnergyLevel = 0.0d;
/**
* 任务号
*/
private int taskCode = 0;
private int lastTaskCode = 0;
/**
* 起点
*/
private String startDeviceCode;
private String lastStartDeviceCode;
/**
* 终点
*/
private String nextDeviceCode;
private String lastNextDeviceCode;
/**
* 载具号
*/
private String vehicleCode;
private String lastVehicleCode;
/**
* x坐标
*/
private Double x;
private Double lastX;
/**
* y坐标
*/
private Double y;
private Double lastY;
/**
* 当前动作
*/
private int action = 0;
private int lastAction = 0;
/**
* 当天执行任务数
*/
private int todayTaskNum = 0;
private int lastTodayTaskNum = 0;
/**
* 历史执行任务数
*/
private int allTaskNum = 0;
private int lastAllTaskNum = 0;
/**
* 当前设备号
*/
private String currentDeviceCode;
/**
* 消息
*/
private String message = "";
/**
* 请求标记相关信息
*/
private boolean requireSuccess = false;
private long requireTime = System.currentTimeMillis();
private long requireTimeOut = 5000L;
/**
* 设备异常标记
*/
private boolean isError = false;
@Override
public void execute() throws Exception {
this.currentDeviceCode = this.getDevice().getDevice_code();
this.heartbeat = this.itemProtocol.getHeartbeat();
this.mode = this.itemProtocol.getMode();
this.status = this.itemProtocol.getStatus();
this.error = this.itemProtocol.getError();
this.energyLevel = this.itemProtocol.getEnergyLevel();
this.taskCode = this.itemProtocol.getTaskCode();
this.startDeviceCode = this.itemProtocol.getStartDeviceCode();
this.nextDeviceCode = this.itemProtocol.getNextDeviceCode();
this.vehicleCode = this.itemProtocol.getVehicleCode();
this.x = this.itemProtocol.getX();
this.y = this.itemProtocol.getY();
this.action = this.itemProtocol.getAction();
this.todayTaskNum = this.itemProtocol.getTodayTaskNum();
this.allTaskNum = this.itemProtocol.getAllTaskNum();
if (this.mode != this.lastMode) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号mode发生变化 " + this.lastMode + "->" + this.mode));
}
if (this.status != this.lastStatus) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号status发生变化 " + this.lastStatus + "->" + this.status));
}
if (this.error != this.lastError) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号error发生变化 " + this.lastError + "->" + this.error));
}
if (!this.energyLevel.equals(this.lastEnergyLevel)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号energyLevel发生变化 " + this.lastEnergyLevel + "->" + this.energyLevel));
}
if (this.taskCode != this.lastTaskCode) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号taskCode发生变化 " + this.lastTaskCode + "->" + this.taskCode));
}
if (!this.startDeviceCode.equals(this.lastStartDeviceCode)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号startDeviceCode发生变化 " + this.lastStartDeviceCode + "->" + this.startDeviceCode));
}
if (!this.nextDeviceCode.equals(this.lastNextDeviceCode)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号nextDeviceCode发生变化 " + this.lastNextDeviceCode + "->" + this.nextDeviceCode));
}
if (!this.vehicleCode.equals(this.lastVehicleCode)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号vehicleCode发生变化 " + this.lastVehicleCode + "->" + this.vehicleCode));
}
if (!this.x.equals(this.lastX)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号x发生变化 " + this.lastX + "->" + this.x));
}
if (!this.y.equals(this.lastY)) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号y发生变化 " + this.lastY + "->" + this.y));
}
if (this.action != this.lastAction) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号action发生变化 " + this.lastAction + "->" + this.action));
}
if (this.todayTaskNum != this.lastTodayTaskNum) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号todayTaskNum发生变化 " + this.lastTodayTaskNum + "->" + this.todayTaskNum));
}
if (this.allTaskNum != this.lastAllTaskNum) {
logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "信号allTaskNum发生变化 " + this.lastAllTaskNum + "->" + this.allTaskNum));
}
this.lastMode = this.mode;
this.lastStatus = this.status;
this.lastError = this.error;
this.lastEnergyLevel = this.energyLevel;
this.lastTaskCode = this.taskCode;
this.lastStartDeviceCode = this.startDeviceCode;
this.lastNextDeviceCode = this.nextDeviceCode;
this.lastVehicleCode = this.vehicleCode;
this.lastX = this.x;
this.lastY = this.y;
this.lastAction = this.action;
this.lastTodayTaskNum = this.todayTaskNum;
this.lastAllTaskNum = this.allTaskNum;
}
@Override
public JSONObject getDeviceStatusName() throws Exception {
JSONObject jo = new JSONObject();
jo.put("device_code", this.currentDeviceCode);
jo.put("device_name", this.currentDeviceCode);
jo.put("heartbeat", this.heartbeat);
jo.put("mode", this.mode == 1 ? "手动" : this.mode == 2 ? "自动" : "未知");
jo.put("status", this.error > 0 ? "故障" : this.status == 0 ? "休息中" : this.status == 1 ? "工作中" : this.status == 2 ? "充电中" : "未知状态");
jo.put("error", this.error);
jo.put("battery_level", (this.energyLevel * 100) + "%");
jo.put("task_code", this.taskCode);
jo.put("startDeviceCode", this.startDeviceCode);
jo.put("nextDeviceCode", this.nextDeviceCode);
jo.put("vehicleCode", this.vehicleCode);
jo.put("x", this.x);
jo.put("y", this.y);
jo.put("action", this.action);
jo.put("todayTaskNum", this.todayTaskNum);
jo.put("allTaskNum", this.allTaskNum);
return jo;
}
@Override
public void setDeviceStatus(JSONObject data) {
}
}

77
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/rgv/RGVStationDefinition.java

@ -0,0 +1,77 @@
package org.nl.acs.device_driver.rgv;
import org.nl.acs.device.device_driver.standard_inspect.ItemDTO;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.definition.OpcDeviceDriverDefinition;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceType;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* @author zhangjiangwei
*/
@Service
public class RGVStationDefinition implements OpcDeviceDriverDefinition {
@Override
public String getDriverCode() {
return "rgv_station";
}
@Override
public String getDriverName() {
return "RGV";
}
@Override
public String getDriverDescription() {
return "RGV";
}
@Override
public DeviceDriver getDriverInstance(Device device) {
return new RGVDeviceDriver().setDevice(device).setDriverDefinition(this);
}
@Override
public Class<? extends DeviceDriver> getDeviceDriverType() {
return RGVDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList<>();
types.add(DeviceType.rgv);
return types;
}
@Override
public List<ItemDTO> getReadableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_HEARTBEAT, "心跳", "DB1101.B1"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_MODE, "工作模式", "DB1101.B2"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_STATUS, "工作状态", "DB1101.B3"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ERROR, "报警信息", "DB1101.B4"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ENERGY_LEVEL, "当前电量", "DB1101.D5"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_TASK_CODE, "当前执行任务号", "DB1101.D6"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_START_DEVICE_CODE, "任务起点", "DB1101.S7"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_NEXT_DEVICE_CODE, "任务终点", "DB1101.S8"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_VEHICLE_CODE, "载具号", "DB1101.S9"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_X, "x坐标", "DB1101.D10"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_Y, "y坐标", "DB1101.D11"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ACTION, "当前动作", "DB1101.B12"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_TODAY_TASK_NUM, "当天执行任务数", "DB1101.D13"));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ALL_TASK_NUM, "历史执行任务数", "DB1101.D14"));
return itemDTOs;
}
@Override
public List<ItemDTO> getWriteableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
return itemDTOs;
}
}

57
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/ItemProtocol.java

@ -2,6 +2,10 @@ package org.nl.acs.device_driver.shangdianke;
import lombok.Getter;
import lombok.Setter;
import org.nl.acs.device.device_driver.standard_inspect.ItemDTO;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangjiangwei
@ -10,17 +14,6 @@ import lombok.Setter;
@Setter
public class ItemProtocol {
/**
* 心跳
*/
// public static final String ITEM_HEARTBEAT = "heartbeat";
/**
* 工作模式
*/
// public static final String ITEM_MODE = "mode";
/**
* 光电信号
*/
@ -29,17 +22,8 @@ public class ItemProtocol {
/**
* 动作信号
*/
// public static final String ITEM_ACTION = "action";
/**
* 报警信号
*/
// public static final String ITEM_ERROR = "error";
public static final String ITEM_ACTION = "action";
/**
* 下发命令
*/
// public static final String ITEM_TO_COMMAND = "to_command";
boolean isOnline;
@ -60,22 +44,23 @@ public class ItemProtocol {
}
}
// public int getHeartbeat() {
// return this.getOpcIntegerValue(ItemProtocol.ITEM_HEARTBEAT);
// }
// public int getMode() {
// return this.getOpcIntegerValue(ItemProtocol.ITEM_MODE);
// }
public int getMove() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_MOVE);
}
// public int getAction() {
// return this.getOpcIntegerValue(ItemProtocol.ITEM_ACTION);
// }
// public int getError() {
// return this.getOpcIntegerValue(ItemProtocol.ITEM_ERROR);
// }
// public int getToCommand() {
// return this.getOpcIntegerValue(ItemProtocol.ITEM_TO_COMMAND);
// }
public int getAction() {
return this.getOpcIntegerValue(ItemProtocol.ITEM_ACTION);
}
public List<ItemDTO> getReadableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_MOVE, "光电信号", ""));
return itemDTOs;
}
public List<ItemDTO> getWriteableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
return itemDTOs;
}
}

43
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/PhotoelectricDetectionDeviceDriver.java

@ -35,17 +35,6 @@ import java.util.Map;
@RequiredArgsConstructor
public class PhotoelectricDetectionDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor, StandardRequestMethod, HeartbeatableDeviceDriver {
/**
* 心跳
*/
// private int heartbeat = 0;
// private int lastHeartbeat = this.heartbeat;
/**
* 工作模式
*/
// private int mode = 0;
// private int lastMode = this.mode;
/**
* 光电信号
@ -53,23 +42,6 @@ public class PhotoelectricDetectionDeviceDriver extends AbstractOpcDeviceDriver
private int move = 0;
private int lastMove = 0;
/**
* 动作信号
*/
// private int action = 0;
// private int lastAction = this.action;
/**
* 报警信号
*/
// private int error = 0;
// private int lastError = this.error;
/**
* 下发命令
*/
// private int toCommand = 0;
// private int lastToCommand = this.toCommand;
private static final int MODE = 3;
@ -97,20 +69,13 @@ public class PhotoelectricDetectionDeviceDriver extends AbstractOpcDeviceDriver
try {
this.currentDeviceCode = this.getDeviceCode();
// this.heartbeat = this.itemProtocol.getHeartbeat();
// this.mode = this.itemProtocol.getMode();
this.move = this.itemProtocol.getMove();
// this.action = this.itemProtocol.getAction();
// this.error = this.itemProtocol.getError();
// this.toCommand = this.itemProtocol.getToCommand();
if (this.move != this.lastMove) {
if (move == 0) {
requireSuccess = false;
}
}
// if (mode > 0 && !requireSuccess) {
if (!requireSuccess) {
Object methodName = this.device.getExtraValue().get(String.valueOf(MODE));
if (ObjectUtil.isNotEmpty(methodName)) {
@ -121,13 +86,10 @@ public class PhotoelectricDetectionDeviceDriver extends AbstractOpcDeviceDriver
log.error(e.getMessage(), e);
String message = "执行工作模式对应方法 " + methodName + " 错误!错误信息:" + e.getMessage();
this.message = message;
this.deviceExecuteLogService.deviceExecuteLog(this.currentDeviceCode, "", "", message);
this.isError = true;
}
} else {
String message = "未知工作模式,驱动未配置对应方法。";
this.message = message;
this.deviceExecuteLogService.deviceExecuteLog(this.currentDeviceCode, "", "", message);
}
}
@ -136,12 +98,7 @@ public class PhotoelectricDetectionDeviceDriver extends AbstractOpcDeviceDriver
log.error(e.getMessage(), e);
return;
}
// this.lastHeartbeat = this.heartbeat;
// this.lastMode = this.mode;
this.lastMove = this.move;
// this.lastAction = this.action;
// this.lastError = this.error;
// this.lastToCommand = this.toCommand;
}
private void executionMethodByMode(String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

5
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/shangdianke/PhotoelectricDetectionStationDefinition.java

@ -52,18 +52,13 @@ public class PhotoelectricDetectionStationDefinition implements OpcDeviceDriverD
@Override
public List<ItemDTO> getReadableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
// itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_HEARTBEAT, "心跳", ""));
// itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_MODE, "工作模式", ""));
itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_MOVE, "光电信号", ""));
// itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ACTION, "动作信号", ""));
// itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_ERROR, "报警信号", ""));
return itemDTOs;
}
@Override
public List<ItemDTO> getWriteableItemDTOs() {
ArrayList<ItemDTO> itemDTOs = new ArrayList<>();
// itemDTOs.add(new ItemDTO(ItemProtocol.ITEM_TO_COMMAND, "下发命令", ""));
return itemDTOs;
}
}

10
acs/nladmin-system/src/main/java/org/nl/acs/ext/RequestAdapter.java

@ -0,0 +1,10 @@
package org.nl.acs.ext;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public interface RequestAdapter {
String getUrl();
}

12
acs/nladmin-system/src/main/java/org/nl/acs/ext/ResponseAdapter.java

@ -0,0 +1,12 @@
package org.nl.acs.ext;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public interface ResponseAdapter {
public <T> UnifiedResponse<T> adapt(String responseBody, Class<T> type);
}

37
acs/nladmin-system/src/main/java/org/nl/acs/ext/UnifiedResponse.java

@ -0,0 +1,37 @@
package org.nl.acs.ext;
public class UnifiedResponse<T> {
private boolean success;
private String message;
private T data;
public UnifiedResponse(boolean success, String message, T data) {
this.success = success;
this.message = message;
this.data = data;
}
public UnifiedResponse(boolean success, String message) {
this.success = success;
this.message = message;
}
public boolean isSuccess() {
return this.success;
}
public String getMessage() {
return this.message;
}
public T getData() {
return this.data;
}
public void setData(T data) {
this.data = data;
}
}

93
acs/nladmin-system/src/main/java/org/nl/acs/ext/log/OtherToInterfaceLogAspect.java

@ -0,0 +1,93 @@
package org.nl.acs.ext.log;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.nl.acs.ext.wms.IpUtil;
import org.nl.modules.lucene.service.LuceneExecuteLogService;
import org.nl.modules.lucene.service.dto.LuceneLogDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.Method;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/7/8
*/
@Aspect
@Component
public class OtherToInterfaceLogAspect {
@Autowired
private LuceneExecuteLogService logService;
@Around("@annotation(org.nl.acs.ext.log.OthersToInterfaceLog)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Class<?> targetClass = joinPoint.getTarget().getClass();
RequestMapping classRequestMapping = targetClass.getAnnotation(RequestMapping.class);
String classUrlValue = classRequestMapping != null ? String.join(",", classRequestMapping.value()) : "No Class Annotation";
String methodUrlValue = "";
if (method.isAnnotationPresent(GetMapping.class)) {
GetMapping getMapping = method.getAnnotation(GetMapping.class);
methodUrlValue = String.join(",", getMapping.value());
} else if (method.isAnnotationPresent(PostMapping.class)) {
PostMapping postMapping = method.getAnnotation(PostMapping.class);
methodUrlValue = String.join(",", postMapping.value());
} else if (method.isAnnotationPresent(PutMapping.class)) {
PutMapping putMapping = method.getAnnotation(PutMapping.class);
methodUrlValue = String.join(",", putMapping.value());
} else if (method.isAnnotationPresent(DeleteMapping.class)) {
DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
methodUrlValue = String.join(",", deleteMapping.value());
} else if (method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class);
methodUrlValue = String.join(",", methodRequestMapping.value());
}
String request_direction = "";
if (method.isAnnotationPresent(OthersToInterfaceLog.class)) {
OthersToInterfaceLog interfaceLog = method.getAnnotation(OthersToInterfaceLog.class);
request_direction = interfaceLog.value();
}
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
LuceneLogDto logDto =
LuceneLogDto.builder()
.logType("接口日志")
.request_url(IpUtil.localIP() + classUrlValue + methodUrlValue)
.request_direction(request_direction)
.request_param(JSON.toJSONString(args))
.method(methodName)
.content("开始请求")
.build();
logService.interfaceExecuteLog(logDto);
Object result = joinPoint.proceed();
logDto =
LuceneLogDto.builder()
.logType("接口日志")
.request_url(IpUtil.localIP() + classUrlValue + methodUrlValue)
.request_direction(request_direction)
.request_param(JSON.toJSONString(args))
.method(methodName)
.response_param(JSON.toJSONString(result))
.executeTime(System.currentTimeMillis() - startTime)
.content("响应请求")
.build();
logService.interfaceExecuteLog(logDto);
return result;
}
}

12
acs/nladmin-system/src/main/java/org/nl/acs/ext/log/OthersToInterfaceLog.java

@ -0,0 +1,12 @@
package org.nl.acs.ext.log;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OthersToInterfaceLog {
String value() default "";
}

123
acs/nladmin-system/src/main/java/org/nl/acs/ext/log/ToOtherInterfaceLogAspect.java

@ -0,0 +1,123 @@
package org.nl.acs.ext.log;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.nl.modules.lucene.service.LuceneExecuteLogService;
import org.nl.modules.lucene.service.dto.LuceneLogDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/7/8
*/
@Aspect
@Component
public class ToOtherInterfaceLogAspect {
private static final ConcurrentMap<Class<?>, Field> fieldCache = new ConcurrentHashMap<>();
private static final ConcurrentMap<Class<?>, Method> methodCache = new ConcurrentHashMap<>();
@Autowired
private LuceneExecuteLogService logService;
@Around("@annotation(org.nl.acs.ext.log.ToOthersInterfaceLog)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String request_direction = "";
if (method.isAnnotationPresent(ToOthersInterfaceLog.class)) {
ToOthersInterfaceLog interfaceLog = method.getAnnotation(ToOthersInterfaceLog.class);
request_direction = interfaceLog.value();
}
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
Object url = "";
Object requesr_param = "";
if (args.length > 1) {
url = args[0];
requesr_param = args[1];
}
Class<?> targetClass = joinPoint.getTarget().getClass();
Object ipPort = "";
try {
Field requestAdapterField = fieldCache.computeIfAbsent(targetClass, clazz -> {
try {
Field field = clazz.getDeclaredField("REQUEST_ADAPTER");
ReflectionUtils.makeAccessible(field);
return field;
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
});
Object requestAdapterObject = requestAdapterField.get(null);
Method getUrlMethod = methodCache.computeIfAbsent(requestAdapterObject.getClass(), clazz -> {
try {
Method m = clazz.getDeclaredMethod("getUrl");
ReflectionUtils.makeAccessible(m);
return m;
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
});
ipPort = getUrlMethod.invoke(requestAdapterObject);
} catch (Exception e) {
LuceneLogDto logDto =
LuceneLogDto.builder()
.logType("接口日志")
.request_url(ipPort + String.valueOf(url))
.request_direction(request_direction)
.request_param(JSON.toJSONString(requesr_param))
.method(methodName)
.content("开始请求,获取url失败," + e.getMessage())
.build();
logService.interfaceExecuteLog(logDto);
}
LuceneLogDto logDto =
LuceneLogDto.builder()
.logType("接口日志")
.request_url(ipPort + String.valueOf(url))
.request_direction(request_direction)
.request_param(JSON.toJSONString(requesr_param))
.method(methodName)
.content("开始请求")
.build();
logService.interfaceExecuteLog(logDto);
Object result = joinPoint.proceed();
logDto =
LuceneLogDto.builder()
.logType("接口日志")
.request_url(ipPort + String.valueOf(url))
.request_direction(request_direction)
.request_param(JSON.toJSONString(requesr_param))
.method(methodName)
.response_param(JSON.toJSONString(result))
.executeTime(System.currentTimeMillis() - startTime)
.content("响应请求")
.build();
logService.interfaceExecuteLog(logDto);
return result;
}
}

12
acs/nladmin-system/src/main/java/org/nl/acs/ext/log/ToOthersInterfaceLog.java

@ -0,0 +1,12 @@
package org.nl.acs.ext.log;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ToOthersInterfaceLog {
String value() default "";
}

35
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/IpUtil.java

@ -0,0 +1,35 @@
package org.nl.acs.ext.wms;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/6/25
*/
public class IpUtil {
public static final String LOCAL_IP = localIP();
public static String localIP() {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof java.net.Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "";
}
}

133
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsHttpUtil.java

@ -0,0 +1,133 @@
package org.nl.acs.ext.wms;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import org.nl.acs.config.AcsConfig;
import org.nl.acs.ext.RequestAdapter;
import org.nl.acs.ext.ResponseAdapter;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.log.ToOthersInterfaceLog;
import org.nl.modules.system.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
@Component
public class LmsHttpUtil {
private static final RequestAdapter REQUEST_ADAPTER = new LmsRequestAdapter();
private static final ResponseAdapter RESPONSE_ADAPTER = new LmsResponseAdapter();
@Autowired
private ParamService paramService;
@ToOthersInterfaceLog("ACS->LMS")
public <T, W> UnifiedResponse<T> sendPostRequest(String path, W requestParam, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.body(JSON.toJSONString(requestParam))
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->LMS")
public <T, W> UnifiedResponse<T> sendPostRequest(String path, W requestParam) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(),"1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.body(JSON.toJSONString(requestParam))
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->LMS")
public <T> UnifiedResponse<T> sendPostRequest(String path, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->LMS")
public <T> UnifiedResponse<T> sendPostRequest(String path) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->LMS")
public <T> UnifiedResponse<T> sendGetRequest(String path, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.get(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->LMS")
public <T> UnifiedResponse<T> sendGetRequest(String path) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_WMS).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.get(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(5000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
}

20
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsRequestAdapter.java

@ -0,0 +1,20 @@
package org.nl.acs.ext.wms;
import org.nl.acs.config.AcsConfig;
import org.nl.acs.ext.RequestAdapter;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.wql.util.SpringContextHolder;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public class LmsRequestAdapter implements RequestAdapter {
@Override
public String getUrl() {
ParamService paramService = SpringContextHolder.getBean(ParamService.class);
return paramService.findByCode(AcsConfig.WMS_URL).getValue();
}
}

31
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/LmsResponseAdapter.java

@ -0,0 +1,31 @@
package org.nl.acs.ext.wms;
import com.alibaba.fastjson.JSONObject;
import org.nl.acs.ext.ResponseAdapter;
import org.nl.acs.ext.UnifiedResponse;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public class LmsResponseAdapter implements ResponseAdapter {
@Override
public <T> UnifiedResponse<T> adapt(String responseBody, Class<T> type) {
JSONObject jsonResponse = JSONObject.parseObject(responseBody);
boolean isSuccess = jsonResponse.getInteger("code") == 200;
String message = jsonResponse.getString("message");
if (type != null) {
if (type.isArray()) {
T data = JSONObject.toJavaObject(jsonResponse.getJSONArray("content"), type);
return new UnifiedResponse<>(isSuccess, message, data);
} else {
T data = JSONObject.toJavaObject(jsonResponse.getJSONObject("data"), type);
return new UnifiedResponse<>(isSuccess, message, data);
}
}
return new UnifiedResponse<>(isSuccess, message);
}
}

27
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java

@ -8,8 +8,13 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.ext.log.OthersToInterfaceLog;
import org.nl.acs.ext.wms.service.WmsToAcsService;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
import org.nl.modules.logging.annotation.Log;
import org.nl.modules.wql.util.SpringContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@ -31,16 +36,30 @@ public class WmsToAcsController {
private final WmsToAcsService wmstoacsService;
@PostMapping("/task")
@Log("接收WMS任务")
@ApiOperation("接收WMS任务")
@OthersToInterfaceLog("LMS->ACS")
public ResponseEntity<Object> createFromWms(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(wmstoacsService.createFromWms(whereJson), HttpStatus.OK);
}
@PostMapping("/cancelTask")
@Log("WMS取消任务")
@ApiOperation("WMS取消任务")
@OthersToInterfaceLog("LMS->ACS")
public ResponseEntity<Object> cancelFromWms(@RequestBody String whereJson) throws Exception {
return new ResponseEntity<>(wmstoacsService.cancelFromWms(whereJson), HttpStatus.OK);
}
@PostMapping("/获取AGV和RGV数据")
@OthersToInterfaceLog("LMS->ACS")
public ResponseEntity<Object> getAGVAndRGVInfo() {
return new ResponseEntity<>(wmstoacsService.getAGVAndRGVInfo(), HttpStatus.OK);
}
@PostMapping("/test")
public ResponseEntity<Object> test() throws Exception {
DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class);
Device device = deviceAppService.findDeviceByCode("AMB-01");
if (device.getDeviceDriver() instanceof DeviceStageMonitor) {
DeviceStageMonitor monitorService = (DeviceStageMonitor) device.getDeviceDriver();
}
return new ResponseEntity<>(HttpStatus.OK);
}
}

5
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java

@ -1,5 +1,6 @@
package org.nl.acs.ext.wms.service;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.wms.data.BaseRequest;
public interface AcsToWmsService {
@ -9,4 +10,8 @@ public interface AcsToWmsService {
*/
public String applyTask(BaseRequest request);
<T> UnifiedResponse<T> apply(BaseRequest requestParam);
<T> UnifiedResponse<T> apply(BaseRequest requestParam, Class<T> type);
}

1
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java

@ -24,4 +24,5 @@ public interface WmsToAcsService {
*/
Map<String, Object> cancelFromWms(String jsonObject) throws Exception;
JSONObject getAGVAndRGVInfo();
}

18
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java

@ -3,6 +3,9 @@ package org.nl.acs.ext.wms.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.device.address.service.AddressService;
import org.nl.acs.device.address.service.dto.AddressDto;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.wms.LmsHttpUtil;
import org.nl.acs.ext.wms.LmsUtil;
import org.nl.acs.ext.wms.data.BaseRequest;
import org.nl.acs.ext.wms.service.AcsToWmsService;
@ -18,10 +21,25 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
@Autowired
private AddressService addressService;
@Autowired
private LmsHttpUtil lmsHttpUtil;
@Override
public String applyTask(BaseRequest requestParam) {
String api = addressService.findByCode("lnshApplyTaskToWms").getMethods_url();
String result = LmsUtil.notifyAcs(api, requestParam);
return result;
}
@Override
public <T> UnifiedResponse<T> apply(BaseRequest requestParam) {
AddressDto addressDto = addressService.findByCode("lnshApplyTaskToWms");
return lmsHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam);
}
@Override
public <T> UnifiedResponse<T> apply(BaseRequest requestParam, Class<T> type) {
AddressDto addressDto = addressService.findByCode("lnshApplyTaskToWms");
return lmsHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type);
}
}

48
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java

@ -6,21 +6,28 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.AgvUtil;
import org.nl.acs.config.AcsConfig;
import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.ext.wms.data.wmsToAcsData.createTask.CreateTaskRequest;
import org.nl.acs.ext.wms.data.wmsToAcsData.createTask.CreateTaskResponse;
import org.nl.acs.ext.wms.service.WmsToAcsService;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
import org.nl.acs.opc.DeviceType;
import org.nl.acs.route.service.RouteLineService;
import org.nl.acs.route.service.dto.RouteLineDto;
import org.nl.acs.task.service.TaskService;
import org.nl.acs.task.service.dto.TaskDto;
import org.nl.modules.lucene.service.LuceneExecuteLogService;
import org.nl.modules.lucene.service.dto.LuceneLogDto;
import org.nl.modules.quartz.task.DeviceStatusMonitor;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.system.service.impl.ParamServiceImpl;
import org.nl.modules.wql.core.bean.WQLObject;
@ -30,6 +37,7 @@ import org.slf4j.MDC;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -42,6 +50,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
private final TaskService TaskService;
private final DeviceService DeviceService;
private final RouteLineService RouteLineService;
private final DeviceAppService deviceAppService;
private String log_file_type = "log_file_type";
private String log_type = "WMS下发ACS";
@ -241,13 +250,13 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
resp.setMessage("请求成功");
log.info("createFromWms - 返回参数 {}", JSON.toJSON(resp));
LuceneLogDto logDto = LuceneLogDto.builder()
.requestparam(JSON.toJSON(resp).toString())
.responseparam(JSON.toJSON(resp).toString())
.status_code(String.valueOf(resp.getCode()))
.method(tasks.getRequest_medthod_code())
.build();
lucene.interfaceExecuteLog(logDto);
// LuceneLogDto logDto = LuceneLogDto.builder()
// .requestparam(JSON.toJSON(resp).toString())
// .responseparam(JSON.toJSON(resp).toString())
// .status_code(String.valueOf(resp.getCode()))
// .method(tasks.getRequest_medthod_code())
// .build();
// lucene.interfaceExecuteLog(logDto);
return (JSONObject) JSON.toJSON(resp);
} finally {
MDC.remove(log_file_type);
@ -301,4 +310,29 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
MDC.remove(log_file_type);
}
}
@SneakyThrows
@Override
public JSONObject getAGVAndRGVInfo() {
JSONObject resp = new JSONObject();
List<Device> agvs = deviceAppService.findDevice(DeviceType.agv);
List<JSONObject> agvInfos = new ArrayList<>();
for (Device agv : agvs) {
if (agv != null && agv.getDeviceDriver() instanceof DeviceStatusMonitor) {
DeviceStageMonitor deviceStageMonitor = (DeviceStageMonitor) agv.getDeviceDriver();
agvInfos.add(deviceStageMonitor.getDeviceStatusName());
}
}
resp.put("agv", agvInfos);
List<Device> rgvs = deviceAppService.findDevice(DeviceType.rgv);
List<JSONObject> rgvInfos = new ArrayList<>();
for (Device rgv : rgvs) {
if (rgv != null && rgv.getDeviceDriver() instanceof DeviceStatusMonitor) {
DeviceStageMonitor deviceStageMonitor = (DeviceStageMonitor) rgv.getDeviceDriver();
rgvInfos.add(deviceStageMonitor.getDeviceStatusName());
}
}
resp.put("rgv", rgvInfos);
return resp;
}
}

135
acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgHttpUtil.java

@ -0,0 +1,135 @@
package org.nl.acs.ext.xg;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import org.nl.acs.config.AcsConfig;
import org.nl.acs.ext.RequestAdapter;
import org.nl.acs.ext.ResponseAdapter;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.log.ToOthersInterfaceLog;
import org.nl.modules.system.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
@Component
public class XgHttpUtil {
private static final RequestAdapter REQUEST_ADAPTER = new XgRequestAdapter();
private static final ResponseAdapter RESPONSE_ADAPTER = new XgResponseAdapter();
@Autowired
private ParamService paramService;
@ToOthersInterfaceLog("ACS->AGV")
public <T, W> UnifiedResponse<T> sendPostRequest(String path, W requestParam, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.body(JSON.toJSONString(requestParam))
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->AGV")
public <T, W> UnifiedResponse<T> sendPostRequest(String path, W requestParam) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.body(JSON.toJSONString(requestParam))
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->AGV")
public <T> UnifiedResponse<T> sendPostRequest(String path, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->AGV")
public <T> UnifiedResponse<T> sendPostRequest(String path) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.post(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->AGV")
public <T> UnifiedResponse<T> sendGetRequest(String path, Class<T> type) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(),"1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.get(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, type);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
@ToOthersInterfaceLog("ACS->AGV")
public <T> UnifiedResponse<T> sendGetRequest(String path) {
if (!StrUtil.equals(paramService.findByCode(AcsConfig.FORK_AGV).getValue(), "1")) {
return new UnifiedResponse<>(false, "未开启连接该系统!");
}
try {
String body = HttpRequest
.get(REQUEST_ADAPTER.getUrl() + path)
.setConnectionTimeout(10000)
.execute()
.body();
return RESPONSE_ADAPTER.adapt(body, null);
} catch (Exception e) {
return new UnifiedResponse<>(false, e.getMessage());
}
}
}

21
acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgRequestAdapter.java

@ -0,0 +1,21 @@
package org.nl.acs.ext.xg;
import org.nl.acs.config.AcsConfig;
import org.nl.acs.ext.RequestAdapter;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.wql.util.SpringContextHolder;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public class XgRequestAdapter implements RequestAdapter {
@Override
public String getUrl() {
ParamService paramService = SpringContextHolder.getBean(ParamService.class);
return paramService.findByCode(AcsConfig.AGV_URL).getValue();
}
}

44
acs/nladmin-system/src/main/java/org/nl/acs/ext/xg/XgResponseAdapter.java

@ -0,0 +1,44 @@
package org.nl.acs.ext.xg;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.acs.ext.ResponseAdapter;
import org.nl.acs.ext.UnifiedResponse;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/22
*/
public class XgResponseAdapter implements ResponseAdapter {
@Override
public <T> UnifiedResponse<T> adapt(String responseBody, Class<T> type) {
responseBody = responseBody.trim();
if (responseBody.startsWith("{") && responseBody.endsWith("}")) {
JSONObject resp = JSON.parseObject(responseBody);
String message = resp.containsKey("msg") ? resp.getString("msg") : "";
if (resp.containsKey("code") && resp.getInteger("code") != 0) {
return new UnifiedResponse<>(false, message);
} else {
if (type != null) {
T data = JSONObject.toJavaObject(resp, type);
return new UnifiedResponse<>(true, message, data);
}
return new UnifiedResponse<>(true, message, (T) resp);
}
} else if (responseBody.startsWith("[") && responseBody.endsWith("]")) {
JSONArray resp = JSON.parseArray(responseBody);
if (type != null) {
T data = JSONObject.toJavaObject(resp, type);
return new UnifiedResponse<>(true, "success", data);
} else {
return new UnifiedResponse<>(true, "success", (T) resp);
}
} else {
return new UnifiedResponse<>(false, "failed,响应数据为空!");
}
}
}

3
acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java

@ -198,4 +198,7 @@ public interface InstructionService {
void sendToAGV(String id);
Integer findTodayTaskNumByAgvCar(String currentDeviceCode);
Integer findMonthTaskNumByAgvCar(String currentDeviceCode);
}

43
acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java

@ -19,6 +19,7 @@ import org.nl.acs.config.AcsConfig;
import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device.service.impl.DeviceServiceImpl;
import org.nl.acs.device_driver.lamp_three_color.LampThreecolorDeviceDriver;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.opc.Device;
@ -271,10 +272,6 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
dto.setNext_parent_code(task.getNext_parent_code());
WQLObject wo = WQLObject.getWQLObject("acs_instruction");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.insert(json);
try {
// != 0 为agv任务
if (!StrUtil.equals(type, "0")) {
@ -295,8 +292,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
if (StrUtil.equals(task.getRequest_again_success(), "1")) {
XianGongAgvServiceImpl xianGongAgv = SpringContextHolder.getBean(XianGongAgvServiceImpl.class);
//追加订单
HttpResponse result = xianGongAgv.addOrderSequences(dto);
if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) {
UnifiedResponse<JSONObject> response = xianGongAgv.addOrderSequences(dto);
if (!response.isSuccess()) {
dto.setSend_status("2");
} else {
dto.setSend_status("1");
@ -304,8 +301,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
} else {
XianGongAgvServiceImpl xianGongAgv = SpringContextHolder.getBean(XianGongAgvServiceImpl.class);
//创建订单序列
HttpResponse result = xianGongAgv.sendOrderSequencesToXZ(dto);
if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) {
UnifiedResponse<JSONObject> response = xianGongAgv.sendOrderSequencesToXZ(dto);
if (!response.isSuccess()) {
dto.setSend_status("2");
} else {
dto.setSend_status("1");
@ -317,7 +314,9 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
dto.setSend_status("2");
e.printStackTrace();
}
WQLObject wo = WQLObject.getWQLObject("acs_instruction");
JSONObject json = (JSONObject) JSONObject.toJSON(dto);
wo.insert(json);
this.instructions.add(dto);
}
@ -745,8 +744,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
if (StrUtil.equals(task.getRequest_again_success(), "1")) {
XianGongAgvServiceImpl xianGongAgv = SpringContextHolder.getBean(XianGongAgvServiceImpl.class);
//追加订单
HttpResponse result = xianGongAgv.addOrderSequences(dto);
if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) {
UnifiedResponse<JSONObject> response = xianGongAgv.addOrderSequences(dto);
if (!response.isSuccess()) {
dto.setSend_status("2");
} else {
dto.setSend_status("1");
@ -754,8 +753,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
} else {
XianGongAgvServiceImpl xianGongAgv = SpringContextHolder.getBean(XianGongAgvServiceImpl.class);
//创建订单序列
HttpResponse result = xianGongAgv.sendOrderSequencesToXZ(dto);
if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) {
UnifiedResponse<JSONObject> response = xianGongAgv.sendOrderSequencesToXZ(dto);
if (!response.isSuccess()) {
dto.setSend_status("2");
} else {
dto.setSend_status("1");
@ -770,5 +769,23 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu
this.update(dto);
}
@Override
public Integer findTodayTaskNumByAgvCar(String currentDeviceCode) {
Map<String, String> map = new HashMap<>();
map.put("flag", "3");
map.put("carno", currentDeviceCode);
JSONObject jsonObject = WQL.getWO("QINST_QUERY").addParamMap(map).process().uniqueResult(0);
return jsonObject.getInteger("total_count");
}
@Override
public Integer findMonthTaskNumByAgvCar(String currentDeviceCode) {
Map<String, String> map = new HashMap<>();
map.put("flag", "4");
map.put("carno", currentDeviceCode);
JSONObject jsonObject = WQL.getWO("QINST_QUERY").addParamMap(map).process().uniqueResult(0);
return jsonObject.getInteger("total_count");
}
}

32
acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/wql/QINST_QUERY.wql

@ -17,10 +17,10 @@
输入.code TYPEAS s_string
输入.vehicle_code TYPEAS s_string
输入.material_type TYPEAS s_string
输入.status TYPEAS s_string
输入.point_code TYPEAS s_string
输入.point_code TYPEAS s_string
输入.create_time TYPEAS time
输入.status TYPEAS s_string
输入.point_code TYPEAS s_string
输入.carno TYPEAS s_string
输入.create_time TYPEAS time
输入.end_time TYPEAS time
@ -124,3 +124,27 @@
ENDSELECT
ENDPAGEQUERY
ENDIF
IF 输入.flag = "3"
QUERY
SELECT COUNT(*) AS total_count
FROM acs_instruction inst
WHERE is_delete = 0 AND DATE(inst.create_time) = CURDATE()
OPTION 输入.carno <> ""
inst.carno = 输入.carno
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "4"
QUERY
SELECT COUNT(*) AS total_count
FROM acs_instruction inst
WHERE is_delete = '0' AND inst.create_time >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
OPTION 输入.carno <> ""
inst.carno = 输入.carno
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF

4
acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java

@ -184,7 +184,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
int totalElements = (Integer) jsonObject.get("totalElements");
JSONArray arr = new JSONArray();
for (int i = 0; i < array.size(); i++) {
JSONObject object = arr.getJSONObject(i);
JSONObject object = array.getJSONObject(i);
object.put("hasChildren", true);
arr.add(object);
}
@ -686,7 +686,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
request.setTask_status(dto.getTask_status());
request.setRequest_medthod_code(RequestMethodEnum.feedback_task_status.getCode());
request.setRequest_medthod_name(RequestMethodEnum.feedback_task_status.getName());
acstowmsService.applyTask(request);
acstowmsService.apply(request);
}
}

2
acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/LogMessageConstant.java

@ -75,6 +75,6 @@ public class LogMessageConstant {
/**
* 索引路径
*/
public final static String INDEX_DIR = "E:\\lucene\\index";
public final static String INDEX_DIR = "D:\\lucene\\index";
}

22
acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/LuceneAppender.java

@ -79,7 +79,7 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
//向document对象中添加域。
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
String traceId = mdcPropertyMap.get("traceId");
System.out.println("---追踪号---"+traceId);
// System.out.println("---追踪号---"+traceId);
if (ObjectUtil.isNotEmpty(traceId)) {
document.add(new StringField("trace_id", traceId, Field.Store.YES));
}
@ -95,11 +95,23 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
if (ObjectUtil.isNotEmpty(luceneLogDto.getStatus_code())) {
document.add(new StringField("status_code", luceneLogDto.getStatus_code(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequestparam())) {
document.add(new StringField("requestparam", luceneLogDto.getRequestparam(), Field.Store.YES));
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequest_param())) {
document.add(new StringField("request_param", luceneLogDto.getRequest_param(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getResponseparam())) {
document.add(new StringField("responseparam", luceneLogDto.getResponseparam(), Field.Store.YES));
if (ObjectUtil.isNotEmpty(luceneLogDto.getResponse_param())) {
document.add(new StringField("response_param", luceneLogDto.getResponse_param(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequest_url())) {
document.add(new StringField("request_url", luceneLogDto.getRequest_url(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getDeviceLogType())) {
document.add(new StringField("deviceLogType", luceneLogDto.getDeviceLogType(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getRequest_direction())) {
document.add(new StringField("request_direction", luceneLogDto.getRequest_direction(), Field.Store.YES));
}
if (ObjectUtil.isNotEmpty(luceneLogDto.getExecuteTime())) {
document.add(new StringField("executeTime", luceneLogDto.getExecuteTime() + "", Field.Store.YES));
}
document.add(new StringField("logType", luceneLogDto.getLogType(), Field.Store.YES));
document.add(new StringField("logTime", DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"), Field.Store.YES));

19
acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/DeviceLogTypeEnum.java

@ -0,0 +1,19 @@
package org.nl.modules.lucene.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* @Description TODO
* @Author Gengby
* @Date 2024/4/10
*/
@Getter
@RequiredArgsConstructor
public enum DeviceLogTypeEnum {
AUTO_THREAD("auto", "自动线程"),
MQTT("mqtt", "MQTT");
private final String code;
private final String name;
}

36
acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java

@ -1,10 +1,10 @@
package org.nl.modules.lucene.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.logging.annotation.Log;
import org.nl.modules.lucene.enums.DeviceLogTypeEnum;
import org.nl.modules.lucene.enums.LogTypeEnum;
import org.nl.modules.lucene.service.LuceneService;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
@ -14,12 +14,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
@Api(tags = "日志检索")
@RequestMapping("/api/lucene")
@Slf4j
public class LuceneController {
@ -27,12 +29,30 @@ public class LuceneController {
private final LuceneService luceneService;
@GetMapping("/getAll")
@Log("日志检索")
@ApiOperation("日志检索")
//@PreAuthorize("@el.check('task:list')")
public ResponseEntity<Object> get(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(luceneService.getAll(whereJson, page), HttpStatus.OK);
}
@GetMapping("/getDeviceLogType")
public ResponseEntity<Object> getDeviceLogType() {
return new ResponseEntity<>(Arrays.stream(DeviceLogTypeEnum.values())
.map(type -> {
Map<String, Object> map = new java.util.HashMap<>();
map.put("code", type.getCode());
map.put("name", type.getName());
return map;
})
.collect(Collectors.toList()), HttpStatus.OK);
}
@GetMapping("/getLogTypes")
public ResponseEntity<Object> get(@RequestParam Map whereJson) {
return new ResponseEntity<>(Arrays.stream(LogTypeEnum.values()).map(logType -> {
Map<String, Object> map = new java.util.HashMap<>();
map.put("logType", logType.getDesc());
return map;
})
.collect(Collectors.toList()), HttpStatus.OK);
}
}

1
acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java

@ -1,6 +1,5 @@
package org.nl.modules.lucene.service;
import org.nl.modules.lucene.service.dto.LuceneLogDto;
public interface LuceneExecuteLogService {

107
acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java

@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nl.modules.lucene.enums.DeviceLogTypeEnum;
@Data
@Builder
@ -11,96 +12,80 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class LuceneLogDto {
/* 日志标识 */
private String log_uuid;
/*日志类型*/
/**
* 日志类型
*/
private String logType;
/*设备编号*/
private String device_code;
/*内容详情*/
private String content;
/* 任务编码 */
private String task_code;
/* 指令编码 */
private String instruct_code;
/* 任务标识 */
private String task_id;
/* 载具号 */
private String vehicle_code;
/* 备注 */
private String remark;
/**
* 设备编号
*/
private String device_code;
/* 日志类型 */
private String log_type;
/**
* 内容详情
*/
private String content;
/* 方法 */
/**
* 方法
*/
private String method;
/* 请求参数 */
private String requestparam;
/**
* 请求参数
*/
private String request_param;
/* 响应参数 */
private String responseparam;
/**
* 响应参数
*/
private String response_param;
/* 请求地址 */
private String requesturl;
/**
* 请求路径
*/
private String request_url;
/* 状态码 */
private String status_code;
/* 是否删除 1:是;0:否 */
private String is_delete;
/* 创建者 */
private String create_by;
/* 创建时间 YYYY-MM-DD hh:mm:ss */
private String create_time;
/**
* 状态码
*/
private String status_code;
/* 修改者 */
private String update_by;
/**
* 设备日志类型
*/
private String deviceLogType;
/* 修改时间 */
private String update_time;
/**
* 请求方向
*/
private String request_direction;
/**
* 执行时间
*/
private long executeTime;
public LuceneLogDto(final String opc_server_code, final String opc_plc_code,
final String device_code, final String to_home, final String last_home,
final String home) {
super();
this.device_code = device_code;
this.content = "信号 ["
+ opc_server_code + "."
+ opc_plc_code + "."
+ device_code + "."
+ to_home + "] 发生变更 "
+ last_home + " -> "
+ home;
}
public LuceneLogDto(final String device_code, final String remark) {
super();
this.device_code = device_code;
this.deviceLogType = DeviceLogTypeEnum.AUTO_THREAD.getCode();
this.content = "设备 ["
+ device_code
+ "] - "
+ remark;
}
public LuceneLogDto(final LuceneLogDto dto) {
public LuceneLogDto(final String device_code, final String device_log_type, final String remark) {
super();
this.device_code = device_code;
this.method = method;
this.deviceLogType = device_log_type;
this.content = "设备 ["
+ device_code
+ "] - "
+ remark;
}
}

91
acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java

@ -12,6 +12,9 @@ import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.nl.modules.lucene.service.LuceneService;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@ -26,14 +29,17 @@ import java.util.*;
@Slf4j
public class LuceneServiceImpl implements LuceneService {
//日志索引目录
@Override
public Map<String, Object> getAll(Map whereJson, Pageable page) {
//获取要查询的路径,也就是索引所在的位置
try {
FSDirectory directory = FSDirectory.open(Paths.get("C:\\acs\\lucene\\index"));
Resource resource = new ClassPathResource("config/application.yml");
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(resource);
Properties properties = yamlPropertiesFactoryBean.getObject();
// 获取配置值
String luceneDir = properties.getProperty("lucene.index.path");
FSDirectory directory = FSDirectory.open(Paths.get(luceneDir));
DirectoryReader open = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(open);
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数:
@ -45,48 +51,55 @@ public class LuceneServiceImpl implements LuceneService {
String startDate = (String) whereJson.get("begin_time");
String endDate = (String) whereJson.get("end_time");
if (startDate == null){
Calendar calendar=Calendar.getInstance();
if (startDate == null) {
Calendar calendar = Calendar.getInstance();
calendar.set(1970, 0, 1);
startDate = DateUtil.format(calendar.getTime(),"yyyy-MM-dd HH:mm:ss.SSS");
}else{
startDate = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss.SSS");
} else {
startDate = getDate(startDate);
}
if (endDate == null){
endDate = DateUtil.format(new DateTime(),"yyyy-MM-dd HH:mm:ss.SSS");
if (endDate == null) {
endDate = DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS");
} else {
endDate = getDate(endDate);
}
TermRangeQuery termRangeQuery = new TermRangeQuery("logTime", new BytesRef(startDate), new BytesRef(endDate), true, true);
booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST);
if (whereJson.get("device_code") != null){
booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST);
if (whereJson.get("logType") != null) {
Query termQuery = new TermQuery(new Term("logType", (String) whereJson.get("logType")));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("device_code") != null) {
Query termQuery = new TermQuery(new Term("device_code", (String) whereJson.get("device_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("deviceLogType") != null) {
Query termQuery = new TermQuery(new Term("deviceLogType", (String) whereJson.get("deviceLogType")));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("method") != null){
Query termQuery = new TermQuery(new Term("method", (String) whereJson.get("method")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
if (whereJson.get("method") != null) {
WildcardQuery termQuery = new WildcardQuery(new Term("method", "*" + (String) whereJson.get("method") + "*"));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("status_code") != null){
Query termQuery = new TermQuery(new Term("status_code", (String) whereJson.get("status_code")));
booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST);
if (whereJson.get("request_url") != null) {
WildcardQuery termQuery = new WildcardQuery(new Term("request_url", "*" + (String) whereJson.get("request_url") + "*"));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("requestparam") != null){
WildcardQuery query = new WildcardQuery(new Term("requestparam", "*"+(String) whereJson.get("requestparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
if (whereJson.get("request_direction") != null) {
Query termQuery = new TermQuery(new Term("request_direction", (String) whereJson.get("request_direction")));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("responseparam") != null){
WildcardQuery query = new WildcardQuery(new Term("responseparam", "*"+(String) whereJson.get("responseparam")+"*"));
booleanQueryBuilder.add(query,BooleanClause.Occur.MUST);
if (whereJson.get("request_param") != null) {
WildcardQuery termQuery = new WildcardQuery(new Term("request_param", "*" + (String) whereJson.get("request_param") + "*"));
booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST);
}
if (whereJson.get("blurry") != null) {
WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*"+(String) whereJson.get("blurry")+"*"));
WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*" + (String) whereJson.get("blurry") + "*"));
booleanQueryBuilder.add(query, BooleanClause.Occur.MUST);
}
TopFieldCollector collector = TopFieldCollector.create(new Sort(new SortField("logTime", SortField.Type.LONG,true)), 20000, 0);
TopFieldCollector collector = TopFieldCollector.create(new Sort(new SortField("logTime", SortField.Type.LONG, true)), 20000, 0);
searcher.search(booleanQueryBuilder.build(), collector);
TopDocs topDocs = collector.topDocs(pageNum*pageSize, pageSize);
TopDocs topDocs = collector.topDocs(pageNum * pageSize, pageSize);
int totalSize = collector.getTotalHits();
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
@ -94,14 +107,18 @@ public class LuceneServiceImpl implements LuceneService {
for (ScoreDoc scoreDoc : scoreDocs) {
Document doc = open.document(scoreDoc.doc);
JSONObject object = new JSONObject();
object.put("content",doc.get("fieldContent"));
object.put("device_code",doc.get("device_code"));
object.put("logTime",doc.get("logTime"));
object.put("method",doc.get("method"));
object.put("status_code",doc.get("status_code"));
object.put("requestparam",doc.get("requestparam"));
object.put("responseparam",doc.get("responseparam"));
if(doc.get("fieldContent") != null) {
object.put("content", doc.get("fieldContent"));
object.put("device_code", doc.get("device_code"));
object.put("deviceLogType", doc.get("deviceLogType"));
object.put("logTime", doc.get("logTime"));
object.put("method", doc.get("method"));
object.put("request_url", doc.get("request_url"));
object.put("status_code", doc.get("status_code"));
object.put("request_param", doc.get("request_param"));
object.put("response_param", doc.get("response_param"));
object.put("request_direction", doc.get("request_direction"));
object.put("executeTime", doc.get("executeTime"));
if (doc.get("fieldContent") != null) {
list.add(object);
}
}

64
acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCleanLuceneLog.java

@ -0,0 +1,64 @@
package org.nl.modules.quartz.task;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.nl.modules.lucene.config.LuceneAppender;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import java.nio.file.Paths;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Properties;
/**
* @author onepiece
*/
@Slf4j
@Component
public class AutoCleanLuceneLog {
private static final long MAX_FILE_AGE_DAYS = 10;
public void run() {
try {
Resource resource = new ClassPathResource("config/application.yml");
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(resource);
Properties properties = yamlPropertiesFactoryBean.getObject();
String logDirectory = properties.getProperty("lucene.index.path");
Instant now = Instant.now();
Instant cutoffTime = now.minus(MAX_FILE_AGE_DAYS, ChronoUnit.DAYS);
String cutoffTimeStr = DateUtil.format(Date.from(cutoffTime), "yyyy-MM-dd HH:mm:ss.SSS");
FSDirectory dir = FSDirectory.open(Paths.get(logDirectory));
IndexWriter writer = LuceneAppender.indexWriter;
try (IndexReader reader = DirectoryReader.open(dir)) {
IndexSearcher searcher = new IndexSearcher(reader);
Query query = new TermRangeQuery("logTime", new BytesRef(""), new BytesRef(cutoffTimeStr), true, true);
TopDocs topDocs = searcher.search(query, Integer.MAX_VALUE);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
writer.deleteDocuments(new Term("logTime", doc.get("logTime")));
}
}
writer.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}

153
acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXGTaskStatus.java

@ -1,5 +1,6 @@
package org.nl.modules.quartz.task;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
@ -8,13 +9,21 @@ import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.server.XianGongAgvService;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.ext.wms.service.AcsToWmsService;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.opc.Device;
import org.nl.acs.task.service.TaskService;
import org.nl.acs.task.service.dto.TaskDto;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.wql.util.SpringContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* 查询AGV任务状态
*/
@ -23,56 +32,106 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
public class QueryXGTaskStatus {
private final InstructionService instructionService;
private final XianGongAgvService agvService;
public void run() throws Exception {
HttpResponse response = agvService.queryXZAgvInstStatus();
JSONObject jo = JSONArray.parseObject(response.body());
JSONArray ja = JSONArray.parseArray(jo.getString("list"));
for (int i = 0; i < ja.size(); i++) {
JSONObject one = (JSONObject) ja.get(i);
String inst_code = one.getString("id");
Instruction inst = instructionService.findByCodeFromCache(inst_code);
if (ObjectUtil.isEmpty(inst))
continue;
String state = one.getString("state");
if (!StrUtil.isEmpty(one.getString("vehicle"))) {
String carno = one.getString("vehicle");
inst.setCarno(carno);
}
// 已创建=CREATED,
// 待分配=TOBEDISPATCHED,
// 正在执行=RUNNING,
// 完成=FINISHED,
// 失败=FAILED(主动失败),
// 终止=STOPPED(被人为终止),
// 无法执行=Error(参数错误),
// 等待=WAITING
@Autowired
private InstructionService instructionService;
@Autowired
private XianGongAgvService agvService;
//执行中
if ("RUNNING".equals(state) || "CREATED".equals(state) || "TOBEDISPATCHED".equals(state) || "WAITING".equals(state)) {
if (inst != null) {
inst.setInstruction_status("1");
instructionService.update(inst);
}
} else if ("FINISHED".equals(state)) {
if (inst != null) {
inst.setInstruction_status("2");
instructionService.finish(inst);
}
} else if ("STOPPED".equals(state) || "FAILED".equals(state) || "Error".equals(state)) {
if (inst != null) {
inst.setInstruction_status("1");
instructionService.update(inst);
public void run() {
try {
List<Instruction> allInstFromCache = instructionService.findAllInstFromCache();
for (Instruction instruction : allInstFromCache) {
UnifiedResponse<JSONObject> resp = agvService.queryXZAgvInstStatusByCode(instruction.getInstruction_code(), JSONObject.class);
if (resp.isSuccess()) {
// 已创建=CREATED,
// 待分配=TOBEDISPATCHED,
// 正在执行=RUNNING,
// 完成=FINISHED,
// 失败=FAILED(主动失败),
// 终止=STOPPED(被人为终止),
// 无法执行=Error(参数错误),
// 等待=WAITING
//执行中
String state = resp.getData().getString("state");
String carNo = resp.getData().getString("vehicle");
String instructionCode = resp.getData().getString("id");
if ("RUNNING".equals(state) || "CREATED".equals(state) || "TOBEDISPATCHED".equals(state) || "WAITING".equals(state)) {
if (!instruction.getInstruction_status().equals("1")) {
instruction.setInstruction_status("1");
instruction.setCarno(carNo);
instructionService.update(instruction);
}
} else if ("FINISHED".equals(state)) {
instruction.setInstruction_status("2");
try {
instructionService.finish(instruction);
} catch (Exception e) {
log.error("执行完成,但无法更新状态,可能由于参数错误导致的异常");
e.printStackTrace();
}
} else if ("STOPPED".equals(state) || "FAILED".equals(state) || "Error".equals(state)) {
if (!instruction.getInstruction_status().equals("1")) {
instruction.setInstruction_status("1");
instructionService.update(instruction);
}
}
}
}
}
// UnifiedResponse<JSONObject> resp = agvService.queryXZAgvInstStatus(JSONObject.class);
// if (resp.isSuccess()) {
// JSONObject data = resp.getData();
// JSONArray list = data.getJSONArray("list");
// if (list == null) return;
// for (int i = 0; i < list.size(); i++) {
// JSONObject one = list.getJSONObject(i);
// String inst_code = one.getString("id");
// Instruction inst = instructionService.findByCodeFromCache(inst_code);
//
// if (ObjectUtil.isEmpty(inst)) continue;
//
// //子任务状态 待以后处理
// JSONArray blocks = JSONArray.parseArray(one.getString("blocks"));
// for (int j = 0; j < blocks.size(); j++) {
// JSONObject blocksjo = (JSONObject) blocks.get(j);
// String blockId = blocksjo.getString("blockId");
// String device_code = blocksjo.getString("location");
// String state = blocksjo.getString("state");
// }
//
// String state = one.getString("state");
// if (!StrUtil.isEmpty(one.getString("vehicle"))) {
// String carno = one.getString("vehicle");
// inst.setCarno(carno);
// }
//// 已创建=CREATED,
//// 待分配=TOBEDISPATCHED,
//// 正在执行=RUNNING,
//// 完成=FINISHED,
//// 失败=FAILED(主动失败),
//// 终止=STOPPED(被人为终止),
//// 无法执行=Error(参数错误),
//// 等待=WAITING
// //执行中
// if ("RUNNING".equals(state) || "CREATED".equals(state) || "TOBEDISPATCHED".equals(state) || "WAITING".equals(state)) {
// if (inst != null) {
// inst.setInstruction_status("1");
// instructionService.update(inst);
// }
// } else if ("FINISHED".equals(state)) {
// if (inst != null) {
// inst.setInstruction_status("2");
// instructionService.finish(inst);
// }
// } else if ("STOPPED".equals(state) || "FAILED".equals(state) || "Error".equals(state)) {
// if (inst != null) {
// inst.setInstruction_status("1");
// instructionService.update(inst);
// }
// }
// }
// }
} catch (Exception e) {
}
}
}

122
acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java

@ -0,0 +1,122 @@
package org.nl.modules.quartz.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.server.XianGongAgvService;
import org.nl.acs.device_driver.basedriver.agv.xg_agv.XianGongAgvDeviceDriver;
import org.nl.acs.ext.UnifiedResponse;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
* 查询先工AGV设备状态
*/
@Slf4j
@Component
public class QueryXZAgvDeviceStatus {
@Autowired
private XianGongAgvService agvService;
@Autowired
private DeviceAppService deviceAppService;
@Autowired
private InstructionService instructionService;
public void run() {
try {
UnifiedResponse<JSONObject> response = agvService.queryXZAgvDeviceStatus(null, JSONObject.class);
if (response.isSuccess()) {
JSONObject body = response.getData();
JSONArray ja = body.getJSONArray("report");
for (int i = 0; i < ja.size(); i++) {
JSONObject jo = ja.getJSONObject(i);
//机器人编码
String agv_code = jo.getString("uuid");
//机器人详细状态信息
JSONObject rbk_report = jo.getJSONObject("rbk_report");
//是否正在充电
Boolean charging = rbk_report.getBoolean("charging");
//角度
Double angle = rbk_report.getDouble("angle");
//电池电量(0-1)
Double battery_level = rbk_report.getDouble("battery_level");
//当前开机时间 ms
Integer time = rbk_report.getInteger("time");
//累计运行时间 ms
Integer total_time = rbk_report.getInteger("total_time");
//今日累计行驶里程, 单位 m
Double today_odo = rbk_report.getDouble("today_odo");
//累计行驶里程
Integer odo = rbk_report.getInteger("odo");
//是否正在执行任务
Boolean procBusiness = jo.getBoolean("procBusiness");
//agv是否故障
Boolean is_error = jo.getBoolean("is_error");
//执行运单信息
JSONObject current_order = jo.getJSONObject("current_order");
Integer connectionStatus = jo.getInteger("connection_status");
String inst_code = current_order.getString("id");
Instruction instruction = instructionService.findByCodeFromCache(inst_code);
String taskCode = "0";
if (instruction != null) {
taskCode = instruction.getTask_code();
}
DecimalFormat hisFormat = new DecimalFormat("########.###");
hisFormat.setRoundingMode(RoundingMode.DOWN);
//x坐标
Double x = rbk_report.getDouble("x");
//y坐标
Double y = rbk_report.getDouble("y");
String status = "0";
if (connectionStatus == 0) {
status = "5";
} else {
if (procBusiness && !is_error) {
//工作中
status = "1";
} else {
if (charging) {
//充电中
status = "2";
} else {
if (is_error) {
//故障
status = "3";
} else {
//休息中
status = "4";
}
}
}
}
Device device = deviceAppService.findDeviceByCode(agv_code);
if (device != null && device.getDeviceDriver() instanceof XianGongAgvDeviceDriver) {
XianGongAgvDeviceDriver xgAGV = (XianGongAgvDeviceDriver) device.getDeviceDriver();
xgAGV.setTaskCode(taskCode);
xgAGV.setBattery_level(battery_level);
xgAGV.setAngle(angle);
xgAGV.setTime(time);
xgAGV.setTotal_time(total_time);
xgAGV.setToday_odo(today_odo);
xgAGV.setOdo(odo);
xgAGV.setX(x);
xgAGV.setY(y);
xgAGV.setStatus(Integer.parseInt(status));
}
}
}
} catch (Exception e) {
System.out.println("出现异常");
e.printStackTrace();
}
}
}

45
acs/nladmin-ui/src/views/acs/device/config.vue

@ -101,6 +101,8 @@ import lnsh_crusher from '@/views/acs/device/driver/lnsh/lnsh_crusher'
import lnsh_palletizing_manipulator_site from '@/views/acs/device/driver/lnsh/lnsh_palletizing_manipulator_site'
import conveyor_ssx_barcode from '@/views/acs/device/driver/lnsh/conveyor_ssx_barcode'
import conveyor_press_station from '@/views/acs/device/driver/lnsh/conveyor_press_station'
import xg_agv from '@/views/acs/device/driver/xg/xg_agv'
import rgv_station from '@/views/acs/device/driver/rgv_station'
import agv_ndc_one from '@/views/acs/device/driver/agv/agv_ndc_one'
import agv_ndc_two from '@/views/acs/device/driver/agv/agv_ndc_two'
import package_site from './driver/lnsh/package_site.vue'
@ -109,12 +111,43 @@ import photoelectric_detection_station from '@/views/acs/device/driver/shangdian
export default {
name: 'DeviceConfig',
components: { standard_ordinary_site, standard_inspect_site,
lamp_three_color, standard_storage, standard_scanner, standard_conveyor_control_with_scanner,
standard_conveyor_control, standard_conveyor_monitor, lnsh_mixing_mill, lnsh_press, lnsh_palletizing_manipulator, lnsh_fold_disc_site, lnsh_kiln_lane, lnsh_kiln_truss,
lnsh_package_line, lnsh_out_kiln_truss, lnsh_package_pallet_manipulator, lnsh_pallet_storage, lnsh_labeling_machine, lnsh_split_manipulator, lnsh_rgv,
lnsh_station, lnsh_Laminating_machine, lnsh_package_site, lnsh_crusher, lnsh_palletizing_manipulator_site, conveyor_ssx_barcode, conveyor_press_station,
agv_ndc_one, agv_ndc_two, package_site, nl4_station, photoelectric_detection_station },
components: {
standard_ordinary_site,
standard_inspect_site,
lamp_three_color,
standard_storage,
standard_scanner,
standard_conveyor_control_with_scanner,
standard_conveyor_control,
standard_conveyor_monitor,
lnsh_mixing_mill,
lnsh_press,
lnsh_palletizing_manipulator,
lnsh_fold_disc_site,
lnsh_kiln_lane,
lnsh_kiln_truss,
lnsh_package_line,
lnsh_out_kiln_truss,
lnsh_package_pallet_manipulator,
lnsh_pallet_storage,
lnsh_labeling_machine,
lnsh_split_manipulator,
lnsh_rgv,
lnsh_station,
lnsh_Laminating_machine,
lnsh_package_site,
lnsh_crusher,
lnsh_palletizing_manipulator_site,
conveyor_ssx_barcode,
conveyor_press_station,
agv_ndc_one,
agv_ndc_two,
package_site,
nl4_station,
photoelectric_detection_station,
xg_agv,
rgv_station
},
dicts: ['device_type'],
mixins: [crud],
data() {

551
acs/nladmin-ui/src/views/acs/device/driver/rgv_station.vue

@ -0,0 +1,551 @@
<template>
<!--检测站点-->
<div>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">设备协议</span>
</div>
<el-row>
<el-col :span="12">
OpcServer:
<el-select
v-model="opc_id"
placeholder="无"
clearable
@change="changeOpc"
>
<el-option
v-for="item in dataOpcservers"
:key="item.opc_id"
:label="item.opc_name"
:value="item.opc_id"
/>
</el-select>
</el-col>
<el-col :span="12">
PLC:
<el-select
v-model="plc_id"
placeholder="无"
clearable
@change="changePlc"
>
<el-option
v-for="item in dataOpcPlcs"
:key="item.plc_id"
:label="item.plc_name"
:value="item.plc_id"
/>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">输送系统</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="电气调度号" label-width="150px">
<el-input v-model="form.OPCServer" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">指令相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="检验有货">
<el-switch v-model="form.inspect_in_stocck" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视取货校验" label-width="150px">
<el-switch v-model="form.ignore_pickup_check" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视放货校验" label-width="150px">
<el-switch v-model="form.ignore_release_check" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="呼叫">
<el-switch v-model="form.apply_task" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="响应" label-width="150px">
<el-switch v-model="form.manual_create_task" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="站点管理" label-width="150px">
<el-switch v-model="form.station_manager" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">AGV相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="取货">
<el-switch v-model="form.is_pickup" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="放货">
<el-switch v-model="form.is_release" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">交互相关</span>
</div>
<div class="crud-opts2" style="margin-bottom: 5px;">
<span class="crud-opts-right2">
<!--左侧插槽-->
<slot name="left" />
<el-button
slot="left"
class="filter-item"
type="primary"
icon="el-icon-plus"
size="mini"
@click="insertdtl()"
>
新增一行
</el-button>
</span>
</div>
<div class="app-container">
<el-table :data="modeform.tableData" border fit highlight-current-row style="width: 100%;" class="tb-edit">
<el-table-column label="mode" prop="模式" width="180">
<template scope="scope">
<el-input-number v-model="scope.row.mode" value="3" :min="3" size="mini" />
<span v-show="scope.row.edit">{{ scope.row.mode }}</span>
</template>
</el-table-column>
<el-table-column label="request" prop="请求方法" width="500">
<template scope="scope">
<el-select
v-model="scope.row.request"
filterable
clearable
placeholder="请选择"
style="width: 450px"
>
<el-option
v-for="item in requestMethodList"
:key="item.code"
:label="item.name"
:value="item.code"
/>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="170">
<template scope="scope">
<el-button
type="danger"
class="filter-item"
size="mini"
icon="el-icon-delete"
@click.native.prevent="deleteRow(scope.$index, modeform.tableData)"
/>
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC读取字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data1"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data1[scope.$index].db"
size="mini"
class="edit-input"
@input="finishReadEdit(data1[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbr_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_read1()">测试读</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data1[scope.$index].dbr_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC写入字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data2"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data2[scope.$index].db"
size="mini"
class="edit-input"
@input="finishWriteEdit(data2[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbr_value2">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_read2()">测试读</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data2[scope.$index].dbr_value" size="mini" class="edit-input" />
</template>
</el-table-column>
<el-table-column prop="dbw_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_write1()">测试写</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data2[scope.$index].dbw_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span" />
<el-button
:loading="false"
icon="el-icon-check"
size="mini"
style="float: right; padding: 6px 9px"
type="primary"
@click="doSubmit"
>保存
</el-button>
</div>
</el-card>
</div>
</template>
<script>
import {
queryDriverConfig,
updateConfig,
testRead,
testwrite
} from '@/api/acs/device/driverConfig'
import { selectOpcList } from '@/api/acs/device/opc'
import { selectPlcList } from '@/api/acs/device/opcPlc'
import { selectListByOpcID } from '@/api/acs/device/opcPlc'
import crud from '@/mixins/crud'
import deviceCrud from '@/api/acs/device/device'
export default {
name: 'NL4Station',
mixins: [crud],
props: {
parentForm: {
type: Object,
require: true
}
},
data() {
return {
device_code: '',
device_id: '',
plc_id: '',
plc_code: '',
opc_id: '',
opc_code: '',
configLoading: false,
dataOpcservers: [],
dataOpcPlcs: [],
deviceList: [],
data1: [],
data2: [],
requestMethodList: [],
modeform: {
tableData: []
},
form: {
inspect_in_stocck: true,
ignore_pickup_check: false,
ignore_release_check: false,
apply_task: true,
link_three_lamp: '',
manual_create_task: true,
is_pickup: true,
is_release: true,
link_device_code: []
},
rules: {}
}
},
created() {
this.$nextTick(() => {
//
this.device_id = this.$props.parentForm.device_id
this.device_code = this.$props.parentForm.device_code
queryDriverConfig(this.device_id, this.$props.parentForm.driver_code).then(data => {
//
if (data.form) {
const arr = Object.keys(data.form)
//
if (arr.length > 0) {
this.form = data.form
}
}
//
if (data.parentForm) {
const arr = Object.keys(data.parentForm)
//
if (arr.length > 0) {
this.opc_code = data.parentForm.opc_code
this.plc_code = data.parentForm.plc_code
}
}
//
if (data.modeform) {
const arr = Object.keys(data.modeform)
if (arr.length > 0) {
this.modeform.tableData = data.modeform
}
}
this.data1 = data.rs
this.data2 = data.ws
this.sliceItem()
})
selectPlcList().then(data => {
this.dataOpcPlcs = data
this.plc_id = this.$props.parentForm.opc_plc_id
})
selectOpcList().then(data => {
this.dataOpcservers = data
this.opc_id = this.$props.parentForm.opc_server_id
})
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
deviceCrud.selectRequestMethodList().then(data => {
this.requestMethodList = data
})
})
},
methods: {
insertdtl() {
this.modeform.tableData.push({ mode: '', request: '' })
},
deleteRow(index, rows) {
rows.splice(index, 1)
},
finishReadEdit(data) {
// code,mode
if (data.code.indexOf('mode') !== -1) {
debugger
const dbValue = data.db
// .
const beforeStr = dbValue.match(/(\S*)\./)[1]
// .
const afterStr = dbValue.match(/\.(\S*)/)[1]
//
const endNumber = afterStr.substring(1)
//
if (isNaN(parseInt(endNumber))) {
return
}
for (const val in this.data1) {
if (this.data1[val].code.indexOf('heartbeat') !== -1) {
this.data1[val].db = beforeStr + '.B0'
}
if (this.data1[val].code.indexOf('move') !== -1) {
this.data1[val].db = beforeStr + '.B2'
}
if (this.data1[val].code.indexOf('error') !== -1) {
this.data1[val].db = beforeStr + '.B3'
}
if (this.data1[val].code.indexOf('task') !== -1) {
this.data1[val].db = beforeStr + '.D4'
}
}
}
},
finishWriteEdit(data) {
// code,mode
if (data.code.indexOf('to_command') !== -1) {
const dbValue = data.db
// .
const beforeStr = dbValue.match(/(\S*)\./)[1]
// .
const afterStr = dbValue.match(/\.(\S*)/)[1]
//
const endNumber = afterStr.substring(1)
//
if (isNaN(parseInt(endNumber))) {
return
}
for (const val in this.data2) {
if (this.data2[val].code.indexOf('to_target') !== -1) {
this.data2[val].db = beforeStr + '.W2'
}
if (this.data2[val].code.indexOf('to_task') !== -1) {
this.data2[val].db = beforeStr + '.D4'
}
}
}
},
changeOpc(val) {
this.dataOpcservers.forEach(item => {
if (item.opc_id === val) {
this.opc_code = item.opc_code
}
})
selectListByOpcID(val).then(data => {
this.dataOpcPlcs = data
this.plc_id = ''
this.plc_code = ''
if (this.dataOpcPlcs && this.dataOpcPlcs.length > 0) {
this.plc_id = this.dataOpcPlcs[0].plc_id
this.plc_code = this.dataOpcPlcs[0].plc_code
}
this.sliceItem()
})
},
changePlc(val) {
this.dataOpcPlcs.forEach(item => {
if (item.plc_id === val) {
this.plc_code = item.plc_code
this.sliceItem()
return
}
})
},
test_read1() {
testRead(this.data1, this.opc_id).then(data => {
this.data1 = data
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
test_write1() {
testwrite(this.data2, this.opc_id).then(data => {
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
test_read2() {
testRead(this.data2, this.opc_id).then(data => {
this.data2 = data
console.log(this.data2)
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
doSubmit() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.configLoading = true
//
const parentForm = this.parentForm
parentForm.is_route = true
parentForm.plc_id = this.plc_id
parentForm.opc_id = this.opc_id
updateConfig(parentForm, this.form, this.modeform, this.data1, this.data2).then(res => {
this.notify('保存成功', 'success')
this.configLoading = false
}).catch(err => {
this.configLoading = false
console.log(err.response.data.message)
})
}
})
},
sliceItem() { // DBItem
this.data1.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
this.data2.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
}
}
}
</script>
<style scoped>
</style>

103
acs/nladmin-ui/src/views/acs/device/driver/xg/xg_agv.vue

@ -0,0 +1,103 @@
<template>
<!--agv单工位-->
<div>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">指令相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" size="small" label-width="95px">
<el-row>
<el-col :span="8">
<el-form-item label="ip地址" prop="ip_address">
<el-input
v-model="form.ip_address"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span" />
<el-button
:loading="false"
icon="el-icon-check"
size="mini"
style="float: right; padding: 6px 9px"
type="primary"
@click="doSubmit"
>保存
</el-button>
</div>
</el-card>
</div>
</template>
<script>
import {
queryDriverConfig,
updateConfig
} from '@/api/acs/device/driverConfig'
import crud from '@/mixins/crud'
export default {
name: 'StandardConveyorControl',
mixins: [crud],
props: {
parentForm: {
type: Object,
require: true
}
},
data() {
return {
form: {
ip_address: ''
}
}
},
created() {
this.$nextTick(() => {
//
this.device_id = this.$props.parentForm.device_id
this.device_code = this.$props.parentForm.device_code
queryDriverConfig(this.device_id, this.$props.parentForm.driver_code).then(data => {
//
if (data.form) {
const arr = Object.keys(data.form)
//
if (arr.length > 0) {
this.form = data.form
}
}
this.sliceItem()
})
})
},
methods: {
doSubmit() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.configLoading = true
//
const parentForm = this.parentForm
parentForm.is_route = true
updateConfig(parentForm, this.form, this.modeform, this.data1, this.data2).then(res => {
this.notify('保存成功', 'success')
this.configLoading = false
}).catch(err => {
this.configLoading = false
console.log(err.response.data.message)
})
}
})
}
}
}
</script>
<style scoped>
</style>

32
acs/nladmin-ui/src/views/monitor/interface/api/lucene.js

@ -0,0 +1,32 @@
import request from '@/utils/request'
export function getLogData(param) {
return request({
url: 'api/lucene/getAll',
method: 'get',
data: param
})
}
export function labelsValues() {
return request({
url: 'api/loki/labels/values',
method: 'get'
})
}
export function getDeviceLogType() {
return request({
url: 'api/lucene/getDeviceLogType',
method: 'get'
})
}
export function getLogTypes() {
return request({
url: 'api/lucene/getLogTypes',
method: 'get'
})
}
export default { getLogData, labelsValues, getDeviceLogType, getLogTypes }

162
acs/nladmin-ui/src/views/monitor/interface/index.vue

@ -0,0 +1,162 @@
<template>
<div class="app-container">
<div class="head-container">
<Search
:log-types="logTypes"
:device-list="deviceList"
:device-log-types="deviceLogTypes"
@performSearch="performSearch"
/>
<crudOperation />
</div>
<!--表格渲染-->
<el-table
ref="table"
v-loading="crud.loading"
:data="crud.data"
style="width: 100%;"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column
prop="request_url"
label="请求路径"
show-overflow-tooltip
/>
<el-table-column
prop="request_direction"
label="请求方向"
show-overflow-tooltip
/>
<el-table-column
prop="request_param"
label="请求参数"
show-overflow-tooltip
/>
<el-table-column
prop="response_param"
label="返回参数"
show-overflow-tooltip
/>
<el-table-column
prop="method"
label="执行方法"
show-overflow-tooltip
/>
<el-table-column
prop="executeTime"
label="执行时间"
show-overflow-tooltip
/>
<el-table-column prop="content" show-overflow-tooltip label="内容详情" />
<el-table-column prop="logTime" show-overflow-tooltip label="记录时间" />
</el-table>
<!--分页组件-->
<pagination />
</div>
</template>
<script>
import Search from './search'
import CRUD, { crud, header, presenter } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import { delAll } from '@/api/acs/lucene/log'
import crudDevice from '@/api/acs/device/device'
import crudLucene from './api/lucene'
export default {
name: 'LuceneLog',
components: { Search, pagination, crudOperation },
mixins: [presenter(), header(), crud()],
cruds: function() {
return CRUD({
title: '接口日志', url: 'api/lucene/getAll', idField: 'id', sort: 'id,desc',
queryOnPresenterCreated: true,
optShow: {
add: false,
edit: false,
del: false,
download: false
},
page: {
size: 40,
total: 0,
page: 0
},
query: {
createTime: [new Date(new Date().setTime(new Date().getTime() - 3600 * 1000)), new Date(new Date().setTime(new Date().getTime() + 3600 * 1000))],
logType: '接口日志'
}
})
},
data() {
return {
query: { blurry: '123' },
permission: {
add: ['admin', 'param:add'],
edit: ['admin', 'param:edit'],
del: ['admin', 'param:del']
},
deviceList: [],
deviceLogTypes: [],
logTypes: [],
rules: {},
logType: ''
}
},
created() {
this.getLogTypes()
this.getDeviceList()
this.getDeviceLogTypes()
},
methods: {
// false
[CRUD.HOOK.beforeRefresh]() {
return true
},
getLogTypes() {
crudLucene.getLogTypes().then(res => {
this.logTypes = res
})
},
getDeviceLogTypes() {
crudLucene.getDeviceLogType().then(res => {
this.deviceLogTypes = res
})
},
getDeviceList() {
crudDevice.selectDeviceList().then(res => {
this.deviceList = res
})
},
confirmDelAll() {
this.$confirm(`确认清空所有操作日志吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.crud.delAllLoading = true
delAll('device_execute').then(res => {
this.crud.delAllLoading = false
this.crud.dleChangePage(1)
this.crud.delSuccessNotify()
this.crud.toQuery()
}).catch(err => {
this.crud.delAllLoading = false
console.log(err.response.data.message)
})
}).catch(() => {
})
},
performSearch(value) {
console.log('Search with:' + value)
this.logType = value
this.crud.toQuery()
}
}
}
</script>
<style scoped>
</style>

134
acs/nladmin-ui/src/views/monitor/interface/search.vue

@ -0,0 +1,134 @@
<template>
<div v-if="crud.props.searchToggle">
<el-form :model="query" class="filter-form" inline>
<el-form-item label="请求方向:">
<el-select
v-model="query.request_direction"
filterable
clearable
size="small"
placeholder="请选择请求方向"
>
<el-option
v-for="direction in directionList"
:key="direction"
:label="direction"
:value="direction"
/>
</el-select>
</el-form-item>
<el-form-item label="请求路径:">
<el-input
v-model="query.request_url"
clearable
size="small"
placeholder="请输入请求路径"
style="width: 200px;"
/>
</el-form-item>
<el-form-item label="请求参数:">
<el-input
v-model="query.request_param"
clearable
size="small"
placeholder="请输入请求参数内容"
style="width: 200px;"
/>
</el-form-item>
<el-form-item label="内容详情:">
<el-input
v-model="query.blurry"
clearable
size="small"
placeholder="请输入你要搜索的内容详情"
style="width: 200px;"
/>
</el-form-item>
<el-form-item label="记录时间:">
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
</el-form-item>
<rrOperation />
</el-form>
</div>
</template>
<script>
import { header } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
export default {
components: { rrOperation },
mixins: [header()],
props: {
deviceList: Array,
deviceLogTypes: Array
},
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
value2: '',
directionList: [
'ACS->LMS',
'LMS->ACS',
'ACS->HR',
'HR->ACS',
'ACS->AGV',
'AGV->ACS'
]
}
},
watch: {
logTypes: {
immediate: true,
handler(newVal) {
}
}
},
created() {
},
methods: {
handleLogTypeChange(value) {
this.query.logType = value
this.$emit('performSearch', this.query.logType)
}
}
}
</script>

64
acs/nladmin-ui/src/views/monitor/interface/time.vue

@ -0,0 +1,64 @@
<template>
<div v-if="crud.props.searchToggle">
<!--
<date-range-picker v-model="query.createTime" class="date-item" />
-->
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
<rrOperation />
</div>
</template>
<script>
import { header } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
export default {
components: { rrOperation },
mixins: [header()],
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
value2: ''
}
},
created() {
}
}
</script>

16
acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js

@ -15,4 +15,18 @@ export function labelsValues() {
})
}
export default { getLogData, labelsValues }
export function getDeviceLogType() {
return request({
url: 'api/lucene/getDeviceLogType',
method: 'get'
})
}
export function getLogTypes() {
return request({
url: 'api/lucene/getLogTypes',
method: 'get'
})
}
export default { getLogData, labelsValues, getDeviceLogType, getLogTypes }

63
acs/nladmin-ui/src/views/monitor/lucene/index.vue

@ -1,7 +1,12 @@
<template>
<div class="app-container">
<div class="head-container">
<Search />
<Search
:log-types="logTypes"
:device-list="deviceList"
:device-log-types="deviceLogTypes"
@performSearch="performSearch"
/>
<crudOperation />
</div>
<!--表格渲染-->
@ -14,16 +19,15 @@
>
<!-- <el-table-column type="selection" width="55"/>-->
<!-- <el-table-column v-if="false" prop="id" label="id"/>-->
<el-table-column prop="operate" width="50" label="操作" />
<el-table-column prop="device_code" label="设备号" min-width="130" show-overflow-tooltip />
<el-table-column prop="task_code" label="任务编号" />
<el-table-column prop="instruct_code" label="指令编号" />
<el-table-column prop="method" label="方法" />
<el-table-column prop="status_code" label="状态码" />
<el-table-column prop="requestparam" label="请求参数" />
<el-table-column prop="responseparam" label="返回参数" />
<el-table-column prop="logTime" width="170" label="记录时间" />
<el-table-column prop="content" width="500" label="内容详情" />
<el-table-column v-if="logType !== '接口日志'" prop="device_code" label="设备号" :min-width="flexWidth('device_code',crud.data,'设备号')" />
<!-- <el-table-column prop="trace_id" label="链路追踪" /> -->
<!-- <el-table-column v-if="logType === '接口日志'" prop="task_code" label="任务编号"-->
<!-- :min-width="flexWidth('task_code',crud.data,'任务编号')"/>-->
<!-- <el-table-column v-if="logType === '接口日志'" prop="instruct_code" label="指令编号"-->
<!-- :min-width="flexWidth('instruct_code',crud.data,'指令编号')"/>-->
<el-table-column prop="content" show-overflow-tooltip label="内容详情" />
<el-table-column prop="logTime" show-overflow-tooltip label="记录时间" />
<!-- <el-table-column prop="operate" show-overflow-tooltip label="操作" :min-width="flexWidth('operate',crud.data,'操作')" />-->
</el-table>
<!--分页组件-->
@ -37,6 +41,8 @@ import CRUD, { crud, header, presenter } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import { delAll } from '@/api/acs/lucene/log'
import crudDevice from '@/api/acs/device/device'
import crudLucene from './api/lucene'
export default {
name: 'LuceneLog',
@ -44,7 +50,7 @@ export default {
mixins: [presenter(), header(), crud()],
cruds: function() {
return CRUD({
title: '系统参数', url: 'api/lucene/getAll', idField: 'id', sort: 'id,desc',
title: '设备日志', url: 'api/lucene/getAll', idField: 'id', sort: 'id,desc',
queryOnPresenterCreated: true,
optShow: {
add: false,
@ -58,7 +64,8 @@ export default {
page: 0
},
query: {
createTime: [new Date(new Date().setTime(new Date().getTime() - 3600 * 1000)), new Date(new Date().setTime(new Date().getTime() + 3600 * 1000))]
createTime: [new Date(new Date().setTime(new Date().getTime() - 3600 * 1000)), new Date(new Date().setTime(new Date().getTime() + 3600 * 1000))],
logType: '设备日志'
}
})
},
@ -70,17 +77,38 @@ export default {
edit: ['admin', 'param:edit'],
del: ['admin', 'param:del']
},
rules: {}
deviceList: [],
deviceLogTypes: [],
logTypes: [],
rules: {},
logType: ''
}
},
created() {
this.getLogTypes()
this.getDeviceList()
this.getDeviceLogTypes()
},
methods: {
// false
[CRUD.HOOK.beforeRefresh]() {
return true
},
getLogTypes() {
crudLucene.getLogTypes().then(res => {
this.logTypes = res
})
},
getDeviceLogTypes() {
crudLucene.getDeviceLogType().then(res => {
this.deviceLogTypes = res
})
},
getDeviceList() {
crudDevice.selectDeviceList().then(res => {
this.deviceList = res
})
},
confirmDelAll() {
this.$confirm(`确认清空所有操作日志吗?`, '提示', {
confirmButtonText: '确定',
@ -99,6 +127,11 @@ export default {
})
}).catch(() => {
})
},
performSearch(value) {
console.log('Search with:' + value)
this.logType = value
this.crud.toQuery()
}
}
}

173
acs/nladmin-ui/src/views/monitor/lucene/search.vue

@ -1,113 +1,86 @@
<template>
<div v-if="crud.props.searchToggle">
<!-- <el-input
v-model="query.device_code"
clearable
size="small"
placeholder="请输入你要搜索的设备号"
style="width: 200px;"
class="filter-item"
/> -->
<!-- <el-select
<el-form :model="query" class="filter-form" inline>
<el-form-item label="选择设备:">
<el-select
v-model="query.device_code"
filterable
clearable
size="small"
placeholder="请选择设备号"
>
<el-option
v-for="device in deviceList"
:key="device.device_code"
:label="device.device_code"
:value="device.device_code"
/>
</el-select>
</el-form-item>
<el-form-item
label="设备日志类型:"
>
<el-select
v-model="query.deviceLogType"
filterable
clearable
size="small"
placeholder="请输入你要搜索的设备号"
class="filter-item"
style="width: 190px"
@change="crud.toQuery"
placeholder="设备日志类型"
>
<el-option v-for="item in device_codes" :key="item.id" :label="item.label" :value="item.value" />
</el-select> -->
<el-select
ref="test"
v-model="query.device_code"
filterable
clearable
reserve-keyword
placeholder="设备号"
style="width: 190px;"
@change="crud.toQuery"
>
<el-option
v-for="item in deviceList"
:key="item.device_code"
:label="item.device_code"
:value="item.device_code"
/>
</el-select>
<el-option
v-for="deviceLogType in deviceLogTypes"
:key="deviceLogType.code"
:label="deviceLogType.name"
:value="deviceLogType.code"
/>
</el-select>
</el-form-item>
<el-form-item label="内容详情:">
<el-input
v-model="query.blurry"
clearable
size="small"
placeholder="请输入你要搜索的内容详情"
style="width: 200px;"
/>
</el-form-item>
<el-input
v-model="query.method"
clearable
size="small"
placeholder="请输入你要搜索的方法名"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.status_code"
clearable
size="small"
placeholder="请输入你要搜索的状态码"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.requestparam"
clearable
size="small"
placeholder="请输入你要搜索的请求参数"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.responseparam"
clearable
size="small"
placeholder="请输入你要搜索的返回参数"
style="width: 200px;"
class="filter-item"
/>
<el-input
v-model="query.blurry"
clearable
size="small"
placeholder="请输入你要搜索的内容详情"
style="width: 200px;"
class="filter-item"
/>
<!--
<date-range-picker v-model="query.createTime" class="date-item" />
-->
<el-form-item label="记录时间:">
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
</el-form-item>
<rrOperation />
</el-form>
<el-date-picker
v-model="query.createTime"
type="datetimerange"
:picker-options="pickerOptions"
format="yyyy-MM-dd HH:mm:ss"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
/>
<rrOperation />
</div>
</template>
<script>
import { header } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import deviceCrud from '@/api/acs/device/device'
export default {
components: { rrOperation },
mixins: [header()],
props: {
deviceList: Array,
deviceLogTypes: Array,
logTypes: Array
},
data() {
return {
querySearch: {
logType: null
},
pickerOptions: {
shortcuts: [{
text: '最近一周',
@ -136,15 +109,25 @@ export default {
}]
},
value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
value2: '',
deviceList: [],
device_code: ''
value2: ''
}
},
watch: {
logTypes: {
immediate: true,
handler(newVal) {
if (newVal.length > 0 && !this.query.logType) {
}
}
}
},
created() {
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
},
methods: {
handleLogTypeChange(value) {
this.query.logType = value
this.$emit('performSearch', this.query.logType)
}
}
}
</script>

Loading…
Cancel
Save