diff --git a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/mps/service/impl/SlitterPdaServiceImpl.java b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/mps/service/impl/SlitterPdaServiceImpl.java index 64ae7563b..ebd04fc57 100644 --- a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/mps/service/impl/SlitterPdaServiceImpl.java +++ b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/mps/service/impl/SlitterPdaServiceImpl.java @@ -174,6 +174,10 @@ public class SlitterPdaServiceImpl implements SlitterPdaService { // 分切机设备 String deviceCode = param.getString("point_code"); StIvtCutpointivt device = cutpointivtService.getPintByExtCode(deviceCode, false); + List tasks = taskService.checkHaveTask(device.getPoint_code()); + if (tasks.size() > 0) { + throw new BadRequestException("分切机" + deviceCode + " 已经有存在的任务"); + } List qzzNo = Stream.of(device.getUp_qzzno(), device.getDown_qzzno()) .filter(ObjectUtil::isNotEmpty).collect(Collectors.toList()); if (qzzNo.size() == 0) { @@ -183,10 +187,6 @@ public class SlitterPdaServiceImpl implements SlitterPdaService { if (list.size() == 0) { throw new BadRequestException("分切机" + deviceCode + " 的分切计划 " + qzzNo + " 不存在"); } - List tasks = taskService.checkHaveTask(deviceCode); - if (tasks.size() > 0) { - throw new BadRequestException("分切机" + deviceCode + " 已经有存在的任务"); - } List collect = list .stream() .map(PdmBiSlittingproductionplan::getContainer_name) diff --git a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index f7bbcd205..a18fcd63e 100644 --- a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -329,5 +329,12 @@ public abstract class AbstractTask { */ public void agvPickUpCompleted(SchBaseTask task) { + } + /** + * AGV放货完成上报 + * @param task 任务 + */ + public void agvReleaseCompleted(SchBaseTask task) { + } } diff --git a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/nbj/SubRollDownAGVTask.java b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/nbj/SubRollDownAGVTask.java index 2ba498f1b..988cff541 100644 --- a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/nbj/SubRollDownAGVTask.java +++ b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/nbj/SubRollDownAGVTask.java @@ -1,5 +1,6 @@ package org.nl.wms.sch.task_manage.tasks.nbj; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -12,6 +13,7 @@ import org.nl.wms.sch.task_manage.AbstractTask; import org.nl.wms.sch.task_manage.TaskStatus; import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition; import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum; +import org.nl.wms.util.PointUtils; import org.nl.wms.util.TaskUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -54,6 +56,16 @@ public class SubRollDownAGVTask extends AbstractTask { } SchBasePoint zxPoint = zxPoints.get(0); task.setPoint_code2(zxPoint.getPoint_code()); + // 创建搬运空架子的任务 + List emptyPoint = pointService.getAllBusinessNotTaskPoint("A1", "A1-ZXZC", + "1", "2", null, null); + if (emptyPoint.size() > 0) { + // 有空架子就是四点任务 + SchBasePoint point = emptyPoint.get(0); + task.setVehicle_code2(point.getVehicle_code()); + task.setPoint_code3(point.getPoint_code()); + task.setPoint_code4(task.getPoint_code1()); + } // 创建任务 task.setHandle_class(THIS_CLASS); task.setTask_status(TaskStatus.START_AND_POINT.getCode()); @@ -67,18 +79,37 @@ public class SubRollDownAGVTask extends AbstractTask { public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { checkTaskOptionStatus(taskObj); JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param()); - // 起点清空(没有取货完成的业务),终点赋值 - String startPointCode = taskObj.getPoint_code1(); + // 任务设置071 + taskObj.setTask_status(TaskStatus.PICK_UP_COMPLETED.getCode()); + TaskUtils.setUpdateByType(taskObj, TaskFinishedTypeEnum.AUTO_ACS); + taskService.updateById(taskObj); + // 终点赋值 String endPointCode = taskObj.getPoint_code2(); - SchBasePoint startPoint = pointService.getById(startPointCode); SchBasePoint endPoint = pointService.getById(endPointCode); - clearPoint(startPoint, taskFinishedType); endPoint.setPoint_status("3"); endPoint.setMaterial_code(requestObj.getString("container_name")); endPoint.setVehicle_code(taskObj.getVehicle_code()); setUpdateByType(endPoint, taskFinishedType); pointService.updateById(endPoint); - // todo: 创建搬运空架子的任务 + // 判断是否为4点任务 + String startPointCode2 = taskObj.getPoint_code3(); + if (StrUtil.isNotBlank(startPointCode2)) { + // 四点任务 + SchBasePoint startPoint2 = pointService.getById(startPointCode2); + clearPoint(startPoint2, taskFinishedType); + SchBasePoint endPoint2 = pointService.getById(taskObj.getPoint_code4()); + endPoint2.setPoint_status("2"); + endPoint2.setMaterial_code(""); + endPoint2.setVehicle_code(taskObj.getVehicle_code2()); + endPoint2.setSource_id(""); + PointUtils.setUpdateByType(endPoint2, taskFinishedType); + pointService.updateById(endPoint2); + } else { + // 起点清空(没有取货完成的业务),终点赋值 + String startPointCode = taskObj.getPoint_code1(); + SchBasePoint startPoint = pointService.getById(startPointCode); + clearPoint(startPoint, TaskFinishedTypeEnum.AUTO_ACS); + } // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setFinished_type(taskFinishedType.getCode()); @@ -87,7 +118,6 @@ public class SubRollDownAGVTask extends AbstractTask { } @Override - @Transactional(rollbackFor = Exception.class) public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { checkTaskOptionStatus(taskObj); // 取消 @@ -97,4 +127,21 @@ public class SubRollDownAGVTask extends AbstractTask { TaskUtils.setUpdateByType(taskObj, taskFinishedType); taskService.updateById(taskObj); } + + @Override + public void agvPickUpCompleted(SchBaseTask task) { + if (TaskStatus.PICK_UP_COMPLETED.getCode().equals(task.getTask_status())) { + log.warn("该任务已经执行过取货完成!"); + return; + } + // 取货完成 + // 起点清空(没有取货完成的业务),终点赋值 + String startPointCode = task.getPoint_code3(); + SchBasePoint startPoint = pointService.getById(startPointCode); + clearPoint(startPoint, TaskFinishedTypeEnum.AUTO_ACS); + // 任务设置071 + task.setTask_status(TaskStatus.PICK_UP_COMPLETED.getCode()); + TaskUtils.setUpdateByType(task, TaskFinishedTypeEnum.AUTO_ACS); + taskService.updateById(task); + } } diff --git a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/slitter/SlitterDownAGVTask.java b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/slitter/SlitterDownAGVTask.java index 1ad4904e7..512f01e06 100644 --- a/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/slitter/SlitterDownAGVTask.java +++ b/lms2/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/tasks/slitter/SlitterDownAGVTask.java @@ -1,5 +1,6 @@ package org.nl.wms.sch.task_manage.tasks.slitter; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -21,14 +22,12 @@ import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition; import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum; import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask; import org.nl.wms.util.PointUtils; -import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -64,64 +63,54 @@ public class SlitterDownAGVTask extends AbstractTask { @SneakyThrows @Override public void createCompletion(SchBaseTask task) { - // 分切下料,子卷信息在请求参数中 - JSONObject requestObj = JSONObject.parseObject(task.getRequest_param()); - JSONArray container = requestObj.getJSONArray("container"); - List containerList = container.toJavaList(String.class); - // 获取分切计划,最多4个需要出站的任务 - List currentPlans = slittingproductionplanService.list( - new LambdaQueryWrapper() - .in(PdmBiSlittingproductionplan::getContainer_name, containerList) - .eq(PdmBiSlittingproductionplan::getIs_delete, "0") - .eq(PdmBiSlittingproductionplan::getStatus, "05")); - if (currentPlans.size() == 0) { - throw new BadRequestException("当前子卷已经出卷或者不存在!"); - } - // 获取上轴分切计划和下轴分切计划,各一条 - PdmBiSlittingproductionplan currentUpPlan = currentPlans.stream() - .filter(p -> "1".equals(p.getUp_or_down())) - .findFirst() - .orElse(null); - PdmBiSlittingproductionplan currentDownPlan = currentPlans.stream() - .filter(p -> "2".equals(p.getUp_or_down())) - .findFirst() - .orElse(null); - task.setPoint_code1(requestObj.getString("device_code")); - // 查找终点,在内包间的区域找个空位. - List areaEmptyNotTaskPoint = bstIvtCutpointivtService.getAreaNotTaskPointByStatus("1", - "1", "0", "1"); - if (areaEmptyNotTaskPoint.size() == 0) { - throw new BadRequestException("请求搬运失败,内包间没有可存放位置!"); - } - BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0); - RLock lock = redissonClient.getLock(endPoint.getPoint_code()); - boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - try { - if (tryLock) { - task.setPoint_code2(endPoint.getPoint_code()); - // 设置气胀轴 - task.setVehicle_code(currentUpPlan != null ? currentUpPlan.getQzzno() : ""); - task.setVehicle_code2(currentDownPlan != null ? currentDownPlan.getQzzno() : ""); - } else { - throw new BadRequestException("系统繁忙,稍后在试!!"); + taskLock(task.getConfig_code(), () -> { + // 分切下料,子卷信息在请求参数中 + JSONObject requestObj = JSONObject.parseObject(task.getRequest_param()); + JSONArray container = requestObj.getJSONArray("container"); + List containerList = container.toJavaList(String.class); + // 获取分切计划,最多4个需要出站的任务 + List currentPlans = slittingproductionplanService.list( + new LambdaQueryWrapper() + .in(PdmBiSlittingproductionplan::getContainer_name, containerList) + .eq(PdmBiSlittingproductionplan::getIs_delete, "0") + .eq(PdmBiSlittingproductionplan::getStatus, "05")); + if (currentPlans.size() == 0) { + throw new BadRequestException("当前子卷已经出卷或者不存在!"); } - } finally { - if (tryLock) { - lock.unlock(); + // 获取上轴分切计划和下轴分切计划,各一条 + PdmBiSlittingproductionplan currentUpPlan = currentPlans.stream() + .filter(p -> "1".equals(p.getUp_or_down())) + .findFirst() + .orElse(null); + PdmBiSlittingproductionplan currentDownPlan = currentPlans.stream() + .filter(p -> "2".equals(p.getUp_or_down())) + .findFirst() + .orElse(null); + task.setPoint_code1(requestObj.getString("device_code")); + // 查找终点,在内包间的区域找个空位. + List areaEmptyNotTaskPoint = bstIvtCutpointivtService.getAreaNotTaskPointByStatus("1", + "1", "0", "1"); + if (areaEmptyNotTaskPoint.size() == 0) { + throw new BadRequestException("请求搬运失败,内包间没有可存放位置!"); } - } - // 创建任务 - task.setHandle_class(THIS_CLASS); - task.setTask_status(TaskStatus.START_AND_POINT.getCode()); - setUpdateByPC(task); - taskService.save(task); - log.info("任务创建成功:{}", task); - // 下来的分切计划修改状态:05 -> 06 - currentPlans.forEach(plan -> { - plan.setStatus("06"); - updateOptMessageBySlitterPlan(plan); + BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0); + task.setPoint_code2(endPoint.getPoint_code()); + // 设置气胀轴 + task.setVehicle_code(currentUpPlan != null ? currentUpPlan.getQzzno() : ""); + task.setVehicle_code2(currentDownPlan != null ? currentDownPlan.getQzzno() : ""); + // 创建任务 + task.setHandle_class(THIS_CLASS); + task.setTask_status(TaskStatus.START_AND_POINT.getCode()); + setUpdateByPC(task); + taskService.save(task); + log.info("任务创建成功:{}", task); + // 下来的分切计划修改状态:05 -> 06 + currentPlans.forEach(plan -> { + plan.setStatus("06"); + updateOptMessageBySlitterPlan(plan); + }); + slittingproductionplanService.updateBatchById(currentPlans); }); - slittingproductionplanService.updateBatchById(currentPlans); } @Override @@ -152,6 +141,7 @@ public class SlitterDownAGVTask extends AbstractTask { // 更新分切计划 状态:06 -> 09 PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan(); p.setStatus("09"); + p.setEnd_time(DateUtil.now()); updateOptMessageBySlitterPlan(p); if (qzzNo.size() > 0) { slittingproductionplanService.update(p, new LambdaQueryWrapper()