diff --git a/nl-gateway/src/main/resources/application-dev.yaml b/nl-gateway/src/main/resources/application-dev.yaml
index 1c16ab0b..7b546c05 100644
--- a/nl-gateway/src/main/resources/application-dev.yaml
+++ b/nl-gateway/src/main/resources/application-dev.yaml
@@ -7,10 +7,10 @@ spring:
username: nacos
password: nacos
discovery: # 【配置中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
config: # 【注册中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
--- #################### 监控相关配置 ####################
@@ -32,4 +32,4 @@ spring:
instance:
service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
username: admin
- password: admin
\ No newline at end of file
+ password: admin
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml b/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml
index 37d19abb..63b9fe66 100644
--- a/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml
+++ b/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml
@@ -3,16 +3,16 @@
spring:
cloud:
nacos:
- server-addr: 192.168.81.193:8848 # Nacos 服务器地址
+ server-addr: http://192.168.81.193:8848 # Nacos 服务器地址
username: nacos
password: nacos
discovery: # 【配置中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
--- #################### 数据库相关配置 ####################
@@ -57,14 +57,14 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
@@ -95,11 +95,11 @@ spring:
xxl:
job:
admin:
- addresses: http://192.168.81.193:8080/xxl-job-admin # 调度中心部署跟地址
- accessToken: default_token # 执行器通讯TOKEN
+ addresses: http://localhost:8080/xxl-job-admin # 调度中心部署跟地址
+ accessToken: 123456 # 执行器通讯TOKEN
executor:
- ip: 192.168.81.193
- port: 8993
+ ip: localhost
+ port: 9993
--- #################### 服务保障相关配置 ####################
@@ -140,4 +140,4 @@ logging:
# 芋道配置项,设置当前项目所有自定义的配置
nl:
- demo: false # 开启演示模式
\ No newline at end of file
+ demo: false # 开启演示模式
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/ClassStandardMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/BtIvtCutpointivtMapper.xml
similarity index 100%
rename from nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/ClassStandardMapper.xml
rename to nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/BtIvtCutpointivtMapper.xml
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/codegen/CodeSequenceMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/codegen/BtIvtCutpointivtMapper.xml
similarity index 100%
rename from nl-module-base/nl-module-base-server/src/main/resources/mapper/codegen/CodeSequenceMapper.xml
rename to nl-module-base/nl-module-base-server/src/main/resources/mapper/codegen/BtIvtCutpointivtMapper.xml
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/MaterialBaseMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/BtIvtCutpointivtMapper.xml
similarity index 100%
rename from nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/MaterialBaseMapper.xml
rename to nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/BtIvtCutpointivtMapper.xml
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/measureunit/MeasureUnitMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/measureunit/BtIvtCutpointivtMapper.xml
similarity index 100%
rename from nl-module-base/nl-module-base-server/src/main/resources/mapper/measureunit/MeasureUnitMapper.xml
rename to nl-module-base/nl-module-base-server/src/main/resources/mapper/measureunit/BtIvtCutpointivtMapper.xml
diff --git a/nl-module-infra/nl-module-infra-server/src/main/resources/application-dev.yaml b/nl-module-infra/nl-module-infra-server/src/main/resources/application-dev.yaml
index bd488096..606d8cf3 100644
--- a/nl-module-infra/nl-module-infra-server/src/main/resources/application-dev.yaml
+++ b/nl-module-infra/nl-module-infra-server/src/main/resources/application-dev.yaml
@@ -7,12 +7,12 @@ spring:
username: nacos
password: nacos
discovery: # 【配置中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
--- #################### 数据库相关配置 ####################
@@ -57,14 +57,14 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
@@ -96,10 +96,10 @@ xxl:
job:
admin:
addresses: http://192.168.81.193:8080/xxl-job-admin # 调度中心部署跟地址
- accessToken: default_token # 执行器通讯TOKEN
+ accessToken: 123456 # 执行器通讯TOKEN
executor:
ip: 192.168.81.193
- port: 8991
+ port: 9981
--- #################### 服务保障相关配置 ####################
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/EmptyRollerPointTypeEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/EmptyRollerPointTypeEnum.java
new file mode 100644
index 00000000..47630234
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/EmptyRollerPointTypeEnum.java
@@ -0,0 +1,26 @@
+package cn.code.nl.module.lms.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/7/28
+ */
+@Getter
+public enum EmptyRollerPointTypeEnum {
+
+ RAW_FOIL_EMPTY_ROLLER_POINT("1","生箔空辊点"),
+ CUT_EMPTY_ROLLER_POINT("2","分切空辊点"),
+ RAW_FOIL_EMPTY_ROLLER_WAIT_POINT("3","生箔空辊等待点"),
+ CUT_EMPTY_ROLLER_POINT_WAIT_POINT("4","分切空辊等待点");
+
+
+ private String code;
+
+ private String name;
+
+ EmptyRollerPointTypeEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+}
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 91130ae3..0dbab9ae 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
@@ -10,6 +10,10 @@ public interface ErrorCodeConstants {
// ========== 生箔点位库存 ==========
ErrorCode RAW_FOIL_POINT_IVT_NOT_EXISTS = new ErrorCode(1, "生箔点位库存不存在");
+ ErrorCode IVT_CUTPOINTIVT_NOT_EXISTS = new ErrorCode(2, "分切设备点位不存在");
+
+ ErrorCode IVT_SHAFTTUBEIVT_NOT_EXISTS = new ErrorCode(3, "穿拔轴点位不存在");
+
// ========== 生箔工序工单 ==========
ErrorCode RAW_FOIL_WORK_ORDER_NOT_EXISTS = new ErrorCode(2, "生箔工序工单不存在");
@@ -17,6 +21,29 @@ 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 RAW_FOIL_WORK_ORDER_STATUS_NOT_START = new ErrorCode(7, "工单状态不为开始");
+ ErrorCode RAW_FOIL_WORK_ORDER_POINT_CODE_NOT_USED = new ErrorCode(8, "生箔设备未启用");
+ ErrorCode RAW_FOIL_WORK_ORDER_POINT_OCCUPIED = new ErrorCode(12, "点位:{}被占用");
+ ErrorCode RAW_FOIL_WORK_ORDER_FAIL = new ErrorCode(15, "获取生箔工单存在未完成的任务异常");
+ ErrorCode RAW_FOIL_WORK_ORDER_NOT_SELECT = new ErrorCode(16, "生箔工单存在未完成的任务,请先完成任务");
+
+ // ========== 空辊缓存位 ==========
+ ErrorCode RAW_FOIL_EMPTY_ROLLER_CASHE_POSITION_NOT_EXISTS = new ErrorCode(9, "空辊缓存位不存在");
+ ErrorCode EMPTY_ROLLER_CASHE_POSITION_WAIT_POINT_NOT_EXISTS = new ErrorCode(10, "空辊缓存位找不到等待点");
+ ErrorCode EMPTY_ROLLER_CASHE_POSITION_NOT_ALLOCATE = new ErrorCode(18, "未查询到有空辊缓存位");
+
+ // ========== 生箔母卷缓存位 ==========
+ ErrorCode RAW_FOIL_CASHE_POSITION_NOT_EXISTS = new ErrorCode(11, "生箔母卷缓存位不存在");
+ ErrorCode RAW_FOIL_CASHE_POSITION_NOT_SELECT = new ErrorCode(13, "未查询到有生箔母卷缓存位");
+ ErrorCode RAW_FOIL_TRANSPORT_TASK_CREATE_FAIL = new ErrorCode(14, "创建搬运任务失败");
+
+ // =========== 生箔任务 ==========
+ ErrorCode RAW_FOIL_TASK_ERROR = new ErrorCode(17, "任务不存在或查询失败");
+
+ // ========== 生箔称重完成入库 ==========
+ ErrorCode RAW_FOIL_WORK_ORDER_STATUS_NOT_EXECUTION = new ErrorCode(19, "生箔工序工单状态不为执行中");
+ ErrorCode RAW_FOIL_WEIGHING_POSITION_NOT_EXISTS = new ErrorCode(20, "称重位不存在");
+ ErrorCode RAW_FOIL_CONTAINER_NOT_ON_WEIGHING_POSITION = new ErrorCode(21, "母卷不在称重位");
// ========== 装箱区点位库存 ==========
ErrorCode PACKAGE_POINT_NOT_EXISTS = new ErrorCode(200001, "装箱区点位库存不存在");
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/LockStatusEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/LockStatusEnum.java
new file mode 100644
index 00000000..8d09a040
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/LockStatusEnum.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.lms.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/7/30
+ */
+@Getter
+public enum LockStatusEnum {
+
+ IDLE("0","空闲"),
+ OCCUPIED("1","占用");
+
+
+ private String code;
+
+ private String name;
+
+ LockStatusEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+}
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilCashePositionTypeEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilCashePositionTypeEnum.java
new file mode 100644
index 00000000..501326c2
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilCashePositionTypeEnum.java
@@ -0,0 +1,27 @@
+package cn.code.nl.module.lms.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/7/28
+ */
+@Getter
+public enum RawFoilCashePositionTypeEnum {
+
+ CONVENTIONAL("1","常规"),
+ WEIGHING_BUFFER_POSITION("2","称重缓存位"),
+ WEIGHING_POSITION("3","称重位");
+
+
+ private String code;
+
+ private String name;
+
+ RawFoilCashePositionTypeEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+
+
+}
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilHandleCodeConstants.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilHandleCodeConstants.java
new file mode 100644
index 00000000..44cd7035
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilHandleCodeConstants.java
@@ -0,0 +1,14 @@
+package cn.code.nl.module.lms.enums;
+
+/**
+ * 生箔工序任务回调处理器编码常量
+ * @author dsh
+ * 2026/7/28
+ */
+public interface RawFoilHandleCodeConstants {
+
+ String RAW_FOIL_TASK = "rawFoilTask";
+
+ /** 生箔入库任务(称重完成 → 常规缓存位)回调处理器编码 */
+ String RAW_FOIL_INSTORAGE_TASK = "rawFoilInstorageTask";
+}
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilWorkOrderStatusEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilWorkOrderStatusEnum.java
index 6e64e4b2..c3cbcb12 100644
--- a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilWorkOrderStatusEnum.java
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/RawFoilWorkOrderStatusEnum.java
@@ -11,9 +11,7 @@ import lombok.Getter;
public enum RawFoilWorkOrderStatusEnum {
START("01","开始"),
- EMPTY_OUT("02","空轴搬出"),
- CONFIRM_VOLUME("03","确认下卷"),
- VOLUME_COMPLETE("04","下卷完成"),
+ EXECUTION("02","执行中"),
END("09","结束");
diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/StockStatusEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/StockStatusEnum.java
new file mode 100644
index 00000000..654d75e1
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/StockStatusEnum.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.lms.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/8/4
+ */
+@Getter
+public enum StockStatusEnum {
+
+ YES("1","有货"),
+ NO("2","无货");
+
+
+ private String code;
+
+ private String name;
+
+ StockStatusEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+}
diff --git a/nl-module-lms/nl-module-lms-server/pom.xml b/nl-module-lms/nl-module-lms-server/pom.xml
index 856cdea8..19c1f7cc 100644
--- a/nl-module-lms/nl-module-lms-server/pom.xml
+++ b/nl-module-lms/nl-module-lms-server/pom.xml
@@ -121,6 +121,19 @@
cn.nl.cloud
nl-spring-boot-starter-monitor
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.mockito
+ mockito-core
+
+
+
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/AcsToLmsController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/AcsToLmsController.java
new file mode 100644
index 00000000..84ebd4ab
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/AcsToLmsController.java
@@ -0,0 +1,36 @@
+package cn.code.nl.module.lms.controller.acs;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.module.lms.controller.acs.vo.WeighingCompleteReqVO;
+import cn.code.nl.module.lms.service.acs.AcsToLmsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author dsh
+ * 2026/8/4
+ */
+@Tag(name = "管理后台 - ACS上报LMS")
+@RestController
+@RequestMapping("api/lms/task")
+@Validated
+public class AcsToLmsController {
+
+ @Resource
+ private AcsToLmsService acsToLmsService;
+
+
+ @PostMapping("/apply")
+ @Operation(summary = "ACS上报称重完成")
+ public CommonResult weighingComplete(@Valid @RequestBody WeighingCompleteReqVO weighingCompleteReqVO) {
+ acsToLmsService.weighingComplete(weighingCompleteReqVO);
+ return CommonResult.success(null);
+ }
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/vo/WeighingCompleteReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/vo/WeighingCompleteReqVO.java
new file mode 100644
index 00000000..b7e97290
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/acs/vo/WeighingCompleteReqVO.java
@@ -0,0 +1,25 @@
+package cn.code.nl.module.lms.controller.acs.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author dsh
+ * 2026/8/4
+ */
+@Data
+public class WeighingCompleteReqVO {
+
+ @Schema(description = "母卷号")
+ @NotNull(message = "母卷号不能为空")
+ private String containerName;
+
+ @Schema(description = "重量")
+ @NotNull(message = "重量不能为空")
+ private BigDecimal productWeight;
+
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/BtIvtCutpointivtController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/BtIvtCutpointivtController.java
new file mode 100644
index 00000000..5fbb8ab0
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/BtIvtCutpointivtController.java
@@ -0,0 +1,105 @@
+package cn.code.nl.module.lms.controller.admin.btcutpointivt;
+
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtRespVO;
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.btivtcutpointivt.BtIvtCutpointivtDO;
+import cn.code.nl.module.lms.service.ivtcutpointivt.BtIvtCutpointivtService;
+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.*;
+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.*;
+
+
+@Tag(name = "管理后台 - 分切区缓存点位库存")
+@RestController
+@RequestMapping("/btcutpointivt/ivt-cutpointivt")
+@Validated
+public class BtIvtCutpointivtController {
+
+ @Resource
+ private BtIvtCutpointivtService ivtCutpointivtService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分切区缓存点位库存")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:create')")
+ public CommonResult createIvtCutpointivt(@Valid @RequestBody BtIvtCutpointivtSaveReqVO createReqVO) {
+ return success(ivtCutpointivtService.createIvtCutpointivt(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分切区缓存点位库存")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:update')")
+ public CommonResult updateIvtCutpointivt(@Valid @RequestBody BtIvtCutpointivtSaveReqVO updateReqVO) {
+ ivtCutpointivtService.updateIvtCutpointivt(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分切区缓存点位库存")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:delete')")
+ public CommonResult deleteIvtCutpointivt(@RequestParam("id") Long id) {
+ ivtCutpointivtService.deleteIvtCutpointivt(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除分切区缓存点位库存")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:delete')")
+ public CommonResult deleteIvtCutpointivtList(@RequestParam("ids") List ids) {
+ ivtCutpointivtService.deleteIvtCutpointivtListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分切区缓存点位库存")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:query')")
+ public CommonResult getIvtCutpointivt(@RequestParam("id") Long id) {
+ BtIvtCutpointivtDO ivtCutpointivt = ivtCutpointivtService.getIvtCutpointivt(id);
+ return success(BeanUtils.toBean(ivtCutpointivt, BtIvtCutpointivtRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分切区缓存点位库存分页")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:query')")
+ public CommonResult> getIvtCutpointivtPage(@Valid BtIvtCutpointivtPageReqVO pageReqVO) {
+ PageResult pageResult = ivtCutpointivtService.getIvtCutpointivtPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BtIvtCutpointivtRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分切区缓存点位库存 Excel")
+ @PreAuthorize("@ss.hasPermission('btcutpointivt:ivt-cutpointivt:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportIvtCutpointivtExcel(@Valid BtIvtCutpointivtPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = ivtCutpointivtService.getIvtCutpointivtPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分切区缓存点位库存.xls", "数据", BtIvtCutpointivtRespVO.class,
+ BeanUtils.toBean(list, BtIvtCutpointivtRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtPageReqVO.java
new file mode 100644
index 00000000..f8a28159
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.code.nl.module.lms.controller.admin.btcutpointivt.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import static cn.code.nl.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分切区缓存点位库存分页 Request VO")
+@Data
+public class BtIvtCutpointivtPageReqVO extends PageParam {
+
+ @Schema(description = "id")
+ private Long ivtId;
+
+ @Schema(description = "AGV点位编码")
+ private String pointCode;
+
+ @Schema(description = "点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位", example = "2")
+ private String pointType;
+
+ @Schema(description = "生产区域")
+ private String productArea;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] createTime;
+
+ @Schema(description = "点位状态", example = "2")
+ private String pointStatus;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtRespVO.java
new file mode 100644
index 00000000..a48fced1
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtRespVO.java
@@ -0,0 +1,92 @@
+package cn.code.nl.module.lms.controller.admin.btcutpointivt.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 分切区缓存点位库存 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BtIvtCutpointivtRespVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "16196")
+ @ExcelProperty("库存记录标识")
+ private Long ivtId;
+
+ @Schema(description = "AGV点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("AGV点位编码")
+ private String pointCode;
+
+ @Schema(description = "AGV点位名称", example = "芋艿")
+ @ExcelProperty("AGV点位名称")
+ private String pointName;
+
+ @Schema(description = "桁架点位编码1 ", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("桁架点位编码1 ")
+ private String trussPointCode1;
+
+ @Schema(description = "桁架点位编码2", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("桁架点位编码2")
+ private String trussPointCode2;
+
+ @Schema(description = "气胀轴编码1")
+ @ExcelProperty("气胀轴编码1")
+ private String qzzNo1;
+
+ @Schema(description = "气胀轴编码2")
+ @ExcelProperty("气胀轴编码2")
+ private String qzzNo2;
+
+ @Schema(description = "上轴管芯")
+ @ExcelProperty("上轴管芯")
+ private String upGx;
+
+ @Schema(description = "下轴管芯")
+ @ExcelProperty("下轴管芯")
+ private String downGx;
+
+ @Schema(description = "点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位", example = "2")
+ @ExcelProperty("点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位")
+ private String pointType;
+
+ @Schema(description = "生产区域")
+ @ExcelProperty("生产区域")
+ private String productArea;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16464")
+ @ExcelProperty("创建人")
+ private String createId;
+
+ @Schema(description = "创建人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+ @ExcelProperty("创建人姓名")
+ private String createName;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private String createTime;
+
+ @Schema(description = "修改人", example = "1014")
+ @ExcelProperty("修改人")
+ private String updateOptid;
+
+ @Schema(description = "修改人姓名", example = "芋艿")
+ @ExcelProperty("修改人姓名")
+ private String updateOptname;
+
+ @Schema(description = "点位状态", example = "2")
+ @ExcelProperty("点位状态")
+ private String pointStatus;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtSaveReqVO.java
new file mode 100644
index 00000000..a056f5c2
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/btcutpointivt/vo/BtIvtCutpointivtSaveReqVO.java
@@ -0,0 +1,62 @@
+package cn.code.nl.module.lms.controller.admin.btcutpointivt.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 分切区缓存点位库存新增/修改 Request VO")
+@Data
+public class BtIvtCutpointivtSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "id不能为空")
+ private Long ivtId;
+
+ @Schema(description = "AGV点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "AGV点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "AGV点位名称", example = "芋艿")
+ private String pointName;
+
+ @Schema(description = "桁架点位编码1 ", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "桁架点位编码1 不能为空")
+ private String trussPointCode1;
+
+ @Schema(description = "桁架点位编码2", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "桁架点位编码2不能为空")
+ private String trussPointCode2;
+
+ @Schema(description = "气胀轴编码1")
+ private String qzzNo1;
+
+ @Schema(description = "气胀轴编码2")
+ private String qzzNo2;
+
+ @Schema(description = "上轴管芯")
+ private String upGx;
+
+ @Schema(description = "下轴管芯")
+ private String downGx;
+
+ @Schema(description = "点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位", example = "2")
+ private String pointType;
+
+ @Schema(description = "生产区域")
+ private String productArea;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "顺序号不能为空")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+ @Schema(description = "点位状态", example = "2")
+ private String pointStatus;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/IvtCutpointivtController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/IvtCutpointivtController.java
new file mode 100644
index 00000000..81edaaa2
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/IvtCutpointivtController.java
@@ -0,0 +1,104 @@
+package cn.code.nl.module.lms.controller.admin.cutpointivt;
+
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtRespVO;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.cutpointIvt.IvtCutpointivtDO;
+import cn.code.nl.module.lms.service.cutpointIvt.IvtCutpointivtService;
+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.*;
+@Tag(name = "管理后台 - 分切区点位库存")
+@RestController
+@RequestMapping("/cutpointivt/ivt-cutpointivt")
+@Validated
+public class IvtCutpointivtController {
+
+ @Resource
+ private IvtCutpointivtService ivtCutpointivtService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建分切区点位库存")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:create')")
+ public CommonResult createIvtCutpointivt(@Valid @RequestBody IvtCutpointivtSaveReqVO createReqVO) {
+ return success(ivtCutpointivtService.createIvtCutpointivt(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新分切区点位库存")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:update')")
+ public CommonResult updateIvtCutpointivt(@Valid @RequestBody IvtCutpointivtSaveReqVO updateReqVO) {
+ ivtCutpointivtService.updateIvtCutpointivt(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除分切区点位库存")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:delete')")
+ public CommonResult deleteIvtCutpointivt(@RequestParam("id") Long id) {
+ ivtCutpointivtService.deleteIvtCutpointivt(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除分切区点位库存")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:delete')")
+ public CommonResult deleteIvtCutpointivtList(@RequestParam("ids") List ids) {
+ ivtCutpointivtService.deleteIvtCutpointivtListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得分切区点位库存")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:query')")
+ public CommonResult getIvtCutpointivt(@RequestParam("id") Long id) {
+ IvtCutpointivtDO ivtCutpointivt = ivtCutpointivtService.getIvtCutpointivt(id);
+ return success(BeanUtils.toBean(ivtCutpointivt, IvtCutpointivtRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得分切区点位库存分页")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:query')")
+ public CommonResult> getIvtCutpointivtPage(@Valid IvtCutpointivtPageReqVO pageReqVO) {
+ PageResult pageResult = ivtCutpointivtService.getIvtCutpointivtPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, IvtCutpointivtRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分切区点位库存 Excel")
+ @PreAuthorize("@ss.hasPermission('cutpointivt:ivt-cutpointivt:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportIvtCutpointivtExcel(@Valid IvtCutpointivtPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = ivtCutpointivtService.getIvtCutpointivtPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "分切区点位库存.xls", "数据", IvtCutpointivtRespVO.class,
+ BeanUtils.toBean(list, IvtCutpointivtRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtPageReqVO.java
new file mode 100644
index 00000000..f6948ede
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtPageReqVO.java
@@ -0,0 +1,27 @@
+package cn.code.nl.module.lms.controller.admin.cutpointivt.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+@Schema(description = "管理后台 - 分切区点位库存分页 Request VO")
+@Data
+public class IvtCutpointivtPageReqVO extends PageParam {
+
+ @Schema(description = "点位编码")
+ private String pointCode;
+
+ @Schema(description = "满轴位状态", example = "1")
+ private String fullPointStatus;
+
+ @Schema(description = "空轴位状态", example = "1")
+ private String emptyPointStatus;
+
+ @Schema(description = "生产区域")
+ private String productArea;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtRespVO.java
new file mode 100644
index 00000000..98e10979
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtRespVO.java
@@ -0,0 +1,117 @@
+package cn.code.nl.module.lms.controller.admin.cutpointivt.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 分切区点位库存 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IvtCutpointivtRespVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "12268")
+ @ExcelProperty("库存记录标识")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("点位编码")
+ private String pointCode;
+
+ @Schema(description = "满轴位编码")
+ @ExcelProperty("满轴位编码")
+ private String fullPointCode;
+
+ @Schema(description = "满轴位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("满轴位状态")
+ private String fullPointStatus;
+
+ @Schema(description = "母卷号", example = "芋艿")
+ @ExcelProperty("母卷号")
+ private String containerName;
+
+ @Schema(description = "母卷轴编码")
+ @ExcelProperty("母卷轴编码")
+ private String fullVehicleCode;
+
+ @Schema(description = "空轴位编码")
+ @ExcelProperty("空轴位编码")
+ private String emptyPointCode;
+
+ @Schema(description = "空轴位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("空轴位状态")
+ private String emptyPointStatus;
+
+ @Schema(description = "空轴编码")
+ @ExcelProperty("空轴编码")
+ private String emptyVehicleCode;
+
+ @Schema(description = "生产区域")
+ @ExcelProperty("生产区域")
+ private String productArea;
+
+ @Schema(description = "位置")
+ @ExcelProperty("位置")
+ private String pointLocation;
+
+ @Schema(description = "分切下料位上轴点位")
+ @ExcelProperty("分切下料位上轴点位")
+ private String upPointCode;
+
+ @Schema(description = "分切下料位下轴点位")
+ @ExcelProperty("分切下料位下轴点位")
+ private String downPointCode;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "3118")
+ @ExcelProperty("创建人")
+ private Long createId;
+
+ @Schema(description = "创建人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+ @ExcelProperty("创建人姓名")
+ private String createName;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private String createTime;
+
+ @Schema(description = "修改人", example = "3176")
+ @ExcelProperty("修改人")
+ private Long updateOptid;
+
+ @Schema(description = "修改人姓名", example = "赵六")
+ @ExcelProperty("修改人姓名")
+ private String updateOptname;
+
+ @Schema(description = "规划")
+ @ExcelProperty("规划")
+ private String plan;
+
+ @Schema(description = "对应MES系统设备编码")
+ @ExcelProperty("对应MES系统设备编码")
+ private String extCode;
+
+ @Schema(description = "分切下料位上轴")
+ @ExcelProperty("分切下料位上轴")
+ private String upQzzno;
+
+ @Schema(description = "分切下料位下轴")
+ @ExcelProperty("分切下料位下轴")
+ private String downQzzno;
+
+ @Schema(description = "气胀轴代数")
+ @ExcelProperty("气胀轴代数")
+ private String qzzGeneration;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtSaveReqVO.java
new file mode 100644
index 00000000..35cd34d8
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/cutpointivt/vo/IvtCutpointivtSaveReqVO.java
@@ -0,0 +1,95 @@
+package cn.code.nl.module.lms.controller.admin.cutpointivt.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 IvtCutpointivtSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "id不能为空")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "满轴位编码")
+ private String fullPointCode;
+
+ @Schema(description = "满轴位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "满轴位状态不能为空")
+ private String fullPointStatus;
+
+ @Schema(description = "母卷号", example = "芋艿")
+ private String containerName;
+
+ @Schema(description = "母卷轴编码")
+ private String fullVehicleCode;
+
+ @Schema(description = "空轴位编码")
+ private String emptyPointCode;
+
+ @Schema(description = "空轴位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "空轴位状态不能为空")
+ private String emptyPointStatus;
+
+ @Schema(description = "空轴编码")
+ private String emptyVehicleCode;
+
+ @Schema(description = "生产区域")
+ private String productArea;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "分切下料位上轴点位")
+ private String upPointCode;
+
+ @Schema(description = "分切下料位下轴点位")
+ private String downPointCode;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "顺序号不能为空")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "3118")
+ @NotNull(message = "创建人不能为空")
+ private Long createId;
+
+ @Schema(description = "创建人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+ @NotEmpty(message = "创建人姓名不能为空")
+ private String createName;
+
+ @Schema(description = "修改人", example = "3176")
+ private Long updateOptid;
+
+ @Schema(description = "修改人姓名", example = "赵六")
+ private String updateOptname;
+
+ @Schema(description = "规划")
+ private String plan;
+
+ @Schema(description = "对应MES系统设备编码")
+ private String extCode;
+
+ @Schema(description = "分切下料位上轴")
+ private String upQzzno;
+
+ @Schema(description = "分切下料位下轴")
+ private String downQzzno;
+
+ @Schema(description = "气胀轴代数")
+ private String qzzGeneration;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/IvtShafttubeivtController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/IvtShafttubeivtController.java
new file mode 100644
index 00000000..bc2259a7
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/IvtShafttubeivtController.java
@@ -0,0 +1,107 @@
+package cn.code.nl.module.lms.controller.admin.ivtshafttubeivt;
+
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtRespVO;
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.ivtshafttubeivt.IvtShafttubeivtDO;
+import cn.code.nl.module.lms.service.ivtshafttubeivt.IvtShafttubeivtService;
+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.*;
+
+
+
+@Tag(name = "管理后台 - 穿拔轴区点位库存")
+@RestController
+@RequestMapping("/ivtshafttubeivt/ivt-shafttubeivt")
+@Validated
+public class IvtShafttubeivtController {
+
+ @Resource
+ private IvtShafttubeivtService ivtShafttubeivtService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建穿拔轴区点位库存")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:create')")
+ public CommonResult createIvtShafttubeivt(@Valid @RequestBody IvtShafttubeivtSaveReqVO createReqVO) {
+ return success(ivtShafttubeivtService.createIvtShafttubeivt(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新穿拔轴区点位库存")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:update')")
+ public CommonResult updateIvtShafttubeivt(@Valid @RequestBody IvtShafttubeivtSaveReqVO updateReqVO) {
+ ivtShafttubeivtService.updateIvtShafttubeivt(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除穿拔轴区点位库存")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:delete')")
+ public CommonResult deleteIvtShafttubeivt(@RequestParam("id") Long id) {
+ ivtShafttubeivtService.deleteIvtShafttubeivt(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除穿拔轴区点位库存")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:delete')")
+ public CommonResult deleteIvtShafttubeivtList(@RequestParam("ids") List ids) {
+ ivtShafttubeivtService.deleteIvtShafttubeivtListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得穿拔轴区点位库存")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:query')")
+ public CommonResult getIvtShafttubeivt(@RequestParam("id") Long id) {
+ IvtShafttubeivtDO ivtShafttubeivt = ivtShafttubeivtService.getIvtShafttubeivt(id);
+ return success(BeanUtils.toBean(ivtShafttubeivt, IvtShafttubeivtRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得穿拔轴区点位库存分页")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:query')")
+ public CommonResult> getIvtShafttubeivtPage(@Valid IvtShafttubeivtPageReqVO pageReqVO) {
+ PageResult pageResult = ivtShafttubeivtService.getIvtShafttubeivtPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, IvtShafttubeivtRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出穿拔轴区点位库存 Excel")
+ @PreAuthorize("@ss.hasPermission('ivtshafttubeivt:ivt-shafttubeivt:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportIvtShafttubeivtExcel(@Valid IvtShafttubeivtPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = ivtShafttubeivtService.getIvtShafttubeivtPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "穿拔轴区点位库存.xls", "数据", IvtShafttubeivtRespVO.class,
+ BeanUtils.toBean(list, IvtShafttubeivtRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtPageReqVO.java
new file mode 100644
index 00000000..934f6046
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtPageReqVO.java
@@ -0,0 +1,22 @@
+package cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+@Schema(description = "管理后台 - 穿拔轴区点位库存分页 Request VO")
+@Data
+public class IvtShafttubeivtPageReqVO extends PageParam {
+
+ @Schema(description = "id")
+ private Long ivtId;
+
+ @Schema(description = "点位编码")
+ private String pointCode;
+
+ @Schema(description = "点位类型", example = "2")
+ private String pointType;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtRespVO.java
new file mode 100644
index 00000000..cda9c4e1
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtRespVO.java
@@ -0,0 +1,93 @@
+package cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 穿拔轴区点位库存 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IvtShafttubeivtRespVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "15458")
+ @ExcelProperty("库存记录标识")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("点位编码")
+ private String pointCode;
+
+ @Schema(description = "点位名称", example = "赵六")
+ @ExcelProperty("点位名称")
+ private String pointName;
+
+ @Schema(description = "气涨轴尺寸")
+ @ExcelProperty("气涨轴尺寸")
+ private String qzzSize;
+
+ @Schema(description = "气涨轴代数")
+ @ExcelProperty("气涨轴代数")
+ private String qzzGeneration;
+
+ @Schema(description = "纸管编码")
+ @ExcelProperty("纸管编码")
+ private String tubeCode;
+
+ @Schema(description = "纸管描述", example = "赵六")
+ @ExcelProperty("纸管描述")
+ private String tubeName;
+
+ @Schema(description = "子卷号", example = "李四")
+ @ExcelProperty("子卷号")
+ private String containerName;
+
+ @Schema(description = "点位类型", example = "2")
+ @ExcelProperty("点位类型")
+ private String pointType;
+
+ @Schema(description = "位置")
+ @ExcelProperty("位置")
+ private String pointLocation;
+
+ @Schema(description = "是否有轴")
+ @ExcelProperty("是否有轴")
+ private String haveQzz;
+
+ @Schema(description = "是否启用")
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "顺序号")
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "7598")
+ @ExcelProperty("创建人")
+ private String createId;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @ExcelProperty("创建人")
+ private String createName;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private String createTime;
+
+ @Schema(description = "修改人", example = "1720")
+ @ExcelProperty("修改人")
+ private String updateOptid;
+
+ @Schema(description = "修改人", example = "李四")
+ @ExcelProperty("修改人")
+ private String updateOptname;
+
+ @Schema(description = "规划")
+ @ExcelProperty("规划")
+ private String plan;
+
+ @Schema(description = "关联点位")
+ @ExcelProperty("关联点位")
+ private String parentCode;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtSaveReqVO.java
new file mode 100644
index 00000000..0f37ed13
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/ivtshafttubeivt/vo/IvtShafttubeivtSaveReqVO.java
@@ -0,0 +1,59 @@
+package cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.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 IvtShafttubeivtSaveReqVO {
+
+ @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "id不能为空")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "点位名称", example = "赵六")
+ private String pointName;
+
+ @Schema(description = "气涨轴尺寸")
+ private String qzzSize;
+
+ @Schema(description = "气涨轴代数")
+ private String qzzGeneration;
+
+ @Schema(description = "纸管编码")
+ private String tubeCode;
+
+ @Schema(description = "纸管描述", example = "赵六")
+ private String tubeName;
+
+ @Schema(description = "子卷号", example = "李四")
+ private String containerName;
+
+ @Schema(description = "点位类型", example = "2")
+ private String pointType;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "是否有轴")
+ private String haveQzz;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "规划")
+ private String plan;
+
+ @Schema(description = "关联点位")
+ private String parentCode;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/RawFoilCashePositionController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/RawFoilCashePositionController.java
new file mode 100644
index 00000000..413f4474
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/RawFoilCashePositionController.java
@@ -0,0 +1,104 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilcasheposition;
+
+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.rawfoilcasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.service.rawfoilcasheposition.RawFoilCashePositionService;
+
+@Tag(name = "管理后台 - 生箔母卷缓存位")
+@RestController
+@RequestMapping("/lms/raw-foil-cashe-position")
+@Validated
+public class RawFoilCashePositionController {
+
+ @Resource
+ private RawFoilCashePositionService rawFoilCashePositionService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建生箔母卷缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:create')")
+ public CommonResult createRawFoilCashePosition(@Valid @RequestBody RawFoilCashePositionSaveReqVO createReqVO) {
+ return success(rawFoilCashePositionService.createRawFoilCashePosition(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新生箔母卷缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:update')")
+ public CommonResult updateRawFoilCashePosition(@Valid @RequestBody RawFoilCashePositionSaveReqVO updateReqVO) {
+ rawFoilCashePositionService.updateRawFoilCashePosition(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除生箔母卷缓存位")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:delete')")
+ public CommonResult deleteRawFoilCashePosition(@RequestParam("id") Long id) {
+ rawFoilCashePositionService.deleteRawFoilCashePosition(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除生箔母卷缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:delete')")
+ public CommonResult deleteRawFoilCashePositionList(@RequestParam("ids") List ids) {
+ rawFoilCashePositionService.deleteRawFoilCashePositionListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得生箔母卷缓存位")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:query')")
+ public CommonResult getRawFoilCashePosition(@RequestParam("id") Long id) {
+ RawFoilCashePositionDO rawFoilCashePosition = rawFoilCashePositionService.getRawFoilCashePosition(id);
+ return success(BeanUtils.toBean(rawFoilCashePosition, RawFoilCashePositionRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得生箔母卷缓存位分页")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:query')")
+ public CommonResult> getRawFoilCashePositionPage(@Valid RawFoilCashePositionPageReqVO pageReqVO) {
+ PageResult pageResult = rawFoilCashePositionService.getRawFoilCashePositionPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, RawFoilCashePositionRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出生箔母卷缓存位 Excel")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-cashe-position:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportRawFoilCashePositionExcel(@Valid RawFoilCashePositionPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = rawFoilCashePositionService.getRawFoilCashePositionPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "生箔母卷缓存位.xls", "数据", RawFoilCashePositionRespVO.class,
+ BeanUtils.toBean(list, RawFoilCashePositionRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionPageReqVO.java
new file mode 100644
index 00000000..524875a6
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionPageReqVO.java
@@ -0,0 +1,35 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.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 RawFoilCashePositionPageReqVO extends PageParam {
+
+ @Schema(description = "点位编码")
+ private String pointCode;
+
+ @Schema(description = "母卷号", example = "王五")
+ private String containerName;
+
+ @Schema(description = "入库时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] instorageTime;
+
+ @Schema(description = "生产区域")
+ private String productionArea;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "库存状态", example = "1")
+ private String coolIvtStatus;
+
+}
\ 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/rawfoilcasheposition/vo/RawFoilCashePositionRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionRespVO.java
new file mode 100644
index 00000000..ef236200
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionRespVO.java
@@ -0,0 +1,87 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 生箔母卷缓存位 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RawFoilCashePositionRespVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "30894")
+ @ExcelProperty("库存记录标识")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("点位编码")
+ private String pointCode;
+
+ @Schema(description = "母卷号", example = "王五")
+ @ExcelProperty("母卷号")
+ private String containerName;
+
+ @Schema(description = "母卷工单标识", example = "13519")
+ @ExcelProperty("母卷工单标识")
+ private String workorderId;
+
+ @Schema(description = "母卷轴编码")
+ @ExcelProperty("母卷轴编码")
+ private String fullVehicleCode;
+
+ @Schema(description = "入库时间")
+ @ExcelProperty("入库时间")
+ private LocalDateTime instorageTime;
+
+ @Schema(description = "生产区域")
+ @ExcelProperty("生产区域")
+ private String productionArea;
+
+ @Schema(description = "位置")
+ @ExcelProperty("位置")
+ private String pointLocation;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建人")
+ private String creator;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private String createTime;
+
+ @Schema(description = "修改人")
+ @ExcelProperty("修改人")
+ private String updater;
+
+ @Schema(description = "修改时间")
+ @ExcelProperty("修改时间")
+ private String updateTime;
+
+ @Schema(description = "库存状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("库存状态")
+ private String coolIvtStatus;
+
+ @Schema(description = "点位类型", example = "2")
+ @ExcelProperty("点位类型")
+ private String pointType;
+
+ @Schema(description = "是否删除", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否删除")
+ private String deleted;
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionSaveReqVO.java
new file mode 100644
index 00000000..0f9387ce
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilcasheposition/vo/RawFoilCashePositionSaveReqVO.java
@@ -0,0 +1,57 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 生箔母卷缓存位新增/修改 Request VO")
+@Data
+public class RawFoilCashePositionSaveReqVO {
+
+ @Schema(description = "库存记录标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "30894")
+ private Long ivtId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "母卷号", example = "王五")
+ private String containerName;
+
+ @Schema(description = "母卷工单标识", example = "13519")
+ private String workorderId;
+
+ @Schema(description = "母卷轴编码")
+ private String fullVehicleCode;
+
+ @Schema(description = "入库时间")
+ private LocalDateTime instorageTime;
+
+ @Schema(description = "生产区域")
+ private String productionArea;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "顺序号不能为空")
+ private Integer sortSeq;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "库存状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "库存状态不能为空")
+ private String coolIvtStatus;
+
+ @Schema(description = "点位类型", example = "2")
+ private String pointType;
+
+}
\ 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/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionController.java
new file mode 100644
index 00000000..3889dc60
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionController.java
@@ -0,0 +1,104 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition;
+
+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.rawfoilemptyrollercasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+import cn.code.nl.module.lms.service.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionService;
+
+@Tag(name = "管理后台 - 空辊缓存位")
+@RestController
+@RequestMapping("/lms/raw-foil-empty-roller-cashe-position")
+@Validated
+public class RawFoilEmptyRollerCashePositionController {
+
+ @Resource
+ private RawFoilEmptyRollerCashePositionService rawFoilEmptyRollerCashePositionService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建空辊缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:create')")
+ public CommonResult createRawFoilEmptyRollerCashePosition(@Valid @RequestBody RawFoilEmptyRollerCashePositionSaveReqVO createReqVO) {
+ return success(rawFoilEmptyRollerCashePositionService.createRawFoilEmptyRollerCashePosition(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新空辊缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:update')")
+ public CommonResult updateRawFoilEmptyRollerCashePosition(@Valid @RequestBody RawFoilEmptyRollerCashePositionSaveReqVO updateReqVO) {
+ rawFoilEmptyRollerCashePositionService.updateRawFoilEmptyRollerCashePosition(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除空辊缓存位")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:delete')")
+ public CommonResult deleteRawFoilEmptyRollerCashePosition(@RequestParam("id") Long id) {
+ rawFoilEmptyRollerCashePositionService.deleteRawFoilEmptyRollerCashePosition(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除空辊缓存位")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:delete')")
+ public CommonResult deleteRawFoilEmptyRollerCashePositionList(@RequestParam("ids") List ids) {
+ rawFoilEmptyRollerCashePositionService.deleteRawFoilEmptyRollerCashePositionListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得空辊缓存位")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:query')")
+ public CommonResult getRawFoilEmptyRollerCashePosition(@RequestParam("id") Long id) {
+ RawFoilEmptyRollerCashePositionDO rawFoilEmptyRollerCashePosition = rawFoilEmptyRollerCashePositionService.getRawFoilEmptyRollerCashePosition(id);
+ return success(BeanUtils.toBean(rawFoilEmptyRollerCashePosition, RawFoilEmptyRollerCashePositionRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得空辊缓存位分页")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:query')")
+ public CommonResult> getRawFoilEmptyRollerCashePositionPage(@Valid RawFoilEmptyRollerCashePositionPageReqVO pageReqVO) {
+ PageResult pageResult = rawFoilEmptyRollerCashePositionService.getRawFoilEmptyRollerCashePositionPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, RawFoilEmptyRollerCashePositionRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出空辊缓存位 Excel")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-empty-roller-cashe-position:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportRawFoilEmptyRollerCashePositionExcel(@Valid RawFoilEmptyRollerCashePositionPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = rawFoilEmptyRollerCashePositionService.getRawFoilEmptyRollerCashePositionPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "空辊缓存位.xls", "数据", RawFoilEmptyRollerCashePositionRespVO.class,
+ BeanUtils.toBean(list, RawFoilEmptyRollerCashePositionRespVO.class));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionPageReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionPageReqVO.java
new file mode 100644
index 00000000..ee9c0ede
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionPageReqVO.java
@@ -0,0 +1,25 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 空辊缓存位分页 Request VO")
+@Data
+public class RawFoilEmptyRollerCashePositionPageReqVO extends PageParam {
+
+ @Schema(description = "点位编码")
+ private String pointCode;
+
+ @Schema(description = "生产区域")
+ private String productionArea;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "是否有货")
+ private String hasStock;
+
+}
\ 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/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionRespVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionRespVO.java
new file mode 100644
index 00000000..180ec7e8
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionRespVO.java
@@ -0,0 +1,61 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 空辊缓存位 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RawFoilEmptyRollerCashePositionRespVO {
+
+ @Schema(description = "点位标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1242")
+ @ExcelProperty("点位标识")
+ private Long pointId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("点位编码")
+ private String pointCode;
+
+ @Schema(description = "载具编码")
+ @ExcelProperty("载具编码")
+ private String vehicleCode;
+
+ @Schema(description = "生产区域")
+ @ExcelProperty("生产区域")
+ private String productionArea;
+
+ @Schema(description = "位置")
+ @ExcelProperty("位置")
+ private String pointLocation;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "修改时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("修改时间")
+ private String updateTime;
+
+ @Schema(description = "重量")
+ @ExcelProperty("重量")
+ private BigDecimal weight;
+
+ @Schema(description = "是否有货", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否有货")
+ private String hasStock;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("顺序号")
+ private Integer sortSeq;
+
+ @Schema(description = "点位类型")
+ @ExcelProperty("点位类型")
+ private String pointType;
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionSaveReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionSaveReqVO.java
new file mode 100644
index 00000000..0920357d
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/admin/rawfoilemptyrollercasheposition/vo/RawFoilEmptyRollerCashePositionSaveReqVO.java
@@ -0,0 +1,49 @@
+package cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 空辊缓存位新增/修改 Request VO")
+@Data
+public class RawFoilEmptyRollerCashePositionSaveReqVO {
+
+ @Schema(description = "点位标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1242")
+ private Long pointId;
+
+ @Schema(description = "点位编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "点位编码不能为空")
+ private String pointCode;
+
+ @Schema(description = "载具编码")
+ private String vehicleCode;
+
+ @Schema(description = "生产区域")
+ private String productionArea;
+
+ @Schema(description = "位置")
+ private String pointLocation;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "重量")
+ private BigDecimal weight;
+
+ @Schema(description = "是否有货", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否有货不能为空")
+ private String hasStock;
+
+ @Schema(description = "顺序号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "顺序号不能为空")
+ private Integer sortSeq;
+
+ @Schema(description = "点位类型")
+ private String pointType;
+}
\ 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/pda/RawFoilController.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/RawFoilController.java
new file mode 100644
index 00000000..c34458de
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/RawFoilController.java
@@ -0,0 +1,42 @@
+package cn.code.nl.module.lms.controller.pda;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.module.lms.controller.pda.vo.NeedEmptyAxisReqVO;
+import cn.code.nl.module.lms.controller.pda.vo.RawFoilWorkOrderCreateReqVO;
+import cn.code.nl.module.lms.service.pda.RawFoilService;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import static cn.code.nl.framework.common.pojo.CommonResult.success;
+
+/**
+ * @author dsh
+ * 2026/7/23
+ * 手持-生箔控制层
+ */
+@RestController
+@RequestMapping("/api/pda/rawFoil")
+@RequiredArgsConstructor
+public class RawFoilController {
+
+ private final RawFoilService rawFoilService;
+
+ @PostMapping("/createWorkOrder")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-work-order:create')")
+ public CommonResult createWorkOrder(@Valid @RequestBody RawFoilWorkOrderCreateReqVO createReqVO) {
+ return success(rawFoilService.createWorkOrder(createReqVO));
+ }
+
+ @PostMapping("/needEmptyAxis")
+ @PreAuthorize("@ss.hasPermission('lms:raw-foil-work-order:query')")
+ public CommonResult needEmptyAxis(@Valid @RequestBody NeedEmptyAxisReqVO needEmptyAxisReqVO) {
+ rawFoilService.needEmptyAxis(needEmptyAxisReqVO);
+ return success(true);
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/NeedEmptyAxisReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/NeedEmptyAxisReqVO.java
new file mode 100644
index 00000000..270534e3
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/NeedEmptyAxisReqVO.java
@@ -0,0 +1,18 @@
+package cn.code.nl.module.lms.controller.pda.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author dsh
+ * 2026/7/24
+ */
+@Schema(description = "手持 - 生箔工序工单 呼叫-上满下空")
+@Data
+public class NeedEmptyAxisReqVO {
+
+ @Schema(description = "工单标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "4374")
+ @NotNull(message = "生箔工序工单标识不能为空")
+ private Long workorderId;
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/pda/controller/rawfoil/vo/RawFoilWorkOrderCreateReqVO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/RawFoilWorkOrderCreateReqVO.java
similarity index 96%
rename from nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/pda/controller/rawfoil/vo/RawFoilWorkOrderCreateReqVO.java
rename to nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/RawFoilWorkOrderCreateReqVO.java
index 9b046cc3..110b5d85 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/pda/controller/rawfoil/vo/RawFoilWorkOrderCreateReqVO.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/controller/pda/vo/RawFoilWorkOrderCreateReqVO.java
@@ -1,7 +1,8 @@
-package cn.code.nl.module.lms.pda.controller.rawfoil.vo;
+package cn.code.nl.module.lms.controller.pda.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@@ -11,6 +12,7 @@ import java.time.LocalDateTime;
* 2026/7/23
*/
@Schema(description = "手持 - 生箔工序工单新增 Request VO")
+@Data
public class RawFoilWorkOrderCreateReqVO {
@Schema(description = "母卷号", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/btivtcutpointivt/BtIvtCutpointivtDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/btivtcutpointivt/BtIvtCutpointivtDO.java
new file mode 100644
index 00000000..a20b67a3
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/btivtcutpointivt/BtIvtCutpointivtDO.java
@@ -0,0 +1,101 @@
+package cn.code.nl.module.lms.dal.dataobject.btivtcutpointivt;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 分切区缓存点位库存 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("bst_ivt_cutpointivt")
+@KeySequence("bst_ivt_cutpointivt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BtIvtCutpointivtDO extends BaseDO {
+
+ /**
+ * 库存记录标识
+ */
+ @TableId
+ private Long ivtId;
+ /**
+ * AGV点位编码
+ */
+ private String pointCode;
+ /**
+ * AGV点位名称
+ */
+ private String pointName;
+ /**
+ * 桁架点位编码1
+ */
+ private String trussPointCode1;
+ /**
+ * 桁架点位编码2
+ */
+ private String trussPointCode2;
+ /**
+ * 气胀轴编码1
+ */
+ private String qzzNo1;
+ /**
+ * 气胀轴编码2
+ */
+ private String qzzNo2;
+ /**
+ * 上轴管芯
+ */
+ private String upGx;
+ /**
+ * 下轴管芯
+ */
+ private String downGx;
+ /**
+ * 点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位
+ */
+ private String pointType;
+ /**
+ * 生产区域
+ */
+ private String productArea;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 创建人
+ */
+ private String createId;
+ /**
+ * 创建人姓名
+ */
+ private String createName;
+ /**
+ * 修改人
+ */
+ private String updateOptid;
+ /**
+ * 修改人姓名
+ */
+ private String updateOptname;
+ /**
+ * 点位状态
+ */
+ private String pointStatus;
+
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/cutpointIvt/IvtCutpointivtDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/cutpointIvt/IvtCutpointivtDO.java
new file mode 100644
index 00000000..8a6e6d5c
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/cutpointIvt/IvtCutpointivtDO.java
@@ -0,0 +1,120 @@
+package cn.code.nl.module.lms.dal.dataobject.cutpointIvt;
+
+import lombok.*;
+import java.util.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 分切区点位库存 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("st_ivt_cutpointivt")
+@KeySequence("st_ivt_cutpointivt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IvtCutpointivtDO extends BaseDO {
+
+ /**
+ * 库存记录标识
+ */
+ @TableId
+ private Long ivtId;
+ /**
+ * 点位编码
+ */
+ private String pointCode;
+ /**
+ * 满轴位编码
+ */
+ private String fullPointCode;
+ /**
+ * 满轴位状态
+ */
+ private String fullPointStatus;
+ /**
+ * 母卷号
+ */
+ private String containerName;
+ /**
+ * 母卷轴编码
+ */
+ private String fullVehicleCode;
+ /**
+ * 空轴位编码
+ */
+ private String emptyPointCode;
+ /**
+ * 空轴位状态
+ */
+ private String emptyPointStatus;
+ /**
+ * 空轴编码
+ */
+ private String emptyVehicleCode;
+ /**
+ * 生产区域
+ */
+ private String productArea;
+ /**
+ * 位置
+ */
+ private String pointLocation;
+ /**
+ * 分切下料位上轴点位
+ */
+ private String upPointCode;
+ /**
+ * 分切下料位下轴点位
+ */
+ private String downPointCode;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 创建人姓名
+ */
+ private String createName;
+
+ /**
+ * 修改人姓名
+ */
+ private String updateOptname;
+ /**
+ * 规划
+ */
+ private String plan;
+ /**
+ * 对应MES系统设备编码
+ */
+ private String extCode;
+ /**
+ * 分切下料位上轴
+ */
+ private String upQzzno;
+ /**
+ * 分切下料位下轴
+ */
+ private String downQzzno;
+ /**
+ * 气胀轴代数
+ */
+ private String qzzGeneration;
+
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/ivtshafttubeivt/IvtShafttubeivtDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/ivtshafttubeivt/IvtShafttubeivtDO.java
new file mode 100644
index 00000000..df1f1733
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/ivtshafttubeivt/IvtShafttubeivtDO.java
@@ -0,0 +1,96 @@
+package cn.code.nl.module.lms.dal.dataobject.ivtshafttubeivt;
+
+import lombok.*;
+import java.util.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 穿拔轴区点位库存 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("bst_ivt_shafttubeivt")
+@KeySequence("bst_ivt_shafttubeivt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IvtShafttubeivtDO extends BaseDO {
+
+ /**
+ * 库存记录标识
+ */
+ @TableId
+ private Long ivtId;
+ /**
+ * 点位编码
+ */
+ private String pointCode;
+ /**
+ * 点位名称
+ */
+ private String pointName;
+ /**
+ * 气涨轴尺寸
+ */
+ private String qzzSize;
+ /**
+ * 气涨轴代数
+ */
+ private String qzzGeneration;
+ /**
+ * 纸管编码
+ */
+ private String tubeCode;
+ /**
+ * 纸管描述
+ */
+ private String tubeName;
+ /**
+ * 子卷号
+ */
+ private String containerName;
+ /**
+ * 点位类型
+ */
+ private String pointType;
+ /**
+ * 位置
+ */
+ private String pointLocation;
+ /**
+ * 是否有轴
+ */
+ private String haveQzz;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+
+ /**
+ * 创建人
+ */
+ private String createName;
+
+ /**
+ * 修改人
+ */
+ private String updateOptname;
+ /**
+ * 规划
+ */
+ private String plan;
+ /**
+ * 关联点位
+ */
+ private String parentCode;
+
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilcasheposition/RawFoilCashePositionDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilcasheposition/RawFoilCashePositionDO.java
new file mode 100644
index 00000000..28961f60
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilcasheposition/RawFoilCashePositionDO.java
@@ -0,0 +1,82 @@
+package cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 生箔母卷缓存位 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("lms_rawfoil_casheposition")
+@KeySequence("lms_rawfoil_casheposition_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RawFoilCashePositionDO extends BaseDO {
+
+ /**
+ * 库存记录标识
+ */
+ @TableId
+ private Long ivtId;
+ /**
+ * 点位编码
+ */
+ private String pointCode;
+ /**
+ * 母卷号
+ */
+ private String containerName;
+ /**
+ * 母卷工单标识
+ */
+ private String workorderId;
+ /**
+ * 母卷轴编码
+ */
+ private String fullVehicleCode;
+ /**
+ * 入库时间
+ */
+ private LocalDateTime instorageTime;
+ /**
+ * 生产区域
+ */
+ private String productionArea;
+ /**
+ * 位置
+ */
+ private String pointLocation;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 库存状态
+ */
+ private String coolIvtStatus;
+ /**
+ * 点位类型
+ */
+ private String pointType;
+
+ /**
+ * 锁(0.空闲,1占用)
+ */
+ private String lockStatus;
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionDO.java
new file mode 100644
index 00000000..19a3490f
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionDO.java
@@ -0,0 +1,75 @@
+package cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 空辊缓存位 DO
+ *
+ * @author 诺力管理员
+ */
+@TableName("lms_rawfoil_emptyroller_casheposition")
+@KeySequence("lms_rawfoil_emptyroller_casheposition_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RawFoilEmptyRollerCashePositionDO extends BaseDO {
+
+ /**
+ * 点位标识
+ */
+ @TableId
+ private Long pointId;
+ /**
+ * 点位编码
+ */
+ private String pointCode;
+ /**
+ * 载具编码
+ */
+ private String vehicleCode;
+ /**
+ * 生产区域
+ */
+ private String productionArea;
+ /**
+ * 位置
+ */
+ private String pointLocation;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 重量
+ */
+ private BigDecimal weight;
+ /**
+ * 是否有货
+ */
+ private String hasStock;
+ /**
+ * 顺序号
+ */
+ private Integer sortSeq;
+
+ /**
+ * 点位类型
+ */
+ private String pointType;
+
+ /**
+ * 锁(0.空闲,1占用)
+ */
+ private String lockStatus;
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilpointivt/RawFoilPointIVTDO.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilpointivt/RawFoilPointIVTDO.java
index a6c12b50..b2faa315 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilpointivt/RawFoilPointIVTDO.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/dataobject/rawfoilpointivt/RawFoilPointIVTDO.java
@@ -53,4 +53,8 @@ public class RawFoilPointIVTDO extends BaseDO {
*/
private String isUsed;
+ /**
+ * 锁(0.空闲,1占用)
+ */
+ private String lockStatus;
}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/btivtcutpointivt/BtIvtCutpointivtMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/btivtcutpointivt/BtIvtCutpointivtMapper.java
new file mode 100644
index 00000000..901cb05f
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/btivtcutpointivt/BtIvtCutpointivtMapper.java
@@ -0,0 +1,29 @@
+package cn.code.nl.module.lms.dal.mysql.btivtcutpointivt;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.dal.dataobject.btivtcutpointivt.BtIvtCutpointivtDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 分切区缓存点位库存 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface BtIvtCutpointivtMapper extends BaseMapperX {
+
+ default PageResult selectPage(BtIvtCutpointivtPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BtIvtCutpointivtDO::getPointCode, reqVO.getPointCode())
+ .eqIfPresent(BtIvtCutpointivtDO::getPointType, reqVO.getPointType())
+ .eqIfPresent(BtIvtCutpointivtDO::getProductArea, reqVO.getProductArea())
+ .eqIfPresent(BtIvtCutpointivtDO::getIsUsed, reqVO.getIsUsed())
+ .betweenIfPresent(BtIvtCutpointivtDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(BtIvtCutpointivtDO::getPointStatus, reqVO.getPointStatus())
+ .orderByDesc(BtIvtCutpointivtDO::getIvtId));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtcutpointivt/IvtCutpointivtMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtcutpointivt/IvtCutpointivtMapper.java
new file mode 100644
index 00000000..bc63907d
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtcutpointivt/IvtCutpointivtMapper.java
@@ -0,0 +1,30 @@
+package cn.code.nl.module.lms.dal.mysql.ivtcutpointivt;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.dal.dataobject.cutpointIvt.IvtCutpointivtDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 分切区点位库存 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface IvtCutpointivtMapper extends BaseMapperX {
+
+ default PageResult selectPage(IvtCutpointivtPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(IvtCutpointivtDO::getPointCode, reqVO.getPointCode())
+ .eqIfPresent(IvtCutpointivtDO::getFullPointStatus, reqVO.getFullPointStatus())
+ .eqIfPresent(IvtCutpointivtDO::getEmptyPointStatus, reqVO.getEmptyPointStatus())
+ .eqIfPresent(IvtCutpointivtDO::getProductArea, reqVO.getProductArea())
+ .eqIfPresent(IvtCutpointivtDO::getIsUsed, reqVO.getIsUsed())
+ .orderByDesc(IvtCutpointivtDO::getIvtId));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtshafttubeivt/IvtShafttubeivtMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtshafttubeivt/IvtShafttubeivtMapper.java
new file mode 100644
index 00000000..376d6d9f
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/ivtshafttubeivt/IvtShafttubeivtMapper.java
@@ -0,0 +1,27 @@
+package cn.code.nl.module.lms.dal.mysql.ivtshafttubeivt;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtPageReqVO;
+import cn.code.nl.module.lms.dal.dataobject.ivtshafttubeivt.IvtShafttubeivtDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 穿拔轴区点位库存 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface IvtShafttubeivtMapper extends BaseMapperX {
+
+ default PageResult selectPage(IvtShafttubeivtPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(IvtShafttubeivtDO::getPointCode, reqVO.getPointCode())
+ .eqIfPresent(IvtShafttubeivtDO::getPointType, reqVO.getPointType())
+ .orderByDesc(IvtShafttubeivtDO::getIvtId));
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilcasheposition/RawFoilCashePositionMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilcasheposition/RawFoilCashePositionMapper.java
new file mode 100644
index 00000000..cd27b058
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilcasheposition/RawFoilCashePositionMapper.java
@@ -0,0 +1,121 @@
+package cn.code.nl.module.lms.dal.mysql.rawfoilcasheposition;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.enums.LockStatusEnum;
+import cn.code.nl.module.lms.enums.RawFoilCashePositionTypeEnum;
+import org.apache.ibatis.annotations.Mapper;
+import cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.vo.*;
+
+/**
+ * 生箔母卷缓存位 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface RawFoilCashePositionMapper extends BaseMapperX {
+
+ default PageResult selectPage(RawFoilCashePositionPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(RawFoilCashePositionDO::getPointCode, reqVO.getPointCode())
+ .likeIfPresent(RawFoilCashePositionDO::getContainerName, reqVO.getContainerName())
+ .betweenIfPresent(RawFoilCashePositionDO::getInstorageTime, reqVO.getInstorageTime())
+ .eqIfPresent(RawFoilCashePositionDO::getProductionArea, reqVO.getProductionArea())
+ .eqIfPresent(RawFoilCashePositionDO::getIsUsed, reqVO.getIsUsed())
+ .eqIfPresent(RawFoilCashePositionDO::getCoolIvtStatus, reqVO.getCoolIvtStatus())
+ .orderByDesc(RawFoilCashePositionDO::getIvtId));
+ }
+
+ /**
+ * 根据点位类型查询空闲且未占用的候选点位列表
+ * 筛选条件:点位类型、已启用、无母卷、未占用,按顺序号升序(越小离称重位越近)
+ *
+ * @param pointType 点位类型
+ * @return 候选点位列表
+ */
+ default List selectEmptyPositionList(String pointType) {
+ return selectList(new LambdaQueryWrapperX()
+ .eq(RawFoilCashePositionDO::getPointType, pointType)
+ .eq(RawFoilCashePositionDO::getIsUsed, CommonStatusEnum.DISABLE.getStatus())
+ .and(w -> w.isNull(RawFoilCashePositionDO::getContainerName)
+ .or().eq(RawFoilCashePositionDO::getContainerName, ""))
+ .eq(RawFoilCashePositionDO::getLockStatus, LockStatusEnum.IDLE.getCode())
+ .orderByAsc(RawFoilCashePositionDO::getSortSeq));
+ }
+
+ /**
+ * CAS 占用候选点位:仅当点位空闲时更新为占用
+ *
+ * @param ivtId 库存记录标识
+ * @return 影响行数,大于 0 表示抢占成功
+ */
+ default int lockPosition(Long ivtId) {
+ RawFoilCashePositionDO updateObj = new RawFoilCashePositionDO();
+ updateObj.setLockStatus(LockStatusEnum.OCCUPIED.getCode());
+ return update(updateObj, new LambdaUpdateWrapper()
+ .eq(RawFoilCashePositionDO::getIvtId, ivtId)
+ .eq(RawFoilCashePositionDO::getLockStatus, LockStatusEnum.IDLE.getCode()));
+ }
+
+ /**
+ * 释放点位占用:仅当点位被占用时更新为空闲
+ *
+ * @param pointCode 点位编码
+ * @return 影响行数,0 表示点位已释放(幂等)
+ */
+ default int releaseLockByPointCode(String pointCode) {
+ RawFoilCashePositionDO updateObj = new RawFoilCashePositionDO();
+ updateObj.setLockStatus(LockStatusEnum.IDLE.getCode());
+ return update(updateObj, new LambdaUpdateWrapper()
+ .eq(RawFoilCashePositionDO::getPointCode, pointCode)
+ .eq(RawFoilCashePositionDO::getLockStatus, LockStatusEnum.OCCUPIED.getCode()));
+ }
+
+ /**
+ * 母卷入库:仅当点位被占用且无母卷时写入母卷信息并释放占用
+ *
+ * @param pointCode 点位编码
+ * @param containerName 母卷号
+ * @param workorderId 母卷工单标识(可为空)
+ * @param instorageTime 入库时间
+ * @return 影响行数,0 表示已入库或已释放(幂等)
+ */
+ default int instoragePosition(String pointCode, String containerName, String workorderId,
+ LocalDateTime instorageTime) {
+ RawFoilCashePositionDO updateObj = new RawFoilCashePositionDO();
+ updateObj.setContainerName(containerName);
+ updateObj.setWorkorderId(workorderId);
+ updateObj.setInstorageTime(instorageTime);
+ updateObj.setLockStatus(LockStatusEnum.IDLE.getCode());
+ return update(updateObj, new LambdaUpdateWrapper()
+ .eq(RawFoilCashePositionDO::getPointCode, pointCode)
+ .eq(RawFoilCashePositionDO::getLockStatus, LockStatusEnum.OCCUPIED.getCode())
+ .and(w -> w.isNull(RawFoilCashePositionDO::getContainerName)
+ .or().eq(RawFoilCashePositionDO::getContainerName, "")));
+ }
+
+ /**
+ * 母卷出库:清空起点点位上的母卷记录
+ * 仅当母卷号匹配时清空,防止重复回调误清已新入库的母卷,天然幂等
+ *
+ * @param pointCode 点位编码
+ * @param containerName 母卷号
+ * @return 影响行数,0 表示点位上无该母卷(幂等)
+ */
+ default int outstockPosition(String pointCode, String containerName) {
+ return update(null, new LambdaUpdateWrapper()
+ .set(RawFoilCashePositionDO::getContainerName, null)
+ .set(RawFoilCashePositionDO::getWorkorderId, null)
+ .set(RawFoilCashePositionDO::getInstorageTime, null)
+ .eq(RawFoilCashePositionDO::getPointCode, pointCode)
+ .eq(RawFoilCashePositionDO::getContainerName, containerName));
+ }
+
+}
\ 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/mysql/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionMapper.java
new file mode 100644
index 00000000..86856563
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionMapper.java
@@ -0,0 +1,87 @@
+package cn.code.nl.module.lms.dal.mysql.rawfoilemptyrollercasheposition;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
+import cn.code.nl.framework.common.pojo.PageResult;
+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.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+import cn.code.nl.module.lms.enums.EmptyRollerPointTypeEnum;
+import cn.code.nl.module.lms.enums.LockStatusEnum;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.apache.ibatis.annotations.Mapper;
+import cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo.*;
+
+/**
+ * 空辊缓存位 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface RawFoilEmptyRollerCashePositionMapper extends BaseMapperX {
+
+ default PageResult selectPage(RawFoilEmptyRollerCashePositionPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(RawFoilEmptyRollerCashePositionDO::getPointCode, reqVO.getPointCode())
+ .eqIfPresent(RawFoilEmptyRollerCashePositionDO::getProductionArea, reqVO.getProductionArea())
+ .eqIfPresent(RawFoilEmptyRollerCashePositionDO::getIsUsed, reqVO.getIsUsed())
+ .eqIfPresent(RawFoilEmptyRollerCashePositionDO::getHasStock, reqVO.getHasStock())
+ .orderByDesc(RawFoilEmptyRollerCashePositionDO::getPointId));
+ }
+
+ /**
+ * 根据点位类型获取空辊缓存位等待点
+ * @param pointType 点位类型 3:生箔空辊等待点 4:分切空辊等待点
+ * @return RawFoilEmptyRollerCashePositionDO
+ */
+ default RawFoilEmptyRollerCashePositionDO selectEmptyRollerWaitPointByPointType(String pointType){
+ return selectOne(RawFoilEmptyRollerCashePositionDO::getPointType, pointType,
+ RawFoilEmptyRollerCashePositionDO::getIsUsed, CommonStatusEnum.DISABLE.getStatus());
+ }
+
+ /**
+ * 根据点位类型查询空闲且未占用的候选点位列表
+ * 筛选条件:点位类型、已启用、有货无货、未占用,按顺序号降序
+ *
+ * @param pointType 点位类型, hasStock 是否有货
+ * @return 候选点位列表
+ */
+ default List selectEmptyPositionList(String pointType,String hasStock){
+ return selectList(new LambdaQueryWrapperX()
+ .eq(RawFoilEmptyRollerCashePositionDO::getHasStock,hasStock)
+ .eq(RawFoilEmptyRollerCashePositionDO::getPointType,pointType)
+ .eq(RawFoilEmptyRollerCashePositionDO::getIsUsed,CommonStatusEnum.DISABLE.getStatus())
+ .eq(RawFoilEmptyRollerCashePositionDO::getLockStatus,LockStatusEnum.IDLE.getCode())
+ .orderByDesc(RawFoilEmptyRollerCashePositionDO::getSortSeq)
+ );
+ }
+
+
+// default List selectEmptyPositionList(String pointType) {
+// return selectList(new LambdaQueryWrapperX()
+// .eq(RawFoilCashePositionDO::getPointType, pointType)
+// .eq(RawFoilCashePositionDO::getIsUsed, CommonStatusEnum.DISABLE.getStatus())
+// .and(w -> w.isNull(RawFoilCashePositionDO::getContainerName)
+// .or().eq(RawFoilCashePositionDO::getContainerName, ""))
+// .eq(RawFoilCashePositionDO::getLockStatus, LockStatusEnum.IDLE.getCode())
+// .orderByAsc(RawFoilCashePositionDO::getSortSeq));
+// }
+
+ /**
+ * CAS 占用候选点位:仅当点位空闲时更新为占用
+ *
+ * @param pointId 点位标识
+ * @return 影响行数,大于 0 表示抢占成功
+ */
+ default int lockPosition(Long pointId){
+ RawFoilEmptyRollerCashePositionDO updateObj = new RawFoilEmptyRollerCashePositionDO();
+ updateObj.setLockStatus(LockStatusEnum.OCCUPIED.getCode());
+ return update(updateObj, new LambdaUpdateWrapper<>(RawFoilEmptyRollerCashePositionDO.class)
+ .eq(RawFoilEmptyRollerCashePositionDO::getPointId,pointId)
+ .eq(RawFoilEmptyRollerCashePositionDO::getLockStatus,LockStatusEnum.IDLE.getCode())
+ );
+ }
+
+}
\ 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/mysql/rawfoilpointivt/RawFoilPointIVTMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilpointivt/RawFoilPointIVTMapper.java
index cca904d0..6c939454 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilpointivt/RawFoilPointIVTMapper.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/rawfoilpointivt/RawFoilPointIVTMapper.java
@@ -6,6 +6,8 @@ import cn.code.nl.framework.common.pojo.PageResult;
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.rawfoilpointivt.RawFoilPointIVTDO;
+import cn.code.nl.module.lms.enums.LockStatusEnum;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import cn.code.nl.module.lms.controller.admin.rawfoilpointivt.vo.*;
@@ -37,4 +39,32 @@ public interface RawFoilPointIVTMapper extends BaseMapperX {
return selectOne(RawFoilPointIVTDO::getPointCode,pointCode);
}
+ /**
+ * CAS 占用生箔机点位:仅当点位空闲时更新为占用
+ *
+ * @param pointId 点位标识
+ * @return 影响行数,大于 0 表示抢占成功
+ */
+ default int lockPoint(Long pointId) {
+ RawFoilPointIVTDO updateObj = new RawFoilPointIVTDO();
+ updateObj.setLockStatus(LockStatusEnum.OCCUPIED.getCode());
+ return update(updateObj, new LambdaUpdateWrapper()
+ .eq(RawFoilPointIVTDO::getPointId, pointId)
+ .eq(RawFoilPointIVTDO::getLockStatus, LockStatusEnum.IDLE.getCode()));
+ }
+
+ /**
+ * 释放生箔机点位占用:仅当点位被占用时更新为空闲
+ *
+ * @param pointCode 点位编码
+ * @return 影响行数,0 表示点位已释放(幂等)
+ */
+ default int releaseLockByPointCode(String pointCode) {
+ RawFoilPointIVTDO updateObj = new RawFoilPointIVTDO();
+ updateObj.setLockStatus(LockStatusEnum.IDLE.getCode());
+ return update(updateObj, new LambdaUpdateWrapper()
+ .eq(RawFoilPointIVTDO::getPointCode, pointCode)
+ .eq(RawFoilPointIVTDO::getLockStatus, LockStatusEnum.OCCUPIED.getCode()));
+ }
+
}
\ No newline at end of file
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/demo/DemoApi.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/demo/DemoApi.java
new file mode 100644
index 00000000..b08f3ad9
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/demo/DemoApi.java
@@ -0,0 +1,80 @@
+//package cn.code.nl.module.lms.demo;
+//
+//import cn.code.nl.framework.common.pojo.CommonResult;
+//import cn.code.nl.framework.execute.biz.api.lms.LmsTaskCommonApi;
+//import cn.code.nl.framework.execute.biz.dto.TaskStatusCallApiReqDTO;
+//import cn.code.nl.framework.execute.biz.vo.AcsApplyActionRespVO;
+//import com.alibaba.fastjson.JSON;
+//import org.springframework.validation.annotation.Validated;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import static cn.code.nl.framework.common.pojo.CommonResult.success;
+//
+///**
+// *
+// * @Author: liyongde
+// * @Date: 2026/7/15 15:25
+// */
+//@RestController // 提供 RESTful API 接口,给 Feign 调用
+//@Validated
+//public class DemoApi implements LmsTaskCommonApi {
+// @Override
+// public CommonResult doHandlePicked(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// // 内层data赋值 "success"
+// return success(respVO);
+// }
+//
+// @Override
+// public CommonResult doHandleApplyAgain(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// DemoRespVO demoRespVO = new DemoRespVO();
+// demoRespVO.setTargetPoint("A_10001");
+//
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// // 内层data赋值 "success"
+// respVO.setData(JSON.parseObject(JSON.toJSONString(demoRespVO)));
+// return success(respVO);
+// }
+//
+// @Override
+// public CommonResult doHandleRequestRelease(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// return success(respVO);
+// }
+//
+// @Override
+// public CommonResult doHandleRequestPick(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// return success(respVO);
+// }
+//
+// @Override
+// public CommonResult doHandleRequestLeave(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// return success(respVO);
+// }
+//
+// @Override
+// public CommonResult doHandleRequestEnter(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
+// // 构建外层VO
+// AcsApplyActionRespVO respVO = new AcsApplyActionRespVO();
+// respVO.setTaskId(10001L);
+// respVO.setTaskCode("ACS20260716001");
+// return success(respVO);
+// }
+//}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsService.java
new file mode 100644
index 00000000..fa6680ec
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsService.java
@@ -0,0 +1,16 @@
+package cn.code.nl.module.lms.service.acs;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.module.lms.controller.acs.vo.WeighingCompleteReqVO;
+
+/**
+ * @author dsh
+ * 2026/8/4
+ */
+public interface AcsToLmsService {
+
+ /**
+ * 称重完成
+ */
+ void weighingComplete(WeighingCompleteReqVO weighingCompleteReqVO);
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsServiceImpl.java
new file mode 100644
index 00000000..629f1c02
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/acs/AcsToLmsServiceImpl.java
@@ -0,0 +1,134 @@
+package cn.code.nl.module.lms.service.acs;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.module.lms.controller.acs.vo.WeighingCompleteReqVO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilworkorder.RawFoilWorkOrderDO;
+import cn.code.nl.module.lms.dal.mysql.rawfoilcasheposition.RawFoilCashePositionMapper;
+import cn.code.nl.module.lms.dal.mysql.rawfoilworkorder.RawFoilWorkOrderMapper;
+import cn.code.nl.module.lms.enums.RawFoilCashePositionTypeEnum;
+import cn.code.nl.module.lms.enums.RawFoilHandleCodeConstants;
+import cn.code.nl.module.lms.enums.RawFoilWorkOrderStatusEnum;
+import cn.code.nl.module.lms.service.rawfoilcasheposition.RawFoilCashePositionService;
+import cn.code.nl.module.task.api.TransportTaskApi;
+import cn.code.nl.module.task.dto.TaskInfoDTO;
+import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
+import cn.code.nl.module.task.enums.AcsTaskTypeEnum;
+import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
+import cn.code.nl.module.task.enums.TaskTypeEnum;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.UUID;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*;
+
+/**
+ * ACS 上报 LMS 服务实现类
+ *
+ * @author dsh
+ * 2026/8/5
+ */
+@Slf4j
+@Service
+public class AcsToLmsServiceImpl implements AcsToLmsService {
+
+ @Resource
+ private TransportTaskApi transportTaskApi;
+
+ @Resource
+ private RawFoilWorkOrderMapper rawFoilWorkOrderMapper;
+
+ @Resource
+ private RawFoilCashePositionMapper rawFoilCashePositionMapper;
+
+ @Resource
+ private RawFoilCashePositionService rawFoilCashePositionService;
+
+ /**
+ * ACS 上报称重完成:校验后更新工单重量,创建母卷从称重位到常规缓存位的入库搬运任务
+ *
+ * @param weighingCompleteReqVO 称重完成请求信息
+ */
+ @Override
+ public void weighingComplete(WeighingCompleteReqVO weighingCompleteReqVO) {
+ String containerName = weighingCompleteReqVO.getContainerName();
+
+ // 1. 根据母卷号查询生箔工单
+ RawFoilWorkOrderDO workOrder = rawFoilWorkOrderMapper.selectByContainerNameAndNotEndStatus(containerName);
+ if (workOrder == null) {
+ throw exception(RAW_FOIL_WORK_ORDER_NOT_EXISTS);
+ }
+ // 2. 校验工单状态为执行中(称重完成只可能发生在需要空轴任务下发之后)
+// if (!RawFoilWorkOrderStatusEnum.EXECUTION.getCode().equals(workOrder.getStatus())) {
+// throw exception(RAW_FOIL_WORK_ORDER_STATUS_NOT_EXECUTION);
+// }
+ // 3. 幂等校验:母卷存在在途搬运任务则拒绝(拦截任务执行期间的重复上报)
+ CommonResult> runningResult = transportTaskApi
+ .getRunningTaskByMaterialCode(containerName, TaskOwnerServiceEnum.LMS.getCode());
+ if (runningResult.isError()) {
+ log.error("查询在途搬运任务失败, containerName={}, 返回={}", containerName, runningResult);
+ throw exception(RAW_FOIL_WORK_ORDER_FAIL);
+ }
+ if (CollUtil.isNotEmpty(runningResult.getData())) {
+ throw exception(RAW_FOIL_WORK_ORDER_NOT_SELECT);
+ }
+ // 4. 起点:称重位
+ List weighingPositions = rawFoilCashePositionMapper.selectList(
+ new LambdaQueryWrapperX()
+ .eq(RawFoilCashePositionDO::getPointType,
+ RawFoilCashePositionTypeEnum.WEIGHING_POSITION.getCode()));
+ if (CollUtil.isEmpty(weighingPositions)) {
+ throw exception(RAW_FOIL_WEIGHING_POSITION_NOT_EXISTS);
+ }
+ RawFoilCashePositionDO weighingPosition = weighingPositions.get(0);
+
+ // 5. 校验母卷在称重位
+ if (!containerName.equals(weighingPosition.getContainerName())) {
+ throw exception(RAW_FOIL_CONTAINER_NOT_ON_WEIGHING_POSITION);
+ }
+
+ // 6. 更新生箔工单重量
+ RawFoilWorkOrderDO weightUpdate = new RawFoilWorkOrderDO();
+ weightUpdate.setWorkorderId(workOrder.getWorkorderId());
+ weightUpdate.setProductWeight(weighingCompleteReqVO.getProductWeight());
+ rawFoilWorkOrderMapper.updateById(weightUpdate);
+
+ // 7. 终点:分配常规缓存位并 CAS 占用
+ RawFoilCashePositionDO conventionalPosition = rawFoilCashePositionService.allocateConventionalPosition();
+
+ // 8. 创建入库搬运任务;失败必须补偿释放已占用的常规位,否则点位死锁
+ try {
+ TransportTaskCreateReqDTO reqDTO = new TransportTaskCreateReqDTO();
+ reqDTO.setTaskName(UUID.randomUUID().toString());
+ reqDTO.setOwnerService(TaskOwnerServiceEnum.LMS.getCode());
+ reqDTO.setHandleCode(RawFoilHandleCodeConstants.RAW_FOIL_INSTORAGE_TASK);
+ reqDTO.setAcsTaskType(AcsTaskTypeEnum.TRUSS_TASK.getCode());
+ reqDTO.setAgvSystemType("1");
+ reqDTO.setPointCode1(weighingPosition.getPointCode());
+ reqDTO.setPointCode2(conventionalPosition.getPointCode());
+ reqDTO.setMaterialCode(containerName);
+ reqDTO.setPriority("1");
+ reqDTO.setProductArea(workOrder.getProductionArea());
+ reqDTO.setIsAutoIssue("1");
+ reqDTO.setIsCreateFinish(true);
+ reqDTO.setTaskType(TaskTypeEnum.RAW_FOIL_INSTORAGE_TASK.getCode());
+
+ CommonResult taskResult = transportTaskApi.createTransportTask(reqDTO);
+ if (taskResult.isError()) {
+ log.error("创建生箔入库任务失败, containerName={}, reqDTO={}, 返回={}",
+ containerName, reqDTO, taskResult);
+ throw exception(RAW_FOIL_TRANSPORT_TASK_CREATE_FAIL);
+ }
+ } catch (Exception e) {
+ // 补偿释放:常规缓存位
+ rawFoilCashePositionService.releasePositionLock(conventionalPosition.getPointCode());
+ throw e;
+ }
+ }
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtService.java
new file mode 100644
index 00000000..f8e66ece
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtService.java
@@ -0,0 +1,64 @@
+package cn.code.nl.module.lms.service.cutpointIvt;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.cutpointIvt.IvtCutpointivtDO;
+import jakarta.validation.*;
+
+
+/**
+ * 分切区点位库存 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface IvtCutpointivtService {
+
+ /**
+ * 创建分切区点位库存
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createIvtCutpointivt(@Valid IvtCutpointivtSaveReqVO createReqVO);
+
+ /**
+ * 更新分切区点位库存
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateIvtCutpointivt(@Valid IvtCutpointivtSaveReqVO updateReqVO);
+
+ /**
+ * 删除分切区点位库存
+ *
+ * @param id 编号
+ */
+ void deleteIvtCutpointivt(Long id);
+
+ /**
+ * 批量删除分切区点位库存
+ *
+ * @param ids 编号
+ */
+ void deleteIvtCutpointivtListByIds(List ids);
+
+ /**
+ * 获得分切区点位库存
+ *
+ * @param id 编号
+ * @return 分切区点位库存
+ */
+ IvtCutpointivtDO getIvtCutpointivt(Long id);
+
+ /**
+ * 获得分切区点位库存分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 分切区点位库存分页
+ */
+ PageResult getIvtCutpointivtPage(IvtCutpointivtPageReqVO pageReqVO);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtServiceImpl.java
new file mode 100644
index 00000000..b19bc70d
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/cutpointIvt/IvtCutpointivtServiceImpl.java
@@ -0,0 +1,86 @@
+package cn.code.nl.module.lms.service.cutpointIvt;
+
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.cutpointivt.vo.IvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.cutpointIvt.IvtCutpointivtDO;
+import cn.code.nl.module.lms.dal.mysql.ivtcutpointivt.IvtCutpointivtMapper;
+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.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+
+
+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.IVT_CUTPOINTIVT_NOT_EXISTS;
+
+/**
+ * 分切区点位库存 Service 实现类
+ *
+ * @author 诺力管理员
+ */
+@Service
+@Validated
+public class IvtCutpointivtServiceImpl implements IvtCutpointivtService {
+
+ @Resource
+ private IvtCutpointivtMapper ivtCutpointivtMapper;
+
+ @Override
+ public Long createIvtCutpointivt(IvtCutpointivtSaveReqVO createReqVO) {
+ // 插入
+ IvtCutpointivtDO ivtCutpointivt = BeanUtils.toBean(createReqVO, IvtCutpointivtDO.class);
+ ivtCutpointivtMapper.insert(ivtCutpointivt);
+
+ // 返回
+ return ivtCutpointivt.getIvtId();
+ }
+
+ @Override
+ public void updateIvtCutpointivt(IvtCutpointivtSaveReqVO updateReqVO) {
+ // 校验存在
+ validateIvtCutpointivtExists(updateReqVO.getIvtId());
+ // 更新
+ IvtCutpointivtDO updateObj = BeanUtils.toBean(updateReqVO, IvtCutpointivtDO.class);
+ ivtCutpointivtMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteIvtCutpointivt(Long id) {
+ // 校验存在
+ validateIvtCutpointivtExists(id);
+ // 删除
+ ivtCutpointivtMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteIvtCutpointivtListByIds(List ids) {
+ // 删除
+ ivtCutpointivtMapper.deleteByIds(ids);
+ }
+
+
+ private void validateIvtCutpointivtExists(Long id) {
+ if (ivtCutpointivtMapper.selectById(id) == null) {
+ throw exception(IVT_CUTPOINTIVT_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public IvtCutpointivtDO getIvtCutpointivt(Long id) {
+ return ivtCutpointivtMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getIvtCutpointivtPage(IvtCutpointivtPageReqVO pageReqVO) {
+ return ivtCutpointivtMapper.selectPage(pageReqVO);
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtService.java
new file mode 100644
index 00000000..0442b5de
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtService.java
@@ -0,0 +1,63 @@
+package cn.code.nl.module.lms.service.ivtcutpointivt;
+
+import java.util.*;
+
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.btivtcutpointivt.BtIvtCutpointivtDO;
+import jakarta.validation.*;
+import cn.code.nl.framework.common.pojo.PageResult;
+
+/**
+ * 分切区缓存点位库存 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface BtIvtCutpointivtService {
+
+ /**
+ * 创建分切区缓存点位库存
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createIvtCutpointivt(@Valid BtIvtCutpointivtSaveReqVO createReqVO);
+
+ /**
+ * 更新分切区缓存点位库存
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateIvtCutpointivt(@Valid BtIvtCutpointivtSaveReqVO updateReqVO);
+
+ /**
+ * 删除分切区缓存点位库存
+ *
+ * @param id 编号
+ */
+ void deleteIvtCutpointivt(Long id);
+
+ /**
+ * 批量删除分切区缓存点位库存
+ *
+ * @param ids 编号
+ */
+ void deleteIvtCutpointivtListByIds(List ids);
+
+ /**
+ * 获得分切区缓存点位库存
+ *
+ * @param id 编号
+ * @return 分切区缓存点位库存
+ */
+ BtIvtCutpointivtDO getIvtCutpointivt(Long id);
+
+ /**
+ * 获得分切区缓存点位库存分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 分切区缓存点位库存分页
+ */
+ PageResult getIvtCutpointivtPage(BtIvtCutpointivtPageReqVO pageReqVO);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtServiceImpl.java
new file mode 100644
index 00000000..605b2cbd
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtcutpointivt/BtIvtCutpointivtServiceImpl.java
@@ -0,0 +1,82 @@
+package cn.code.nl.module.lms.service.ivtcutpointivt;
+
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.btcutpointivt.vo.BtIvtCutpointivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.btivtcutpointivt.BtIvtCutpointivtDO;
+import cn.code.nl.module.lms.dal.mysql.btivtcutpointivt.BtIvtCutpointivtMapper;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.*;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+
+
+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.module.lms.enums.ErrorCodeConstants.IVT_CUTPOINTIVT_NOT_EXISTS;
+
+/**
+ * 分切区缓存点位库存 Service 实现类
+ *
+ * @author 诺力管理员
+ */
+@Service
+@Validated
+public class BtIvtCutpointivtServiceImpl implements BtIvtCutpointivtService {
+
+ @Resource
+ private BtIvtCutpointivtMapper btIvtCutpointivtMapper;
+
+ @Override
+ public Long createIvtCutpointivt(BtIvtCutpointivtSaveReqVO createReqVO) {
+ // 插入
+ BtIvtCutpointivtDO ivtCutpointivt = BeanUtils.toBean(createReqVO, BtIvtCutpointivtDO.class);
+ btIvtCutpointivtMapper.insert(ivtCutpointivt);
+
+ // 返回
+ return ivtCutpointivt.getIvtId();
+ }
+
+ @Override
+ public void updateIvtCutpointivt(BtIvtCutpointivtSaveReqVO updateReqVO) {
+ // 校验存在
+ validateIvtCutpointivtExists(updateReqVO.getIvtId());
+ // 更新
+ BtIvtCutpointivtDO updateObj = BeanUtils.toBean(updateReqVO, BtIvtCutpointivtDO.class);
+ btIvtCutpointivtMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteIvtCutpointivt(Long id) {
+ // 校验存在
+ validateIvtCutpointivtExists(id);
+ // 删除
+ btIvtCutpointivtMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteIvtCutpointivtListByIds(List ids) {
+ // 删除
+ btIvtCutpointivtMapper.deleteByIds(ids);
+ }
+
+
+ private void validateIvtCutpointivtExists(Long id) {
+ if (btIvtCutpointivtMapper.selectById(id) == null) {
+ throw exception(IVT_CUTPOINTIVT_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public BtIvtCutpointivtDO getIvtCutpointivt(Long id) {
+ return btIvtCutpointivtMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getIvtCutpointivtPage(BtIvtCutpointivtPageReqVO pageReqVO) {
+ return btIvtCutpointivtMapper.selectPage(pageReqVO);
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtService.java
new file mode 100644
index 00000000..897e24ce
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtService.java
@@ -0,0 +1,64 @@
+package cn.code.nl.module.lms.service.ivtshafttubeivt;
+
+import java.util.*;
+
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.ivtshafttubeivt.IvtShafttubeivtDO;
+import jakarta.validation.*;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 穿拔轴区点位库存 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface IvtShafttubeivtService {
+
+ /**
+ * 创建穿拔轴区点位库存
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createIvtShafttubeivt(@Valid IvtShafttubeivtSaveReqVO createReqVO);
+
+ /**
+ * 更新穿拔轴区点位库存
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateIvtShafttubeivt(@Valid IvtShafttubeivtSaveReqVO updateReqVO);
+
+ /**
+ * 删除穿拔轴区点位库存
+ *
+ * @param id 编号
+ */
+ void deleteIvtShafttubeivt(Long id);
+
+ /**
+ * 批量删除穿拔轴区点位库存
+ *
+ * @param ids 编号
+ */
+ void deleteIvtShafttubeivtListByIds(List ids);
+
+ /**
+ * 获得穿拔轴区点位库存
+ *
+ * @param id 编号
+ * @return 穿拔轴区点位库存
+ */
+ IvtShafttubeivtDO getIvtShafttubeivt(Long id);
+
+ /**
+ * 获得穿拔轴区点位库存分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 穿拔轴区点位库存分页
+ */
+ PageResult getIvtShafttubeivtPage(IvtShafttubeivtPageReqVO pageReqVO);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtServiceImpl.java
new file mode 100644
index 00000000..ec9a3894
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/ivtshafttubeivt/IvtShafttubeivtServiceImpl.java
@@ -0,0 +1,86 @@
+package cn.code.nl.module.lms.service.ivtshafttubeivt;
+
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtPageReqVO;
+import cn.code.nl.module.lms.controller.admin.ivtshafttubeivt.vo.IvtShafttubeivtSaveReqVO;
+import cn.code.nl.module.lms.dal.dataobject.ivtshafttubeivt.IvtShafttubeivtDO;
+import cn.code.nl.module.lms.dal.mysql.ivtshafttubeivt.IvtShafttubeivtMapper;
+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.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+
+
+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.IVT_SHAFTTUBEIVT_NOT_EXISTS;
+
+/**
+ * 穿拔轴区点位库存 Service 实现类
+ *
+ * @author 诺力管理员
+ */
+@Service
+@Validated
+public class IvtShafttubeivtServiceImpl implements IvtShafttubeivtService {
+
+ @Resource
+ private IvtShafttubeivtMapper ivtShafttubeivtMapper;
+
+ @Override
+ public Long createIvtShafttubeivt(IvtShafttubeivtSaveReqVO createReqVO) {
+ // 插入
+ IvtShafttubeivtDO ivtShafttubeivt = BeanUtils.toBean(createReqVO, IvtShafttubeivtDO.class);
+ ivtShafttubeivtMapper.insert(ivtShafttubeivt);
+
+ // 返回
+ return ivtShafttubeivt.getIvtId();
+ }
+
+ @Override
+ public void updateIvtShafttubeivt(IvtShafttubeivtSaveReqVO updateReqVO) {
+ // 校验存在
+ validateIvtShafttubeivtExists(updateReqVO.getIvtId());
+ // 更新
+ IvtShafttubeivtDO updateObj = BeanUtils.toBean(updateReqVO, IvtShafttubeivtDO.class);
+ ivtShafttubeivtMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteIvtShafttubeivt(Long id) {
+ // 校验存在
+ validateIvtShafttubeivtExists(id);
+ // 删除
+ ivtShafttubeivtMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteIvtShafttubeivtListByIds(List ids) {
+ // 删除
+ ivtShafttubeivtMapper.deleteByIds(ids);
+ }
+
+
+ private void validateIvtShafttubeivtExists(Long id) {
+ if (ivtShafttubeivtMapper.selectById(id) == null) {
+ throw exception(IVT_SHAFTTUBEIVT_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public IvtShafttubeivtDO getIvtShafttubeivt(Long id) {
+ return ivtShafttubeivtMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getIvtShafttubeivtPage(IvtShafttubeivtPageReqVO pageReqVO) {
+ return ivtShafttubeivtMapper.selectPage(pageReqVO);
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilService.java
new file mode 100644
index 00000000..3822e4c3
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilService.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.lms.service.pda;
+
+import cn.code.nl.module.lms.controller.pda.vo.NeedEmptyAxisReqVO;
+import cn.code.nl.module.lms.controller.pda.vo.RawFoilWorkOrderCreateReqVO;
+
+/**
+ * @author dsh
+ * 2026/7/23
+ * 手持 - 生箔服务
+ */
+public interface RawFoilService {
+
+ /**
+ * 手持 - 创建生箔工序工单
+ * @param createReqVO
+ * @return Long
+ */
+ Long createWorkOrder(RawFoilWorkOrderCreateReqVO createReqVO);
+
+ /**
+ * 手持 - 呼叫 上满下空
+ */
+ void needEmptyAxis(NeedEmptyAxisReqVO needEmptyAxisReqVO);
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilServiceImpl.java
new file mode 100644
index 00000000..147ba1f1
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/pda/RawFoilServiceImpl.java
@@ -0,0 +1,172 @@
+package cn.code.nl.module.lms.service.pda;
+
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+import cn.code.nl.module.base.api.materialbase.MaterialBaseApi;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseRespDTO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilpointivt.RawFoilPointIVTDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilworkorder.RawFoilWorkOrderDO;
+import cn.code.nl.module.lms.dal.mysql.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionMapper;
+import cn.code.nl.module.lms.dal.mysql.rawfoilpointivt.RawFoilPointIVTMapper;
+import cn.code.nl.module.lms.dal.mysql.rawfoilworkorder.RawFoilWorkOrderMapper;
+import cn.code.nl.module.lms.enums.*;
+import cn.code.nl.module.lms.service.rawfoilcasheposition.RawFoilCashePositionService;
+import cn.code.nl.module.lms.service.rawfoilpointivt.RawFoilPointIVTService;
+import cn.code.nl.module.task.enums.AcsTaskTypeEnum;
+import cn.code.nl.module.lms.controller.pda.vo.NeedEmptyAxisReqVO;
+import cn.code.nl.module.lms.controller.pda.vo.RawFoilWorkOrderCreateReqVO;
+import cn.code.nl.module.task.api.TransportTaskApi;
+import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
+import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
+import cn.code.nl.module.task.enums.TaskTypeEnum;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*;
+
+/**
+ * @author dsh
+ * 2026/7/23
+ */
+@Slf4j
+@Service
+public class RawFoilServiceImpl implements RawFoilService{
+
+ @Resource
+ private RawFoilWorkOrderMapper rawFoilWorkOrderMapper;
+
+ @Resource
+ private MaterialBaseApi materialBaseApi;
+
+ @Resource
+ private RawFoilPointIVTMapper rawFoilPointIVTMapper;
+
+ @Resource
+ private RawFoilEmptyRollerCashePositionMapper rawFoilEmptyRollerCashePositionMapper;
+
+ @Resource
+ private TransportTaskApi transportTaskApi;
+
+ @Resource
+ private RawFoilCashePositionService rawFoilCashePositionService;
+
+ @Resource
+ private RawFoilPointIVTService rawFoilPointIVTService;
+
+ @Override
+ public Long createWorkOrder(RawFoilWorkOrderCreateReqVO createReqVO) {
+
+ RawFoilWorkOrderDO rawFoilWorkOrder = BeanUtils.toBean(createReqVO, RawFoilWorkOrderDO.class);
+
+ // 校验是否存在相同母卷号未结束的生箔工序工单
+ RawFoilWorkOrderDO rawFoilWorkOrderDO = rawFoilWorkOrderMapper.selectByContainerNameAndNotEndStatus(rawFoilWorkOrder.getContainerName());
+ if (ObjectUtil.isNotEmpty(rawFoilWorkOrderDO)){
+ throw exception(RAW_FOIL_WORK_ORDER_CONTAINER_NAME_EXISTS);
+ }
+
+ //校验生箔机点位是否存在
+ RawFoilPointIVTDO rawFoilPointIVTDO = rawFoilPointIVTMapper.selectByPointCode(rawFoilWorkOrder.getPointCode());
+ if (ObjectUtil.isEmpty(rawFoilPointIVTDO)){
+ throw exception(RAW_FOIL_WORK_ORDER_POINT_CODE_NOT_EXISTS);
+ }
+
+ //判断物料是否存在
+ //远程调用物料API
+ CommonResult result = materialBaseApi.getMaterialBaseByCode(rawFoilWorkOrder.getProductCode());
+ // 判断是否访问成功 || 是否存在物料数据 || 物料是否已启用
+ if (result.isError() || ObjectUtil.isEmpty(result.getData()) || String.valueOf(CommonStatusEnum.ENABLE.getStatus()).equals(result.getData().getIsUsed())){
+ throw exception(RAW_FOIL_WORK_ORDER_MATERIAL_NOT_EXISTS);
+ }
+
+ rawFoilWorkOrder.setWorkorderId(IdUtil.getSnowflakeNextId());
+ rawFoilWorkOrder.setProductionArea(rawFoilPointIVTDO.getProductionArea());
+ rawFoilWorkOrder.setStatus(RawFoilWorkOrderStatusEnum.START.getCode());
+
+ // 插入
+ rawFoilWorkOrderMapper.insert(rawFoilWorkOrder);
+
+ // 返回
+ return rawFoilWorkOrder.getWorkorderId();
+ }
+
+ @Override
+ public void needEmptyAxis(NeedEmptyAxisReqVO needEmptyAxisReqVO) {
+
+ RawFoilWorkOrderDO rawFoilWorkOrderDO = rawFoilWorkOrderMapper.selectById(needEmptyAxisReqVO.getWorkorderId());
+
+ // 校验工单是否存在
+ if (ObjectUtil.isEmpty(rawFoilWorkOrderDO)){
+ throw exception(RAW_FOIL_WORK_ORDER_NOT_EXISTS);
+ }
+
+ // 校验生箔工序工单状态
+ if (!RawFoilWorkOrderStatusEnum.START.getCode().equals(rawFoilWorkOrderDO.getStatus())){
+ throw exception(RAW_FOIL_WORK_ORDER_STATUS_NOT_START);
+ }
+
+ // 分配下满上空任务点位
+ // 1.分配空辊站点 分配规则:按顺序分配 需要二次分配 先下发等待点
+ // 2.分配生箔机下料位
+ // 3.分配生箔机上空辊点位
+ // 4.分配母卷下料位 分配规则:称重位>称重缓存位>母卷缓存位离称重位近的点位优先
+
+ // 校验是否存在空辊等待点
+ RawFoilEmptyRollerCashePositionDO emptyRollerCashePositionDO = rawFoilEmptyRollerCashePositionMapper.selectEmptyRollerWaitPointByPointType(EmptyRollerPointTypeEnum.RAW_FOIL_EMPTY_ROLLER_WAIT_POINT.getCode());
+ if (ObjectUtil.isEmpty(emptyRollerCashePositionDO)){
+ throw exception(EMPTY_ROLLER_CASHE_POSITION_WAIT_POINT_NOT_EXISTS);
+ }
+
+ // 分配并占用生箔机点位(校验点位存在、已启用;CAS 占用,抢占失败抛出点位被占用异常)
+ RawFoilPointIVTDO rawFoilPointIVTDO = rawFoilPointIVTService.allocatePoint(rawFoilWorkOrderDO.getPointCode());
+
+ TransportTaskCreateReqDTO reqDTO = new TransportTaskCreateReqDTO();
+ reqDTO.setTaskName(UUID.randomUUID().toString());
+ reqDTO.setOwnerService(TaskOwnerServiceEnum.LMS.getCode());
+ reqDTO.setHandleCode(RawFoilHandleCodeConstants.RAW_FOIL_TASK);
+ reqDTO.setAcsTaskType(AcsTaskTypeEnum.TRUSS_TASK.getCode());
+ reqDTO.setAgvSystemType("1");
+ reqDTO.setPointCode1(emptyRollerCashePositionDO.getPointCode());
+ reqDTO.setPointCode2(rawFoilPointIVTDO.getPointCode() + "_M");
+ reqDTO.setPointCode3(rawFoilPointIVTDO.getPointCode() + "_K");
+ reqDTO.setMaterialCode(rawFoilWorkOrderDO.getContainerName());
+ reqDTO.setPriority("1");
+ reqDTO.setProductArea(rawFoilWorkOrderDO.getProductionArea());
+ reqDTO.setIsAutoIssue("1");
+ reqDTO.setIsCreateFinish(true);
+ reqDTO.setTaskType(TaskTypeEnum.RAW_FOIL_STANDARD_TASK.getCode());
+
+ // 分配母卷下料位并占用、创建搬运任务;失败时补偿释放已占用的点位,避免点位死锁
+ RawFoilCashePositionDO unloadingPosition = null;
+ try {
+ // 分配母卷下料位并占用(优先级:称重位 > 称重缓存位 > 常规缓存位)
+ unloadingPosition = rawFoilCashePositionService.allocateUnloadingPosition();
+ reqDTO.setPointCode4(unloadingPosition.getPointCode());
+
+ CommonResult result = transportTaskApi.createTransportTask(reqDTO);
+ if (result.isError()) {
+ log.error("创建搬运任务失败, workorderId={}, reqDTO={}, 返回={}",
+ needEmptyAxisReqVO.getWorkorderId(), reqDTO, result);
+ throw exception(RAW_FOIL_TRANSPORT_TASK_CREATE_FAIL);
+ }
+ } catch (Exception e) {
+ // 补偿释放:生箔机点位 + 母卷下料位(下料位尚未分配成功时跳过)
+ rawFoilPointIVTService.releasePointLock(rawFoilPointIVTDO.getPointCode());
+ if (ObjectUtil.isNotEmpty(unloadingPosition)) {
+ rawFoilCashePositionService.releasePositionLock(unloadingPosition.getPointCode());
+ }
+ throw e;
+ }
+
+ // 更新生箔工单状态
+ rawFoilWorkOrderDO.setStatus(RawFoilWorkOrderStatusEnum.EXECUTION.getCode());
+ rawFoilWorkOrderMapper.updateById(rawFoilWorkOrderDO);
+ }
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionService.java
new file mode 100644
index 00000000..e738ade5
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionService.java
@@ -0,0 +1,104 @@
+package cn.code.nl.module.lms.service.rawfoilcasheposition;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 生箔母卷缓存位 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface RawFoilCashePositionService {
+
+ /**
+ * 创建生箔母卷缓存位
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createRawFoilCashePosition(@Valid RawFoilCashePositionSaveReqVO createReqVO);
+
+ /**
+ * 更新生箔母卷缓存位
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateRawFoilCashePosition(@Valid RawFoilCashePositionSaveReqVO updateReqVO);
+
+ /**
+ * 删除生箔母卷缓存位
+ *
+ * @param id 编号
+ */
+ void deleteRawFoilCashePosition(Long id);
+
+ /**
+ * 批量删除生箔母卷缓存位
+ *
+ * @param ids 编号
+ */
+ void deleteRawFoilCashePositionListByIds(List ids);
+
+ /**
+ * 获得生箔母卷缓存位
+ *
+ * @param id 编号
+ * @return 生箔母卷缓存位
+ */
+ RawFoilCashePositionDO getRawFoilCashePosition(Long id);
+
+ /**
+ * 获得生箔母卷缓存位分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 生箔母卷缓存位分页
+ */
+ PageResult getRawFoilCashePositionPage(RawFoilCashePositionPageReqVO pageReqVO);
+
+ /**
+ * 分配母卷下料位并占用
+ * 优先级:称重位 > 称重缓存位 > 常规缓存位(顺序号越小离称重位越近)
+ * 通过 lock_status 条件更新原子占用,并发时同一点位只有一个调用方能抢到
+ *
+ * @return 已占用的下料位
+ */
+ RawFoilCashePositionDO allocateUnloadingPosition();
+
+ /**
+ * 母卷到达下料位:写入母卷信息并释放占用(任务完成回调用)
+ *
+ * @param pointCode 下料位编码
+ * @param containerName 母卷号
+ * @param workorderId 母卷工单标识(可为空,反查工单失败时传 null)
+ */
+ void handlePositionInstorage(String pointCode, String containerName, String workorderId);
+
+ /**
+ * 释放下料位占用(任务取消、任务创建失败补偿用)
+ *
+ * @param pointCode 下料位编码
+ */
+ void releasePositionLock(String pointCode);
+
+ /**
+ * 分配常规缓存位并占用
+ * 无优先级排序需求:任一空闲常规位即可,通过 lock_status 条件更新原子占用
+ *
+ * @return 已占用的常规缓存位
+ */
+ RawFoilCashePositionDO allocateConventionalPosition();
+
+ /**
+ * 母卷离开起点:清空起点点位(称重位)上的母卷记录(任务完成回调用)
+ * 仅当点位上的母卷号匹配时清空,重复回调幂等
+ *
+ * @param pointCode 起点点位编码
+ * @param containerName 母卷号
+ */
+ void handlePositionOutstock(String pointCode, String containerName);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionServiceImpl.java
new file mode 100644
index 00000000..35e21cfb
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilcasheposition/RawFoilCashePositionServiceImpl.java
@@ -0,0 +1,152 @@
+package cn.code.nl.module.lms.service.rawfoilcasheposition;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import cn.code.nl.module.lms.controller.admin.rawfoilcasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.enums.RawFoilCashePositionTypeEnum;
+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.rawfoilcasheposition.RawFoilCashePositionMapper;
+
+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 诺力管理员
+ */
+@Slf4j
+@Service
+@Validated
+public class RawFoilCashePositionServiceImpl implements RawFoilCashePositionService {
+
+ /** 母卷下料位分配优先级:称重位 > 称重缓存位 > 常规缓存位 */
+ private static final List UNLOADING_POSITION_PRIORITY = List.of(
+ RawFoilCashePositionTypeEnum.WEIGHING_POSITION.getCode(),
+ RawFoilCashePositionTypeEnum.WEIGHING_BUFFER_POSITION.getCode(),
+ RawFoilCashePositionTypeEnum.CONVENTIONAL.getCode());
+
+ @Resource
+ private RawFoilCashePositionMapper rawFoilCashePositionMapper;
+
+ @Override
+ public Long createRawFoilCashePosition(RawFoilCashePositionSaveReqVO createReqVO) {
+ // 插入
+ RawFoilCashePositionDO rawFoilCashePosition = BeanUtils.toBean(createReqVO, RawFoilCashePositionDO.class);
+ rawFoilCashePosition.setIvtId(IdUtil.getSnowflakeNextId());
+ rawFoilCashePositionMapper.insert(rawFoilCashePosition);
+
+ // 返回
+ return rawFoilCashePosition.getIvtId();
+ }
+
+ @Override
+ public void updateRawFoilCashePosition(RawFoilCashePositionSaveReqVO updateReqVO) {
+ // 校验存在
+ validateRawFoilCashePositionExists(updateReqVO.getIvtId());
+ // 更新
+ RawFoilCashePositionDO updateObj = BeanUtils.toBean(updateReqVO, RawFoilCashePositionDO.class);
+ rawFoilCashePositionMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteRawFoilCashePosition(Long id) {
+ // 校验存在
+ validateRawFoilCashePositionExists(id);
+ // 删除
+ rawFoilCashePositionMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteRawFoilCashePositionListByIds(List ids) {
+ // 删除
+ rawFoilCashePositionMapper.deleteByIds(ids);
+ }
+
+
+ private void validateRawFoilCashePositionExists(Long id) {
+ if (rawFoilCashePositionMapper.selectById(id) == null) {
+ throw exception(RAW_FOIL_CASHE_POSITION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public RawFoilCashePositionDO getRawFoilCashePosition(Long id) {
+ return rawFoilCashePositionMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getRawFoilCashePositionPage(RawFoilCashePositionPageReqVO pageReqVO) {
+ return rawFoilCashePositionMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public RawFoilCashePositionDO allocateUnloadingPosition() {
+ return allocatePositionByPriority(UNLOADING_POSITION_PRIORITY);
+ }
+
+ @Override
+ public RawFoilCashePositionDO allocateConventionalPosition() {
+ // 常规缓存位无优先级排序需求,单类型直接分配
+ return allocatePositionByPriority(List.of(RawFoilCashePositionTypeEnum.CONVENTIONAL.getCode()));
+ }
+
+ /**
+ * 按点位类型优先级顺序分配点位并占用
+ * 逐级查询某类型全部空闲候选位,逐个尝试 CAS 占用;抢占失败(已被并发请求抢走)则顺延下一个候选位
+ *
+ * @param pointTypes 点位类型编码优先级列表
+ * @return 已占用的点位
+ */
+ private RawFoilCashePositionDO allocatePositionByPriority(List pointTypes) {
+ for (String pointType : pointTypes) {
+ List candidates = rawFoilCashePositionMapper.selectEmptyPositionList(pointType);
+ for (RawFoilCashePositionDO candidate : candidates) {
+ if (rawFoilCashePositionMapper.lockPosition(candidate.getIvtId()) > 0) {
+ return candidate;
+ }
+ }
+ }
+ throw exception(RAW_FOIL_CASHE_POSITION_NOT_SELECT);
+ }
+
+ @Override
+ public void handlePositionInstorage(String pointCode, String containerName, String workorderId) {
+ int rows = rawFoilCashePositionMapper.instoragePosition(pointCode, containerName,
+ workorderId, LocalDateTime.now());
+ if (rows == 0) {
+ log.info("下料位入库跳过(点位未被占用或已入库), pointCode={}, containerName={}", pointCode, containerName);
+ }
+ }
+
+ @Override
+ public void releasePositionLock(String pointCode) {
+ int rows = rawFoilCashePositionMapper.releaseLockByPointCode(pointCode);
+ if (rows == 0) {
+ log.info("下料位占用释放跳过(点位未被占用), pointCode={}", pointCode);
+ }
+ }
+
+ @Override
+ public void handlePositionOutstock(String pointCode, String containerName) {
+ int rows = rawFoilCashePositionMapper.outstockPosition(pointCode, containerName);
+ if (rows == 0) {
+ log.info("起点母卷出库跳过(点位上无该母卷), pointCode={}, containerName={}", pointCode, containerName);
+ }
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionService.java
new file mode 100644
index 00000000..1877e222
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionService.java
@@ -0,0 +1,73 @@
+package cn.code.nl.module.lms.service.rawfoilemptyrollercasheposition;
+
+import java.util.*;
+
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import jakarta.validation.*;
+import cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 空辊缓存位 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface RawFoilEmptyRollerCashePositionService {
+
+ /**
+ * 创建空辊缓存位
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createRawFoilEmptyRollerCashePosition(@Valid RawFoilEmptyRollerCashePositionSaveReqVO createReqVO);
+
+ /**
+ * 更新空辊缓存位
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateRawFoilEmptyRollerCashePosition(@Valid RawFoilEmptyRollerCashePositionSaveReqVO updateReqVO);
+
+ /**
+ * 删除空辊缓存位
+ *
+ * @param id 编号
+ */
+ void deleteRawFoilEmptyRollerCashePosition(Long id);
+
+ /**
+ * 批量删除空辊缓存位
+ *
+ * @param ids 编号
+ */
+ void deleteRawFoilEmptyRollerCashePositionListByIds(List ids);
+
+ /**
+ * 获得空辊缓存位
+ *
+ * @param id 编号
+ * @return 空辊缓存位
+ */
+ RawFoilEmptyRollerCashePositionDO getRawFoilEmptyRollerCashePosition(Long id);
+
+ /**
+ * 获得空辊缓存位分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 空辊缓存位分页
+ */
+ PageResult getRawFoilEmptyRollerCashePositionPage(RawFoilEmptyRollerCashePositionPageReqVO pageReqVO);
+
+ /**
+ * 分配空辊位并占用
+ * 按照顺序分配
+ * 通过 lock_status 条件更新原子占用,并发时同一点位只有一个调用方能抢到
+ *
+ * @return 已占用的空辊位
+ */
+ RawFoilEmptyRollerCashePositionDO allocateLoadingPosition(String pointType);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionServiceImpl.java
new file mode 100644
index 00000000..c7f2864c
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilemptyrollercasheposition/RawFoilEmptyRollerCashePositionServiceImpl.java
@@ -0,0 +1,105 @@
+package cn.code.nl.module.lms.service.rawfoilemptyrollercasheposition;
+
+import cn.code.nl.module.lms.dal.dataobject.rawfoilcasheposition.RawFoilCashePositionDO;
+import cn.code.nl.module.lms.enums.StockStatusEnum;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import cn.code.nl.module.lms.controller.admin.rawfoilemptyrollercasheposition.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+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.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionMapper;
+
+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 RawFoilEmptyRollerCashePositionServiceImpl implements RawFoilEmptyRollerCashePositionService {
+
+ @Resource
+ private RawFoilEmptyRollerCashePositionMapper rawFoilEmptyRollerCashePositionMapper;
+
+ @Override
+ public Long createRawFoilEmptyRollerCashePosition(RawFoilEmptyRollerCashePositionSaveReqVO createReqVO) {
+ // 插入
+ RawFoilEmptyRollerCashePositionDO rawFoilEmptyRollerCashePosition = BeanUtils.toBean(createReqVO, RawFoilEmptyRollerCashePositionDO.class);
+
+ rawFoilEmptyRollerCashePosition.setPointId(IdUtil.getSnowflakeNextId());
+ rawFoilEmptyRollerCashePositionMapper.insert(rawFoilEmptyRollerCashePosition);
+
+ // 返回
+ return rawFoilEmptyRollerCashePosition.getPointId();
+ }
+
+ @Override
+ public void updateRawFoilEmptyRollerCashePosition(RawFoilEmptyRollerCashePositionSaveReqVO updateReqVO) {
+ // 校验存在
+ validateRawFoilEmptyRollerCashePositionExists(updateReqVO.getPointId());
+ // 更新
+ RawFoilEmptyRollerCashePositionDO updateObj = BeanUtils.toBean(updateReqVO, RawFoilEmptyRollerCashePositionDO.class);
+ rawFoilEmptyRollerCashePositionMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteRawFoilEmptyRollerCashePosition(Long id) {
+ // 校验存在
+ validateRawFoilEmptyRollerCashePositionExists(id);
+ // 删除
+ rawFoilEmptyRollerCashePositionMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteRawFoilEmptyRollerCashePositionListByIds(List ids) {
+ // 删除
+ rawFoilEmptyRollerCashePositionMapper.deleteByIds(ids);
+ }
+
+
+ private void validateRawFoilEmptyRollerCashePositionExists(Long id) {
+ if (rawFoilEmptyRollerCashePositionMapper.selectById(id) == null) {
+ throw exception(RAW_FOIL_EMPTY_ROLLER_CASHE_POSITION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public RawFoilEmptyRollerCashePositionDO getRawFoilEmptyRollerCashePosition(Long id) {
+ return rawFoilEmptyRollerCashePositionMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getRawFoilEmptyRollerCashePositionPage(RawFoilEmptyRollerCashePositionPageReqVO pageReqVO) {
+ return rawFoilEmptyRollerCashePositionMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public RawFoilEmptyRollerCashePositionDO allocateLoadingPosition(String pointType) {
+
+ List candidates = rawFoilEmptyRollerCashePositionMapper.selectEmptyPositionList(pointType, StockStatusEnum.YES.getCode());
+ // 尝试 CAS 占用
+ for (RawFoilEmptyRollerCashePositionDO candidate : candidates) {
+ if (rawFoilEmptyRollerCashePositionMapper.lockPosition(candidate.getPointId()) > 0) {
+ return candidate;
+ }
+ }
+ throw exception(EMPTY_ROLLER_CASHE_POSITION_NOT_ALLOCATE);
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTService.java
index 44734659..d97e8084 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTService.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTService.java
@@ -1,62 +1,78 @@
-package cn.code.nl.module.lms.service.rawfoilpointivt;
-
-import java.util.*;
-import jakarta.validation.*;
-import cn.code.nl.module.lms.controller.admin.rawfoilpointivt.vo.*;
-import cn.code.nl.module.lms.dal.dataobject.rawfoilpointivt.RawFoilPointIVTDO;
-import cn.code.nl.framework.common.pojo.PageResult;
-import cn.code.nl.framework.common.pojo.PageParam;
-
-/**
- * 生箔点位库存 Service 接口
- *
- * @author 诺力管理员
- */
-public interface RawFoilPointIVTService {
-
- /**
- * 创建生箔点位库存
- *
- * @param createReqVO 创建信息
- * @return 编号
- */
- Long createRawFoilPointIVT(@Valid RawFoilPointIVTSaveReqVO createReqVO);
-
- /**
- * 更新生箔点位库存
- *
- * @param updateReqVO 更新信息
- */
- void updateRawFoilPointIVT(@Valid RawFoilPointIVTSaveReqVO updateReqVO);
-
- /**
- * 删除生箔点位库存
- *
- * @param id 编号
- */
- void deleteRawFoilPointIVT(Long id);
-
- /**
- * 批量删除生箔点位库存
- *
- * @param ids 编号
- */
- void deleteRawFoilPointIVTListByIds(List ids);
-
- /**
- * 获得生箔点位库存
- *
- * @param id 编号
- * @return 生箔点位库存
- */
- RawFoilPointIVTDO getRawFoilPointIVT(Long id);
-
- /**
- * 获得生箔点位库存分页
- *
- * @param pageReqVO 分页查询
- * @return 生箔点位库存分页
- */
- PageResult getRawFoilPointIVTPage(RawFoilPointIVTPageReqVO pageReqVO);
-
-}
\ No newline at end of file
+package cn.code.nl.module.lms.service.rawfoilpointivt;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.lms.controller.admin.rawfoilpointivt.vo.*;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilpointivt.RawFoilPointIVTDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 生箔点位库存 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface RawFoilPointIVTService {
+
+ /**
+ * 创建生箔点位库存
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createRawFoilPointIVT(@Valid RawFoilPointIVTSaveReqVO createReqVO);
+
+ /**
+ * 更新生箔点位库存
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateRawFoilPointIVT(@Valid RawFoilPointIVTSaveReqVO updateReqVO);
+
+ /**
+ * 删除生箔点位库存
+ *
+ * @param id 编号
+ */
+ void deleteRawFoilPointIVT(Long id);
+
+ /**
+ * 批量删除生箔点位库存
+ *
+ * @param ids 编号
+ */
+ void deleteRawFoilPointIVTListByIds(List ids);
+
+ /**
+ * 获得生箔点位库存
+ *
+ * @param id 编号
+ * @return 生箔点位库存
+ */
+ RawFoilPointIVTDO getRawFoilPointIVT(Long id);
+
+ /**
+ * 获得生箔点位库存分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 生箔点位库存分页
+ */
+ PageResult getRawFoilPointIVTPage(RawFoilPointIVTPageReqVO pageReqVO);
+
+ /**
+ * 分配并占用生箔机点位:校验点位存在、已启用后 CAS 占用
+ * 点位不存在、未启用、抢占失败时抛出对应业务异常
+ *
+ * @param pointCode 点位编码
+ * @return 已占用的生箔机点位信息
+ */
+ RawFoilPointIVTDO allocatePoint(String pointCode);
+
+ /**
+ * 释放生箔机点位占用:幂等释放,仅当点位被占用时释放
+ *
+ * @param pointCode 点位编码
+ */
+ void releasePointLock(String pointCode);
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTServiceImpl.java
index cacb287e..51e796a9 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTServiceImpl.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilpointivt/RawFoilPointIVTServiceImpl.java
@@ -1,7 +1,10 @@
package cn.code.nl.module.lms.service.rawfoilpointivt;
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -26,6 +29,7 @@ import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*;
*
* @author 诺力管理员
*/
+@Slf4j
@Service
@Validated
public class RawFoilPointIVTServiceImpl implements RawFoilPointIVTService {
@@ -83,4 +87,30 @@ public class RawFoilPointIVTServiceImpl implements RawFoilPointIVTService {
return rawFoilPointIVTMapper.selectPage(pageReqVO);
}
+ @Override
+ public RawFoilPointIVTDO allocatePoint(String pointCode) {
+ // 校验生箔机点位是否存在
+ RawFoilPointIVTDO rawFoilPointIVT = rawFoilPointIVTMapper.selectByPointCode(pointCode);
+ if (ObjectUtil.isEmpty(rawFoilPointIVT)) {
+ throw exception(RAW_FOIL_WORK_ORDER_POINT_CODE_NOT_EXISTS);
+ }
+ // 校验生箔机点位是否启用
+ if (String.valueOf(CommonStatusEnum.ENABLE.getStatus()).equals(rawFoilPointIVT.getIsUsed())) {
+ throw exception(RAW_FOIL_WORK_ORDER_POINT_CODE_NOT_USED);
+ }
+ // CAS 占用:抢占失败说明已被其他工单占用
+ if (rawFoilPointIVTMapper.lockPoint(rawFoilPointIVT.getPointId()) == 0) {
+ throw exception(RAW_FOIL_WORK_ORDER_POINT_OCCUPIED, rawFoilPointIVT.getPointCode());
+ }
+ return rawFoilPointIVT;
+ }
+
+ @Override
+ public void releasePointLock(String pointCode) {
+ int rows = rawFoilPointIVTMapper.releaseLockByPointCode(pointCode);
+ if (rows == 0) {
+ log.info("生箔机点位占用释放跳过(点位未被占用), pointCode={}", pointCode);
+ }
+ }
+
}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilworkorder/RawFoilWorkOrderServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilworkorder/RawFoilWorkOrderServiceImpl.java
index 9d7363e2..a144917f 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilworkorder/RawFoilWorkOrderServiceImpl.java
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/rawfoilworkorder/RawFoilWorkOrderServiceImpl.java
@@ -7,6 +7,9 @@ import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseRespDTO;
import cn.code.nl.module.lms.dal.dataobject.rawfoilpointivt.RawFoilPointIVTDO;
import cn.code.nl.module.lms.dal.mysql.rawfoilpointivt.RawFoilPointIVTMapper;
import cn.code.nl.module.lms.enums.RawFoilWorkOrderStatusEnum;
+import cn.code.nl.module.task.api.TransportTaskApi;
+import cn.code.nl.module.task.dto.TaskInfoDTO;
+import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
@@ -48,6 +51,9 @@ public class RawFoilWorkOrderServiceImpl implements RawFoilWorkOrderService {
@Resource
private MaterialBaseApi materialBaseApi;
+ @Resource
+ private TransportTaskApi transportTaskApi;
+
@Override
public Long createRawFoilWorkOrder(RawFoilWorkOrderSaveReqVO createReqVO) {
@@ -176,7 +182,14 @@ public class RawFoilWorkOrderServiceImpl implements RawFoilWorkOrderService {
throw exception(RAW_FOIL_WORK_ORDER_ALREADY_ENDED);
}
- // TODO 校验该生箔工单存在未完成的任务,请先完成任务。
+ // 校验该生箔工单存在未完成的任务,请先完成任务。
+ CommonResult> result = transportTaskApi.getRunningTaskByMaterialCode(workOrder.getContainerName(), TaskOwnerServiceEnum.LMS.getCode());
+ if (result.isError()){
+ throw exception(RAW_FOIL_WORK_ORDER_FAIL);
+ }
+ if (result.getData() != null){
+ throw exception(RAW_FOIL_WORK_ORDER_NOT_SELECT);
+ }
// 更新为结束状态,并记录结束时间
RawFoilWorkOrderDO updateObj = new RawFoilWorkOrderDO();
diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/task/RawFoilTask.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/task/RawFoilTask.java
new file mode 100644
index 00000000..a51ffd54
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/task/RawFoilTask.java
@@ -0,0 +1,115 @@
+package cn.code.nl.module.lms.task;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+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.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionDO;
+import cn.code.nl.module.lms.dal.dataobject.rawfoilworkorder.RawFoilWorkOrderDO;
+import cn.code.nl.module.lms.dal.mysql.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionMapper;
+import cn.code.nl.module.lms.dal.mysql.rawfoilworkorder.RawFoilWorkOrderMapper;
+import cn.code.nl.module.lms.enums.EmptyRollerPointTypeEnum;
+import cn.code.nl.module.lms.enums.RawFoilHandleCodeConstants;
+import cn.code.nl.module.lms.service.rawfoilcasheposition.RawFoilCashePositionService;
+import cn.code.nl.module.lms.service.rawfoilemptyrollercasheposition.RawFoilEmptyRollerCashePositionService;
+import cn.code.nl.module.task.api.TransportTaskApi;
+import cn.code.nl.module.task.dto.TaskInfoDTO;
+import cn.code.nl.module.task.enums.TransportTaskStatusEnum;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.lms.enums.ErrorCodeConstants.RAW_FOIL_TASK_ERROR;
+
+/**
+ * 生箔搬运任务回调处理器
+ * 任务完成:母卷到达下料位,写入母卷信息并释放点位占用
+ * 任务取消:释放下料位占用
+ *
+ * @author dsh
+ * 2026/7/28
+ */
+@Slf4j
+@Component(RawFoilHandleCodeConstants.RAW_FOIL_TASK)
+public class RawFoilTask extends AbstractTask {
+
+ @Resource
+ private TransportTaskApi transportTaskApi;
+
+ @Resource
+ private RawFoilCashePositionService rawFoilCashePositionService;
+
+ @Resource
+ private RawFoilEmptyRollerCashePositionService rawFoilEmptyRollerCashePositionService;
+
+ @Resource
+ private RawFoilWorkOrderMapper rawFoilWorkOrderMapper;
+
+ /**
+ * 处理任务完成:母卷到达下料位,写入母卷信息并释放点位占用
+ *
+ * @param taskExecuteDTO 任务执行信息
+ */
+ @Override
+ public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) {
+ // 查询任务全量信息,获取下料位编码和母卷号
+ TaskInfoDTO task = getTaskInfo(taskExecuteDTO.getTaskId());
+ if (task == null) {
+ return;
+ }
+ // 用母卷号反查未结束工单,获取工单标识(反查失败仅告警,不阻塞入库主流程)
+ RawFoilWorkOrderDO workOrder = rawFoilWorkOrderMapper
+ .selectByContainerNameAndNotEndStatus(task.getMaterialCode());
+ if (workOrder == null) {
+ log.warn("母卷号反查工单失败, containerName={}, taskId={}",
+ task.getMaterialCode(), task.getTaskId());
+ }
+ String workorderId = workOrder != null ? String.valueOf(workOrder.getWorkorderId()) : null;
+ // 母卷到达下料位:写入母卷信息并释放占用
+ rawFoilCashePositionService.handlePositionInstorage(
+ task.getPointCode4(), task.getMaterialCode(), workorderId);
+
+
+ }
+
+ /**
+ * 处理任务取消:释放下料位占用
+ *
+ * @param taskExecuteDTO 任务执行信息
+ */
+ @Override
+ public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) {
+ TaskInfoDTO task = getTaskInfo(taskExecuteDTO.getTaskId());
+ if (task == null) {
+ return;
+ }
+ rawFoilCashePositionService.releasePositionLock(task.getPointCode4());
+ }
+
+ @Override
+ public String againApply(TaskExecuteDTO taskExecuteDTO) {
+ TaskInfoDTO task = getTaskInfo(taskExecuteDTO.getTaskId());
+ if (task == null){
+ throw exception(RAW_FOIL_TASK_ERROR);
+ }
+ //二次分配库位 分配生箔空辊点
+ RawFoilEmptyRollerCashePositionDO rawFoilEmptyRollerCashePositionDO = rawFoilEmptyRollerCashePositionService.allocateLoadingPosition(EmptyRollerPointTypeEnum.RAW_FOIL_EMPTY_ROLLER_POINT.getCode());
+ return rawFoilEmptyRollerCashePositionDO.getPointCode();
+ }
+
+ /**
+ * 查询任务信息,查询失败或任务不存在或任务状态为最终状态时记录告警并返回 null(不抛异常,避免 MQ 无限重试)
+ *
+ * @param taskId 任务标识
+ * @return 任务信息,不存在时返回 null
+ */
+ private TaskInfoDTO getTaskInfo(Long taskId) {
+ CommonResult result = transportTaskApi.getTaskById(taskId);
+ if (result.isError() || result.getData() == null) {
+ log.warn("任务不存在或查询失败,跳过点位状态处理, taskId={}, 返回={}", taskId, result);
+ return null;
+ }
+ return result.getData();
+ }
+
+}
diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/application-dev.yaml b/nl-module-lms/nl-module-lms-server/src/main/resources/application-dev.yaml
index 6379951a..2d9ac335 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/resources/application-dev.yaml
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/application-dev.yaml
@@ -7,12 +7,12 @@ spring:
username: nacos
password: nacos
discovery: # 【配置中心】配置项
- namespace: dev # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: dev # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
--- #################### 数据库相关配置 ####################
@@ -140,4 +140,4 @@ logging:
# 芋道配置项,设置当前项目所有自定义的配置
nl:
- demo: false # 开启演示模式
\ No newline at end of file
+ demo: false # 开启演示模式
diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/application-mq-dev.yaml b/nl-module-lms/nl-module-lms-server/src/main/resources/application-mq-dev.yaml
index cb823736..836b81dd 100644
--- a/nl-module-lms/nl-module-lms-server/src/main/resources/application-mq-dev.yaml
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/application-mq-dev.yaml
@@ -3,9 +3,14 @@
rocketmq:
name-server: 192.168.81.193:9876
producer:
- group: lms_producer_dev_group # 事务消息需要配置一样
+ group: nl_producer_dev_group
send-message-timeout: 3000
consumer:
+ wms-task-operate:
+ group: wms_task_status_change_dev_group
+ topic: wms_task_status_change_dev_topic
lms-task-operate:
group: lms_task_status_change_dev_group
- topic: lms_task_status_change_dev_topic
\ No newline at end of file
+ topic: lms_task_status_change_dev_topic
+ task:
+ topic: task_status_change_dev_topic
\ No newline at end of file
diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/btivtcutpointivt/BtIvtCutpointivtMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/btivtcutpointivt/BtIvtCutpointivtMapper.xml
new file mode 100644
index 00000000..84e7488d
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/btivtcutpointivt/BtIvtCutpointivtMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtcutpointIvt/IvtCutpointivtMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtcutpointIvt/IvtCutpointivtMapper.xml
new file mode 100644
index 00000000..26ce70eb
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtcutpointIvt/IvtCutpointivtMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtshafttubeivt/IvtShafttubeivtMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtshafttubeivt/IvtShafttubeivtMapper.xml
new file mode 100644
index 00000000..b2cb1460
--- /dev/null
+++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/ivtshafttubeivt/IvtShafttubeivtMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/job/slitter/AutoCallAirShaftTask.java b/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/job/slitter/AutoCallAirShaftTask.java
new file mode 100644
index 00000000..a53fa3d7
--- /dev/null
+++ b/nl-module-system/nl-module-system-server/src/main/java/cn/code/nl/module/system/job/slitter/AutoCallAirShaftTask.java
@@ -0,0 +1,23 @@
+package cn.code.nl.module.system.job.slitter;
+
+import cn.code.nl.framework.tenant.core.job.TenantJob;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 自动套轴任务创建
+ */
+@Component
+public class AutoCallAirShaftTask {
+
+
+
+ @XxlJob("autoCallAirShaftTask")
+ @TenantJob
+ public void execute() {
+
+
+
+ }
+}
diff --git a/nl-module-system/nl-module-system-server/src/main/resources/application-dev.yaml b/nl-module-system/nl-module-system-server/src/main/resources/application-dev.yaml
index c6d5d1a5..c9012eb3 100644
--- a/nl-module-system/nl-module-system-server/src/main/resources/application-dev.yaml
+++ b/nl-module-system/nl-module-system-server/src/main/resources/application-dev.yaml
@@ -4,15 +4,15 @@ spring:
cloud:
nacos:
server-addr: 192.168.81.193:8848 # Nacos 服务器地址
- username: nacos
- password: nacos
+ username: # Nacos 账号
+ password: # Nacos 密码
discovery: # 【配置中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: 91c8ac41-7fb0-423b-947e-2caad4c87d41 # 命名空间。这里使用 dev 开发环境
+ namespace: 9a321b6b-68c6-45e1-90b0-bc187d7c29bb # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
--- #################### 数据库相关配置 ####################
@@ -57,14 +57,14 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
- url: jdbc:mysql://127.0.0.1:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root
- password: root
+ password: root123
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
@@ -99,7 +99,7 @@ xxl:
accessToken: 123456 # 执行器通讯TOKEN
executor:
ip: 192.168.81.193
- port: 8992
+ port: 9982
--- #################### 服务保障相关配置 ####################
diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/AcsTaskTypeEnum.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/AcsTaskTypeEnum.java
new file mode 100644
index 00000000..6b80c9ba
--- /dev/null
+++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/AcsTaskTypeEnum.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.task.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/7/28
+ */
+@Getter
+public enum AcsTaskTypeEnum {
+
+ AGV_TASK("1","agv任务"),
+ TRUSS_TASK("6","桁架任务");
+
+
+ private String code;
+
+ private String name;
+
+ AcsTaskTypeEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+}
diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskOwnerServiceEnum.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskOwnerServiceEnum.java
index d007a9ed..9c476647 100644
--- a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskOwnerServiceEnum.java
+++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskOwnerServiceEnum.java
@@ -5,6 +5,8 @@ import lombok.Getter;
/**
* 任务业务归属服务枚举
+ * @author dsh
+ * 2026/7/29
*/
@Getter
@AllArgsConstructor
@@ -13,6 +15,10 @@ public enum TaskOwnerServiceEnum {
LMS("lms", "LMS"),
WMS("wms", "WMS");
+ private String code;
+
+ private String name;
+
/**
* MQ Topic 前缀
*/
diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskTypeEnum.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskTypeEnum.java
new file mode 100644
index 00000000..b861612a
--- /dev/null
+++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TaskTypeEnum.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.task.enums;
+
+import lombok.Getter;
+
+/**
+ * @author dsh
+ * 2026/7/30
+ */
+@Getter
+public enum TaskTypeEnum {
+
+ RAW_FOIL_STANDARD_TASK("010101","生箔标准任务"),
+ RAW_FOIL_INSTORAGE_TASK("010102","称重入库任务");
+
+
+ private String code;
+
+ private String name;
+
+ TaskTypeEnum(String code,String name){
+ this.code = code;
+ this.name = name;
+ }
+}
diff --git a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BsrealStorAttrMapper.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BtIvtCutpointivtMapper.xml
similarity index 100%
rename from nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BsrealStorAttrMapper.xml
rename to nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BtIvtCutpointivtMapper.xml
diff --git a/nl-server/src/main/resources/application-dev.yaml b/nl-server/src/main/resources/application-dev.yaml
index 9b465d8e..e1987936 100644
--- a/nl-server/src/main/resources/application-dev.yaml
+++ b/nl-server/src/main/resources/application-dev.yaml
@@ -74,7 +74,7 @@ xxl:
executor:
appname: nl-lms-server
ip: 192.168.81.193
- port: 9992
+ port: 9982
--- #################### 消息队列相关 ####################
@@ -209,4 +209,4 @@ iot:
# 插件配置
pf4j:
- pluginsDir: ${user.home}/plugins # 插件目录
\ No newline at end of file
+ pluginsDir: ${user.home}/plugins # 插件目录
diff --git a/nl-server/src/main/resources/application.yaml b/nl-server/src/main/resources/application.yaml
index bd810b43..0bfabaed 100644
--- a/nl-server/src/main/resources/application.yaml
+++ b/nl-server/src/main/resources/application.yaml
@@ -374,4 +374,4 @@ nl:
message-bus:
type: redis # 消息总线的类型
-debug: false
+debug: false
\ 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/btivtcutpointivt/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/btivtcutpointivt/index.ts
new file mode 100644
index 00000000..2b6cc857
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/btivtcutpointivt/index.ts
@@ -0,0 +1,68 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace BtcutpointivtBtIvtCutpointivtApi {
+ /** 分切区缓存点位库存信息 */
+ export interface BtIvtCutpointivt {
+ pointCode?: string; // AGV点位编码
+ pointName: string; // AGV点位名称
+ trussPointCode1?: string; // 桁架点位编码1
+ trussPointCode2?: string; // 桁架点位编码2
+ qzzNo1: string; // 气胀轴编码1
+ qzzNo2: string; // 气胀轴编码2
+ upGx: string; // 上轴管芯
+ downGx: string; // 下轴管芯
+ pointType: string; // 点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位
+ productArea: string; // 生产区域
+ sortSeq?: number; // 顺序号
+ isUsed?: string; // 是否启用
+ remark: string; // 备注
+ pointStatus: string; // 点位状态
+ }
+}
+
+/** 查询分切区缓存点位库存分页 */
+export function getBtIvtCutpointivtPage(params: PageParam) {
+ return requestClient.get>(
+ '/btcutpointivt/bt-ivt-cutpointivt/page',
+ { params },
+ );
+}
+
+/** 查询分切区缓存点位库存详情 */
+export function getBtIvtCutpointivt(id: number) {
+ return requestClient.get(
+ `/btcutpointivt/bt-ivt-cutpointivt/get?id=${id}`,
+ );
+}
+
+/** 新增分切区缓存点位库存 */
+export function createBtIvtCutpointivt(data: BtcutpointivtBtIvtCutpointivtApi.BtIvtCutpointivt) {
+ return requestClient.post('/btcutpointivt/bt-ivt-cutpointivt/create', data);
+}
+
+/** 修改分切区缓存点位库存 */
+export function updateBtIvtCutpointivt(data: BtcutpointivtBtIvtCutpointivtApi.BtIvtCutpointivt) {
+ return requestClient.put('/btcutpointivt/bt-ivt-cutpointivt/update', data);
+}
+
+/** 删除分切区缓存点位库存 */
+export function deleteBtIvtCutpointivt(id: number) {
+ return requestClient.delete(`/btcutpointivt/bt-ivt-cutpointivt/delete?id=${id}`);
+}
+
+/** 批量删除分切区缓存点位库存 */
+export function deleteBtIvtCutpointivtList(ids: number[]) {
+ return requestClient.delete(
+ `/btcutpointivt/bt-ivt-cutpointivt/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出分切区缓存点位库存 */
+export function exportBtIvtCutpointivt(params: any) {
+ return requestClient.download('/btcutpointivt/bt-ivt-cutpointivt/export-excel', { params });
+}
+
+
\ 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/cutpointivt/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/cutpointivt/index.ts
new file mode 100644
index 00000000..d74ebec1
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/cutpointivt/index.ts
@@ -0,0 +1,78 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace CutpointivtIvtCutpointivtApi {
+ /** 分切区点位库存信息 */
+ export interface IvtCutpointivt {
+ pointCode?: string; // 点位编码
+ fullPointCode: string; // 满轴位编码
+ fullPointStatus?: string; // 满轴位状态
+ containerName: string; // 母卷号
+ fullVehicleCode: string; // 母卷轴编码
+ emptyPointCode: string; // 空轴位编码
+ emptyPointStatus?: string; // 空轴位状态
+ emptyVehicleCode: string; // 空轴编码
+ productArea: string; // 生产区域
+ pointLocation: string; // 位置
+ upPointCode: string; // 分切下料位上轴点位
+ downPointCode: string; // 分切下料位下轴点位
+ sortSeq: number; // 顺序号
+ isUsed: string; // 是否启用
+ remark: string; // 备注
+ createId: number; // 创建人
+ createName: string; // 创建人姓名
+ updateOptid: number; // 修改人
+ updateOptname: string; // 修改人姓名
+ plan: string; // 规划
+ extCode: string; // 对应MES系统设备编码
+ upQzzno: string; // 分切下料位上轴
+ downQzzno: string; // 分切下料位下轴
+ qzzGeneration: string; // 气胀轴代数
+ }
+}
+
+/** 查询分切区点位库存分页 */
+export function getIvtCutpointivtPage(params: PageParam) {
+ return requestClient.get>(
+ '/cutpointivt/ivt-cutpointivt/page',
+ { params },
+ );
+}
+
+/** 查询分切区点位库存详情 */
+export function getIvtCutpointivt(id: number) {
+ return requestClient.get(
+ `/cutpointivt/ivt-cutpointivt/get?id=${id}`,
+ );
+}
+
+/** 新增分切区点位库存 */
+export function createIvtCutpointivt(data: CutpointivtIvtCutpointivtApi.IvtCutpointivt) {
+ return requestClient.post('/cutpointivt/ivt-cutpointivt/create', data);
+}
+
+/** 修改分切区点位库存 */
+export function updateIvtCutpointivt(data: CutpointivtIvtCutpointivtApi.IvtCutpointivt) {
+ return requestClient.put('/cutpointivt/ivt-cutpointivt/update', data);
+}
+
+/** 删除分切区点位库存 */
+export function deleteIvtCutpointivt(id: number) {
+ return requestClient.delete(`/cutpointivt/ivt-cutpointivt/delete?id=${id}`);
+}
+
+/** 批量删除分切区点位库存 */
+export function deleteIvtCutpointivtList(ids: number[]) {
+ return requestClient.delete(
+ `/cutpointivt/ivt-cutpointivt/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出分切区点位库存 */
+export function exportIvtCutpointivt(params: any) {
+ return requestClient.download('/cutpointivt/ivt-cutpointivt/export-excel', { params });
+}
+
+
\ 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/ivtshafttubeivt/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/ivtshafttubeivt/index.ts
new file mode 100644
index 00000000..0a4ddcb2
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/ivtshafttubeivt/index.ts
@@ -0,0 +1,68 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace IvtshafttubeivtIvtApi {
+ /** 穿拔轴区点位库存信息 */
+ export interface IvtShafttubeivt {
+ pointCode?: string; // 点位编码
+ pointName: string; // 点位名称
+ qzzSize: string; // 气涨轴尺寸
+ qzzGeneration: string; // 气涨轴代数
+ tubeCode: string; // 纸管编码
+ tubeName: string; // 纸管描述
+ containerName: string; // 子卷号
+ pointType: string; // 点位类型
+ pointLocation: string; // 位置
+ haveQzz: string; // 是否有轴
+ isUsed: string; // 是否启用
+ sortSeq: number; // 顺序号
+ plan: string; // 规划
+ parentCode: string; // 关联点位
+ }
+}
+
+/** 查询穿拔轴区点位库存分页 */
+export function getIvtShafttubeivtPage(params: PageParam) {
+ return requestClient.get>(
+ '/ivtshafttubeivt/ivt-shafttubeivt/page',
+ { params },
+ );
+}
+
+/** 查询穿拔轴区点位库存详情 */
+export function getIvtShafttubeivt(id: number) {
+ return requestClient.get(
+ `/ivtshafttubeivt/ivt-shafttubeivt/get?id=${id}`,
+ );
+}
+
+/** 新增穿拔轴区点位库存 */
+export function createIvtShafttubeivt(data: IvtshafttubeivtIvtApi.IvtShafttubeivt) {
+ return requestClient.post('/ivtshafttubeivt/ivt-shafttubeivt/create', data);
+}
+
+/** 修改穿拔轴区点位库存 */
+export function updateIvtShafttubeivt(data: IvtshafttubeivtIvtApi.IvtShafttubeivt) {
+ return requestClient.put('/ivtshafttubeivt/ivt-shafttubeivt/update', data);
+}
+
+/** 删除穿拔轴区点位库存 */
+export function deleteIvtShafttubeivt(id: number) {
+ return requestClient.delete(`/ivtshafttubeivt/ivt-shafttubeivt/delete?id=${id}`);
+}
+
+/** 批量删除穿拔轴区点位库存 */
+export function deleteIvtShafttubeivtList(ids: number[]) {
+ return requestClient.delete(
+ `/ivtshafttubeivt/ivt-shafttubeivt/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出穿拔轴区点位库存 */
+export function exportIvtShafttubeivt(params: any) {
+ return requestClient.download('/ivtshafttubeivt/ivt-shafttubeivt/export-excel', { params });
+}
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilcasheposition/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilcasheposition/index.ts
new file mode 100644
index 00000000..cf6c3ebe
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilcasheposition/index.ts
@@ -0,0 +1,67 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace LmsRawFoilCashePositionApi {
+ /** 生箔母卷缓存位信息 */
+ export interface RawFoilCashePosition {
+ ivtId: number; // 库存记录标识
+ pointCode?: string; // 点位编码
+ containerName: string; // 母卷号
+ workorderId: string; // 母卷工单标识
+ fullVehicleCode: string; // 母卷轴编码
+ instorageTime: string | Dayjs; // 入库时间
+ productionArea: string; // 生产区域
+ pointLocation: string; // 位置
+ sortSeq?: number; // 顺序号
+ isUsed?: string; // 是否启用
+ remark: string; // 备注
+ coolIvtStatus?: string; // 库存状态
+ pointType: string; // 点位类型
+ }
+}
+
+/** 查询生箔母卷缓存位分页 */
+export function getRawFoilCashePositionPage(params: PageParam) {
+ return requestClient.get>(
+ '/lms/raw-foil-cashe-position/page',
+ { params },
+ );
+}
+
+/** 查询生箔母卷缓存位详情 */
+export function getRawFoilCashePosition(id: number) {
+ return requestClient.get(
+ `/lms/raw-foil-cashe-position/get?id=${id}`,
+ );
+}
+
+/** 新增生箔母卷缓存位 */
+export function createRawFoilCashePosition(data: LmsRawFoilCashePositionApi.RawFoilCashePosition) {
+ return requestClient.post('/lms/raw-foil-cashe-position/create', data);
+}
+
+/** 修改生箔母卷缓存位 */
+export function updateRawFoilCashePosition(data: LmsRawFoilCashePositionApi.RawFoilCashePosition) {
+ return requestClient.put('/lms/raw-foil-cashe-position/update', data);
+}
+
+/** 删除生箔母卷缓存位 */
+export function deleteRawFoilCashePosition(id: number) {
+ return requestClient.delete(`/lms/raw-foil-cashe-position/delete?id=${id}`);
+}
+
+/** 批量删除生箔母卷缓存位 */
+export function deleteRawFoilCashePositionList(ids: number[]) {
+ return requestClient.delete(
+ `/lms/raw-foil-cashe-position/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出生箔母卷缓存位 */
+export function exportRawFoilCashePosition(params: any) {
+ return requestClient.download('/lms/raw-foil-cashe-position/export-excel', { params });
+}
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilemptyrollercasheposition/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilemptyrollercasheposition/index.ts
new file mode 100644
index 00000000..57844fcb
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/lms/rawfoilemptyrollercasheposition/index.ts
@@ -0,0 +1,68 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace LmsRawFoilEmptyRollerCashePositionApi {
+ /** 空辊缓存位信息 */
+ export interface RawFoilEmptyRollerCashePosition {
+ pointId: number; // 点位标识
+ pointCode?: string; // 点位编码
+ vehicleCode: string; // 载具编码
+ productionArea: string; // 生产区域
+ pointLocation: string; // 位置
+ remark: string; // 备注
+ isUsed?: string; // 是否启用
+ creator: string; // 创建人
+ createTime?: string; // 创建时间
+ updater: string; // 修改人
+ updateTime?: string; // 修改时间
+ weight: number; // 重量
+ hasStock?: string; // 是否有货
+ sortSeq?: number; // 顺序号
+ }
+}
+
+/** 查询空辊缓存位分页 */
+export function getRawFoilEmptyRollerCashePositionPage(params: PageParam) {
+ return requestClient.get>(
+ '/lms/raw-foil-empty-roller-cashe-position/page',
+ { params },
+ );
+}
+
+/** 查询空辊缓存位详情 */
+export function getRawFoilEmptyRollerCashePosition(id: number) {
+ return requestClient.get(
+ `/lms/raw-foil-empty-roller-cashe-position/get?id=${id}`,
+ );
+}
+
+/** 新增空辊缓存位 */
+export function createRawFoilEmptyRollerCashePosition(data: LmsRawFoilEmptyRollerCashePositionApi.RawFoilEmptyRollerCashePosition) {
+ return requestClient.post('/lms/raw-foil-empty-roller-cashe-position/create', data);
+}
+
+/** 修改空辊缓存位 */
+export function updateRawFoilEmptyRollerCashePosition(data: LmsRawFoilEmptyRollerCashePositionApi.RawFoilEmptyRollerCashePosition) {
+ return requestClient.put('/lms/raw-foil-empty-roller-cashe-position/update', data);
+}
+
+/** 删除空辊缓存位 */
+export function deleteRawFoilEmptyRollerCashePosition(id: number) {
+ return requestClient.delete(`/lms/raw-foil-empty-roller-cashe-position/delete?id=${id}`);
+}
+
+/** 批量删除空辊缓存位 */
+export function deleteRawFoilEmptyRollerCashePositionList(ids: number[]) {
+ return requestClient.delete(
+ `/lms/raw-foil-empty-roller-cashe-position/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出空辊缓存位 */
+export function exportRawFoilEmptyRollerCashePosition(params: any) {
+ return requestClient.download('/lms/raw-foil-empty-roller-cashe-position/export-excel', { params });
+}
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/data.ts
new file mode 100644
index 00000000..0d4433da
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/data.ts
@@ -0,0 +1,317 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { BtcutpointivtBtIvtCutpointivtApi } from '#/api/lms/btivtcutpointivt';
+
+import { getDictOptions } from '@vben/hooks';
+
+import { getRangePickerDefaultProps } from '#/utils';
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'id',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: 'AGV点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入AGV点位编码',
+ },
+ },
+ {
+ fieldName: 'pointName',
+ label: 'AGV点位名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入AGV点位名称',
+ },
+ },
+ {
+ fieldName: 'trussPointCode1',
+ label: '桁架点位编码1 ',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入桁架点位编码1 ',
+ },
+ },
+ {
+ fieldName: 'trussPointCode2',
+ label: '桁架点位编码2',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入桁架点位编码2',
+ },
+ },
+ {
+ fieldName: 'qzzNo1',
+ label: '气胀轴编码1',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入气胀轴编码1',
+ },
+ },
+ {
+ fieldName: 'qzzNo2',
+ label: '气胀轴编码2',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入气胀轴编码2',
+ },
+ },
+ {
+ fieldName: 'upGx',
+ label: '上轴管芯',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入上轴管芯',
+ },
+ },
+ {
+ fieldName: 'downGx',
+ label: '下轴管芯',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入下轴管芯',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ options: [],
+ placeholder: '请选择点位类型',
+ },
+ },
+ {
+ fieldName: 'productArea',
+ label: '生产区域',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入生产区域',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入是否启用',
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ {
+ fieldName: 'pointStatus',
+ label: '点位状态',
+ component: 'RadioGroup',
+ componentProps: {
+ options: [],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointCode',
+ label: 'AGV点位编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入AGV点位编码',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [],
+ placeholder: '请选择点位类型',
+ },
+ },
+ {
+ fieldName: 'productArea',
+ label: '生产区域',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入生产区域',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入是否启用',
+ },
+ },
+ {
+ fieldName: 'createTime',
+ label: '创建时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'pointStatus',
+ label: '点位状态',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [],
+ placeholder: '请选择点位状态',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'ivtId',
+ title: '库存记录标识',
+ minWidth: 120,
+ },
+ {
+ field: 'pointCode',
+ title: 'AGV点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'pointName',
+ title: 'AGV点位名称',
+ minWidth: 120,
+ },
+ {
+ field: 'trussPointCode1',
+ title: '桁架点位编码1 ',
+ minWidth: 120,
+ },
+ {
+ field: 'trussPointCode2',
+ title: '桁架点位编码2',
+ minWidth: 120,
+ },
+ {
+ field: 'qzzNo1',
+ title: '气胀轴编码1',
+ minWidth: 120,
+ },
+ {
+ field: 'qzzNo2',
+ title: '气胀轴编码2',
+ minWidth: 120,
+ },
+ {
+ field: 'upGx',
+ title: '上轴管芯',
+ minWidth: 120,
+ },
+ {
+ field: 'downGx',
+ title: '下轴管芯',
+ minWidth: 120,
+ },
+ {
+ field: 'pointType',
+ title: '点位类型,1-分切缓存位,2-分切对接位,3-套轴对接位,4-套轴缓存位',
+ minWidth: 120,
+ },
+ {
+ field: 'productArea',
+ title: '生产区域',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ {
+ field: 'createId',
+ title: '创建人',
+ minWidth: 120,
+ },
+ {
+ field: 'createName',
+ title: '创建人姓名',
+ minWidth: 120,
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptid',
+ title: '修改人',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptname',
+ title: '修改人姓名',
+ minWidth: 120,
+ },
+ {
+ field: 'pointStatus',
+ title: '点位状态',
+ minWidth: 120,
+ },
+ {
+ 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/btivtcutpointivt/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/index.vue
new file mode 100644
index 00000000..02e0806d
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/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/btivtcutpointivt/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/modules/form.vue
new file mode 100644
index 00000000..875c31a4
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/btivtcutpointivt/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/data.ts
new file mode 100644
index 00000000..3d2fb45b
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/data.ts
@@ -0,0 +1,421 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { CutpointivtIvtCutpointivtApi } from '#/api/lms/cutpointivt/ivtcutpointivt';
+
+import { getDictOptions } from '@vben/hooks';
+
+import { getRangePickerDefaultProps } from '#/utils';
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'ivtId',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'fullPointCode',
+ label: '满轴位编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入满轴位编码',
+ },
+ },
+ {
+ fieldName: 'fullPointStatus',
+ label: '满轴位状态',
+ rules: 'required',
+ component: 'RadioGroup',
+ componentProps: {
+ options: [],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '母卷号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入母卷号',
+ },
+ },
+ {
+ fieldName: 'fullVehicleCode',
+ label: '母卷轴编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入母卷轴编码',
+ },
+ },
+ {
+ fieldName: 'emptyPointCode',
+ label: '空轴位编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入空轴位编码',
+ },
+ },
+ {
+ fieldName: 'emptyPointStatus',
+ label: '空轴位状态',
+ rules: 'required',
+ component: 'RadioGroup',
+ componentProps: {
+ options: [],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'emptyVehicleCode',
+ label: '空轴编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入空轴编码',
+ },
+ },
+ {
+ fieldName: 'productArea',
+ label: '生产区域',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入生产区域',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'upPointCode',
+ label: '分切下料位上轴点位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分切下料位上轴点位',
+ },
+ },
+ {
+ fieldName: 'downPointCode',
+ label: '分切下料位下轴点位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分切下料位下轴点位',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入是否启用',
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ {
+ fieldName: 'createId',
+ label: '创建人',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入创建人',
+ },
+ },
+ {
+ fieldName: 'createName',
+ label: '创建人姓名',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入创建人姓名',
+ },
+ },
+ {
+ fieldName: 'updateOptid',
+ label: '修改人',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入修改人',
+ },
+ },
+ {
+ fieldName: 'updateOptname',
+ label: '修改人姓名',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入修改人姓名',
+ },
+ },
+ {
+ fieldName: 'plan',
+ label: '规划',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入规划',
+ },
+ },
+ {
+ fieldName: 'extCode',
+ label: '对应MES系统设备编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入对应MES系统设备编码',
+ },
+ },
+ {
+ fieldName: 'upQzzno',
+ label: '分切下料位上轴',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分切下料位上轴',
+ },
+ },
+ {
+ fieldName: 'downQzzno',
+ label: '分切下料位下轴',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分切下料位下轴',
+ },
+ },
+ {
+ fieldName: 'qzzGeneration',
+ label: '气胀轴代数',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入气胀轴代数',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'fullPointStatus',
+ label: '满轴位状态',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [],
+ placeholder: '请选择满轴位状态',
+ },
+ },
+ {
+ fieldName: 'emptyPointStatus',
+ label: '空轴位状态',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [],
+ placeholder: '请选择空轴位状态',
+ },
+ },
+ {
+ fieldName: 'productArea',
+ label: '生产区域',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入生产区域',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入是否启用',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'ivtId',
+ title: '库存记录标识',
+ minWidth: 120,
+ },
+ {
+ field: 'pointCode',
+ title: '点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'fullPointCode',
+ title: '满轴位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'fullPointStatus',
+ title: '满轴位状态',
+ minWidth: 120,
+ },
+ {
+ field: 'containerName',
+ title: '母卷号',
+ minWidth: 120,
+ },
+ {
+ field: 'fullVehicleCode',
+ title: '母卷轴编码',
+ minWidth: 120,
+ },
+ {
+ field: 'emptyPointCode',
+ title: '空轴位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'emptyPointStatus',
+ title: '空轴位状态',
+ minWidth: 120,
+ },
+ {
+ field: 'emptyVehicleCode',
+ title: '空轴编码',
+ minWidth: 120,
+ },
+ {
+ field: 'productArea',
+ title: '生产区域',
+ minWidth: 120,
+ },
+ {
+ field: 'pointLocation',
+ title: '位置',
+ minWidth: 120,
+ },
+ {
+ field: 'upPointCode',
+ title: '分切下料位上轴点位',
+ minWidth: 120,
+ },
+ {
+ field: 'downPointCode',
+ title: '分切下料位下轴点位',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ {
+ field: 'createId',
+ title: '创建人',
+ minWidth: 120,
+ },
+ {
+ field: 'createName',
+ title: '创建人姓名',
+ minWidth: 120,
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptid',
+ title: '修改人',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptname',
+ title: '修改人姓名',
+ minWidth: 120,
+ },
+ {
+ field: 'plan',
+ title: '规划',
+ minWidth: 120,
+ },
+ {
+ field: 'extCode',
+ title: '对应MES系统设备编码',
+ minWidth: 120,
+ },
+ {
+ field: 'upQzzno',
+ title: '分切下料位上轴',
+ minWidth: 120,
+ },
+ {
+ field: 'downQzzno',
+ title: '分切下料位下轴',
+ minWidth: 120,
+ },
+ {
+ field: 'qzzGeneration',
+ title: '气胀轴代数',
+ minWidth: 120,
+ },
+ {
+ 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/cutpointivt/ivtcutpointivt/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/index.vue
new file mode 100644
index 00000000..a0daedce
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/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/cutpointivt/ivtcutpointivt/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/modules/form.vue
new file mode 100644
index 00000000..9cb419ec
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/cutpointivt/ivtcutpointivt/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/data.ts
new file mode 100644
index 00000000..6f75b290
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/data.ts
@@ -0,0 +1,275 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { IvtshafttubeivtIvtApi } from '#/api/lms/ivtshafttubeivt';
+
+import {DICT_TYPE} from "@vben/constants";
+import { getDictOptions } from '@vben/hooks';
+
+import {z} from "#/adapter/form";
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'id',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'pointName',
+ label: '点位名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位名称',
+ },
+ },
+ {
+ fieldName: 'qzzSize',
+ label: '气涨轴尺寸',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入气涨轴尺寸',
+ },
+ },
+ {
+ fieldName: 'qzzGeneration',
+ label: '气涨轴代数',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入气涨轴代数',
+ },
+ },
+ {
+ fieldName: 'tubeCode',
+ label: '纸管编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入纸管编码',
+ },
+ },
+ {
+ fieldName: 'tubeName',
+ label: '纸管描述',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入纸管描述',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '子卷号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入子卷号',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ options: [],
+ placeholder: '请选择点位类型',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'haveQzz',
+ label: '是否有轴',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入是否有轴',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入是否启用',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'plan',
+ label: '规划',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入规划',
+ },
+ },
+ {
+ fieldName: 'parentCode',
+ label: '关联点位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入关联点位',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [],
+ placeholder: '请选择点位类型',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'ivtId',
+ title: '库存记录标识',
+ minWidth: 120,
+ },
+ {
+ field: 'pointCode',
+ title: '点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'pointName',
+ title: '点位名称',
+ minWidth: 120,
+ },
+ {
+ field: 'qzzSize',
+ title: '气涨轴尺寸',
+ minWidth: 120,
+ },
+ {
+ field: 'qzzGeneration',
+ title: '气涨轴代数',
+ minWidth: 120,
+ },
+ {
+ field: 'tubeCode',
+ title: '纸管编码',
+ minWidth: 120,
+ },
+ {
+ field: 'tubeName',
+ title: '纸管描述',
+ minWidth: 120,
+ },
+ {
+ field: 'containerName',
+ title: '子卷号',
+ minWidth: 120,
+ },
+ {
+ field: 'pointType',
+ title: '点位类型',
+ minWidth: 120,
+ },
+ {
+ field: 'pointLocation',
+ title: '位置',
+ minWidth: 120,
+ },
+ {
+ field: 'haveQzz',
+ title: '是否有轴',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ field: 'createId',
+ title: '创建人',
+ minWidth: 120,
+ },
+ {
+ field: 'createName',
+ title: '创建人',
+ minWidth: 120,
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptid',
+ title: '修改人',
+ minWidth: 120,
+ },
+ {
+ field: 'updateOptname',
+ title: '修改人',
+ minWidth: 120,
+ },
+ {
+ field: 'plan',
+ title: '规划',
+ minWidth: 120,
+ },
+ {
+ field: 'parentCode',
+ title: '关联点位',
+ minWidth: 120,
+ },
+ {
+ 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/ivtshafttubeivt/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/index.vue
new file mode 100644
index 00000000..6c6980b3
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/index.vue
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/modules/form.vue
new file mode 100644
index 00000000..fd884872
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/ivtshafttubeivt/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/data.ts
new file mode 100644
index 00000000..18880281
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/data.ts
@@ -0,0 +1,286 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { LmsRawFoilCashePositionApi } from '#/api/lms/rawfoilcasheposition';
+
+import { getDictOptions } from '@vben/hooks';
+
+import { getRangePickerDefaultProps } from '#/utils';
+import {DICT_TYPE} from "@vben/constants";
+import {z} from "#/adapter/form";
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'ivtId',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '母卷号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入母卷号',
+ },
+ },
+ {
+ fieldName: 'workorderId',
+ label: '母卷工单标识',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入母卷工单标识',
+ },
+ },
+ {
+ fieldName: 'fullVehicleCode',
+ label: '母卷轴编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入母卷轴编码',
+ },
+ },
+ {
+ fieldName: 'instorageTime',
+ label: '入库时间',
+ component: 'DatePicker',
+ componentProps: {
+ showTime: true,
+ format: 'YYYY-MM-DD HH:mm:ss',
+ valueFormat: 'x',
+ },
+ },
+ {
+ fieldName: 'productionArea',
+ label: '生产区域',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.PRODUCT_AREA),
+ placeholder: '请选择生产区域',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: z.string().default('1'),
+ component: 'RadioGroup',
+ componentProps: {
+ options: [{ label: '是', value: '1' }, { label: '否', value: '0' }],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ {
+ fieldName: 'coolIvtStatus',
+ label: '库存状态',
+ rules: 'required',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.RAWFOIL_CASHEPOSITION_STATUS),
+ placeholder: '请选择库存状态',
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.RAWFOIL_CASHEPOSITION_TYPE),
+ placeholder: '请选择点位类型',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'containerName',
+ label: '母卷号',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入母卷号',
+ },
+ },
+ {
+ fieldName: 'instorageTime',
+ label: '入库时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'productionArea',
+ label: '生产区域',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.PRODUCT_AREA),
+ placeholder: '请选择生产区域',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [
+ { label: '是', value: '1' },
+ { label: '否', value: '0' },
+ ],
+ placeholder: '请输入是否启用',
+ },
+ },
+ {
+ fieldName: 'coolIvtStatus',
+ label: '库存状态',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.RAWFOIL_CASHEPOSITION_STATUS),
+ placeholder: '请选择库存状态',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'ivtId',
+ title: '库存记录标识',
+ minWidth: 120,
+ },
+ {
+ field: 'pointCode',
+ title: '点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'containerName',
+ title: '母卷号',
+ minWidth: 120,
+ },
+ {
+ field: 'workorderId',
+ title: '母卷工单标识',
+ minWidth: 120,
+ },
+ {
+ field: 'fullVehicleCode',
+ title: '母卷轴编码',
+ minWidth: 120,
+ },
+ {
+ field: 'instorageTime',
+ title: '入库时间',
+ minWidth: 120,
+ formatter: 'formatDateTime',
+ },
+ {
+ field: 'productionArea',
+ title: '生产区域',
+ minWidth: 120,
+ },
+ {
+ field: 'pointLocation',
+ title: '位置',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'coolIvtStatus',
+ title: '库存状态',
+ minWidth: 120,
+ },
+ {
+ field: 'pointType',
+ title: '点位类型',
+ minWidth: 120,
+ },
+ {
+ field: 'deleted',
+ title: '是否删除',
+ minWidth: 120,
+ },
+ {
+ title: '操作',
+ width: 200,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ {
+ field: 'updateTime',
+ title: '修改时间',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ ];
+}
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/index.vue
new file mode 100644
index 00000000..7f377809
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/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/rawfoilcasheposition/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/modules/form.vue
new file mode 100644
index 00000000..b3ad3152
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilcasheposition/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/data.ts
new file mode 100644
index 00000000..a380c611
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/data.ts
@@ -0,0 +1,232 @@
+import {type VbenFormSchema, z} from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { LmsRawFoilEmptyRollerCashePositionApi } from '#/api/lms/rawfoilemptyrollercasheposition';
+
+import { getDictOptions } from '@vben/hooks';
+
+import { getRangePickerDefaultProps } from '#/utils';
+import {DICT_TYPE} from "@vben/constants";
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointId',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'vehicleCode',
+ label: '载具编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入载具编码',
+ },
+ },
+ {
+ fieldName: 'productionArea',
+ label: '生产区域',
+ component: 'Select',
+ componentProps: {
+ placeholder: '请输入生产区域',
+ options: getDictOptions(DICT_TYPE.PRODUCT_AREA),
+ },
+ },
+ {
+ fieldName: 'pointType',
+ label: '点位类型',
+ component: 'Select',
+ componentProps: {
+ placeholder: '请输入点位',
+ options: getDictOptions(DICT_TYPE.EMPTYROLLER_CASHEPOSITION_TYPE),
+ },
+ },
+ {
+ fieldName: 'sortSeq',
+ label: '顺序号',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入顺序号',
+ },
+ },
+ {
+ fieldName: 'pointLocation',
+ label: '位置',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入位置',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: z.string().default('1'),
+ component: 'RadioGroup',
+ componentProps: {
+ options: [{ label: '是', value: '1' }, { label: '否', value: '0' }],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'hasStock',
+ label: '是否有货',
+ rules: z.string().default('0'),
+ component: 'RadioGroup',
+ componentProps: {
+ options: [{ label: '有货', value: '1' }, { label: '无货', value: '0' }],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'weight',
+ label: '重量',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入重量',
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'TextArea',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'pointCode',
+ label: '点位编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入点位编码',
+ },
+ },
+ {
+ fieldName: 'productionArea',
+ label: '生产区域',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: getDictOptions(DICT_TYPE.PRODUCT_AREA),
+ placeholder: '请输入生产区域',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [
+ { label: '是', value: '1' },
+ { label: '否', value: '0' },
+ ],
+ placeholder: '请选择是否启用',
+ },
+ },
+ {
+ fieldName: 'hasStock',
+ label: '是否有货',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ options: [
+ { label: '有货', value: '1' },
+ { label: '无货', value: '0' },
+ ],
+ placeholder: '请选择是否有货',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'pointId',
+ title: '点位标识',
+ minWidth: 120,
+ },
+ {
+ field: 'pointCode',
+ title: '点位编码',
+ minWidth: 120,
+ },
+ {
+ field: 'vehicleCode',
+ title: '载具编码',
+ minWidth: 120,
+ },
+ {
+ field: 'productionArea',
+ title: '生产区域',
+ minWidth: 120,
+ },
+ {
+ field: 'pointLocation',
+ title: '位置',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ },
+ {
+ field: 'updateTime',
+ title: '修改时间',
+ minWidth: 120,
+ },
+ {
+ field: 'weight',
+ title: '重量',
+ minWidth: 120,
+ },
+ {
+ field: 'hasStock',
+ title: '是否有货',
+ minWidth: 120,
+ },
+ {
+ field: 'sortSeq',
+ title: '顺序号',
+ minWidth: 120,
+ },
+ {
+ 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/rawfoilemptyrollercasheposition/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/index.vue
new file mode 100644
index 00000000..02db5aad
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/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/rawfoilemptyrollercasheposition/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/modules/form.vue
new file mode 100644
index 00000000..2fbeeb76
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/rawfoilemptyrollercasheposition/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 9a155fb2..15e61b4d 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
@@ -306,6 +306,9 @@ const TASK_DICT = {
/** ========== RawFoil - 生箔管理模块 ========== */
const RawFoil_DICT = {
RAWFOIL_WORKORDER_STATUS: 'rawfoil_workorder_status', // 生箔工序工单状态
+ RAWFOIL_CASHEPOSITION_TYPE: 'rawfoil_casheposition_type', // 生箔母卷缓存位点位类型
+ RAWFOIL_CASHEPOSITION_STATUS: 'rawfoil_casheposition_status', // 生箔母卷缓存位库存状态
+ EMPTYROLLER_CASHEPOSITION_TYPE: 'emptyroller_casheposition_type', // 空辊缓存位点位类型
} as const;
/** ========== LMS - 管理模块 ========== */