opt: 1.新增反馈WCS任务状态重发机制。2.取货完成后NDC进行取消任务 将反馈WMS任务完成。3.修复新增任务状态 导致的其它问题。4.解决hutool 导出excel数据报错apache.poi版本过低不兼容问题 引入4.0.0
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -218,6 +218,12 @@ public interface TaskService extends CommonService<Task> {
|
||||
*/
|
||||
void finish(String ids);
|
||||
|
||||
/**
|
||||
* 取货完成后NDC进行取消任务 将反馈WMS任务完成
|
||||
* @param ids
|
||||
*/
|
||||
void ndcCancelSendWmsFinish(String ids);
|
||||
|
||||
/**
|
||||
* 取消任务
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
Normal file
32
nlsso-server/src/main/resources/log/ResendRequestWCS.xml
Normal file
@@ -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>
|
||||
@@ -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">
|
||||
<!-- 控制台高亮-->
|
||||
|
||||
Reference in New Issue
Block a user