From 3ec762c7a30c29f292e0b98d8a1a70f02f3c2074 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Tue, 18 Aug 2026 16:35:49 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AD=90=E5=8D=B7=E8=A3=85?= =?UTF-8?q?=E7=AE=B1=E6=A1=81=E6=9E=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/lms/enums/PackageTaskTypeEnum.java | 1 + .../packagepoint/PackagePointMapper.java | 13 +++ .../SubPackageRelationMapper.java | 11 ++ .../PackageBoxBusinessServiceImpl.java | 101 ++++++++++++++++++ .../lms/tasks/box/PackageBoxTrussTask.java | 65 +++++++++++ .../packagepoint/PackagePointMapper.xml | 16 +++ .../SubPackageRelationMapper.xml | 17 +-- 7 files changed, 217 insertions(+), 7 deletions(-) create mode 100644 nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/PackageBoxTrussTask.java diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java index 7e0c8285..000f2e66 100644 --- a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java +++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java @@ -12,6 +12,7 @@ public enum PackageTaskTypeEnum { SUB_ROLL_DOWN_AGV("010601", "子卷下线到待检AGV任务"), SUB_ROLL_CALL_EMPTY_AGV("010602", "子卷下线补空架AGV任务"), PACKAGE_AGV("010603", "装箱AGV任务"), + PACKAGE_BOX_TRUSS("010604", "子卷装箱桁架任务"), ; /** * 字典键值 diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java index 0c9a9e03..908b9b25 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java @@ -54,6 +54,19 @@ public interface PackagePointMapper extends BaseMapperX { @Param("pointStatus") String pointStatus, @Param("block") String block); + /** + * 根据容器编号集合查询可用点位 + * + * @param pointType 点位类型 + * @param pointStatus 点位状态 + * @param containerNames 容器编号集合 + * @return 可用点位列表 + */ + List selectAvailablePointListByContainerNames( + @Param("pointType") String pointType, + @Param("pointStatus") String pointStatus, + @Param("containerNames") List containerNames); + /** * 尝试锁定点位 * diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/subpackagerelation/SubPackageRelationMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/subpackagerelation/SubPackageRelationMapper.java index 0f95c609..8e4ef4ed 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/subpackagerelation/SubPackageRelationMapper.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/subpackagerelation/SubPackageRelationMapper.java @@ -8,6 +8,7 @@ import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX; import cn.code.nl.module.lms.dal.dataobject.subpackagerelation.SubPackageRelationDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import cn.code.nl.module.lms.controller.admin.subpackagerelation.vo.*; /** @@ -18,6 +19,16 @@ import cn.code.nl.module.lms.controller.admin.subpackagerelation.vo.*; @Mapper public interface SubPackageRelationMapper extends BaseMapperX { + /** + * 根据木箱唯一码和状态查询子卷包装关系 + * + * @param packageBoxSn 木箱唯一码 + * @param status 状态 + * @return 子卷包装关系列表 + */ + List selectListByPackageBoxSnAndStatus( + @Param("packageBoxSn") String packageBoxSn, @Param("status") String status); + default PageResult selectPage(SubPackageRelationPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(SubPackageRelationDO::getPackageBoxSn, reqVO.getPackageBoxSn()) diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java index 782d7a26..2791d142 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java @@ -2,7 +2,9 @@ package cn.code.nl.module.lms.service.packagepoint; import cn.code.nl.framework.common.util.json.JsonUtils; import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO; +import cn.code.nl.module.lms.dal.dataobject.subpackagerelation.SubPackageRelationDO; import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper; +import cn.code.nl.module.lms.dal.mysql.subpackagerelation.SubPackageRelationMapper; import cn.code.nl.module.lms.enums.BoxPointStatusEnum; import cn.code.nl.module.lms.enums.BoxPointTypeEnum; import cn.code.nl.module.lms.enums.PackageTaskTypeEnum; @@ -45,11 +47,28 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService /** 子卷下线补充空架子任务回调处理器编码 */ private static final String SUB_ROLL_CALL_EMPTY_HANDLE_CODE = "subRollCallEmptyAgvTask"; + /** 子卷装箱桁架业务类型 */ + private static final String PACKAGE_BOX_TRUSS_BIZ_TYPE = "PACKAGE_BOX_TRUSS"; + + /** 子卷装箱桁架任务回调处理器编码 */ + private static final String PACKAGE_BOX_TRUSS_HANDLE_CODE = "packageBoxTrussTask"; + + /** 待装箱包装关系状态 */ + private static final String PENDING_PACKAGE_RELATION_STATUS = "0"; + + /** 最后一卷任务扩展参数 */ + private static final String LAST_ROLL_REQUEST_PARAM = "{\"isLast\":\"1\"}"; + /** * ACS 搬运任务类型 */ private static final String ACS_MOVE_TASK_TYPE = "7"; + /** + * ACS 桁架任务类型 + */ + private static final String ACS_TRUSS_TASK_TYPE = "6"; + /** * AGV 系统类型 */ @@ -58,6 +77,9 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService @Resource private PackagePointMapper packagePointMapper; + @Resource + private SubPackageRelationMapper subPackageRelationMapper; + @Resource private TransportTaskApi transportTaskApi; @@ -182,9 +204,88 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService } } + /** + * 自动创建子卷装箱桁架任务 + */ @Override + @Transactional(rollbackFor = Exception.class) public void autoPackageTrussTaskJob() { + List dockingPointList = packagePointMapper.selectAvailablePointList( + BoxPointTypeEnum.PACKING_DOCK_POINT.getCode(), BoxPointStatusEnum.EMPTY_CONTAINER.getCode()); + if (CollectionUtils.isEmpty(dockingPointList)) { + log.info("自动创建子卷装箱桁架任务结束:没有可用的装箱对接位"); + return; + } + for (PackagePointDO dockingPoint : dockingPointList) { + if (packagePointMapper.tryLockPoint(dockingPoint.getPointId(), dockingPoint.getPointStatus()) == 0) { + continue; + } + + List relationList = + subPackageRelationMapper.selectListByPackageBoxSnAndStatus( + dockingPoint.getVehicleCode(), PENDING_PACKAGE_RELATION_STATUS); + if (CollectionUtils.isEmpty(relationList)) { + packagePointMapper.unlockPoint(dockingPoint.getPointId(), dockingPoint.getPointStatus()); + log.info("装箱对接位对应木箱没有待装箱子卷,点位编码={},木箱号={}", + dockingPoint.getPointCode(), dockingPoint.getVehicleCode()); + continue; + } + + List containerNames = relationList.stream() + .map(SubPackageRelationDO::getContainerName) + .toList(); + List sourcePointList = packagePointMapper.selectAvailablePointListByContainerNames( + BoxPointTypeEnum.PACKING_POINT.getCode(), BoxPointStatusEnum.QUALIFIED.getCode(), + containerNames); + PackagePointDO sourcePoint = lockNextSourcePoint(sourcePointList.iterator()); + if (sourcePoint == null) { + packagePointMapper.unlockPoint(dockingPoint.getPointId(), dockingPoint.getPointStatus()); + log.info("木箱待装子卷暂无可用装箱点,点位编码={},木箱号={}", + dockingPoint.getPointCode(), dockingPoint.getVehicleCode()); + continue; + } + + Long taskId = createPackageBoxTrussTask( + sourcePoint, dockingPoint, relationList.size() == 1); + log.info("子卷装箱桁架任务创建成功,任务标识={},木箱号={},子卷号={},起点编码={},目的点编码={}", + taskId, dockingPoint.getVehicleCode(), sourcePoint.getContainerName(), + sourcePoint.getPointCode(), dockingPoint.getPointCode()); + + } + } + + /** + * 创建子卷装箱桁架任务 + * + * @param sourcePoint 装箱点起点 + * @param dockingPoint 装箱对接位终点 + * @param isLast 是否为木箱最后一卷 + * @return 运输任务标识 + */ + private Long createPackageBoxTrussTask(PackagePointDO sourcePoint, + PackagePointDO dockingPoint, + boolean isLast) { + TransportTaskCreateReqDTO task = new TransportTaskCreateReqDTO(); + task.setTaskName("子卷装箱桁架任务"); + task.setOwnerService(TaskOwnerServiceEnum.LMS.name()); + task.setBizType(PACKAGE_BOX_TRUSS_BIZ_TYPE); + task.setBizId(sourcePoint.getContainerName()); + task.setTaskType(PackageTaskTypeEnum.PACKAGE_BOX_TRUSS.getCode()); + task.setHandleCode(PACKAGE_BOX_TRUSS_HANDLE_CODE); + task.setAcsTaskType(ACS_TRUSS_TASK_TYPE); + task.setAgvSystemType(AGV_SYSTEM_TYPE); + task.setPointCode1(sourcePoint.getPointCode()); + task.setPointCode2(dockingPoint.getPointCode()); + task.setVehicleCode(dockingPoint.getVehicleCode()); + task.setMaterialCode(sourcePoint.getContainerName()); + task.setProductArea(sourcePoint.getProductArea()); + task.setIsAutoIssue("1"); + task.setIsCreateFinish(true); + if (isLast) { + task.setRequestParam(LAST_ROLL_REQUEST_PARAM); + } + return transportTaskApi.createTransportTask(task).getCheckedData(); } /** diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/PackageBoxTrussTask.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/PackageBoxTrussTask.java new file mode 100644 index 00000000..9fdbb929 --- /dev/null +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/PackageBoxTrussTask.java @@ -0,0 +1,65 @@ +package cn.code.nl.module.lms.tasks.box; + +import cn.code.nl.framework.execute.core.AbstractTask; +import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO; +import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO; +import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper; +import cn.code.nl.module.lms.enums.BoxPointStatusEnum; +import cn.code.nl.module.task.api.TransportTaskApi; +import cn.code.nl.module.task.dto.TaskInfoDTO; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 子卷装箱桁架任务 + * 装箱区 -> 装箱对接位 + * @Author: liyongde + * @Date: 2026/8/18 15:50 + */ +@Slf4j +@Component("packageBoxTrussTask") +public class PackageBoxTrussTask extends AbstractTask { + @Resource + private TransportTaskApi transportTaskApi; + + @Resource + private PackagePointMapper packagePointMapper; + + @Override + public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) { + // 起点设置空载具 + TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData(); + PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false); + PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false); + PackagePointDO upStartPoint = new PackagePointDO(); + upStartPoint.setPointId(startPoint.getPointId()); + upStartPoint.setPointStatus(BoxPointStatusEnum.EMPTY_CONTAINER.getCode()); + upStartPoint.setContainerName(""); + upStartPoint.setLockStatus("0"); + PackagePointDO upEndPoint = new PackagePointDO(); + upEndPoint.setPointId(endPoint.getPointId()); + upEndPoint.setLockStatus("0"); + upEndPoint.setVehicleCode(""); + upEndPoint.setPointStatus(BoxPointStatusEnum.EMPTY.getCode()); + packagePointMapper.updateBatch(List.of(upStartPoint, upEndPoint)); + } + + @Override + public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) { + // 起点终点解锁 + TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData(); + PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false); + PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false); + // 解锁 + PackagePointDO upStartPoint = new PackagePointDO(); + upStartPoint.setPointId(startPoint.getPointId()); + upStartPoint.setLockStatus("0"); + PackagePointDO upEndPoint = new PackagePointDO(); + upEndPoint.setPointId(endPoint.getPointId()); + upEndPoint.setLockStatus("0"); + packagePointMapper.updateBatch(List.of(upStartPoint, upEndPoint)); + } +} diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml index a4e4e494..fb74d7eb 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml +++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml @@ -27,6 +27,22 @@ ORDER BY sort_seq, point_id + + UPDATE lms_package_point SET lock_status = '1', diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/subpackagerelation/SubPackageRelationMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/subpackagerelation/SubPackageRelationMapper.xml index 771270e0..a59ff599 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/subpackagerelation/SubPackageRelationMapper.xml +++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/subpackagerelation/SubPackageRelationMapper.xml @@ -2,11 +2,14 @@ - + - \ No newline at end of file +