Browse Source

opt: 1.新增反馈WCS任务状态重发机制。2.取货完成后NDC进行取消任务 将反馈WMS任务完成。3.修复新增任务状态 导致的其它问题。4.解决hutool 导出excel数据报错apache.poi版本过低不兼容问题 引入4.0.0

1
丁世豪 4 months ago
parent
commit
80e7cf6660
  1. 17
      nlsso-server/pom.xml
  2. 12
      nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
  3. 6
      nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java
  4. 63
      nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
  5. 55
      nlsso-server/src/main/java/org/nl/quartz/task/ResendRequestWCS.java
  6. 32
      nlsso-server/src/main/resources/log/ResendRequestWCS.xml
  7. 1
      nlsso-server/src/main/resources/logback-spring.xml

17
nlsso-server/pom.xml

@ -115,6 +115,23 @@
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- 解决hutool 导出excel数据报错apache.poi版本过低不兼容问题 引入4.0.0 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.0</version>
</dependency>
<!--Spring boot 核心 -->
<dependency>

12
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<InstructionMapper,
DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class);
DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class);
//判断agv执行状态是否已经完成取货,取货完成后NDC进行取消任务 将反馈WMS任务完成
if (StrUtil.isBlank(entity.getCarno())){
Device device = appService.findDeviceByCode(entity.getCarno());
if (device !=null && device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver){
AgvNdcOneDeviceDriver agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver();
if (agvNdcOneDeviceDriver.getAgv_status()>=5){
taskService.ndcCancelSendWmsFinish(entity.getTask_id());
}
}
}
// 如果是无光电的设备 指令完成变更起点、终点状态
JSONObject jo = new JSONObject();
jo.put("device_code", entity.getStart_device_code());

6
nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java

@ -218,6 +218,12 @@ public interface TaskService extends CommonService<Task> {
*/
void finish(String ids);
/**
* 取货完成后NDC进行取消任务 将反馈WMS任务完成
* @param ids
*/
void ndcCancelSendWmsFinish(String ids);
/**
* 取消任务
*

63
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<TaskMapper, Task> 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<Task> 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<TaskMapper, Task> impleme
private void sendTaskStatus(FeedBackTaskStatusRequest request) {
CompletableFuture<String> 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<TaskMapper, Task> 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<TaskMapper, Task> 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);

55
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<Object, Object> 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"));
}
});
}
}
}

32
nlsso-server/src/main/resources/log/ResendRequestWCS.xml

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<included>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<!-- 按照每天生成日志文件 -->
<appender name="ResendRequestWCS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ACS请求WMS重发/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>100MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ResendRequestWCS" />
<!-- 设置队列大小,根据您的需求调整 -->
<queueSize>512</queueSize>
</appender>
<logger name="org.nl.quartz.task.ResendRequestWCS" level="info" additivity="true">
<appender-ref ref="asyncFileAppender"/>
</logger>
</included>

1
nlsso-server/src/main/resources/logback-spring.xml

@ -27,6 +27,7 @@ https://juejin.cn/post/6844903775631572999
<include resource="log/NDCSocketConnectionAutoRun.xml"/>
<include resource="log/AgvNdcOneDeviceDriver.xml"/>
<include resource="log/NDCAgvServiceImpl.xml"/>
<include resource="log/ResendRequestWCS.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 控制台高亮-->

Loading…
Cancel
Save