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 bde6ac22..91130ae3 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
@@ -17,4 +17,8 @@ public interface ErrorCodeConstants {
ErrorCode RAW_FOIL_WORK_ORDER_POINT_CODE_NOT_EXISTS = new ErrorCode(4, "点位设备不存在");
ErrorCode RAW_FOIL_WORK_ORDER_MATERIAL_NOT_EXISTS = new ErrorCode(5, "物料不存在");
ErrorCode RAW_FOIL_WORK_ORDER_ALREADY_ENDED = new ErrorCode(6, "不能对完成状态的工单强制结束");
+
+ // ========== 装箱区点位库存 ==========
+ ErrorCode PACKAGE_POINT_NOT_EXISTS = new ErrorCode(200001, "装箱区点位库存不存在");
+
}
diff --git a/nl-module-lms/nl-module-lms-server/pom.xml b/nl-module-lms/nl-module-lms-server/pom.xml
index dab9a5e7..856cdea8 100644
--- a/nl-module-lms/nl-module-lms-server/pom.xml
+++ b/nl-module-lms/nl-module-lms-server/pom.xml
@@ -32,6 +32,11 @@
nl-module-lms-api
${revision}
+
+ cn.nl.cloud
+ nl-module-system-api
+ ${revision}
+
cn.nl.cloud
nl-module-base-api
@@ -138,4 +143,4 @@
-
\ No newline at end of file
+
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/PackagePointController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/PackagePointController.java
new file mode 100644
index 00000000..21cec7c7
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/PackagePointController.java
@@ -0,0 +1,106 @@
+package cn.code.nl.module.lms.controller.admin.packagepoint;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+import static cn.code.nl.framework.common.pojo.CommonResult.success;
+
+import cn.code.nl.framework.excel.core.util.ExcelUtils;
+
+import cn.code.nl.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.code.nl.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.code.nl.module.lms.controller.admin.packagepoint.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
+import cn.code.nl.module.lms.service.packagepoint.PackagePointService;
+import org.dromara.core.trans.anno.TransMethodResult;
+
+@Tag(name = "管理后台 - 装箱区点位库存")
+@RestController
+@RequestMapping("/lms/package-point")
+@Validated
+public class PackagePointController {
+
+ @Resource
+ private PackagePointService packagePointService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建装箱区点位库存")
+ @PreAuthorize("@ss.hasPermission('lms:package-point:create')")
+ public CommonResult createPackagePoint(@Valid @RequestBody PackagePointSaveReqVO createReqVO) {
+ return success(packagePointService.createPackagePoint(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新装箱区点位库存")
+ @PreAuthorize("@ss.hasPermission('lms:package-point:update')")
+ public CommonResult updatePackagePoint(@Valid @RequestBody PackagePointSaveReqVO updateReqVO) {
+ packagePointService.updatePackagePoint(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除装箱区点位库存")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('lms:package-point:delete')")
+ public CommonResult deletePackagePoint(@RequestParam("id") Long id) {
+ packagePointService.deletePackagePoint(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除装箱区点位库存")
+ @PreAuthorize("@ss.hasPermission('lms:package-point:delete')")
+ public CommonResult deletePackagePointList(@RequestParam("ids") List ids) {
+ packagePointService.deletePackagePointListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得装箱区点位库存")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('lms:package-point:query')")
+ public CommonResult getPackagePoint(@RequestParam("id") Long id) {
+ PackagePointDO packagePoint = packagePointService.getPackagePoint(id);
+ return success(BeanUtils.toBean(packagePoint, PackagePointRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得装箱区点位库存分页")
+ @TransMethodResult
+ @PreAuthorize("@ss.hasPermission('lms:package-point:query')")
+ public CommonResult> getPackagePointPage(@Valid PackagePointPageReqVO pageReqVO) {
+ PageResult pageResult = packagePointService.getPackagePointPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, PackagePointRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出装箱区点位库存 Excel")
+ @PreAuthorize("@ss.hasPermission('lms:package-point:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportPackagePointExcel(@Valid PackagePointPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = packagePointService.getPackagePointPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "装箱区点位库存.xls", "数据", PackagePointRespVO.class,
+ BeanUtils.toBean(list, PackagePointRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointPageReqVO.java
new file mode 100644
index 00000000..5c130929
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointPageReqVO.java
@@ -0,0 +1,41 @@
+package cn.code.nl.module.lms.controller.admin.packagepoint.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.code.nl.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 装箱区点位库存分页 Request VO")
+@Data
+public class PackagePointPageReqVO extends PageParam {
+
+ @Schema(description = "点位名称", example = "赵六")
+ private String pointName;
+
+ @Schema(description = "点位类型", example = "2")
+ private String pointType;
+
+ @Schema(description = "子卷号", example = "赵六")
+ private String containerName;
+
+ @Schema(description = "库存状态", example = "2")
+ private String pointStatus;
+
+ @Schema(description = "载具号")
+ private String vehicleCode;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "是否启用")
+ private Boolean isUsed;
+
+ @Schema(description = "更新时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] updateTime;
+
+}
\ No newline at end of file
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointRespVO.java
new file mode 100644
index 00000000..31792e3a
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointRespVO.java
@@ -0,0 +1,101 @@
+package cn.code.nl.module.lms.controller.admin.packagepoint.vo;
+
+import cn.code.nl.module.system.api.user.AdminUserApi;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.dromara.core.trans.anno.Trans;
+import org.dromara.core.trans.constant.TransType;
+import org.dromara.core.trans.vo.VO;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 装箱区点位库存 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PackagePointRespVO implements VO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "837")
+ @ExcelProperty("库存记录标识")
+ @TableId
+ private Long pointId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("点位编码")
+ private String pointCode;
+
+ @Schema(description = "点位名称", example = "赵六")
+ @ExcelProperty("点位名称")
+ private String pointName;
+
+ @Schema(description = "点位类型", example = "2")
+ @ExcelProperty("点位类型")
+ private String pointType;
+
+ @Schema(description = "子卷号", example = "赵六")
+ @ExcelProperty("子卷号")
+ private String containerName;
+
+ @Schema(description = "库存状态", example = "2")
+ @ExcelProperty("库存状态")
+ private String pointStatus;
+
+ @Schema(description = "载具号")
+ @ExcelProperty("载具号")
+ private String vehicleCode;
+
+ @Schema(description = "区块")
+ @ExcelProperty("区块")
+ private String block;
+
+ @Schema(description = "位置")
+ @ExcelProperty("位置")
+ private String pointLocation;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private Boolean isUsed;
+
+ @Schema(description = "备注", example = "随便")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "规划")
+ @ExcelProperty("规划")
+ private String plan;
+
+ @Schema(description = "排")
+ @ExcelProperty("排")
+ private String rowNum;
+
+ @Schema(description = "列")
+ @ExcelProperty("列")
+ private String colNum;
+
+ @Schema(description = "深浅位0浅位1深位")
+ @ExcelProperty("深浅位0浅位1深位")
+ private String depth;
+
+ @Schema(description = "所属等待点类型", example = "2")
+ @ExcelProperty("所属等待点类型")
+ private String waitPointType;
+
+ @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("更新时间")
+ private LocalDateTime updateTime;
+
+ @Schema(description = "更新者")
+ @ExcelProperty("更新者")
+ @Trans(type = TransType.AUTO_TRANS, key = AdminUserApi.PREFIX, fields = "nickname", ref = "updaterName")
+ private String updater;
+
+ @Schema(description = "更新者名称")
+ private String updaterName;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointSaveReqVO.java
new file mode 100644
index 00000000..4c4073f8
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/packagepoint/vo/PackagePointSaveReqVO.java
@@ -0,0 +1,66 @@
+package cn.code.nl.module.lms.controller.admin.packagepoint.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 装箱区点位库存新增/修改 Request VO")
+@Data
+public class PackagePointSaveReqVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "837")
+ private Long pointId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "点位名称", example = "赵六")
+ private String pointName;
+
+ @Schema(description = "点位类型", example = "2")
+ private String pointType;
+
+ @Schema(description = "子卷号", example = "赵六")
+ private String containerName;
+
+ @Schema(description = "库存状态", example = "2")
+ private String pointStatus;
+
+ @Schema(description = "载具号")
+ private String vehicleCode;
+
+ @Schema(description = "区块")
+ private String block;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "顺序号不能为空")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "是否启用不能为空")
+ private Boolean isUsed;
+
+ @Schema(description = "备注", example = "随便")
+ private String remark;
+
+ @Schema(description = "规划")
+ private String plan;
+
+ @Schema(description = "排")
+ private String rowNum;
+
+ @Schema(description = "列")
+ private String colNum;
+
+ @Schema(description = "深浅位0浅位1深位")
+ private String depth;
+
+ @Schema(description = "所属等待点类型", example = "2")
+ private String waitPointType;
+
+}
\ No newline at end of file
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/packagepoint/PackagePointDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/packagepoint/PackagePointDO.java
new file mode 100644
index 00000000..5f7f6f0d
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/packagepoint/PackagePointDO.java
@@ -0,0 +1,96 @@
+package cn.code.nl.module.lms.dal.dataobject.packagepoint;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 装箱区点位库存 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("lms_package_point")
+@KeySequence("lms_package_point_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PackagePointDO extends BaseDO {
+
+ /**
+ * 库存记录标识
+ */
+ @TableId
+ private Long pointId;
+ /**
+ * 点位编码
+ */
+ private String pointCode;
+ /**
+ * 点位名称
+ */
+ private String pointName;
+ /**
+ * 点位类型
+ */
+ private String pointType;
+ /**
+ * 子卷号
+ */
+ private String containerName;
+ /**
+ * 库存状态
+ */
+ private String pointStatus;
+ /**
+ * 载具号
+ */
+ private String vehicleCode;
+ /**
+ * 区块
+ */
+ private String block;
+ /**
+ * 位置
+ */
+ private String pointLocation;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+ /**
+ * 是否启用
+ */
+ private Boolean isUsed;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 规划
+ */
+ private String plan;
+ /**
+ * 排
+ */
+ private String rowNum;
+ /**
+ * 列
+ */
+ private String colNum;
+ /**
+ * 深浅位0浅位1深位
+ */
+ private String depth;
+ /**
+ * 所属等待点类型
+ */
+ private String waitPointType;
+
+
+}
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
new file mode 100644
index 00000000..08251602
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java
@@ -0,0 +1,34 @@
+package cn.code.nl.module.lms.dal.mysql.packagepoint;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.module.lms.controller.admin.packagepoint.vo.PackagePointPageReqVO;
+import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.util.StringUtils;
+
+/**
+ * 装箱区点位库存 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface PackagePointMapper extends BaseMapperX {
+
+ default PageResult selectPage(PackagePointPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(PackagePointDO::getPointType, reqVO.getPointType())
+ .likeIfPresent(PackagePointDO::getContainerName, reqVO.getContainerName())
+ .eqIfPresent(PackagePointDO::getPointStatus, reqVO.getPointStatus())
+ .eqIfPresent(PackagePointDO::getVehicleCode, reqVO.getVehicleCode())
+ .eqIfPresent(PackagePointDO::getPointLocation, reqVO.getPointLocation())
+ .eqIfPresent(PackagePointDO::getIsUsed, reqVO.getIsUsed())
+ .and(StringUtils.hasText(reqVO.getPointName()), wrapper -> wrapper
+ .like(PackagePointDO::getPointName, reqVO.getPointName())
+ .or()
+ .like(PackagePointDO::getPointCode, reqVO.getPointName()))
+ .orderByAsc(PackagePointDO::getPointId));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java
new file mode 100644
index 00000000..7cfa7138
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java
@@ -0,0 +1,62 @@
+package cn.code.nl.module.lms.service.packagepoint;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.lms.controller.admin.packagepoint.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 装箱区点位库存 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface PackagePointService {
+
+ /**
+ * 创建装箱区点位库存
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createPackagePoint(@Valid PackagePointSaveReqVO createReqVO);
+
+ /**
+ * 更新装箱区点位库存
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updatePackagePoint(@Valid PackagePointSaveReqVO updateReqVO);
+
+ /**
+ * 删除装箱区点位库存
+ *
+ * @param id 编号
+ */
+ void deletePackagePoint(Long id);
+
+ /**
+ * 批量删除装箱区点位库存
+ *
+ * @param ids 编号
+ */
+ void deletePackagePointListByIds(List ids);
+
+ /**
+ * 获得装箱区点位库存
+ *
+ * @param id 编号
+ * @return 装箱区点位库存
+ */
+ PackagePointDO getPackagePoint(Long id);
+
+ /**
+ * 获得装箱区点位库存分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 装箱区点位库存分页
+ */
+ PageResult getPackagePointPage(PackagePointPageReqVO pageReqVO);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java
new file mode 100644
index 00000000..ff62b3a4
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.code.nl.module.lms.service.packagepoint;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.code.nl.module.lms.controller.admin.packagepoint.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+
+import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.code.nl.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*;
+
+/**
+ * 装箱区点位库存 Service 实现类
+ *
+ * @author 诺力管理员
+ */
+@Service
+@Validated
+public class PackagePointServiceImpl implements PackagePointService {
+
+ @Resource
+ private PackagePointMapper packagePointMapper;
+
+ @Override
+ public Long createPackagePoint(PackagePointSaveReqVO createReqVO) {
+ // 插入
+ PackagePointDO packagePoint = BeanUtils.toBean(createReqVO, PackagePointDO.class);
+ packagePointMapper.insert(packagePoint);
+
+ // 返回
+ return packagePoint.getPointId();
+ }
+
+ @Override
+ public void updatePackagePoint(PackagePointSaveReqVO updateReqVO) {
+ // 校验存在
+ validatePackagePointExists(updateReqVO.getPointId());
+ // 更新
+ PackagePointDO updateObj = BeanUtils.toBean(updateReqVO, PackagePointDO.class);
+ packagePointMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deletePackagePoint(Long id) {
+ // 校验存在
+ validatePackagePointExists(id);
+ // 删除
+ packagePointMapper.deleteById(id);
+ }
+
+ @Override
+ public void deletePackagePointListByIds(List ids) {
+ // 删除
+ packagePointMapper.deleteByIds(ids);
+ }
+
+
+ private void validatePackagePointExists(Long id) {
+ if (packagePointMapper.selectById(id) == null) {
+ throw exception(PACKAGE_POINT_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public PackagePointDO getPackagePoint(Long id) {
+ return packagePointMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getPackagePointPage(PackagePointPageReqVO pageReqVO) {
+ return packagePointMapper.selectPage(pageReqVO);
+ }
+
+}
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
new file mode 100644
index 00000000..58dfd574
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/packagepoint/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/packagepoint/index.ts
new file mode 100644
index 00000000..f9a7a395
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/packagepoint/index.ts
@@ -0,0 +1,72 @@
+import type { PageParam, PageResult } from '@vben/request';
+
+import { requestClient } from '#/api/request';
+
+export namespace LmsPackagePointApi {
+ /** 装箱区点位库存信息 */
+ export interface PackagePoint {
+ pointId: number; // 库存记录标识
+ pointCode?: string; // 点位编码
+ pointName: string; // 点位名称
+ pointType: string; // 点位类型
+ containerName: string; // 子卷号
+ pointStatus: string; // 库存状态
+ vehicleCode: string; // 载具号
+ block: string; // 区块
+ pointLocation: string; // 位置
+ sortSeq?: number; // 顺序号
+ isUsed?: boolean; // 是否启用
+ remark: string; // 备注
+ plan: string; // 规划
+ rowNum: string; // 排
+ colNum: string; // 列
+ depth: string; // 深浅位0浅位1深位
+ waitPointType: string; // 所属等待点类型
+ updaterName?: string; // 更新者名称
+ updateTime?: string; // 更新时间
+ }
+}
+
+/** 查询装箱区点位库存分页 */
+export function getPackagePointPage(params: PageParam) {
+ return requestClient.get>(
+ '/lms/package-point/page',
+ { params },
+ );
+}
+
+/** 查询装箱区点位库存详情 */
+export function getPackagePoint(id: number) {
+ return requestClient.get(
+ `/lms/package-point/get?id=${id}`,
+ );
+}
+
+/** 新增装箱区点位库存 */
+export function createPackagePoint(data: LmsPackagePointApi.PackagePoint) {
+ return requestClient.post('/lms/package-point/create', data);
+}
+
+/** 修改装箱区点位库存 */
+export function updatePackagePoint(data: LmsPackagePointApi.PackagePoint) {
+ return requestClient.put('/lms/package-point/update', data);
+}
+
+/** 删除装箱区点位库存 */
+export function deletePackagePoint(id: number) {
+ return requestClient.delete(`/lms/package-point/delete?id=${id}`);
+}
+
+/** 批量删除装箱区点位库存 */
+export function deletePackagePointList(ids: number[]) {
+ return requestClient.delete(
+ `/lms/package-point/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出装箱区点位库存 */
+export function exportPackagePoint(params: any) {
+ return requestClient.download('/lms/package-point/export-excel', { params });
+}
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/data.ts
new file mode 100644
index 00000000..51ca58a8
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/data.ts
@@ -0,0 +1,355 @@
+import type {VbenFormSchema} from '#/adapter/form';
+import type {VxeTableGridOptions} from '#/adapter/vxe-table';
+import type {LmsPackagePointApi} from '#/api/lms/packagepoint';
+
+import {DICT_TYPE} from "@vben/constants";
+import {getDictOptions} from "@vben/hooks";
+
+import {getRangePickerDefaultProps} from '#/utils';
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'point_id',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'pointName',
+ label: '点位名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位名称',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.BOX_POINT_TYPE),
+ placeholder: '请选择点位类型',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '子卷号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入子卷号',
+ },
+ },
+ {
+ fieldName: 'pointStatus',
+ label: '点位状态',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.BOX_POINT_STATUS),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ defaultValue: "1"
+ },
+ },
+ {
+ fieldName: 'vehicleCode',
+ label: '载具号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入载具号',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: 'required',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_TRUE_FALSE, "boolean"),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ defaultValue: true,
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ {
+ fieldName: 'plan',
+ label: '规划',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入规划',
+ },
+ },
+ {
+ fieldName: 'block',
+ label: '区块',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入区块',
+ },
+ },
+ {
+ fieldName: 'rowNum',
+ label: '排',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入排',
+ },
+ },
+ {
+ fieldName: 'colNum',
+ label: '列',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入列',
+ },
+ },
+ {
+ fieldName: 'depth',
+ label: '深浅位',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.BOX_POINT_DEPTH),
+ placeholder: '请选择深浅位',
+ },
+ }
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointName',
+ label: '点位名称',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入点位名称',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.BOX_POINT_TYPE),
+ placeholder: '请选择点位类型',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '子卷号',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入子卷号',
+ },
+ },
+ {
+ fieldName: 'pointStatus',
+ label: '点位状态',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.BOX_POINT_STATUS),
+ placeholder: '请选择库存状态',
+ },
+ },
+ {
+ fieldName: 'vehicleCode',
+ label: '载具号',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入载具号',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.COMMON_TRUE_FALSE, "boolean"),
+ placeholder: '请选择是否启用',
+ },
+ },
+ {
+ fieldName: 'updateTime',
+ label: '更新时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {type: 'checkbox', width: 40},
+ {
+ field: 'pointCode',
+ title: '点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'pointName',
+ title: '点位名称',
+ minWidth: 120,
+ },
+ {
+ field: 'pointType',
+ title: '点位类型',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: {
+ type: DICT_TYPE.BOX_POINT_TYPE
+ }
+ },
+ },
+ {
+ field: 'containerName',
+ title: '子卷号',
+ minWidth: 120,
+ },
+ {
+ field: 'pointStatus',
+ title: '点位状态',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: {
+ type: DICT_TYPE.BOX_POINT_STATUS
+ }
+ },
+ },
+ {
+ field: 'vehicleCode',
+ title: '载具号',
+ minWidth: 120,
+ },
+ {
+ field: 'block',
+ title: '区块',
+ minWidth: 120,
+ },
+ {
+ field: 'pointLocation',
+ title: '位置',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ {
+ field: 'plan',
+ title: '规划',
+ minWidth: 120,
+ },
+ {
+ field: 'rowNum',
+ title: '排',
+ minWidth: 120,
+ },
+ {
+ field: 'colNum',
+ title: '列',
+ minWidth: 120,
+ },
+ {
+ field: 'depth',
+ title: '深浅位',
+ minWidth: 120,
+ },
+ {
+ field: 'updaterName',
+ title: '更新人',
+ minWidth: 120,
+ },
+ {
+ field: 'updateTime',
+ title: '更新时间',
+ minWidth: 120,
+ formatter: 'formatDateTime',
+ },
+ {
+ title: '操作',
+ width: 200,
+ fixed: 'right',
+ slots: {default: 'actions'},
+ },
+ ];
+}
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/index.vue
new file mode 100644
index 00000000..37e94d82
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/modules/form.vue
new file mode 100644
index 00000000..e11af911
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/packagepoint/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/packages/constants/src/dict-enum.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/packages/constants/src/dict-enum.ts
index 8b802722..9a155fb2 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/packages/constants/src/dict-enum.ts
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/packages/constants/src/dict-enum.ts
@@ -308,6 +308,13 @@ const RawFoil_DICT = {
RAWFOIL_WORKORDER_STATUS: 'rawfoil_workorder_status', // 生箔工序工单状态
} as const;
+/** ========== LMS - 管理模块 ========== */
+const LMS_DICT = {
+ BOX_POINT_TYPE: 'box_point_type', // 装箱点位类型
+ BOX_POINT_STATUS: 'box_point_status', // 装箱点位状态
+ BOX_POINT_DEPTH: 'box_point_depth', // 装箱点位深浅
+} as const;
+
/** 字典类型枚举 - 统一导出 */
const DICT_TYPE = {
...AI_DICT,
@@ -327,6 +334,7 @@ const DICT_TYPE = {
...COMMON_DICT,
...TASK_DICT,
...RawFoil_DICT,
+ ...LMS_DICT,
} as const;
export { DICT_TYPE };
diff --git a/sql/mysql/lms_package_point.sql b/sql/mysql/lms_package_point.sql
new file mode 100644
index 00000000..760652b6
--- /dev/null
+++ b/sql/mysql/lms_package_point.sql
@@ -0,0 +1,80 @@
+CREATE TABLE `lms_package_point`
+(
+ `point_id` bigint NOT NULL COMMENT '库存记录标识',
+ `point_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '点位编码',
+ `point_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '点位名称',
+ `point_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '点位类型',
+ `container_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '子卷号',
+ `point_status` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '库存状态',
+ `vehicle_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '载具号',
+ `block` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '区块',
+ `point_location` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '位置',
+ `sort_seq` decimal(5, 0) NOT NULL DEFAULT '1' COMMENT '顺序号',
+ `is_used` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否启用',
+ `remark` varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
+ `plan` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '规划',
+ `row_num` char(6) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '0' COMMENT '排',
+ `col_num` char(6) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '0' COMMENT '列',
+ `depth` char(1) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '0' COMMENT '深浅位0浅位1深位',
+ `wait_point_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '0' COMMENT '所属等待点类型',
+ `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ PRIMARY KEY (`point_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC COMMENT='装箱区点位库存表';
+
+-- 子卷下线点初始化数据
+INSERT INTO lms_package_point (point_id, point_code, point_name, point_type, point_status)
+SELECT UUID_SHORT(), seed.point_code, seed.point_name, '1', '1'
+FROM (
+ SELECT 'ZJXX_01' AS point_code, '子卷下线点01' AS point_name
+ UNION ALL
+ SELECT 'ZJXX_02', '子卷下线点02'
+ UNION ALL
+ SELECT 'ZJXX_03', '子卷下线点03'
+ UNION ALL
+ SELECT 'ZJXX_04', '子卷下线点04'
+ UNION ALL
+ SELECT 'ZJXX_05', '子卷下线点05'
+ UNION ALL
+ SELECT 'ZJXX_06', '子卷下线点06'
+ ) seed
+WHERE NOT EXISTS (
+ SELECT 1
+ FROM lms_package_point existing
+ WHERE existing.point_code = seed.point_code
+ AND existing.deleted = b'0'
+);
+
+-- 菜单 SQL
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status, component_name)
+VALUES ('装箱区管理', '', 2, 0, 6741,
+ 'package-point', '', 'lms/packagepoint/index', 0, 'PackagePoint');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status)
+VALUES ('装箱区点位库存查询', 'lms:package-point:query', 3, 1, @parentId,
+ '', '', '', 0);
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status)
+VALUES ('装箱区点位库存创建', 'lms:package-point:create', 3, 2, @parentId,
+ '', '', '', 0);
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status)
+VALUES ('装箱区点位库存更新', 'lms:package-point:update', 3, 3, @parentId,
+ '', '', '', 0);
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status)
+VALUES ('装箱区点位库存删除', 'lms:package-point:delete', 3, 4, @parentId,
+ '', '', '', 0);
+INSERT INTO system_menu(name, permission, type, sort, parent_id,
+ path, icon, component, status)
+VALUES ('装箱区点位库存导出', 'lms:package-point:export', 3, 5, @parentId,
+ '', '', '', 0);