diff --git a/docs/prototype_design/design/2026-08-19-pda-box-inbound-design.html b/docs/prototype_design/design/2026-08-19-pda-box-inbound-design.html new file mode 100644 index 00000000..b46ca146 --- /dev/null +++ b/docs/prototype_design/design/2026-08-19-pda-box-inbound-design.html @@ -0,0 +1,11 @@ +装箱入库 - PDA 原型 +

装箱入库

装箱关系

+ diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/ErrorCodeConstants.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/ErrorCodeConstants.java index 6a05d9f7..8fb7dd29 100644 --- a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/ErrorCodeConstants.java +++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/ErrorCodeConstants.java @@ -62,6 +62,10 @@ public interface ErrorCodeConstants { ErrorCode PACKAGE_POINT_UNQUALIFIED_EMPTY_NOT_EXISTS = new ErrorCode(200009, "没有可用的不合格空位"); ErrorCode PACKAGE_POINT_CHECK_FAILED_TASK_CREATE_FAILED = new ErrorCode(200010, "创建质检不合格AGV任务失败"); ErrorCode PACKAGE_SLITTING_PLAN_NOT_EXISTS = new ErrorCode(200011, "未查询到对应的子卷信息"); + ErrorCode PACKAGE_POINT_UPDATE_HAS_UNFINISHED_TASK = new ErrorCode(200012, "点位存在未完成任务,不允许更新"); + ErrorCode PACKAGE_POINT_STATUS_NOT_EXISTS = new ErrorCode(200013, "点位状态不存在"); + ErrorCode PACKAGE_POINT_CONTAINER_NAME_REQUIRED = new ErrorCode(200014, "子卷号不能为空"); + ErrorCode PACKAGE_POINT_VEHICLE_CODE_REQUIRED = new ErrorCode(200015, "载具号不能为空"); // ========== 子卷包装关系 ========== ErrorCode SUB_PACKAGE_RELATION_NOT_EXISTS = new ErrorCode(300001, "子卷包装关系不存在"); diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageStatusEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageStatusEnum.java new file mode 100644 index 00000000..ed961e39 --- /dev/null +++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageStatusEnum.java @@ -0,0 +1,56 @@ +package cn.code.nl.module.lms.enums; + +import lombok.Getter; + +/** + * + * @Author: liyongde + * @Date: 2026/8/19 16:34 + */ +@Getter +public enum PackageStatusEnum { + /** + * 待包装 + */ + TO_BE_PACKED("0", "待包装"), + /** + * 已包装 + */ + PACKED("1", "已包装"), + /** + * 已入库 + */ + IN_STOCK("2", "已入库"), + /** + * 已出库 + */ + OUT_STOCK("3", "已出库"); + ; + /** + * 字典键值 + */ + private final String code; + /** + * 字典标签 + */ + private final String desc; + + PackageStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 根据code获取对应枚举 + * @param code 编码 + * @return 匹配的枚举,未找到返回null + */ + public static PackageStatusEnum getByCode(String code) { + for (PackageStatusEnum statusEnum : values()) { + if (statusEnum.getCode().equals(code)) { + return statusEnum; + } + } + return null; + } +} diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/PackagePdaController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/PackagePdaController.java index 80337740..0e37b981 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/PackagePdaController.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/PackagePdaController.java @@ -1,10 +1,7 @@ package cn.code.nl.module.lms.controller.pda.boxpackage; import cn.code.nl.framework.common.pojo.CommonResult; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.ManaQualityCheckPdaReqVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.PackagePointPdaRespVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.QueryPackagePointInfoReqVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.UpdateWeightPdaReqVO; +import cn.code.nl.module.lms.controller.pda.boxpackage.vo.*; import cn.code.nl.module.lms.service.packagepoint.PackagePdaService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -35,6 +32,7 @@ public class PackagePdaController { private PackagePdaService packagePdaService; @PostMapping("/query-point-info") + @Tag(name = "通用") @Operation(summary = "查询点位信息") @PermitAll public CommonResult queryPointInfo( @@ -45,6 +43,7 @@ public class PackagePdaController { @PostMapping("/quality-check") @Operation(summary = "人工质检") + @Tag(name = "人工质检") @PermitAll public CommonResult executeManualQualityCheck(@Valid @RequestBody ManaQualityCheckPdaReqVO manaQualityCheckPdaReqVO) { packagePdaService.executeManualQualityCheck(manaQualityCheckPdaReqVO); @@ -53,10 +52,45 @@ public class PackagePdaController { @PostMapping("/update-weight") @Operation(summary = "维护重量") + @Tag(name = "子卷重量维护") @PermitAll public CommonResult executeUpdateWeight(@Valid @RequestBody UpdateWeightPdaReqVO weightPdaReqVO) { packagePdaService.executeUpdateWeight(weightPdaReqVO); return success("操作成功!"); } + @PostMapping("/confirm-update-point") + @Tag(name = "装箱区管理") + @Operation(summary = "确认更新点位") + @PermitAll + public CommonResult executeUpdatePoint(@Valid @RequestBody UpdatePointInfoPdaReqVO pointInfoPdaReqVO) { + return success(packagePdaService.executeUpdatePoint(pointInfoPdaReqVO)); + } + + @PostMapping("/release-point") + @Tag(name = "装箱区管理") + @Operation(summary = "释放锁") + @PermitAll + public CommonResult executeReleasePoint(@Valid @RequestBody QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + packagePdaService.executeReleasePoint(pointInfoPdaReqVO); + return success("操作成功!"); + } + + @PostMapping("/query-box-info") + @Tag(name = "装箱入库") + @Operation(summary = "查询装箱信息") + @PermitAll + public CommonResult queryBoxInfo(@Valid @RequestBody QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + return success(packagePdaService.queryBoxInfo(pointInfoPdaReqVO)); + } + + @PostMapping("/confirm-inbound") + @Tag(name = "装箱入库") + @Operation(summary = "确认入库") + @PermitAll + public CommonResult executeConfirmInbound(@Valid @RequestBody QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + packagePdaService.executeConfirmInbound(pointInfoPdaReqVO); + return success("操作成功!"); + } + } diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/BoxRelationRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/BoxRelationRespVO.java new file mode 100644 index 00000000..4631add7 --- /dev/null +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/BoxRelationRespVO.java @@ -0,0 +1,81 @@ +package cn.code.nl.module.lms.controller.pda.boxpackage.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * + * @Author: liyongde + * @Date: 2026/8/19 15:52 + */ +@Data +public class BoxRelationRespVO { + /** + * 木箱号 + */ + private String boxNo; + + /** + * 总卷数 + */ + private Integer totalRollNum; + + /** + * 扫描站点 + */ + private String scanSiteCode; + + /** + * 整箱状态:待入库/已入库 + */ + private String boxStatus; + + /** + * 子卷明细列表 + */ + private List subRollList; + + + /** + * 子卷明细 + */ + @Data + public static class SubRollItemVO { + /** + * 子卷号 + */ + private String containerName; + + /** + * 站点号 + */ + private String pointCode; + + /** + * 子卷状态 + */ + private String status; + + /** + * 子卷重量 kg + */ + private BigDecimal weight; + + /** + * 管芯重量 kg + */ + private BigDecimal tubeWeight; + + /** + * 保质期 天 + */ + private Integer qualityGuaranPeriod; + + /** + * 入库时间 + */ + private String dateOfFgInbound; + } +} diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/UpdatePointInfoPdaReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/UpdatePointInfoPdaReqVO.java new file mode 100644 index 00000000..d1e281da --- /dev/null +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/UpdatePointInfoPdaReqVO.java @@ -0,0 +1,31 @@ +package cn.code.nl.module.lms.controller.pda.boxpackage.vo; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +/** + * 点位更新 + * @Author: liyongde + * @Date: 2026/8/19 11:12 + */ +@Data +public class UpdatePointInfoPdaReqVO { + /** + * 子卷号 + */ + private String containerName; + /** + * 点位编码 + */ + @NotEmpty(message = "点位编码不能为空") + private String pointCode; + /** + * 点位状态 + */ + @NotEmpty(message = "点位状态不能为空") + private String pointStatus; + /** + * 载具号(架子号) + */ + private String vehicleCode; +} 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 908b9b25..9f708dcb 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 @@ -67,6 +67,14 @@ public interface PackagePointMapper extends BaseMapperX { @Param("pointStatus") String pointStatus, @Param("containerNames") List containerNames); + /** + * 根据子卷号集合查询装箱区点位 + * + * @param containerNames 子卷号集合 + * @return 装箱区点位列表 + */ + List selectListByContainerNames(@Param("containerNames") List containerNames); + /** * 尝试锁定点位 * diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/slittingproductionplan/SlittingproductionplanMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/slittingproductionplan/SlittingproductionplanMapper.java index 59a2afe5..74ca9964 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/slittingproductionplan/SlittingproductionplanMapper.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/slittingproductionplan/SlittingproductionplanMapper.java @@ -34,10 +34,12 @@ public interface SlittingproductionplanMapper extends BaseMapperX selectListByExtContainerNames(Collection extContainerNames) { - return selectList(SlittingproductionplanDO::getExtContainerName, extContainerNames); - } + List selectListByExtContainerNames( + @Param("extContainerNames") Collection extContainerNames); /** * 根据子卷号或 ERP 子卷号查询分切生产计划 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 8e4ef4ed..be28e41a 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 @@ -19,6 +19,22 @@ import cn.code.nl.module.lms.controller.admin.subpackagerelation.vo.*; @Mapper public interface SubPackageRelationMapper extends BaseMapperX { + /** + * 根据子卷号查询子卷包装关系 + * + * @param containerName 子卷号 + * @return 子卷包装关系 + */ + SubPackageRelationDO selectByContainerName(@Param("containerName") String containerName); + + /** + * 根据木箱唯一码查询全部子卷包装关系 + * + * @param packageBoxSn 木箱唯一码 + * @return 子卷包装关系列表 + */ + List selectListByPackageBoxSn(@Param("packageBoxSn") String packageBoxSn); + /** * 根据木箱唯一码和状态查询子卷包装关系 * diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaService.java index 4f4b53b5..9156f134 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaService.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaService.java @@ -1,8 +1,6 @@ package cn.code.nl.module.lms.service.packagepoint; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.ManaQualityCheckPdaReqVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.PackagePointPdaRespVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.UpdateWeightPdaReqVO; +import cn.code.nl.module.lms.controller.pda.boxpackage.vo.*; import jakarta.validation.Valid; /** @@ -31,4 +29,29 @@ public interface PackagePdaService { * @param weightPdaReqVO */ void executeUpdateWeight(@Valid UpdateWeightPdaReqVO weightPdaReqVO); + + /** + * 确认更新点位 + * @param pointInfoPdaReqVO + */ + String executeUpdatePoint(@Valid UpdatePointInfoPdaReqVO pointInfoPdaReqVO); + + /** + * 释放锁 + * @param pointInfoPdaReqVO + */ + void executeReleasePoint(@Valid QueryPackagePointInfoReqVO pointInfoPdaReqVO); + + /** + * 操作入库 + * @param pointInfoPdaReqVO + */ + void executeConfirmInbound(@Valid QueryPackagePointInfoReqVO pointInfoPdaReqVO); + + /** + * 返回装箱信息 + * @param pointInfoPdaReqVO + * @return + */ + BoxRelationRespVO queryBoxInfo(@Valid QueryPackagePointInfoReqVO pointInfoPdaReqVO); } diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaServiceImpl.java index 4db976d3..c862b6a3 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaServiceImpl.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePdaServiceImpl.java @@ -3,15 +3,16 @@ package cn.code.nl.module.lms.service.packagepoint; import cn.code.nl.framework.common.exception.ServiceException; import cn.code.nl.framework.common.pojo.CommonResult; import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.ManaQualityCheckPdaReqVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.PackagePointPdaRespVO; -import cn.code.nl.module.lms.controller.pda.boxpackage.vo.UpdateWeightPdaReqVO; +import cn.code.nl.module.lms.controller.pda.boxpackage.vo.*; import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO; import cn.code.nl.module.lms.dal.dataobject.slittingproductionplan.SlittingproductionplanDO; +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.slittingproductionplan.SlittingproductionplanMapper; +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.PackageStatusEnum; import cn.code.nl.module.lms.enums.PackageTaskTypeEnum; import cn.code.nl.module.task.api.TransportTaskApi; import cn.code.nl.module.task.dto.TaskInfoDTO; @@ -28,7 +29,10 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*; @@ -73,6 +77,15 @@ public class PackagePdaServiceImpl implements PackagePdaService { /** AGV 系统类型 */ private static final String AGV_SYSTEM_TYPE = "1"; + /** 待入库状态 */ + private static final String PENDING_INBOUND_STATUS = "待入库"; + + /** 已入库状态 */ + private static final String INBOUNDED_STATUS = "已入库"; + + /** 包装关系已入库状态 */ + private static final String PACKAGE_RELATION_INBOUNDED_STATUS = "1"; + @Resource private RedissonClient redissonClient; @@ -92,6 +105,10 @@ public class PackagePdaServiceImpl implements PackagePdaService { @Resource private SlittingproductionplanMapper slittingproductionplanMapper; + /** 子卷包装关系 Mapper */ + @Resource + private SubPackageRelationMapper subPackageRelationMapper; + /** * 根据点位编码查询装箱区点位信息 * @@ -207,6 +224,176 @@ public class PackagePdaServiceImpl implements PackagePdaService { } } + @Override + public String executeUpdatePoint(UpdatePointInfoPdaReqVO pointInfoPdaReqVO) { + // 查询点位信息 + PackagePointDO packagePoint = packagePointService.getPackagePointByCode( + pointInfoPdaReqVO.getPointCode(), false); + if (packagePoint == null) { + throw exception(PACKAGE_POINT_NOT_EXISTS); + } + + // 存在未完成任务的点位不允许更新 + CommonResult taskResult = transportTaskApi + .getFirstUnfinishedTaskByPointCode(pointInfoPdaReqVO.getPointCode()); + if (taskResult.isError()) { + log.error("查询点位未完成任务失败,pointInfoPdaReqVO={},返回={}", pointInfoPdaReqVO, taskResult); + throw exception(PACKAGE_POINT_TASK_QUERY_FAILED); + } + if (taskResult.getData() != null) { + throw exception(PACKAGE_POINT_UPDATE_HAS_UNFINISHED_TASK); + } + + BoxPointStatusEnum pointStatus = BoxPointStatusEnum.getByCode(pointInfoPdaReqVO.getPointStatus()); + if (pointStatus == null) { + throw exception(PACKAGE_POINT_STATUS_NOT_EXISTS); + } + if (pointStatus == BoxPointStatusEnum.QUALIFIED || pointStatus == BoxPointStatusEnum.CONTROLLED) { + return "请到质检页面进行操作。"; + } + + PackagePointDO updatePoint = new PackagePointDO(); + updatePoint.setPointId(packagePoint.getPointId()); + updatePoint.setPointStatus(pointStatus.getCode()); + if (pointStatus == BoxPointStatusEnum.EMPTY) { + updatePoint.setContainerName(""); + updatePoint.setVehicleCode(""); + } else if (pointStatus == BoxPointStatusEnum.HAS_SUB_ROLL) { + if (StrUtil.isBlank(pointInfoPdaReqVO.getContainerName())) { + throw exception(PACKAGE_POINT_CONTAINER_NAME_REQUIRED); + } + if (StrUtil.isBlank(pointInfoPdaReqVO.getVehicleCode())) { + throw exception(PACKAGE_POINT_VEHICLE_CODE_REQUIRED); + } + updatePoint.setContainerName(pointInfoPdaReqVO.getContainerName()); + updatePoint.setVehicleCode(pointInfoPdaReqVO.getVehicleCode()); + } else if (pointStatus == BoxPointStatusEnum.EMPTY_CONTAINER) { + if (StrUtil.isBlank(pointInfoPdaReqVO.getVehicleCode())) { + throw exception(PACKAGE_POINT_VEHICLE_CODE_REQUIRED); + } + updatePoint.setContainerName(""); + updatePoint.setVehicleCode(pointInfoPdaReqVO.getVehicleCode()); + } + packagePointMapper.updateById(updatePoint); + log.info("用户{}更新点位信息,pointInfoPdaReqVO={}", + SecurityFrameworkUtils.getLoginUserNickname(), pointInfoPdaReqVO); + return "操作成功"; + } + + @Override + public void executeReleasePoint(QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + PackagePointDO packagePoint = packagePointService.getPackagePointByCode( + pointInfoPdaReqVO.getPointCode(), false); + if (packagePoint == null) { + throw exception(PACKAGE_POINT_NOT_EXISTS); + } + + // 存在未完成任务的点位不允许解锁 + CommonResult taskResult = transportTaskApi + .getFirstUnfinishedTaskByPointCode(pointInfoPdaReqVO.getPointCode()); + if (taskResult.isError()) { + log.error("查询点位未完成任务失败,pointInfoPdaReqVO={},返回={}", pointInfoPdaReqVO, taskResult); + throw exception(PACKAGE_POINT_TASK_QUERY_FAILED); + } + if (taskResult.getData() != null) { + throw exception(PACKAGE_POINT_HAS_UNFINISHED_TASK); + } + + PackagePointDO updatePoint = new PackagePointDO(); + updatePoint.setPointId(packagePoint.getPointId()); + updatePoint.setLockStatus("0"); + packagePointMapper.updateById(updatePoint); + log.info("用户{}释放点位锁,点位编码={}", + SecurityFrameworkUtils.getLoginUserNickname(), pointInfoPdaReqVO.getPointCode()); + } + + @Override + public void executeConfirmInbound(QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + + // 需要用redisson分布式锁 + + // 查找点位信息 + + // 根据点位的子卷号查找子卷信息,查找lms_slittingproductionplan#ext_container_name,找不到就提示erp卷号未导入 + + // 查看包装信息是否正确,根据子卷号,查询lms_sub_package_relation,customer_name=子卷号 & status = 1 & 没删除 + + // 创建半条任务(010603任务),只有起点没有终点,起点是传入的待检点,任务状态是10,任务的扩展参数需要加入block + + // 调用wms创建出木箱任务,api待定(先todo),但是传参可以先准备。 + // 创建出木箱任务的参数:装箱对接位(需要根据任务数最少判断),木箱类型(子卷包装关系对应的boxType) + // 判断哪一块的对接位: + + } + + /** + * 根据扫描点位查询整箱及其全部子卷信息 + * + * @param pointInfoPdaReqVO 点位查询参数 + * @return 整箱及子卷信息 + */ + @Override + public BoxRelationRespVO queryBoxInfo(QueryPackagePointInfoReqVO pointInfoPdaReqVO) { + // 查询扫描点位及其绑定的子卷 + PackagePointDO scanPoint = packagePointService.getPackagePointByCode( + pointInfoPdaReqVO.getPointCode(), false); + if (scanPoint == null) { + throw exception(PACKAGE_POINT_NOT_EXISTS); + } + + // 根据点位子卷查找所在木箱,再查询木箱下的全部子卷 + SubPackageRelationDO scanRelation = subPackageRelationMapper + .selectByContainerName(scanPoint.getContainerName()); + if (scanRelation == null) { + throw exception(SUB_PACKAGE_RELATION_NOT_EXISTS); + } + List relationList = subPackageRelationMapper + .selectListByPackageBoxSn(scanRelation.getPackageBoxSn()); + if (CollectionUtils.isEmpty(relationList)) { + throw exception(SUB_PACKAGE_RELATION_NOT_EXISTS); + } + + List containerNames = relationList.stream() + .map(SubPackageRelationDO::getContainerName) + .toList(); + Map planMap = slittingproductionplanMapper + .selectListByExtContainerNames(containerNames).stream() + .collect(Collectors.toMap(SlittingproductionplanDO::getExtContainerName, + Function.identity(), (first, second) -> first)); + Map pointMap = packagePointMapper + .selectListByContainerNames(containerNames).stream() + .collect(Collectors.toMap(PackagePointDO::getContainerName, + Function.identity(), (first, second) -> first)); + + // 组装木箱及子卷明细 + List subRollList = relationList.stream().map(relation -> { + SlittingproductionplanDO plan = planMap.get(relation.getContainerName()); + PackagePointDO point = pointMap.get(relation.getContainerName()); + BoxRelationRespVO.SubRollItemVO item = new BoxRelationRespVO.SubRollItemVO(); + item.setContainerName(relation.getContainerName()); + item.setPointCode(point == null ? null : point.getPointCode()); + item.setStatus(Objects.requireNonNull(PackageStatusEnum.getByCode(relation.getStatus())).getDesc()); + item.setWeight(plan == null || StrUtil.isBlank(plan.getWeight()) + ? null : new BigDecimal(plan.getWeight())); + item.setTubeWeight(plan == null || StrUtil.isBlank(plan.getPaperWeight()) + ? null : new BigDecimal(plan.getPaperWeight())); + item.setQualityGuaranPeriod(StrUtil.isBlank(relation.getQualityGuaranPeriod()) + ? null : Integer.valueOf(relation.getQualityGuaranPeriod())); + item.setDateOfFgInbound(relation.getDateOfFgInbound()); + return item; + }).toList(); + + BoxRelationRespVO response = new BoxRelationRespVO(); + response.setBoxNo(scanRelation.getPackageBoxSn()); + response.setTotalRollNum(subRollList.size()); + response.setScanSiteCode(scanPoint.getPointCode()); + response.setBoxStatus(relationList.stream().allMatch(relation -> + PACKAGE_RELATION_INBOUNDED_STATUS.equals(relation.getStatus())) + ? INBOUNDED_STATUS : PENDING_INBOUND_STATUS); + response.setSubRollList(subRollList); + return response; + } + /** * 执行人工质检合格操作 * 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 fb74d7eb..95fab45d 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 @@ -43,6 +43,18 @@ 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/slittingproductionplan/SlittingproductionplanMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/slittingproductionplan/SlittingproductionplanMapper.xml index 0e2f9ee0..e64dbc3a 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/slittingproductionplan/SlittingproductionplanMapper.xml +++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/slittingproductionplan/SlittingproductionplanMapper.xml @@ -2,6 +2,18 @@ + + + SELECT * + FROM lms_sub_package_relation + WHERE container_name = #{containerName} + AND deleted = b'0' + ORDER BY id DESC + LIMIT 1 + + + +