diff --git a/nlsso-server/pom.xml b/nlsso-server/pom.xml
index 0c7374e..0bb50eb 100644
--- a/nlsso-server/pom.xml
+++ b/nlsso-server/pom.xml
@@ -115,6 +115,23 @@
hutool-all
${hutool.version}
+
+
+
+ org.apache.poi
+ poi
+ 4.0.0
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.0.0
+
+
+ org.apache.poi
+ poi-ooxml-schemas
+ 4.0.0
+
diff --git a/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
index 613af1a..2d09a59 100644
--- a/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
+++ b/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
@@ -29,6 +29,7 @@ import org.nl.acs.device.domain.Device;
import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device.service.impl.DeviceServiceImpl;
import org.nl.acs.device_driver.DeviceDriver;
+import org.nl.acs.device_driver.basedriver.agv.ndcone.AgvNdcOneDeviceDriver;
import org.nl.acs.device_driver.basedriver.hongxiang_device.HongXiangConveyorDeviceDriver;
import org.nl.acs.device_driver.basedriver.siemens_conveyor.SiemensConveyorDeviceDriver;
import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver;
@@ -1382,6 +1383,17 @@ public class InstructionServiceImpl extends CommonServiceImpl=5){
+ taskService.ndcCancelSendWmsFinish(entity.getTask_id());
+ }
+ }
+ }
+
// 如果是无光电的设备 指令完成变更起点、终点状态
JSONObject jo = new JSONObject();
jo.put("device_code", entity.getStart_device_code());
diff --git a/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java b/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java
index 1b51545..e030157 100644
--- a/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java
+++ b/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java
@@ -218,6 +218,12 @@ public interface TaskService extends CommonService {
*/
void finish(String ids);
+ /**
+ * 取货完成后NDC进行取消任务 将反馈WMS任务完成
+ * @param ids
+ */
+ void ndcCancelSendWmsFinish(String ids);
+
/**
* 取消任务
*
diff --git a/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
index f357ef2..fb47afb 100644
--- a/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
+++ b/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
@@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.AcsConfig;
import org.nl.acs.agv.server.XianGongAgvService;
@@ -50,6 +51,7 @@ import org.nl.acs.utils.PageUtil;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.FileUtil;
+import org.nl.common.utils.RedisUtils;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.config.thread.ThreadPoolExecutorUtil;
@@ -312,7 +314,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme
}
}
if (StrUtil.isEmpty(is_over) && StrUtil.isEmpty(status)) {
- wrapper.lt(Task::getTask_status, 2);
+ wrapper.lt(Task::getTask_status, 2).or().eq(Task::getTask_status,4);
}
IPage taskPage = taskMapper.selectPage(queryPage, wrapper);
final JSONObject json = (JSONObject) JSON.toJSON(ConvertUtil.convertPage(taskPage, TaskDto.class));
@@ -885,17 +887,33 @@ public class TaskServiceImpl extends CommonServiceImpl impleme
private void sendTaskStatus(FeedBackTaskStatusRequest request) {
CompletableFuture future = new CompletableFuture<>();
+ RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
EXECUTOR.submit(() -> {
+
try {
- for (int i = 0; i < 10; i++) {
- log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + request.getTask_status());
- String resp = acstowmsService.feedTaskStatus(request);
- JSONObject result = JSONObject.parseObject(resp);
- if ("200".equals("200")) {
- log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + "成功。");
- break;
- } else {
- log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + "失败,服务器响应的失败原因为:" + result.getString("message"));
+ //判断redis里面是否有存储,存在该任务号信息 更新要发送的任务状态。不直接发送 避免网络恢复后同时请求多次。
+ if(redisUtils.hHasKey("ResendRequestWCS",request.getTask_code())){
+ redisUtils.hset("ResendRequestWCS",request.getTask_code(),request);
+ }else {
+ //反馈WCS任务状态,如果网络异常连续发送10次
+ for (int i =0;i<10; i++){
+ log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + request.getTask_status());
+ String resp = acstowmsService.feedTaskStatus(request);
+ JSONObject result = JSONObject.parseObject(resp);
+ if (StringUtil.isNotBlank(result.getString("status")) && "200".equals(result.getString("status"))) {
+ log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + "成功。");
+ break;
+ } else if (StringUtil.isNotBlank(result.getString("status")) && !"200".equals(result.getString("status"))){
+ log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + "失败,服务器响应的失败原因为:" + result.getString("message"));
+ break;
+ }else if (StringUtil.isNotBlank(result.getString("code")) && "500".equals(result.getString("code"))){
+ log.info("任务号" + request.getTask_code() + "请求不通" + "失败,服务器响应的失败原因为:" + result.getString("message"));
+ //10次还没成功则加入定时任务来执行,直到WCS收到任务反馈。
+ if (i == 9){
+ //如果redis也出现断联的话可以考虑存储到内存
+ redisUtils.hset("ResendRequestWCS",request.getTask_code(),request);
+ }
+ }
}
}
future.complete("反馈wcs任务完成状态");
@@ -957,6 +975,29 @@ public class TaskServiceImpl extends CommonServiceImpl impleme
}
}
+ @Override
+ public void ndcCancelSendWmsFinish(String id) {
+ TaskDto entity = this.findById(id);
+ if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!");
+ String currentUsername = SecurityUtils.getCurrentUsername();
+ String now = DateUtil.now();
+ entity.setUpdate_time(now);
+ entity.setUpdate_by(currentUsername);
+ entity.setTask_status("2");
+ // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS
+ String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue();
+ if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) {
+ FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
+ request.setTask_id(entity.getExt_task_id());
+ request.setTask_code(entity.getTask_code());
+ request.setTask_status(entity.getTask_status());
+ request.setRequest_medthod_code(RequestMethodEnum.feedback_task_status.getCode());
+ request.setRequest_medthod_name(RequestMethodEnum.feedback_task_status.getName());
+ //反馈任务状态
+ sendTaskStatus(request);
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public void cancel(String id) throws Exception {
@@ -1187,7 +1228,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme
throw new BadRequestException("被删除或无权限,操作失败!");
}
//只有执行中的任务才能创建指令
- if (!"1".equals(acsTask.getTask_status())) {
+ if (!"1".equals(acsTask.getTask_status()) && !"4".equals(acsTask.getTask_status())) {
throw new BadRequestException("任务未执行,不能创建指令!");
}
DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class);
diff --git a/nlsso-server/src/main/java/org/nl/quartz/task/ResendRequestWCS.java b/nlsso-server/src/main/java/org/nl/quartz/task/ResendRequestWCS.java
new file mode 100644
index 0000000..f5bd04f
--- /dev/null
+++ b/nlsso-server/src/main/java/org/nl/quartz/task/ResendRequestWCS.java
@@ -0,0 +1,55 @@
+package org.nl.quartz.task;
+
+import com.alibaba.fastjson.JSONObject;
+import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.nl.acs.ext.wms.data.feedBackTaskStatus.FeedBackTaskStatusRequest;
+import org.nl.acs.ext.wms.service.AcsToWmsService;
+import org.nl.common.utils.RedisUtils;
+import org.nl.config.SpringContextHolder;
+import org.nl.config.thread.ThreadPoolExecutorUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * @author liejiu
+ */
+@Slf4j
+@Component
+public class ResendRequestWCS {
+
+ @Resource
+ private RedisUtils redisUtils;
+
+ @Resource
+ AcsToWmsService acstowmsService;
+
+
+ public void run() throws Exception {
+ if (redisUtils.hasKey("ResendRequestWCS")) {
+ Map