diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 4e9ec71..aa85e2d 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -119,9 +119,13 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (ObjectUtil.isEmpty(taskInfo)) { throw new BadRequestException("任务信息不能为空!"); } - SchBaseTask taskObj = taskService.getByCode(taskInfo.getString("task_code")); + String taskCode = taskInfo.getString("task_code"); + if (ObjectUtil.isEmpty(taskCode)) { + throw new BadRequestException("任务编码不能为空"); + } + SchBaseTask taskObj = taskService.getByCode(taskCode); if (ObjectUtil.isEmpty(taskObj)) { - throw new BadRequestException("未找到任务编码为 [" + taskInfo.getString("task_code") + "] 的任务"); + throw new BadRequestException("未找到任务编码为 [" + taskCode + "] 的任务"); } // 任务处理类 String processingClass = taskObj.getConfig_code(); @@ -146,10 +150,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { AbstractTask abstractTask = taskFactory.getTask(processingClass); // 更新任务 try { - abstractTask.updateTaskStatus(taskInfo, status); + abstractTask.updateTaskStatus(taskCode, status); } catch (Exception e) { log.error("任务状态更新失败: {}", message); - return BaseResponse.responseError(requestNo, "任务:[" + taskInfo.getString("task_code") + "]状态更新失败," + message); + return BaseResponse.responseError(requestNo, "任务:[" + taskCode + "]状态更新失败," + message); } return BaseResponse.responseOk(requestNo, "任务状态反馈成功!"); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java index b5a7831..e5ad188 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/dao/SchBasePoint.java @@ -55,7 +55,7 @@ public class SchBasePoint implements Serializable { private String vehicle_type; /** 载具编码 */ - private String storagevehicle_code; + private String vehicle_code; /** 载具数量 */ private Integer vehicle_qty; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java index 4d7ea51..6f9bffb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java @@ -134,7 +134,7 @@ public class SchBasePointServiceImpl extends ServiceImpl 优先级 (默认会将配置表设置进来,如果需要自行更改则可在业务中设置) */ private String priority; + /** 物料 */ + private String material_code; + /** 配置表 -> acs任务类型 */ @TableField(exist = false) private String acs_task_type; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java index 0082e50..59256f6 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java @@ -60,7 +60,7 @@ public class SchBaseTaskconfig implements Serializable { private String priority; - + /** 最大任务数量 */ private Integer task_create_max_num; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java index 0bbc42f..349498c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -64,39 +64,6 @@ public class SchBaseTaskServiceImpl extends ServiceImpl pages = new Page<>(page.getPage() + 1, page.getSize()); pages = schBaseTaskMapper.selectPageLeftJoin(pages, whereJson, collect); return pages; -// String task_code = ObjectUtil.isNotEmpty(whereJson.get("task_code")) -// ? whereJson.get("task_code").toString() : null; -// String vehicle_code = ObjectUtil.isNotEmpty(whereJson.get("vehicle_code")) -// ? whereJson.get("vehicle_code").toString() : null; -// String point_code = ObjectUtil.isNotEmpty(whereJson.get("point_code")) -// ? whereJson.get("point_code").toString() : null; -// String begin_time = ObjectUtil.isNotEmpty(whereJson.get("begin_time")) -// ? whereJson.get("begin_time").toString() : null; -// String end_time = ObjectUtil.isNotEmpty(whereJson.get("end_time")) -// ? whereJson.get("end_time").toString() : null; -// String more_task_status = ObjectUtil.isNotEmpty(whereJson.get("more_task_status")) -// ? whereJson.get("more_task_status").toString() : null; -// List collect = ObjectUtil.isNotEmpty(more_task_status) -// ? Arrays.stream(more_task_status.split(",")).collect(Collectors.toList()) : null; -// String unFinished = null; -// if (collect != null) { -// if (collect.contains(TaskStatus.UNFINISHED.getCode())) { -// collect = null; -// unFinished = TaskStatus.EXECUTING.getCode(); -// } -// } -// LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); -// lam.eq(ObjectUtil.isNotEmpty(task_code), SchBaseTask::getTask_code, task_code) -// .eq(ObjectUtil.isNotEmpty(vehicle_code), SchBaseTask::getVehicle_code, vehicle_code) -// .eq(ObjectUtil.isNotEmpty(point_code), SchBaseTask::getPoint_code1, point_code) -// .ge(ObjectUtil.isNotEmpty(begin_time), SchBaseTask::getCreate_time, begin_time) -// .le(ObjectUtil.isNotEmpty(end_time), SchBaseTask::getCreate_time, end_time) -// .in(ObjectUtil.isNotEmpty(collect), SchBaseTask::getTask_status, collect) -// .le(ObjectUtil.isNotEmpty(unFinished), SchBaseTask::getTask_status, unFinished) -// .orderByDesc(SchBaseTask::getUpdate_time); -// IPage pages = new Page<>(page.getPage() + 1, page.getSize()); -// schBaseTaskMapper.selectPage(pages, lam); -// return pages; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index fd5d326..dc67807 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -173,31 +173,19 @@ public abstract class AbstractTask { this.renotifyAcs(list); } - /** - * 更新任务状态,暴露给外围使用 - * @param taskObj 任务信息 - * @param status 状态 - */ - public void updateTaskStatus(JSONObject taskObj, TaskStatus status) { - this.updateStatus(taskObj, status); - } - - /** * 自动生成任务 */ protected void autoCreate() { - + // 考虑不通过此定时器 } /** - * 修改状态 - * 以下改为public会出现自动注入类出现问题 - * - * @param taskObj 任务信息 - * @param status 状态 + * 更新任务状态,暴露给外围使用 + * @param task_code 任务信息 + * @param status 状态 */ - public abstract void updateStatus(JSONObject taskObj, TaskStatus status); + public abstract void updateTaskStatus(String task_code, TaskStatus status); /** @@ -230,7 +218,7 @@ public abstract class AbstractTask { * * @param task_code 任务标识 * @return - * @discription 强制结束完成任务 + * @discription 完成任务 * @author ldjun * @created 2020年6月19日 上午10:34:58 */ @@ -271,13 +259,10 @@ public abstract class AbstractTask { .eq(SchBaseTaskconfig::getConfig_code, configCode)); Assert.notNull(taskConfig, LangProcess.msg("common_configTip", configCode)); - // 最大任务数 - Integer tcmn = taskConfig.getTask_create_max_num(); - // 获取执行中的任务(由配置文件设置,一般是最大值) List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( taskConfig.getConfig_code(), taskConfig.getTask_direction()); - Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, LangProcess.msg("common_maxTaskTip", applyPointCode)); + Assert.isFalse(unFinishTasksByTaskConfig.size() >= taskConfig.getTask_create_max_num(), LangProcess.msg("common_maxTaskTip", applyPointCode)); // 校验同个点位,同种任务是否多次请求创建任务(固定只能1个任务) List applyPointTask = taskService.findUnFinishTasksByTaskConfig( @@ -291,7 +276,7 @@ public abstract class AbstractTask { AbstractTask bean = SpringContextHolder.getBean(this.getClass()); // 2、创建申请任务 - task.setAcs_trace_id(requestNo); +// task.setAcs_trace_id(requestNo); task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); task.setConfig_code(configCode); @@ -309,7 +294,7 @@ public abstract class AbstractTask { } else { // 不需要立即创建 // 设置组盘 - 需要的话由子类自行实现 - task.setGroup_id(bean.setGroupPlate(param)); + task.setGroup_data(bean.setGroupPlate(param)); // 创建一条单点任务。 taskService.save(task); bean.create(); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java index 9623d96..0b38d38 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/GeneralDefinition.java @@ -50,4 +50,13 @@ public class GeneralDefinition { public static final String TASK_FINISH = "任务完成"; /** 任务取消 */ public static final String TASK_CANCEL = "任务取消"; + // 载具类型 + /** + * 料盅 + */ + public static final String MATERIAL_CUP = "LZ"; + /** + * 钢托盘 + */ + public static final String STEEL_TRAY = "GTP"; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java index 549f228..69a1b78 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java @@ -12,7 +12,7 @@ public enum TaskStatus { /** * 申请 */ - APPLY("1", "申请", "确认起点或者终点"), + APPLY("1", "申请", "申请"), /** * 创建完成 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/DemoTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/DemoTask.java new file mode 100644 index 0000000..a2daf3b --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/DemoTask.java @@ -0,0 +1,184 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.system.service.notice.ISysNoticeService; +import org.nl.wms.sch.point.service.ISchBasePointService; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.task.service.ISchBaseTaskService; +import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; +import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.AcsTaskDto; +import org.nl.wms.sch.task_manage.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.nl.wms.util.TaskUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Demo任务类 + * @Author: lyd + * @Date: 2025/9/24 + */ +@Component(value = "DemoTask") +public class DemoTask extends AbstractTask { + private static final String TASK_CONFIG_CODE = "DemoTask"; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISysNoticeService noticeService; + + @Override + public void deliveryBeforeProcessing(SchBaseTask task, AcsTaskDto acsTaskDto) { + // 这里些需要设置的内容,一般是特殊处理的内容放到task#request_param中 + } + + @Override + public void createCompletion(SchBaseTask task) { + // 立即创建任务会调用此方法 + System.out.println(11); + } + + @Override + public void create() throws BadRequestException { + // 创建任务,这里是为了半条任务使用 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + TaskUtils.setUpdateByAcs(task); + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) + .collect(Collectors.toList()); + // 进行找点创建任务,补齐任务数据 + // .... + // 找终点 + SchBasePoint point = findNextPoint(nextRegionStr); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.updateById(task); + // 消息通知 (这里不报错,可以选择通过通知的方式发送到前端,可以不用,因为似乎没用) + noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(), + NoticeTypeEnum.WARN.getCode()); + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code2(point.getPoint_code()); + // 需要自行定义 + task.setVehicle_type(GeneralDefinition.STEEL_TRAY); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.updateById(task); + // 点位上锁,如果不采用这种方式,则不需要设置,但是找点位的时候需要根据任务来 + point.setIng_task_code(task.getTask_code()); + PointUtils.setUpdateByAcs(point); + pointService.updateById(point); + } + } + + private SchBasePoint findNextPoint(List nextRegionStr) { + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getByCode(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + TaskUtils.setUpdateByAcs(taskObj); + taskService.updateById(taskObj); + } + if (status.equals(TaskStatus.FINISHED)) { + this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + if (status.equals(TaskStatus.CANCELED)) { + this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + } + } + + @Override + public void forceFinish(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + @Override + public void cancel(String task_code) { + SchBaseTask taskObj = taskService.getByCode(task_code); + if (ObjectUtil.isEmpty(taskObj)) { + throw new BadRequestException("该任务不存在"); + } + this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); + } + + public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 设置载具类型、点位状态、释放点位 + if (ObjectUtil.isNotEmpty(endPoint)) { + // 如果不跟据此字段,可以不用清除 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setVehicle_qty(1); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark(GeneralDefinition.TASK_FINISH); + taskObj.setFinished_type(taskFinishedType.getCode()); + // 区分完成者 + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } + + public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { + // 获取参数 + String endPoint = taskObj.getPoint_code2(); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 释放点位 + if (ObjectUtil.isNotEmpty(endPoint)) { + // 如果不跟据此字段,可以不用清除 + endPointObj.setIng_task_code(""); + PointUtils.setUpdateByType(endPointObj, taskFinishedType); + pointService.updateById(endPointObj); + } + taskObj.setRemark(GeneralDefinition.TASK_CANCEL); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + taskObj.setFinished_type(taskFinishedType.getCode()); + TaskUtils.setUpdateByType(taskObj, taskFinishedType); + taskService.updateById(taskObj); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/package-info.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/package-info.java new file mode 100644 index 0000000..2718f30 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/package-info.java @@ -0,0 +1,6 @@ +/** + * 任务存放位置 + * @Author: lyd + * @Date: 2025/9/24 + */ +package org.nl.wms.sch.task_manage.task.tasks; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java index 987340a..88b65e9 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/util/PointUtils.java @@ -48,7 +48,7 @@ public class PointUtils { SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); point.setPoint_status(PointStatusEnum.EMPTY_POINT.getCode()); point.setVehicle_type(""); - point.setStoragevehicle_code(""); + point.setVehicle_code(""); point.setIng_task_code(""); point.setVehicle_qty(0); point.setUpdate_time(DateUtil.now()); @@ -70,7 +70,7 @@ public class PointUtils { String parentPointCode = point.getParent_point_code(); SchBasePoint basePoint = pointService.getById(parentPointCode); point.setVehicle_type(""); - point.setStoragevehicle_code(""); + point.setVehicle_code(""); point.setIng_task_code(""); point.setVehicle_qty(point.getVehicle_qty() == 5 ? point.getVehicle_qty() : point.getVehicle_qty() + 1); // 等到新的点执行第一托的时候,才判断另一个点满足5个托盘的时候就清空 diff --git a/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java b/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java index f866bad..eed9aec 100644 --- a/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java +++ b/nladmin-system/nlsso-server/src/test/java/org/nl/ApplicationTest.java @@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import org.junit.jupiter.api.Test; +import org.nl.wms.sch.task_manage.AbstractTask; +import org.nl.wms.sch.task_manage.task.TaskFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Map; @@ -16,8 +19,13 @@ import java.util.Map; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class ApplicationTest { + @Autowired + private TaskFactory taskFactory; + @Test void contextLoads() { + AbstractTask demoTask = taskFactory.getTask("DemoTask"); + demoTask.apply(new JSONObject()); } @Test