本地生成、下发、更新、完成任务的基本调度方法
This commit is contained in:
@@ -1,16 +1,28 @@
|
||||
package com.ruoyi.schedule.scheduleTask;
|
||||
|
||||
import cn.hutool.Hutool;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.ruoyi.common.Constant;
|
||||
import com.ruoyi.common.TaskStatusCode;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.uuid.UUID;
|
||||
import com.ruoyi.device.agv.domain.ResponseBase;
|
||||
import com.ruoyi.device.agv.domain.genAgvSchedulingTask.GenAgvSchedulingTaskRequest;
|
||||
import com.ruoyi.device.agv.domain.genAgvSchedulingTask.GenAgvSchedulingTaskResponse;
|
||||
import com.ruoyi.device.agv.domain.genAgvSchedulingTask.PositionCodeData;
|
||||
import com.ruoyi.device.agv.domain.queryTaskStatus.TaskStatusData;
|
||||
import com.ruoyi.schedule.job.mydojob.domain.MydoJob;
|
||||
import com.ruoyi.schedule.task.domain.WcsTask;
|
||||
import com.ruoyi.schedule.task.mapper.WcsTaskMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -20,6 +32,8 @@ import java.util.List;
|
||||
@Slf4j
|
||||
public class Execution {
|
||||
|
||||
@Autowired
|
||||
WcsTaskMapper wcsTaskMapper;
|
||||
|
||||
/**
|
||||
* 查询是否有wcs任务
|
||||
@@ -37,6 +51,57 @@ public class Execution {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有wcs任务
|
||||
*/
|
||||
public void getAllTask(){
|
||||
|
||||
//查询实时任务表获取所有【待执行】任务
|
||||
LambdaQueryWrapper<WcsTask> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_READY);
|
||||
List<WcsTask> tasks = wcsTaskMapper.selectList(queryWrapper);
|
||||
|
||||
//无【待执行】任务
|
||||
if (tasks.size() == 0) return;
|
||||
|
||||
for (int i = 0; i < tasks.size(); i++) {
|
||||
|
||||
//请求agv/ctu下发指令
|
||||
GenAgvSchedulingTaskRequest request = new GenAgvSchedulingTaskRequest();
|
||||
request.setReqCode(UUID.randomUUID().toString().replace("-", ""));
|
||||
|
||||
//入库类型
|
||||
switch (tasks.get(i).getTaskType()) {
|
||||
case "1":
|
||||
request.setTaskTyp("F12");
|
||||
break;
|
||||
case "2":
|
||||
request.setTaskTyp("F11");
|
||||
break;
|
||||
default:
|
||||
log.warn("【向设备下发任务请求】TaskTyp:{},生成任务的请求参数错误,异常的任务类型!", request.getTaskTyp());
|
||||
return;
|
||||
}
|
||||
|
||||
//添加路径(未测试)
|
||||
List<PositionCodeData> path = new ArrayList<>();
|
||||
path.add(new PositionCodeData(tasks.get(i).getSourceLocation(),"05"));
|
||||
path.add(new PositionCodeData(tasks.get(i).getTargetLocation(),"05"));
|
||||
request.setPositionCodePath(path);
|
||||
|
||||
//wcs任务号---设备任务编号
|
||||
request.setTaskCode(tasks.get(i).getTaskId());
|
||||
|
||||
//下发成功---更新【任务状态】为下发成功
|
||||
if (sendCommand(request)){
|
||||
tasks.get(i).setTaskStatus(TaskStatusCode.TASK_SEND_SUCCESS);
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(i));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 向AGV/CTU请求下发指令
|
||||
@@ -68,14 +133,18 @@ public class Execution {
|
||||
return false;
|
||||
}
|
||||
|
||||
//返回码
|
||||
if (genAgvSchedulingTaskResponse.getCode() == 0 ) {
|
||||
return true;
|
||||
}else {
|
||||
log.error("【下发设备任务】下发任务失败," + genAgvSchedulingTaskResponse.getMessage() + "!");
|
||||
//返回码错误
|
||||
if (genAgvSchedulingTaskResponse.getCode() != 0 ) {
|
||||
if (genAgvSchedulingTaskResponse.getMessage() == ""){
|
||||
log.error("【下发设备任务】下发任务失败,发生了未知错误");
|
||||
}else{
|
||||
log.error("【下发设备任务】下发任务失败,{}", genAgvSchedulingTaskResponse.getMessage());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,8 +174,6 @@ public class Execution {
|
||||
return false;
|
||||
}
|
||||
|
||||
//4.请求编号一致时避免重复下发
|
||||
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.ruoyi.schedule.scheduleTask;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.ruoyi.common.TaskStatusCode;
|
||||
import com.ruoyi.schedule.task.domain.WcsTask;
|
||||
import com.ruoyi.schedule.task.mapper.WcsTaskMapper;
|
||||
import com.ruoyi.schedule.taskHistory.domain.WcsTaskHistory;
|
||||
import com.ruoyi.schedule.taskHistory.mapper.WcsTaskHistoryMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class Finish {
|
||||
|
||||
@Autowired
|
||||
WcsTaskMapper wcsTaskMapper;
|
||||
|
||||
@Autowired
|
||||
WcsTaskHistoryMapper wcsTaskHistoryMapper;
|
||||
|
||||
public void taskFinish() {
|
||||
|
||||
//查询实时任务表获取所有【已结束】,【已取消】和手动处理的任务任务
|
||||
LambdaQueryWrapper<WcsTask> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_FINISH)
|
||||
.or()
|
||||
.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_CANCEL)
|
||||
.or()
|
||||
.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_FINISH_MANUAL)
|
||||
.or()
|
||||
.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_CANCEL_MANUAL);;
|
||||
List<WcsTask> tasks = wcsTaskMapper.selectList(queryWrapper);
|
||||
|
||||
for (int i = 0; i < tasks.size(); i++) {
|
||||
|
||||
//todo 任务完成/取消请求wms
|
||||
|
||||
|
||||
|
||||
WcsTaskHistory wcsTaskHistory = new WcsTaskHistory();
|
||||
BeanUtils.copyProperties(tasks.get(i), wcsTaskHistory);
|
||||
wcsTaskHistory.setFinishTime(LocalDateTime.now());
|
||||
|
||||
//向历史记录添加任务数据
|
||||
wcsTaskHistoryMapper.insertWcsTaskHistory(wcsTaskHistory);
|
||||
log.info("【添加到历任务记录】{}", JSON.toJSONString(wcsTaskHistory));
|
||||
|
||||
//移除实时任务表数据
|
||||
wcsTaskMapper.deleteWcsTaskByTaskId(tasks.get(i).getTaskId());
|
||||
log.info("【实时任务已完成】{}", JSON.toJSONString(tasks.get(i)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.ruoyi.schedule.scheduleTask;
|
||||
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.ruoyi.common.Constant;
|
||||
import com.ruoyi.common.TaskStatusCode;
|
||||
import com.ruoyi.device.agv.domain.queryTaskStatus.TaskStatusData;
|
||||
import com.ruoyi.schedule.task.domain.WcsTask;
|
||||
import com.ruoyi.schedule.task.mapper.WcsTaskMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 通过【查询任务状态】接口获取当前任务的任务状态(待执行/执行中/结束...)
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StatusUpdate {
|
||||
|
||||
@Autowired
|
||||
WcsTaskMapper wcsTaskMapper;
|
||||
|
||||
public void statusUpdate() {
|
||||
|
||||
//查询实时任务表获取所有【下发成功】任务
|
||||
LambdaQueryWrapper<WcsTask> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(WcsTask::getTaskStatus, TaskStatusCode.TASK_SEND_SUCCESS);
|
||||
List<WcsTask> tasks = wcsTaskMapper.selectList(queryWrapper);
|
||||
|
||||
//wcs本地任务轮询
|
||||
for (int i = 0; i < tasks.size(); i++) {
|
||||
//查询【设备任务状态】接口是否有该任务号已
|
||||
HttpResponse response = HttpRequest.post(Constant.BASEURL + "/queryTaskStatus").execute();
|
||||
List<TaskStatusData> deviceTasks = JSON.parseArray(response.body(), TaskStatusData.class);
|
||||
|
||||
//接口查询的AGV/CTU设备任务轮询
|
||||
for (int j = 0; j < deviceTasks.size(); j++) {
|
||||
|
||||
//wcs任务记录的任务号与接口查询的任务号匹配
|
||||
if (tasks.get(i).getTaskId() != deviceTasks.get(j).getTaskCode()) continue;
|
||||
|
||||
switch (deviceTasks.get(j).getTaskStatus()) {
|
||||
case "1":
|
||||
//【任务状态】更新为已创建
|
||||
if (tasks.get(j).getTaskStatus() == TaskStatusCode.TASK_SEND_SUCCESS && tasks.get(j).getTaskStatus() != TaskStatusCode.TASK_CREATED) {
|
||||
tasks.get(j).setTaskStatus(TaskStatusCode.TASK_CREATED);
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(i));
|
||||
}
|
||||
break;
|
||||
case "2"://【任务状态】更新为执行中
|
||||
if (tasks.get(j).getTaskStatus() == TaskStatusCode.TASK_CREATED && tasks.get(j).getTaskStatus() != TaskStatusCode.TASK_RUNNING) {
|
||||
tasks.get(j).setTaskStatus(TaskStatusCode.TASK_RUNNING);
|
||||
//更新【调度时间】
|
||||
tasks.get(j).setScheduleTime(LocalDateTime.now());
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(i));
|
||||
}
|
||||
break;
|
||||
case "5"://【任务状态】更新为已取消
|
||||
if ((tasks.get(j).getTaskStatus() == TaskStatusCode.TASK_CREATED ||
|
||||
tasks.get(j).getTaskStatus() == TaskStatusCode.TASK_RUNNING) &&
|
||||
tasks.get(j).getTaskStatus() != TaskStatusCode.TASK_CANCEL) {
|
||||
tasks.get(j).setTaskStatus(TaskStatusCode.TASK_CANCEL);
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(i));
|
||||
}
|
||||
break;
|
||||
case "9"://【任务状态】更新为已结束
|
||||
if (tasks.get(j).getTaskStatus() != TaskStatusCode.TASK_FINISH) {
|
||||
tasks.get(j).setTaskStatus(TaskStatusCode.TASK_FINISH);
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(j));
|
||||
}
|
||||
break;
|
||||
case "10"://【任务状态】更新为被中断
|
||||
if (tasks.get(j).getTaskStatus() != TaskStatusCode.TASK_FINISH) {
|
||||
tasks.get(j).setTaskStatus(TaskStatusCode.TASK_INTERUPTED);
|
||||
wcsTaskMapper.updateWcsTask(tasks.get(j));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.ruoyi.schedule.scheduleTask;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
|
||||
/**
|
||||
* 用于处理没有正常执行或完成/取消的任务
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class TaskHandler {
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user