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 resendRequestWCS = redisUtils.hmget("ResendRequestWCS"); + resendRequestWCS.forEach((k, v) -> { + + FeedBackTaskStatusRequest request = (FeedBackTaskStatusRequest) v; + 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任务完成状态" + "成功。"); + redisUtils.hdel("ResendRequestWCS", request.getTask_code()); + } else if (StringUtil.isNotBlank(result.getString("status")) && !"200".equals(result.getString("status"))) { + log.info("任务号" + request.getTask_code() + "开始反馈wcs任务完成状态" + "失败,服务器响应的失败原因为:" + result.getString("message")); + redisUtils.hdel("ResendRequestWCS", request.getTask_code()); + } else if (StringUtil.isNotBlank(result.getString("code")) && "500".equals(result.getString("code"))) { + log.info("任务号" + request.getTask_code() + "请求不通" + "失败,服务器响应的失败原因为:" + result.getString("message")); + } + + }); + } + + } +} diff --git a/nlsso-server/src/main/resources/log/ResendRequestWCS.xml b/nlsso-server/src/main/resources/log/ResendRequestWCS.xml new file mode 100644 index 0000000..1916f06 --- /dev/null +++ b/nlsso-server/src/main/resources/log/ResendRequestWCS.xml @@ -0,0 +1,32 @@ + + + + + + + + + ${LOG_HOME}/ACS请求WMS重发/%d{yyyy-MM-dd}.%i.log + + 15 + + 100MB + + 2GB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + ${log.charset} + + + + + + + 512 + + + + + diff --git a/nlsso-server/src/main/resources/logback-spring.xml b/nlsso-server/src/main/resources/logback-spring.xml index a9b8bd7..966aa77 100644 --- a/nlsso-server/src/main/resources/logback-spring.xml +++ b/nlsso-server/src/main/resources/logback-spring.xml @@ -27,6 +27,7 @@ https://juejin.cn/post/6844903775631572999 +