From d8c071a3c62980da90dc6d7b6df5d586e6f5caaf Mon Sep 17 00:00:00 2001
From: liyongde <1419499670@qq.com>
Date: Wed, 19 Aug 2026 16:43:32 +0800
Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E8=A3=85=E7=AE=B1=E5=85=A5?=
=?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2=E3=80=81=E7=A1=AE=E8=AE=A4=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E7=82=B9=E4=BD=8D=E3=80=81=E9=87=8A=E6=94=BE=E9=94=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../2026-08-19-pda-box-inbound-design.html | 11 +
.../module/lms/enums/ErrorCodeConstants.java | 4 +
.../module/lms/enums/PackageStatusEnum.java | 56 +++++
.../pda/boxpackage/PackagePdaController.java | 42 +++-
.../pda/boxpackage/vo/BoxRelationRespVO.java | 81 ++++++++
.../vo/UpdatePointInfoPdaReqVO.java | 31 +++
.../packagepoint/PackagePointMapper.java | 8 +
.../SlittingproductionplanMapper.java | 8 +-
.../SubPackageRelationMapper.java | 16 ++
.../packagepoint/PackagePdaService.java | 29 ++-
.../packagepoint/PackagePdaServiceImpl.java | 193 +++++++++++++++++-
.../packagepoint/PackagePointMapper.xml | 12 ++
.../SlittingproductionplanMapper.xml | 12 ++
.../SubPackageRelationMapper.xml | 19 ++
14 files changed, 509 insertions(+), 13 deletions(-)
create mode 100644 docs/prototype_design/design/2026-08-19-pda-box-inbound-design.html
create mode 100644 nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageStatusEnum.java
create mode 100644 nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/BoxRelationRespVO.java
create mode 100644 nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/boxpackage/vo/UpdatePointInfoPdaReqVO.java
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 @@
+
+