diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index 8f36c8f..3804fbe 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -2,6 +2,7 @@ package org.nl.wms.sch.task_manage; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSONArray; @@ -10,15 +11,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.common.exception.BadRequestException; +import org.nl.config.SpringContextHolder; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.acs.service.dto.to.wms.AcsResponse; 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.enums.TaskDirectionEnum; +import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -31,6 +36,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * @version 1.0 * @date 2023年05月16日 16:42 * @desc 任务抽象父类,申请任务的相关率先判断以及生成,接着到子类执行任务的创建,最后统一通过定时任务去下发到ACS + *

模板模式+策略模式,将具体的创建任务交付给具体的子类,能够做到责任拆分,各司其职

*/ @Slf4j @Component @@ -102,6 +108,7 @@ public abstract class AbstractTask { taskDto.setNext_device_code2(task.getPoint_code4()); taskDto.setVehicle_code(task.getVehicle_code()); taskDto.setVehicle_code2(task.getVehicle_code2()); + // todo: 如果各类方法对返回参数有不同,可以通过调用子类实现的具体方法来完成赋值,也可以是统一封装到参数值中。 this.setTask(task.getConfig_code(), taskDto); list.add(taskDto); } @@ -236,6 +243,69 @@ public abstract class AbstractTask { * @throws BadRequestException */ public void apply(JSONObject param) throws BadRequestException { + // 申请任务 + SchBaseTask task = new SchBaseTask(); + // 请求点 + String apply_point_code = param.getString("device_code"); + String config_code = param.getString("config_code"); + String requestNo = param.getString("requestNo"); + String vehicleType = param.getString("vehicle_type"); + String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code")); + AbstractTask bean = SpringContextHolder.getBean(this.getClass()); + // 1、校验数据 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, config_code)); + Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!"); + // 最大任务数 + Integer tcmn = taskConfig.getTask_create_max_num(); + // 获取执行中的任务 + List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( + taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); + + Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, + apply_point_code + "该点位申请的任务未完成数已超过上限,无法申请任务"); + // 获取对接位点位对象 + SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper() + .eq(SchBasePoint::getPoint_code, apply_point_code)); + // 判断是否校验工单 + if (taskConfig.getIs_check_workorder()) { + // 校验工单 + // param.put("workorder_code", workorder.getWorkorder_code()); + // 设置任务数据 + } + // 校验是否需要自动agv + if (!pointObj.getIs_auto()) { + // 如果不需要自动,则不创建任务 + return; + } + // 2、创建申请任务 + task.setAcs_trace_id(requestNo); + task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); + task.setConfig_code(config_code); + task.setCreate_mode(GeneralDefinition.ACS_CREATION); + task.setVehicle_code(vehicleCode); + task.setVehicle_qty(param.getInteger("vehicle_qty")); + task.setVehicle_type(vehicleType); + task.setTask_status(TaskStatus.APPLY.getCode()); + task.setWorkshop_code(taskConfig.getWorkshop_code()); + // 设置起/终点 + bean.setTaskPoint(taskConfig, task, apply_point_code); + task.setRequest_param(JSONObject.toJSONString(param)); + // 设置创建人信息 + TaskUtils.setCreateByAcsOrPda(task, param); + // 3、判断是否直接找点下发 + // 立即创建吧组盘放到具体位置,免得重复创建 + if (taskConfig.getIs_immediate_create()) { + bean.createCompletion(task); + } else { // 不需要立即创建,需要立马组盘 + // 设置组盘 - 需要的话由子类自行实现 + // todo: 如果不需要这种场景,可以换成其他使用场景,目的是由策略角色去完善对此字段赋值 + task.setGroup_id(bean.setGroupPlate(param)); + // 创建一条单点任务。 + taskService.save(task); + bean.create(); + } } }