From 3c2c87364b89de46d12e95abd5bdf8cbd2c6dbf6 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期三, 12 三月 2025 08:43:23 +0800
Subject: [PATCH] dev-init

---
 ruoyi-modules/lb-qms/pom.xml                                                                   |  102 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java                         |   61 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorRetestService.java         |   68 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbTestResultBo.java               |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbBatchService.java                |   75 
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbDeviceMapper.xml                          |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbDeviceServiceImpl.java       |  133 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorRetestController.java    |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorResultController.java    |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/handle/CustomEncodingTypeHandler.java       |   52 
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorRetestMapper.xml                    |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorServiceImpl.java       |  129 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbDeviceController.java          |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbBatchBo.java                    |   65 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbTestResultVo.java               |  118 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbRetestResultMapper.java            |   15 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbDeviceBo.java                   |   65 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbRetestResultVo.java             |  137 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbTestResult.java                    |   93 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorRetestBo.java             |   77 +
 ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java                       |    2 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbRetestResult.java                  |  110 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorService.java               |   68 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorRetestMapper.java            |   27 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorResultVo.java             |   69 
 ruoyi-admin/src/main/resources/application.yml                                                 |   12 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbTestResultService.java           |   76 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbTestResultServiceImpl.java   |  177 ++
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorController.java          |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorRetest.java                  |   75 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbDeviceService.java               |   68 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbRetestResultService.java         |   68 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbRetestResultController.java    |  105 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbDeviceVo.java                   |   75 
 ruoyi-admin/src/main/resources/application-dev.yml                                             |   10 
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbRetestResultMapper.xml                    |    7 
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorMapper.xml                          |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorMapper.java                  |   15 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorResultService.java         |   68 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorRetestServiceImpl.java |  133 +
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbBatchMapper.xml                           |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbDevice.java                        |   61 
 pom.xml                                                                                        |    9 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorResultBo.java             |   60 
 ruoyi-modules/pom.xml                                                                          |    1 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorRetestVo.java             |   92 +
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbTestResultMapper.xml                      |   37 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java        |  144 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbRetestResultServiceImpl.java |  134 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbTestResultMapper.java              |   36 
 ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorResultMapper.xml                    |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorVo.java                   |  137 +
 ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java                                  |    4 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbBatchController.java           |  114 +
 ruoyi-admin/pom.xml                                                                            |    6 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorResultMapper.java            |   15 
 ruoyi-modules/lb-qms/src/main/resources/mapper/system/LbDeviceMapper.xml                       |    7 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorResultServiceImpl.java |  158 ++
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensor.java                        |  106 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java                    |   84 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbDeviceMapper.java                  |   15 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorResult.java                  |   71 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbBatchMapper.java                   |   26 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbRetestResultBo.java             |  114 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorBo.java                   |  115 +
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbTestResultController.java      |  123 +
 66 files changed, 4,570 insertions(+), 14 deletions(-)

diff --git a/pom.xml b/pom.xml
index 750673b..3824322 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
 
     <name>RuoYi-Vue-Plus</name>
     <url>https://gitee.com/dromara/RuoYi-Vue-Plus</url>
-    <description>RuoYi-Vue-Plus澶氱鎴风鐞嗙郴缁�</description>
+    <description>鍏板疂杞﹂棿璐ㄩ噺绠$悊绯荤粺</description>
 
     <properties>
         <revision>5.2.2</revision>
@@ -364,6 +364,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>lb-qms</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+
             <!--  宸ヤ綔娴佹ā鍧�  -->
             <dependency>
                 <groupId>org.dromara</groupId>
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 9e97804..eba5726 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -87,6 +87,12 @@
             <artifactId>ruoyi-demo</artifactId>
         </dependency>
 
+        <!--  杞﹂棿璐ㄩ噺妯″潡  -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>lb-qms</artifactId>
+        </dependency>
+
         <!--  宸ヤ綔娴佹ā鍧�  -->
         <dependency>
             <groupId>org.dromara</groupId>
diff --git a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
index 8ef33fe..d2ebc62 100644
--- a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
+++ b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
@@ -10,14 +10,14 @@
  * @author Lion Li
  */
 
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages={"org.dromara", "cn.shlanbao"})
 public class DromaraApplication {
 
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(DromaraApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(鈾モ棤鈥库棤)锞夛緸  RuoYi-Vue-Plus鍚姩鎴愬姛   醿�(麓凇`醿�)锞�");
+        System.out.println("(鈾モ棤鈥库棤)锞夛緸  鍏板疂杞﹂棿璐ㄩ噺绠$悊绯荤粺 鍚姩鎴愬姛   醿�(麓凇`醿�)锞�");
     }
 
 }
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index b561693..984ee32 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -103,7 +103,7 @@
         Long userId = LoginHelper.getUserId();
         scheduledExecutorService.schedule(() -> {
             SseMessageDto dto = new SseMessageDto();
-            dto.setMessage("娆㈣繋鐧诲綍RuoYi-Vue-Plus鍚庡彴绠$悊绯荤粺");
+            dto.setMessage("娆㈣繋鐧诲綍鍏板疂杞﹂棿璐ㄩ噺绠$悊绯荤粺");
             dto.setUserIds(List.of(userId));
             SseMessageUtils.publishMessage(dto);
         }, 5, TimeUnit.SECONDS);
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 5e20dae..b634908 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -1,7 +1,7 @@
 --- # 鐩戞帶涓績閰嶇疆
 spring.boot.admin.client:
   # 澧炲姞瀹㈡埛绔紑鍏�
-  enabled: true
+  enabled: false
   url: http://localhost:9090/admin
   instance:
     service-host-type: IP
@@ -13,7 +13,7 @@
 
 --- # snail-job 閰嶇疆
 snail-job:
-  enabled: true
+  enabled: false
   # 闇�瑕佸湪 SnailJob 鍚庡彴缁勭鐞嗗垱寤哄搴斿悕绉扮殑缁�,鐒跺悗鍒涘缓浠诲姟鐨勬椂鍊欓�夋嫨瀵瑰簲鐨勭粍,鎵嶈兘姝g‘鍒嗘淳浠诲姟
   group: "ruoyi_group"
   # SnailJob 鎺ュ叆楠岃瘉浠ょ墝 璇﹁ script/sql/snail_job.sql `sj_group_config` 琛�
@@ -45,9 +45,9 @@
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 鎵�鏈夊弬鏁伴厤缃弬鑰� https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 鎵瑰鐞嗕紭鍖� 澶у箙鎻愬崌鎵归噺鎻掑叆鏇存柊鍒犻櫎鎬ц兘(瀵规暟鎹簱鏈夋�ц兘鎹熻�� 浣跨敤鎵归噺鎿嶄綔搴旇�冭檻鎬ц兘闂)
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://192.168.12.240:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: root
+          password: 123456
         # 浠庡簱鏁版嵁婧�
         slave:
           lazy: true
@@ -100,7 +100,7 @@
     # 鏁版嵁搴撶储寮�
     database: 0
     # redis 瀵嗙爜蹇呴』閰嶇疆
-    password: ruoyi123
+    #password: ruoyi123
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
     # 鏄惁寮�鍚痵sl
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 5d94bef..18f2bdd 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -8,7 +8,7 @@
   copyrightYear: 2024
 
 captcha:
-  enable: true
+  enable: false
   # 椤甸潰 <鍙傛暟璁剧疆> 鍙紑鍚叧闂� 楠岃瘉鐮佹牎楠�
   # 楠岃瘉鐮佺被鍨� math 鏁扮粍璁$畻 char 瀛楃楠岃瘉
   type: MATH
@@ -125,7 +125,7 @@
 # 澶氱鎴烽厤缃�
 tenant:
   # 鏄惁寮�鍚�
-  enable: true
+  enable: false
   # 鎺掗櫎琛�
   excludes:
     - sys_menu
@@ -142,11 +142,11 @@
 # https://baomidou.com/config/
 mybatis-plus:
   # 澶氬寘鍚嶄娇鐢� 渚嬪 org.dromara.**.mapper,org.xxx.**.mapper
-  mapperPackage: org.dromara.**.mapper
+  mapperPackage: org.dromara.**.mapper,cn.shlanbao.**.mapper
   # 瀵瑰簲鐨� XML 鏂囦欢浣嶇疆
   mapperLocations: classpath*:mapper/**/*Mapper.xml
   # 瀹炰綋鎵弿锛屽涓猵ackage鐢ㄩ�楀彿鎴栬�呭垎鍙峰垎闅�
-  typeAliasesPackage: org.dromara.**.domain
+  typeAliasesPackage: org.dromara.**.domain, cn.shlanbao.**.domain
   global-config:
     dbConfig:
       # 涓婚敭绫诲瀷
@@ -171,7 +171,7 @@
 # api鎺ュ彛鍔犲瘑
 api-decrypt:
   # 鏄惁寮�鍚叏灞�鎺ュ彛鍔犲瘑
-  enabled: true
+  enabled: false
   # AES 鍔犲瘑澶存爣璇�
   headerFlag: encrypt-key
   # 鍝嶅簲鍔犲瘑鍏挜 闈炲绉扮畻娉曠殑鍏閽� 濡傦細SM2锛孯SA 浣跨敤鑰呰鑷鏇存崲
@@ -217,6 +217,8 @@
       packages-to-scan: org.dromara.system
     - group: 4.浠g爜鐢熸垚妯″潡
       packages-to-scan: org.dromara.generator
+    - group: 5.璐ㄩ噺妯″潡
+      packages-to-scan: cn.shlanbao.qms
 
 # 闃叉XSS鏀诲嚮
 xss:
diff --git a/ruoyi-modules/lb-qms/pom.xml b/ruoyi-modules/lb-qms/pom.xml
new file mode 100644
index 0000000..eb9faef
--- /dev/null
+++ b/ruoyi-modules/lb-qms/pom.xml
@@ -0,0 +1,102 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <artifactId>lb-qms</artifactId>
+    <description>
+        demo妯″潡
+    </description>
+    <dependencies>
+
+        <!-- 閫氱敤宸ュ叿-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sms</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mail</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-excel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-ratelimiter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-websocket</artifactId>
+        </dependency>
+
+    </dependencies>
+</project>
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbBatchController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbBatchController.java
new file mode 100644
index 0000000..b8625fb
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbBatchController.java
@@ -0,0 +1,114 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import cn.shlanbao.qms.service.ILbBatchService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鎵规绠$悊
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/batch")
+public class LbBatchController extends BaseController {
+
+    private final ILbBatchService lbBatchService;
+
+    /**
+     * 鏌ヨ鎵规绠$悊鍒楄〃
+     */
+    @SaCheckPermission("qms:batch:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbBatchVo> list(LbBatchBo bo, PageQuery pageQuery) {
+        return lbBatchService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈変骇鍝佸瀷鍙�
+     */
+    @SaCheckPermission("qms:batch:list")
+    @GetMapping("/distinctProductModels")
+    public R<List<String>> getDistinctProductModels() {
+        return R.ok(lbBatchService.queryDistinctProductModels());
+    }
+
+    /**
+     * 瀵煎嚭鎵规绠$悊鍒楄〃
+     */
+    @SaCheckPermission("qms:batch:export")
+    @Log(title = "鎵规绠$悊", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbBatchBo bo, HttpServletResponse response) {
+        List<LbBatchVo> list = lbBatchService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鎵规绠$悊", LbBatchVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鎵规绠$悊璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("qms:batch:query")
+    @GetMapping("/{id}")
+    public R<LbBatchVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(lbBatchService.queryById(id));
+    }
+
+    /**
+     * 鏂板鎵规绠$悊
+     */
+    @SaCheckPermission("qms:batch:add")
+    @Log(title = "鎵规绠$悊", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbBatchBo bo) {
+        return toAjax(lbBatchService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼鎵规绠$悊
+     */
+    @SaCheckPermission("qms:batch:edit")
+    @Log(title = "鎵规绠$悊", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbBatchBo bo) {
+        return toAjax(lbBatchService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎鎵规绠$悊
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:batch:remove")
+    @Log(title = "鎵规绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(lbBatchService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbDeviceController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbDeviceController.java
new file mode 100644
index 0000000..eaa2ab6
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbDeviceController.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbDeviceVo;
+import cn.shlanbao.qms.domain.bo.LbDeviceBo;
+import cn.shlanbao.qms.service.ILbDeviceService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 娴嬭瘯浠�
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/device")
+public class LbDeviceController extends BaseController {
+
+    private final ILbDeviceService lbDeviceService;
+
+    /**
+     * 鏌ヨ娴嬭瘯浠垪琛�
+     */
+    @SaCheckPermission("qms:device:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbDeviceVo> list(LbDeviceBo bo, PageQuery pageQuery) {
+        return lbDeviceService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭娴嬭瘯浠垪琛�
+     */
+    @SaCheckPermission("qms:device:export")
+    @Log(title = "娴嬭瘯浠�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbDeviceBo bo, HttpServletResponse response) {
+        List<LbDeviceVo> list = lbDeviceService.queryList(bo);
+        ExcelUtil.exportExcel(list, "娴嬭瘯浠�", LbDeviceVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇娴嬭瘯浠缁嗕俊鎭�
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("qms:device:query")
+    @GetMapping("/{id}")
+    public R<LbDeviceVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(lbDeviceService.queryById(id));
+    }
+
+    /**
+     * 鏂板娴嬭瘯浠�
+     */
+    @SaCheckPermission("qms:device:add")
+    @Log(title = "娴嬭瘯浠�", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbDeviceBo bo) {
+        return toAjax(lbDeviceService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼娴嬭瘯浠�
+     */
+    @SaCheckPermission("qms:device:edit")
+    @Log(title = "娴嬭瘯浠�", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbDeviceBo bo) {
+        return toAjax(lbDeviceService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎娴嬭瘯浠�
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:device:remove")
+    @Log(title = "娴嬭瘯浠�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(lbDeviceService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbRetestResultController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbRetestResultController.java
new file mode 100644
index 0000000..4f1fb9f
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbRetestResultController.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbRetestResultVo;
+import cn.shlanbao.qms.domain.bo.LbRetestResultBo;
+import cn.shlanbao.qms.service.ILbRetestResultService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 澶嶆祴璁板綍
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/retestResult")
+public class LbRetestResultController extends BaseController {
+
+    private final ILbRetestResultService lbRetestResultService;
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍鍒楄〃
+     */
+    @SaCheckPermission("qms:retestResult:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbRetestResultVo> list(LbRetestResultBo bo, PageQuery pageQuery) {
+        return lbRetestResultService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭澶嶆祴璁板綍鍒楄〃
+     */
+    @SaCheckPermission("qms:retestResult:export")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbRetestResultBo bo, HttpServletResponse response) {
+        List<LbRetestResultVo> list = lbRetestResultService.queryList(bo);
+        ExcelUtil.exportExcel(list, "澶嶆祴璁板綍", LbRetestResultVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇澶嶆祴璁板綍璇︾粏淇℃伅
+     *
+     * @param batchCode 涓婚敭
+     */
+    @SaCheckPermission("qms:retestResult:query")
+    @GetMapping("/{batchCode}")
+    public R<LbRetestResultVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable String batchCode) {
+        return R.ok(lbRetestResultService.queryById(batchCode));
+    }
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     */
+    @SaCheckPermission("qms:retestResult:add")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbRetestResultBo bo) {
+        return toAjax(lbRetestResultService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     */
+    @SaCheckPermission("qms:retestResult:edit")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbRetestResultBo bo) {
+        return toAjax(lbRetestResultService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎澶嶆祴璁板綍
+     *
+     * @param batchCodes 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:retestResult:remove")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{batchCodes}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable String[] batchCodes) {
+        return toAjax(lbRetestResultService.deleteWithValidByIds(List.of(batchCodes), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorController.java
new file mode 100644
index 0000000..18ff512
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorController.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbSensorVo;
+import cn.shlanbao.qms.domain.bo.LbSensorBo;
+import cn.shlanbao.qms.service.ILbSensorService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 浼犳劅鍣�
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/sensor")
+public class LbSensorController extends BaseController {
+
+    private final ILbSensorService lbSensorService;
+
+    /**
+     * 鏌ヨ浼犳劅鍣ㄥ垪琛�
+     */
+    @SaCheckPermission("qms:sensor:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbSensorVo> list(LbSensorBo bo, PageQuery pageQuery) {
+        return lbSensorService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭浼犳劅鍣ㄥ垪琛�
+     */
+    @SaCheckPermission("qms:sensor:export")
+    @Log(title = "浼犳劅鍣�", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbSensorBo bo, HttpServletResponse response) {
+        List<LbSensorVo> list = lbSensorService.queryList(bo);
+        ExcelUtil.exportExcel(list, "浼犳劅鍣�", LbSensorVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇浼犳劅鍣ㄨ缁嗕俊鎭�
+     *
+     * @param prodId 涓婚敭
+     */
+    @SaCheckPermission("qms:sensor:query")
+    @GetMapping("/{prodId}")
+    public R<LbSensorVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long prodId) {
+        return R.ok(lbSensorService.queryById(prodId));
+    }
+
+    /**
+     * 鏂板浼犳劅鍣�
+     */
+    @SaCheckPermission("qms:sensor:add")
+    @Log(title = "浼犳劅鍣�", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbSensorBo bo) {
+        return toAjax(lbSensorService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼浼犳劅鍣�
+     */
+    @SaCheckPermission("qms:sensor:edit")
+    @Log(title = "浼犳劅鍣�", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbSensorBo bo) {
+        return toAjax(lbSensorService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎浼犳劅鍣�
+     *
+     * @param prodIds 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:sensor:remove")
+    @Log(title = "浼犳劅鍣�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{prodIds}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] prodIds) {
+        return toAjax(lbSensorService.deleteWithValidByIds(List.of(prodIds), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorResultController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorResultController.java
new file mode 100644
index 0000000..07fb8e4
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorResultController.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import cn.shlanbao.qms.domain.bo.LbSensorResultBo;
+import cn.shlanbao.qms.service.ILbSensorResultService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 鎵规鏄庣粏
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/sensorResult")
+public class LbSensorResultController extends BaseController {
+
+    private final ILbSensorResultService lbSensorResultService;
+
+    /**
+     * 鏌ヨ鎵规鏄庣粏鍒楄〃
+     */
+    @SaCheckPermission("qms:sensorResult:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbSensorResultVo> list(LbSensorResultBo bo, PageQuery pageQuery) {
+        return lbSensorResultService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭鎵规鏄庣粏鍒楄〃
+     */
+    @SaCheckPermission("qms:sensorResult:export")
+    @Log(title = "鎵规鏄庣粏", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbSensorResultBo bo, HttpServletResponse response) {
+        List<LbSensorResultVo> list = lbSensorResultService.queryList(bo);
+        ExcelUtil.exportExcel(list, "鎵规鏄庣粏", LbSensorResultVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇鎵规鏄庣粏璇︾粏淇℃伅
+     *
+     * @param batchCode 涓婚敭
+     */
+    @SaCheckPermission("qms:sensorResult:query")
+    @GetMapping("/{batchCode}")
+    public R<LbSensorResultVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable String batchCode) {
+        return R.ok(lbSensorResultService.queryById(batchCode));
+    }
+
+    /**
+     * 鏂板鎵规鏄庣粏
+     */
+    @SaCheckPermission("qms:sensorResult:add")
+    @Log(title = "鎵规鏄庣粏", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbSensorResultBo bo) {
+        return toAjax(lbSensorResultService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼鎵规鏄庣粏
+     */
+    @SaCheckPermission("qms:sensorResult:edit")
+    @Log(title = "鎵规鏄庣粏", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbSensorResultBo bo) {
+        return toAjax(lbSensorResultService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎鎵规鏄庣粏
+     *
+     * @param batchCodes 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:sensorResult:remove")
+    @Log(title = "鎵规鏄庣粏", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{batchCodes}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable String[] batchCodes) {
+        return toAjax(lbSensorResultService.deleteWithValidByIds(List.of(batchCodes), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorRetestController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorRetestController.java
new file mode 100644
index 0000000..c45b537
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbSensorRetestController.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbSensorRetestVo;
+import cn.shlanbao.qms.domain.bo.LbSensorRetestBo;
+import cn.shlanbao.qms.service.ILbSensorRetestService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 澶嶆祴璁板綍
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/sensorRetest")
+public class LbSensorRetestController extends BaseController {
+
+    private final ILbSensorRetestService lbSensorRetestService;
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍鍒楄〃
+     */
+    @SaCheckPermission("qms:sensorRetest:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbSensorRetestVo> list(LbSensorRetestBo bo, PageQuery pageQuery) {
+        return lbSensorRetestService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭澶嶆祴璁板綍鍒楄〃
+     */
+    @SaCheckPermission("qms:sensorRetest:export")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbSensorRetestBo bo, HttpServletResponse response) {
+        List<LbSensorRetestVo> list = lbSensorRetestService.queryList(bo);
+        ExcelUtil.exportExcel(list, "澶嶆祴璁板綍", LbSensorRetestVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇澶嶆祴璁板綍璇︾粏淇℃伅
+     *
+     * @param batchCode 涓婚敭
+     */
+    @SaCheckPermission("qms:sensorRetest:query")
+    @GetMapping("/{batchCode}")
+    public R<LbSensorRetestVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable String batchCode) {
+        return R.ok(lbSensorRetestService.queryById(batchCode));
+    }
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     */
+    @SaCheckPermission("qms:sensorRetest:add")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbSensorRetestBo bo) {
+        return toAjax(lbSensorRetestService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     */
+    @SaCheckPermission("qms:sensorRetest:edit")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbSensorRetestBo bo) {
+        return toAjax(lbSensorRetestService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎澶嶆祴璁板綍
+     *
+     * @param batchCodes 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:sensorRetest:remove")
+    @Log(title = "澶嶆祴璁板綍", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{batchCodes}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable String[] batchCodes) {
+        return toAjax(lbSensorRetestService.deleteWithValidByIds(List.of(batchCodes), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbTestResultController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbTestResultController.java
new file mode 100644
index 0000000..94a0cc3
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbTestResultController.java
@@ -0,0 +1,123 @@
+package cn.shlanbao.qms.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import cn.shlanbao.qms.domain.vo.LbTestResultVo;
+import cn.shlanbao.qms.domain.bo.LbTestResultBo;
+import cn.shlanbao.qms.service.ILbTestResultService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 娴嬭瘯缁撴灉
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/testResult")
+public class LbTestResultController extends BaseController {
+
+    private final ILbTestResultService lbTestResultService;
+
+    /**
+     * 鏌ヨ娴嬭瘯缁撴灉鍒楄〃
+     */
+    @SaCheckPermission("qms:testResult:list")
+    @GetMapping("/list")
+    public TableDataInfo<LbTestResultVo> list(LbTestResultBo bo, PageQuery pageQuery) {
+        return lbTestResultService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 鏌ヨ娴嬭瘯缁撴灉鍒楄〃
+     */
+    @SaCheckPermission("qms:testResult:list")
+    @GetMapping("/listAll")
+    public R<List<LbTestResultVo>> listAll(LbTestResultBo bo) {
+        return R.ok(lbTestResultService.queryList(bo));
+    }
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈夋祴璇曢」鐩�
+     */
+    @SaCheckPermission("qms:testResult:list")
+    @GetMapping("/distinctTestItems")
+    public R<List<String>> getDistinctTestItems() {
+        return R.ok(lbTestResultService.queryDistinctTestItems());
+    }
+
+    /**
+     * 瀵煎嚭娴嬭瘯缁撴灉鍒楄〃
+     */
+    @SaCheckPermission("qms:testResult:export")
+    @Log(title = "娴嬭瘯缁撴灉", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(LbTestResultBo bo, HttpServletResponse response) {
+        List<LbTestResultVo> list = lbTestResultService.queryList(bo);
+        ExcelUtil.exportExcel(list, "娴嬭瘯缁撴灉", LbTestResultVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇娴嬭瘯缁撴灉璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("qms:testResult:query")
+    @GetMapping("/{id}")
+    public R<LbTestResultVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(lbTestResultService.queryById(id));
+    }
+
+    /**
+     * 鏂板娴嬭瘯缁撴灉
+     */
+    @SaCheckPermission("qms:testResult:add")
+    @Log(title = "娴嬭瘯缁撴灉", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody LbTestResultBo bo) {
+        return toAjax(lbTestResultService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼娴嬭瘯缁撴灉
+     */
+    @SaCheckPermission("qms:testResult:edit")
+    @Log(title = "娴嬭瘯缁撴灉", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody LbTestResultBo bo) {
+        return toAjax(lbTestResultService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎娴嬭瘯缁撴灉
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("qms:testResult:remove")
+    @Log(title = "娴嬭瘯缁撴灉", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(lbTestResultService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java
new file mode 100644
index 0000000..dbcb742
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java
@@ -0,0 +1,61 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 鎵规绠$悊瀵硅薄 lb_batch
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_batch")
+public class LbBatch extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchCode;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    private String prodModel;
+
+    /**
+     * 鐢ㄦ埛缂栧彿
+     */
+    private Long userId;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鏁伴噺
+     */
+    private Long num;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbDevice.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbDevice.java
new file mode 100644
index 0000000..bc1b7c1
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbDevice.java
@@ -0,0 +1,61 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 娴嬭瘯浠璞� lb_device
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_device")
+public class LbDevice extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
+     * 璁惧缂栧彿
+     */
+    private String deviceCode;
+
+    /**
+     * 鎵�鍦ㄧ粍
+     */
+    private String deviceGroup;
+
+    /**
+     * 鎵�鍦ㄩ儴闂�
+     */
+    private String deviceDept;
+
+    /**
+     * 鎵�鍦ㄥ伐浣�
+     */
+    private String deviceStation;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbRetestResult.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbRetestResult.java
new file mode 100644
index 0000000..3487fab
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbRetestResult.java
@@ -0,0 +1,110 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 澶嶆祴璁板綍瀵硅薄 lb_retest_result
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_retest_result")
+public class LbRetestResult extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    private String testItem;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    private String userName;
+
+    /**
+     * 鐜娓╁害
+     */
+    private String temp;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    private Long voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    private Long loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    private Long stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    private Long testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensor.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensor.java
new file mode 100644
index 0000000..0071a2d
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensor.java
@@ -0,0 +1,106 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 浼犳劅鍣ㄥ璞� lb_sensor
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_sensor")
+public class LbSensor extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "prod_id")
+    private Long prodId;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    private String prodModel;
+
+    /**
+     * 浜у搧鏉$爜
+     */
+    private String prodBarcode;
+
+    /**
+     * 浜у搧澶х被
+     */
+    private String prodClass;
+
+    /**
+     * 浜у搧灏忕被
+     */
+    private String prodSubclass;
+
+    /**
+     * 渚涚數鐢垫簮锛圖C-鐩存祦;AC-浜ゆ祦锛�
+     */
+    private String supply;
+
+    /**
+     * 渚涚數鐢靛帇楂樺��
+     */
+    private Long supplyHigh;
+
+    /**
+     * 渚涚數鐢靛帇涓��
+     */
+    private Long supplyMiddle;
+
+    /**
+     * 渚涚數鐢靛帇浣庡��
+     */
+    private Long supplyLow;
+
+    /**
+     * 璐熻浇鐢垫祦
+     */
+    private Long loadCurrent;
+
+    /**
+     * 寮曠嚎鏁伴噺
+     */
+    private Long wire;
+
+    /**
+     * 杈撳嚭淇″彿锛堝紑鍏抽噺锛涙ā鎷熼噺锛�
+     */
+    private String outputSignal;
+
+    /**
+     * 杈撳嚭绫诲瀷锛圢O; NC锛� NO+NC锛�
+     */
+    private String outputType;
+
+    /**
+     * 杈撳嚭鏋佹�э紙NPN; PNP锛�
+     */
+    private String outputPolarity;
+
+    /**
+     * 鎰熷簲璺濈
+     */
+    private Long distance;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorResult.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorResult.java
new file mode 100644
index 0000000..1ce276d
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorResult.java
@@ -0,0 +1,71 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 鎵规鏄庣粏瀵硅薄 lb_sensor_result
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_sensor_result")
+public class LbSensorResult extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+
+    private String testNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    private String userName;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    private Long ngCount;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorRetest.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorRetest.java
new file mode 100644
index 0000000..58c9d5f
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbSensorRetest.java
@@ -0,0 +1,75 @@
+package cn.shlanbao.qms.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 澶嶆祴璁板綍瀵硅薄 lb_sensor_retest
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_sensor_retest")
+public class LbSensorRetest extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    private String testNum;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    private String userName;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    private Long ngCount;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbTestResult.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbTestResult.java
new file mode 100644
index 0000000..dd2b131
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbTestResult.java
@@ -0,0 +1,93 @@
+package cn.shlanbao.qms.domain;
+
+import cn.shlanbao.qms.handle.CustomEncodingTypeHandler;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 娴嬭瘯缁撴灉瀵硅薄 lb_test_result
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("lb_test_result")
+public class LbTestResult extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    @TableField(typeHandler = CustomEncodingTypeHandler.class)
+    private String testItem;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    private Double voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    private Double loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    private Double stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    private Double testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbBatchBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbBatchBo.java
new file mode 100644
index 0000000..ac3989c
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbBatchBo.java
@@ -0,0 +1,65 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbBatch;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鎵规绠$悊涓氬姟瀵硅薄 lb_batch
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbBatch.class, reverseConvertGenerate = false)
+public class LbBatchBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String batchCode;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    @NotBlank(message = "浜у搧鍨嬪彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String prodModel;
+
+    /**
+     * 鐢ㄦ埛缂栧彿
+     */
+    @NotNull(message = "鐢ㄦ埛缂栧彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 璁惧鍙�
+     */
+    @NotNull(message = "璁惧鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String deviceCode;
+
+    /**
+     * 鏁伴噺
+     */
+    @NotNull(message = "鏁伴噺涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long num;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbDeviceBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbDeviceBo.java
new file mode 100644
index 0000000..1cccdb5
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbDeviceBo.java
@@ -0,0 +1,65 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbDevice;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 娴嬭瘯浠笟鍔″璞� lb_device
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbDevice.class, reverseConvertGenerate = false)
+public class LbDeviceBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    @NotBlank(message = "璁惧绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String deviceType;
+
+    /**
+     * 璁惧缂栧彿
+     */
+    @NotBlank(message = "璁惧缂栧彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String deviceCode;
+
+    /**
+     * 鎵�鍦ㄧ粍
+     */
+    @NotBlank(message = "鎵�鍦ㄧ粍涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String deviceGroup;
+
+    /**
+     * 鎵�鍦ㄩ儴闂�
+     */
+    @NotBlank(message = "鎵�鍦ㄩ儴闂ㄤ笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String deviceDept;
+
+    /**
+     * 鎵�鍦ㄥ伐浣�
+     */
+    @NotBlank(message = "鎵�鍦ㄥ伐浣嶄笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String deviceStation;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbRetestResultBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbRetestResultBo.java
new file mode 100644
index 0000000..17edcd7
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbRetestResultBo.java
@@ -0,0 +1,114 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbRetestResult;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 澶嶆祴璁板綍涓氬姟瀵硅薄 lb_retest_result
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbRetestResult.class, reverseConvertGenerate = false)
+public class LbRetestResultBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @NotBlank(message = "娴嬭瘯搴忓彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    @NotBlank(message = "娴嬭瘯椤圭洰涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String testItem;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    @NotBlank(message = "澶嶆祴娆℃暟涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    private String userName;
+
+    /**
+     * 鐜娓╁害
+     */
+    private String temp;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    private Long voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    private Long loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    private Long stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    private Long testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorBo.java
new file mode 100644
index 0000000..8632513
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorBo.java
@@ -0,0 +1,115 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbSensor;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 浼犳劅鍣ㄤ笟鍔″璞� lb_sensor
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbSensor.class, reverseConvertGenerate = false)
+public class LbSensorBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long prodId;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    @NotBlank(message = "浜у搧鍨嬪彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String prodModel;
+
+    /**
+     * 浜у搧鏉$爜
+     */
+    @NotBlank(message = "浜у搧鏉$爜涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String prodBarcode;
+
+    /**
+     * 浜у搧澶х被
+     */
+    @NotBlank(message = "浜у搧澶х被涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String prodClass;
+
+    /**
+     * 浜у搧灏忕被
+     */
+    @NotBlank(message = "浜у搧灏忕被涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String prodSubclass;
+
+    /**
+     * 渚涚數鐢垫簮锛圖C-鐩存祦;AC-浜ゆ祦锛�
+     */
+    @NotBlank(message = "渚涚數鐢垫簮锛圖C-鐩存祦;AC-浜ゆ祦锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String supply;
+
+    /**
+     * 渚涚數鐢靛帇楂樺��
+     */
+    private Long supplyHigh;
+
+    /**
+     * 渚涚數鐢靛帇涓��
+     */
+    private Long supplyMiddle;
+
+    /**
+     * 渚涚數鐢靛帇浣庡��
+     */
+    private Long supplyLow;
+
+    /**
+     * 璐熻浇鐢垫祦
+     */
+    @NotNull(message = "璐熻浇鐢垫祦涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long loadCurrent;
+
+    /**
+     * 寮曠嚎鏁伴噺
+     */
+    @NotNull(message = "寮曠嚎鏁伴噺涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long wire;
+
+    /**
+     * 杈撳嚭淇″彿锛堝紑鍏抽噺锛涙ā鎷熼噺锛�
+     */
+    @NotBlank(message = "杈撳嚭淇″彿锛堝紑鍏抽噺锛涙ā鎷熼噺锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String outputSignal;
+
+    /**
+     * 杈撳嚭绫诲瀷锛圢O; NC锛� NO+NC锛�
+     */
+    @NotBlank(message = "杈撳嚭绫诲瀷锛圢O; NC锛� NO+NC锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String outputType;
+
+    /**
+     * 杈撳嚭鏋佹�э紙NPN; PNP锛�
+     */
+    @NotBlank(message = "杈撳嚭鏋佹�э紙NPN; PNP锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String outputPolarity;
+
+    /**
+     * 鎰熷簲璺濈
+     */
+    private Long distance;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorResultBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorResultBo.java
new file mode 100644
index 0000000..c0100e9
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorResultBo.java
@@ -0,0 +1,60 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbSensorResult;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 鎵规鏄庣粏涓氬姟瀵硅薄 lb_sensor_result
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbSensorResult.class, reverseConvertGenerate = false)
+public class LbSensorResultBo extends BaseEntity {
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { EditGroup.class })
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @NotBlank(message = "娴嬭瘯搴忓彿涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private String testNum;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    @NotBlank(message = "鍒ゅ畾缁撴灉涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    @NotNull(message = "鎬绘祴璇曢」鏁颁笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    @NotNull(message = "OK椤规暟涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    @NotNull(message = "NG椤规暟涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long ngCount;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorRetestBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorRetestBo.java
new file mode 100644
index 0000000..e7a8035
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbSensorRetestBo.java
@@ -0,0 +1,77 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbSensorRetest;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 澶嶆祴璁板綍涓氬姟瀵硅薄 lb_sensor_retest
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbSensorRetest.class, reverseConvertGenerate = false)
+public class LbSensorRetestBo extends BaseEntity {
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @NotBlank(message = "娴嬭瘯搴忓彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String testNum;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    @NotBlank(message = "澶嶆祴娆℃暟涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    private String userName;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    private Long ngCount;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbTestResultBo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbTestResultBo.java
new file mode 100644
index 0000000..ecf4ba3
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/bo/LbTestResultBo.java
@@ -0,0 +1,105 @@
+package cn.shlanbao.qms.domain.bo;
+
+import cn.shlanbao.qms.domain.LbTestResult;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.util.Date;
+
+/**
+ * 娴嬭瘯缁撴灉涓氬姟瀵硅薄 lb_test_result
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = LbTestResult.class, reverseConvertGenerate = false)
+public class LbTestResultBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @NotBlank(message = "鎵规鍙蜂笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @NotBlank(message = "娴嬭瘯搴忓彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    @NotBlank(message = "娴嬭瘯椤圭洰涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String testItem;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    @NotNull(message = "瀹為檯鐢靛帇涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Double voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    @NotNull(message = "瀹為檯鐢垫祦涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Double loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    @NotNull(message = "鏍囧噯璺濈涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Double stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    @NotBlank(message = "鎰熷簲鐗╀笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    @NotBlank(message = "杈撳嚭寮曡剼锛堥粦锛涚櫧锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    @NotNull(message = "娴嬭瘯鏁版嵁涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Double testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    @NotBlank(message = "鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    @NotBlank(message = "娴嬭瘯缁撴灉锛圤K; NG锛変笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    private String prodModel;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java
new file mode 100644
index 0000000..dbfbfff
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java
@@ -0,0 +1,84 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbBatch;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 鎵规绠$悊瑙嗗浘瀵硅薄 lb_batch
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbBatch.class)
+public class LbBatchVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchCode;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    @ExcelProperty(value = "浜у搧鍨嬪彿")
+    private String prodModel;
+
+    /**
+     * 鐢ㄦ埛缂栧彿
+     */
+    @ExcelProperty(value = "鐢ㄦ埛缂栧彿")
+    private Long userId;
+
+    /**
+     * 璁惧鍙�
+     */
+    @ExcelProperty(value = "璁惧鍙�")
+    private String deviceCode;
+
+    /**
+     * 鏁伴噺
+     */
+    @ExcelProperty(value = "鏁伴噺")
+    private Long num;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+    // 鑹搧鏁伴噺
+    private Long okNum;
+    // 涓嶈壇鍝佹暟閲�
+    private Long ngNum;
+
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbDeviceVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbDeviceVo.java
new file mode 100644
index 0000000..4b801ee
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbDeviceVo.java
@@ -0,0 +1,75 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbDevice;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 娴嬭瘯浠鍥惧璞� lb_device
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbDevice.class)
+public class LbDeviceVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    @ExcelProperty(value = "璁惧绫诲瀷", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "lb_device_type")
+    private String deviceType;
+
+    /**
+     * 璁惧缂栧彿
+     */
+    @ExcelProperty(value = "璁惧缂栧彿")
+    private String deviceCode;
+
+    /**
+     * 鎵�鍦ㄧ粍
+     */
+    @ExcelProperty(value = "鎵�鍦ㄧ粍")
+    private String deviceGroup;
+
+    /**
+     * 鎵�鍦ㄩ儴闂�
+     */
+    @ExcelProperty(value = "鎵�鍦ㄩ儴闂�")
+    private String deviceDept;
+
+    /**
+     * 鎵�鍦ㄥ伐浣�
+     */
+    @ExcelProperty(value = "鎵�鍦ㄥ伐浣�")
+    private String deviceStation;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbRetestResultVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbRetestResultVo.java
new file mode 100644
index 0000000..eb54206
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbRetestResultVo.java
@@ -0,0 +1,137 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbRetestResult;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 澶嶆祴璁板綍瑙嗗浘瀵硅薄 lb_retest_result
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbRetestResult.class)
+public class LbRetestResultVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @ExcelProperty(value = "娴嬭瘯搴忓彿")
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    @ExcelProperty(value = "娴嬭瘯椤圭洰")
+    private String testItem;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    @ExcelProperty(value = "澶嶆祴娆℃暟")
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    @ExcelProperty(value = "璁惧鍙�")
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    @ExcelProperty(value = "鐢ㄦ埛甯愬彿")
+    private String userName;
+
+    /**
+     * 鐜娓╁害
+     */
+    @ExcelProperty(value = "鐜娓╁害")
+    private String temp;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    @ExcelProperty(value = "瀹為檯鐢靛帇")
+    private Long voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    @ExcelProperty(value = "瀹為檯鐢垫祦")
+    private Long loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    @ExcelProperty(value = "鏍囧噯璺濈")
+    private Long stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    @ExcelProperty(value = "鎰熷簲鐗�")
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    @ExcelProperty(value = "杈撳嚭寮曡剼", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "榛�=锛涚櫧")
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    @ExcelProperty(value = "娴嬭瘯鏁版嵁")
+    private Long testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    @ExcelProperty(value = "鍒ゆ柇鏉′欢", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "鏈�=灏忓��<=鐪熷疄鍊�<=鏈�澶у��")
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    @ExcelProperty(value = "娴嬭瘯缁撴灉", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "O=K;,N=G")
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorResultVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorResultVo.java
new file mode 100644
index 0000000..4a1f227
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorResultVo.java
@@ -0,0 +1,69 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbSensorResult;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 鎵规鏄庣粏瑙嗗浘瀵硅薄 lb_sensor_result
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbSensorResult.class)
+public class LbSensorResultVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @ExcelProperty(value = "娴嬭瘯搴忓彿")
+    private String testNum;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    @ExcelProperty(value = "鍒ゅ畾缁撴灉")
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    @ExcelProperty(value = "鎬绘祴璇曢」鏁�")
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    @ExcelProperty(value = "OK椤规暟")
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    @ExcelProperty(value = "NG椤规暟")
+    private Long ngCount;
+
+    private List<LbSensorRetestVo> children;
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorRetestVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorRetestVo.java
new file mode 100644
index 0000000..ab76fce
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorRetestVo.java
@@ -0,0 +1,92 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbSensorRetest;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 澶嶆祴璁板綍瑙嗗浘瀵硅薄 lb_sensor_retest
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbSensorRetest.class)
+public class LbSensorRetestVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @ExcelProperty(value = "娴嬭瘯搴忓彿")
+    private String testNum;
+
+    /**
+     * 澶嶆祴娆℃暟
+     */
+    @ExcelProperty(value = "澶嶆祴娆℃暟")
+    private String retestNum;
+
+    /**
+     * 璁惧鍙�
+     */
+    @ExcelProperty(value = "璁惧鍙�")
+    private String deviceCode;
+
+    /**
+     * 鐢ㄦ埛甯愬彿
+     */
+    @ExcelProperty(value = "鐢ㄦ埛甯愬彿")
+    private String userName;
+
+    /**
+     * 鍒ゅ畾缁撴灉
+     */
+    @ExcelProperty(value = "鍒ゅ畾缁撴灉")
+    private String judgeResult;
+
+    /**
+     * 鎬绘祴璇曢」鏁�
+     */
+    @ExcelProperty(value = "鎬绘祴璇曢」鏁�")
+    private Long totalCount;
+
+    /**
+     * OK椤规暟
+     */
+    @ExcelProperty(value = "OK椤规暟")
+    private Long okCount;
+
+    /**
+     * NG椤规暟
+     */
+    @ExcelProperty(value = "NG椤规暟")
+    private Long ngCount;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorVo.java
new file mode 100644
index 0000000..82dfeef
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbSensorVo.java
@@ -0,0 +1,137 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbSensor;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 浼犳劅鍣ㄨ鍥惧璞� lb_sensor
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbSensor.class)
+public class LbSensorVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long prodId;
+
+    /**
+     * 浜у搧鍨嬪彿
+     */
+    @ExcelProperty(value = "浜у搧鍨嬪彿")
+    private String prodModel;
+
+    /**
+     * 浜у搧鏉$爜
+     */
+    @ExcelProperty(value = "浜у搧鏉$爜")
+    private String prodBarcode;
+
+    /**
+     * 浜у搧澶х被
+     */
+    @ExcelProperty(value = "浜у搧澶х被")
+    private String prodClass;
+
+    /**
+     * 浜у搧灏忕被
+     */
+    @ExcelProperty(value = "浜у搧灏忕被")
+    private String prodSubclass;
+
+    /**
+     * 渚涚數鐢垫簮锛圖C-鐩存祦;AC-浜ゆ祦锛�
+     */
+    @ExcelProperty(value = "渚涚數鐢垫簮", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "D=C-鐩存祦;AC-浜ゆ祦")
+    private String supply;
+
+    /**
+     * 渚涚數鐢靛帇楂樺��
+     */
+    @ExcelProperty(value = "渚涚數鐢靛帇楂樺��")
+    private Long supplyHigh;
+
+    /**
+     * 渚涚數鐢靛帇涓��
+     */
+    @ExcelProperty(value = "渚涚數鐢靛帇涓��")
+    private Long supplyMiddle;
+
+    /**
+     * 渚涚數鐢靛帇浣庡��
+     */
+    @ExcelProperty(value = "渚涚數鐢靛帇浣庡��")
+    private Long supplyLow;
+
+    /**
+     * 璐熻浇鐢垫祦
+     */
+    @ExcelProperty(value = "璐熻浇鐢垫祦")
+    private Long loadCurrent;
+
+    /**
+     * 寮曠嚎鏁伴噺
+     */
+    @ExcelProperty(value = "寮曠嚎鏁伴噺")
+    private Long wire;
+
+    /**
+     * 杈撳嚭淇″彿锛堝紑鍏抽噺锛涙ā鎷熼噺锛�
+     */
+    @ExcelProperty(value = "杈撳嚭淇″彿", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "寮�=鍏抽噺锛涙ā鎷熼噺")
+    private String outputSignal;
+
+    /**
+     * 杈撳嚭绫诲瀷锛圢O; NC锛� NO+NC锛�
+     */
+    @ExcelProperty(value = "杈撳嚭绫诲瀷", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "N=O;,N=C锛�,N=O+NC")
+    private String outputType;
+
+    /**
+     * 杈撳嚭鏋佹�э紙NPN; PNP锛�
+     */
+    @ExcelProperty(value = "杈撳嚭鏋佹��", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "N=PN;,P=NP")
+    private String outputPolarity;
+
+    /**
+     * 鎰熷簲璺濈
+     */
+    @ExcelProperty(value = "鎰熷簲璺濈")
+    private Long distance;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbTestResultVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbTestResultVo.java
new file mode 100644
index 0000000..3b0b357
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbTestResultVo.java
@@ -0,0 +1,118 @@
+package cn.shlanbao.qms.domain.vo;
+
+import cn.shlanbao.qms.domain.LbTestResult;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 娴嬭瘯缁撴灉瑙嗗浘瀵硅薄 lb_test_result
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = LbTestResult.class)
+public class LbTestResultVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 鎵规鍙�
+     */
+    @ExcelProperty(value = "鎵规鍙�")
+    private String batchCode;
+
+    /**
+     * 娴嬭瘯搴忓彿
+     */
+    @ExcelProperty(value = "娴嬭瘯搴忓彿")
+    private String testNum;
+
+    /**
+     * 娴嬭瘯椤圭洰
+     */
+    @ExcelProperty(value = "娴嬭瘯椤圭洰")
+    private String testItem;
+
+    /**
+     * 瀹為檯鐢靛帇
+     */
+    @ExcelProperty(value = "瀹為檯鐢靛帇")
+    private Double voltage;
+
+    /**
+     * 瀹為檯鐢垫祦
+     */
+    @ExcelProperty(value = "瀹為檯鐢垫祦")
+    private Double loadCurrent;
+
+    /**
+     * 鏍囧噯璺濈
+     */
+    @ExcelProperty(value = "鏍囧噯璺濈")
+    private Double stdDistance;
+
+    /**
+     * 鎰熷簲鐗�
+     */
+    @ExcelProperty(value = "鎰熷簲鐗�")
+    private String inductor;
+
+    /**
+     * 杈撳嚭寮曡剼锛堥粦锛涚櫧锛�
+     */
+    @ExcelProperty(value = "杈撳嚭寮曡剼", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "榛�=锛涚櫧")
+    private String output;
+
+    /**
+     * 娴嬭瘯鏁版嵁
+     */
+    @ExcelProperty(value = "娴嬭瘯鏁版嵁")
+    private Double testValue;
+
+    /**
+     * 鍒ゆ柇鏉′欢锛堟渶灏忓��<=鐪熷疄鍊�<=鏈�澶у�� 锛�
+     */
+    @ExcelProperty(value = "鍒ゆ柇鏉′欢", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "鏈�=灏忓��<=鐪熷疄鍊�<=鏈�澶у��")
+    private String judgeDetail;
+
+    /**
+     * 娴嬭瘯缁撴灉锛圤K; NG锛�
+     */
+    @ExcelProperty(value = "娴嬭瘯缁撴灉", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "O=K;,N=G")
+    private String testResult;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/handle/CustomEncodingTypeHandler.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/handle/CustomEncodingTypeHandler.java
new file mode 100644
index 0000000..e2f62bf
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/handle/CustomEncodingTypeHandler.java
@@ -0,0 +1,52 @@
+package cn.shlanbao.qms.handle;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import org.apache.ibatis.type.TypeHandler;
+@MappedJdbcTypes(JdbcType.VARCHAR)
+@MappedTypes(String.class)
+public class CustomEncodingTypeHandler implements TypeHandler<String> {
+    @Override
+    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
+        // 涓�鑸敤浜庢彃鍏ユ垨鏇存柊鎿嶄綔锛岃繖閲屽彲鑳戒笉闇�瑕佺壒娈婄紪鐮佽缃�
+        ps.setString(i, parameter);
+    }
+    @Override
+    public String getResult(ResultSet rs, String columnName) throws SQLException {
+        String value = rs.getString(columnName);
+        try {
+            // 鍋囪鏁版嵁鏄疓B2312缂栫爜锛屽皢鍏惰浆鎹负UTF - 8
+            byte[] gb2312Bytes = value.getBytes("ISO-8859-1");
+            return new String(gb2312Bytes, "GB2312");
+        } catch (Exception e) {
+            return value;
+        }
+    }
+    @Override
+    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
+        String value = rs.getString(columnIndex);
+        try {
+            // 鍋囪鏁版嵁鏄疓B2312缂栫爜锛屽皢鍏惰浆鎹负UTF - 8
+            byte[] gb2312Bytes = value.getBytes("ISO-8859-1");
+            return new String(gb2312Bytes, "GB2312");
+        } catch (Exception e) {
+            return value;
+        }
+    }
+    @Override
+    public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String value = cs.getString(columnIndex);
+        try {
+            // 鍋囪鏁版嵁鏄疓B2312缂栫爜锛屽皢鍏惰浆鎹负UTF - 8
+            byte[] gb2312Bytes = value.getBytes("ISO-8859-1");
+            return new String(gb2312Bytes, "GB2312");
+        } catch (Exception e) {
+            return value;
+        }
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbBatchMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbBatchMapper.java
new file mode 100644
index 0000000..ee2a17f
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbBatchMapper.java
@@ -0,0 +1,26 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbBatch;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import org.apache.ibatis.annotations.Select;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 鎵规绠$悊Mapper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface LbBatchMapper extends BaseMapperPlus<LbBatch, LbBatchVo> {
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈変骇鍝佸瀷鍙�
+     *
+     * @return 浜у搧鍨嬪彿鍒楄〃
+     */
+    @Select("SELECT DISTINCT prod_model FROM lb_batch")
+    List<String> selectDistinctProductModels();
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbDeviceMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbDeviceMapper.java
new file mode 100644
index 0000000..4da98cc
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbDeviceMapper.java
@@ -0,0 +1,15 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbDevice;
+import cn.shlanbao.qms.domain.vo.LbDeviceVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 娴嬭瘯浠狹apper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface LbDeviceMapper extends BaseMapperPlus<LbDevice, LbDeviceVo> {
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbRetestResultMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbRetestResultMapper.java
new file mode 100644
index 0000000..47c646e
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbRetestResultMapper.java
@@ -0,0 +1,15 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbRetestResult;
+import cn.shlanbao.qms.domain.vo.LbRetestResultVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 澶嶆祴璁板綍Mapper鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+public interface LbRetestResultMapper extends BaseMapperPlus<LbRetestResult, LbRetestResultVo> {
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorMapper.java
new file mode 100644
index 0000000..c05e59c
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorMapper.java
@@ -0,0 +1,15 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbSensor;
+import cn.shlanbao.qms.domain.vo.LbSensorVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 浼犳劅鍣∕apper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+public interface LbSensorMapper extends BaseMapperPlus<LbSensor, LbSensorVo> {
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorResultMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorResultMapper.java
new file mode 100644
index 0000000..cbd6e76
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorResultMapper.java
@@ -0,0 +1,15 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbSensorResult;
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鎵规鏄庣粏Mapper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+public interface LbSensorResultMapper extends BaseMapperPlus<LbSensorResult, LbSensorResultVo> {
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorRetestMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorRetestMapper.java
new file mode 100644
index 0000000..441a1ed
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbSensorRetestMapper.java
@@ -0,0 +1,27 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbSensorRetest;
+import cn.shlanbao.qms.domain.vo.LbSensorRetestVo;
+import org.apache.ibatis.annotations.Select;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 澶嶆祴璁板綍Mapper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+public interface LbSensorRetestMapper extends BaseMapperPlus<LbSensorRetest, LbSensorRetestVo> {
+
+    /**
+     * 鏍规嵁鎵规鍙峰拰娴嬭瘯鍙锋煡璇㈠娴嬭褰�
+     *
+     * @param batchCode 鎵规鍙�
+     * @param testNum   娴嬭瘯鍙�
+     * @return 澶嶆祴璁板綍鍒楄〃
+     */
+    @Select("select * from lb_sensor_retest where batch_code = #{batchCode} and test_num = #{testNum}")
+    List<LbSensorRetestVo> selectRetestByBatchCodeAndTestNum(String batchCode, String testNum);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbTestResultMapper.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbTestResultMapper.java
new file mode 100644
index 0000000..99b62dd
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/mapper/LbTestResultMapper.java
@@ -0,0 +1,36 @@
+package cn.shlanbao.qms.mapper;
+
+import cn.shlanbao.qms.domain.LbTestResult;
+import cn.shlanbao.qms.domain.bo.LbTestResultBo;
+import cn.shlanbao.qms.domain.vo.LbTestResultVo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 娴嬭瘯缁撴灉Mapper鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface LbTestResultMapper extends BaseMapperPlus<LbTestResult, LbTestResultVo> {
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈夋祴璇曢」鐩�
+     *
+     * @return 娴嬭瘯椤圭洰鍒楄〃
+     */
+    @Select("SELECT DISTINCT test_item FROM lb_test_result")
+    List<String> selectDistinctTestItems();
+
+    /**
+     * 鏍规嵁浜у搧鍨嬪彿銆佹壒娆″彿銆佹娴嬮」鐩拰 createTime 鏃堕棿娈垫煡璇㈡祴璇曠粨鏋�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 娴嬭瘯缁撴灉鍒楄〃
+     */
+    List<LbTestResultVo> selectByProdModelAndConditions(@Param("ew")LbTestResultBo bo);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbBatchService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbBatchService.java
new file mode 100644
index 0000000..c66ec01
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbBatchService.java
@@ -0,0 +1,75 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鎵规绠$悊Service鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface ILbBatchService {
+
+    /**
+     * 鏌ヨ鎵规绠$悊
+     *
+     * @param id 涓婚敭
+     * @return 鎵规绠$悊
+     */
+    LbBatchVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ鎵规绠$悊鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鎵规绠$悊鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<LbBatchVo> queryPageList(LbBatchBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬壒娆$鐞嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鎵规绠$悊鍒楄〃
+     */
+    List<LbBatchVo> queryList(LbBatchBo bo);
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈変骇鍝佸瀷鍙�
+     *
+     * @return 浜у搧鍨嬪彿鍒楄〃
+     */
+    List<String> queryDistinctProductModels();
+
+    /**
+     * 鏂板鎵规绠$悊
+     *
+     * @param bo 鎵规绠$悊
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbBatchBo bo);
+
+    /**
+     * 淇敼鎵规绠$悊
+     *
+     * @param bo 鎵规绠$悊
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbBatchBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ壒娆$鐞嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbDeviceService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbDeviceService.java
new file mode 100644
index 0000000..dc4c3b2
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbDeviceService.java
@@ -0,0 +1,68 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbDeviceVo;
+import cn.shlanbao.qms.domain.bo.LbDeviceBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴嬭瘯浠猄ervice鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface ILbDeviceService {
+
+    /**
+     * 鏌ヨ娴嬭瘯浠�
+     *
+     * @param id 涓婚敭
+     * @return 娴嬭瘯浠�
+     */
+    LbDeviceVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ娴嬭瘯浠垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 娴嬭瘯浠垎椤靛垪琛�
+     */
+    TableDataInfo<LbDeviceVo> queryPageList(LbDeviceBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬祴璇曚华鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 娴嬭瘯浠垪琛�
+     */
+    List<LbDeviceVo> queryList(LbDeviceBo bo);
+
+    /**
+     * 鏂板娴嬭瘯浠�
+     *
+     * @param bo 娴嬭瘯浠�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbDeviceBo bo);
+
+    /**
+     * 淇敼娴嬭瘯浠�
+     *
+     * @param bo 娴嬭瘯浠�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbDeviceBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ祴璇曚华淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbRetestResultService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbRetestResultService.java
new file mode 100644
index 0000000..b796ee6
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbRetestResultService.java
@@ -0,0 +1,68 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbRetestResultVo;
+import cn.shlanbao.qms.domain.bo.LbRetestResultBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 澶嶆祴璁板綍Service鎺ュ彛
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+public interface ILbRetestResultService {
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍
+     *
+     * @param batchCode 涓婚敭
+     * @return 澶嶆祴璁板綍
+     */
+    LbRetestResultVo queryById(String batchCode);
+
+    /**
+     * 鍒嗛〉鏌ヨ澶嶆祴璁板綍鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 澶嶆祴璁板綍鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<LbRetestResultVo> queryPageList(LbRetestResultBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫娴嬭褰曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 澶嶆祴璁板綍鍒楄〃
+     */
+    List<LbRetestResultVo> queryList(LbRetestResultBo bo);
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbRetestResultBo bo);
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbRetestResultBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ娴嬭褰曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorResultService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorResultService.java
new file mode 100644
index 0000000..00c624f
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorResultService.java
@@ -0,0 +1,68 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import cn.shlanbao.qms.domain.bo.LbSensorResultBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鎵规鏄庣粏Service鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+public interface ILbSensorResultService {
+
+    /**
+     * 鏌ヨ鎵规鏄庣粏
+     *
+     * @param batchCode 涓婚敭
+     * @return 鎵规鏄庣粏
+     */
+    LbSensorResultVo queryById(String batchCode);
+
+    /**
+     * 鍒嗛〉鏌ヨ鎵规鏄庣粏鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鎵规鏄庣粏鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<LbSensorResultVo> queryPageList(LbSensorResultBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬壒娆℃槑缁嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鎵规鏄庣粏鍒楄〃
+     */
+    List<LbSensorResultVo> queryList(LbSensorResultBo bo);
+
+    /**
+     * 鏂板鎵规鏄庣粏
+     *
+     * @param bo 鎵规鏄庣粏
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbSensorResultBo bo);
+
+    /**
+     * 淇敼鎵规鏄庣粏
+     *
+     * @param bo 鎵规鏄庣粏
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbSensorResultBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ壒娆℃槑缁嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorRetestService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorRetestService.java
new file mode 100644
index 0000000..f1dd3a3
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorRetestService.java
@@ -0,0 +1,68 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbSensorRetestVo;
+import cn.shlanbao.qms.domain.bo.LbSensorRetestBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 澶嶆祴璁板綍Service鎺ュ彛
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+public interface ILbSensorRetestService {
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍
+     *
+     * @param batchCode 涓婚敭
+     * @return 澶嶆祴璁板綍
+     */
+    LbSensorRetestVo queryById(String batchCode);
+
+    /**
+     * 鍒嗛〉鏌ヨ澶嶆祴璁板綍鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 澶嶆祴璁板綍鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<LbSensorRetestVo> queryPageList(LbSensorRetestBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫娴嬭褰曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 澶嶆祴璁板綍鍒楄〃
+     */
+    List<LbSensorRetestVo> queryList(LbSensorRetestBo bo);
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbSensorRetestBo bo);
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbSensorRetestBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ娴嬭褰曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorService.java
new file mode 100644
index 0000000..2104451
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbSensorService.java
@@ -0,0 +1,68 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbSensorVo;
+import cn.shlanbao.qms.domain.bo.LbSensorBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 浼犳劅鍣⊿ervice鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+public interface ILbSensorService {
+
+    /**
+     * 鏌ヨ浼犳劅鍣�
+     *
+     * @param prodId 涓婚敭
+     * @return 浼犳劅鍣�
+     */
+    LbSensorVo queryById(Long prodId);
+
+    /**
+     * 鍒嗛〉鏌ヨ浼犳劅鍣ㄥ垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 浼犳劅鍣ㄥ垎椤靛垪琛�
+     */
+    TableDataInfo<LbSensorVo> queryPageList(LbSensorBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪紶鎰熷櫒鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 浼犳劅鍣ㄥ垪琛�
+     */
+    List<LbSensorVo> queryList(LbSensorBo bo);
+
+    /**
+     * 鏂板浼犳劅鍣�
+     *
+     * @param bo 浼犳劅鍣�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbSensorBo bo);
+
+    /**
+     * 淇敼浼犳劅鍣�
+     *
+     * @param bo 浼犳劅鍣�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbSensorBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や紶鎰熷櫒淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbTestResultService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbTestResultService.java
new file mode 100644
index 0000000..506de5c
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbTestResultService.java
@@ -0,0 +1,76 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.vo.LbTestResultVo;
+import cn.shlanbao.qms.domain.bo.LbTestResultBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 娴嬭瘯缁撴灉Service鎺ュ彛
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+public interface ILbTestResultService {
+
+    /**
+     * 鏌ヨ娴嬭瘯缁撴灉
+     *
+     * @param id 涓婚敭
+     * @return 娴嬭瘯缁撴灉
+     */
+    LbTestResultVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ娴嬭瘯缁撴灉鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 娴嬭瘯缁撴灉鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<LbTestResultVo> queryPageList(LbTestResultBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬祴璇曠粨鏋滃垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 娴嬭瘯缁撴灉鍒楄〃
+     */
+    List<LbTestResultVo> queryList(LbTestResultBo bo);
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈夋祴璇曢」鐩�
+     *
+     * @return 娴嬭瘯椤圭洰鍒楄〃
+     */
+    List<String> queryDistinctTestItems();
+
+    /**
+     * 鏂板娴嬭瘯缁撴灉
+     *
+     * @param bo 娴嬭瘯缁撴灉
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(LbTestResultBo bo);
+
+    /**
+     * 淇敼娴嬭瘯缁撴灉
+     *
+     * @param bo 娴嬭瘯缁撴灉
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(LbTestResultBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ祴璇曠粨鏋滀俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java
new file mode 100644
index 0000000..38ae238
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java
@@ -0,0 +1,144 @@
+package cn.shlanbao.qms.service.impl;
+
+import cn.shlanbao.qms.service.ILbTestResultService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import cn.shlanbao.qms.domain.LbBatch;
+import cn.shlanbao.qms.mapper.LbBatchMapper;
+import cn.shlanbao.qms.service.ILbBatchService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 鎵规绠$悊Service涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@RequiredArgsConstructor
+@Service
+public class LbBatchServiceImpl implements ILbBatchService {
+
+    private final LbBatchMapper baseMapper;
+
+    private final ILbTestResultService testResultService;
+
+    /**
+     * 鏌ヨ鎵规绠$悊
+     *
+     * @param id 涓婚敭
+     * @return 鎵规绠$悊
+     */
+    @Override
+    public LbBatchVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ鎵规绠$悊鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 鎵规绠$悊鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<LbBatchVo> queryPageList(LbBatchBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbBatch> lqw = buildQueryWrapper(bo);
+        Page<LbBatchVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        result.getRecords().forEach(item -> {
+
+        });
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬壒娆$鐞嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鎵规绠$悊鍒楄〃
+     */
+    @Override
+    public List<LbBatchVo> queryList(LbBatchBo bo) {
+        LambdaQueryWrapper<LbBatch> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<LbBatch> buildQueryWrapper(LbBatchBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbBatch> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbBatch::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getProdModel()), LbBatch::getProdModel, bo.getProdModel());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), LbBatch::getDeviceCode, bo.getDeviceCode());
+        lqw.eq(bo.getUserId() != null, LbBatch::getUserId, bo.getUserId());
+        lqw.eq(bo.getNum() != null, LbBatch::getNum, bo.getNum());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鎵规绠$悊
+     *
+     * @param bo 鎵规绠$悊
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbBatchBo bo) {
+        LbBatch add = MapstructUtils.convert(bo, LbBatch.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鎵规绠$悊
+     *
+     * @param bo 鎵规绠$悊
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbBatchBo bo) {
+        LbBatch update = MapstructUtils.convert(bo, LbBatch.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbBatch entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ壒娆$鐞嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public List<String> queryDistinctProductModels() {
+        return baseMapper.selectDistinctProductModels();
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbDeviceServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbDeviceServiceImpl.java
new file mode 100644
index 0000000..f74e21b
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbDeviceServiceImpl.java
@@ -0,0 +1,133 @@
+package cn.shlanbao.qms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbDeviceBo;
+import cn.shlanbao.qms.domain.vo.LbDeviceVo;
+import cn.shlanbao.qms.domain.LbDevice;
+import cn.shlanbao.qms.mapper.LbDeviceMapper;
+import cn.shlanbao.qms.service.ILbDeviceService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 娴嬭瘯浠猄ervice涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@RequiredArgsConstructor
+@Service
+public class LbDeviceServiceImpl implements ILbDeviceService {
+
+    private final LbDeviceMapper baseMapper;
+
+    /**
+     * 鏌ヨ娴嬭瘯浠�
+     *
+     * @param id 涓婚敭
+     * @return 娴嬭瘯浠�
+     */
+    @Override
+    public LbDeviceVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ娴嬭瘯浠垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 娴嬭瘯浠垎椤靛垪琛�
+     */
+    @Override
+    public TableDataInfo<LbDeviceVo> queryPageList(LbDeviceBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbDevice> lqw = buildQueryWrapper(bo);
+        Page<LbDeviceVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬祴璇曚华鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 娴嬭瘯浠垪琛�
+     */
+    @Override
+    public List<LbDeviceVo> queryList(LbDeviceBo bo) {
+        LambdaQueryWrapper<LbDevice> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<LbDevice> buildQueryWrapper(LbDeviceBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbDevice> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceType()), LbDevice::getDeviceType, bo.getDeviceType());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), LbDevice::getDeviceCode, bo.getDeviceCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceGroup()), LbDevice::getDeviceGroup, bo.getDeviceGroup());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceDept()), LbDevice::getDeviceDept, bo.getDeviceDept());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceStation()), LbDevice::getDeviceStation, bo.getDeviceStation());
+        return lqw;
+    }
+
+    /**
+     * 鏂板娴嬭瘯浠�
+     *
+     * @param bo 娴嬭瘯浠�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbDeviceBo bo) {
+        LbDevice add = MapstructUtils.convert(bo, LbDevice.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼娴嬭瘯浠�
+     *
+     * @param bo 娴嬭瘯浠�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbDeviceBo bo) {
+        LbDevice update = MapstructUtils.convert(bo, LbDevice.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbDevice entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ祴璇曚华淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbRetestResultServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbRetestResultServiceImpl.java
new file mode 100644
index 0000000..a1a1160
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbRetestResultServiceImpl.java
@@ -0,0 +1,134 @@
+package cn.shlanbao.qms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbRetestResultBo;
+import cn.shlanbao.qms.domain.vo.LbRetestResultVo;
+import cn.shlanbao.qms.domain.LbRetestResult;
+import cn.shlanbao.qms.mapper.LbRetestResultMapper;
+import cn.shlanbao.qms.service.ILbRetestResultService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 澶嶆祴璁板綍Service涓氬姟灞傚鐞�
+ *
+ * @author Lion Li
+ * @date 2025-03-10
+ */
+@RequiredArgsConstructor
+@Service
+public class LbRetestResultServiceImpl implements ILbRetestResultService {
+
+    private final LbRetestResultMapper baseMapper;
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍
+     *
+     * @param batchCode 涓婚敭
+     * @return 澶嶆祴璁板綍
+     */
+    @Override
+    public LbRetestResultVo queryById(String batchCode){
+        return baseMapper.selectVoById(batchCode);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ澶嶆祴璁板綍鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 澶嶆祴璁板綍鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<LbRetestResultVo> queryPageList(LbRetestResultBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbRetestResult> lqw = buildQueryWrapper(bo);
+        Page<LbRetestResultVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫娴嬭褰曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 澶嶆祴璁板綍鍒楄〃
+     */
+    @Override
+    public List<LbRetestResultVo> queryList(LbRetestResultBo bo) {
+        LambdaQueryWrapper<LbRetestResult> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<LbRetestResult> buildQueryWrapper(LbRetestResultBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbRetestResult> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbRetestResult::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestNum()), LbRetestResult::getTestNum, bo.getTestNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestItem()), LbRetestResult::getTestItem, bo.getTestItem());
+        lqw.eq(StringUtils.isNotBlank(bo.getRetestNum()), LbRetestResult::getRetestNum, bo.getRetestNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), LbRetestResult::getDeviceCode, bo.getDeviceCode());
+        lqw.like(StringUtils.isNotBlank(bo.getUserName()), LbRetestResult::getUserName, bo.getUserName());
+        return lqw;
+    }
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbRetestResultBo bo) {
+        LbRetestResult add = MapstructUtils.convert(bo, LbRetestResult.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setBatchCode(add.getBatchCode());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbRetestResultBo bo) {
+        LbRetestResult update = MapstructUtils.convert(bo, LbRetestResult.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbRetestResult entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ娴嬭褰曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorResultServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorResultServiceImpl.java
new file mode 100644
index 0000000..9360dc7
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorResultServiceImpl.java
@@ -0,0 +1,158 @@
+package cn.shlanbao.qms.service.impl;
+
+import cn.shlanbao.qms.domain.LbSensorRetest;
+import cn.shlanbao.qms.domain.vo.LbRetestResultVo;
+import cn.shlanbao.qms.domain.vo.LbSensorRetestVo;
+import cn.shlanbao.qms.mapper.LbSensorRetestMapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbSensorResultBo;
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import cn.shlanbao.qms.domain.LbSensorResult;
+import cn.shlanbao.qms.mapper.LbSensorResultMapper;
+import cn.shlanbao.qms.service.ILbSensorResultService;
+
+import java.util.*;
+
+/**
+ * 鎵规鏄庣粏Service涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2024-12-27
+ */
+@RequiredArgsConstructor
+@Service
+public class LbSensorResultServiceImpl implements ILbSensorResultService {
+
+    private final LbSensorResultMapper baseMapper;
+
+    private final LbSensorRetestMapper retestBaseMapper;
+
+    /**
+     * 鏌ヨ鎵规鏄庣粏
+     *
+     * @param batchCode 涓婚敭
+     * @return 鎵规鏄庣粏
+     */
+    @Override
+    public LbSensorResultVo queryById(String batchCode){
+        return baseMapper.selectVoById(batchCode);
+    }
+
+    @Override
+    public TableDataInfo<LbSensorResultVo> queryPageList(LbSensorResultBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbSensorResult> lqw = buildQueryWrapper(bo);
+        Page<LbSensorResultVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<LbSensorResultVo> records = result.getRecords();
+
+
+        queryReTest(records);
+        return TableDataInfo.build(result);
+    }
+
+    private void queryReTest(List<LbSensorResultVo> records) {
+        records.forEach(record -> {
+            // 鍒涘缓瀛愬厓绱犲垪琛�
+            List<LbSensorResultVo> children = new ArrayList<>();
+            List<LbSensorRetestVo> retestRecords = retestBaseMapper.selectRetestByBatchCodeAndTestNum(record.getBatchCode(), record.getTestNum());
+            retestRecords.forEach(retestRecord -> {
+                retestRecord.setBatchCode(retestRecord.getBatchCode()+"-"+retestRecord.getRetestNum());
+                //retestRecord.setTestNum(retestRecord.getRetestNum()); // 鐢╮etestNum浠f浛testNum
+                LbSensorResultVo vo = new LbSensorResultVo();
+                // 灏唕etestRecord鐨勫睘鎬у�兼嫹璐濆埌LbSensorResultVo
+                BeanUtils.copyProperties(retestRecord, vo);
+                children.add(vo);
+            });
+            record.setChildren(retestRecords);
+        });
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬壒娆℃槑缁嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 鎵规鏄庣粏鍒楄〃
+     */
+    @Override
+    public List<LbSensorResultVo> queryList(LbSensorResultBo bo) {
+        LambdaQueryWrapper<LbSensorResult> lqw = buildQueryWrapper(bo);
+        List<LbSensorResultVo> records = baseMapper.selectVoList(lqw);
+
+        // 鏌ヨ澶嶆祴鏁版嵁骞舵寕杞藉埌瀵瑰簲鐨勫師濮嬫暟鎹笅
+        queryReTest(records);
+        return records;
+    }
+
+    private LambdaQueryWrapper<LbSensorResult> buildQueryWrapper(LbSensorResultBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbSensorResult> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getJudgeResult()), LbSensorResult::getJudgeResult, bo.getJudgeResult());
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbSensorResult::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestNum()), LbSensorResult::getTestNum, bo.getTestNum());
+        lqw.eq(bo.getTotalCount() != null, LbSensorResult::getTotalCount, bo.getTotalCount());
+        lqw.eq(bo.getOkCount() != null, LbSensorResult::getOkCount, bo.getOkCount());
+        lqw.eq(bo.getNgCount() != null, LbSensorResult::getNgCount, bo.getNgCount());
+        return lqw;
+    }
+
+    /**
+     * 鏂板鎵规鏄庣粏
+     *
+     * @param bo 鎵规鏄庣粏
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbSensorResultBo bo) {
+        LbSensorResult add = MapstructUtils.convert(bo, LbSensorResult.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setBatchCode(add.getBatchCode());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼鎵规鏄庣粏
+     *
+     * @param bo 鎵规鏄庣粏
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbSensorResultBo bo) {
+        LbSensorResult update = MapstructUtils.convert(bo, LbSensorResult.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbSensorResult entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ壒娆℃槑缁嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorRetestServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorRetestServiceImpl.java
new file mode 100644
index 0000000..3fa49ca
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorRetestServiceImpl.java
@@ -0,0 +1,133 @@
+package cn.shlanbao.qms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbSensorRetestBo;
+import cn.shlanbao.qms.domain.vo.LbSensorRetestVo;
+import cn.shlanbao.qms.domain.LbSensorRetest;
+import cn.shlanbao.qms.mapper.LbSensorRetestMapper;
+import cn.shlanbao.qms.service.ILbSensorRetestService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 澶嶆祴璁板綍Service涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2025-03-10
+ */
+@RequiredArgsConstructor
+@Service
+public class LbSensorRetestServiceImpl implements ILbSensorRetestService {
+
+    private final LbSensorRetestMapper baseMapper;
+
+    /**
+     * 鏌ヨ澶嶆祴璁板綍
+     *
+     * @param batchCode 涓婚敭
+     * @return 澶嶆祴璁板綍
+     */
+    @Override
+    public LbSensorRetestVo queryById(String batchCode){
+        return baseMapper.selectVoById(batchCode);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ澶嶆祴璁板綍鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 澶嶆祴璁板綍鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<LbSensorRetestVo> queryPageList(LbSensorRetestBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbSensorRetest> lqw = buildQueryWrapper(bo);
+        Page<LbSensorRetestVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫娴嬭褰曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 澶嶆祴璁板綍鍒楄〃
+     */
+    @Override
+    public List<LbSensorRetestVo> queryList(LbSensorRetestBo bo) {
+        LambdaQueryWrapper<LbSensorRetest> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<LbSensorRetest> buildQueryWrapper(LbSensorRetestBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbSensorRetest> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbSensorRetest::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestNum()), LbSensorRetest::getTestNum, bo.getTestNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getRetestNum()), LbSensorRetest::getRetestNum, bo.getRetestNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), LbSensorRetest::getDeviceCode, bo.getDeviceCode());
+        lqw.like(StringUtils.isNotBlank(bo.getUserName()), LbSensorRetest::getUserName, bo.getUserName());
+        return lqw;
+    }
+
+    /**
+     * 鏂板澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbSensorRetestBo bo) {
+        LbSensorRetest add = MapstructUtils.convert(bo, LbSensorRetest.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setBatchCode(add.getBatchCode());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼澶嶆祴璁板綍
+     *
+     * @param bo 澶嶆祴璁板綍
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbSensorRetestBo bo) {
+        LbSensorRetest update = MapstructUtils.convert(bo, LbSensorRetest.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbSensorRetest entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ娴嬭褰曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorServiceImpl.java
new file mode 100644
index 0000000..feae035
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbSensorServiceImpl.java
@@ -0,0 +1,129 @@
+package cn.shlanbao.qms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbSensorBo;
+import cn.shlanbao.qms.domain.vo.LbSensorVo;
+import cn.shlanbao.qms.domain.LbSensor;
+import cn.shlanbao.qms.mapper.LbSensorMapper;
+import cn.shlanbao.qms.service.ILbSensorService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 浼犳劅鍣⊿ervice涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2024-12-11
+ */
+@RequiredArgsConstructor
+@Service
+public class LbSensorServiceImpl implements ILbSensorService {
+
+    private final LbSensorMapper baseMapper;
+
+    /**
+     * 鏌ヨ浼犳劅鍣�
+     *
+     * @param prodId 涓婚敭
+     * @return 浼犳劅鍣�
+     */
+    @Override
+    public LbSensorVo queryById(Long prodId){
+        return baseMapper.selectVoById(prodId);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ浼犳劅鍣ㄥ垪琛�
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 浼犳劅鍣ㄥ垎椤靛垪琛�
+     */
+    @Override
+    public TableDataInfo<LbSensorVo> queryPageList(LbSensorBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbSensor> lqw = buildQueryWrapper(bo);
+        Page<LbSensorVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪紶鎰熷櫒鍒楄〃
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 浼犳劅鍣ㄥ垪琛�
+     */
+    @Override
+    public List<LbSensorVo> queryList(LbSensorBo bo) {
+        LambdaQueryWrapper<LbSensor> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<LbSensor> buildQueryWrapper(LbSensorBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbSensor> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getProdModel()), LbSensor::getProdModel, bo.getProdModel());
+        return lqw;
+    }
+
+    /**
+     * 鏂板浼犳劅鍣�
+     *
+     * @param bo 浼犳劅鍣�
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbSensorBo bo) {
+        LbSensor add = MapstructUtils.convert(bo, LbSensor.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setProdId(add.getProdId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼浼犳劅鍣�
+     *
+     * @param bo 浼犳劅鍣�
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbSensorBo bo) {
+        LbSensor update = MapstructUtils.convert(bo, LbSensor.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbSensor entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や紶鎰熷櫒淇℃伅
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbTestResultServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbTestResultServiceImpl.java
new file mode 100644
index 0000000..d4472b5
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbTestResultServiceImpl.java
@@ -0,0 +1,177 @@
+package cn.shlanbao.qms.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.shlanbao.qms.domain.bo.LbTestResultBo;
+import cn.shlanbao.qms.domain.vo.LbTestResultVo;
+import cn.shlanbao.qms.domain.LbTestResult;
+import cn.shlanbao.qms.mapper.LbTestResultMapper;
+import cn.shlanbao.qms.service.ILbTestResultService;
+
+import java.util.*;
+
+/**
+ * 娴嬭瘯缁撴灉Service涓氬姟灞傚鐞�
+ *
+ * @author bsw
+ * @date 2024-12-12
+ */
+@RequiredArgsConstructor
+@Service
+public class LbTestResultServiceImpl implements ILbTestResultService {
+
+    private final LbTestResultMapper baseMapper;
+
+    /**
+     * 鏌ヨ娴嬭瘯缁撴灉
+     *
+     * @param id 涓婚敭
+     * @return 娴嬭瘯缁撴灉
+     */
+    @Override
+    public LbTestResultVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ娴嬭瘯缁撴灉鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 娴嬭瘯缁撴灉鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<LbTestResultVo> queryPageList(LbTestResultBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbTestResult> lqw = buildQueryWrapper(bo);
+        Page<LbTestResultVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        result.getRecords().forEach(row -> {
+            // 灏� GB2312 缂栫爜杞崲鎴怳TF-8
+
+//            try {
+//                // String utf8 = new String(row.getJudgeDetail().getBytes(), "UTF-8");
+//                byte[] gb2312s = row.getTestItem().getBytes("ISO-8859-1");
+//                String gb2312 = new String(gb2312s, "gb2312");
+//                row.setTestItem(gb2312);
+//                row.setJudgeDetail(new String(row.getJudgeDetail().getBytes("ISO-8859-1"),"GB2312"));
+//            } catch (UnsupportedEncodingException e) {
+//                throw new RuntimeException(e);
+//            }
+        });
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勬祴璇曠粨鏋滃垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 娴嬭瘯缁撴灉鍒楄〃
+     */
+    @Override
+    public List<LbTestResultVo> queryList(LbTestResultBo bo) {
+        if (StringUtils.isNotBlank(bo.getProdModel())) {
+            return baseMapper.selectByProdModelAndConditions(bo);
+        } else {
+            LambdaQueryWrapper<LbTestResult> lqw = buildQueryWrapper(bo);
+            return baseMapper.selectVoList(lqw);
+        }
+    }
+
+    /**
+     * 鏌ヨ鍒嗙粍鍘婚噸鍚庣殑鎵�鏈夋祴璇曢」鐩�
+     *
+     * @return 娴嬭瘯椤圭洰鍒楄〃
+     */
+    @Override
+    public List<String> queryDistinctTestItems() {
+        return baseMapper.selectDistinctTestItems();
+    }
+
+    private LambdaQueryWrapper<LbTestResult> buildQueryWrapper(LbTestResultBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbTestResult> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbTestResult::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestNum()), LbTestResult::getTestNum, bo.getTestNum());
+
+        // 淇敼锛氬鐞� testItem 鍙兘鏄�楀彿鍒嗛殧鐨勫瓧绗︿覆
+        if (StringUtils.isNotBlank(bo.getTestItem())) {
+            if (bo.getTestItem().contains(",")) {
+                lqw.in(LbTestResult::getTestItem, Arrays.asList(bo.getTestItem().split(",")));
+            } else {
+                lqw.eq(LbTestResult::getTestItem, bo.getTestItem());
+            }
+        }
+
+        lqw.eq(bo.getVoltage() != null, LbTestResult::getVoltage, bo.getVoltage());
+        lqw.eq(bo.getLoadCurrent() != null, LbTestResult::getLoadCurrent, bo.getLoadCurrent());
+        lqw.eq(bo.getStdDistance() != null, LbTestResult::getStdDistance, bo.getStdDistance());
+        lqw.eq(StringUtils.isNotBlank(bo.getInductor()), LbTestResult::getInductor, bo.getInductor());
+        lqw.eq(StringUtils.isNotBlank(bo.getOutput()), LbTestResult::getOutput, bo.getOutput());
+        lqw.eq(bo.getTestValue() != null, LbTestResult::getTestValue, bo.getTestValue());
+        lqw.eq(StringUtils.isNotBlank(bo.getJudgeDetail()), LbTestResult::getJudgeDetail, bo.getJudgeDetail());
+        lqw.eq(StringUtils.isNotBlank(bo.getTestResult()), LbTestResult::getTestResult, bo.getTestResult());
+        lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+                LbTestResult::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
+        lqw.orderByAsc(LbTestResult::getCreateTime);
+        return lqw;
+    }
+
+    /**
+     * 鏂板娴嬭瘯缁撴灉
+     *
+     * @param bo 娴嬭瘯缁撴灉
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(LbTestResultBo bo) {
+        LbTestResult add = MapstructUtils.convert(bo, LbTestResult.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼娴嬭瘯缁撴灉
+     *
+     * @param bo 娴嬭瘯缁撴灉
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(LbTestResultBo bo) {
+        LbTestResult update = MapstructUtils.convert(bo, LbTestResult.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(LbTestResult entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゆ祴璇曠粨鏋滀俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbBatchMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbBatchMapper.xml
new file mode 100644
index 0000000..18926fb
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbBatchMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbBatchMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbDeviceMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbDeviceMapper.xml
new file mode 100644
index 0000000..d6fecdc
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbDeviceMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbDeviceMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbRetestResultMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbRetestResultMapper.xml
new file mode 100644
index 0000000..ef41a08
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbRetestResultMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbRetestResultMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorMapper.xml
new file mode 100644
index 0000000..c3ee133
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbSensorMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorResultMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorResultMapper.xml
new file mode 100644
index 0000000..9d79479
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorResultMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbSensorResultMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorRetestMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorRetestMapper.xml
new file mode 100644
index 0000000..07e6eae
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbSensorRetestMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbSensorRetestMapper">
+
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbTestResultMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbTestResultMapper.xml
new file mode 100644
index 0000000..b712e66
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/qms/LbTestResultMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbTestResultMapper">
+    <!-- 鏍规嵁浜у搧鍨嬪彿銆佹壒娆″彿銆佹娴嬮」鐩拰 createTime 鏃堕棿娈垫煡璇㈡祴璇曠粨鏋� -->
+    <select id="selectByProdModelAndConditions" resultType="cn.shlanbao.qms.domain.vo.LbTestResultVo">
+        SELECT tr.*
+        FROM lb_test_result tr
+        JOIN lb_batch b ON tr.batch_code = b.batch_code
+        <where>
+            <if test="ew.prodModel != null and ew.prodModel != ''">
+                AND b.prod_model = #{ew.prodModel}
+            </if>
+            <if test="ew.batchCode != null and ew.batchCode != ''">
+                AND tr.batch_code LIKE CONCAT('%', #{ew.batchCode}, '%')
+            </if>
+            <if test="ew.testItem != null and ew.testItem != ''">
+                <choose>
+                    <when test="ew.testItem.contains(','.toString())">
+                        AND tr.test_item IN
+                        <foreach collection="ew.testItem.split(',')" item="item" open="(" separator="," close=")">
+                            #{item}
+                        </foreach>
+                    </when>
+                    <otherwise>
+                        AND tr.test_item = #{ew.testItem}
+                    </otherwise>
+                </choose>
+            </if>
+            <if test="ew.params.beginCreateTime != null and ew.params.endCreateTime != null">
+                AND tr.create_time BETWEEN #{ew.params.beginCreateTime} AND #{ew.params.endCreateTime}
+            </if>
+        </where>
+        ORDER BY tr.create_time ASC
+    </select>
+</mapper>
diff --git a/ruoyi-modules/lb-qms/src/main/resources/mapper/system/LbDeviceMapper.xml b/ruoyi-modules/lb-qms/src/main/resources/mapper/system/LbDeviceMapper.xml
new file mode 100644
index 0000000..d6fecdc
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/resources/mapper/system/LbDeviceMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.shlanbao.qms.mapper.LbDeviceMapper">
+
+</mapper>
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index daff497..3a1bed9 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -15,6 +15,7 @@
         <module>ruoyi-job</module>
         <module>ruoyi-system</module>
         <module>ruoyi-workflow</module>
+        <module>lb-qms</module>
     </modules>
 
     <artifactId>ruoyi-modules</artifactId>

--
Gitblit v1.9.3