代码更新

This commit is contained in:
ludj
2023-05-18 16:26:36 +08:00
parent d249c7db0b
commit 69d16d78ed
10 changed files with 529 additions and 167 deletions

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import org.nl.common.domain.query.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import java.util.List;
import java.util.Map;
@@ -66,6 +67,9 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
*/
List<SchBaseTask> findUnFinishTasksByTaskConfig(String config_code, String task_code);
List<SchBaseTask> findTasksByTaskStatus(String config_code, TaskStatus status);
/**
* 任务申请
*

View File

@@ -17,7 +17,7 @@ import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskconfigMapper;
import org.nl.wms.sch.task_manage.BaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.task.TaskFactory;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.springframework.beans.factory.annotation.Autowired;
@@ -104,6 +104,18 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
return schBaseTasks;
}
@Override
public List<SchBaseTask> findTasksByTaskStatus(String config_code, TaskStatus status) {
Assert.notNull(config_code, "任务配置编码不能为空!");
LambdaQueryWrapper<SchBaseTask> lam = new LambdaQueryWrapper<>();
lam.eq(SchBaseTask::getConfig_code, config_code)
.eq(SchBaseTask::getTask_status, status.getCode())
.ne(SchBaseTask::getIs_delete, true);
List<SchBaseTask> schBaseTasks = schBaseTaskMapper.selectList(lam);
return schBaseTasks;
}
@Override
public void create(SchBaseTask entity) {
String currentUserId = SecurityUtils.getCurrentUserId();
@@ -134,7 +146,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
//3、叫料
//4、叫空载具
TaskFactory taskFactory = new TaskFactory();
BaseTask task = taskFactory.getTask("HNMLTask");
AbstractTask task = taskFactory.getTask("HNMLTask");
task.apply(param);
}

View File

@@ -0,0 +1,182 @@
package org.nl.wms.sch.task_manage;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.nl.config.SpringContextHolder;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task.service.impl.SchBaseTaskServiceImpl;
import org.nl.wms.sch.task.service.impl.SchBaseTaskconfigServiceImpl;
import org.nl.wms.sch.task_manage.task.AcsUtil;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
/**
* @author ldjun
* @version 1.0
* @date 2023年05月16日 16:42
* @desc desc
*/
public abstract class AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
/**
* 创建
*/
protected abstract void create();
/**
* 下发
*/
protected abstract void issue();
/**
* 添加任务进行下发
*
* @return
*/
public List addTask() {
/* //任务基础表【sch_base_task】
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
JSONArray tasks = taskTab.query("handle_class = '" + this.getClass().getName() + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
List<AcsTaskDto> arr = new ArrayList<>();
for (int i = 0, j = tasks.size(); i < j; i++) {
JSONObject json = tasks.getJSONObject(i);
AcsTaskDto taskDto = new AcsTaskDto();
taskDto.setExt_task_uuid(json.getString("task_id"));
taskDto.setTask_code(json.getString("task_code"));
taskDto.setTask_type("1");
//如果起点是码垛机械手的下料位置,终点是货架type要给2
JSONObject stratrObj = WQLObject.getWQLObject("sch_base_point").query("point_code='" + json.getString("start_point_code") + "'").uniqueResult(0);
JSONObject nextObj = WQLObject.getWQLObject("sch_base_point").query("point_code='" + json.getString("next_point_code") + "'").uniqueResult(0);
if (StrUtil.equals(stratrObj.getString("area_type"), AreaEnum.YZQY.getCode()) &&
StrUtil.equals(nextObj.getString("area_type"), AreaEnum.RYHCHJ.getCode())
) {
taskDto.setTask_type("2");
}
taskDto.setRoute_plan_code("normal");
taskDto.setStart_device_code(json.getString("start_point_code"));
taskDto.setNext_device_code(json.getString("next_point_code"));
taskDto.setVehicle_code(json.getString("vehicle_code"));
arr.add(taskDto);
}
return arr;*/
return null;
}
/**
* @return WCS的任务集合
* @discription 重新下发给wcs任务
* @author ldjun
* @created 2020年6月12日 下午5:52:28
*/
protected JSONObject renotifyAcs(SchBaseTask task) {
Assert.notNull(task);
List<SchBaseTask> taskList = new ArrayList<>();
taskList.add(task);
return this.renotifyAcs(taskList);
}
/**
* @return WCS的任务集合
* @discription 重新下发给wcs任务
* @author ldjun
* @created 2020年6月12日 下午5:52:28
*/
protected JSONObject renotifyAcs(List<SchBaseTask> taskList) {
//1、获取任务
//2、根据任务配置补全任务
//3、下发
List<AcsTaskDto> list = new ArrayList<>();
for (SchBaseTask task : taskList) {
AcsTaskDto taskDto = new AcsTaskDto();
taskDto.setExt_task_uuid(task.getTask_code());
taskDto.setTask_code(task.getTask_code());
taskDto.setRoute_plan_code("normal");
taskDto.setStart_device_code(task.getPoint_code1());
taskDto.setNext_device_code(task.getPoint_code2());
taskDto.setVehicle_code(task.getVehicle_code());
this.setTask(task.getConfig_code(), taskDto);
list.add(taskDto);
}
return AcsUtil.notifyAcs("api/wms/task", list);
}
private AcsTaskDto setTask(String config_code, AcsTaskDto taskDto) {
SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(config_code);
taskDto.setPriority(taskConfig.getPriority());
taskDto.setTask_type(taskConfig.getAcs_task_type());
taskDto.setRoute_plan_code("normal");
return taskDto;
}
/**
* 定时任务
*/
protected void schedule() {
this.autoCreate();
this.create();
}
/**
* 自动生成任务
*/
public void autoCreate() {
}
protected abstract void updateStatus(String config_code, TaskStatus status);
/**
* 寻找合适的点位
*
* @return
*/
protected abstract List<Object> findPoints();
public void apply(JSONObject param) {
String point_code = "";
String config_code = "HNMLTask";
//1、校验数据
SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(config_code);
Integer tcmn = taskConfig.getTask_create_max_num();
SchBaseTaskServiceImpl taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class);
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(taskConfig.getConfig_code());
Assert.isFalse(unFinishTasksByTaskConfig.size() > tcmn, "该点位{}申请的任务未完成数已超过上限,无法申请任务", point_code);
SchBaseTask task = new SchBaseTask();
task.setAcs_trace_id("");
task.setConfig_code(config_code);
task.setCreate_id("");
task.setCreate_mode("");
task.setPoint_code1("");
task.setVehicle_code("");
task.setTask_status(TaskStatus.APPLY.getCode());
SpringContextHolder.getBean(SchBaseTaskServiceImpl.class).create(task);
//1、如果是送料检测载具状态
//2、送空载具
//3、叫料
//4、叫空载具
//校验
}
}

View File

@@ -0,0 +1,30 @@
package org.nl.wms.sch.task_manage;
import lombok.Data;
@Data
public class AcsTaskDto {
//任务标识
private String ext_task_uuid;
//任务编码
private String task_code;
//任务类型
private String task_type;
//起点
private String start_device_code;
//下一点
private String next_device_code;
//载具号
private String vehicle_code;
//载具类型
private String vehicle_type;
//优先级
private String priority;
//备注
private String remark;
//扩展参数
private String params;
//路由类型
private String route_plan_code;
}

View File

@@ -0,0 +1,57 @@
package org.nl.wms.sch.task_manage;
import cn.hutool.core.util.ObjectUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Set;
@Slf4j
@Component
public class AutoCreateTask {
private Set<Class<? extends AbstractTask>> subTypes = null;
@SneakyThrows
public void run() {
log.info("定时任务AutoCreateTask开始执行:");
if (ObjectUtil.isNull(subTypes) || subTypes.isEmpty()) {
Reflections reflections = new Reflections("org.nl");
//System.out.println(AbstractAcsTask.class.isAssignableFrom(DumpInvTask.class));
subTypes = reflections.getSubTypesOf(AbstractTask.class);
}
this.doExecute();
}
/**
* 需要按照任务配置类型并行执行
*/
private void doExecute() {
subTypes.forEach(clz -> {
// 调用AbstractAcsTask类的每个子类的schedule()方法
try {
Object obj = clz.newInstance();
//Method m = obj.getClass().getDeclaredMethod("schedule");
Method m = obj.getClass().getMethod("schedule");
List<AcsTaskDto> tasks = (List<AcsTaskDto>) m.invoke(obj);
} catch (InvocationTargetException e) {
e.printStackTrace();
log.info("定时器执行失败:{}", e.getTargetException().getMessage());
} catch (Exception e) {
e.printStackTrace();
log.info("定时器执行失败:{}", e.getMessage());
}
});
}
}

View File

@@ -1,82 +0,0 @@
package org.nl.wms.sch.task_manage;
import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSONObject;
import org.nl.config.SpringContextHolder;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task.service.impl.SchBaseTaskServiceImpl;
import org.nl.wms.sch.task.service.impl.SchBaseTaskconfigServiceImpl;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* @author ldjun
* @version 1.0
* @date 2023年05月16日 16:42
* @desc desc
*/
public abstract class BaseTask {
@Autowired
private ISchBaseTaskService taskService;
/**
* 创建
*/
protected abstract void create(JSONObject param);
/**
* 下发
*/
protected abstract void issue();
/**
* 定时任务
*/
protected abstract void schedule();
protected abstract void updateStatus();
/**
* 寻找合适的点位
*
* @return
*/
protected abstract List<Object> findPoints();
public void apply(JSONObject param) {
String point_code = "";
String config_code = "HNMLTask";
//1、校验数据
SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(config_code);
Integer tcmn = taskConfig.getTask_create_max_num();
SchBaseTaskServiceImpl taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class);
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(taskConfig.getConfig_code());
Assert.isFalse(unFinishTasksByTaskConfig.size() > tcmn, "该点位{}申请的任务未完成数已超过上限,无法申请任务", point_code);
SchBaseTask task = new SchBaseTask();
task.setAcs_trace_id("");
task.setConfig_code(config_code);
task.setCreate_id("");
task.setCreate_mode("");
task.setPoint_code1("");
task.setVehicle_code("");
task.setTask_status(TaskStatus.APPLY.getCode());
SpringContextHolder.getBean(SchBaseTaskServiceImpl.class).create(task);
//1、如果是送料检测载具状态
//2、送空载具
//3、叫料
//4、叫空载具
//校验
}
}

View File

@@ -0,0 +1,55 @@
package org.nl.wms.sch.task_manage.task;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.sch.task_manage.AcsTaskDto;
import org.springframework.http.HttpStatus;
import java.util.List;
/**
* ACS连接工具类:
*/
@Slf4j
public class AcsUtil {
public static JSONObject notifyAcs(String api, List<AcsTaskDto> list) {
//判断是否连接ACS系统
String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue();
JSONObject result = new JSONObject();
if (StrUtil.equals("0", isConnect)) {
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "未连接ACS!");
result.put("data", new JSONObject());
return result;
}
//ACS地址127.0.0.1:8010
String acsUrl = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("ACS_URL").getValue();
String url = acsUrl + api;
log.info("下发acs任务的参数为:{}", list.toString());
try {
String resultMsg = HttpRequest.post(url)
.body(String.valueOf(list))
.execute().body();
result = JSONObject.parseObject(resultMsg);
} catch (Exception e) {
String msg = e.getMessage();
//ConnectException: Connection refused: connect
//网络不通
System.out.println(msg);
result.put("status", HttpStatus.BAD_REQUEST);
result.put("message", "网络不通,操作失败!");
result.put("data", new JSONObject());
}
//acs抛异常这里
/* if (result.getString("status").equals(String.valueOf(HttpStatus.BAD_REQUEST.value())))
throw new BadRequestException(result.getString("message"));*/
return result;
}
}

View File

@@ -1,6 +1,6 @@
package org.nl.wms.sch.task_manage.task;
import org.nl.wms.sch.task_manage.BaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.task.tasks.HNMLTask;
/**
@@ -11,7 +11,7 @@ import org.nl.wms.sch.task_manage.task.tasks.HNMLTask;
*/
public class TaskFactory {
//使用 getShape 方法获取形状类型的对象
public BaseTask getTask(String taskType) {
public AbstractTask getTask(String taskType) {
if (taskType == null) {
return null;
}

View File

@@ -1,7 +1,18 @@
package org.nl.wms.sch.task_manage.task.tasks;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.sch.task_manage.BaseTask;
import cn.hutool.core.util.ObjectUtil;
import org.nl.config.SpringContextHolder;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.point.service.impl.SchBasePointServiceImpl;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task.service.impl.SchBaseTaskServiceImpl;
import org.nl.wms.sch.task.service.impl.SchBaseTaskconfigServiceImpl;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.springframework.scheduling.support.TaskUtils;
import java.util.List;
@@ -11,14 +22,37 @@ import java.util.List;
* @date 2023年05月16日 16:44
* @desc desc
*/
public class HNMLTask extends BaseTask {
public class HNMLTask extends AbstractTask {
private static String TASK_CONFIG_CODE = "HNMLTask";
@Override
protected void updateStatus() {
protected void updateStatus(String task_code, TaskStatus status) {
ISchBaseTaskService taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class);
taskService.updateById(null);
}
@Override
protected void create(JSONObject param) {
protected void create() {
ISchBaseTaskService taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class);
ISchBasePointService pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class);
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(TASK_CONFIG_CODE);
for (SchBaseTask task : tasks) {
List<String> next_region_strs = taskConfig.getNext_region_strs();
if (ObjectUtil.isEmpty(next_region_strs)) continue;
SchBasePoint point = new SchBasePoint();
task.setPoint_code2(point.getPoint_code());
taskService.update(task);
pointService.update(point);
this.renotifyAcs(task);
//二车间-
}
}