From fc23bb2f40de2ed2af21a3824979350f9ffe1015 Mon Sep 17 00:00:00 2001
From: 李林 <z1292839451@163.com>
Date: 星期一, 07 八月 2023 17:47:55 +0800
Subject: [PATCH] 仓库迁移

---
 user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java                 |   20 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java                           |   82 
 sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java                                        |   16 
 .idea/aws.xml                                                                                                |   11 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java                        |   16 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java                      |   28 
 user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java                                  |   34 
 framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java                   |   22 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java         |   51 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java               |  100 
 .idea/misc.xml                                                                                               |   12 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java          |   91 
 sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java                                              |   83 
 sys/src/main/resources/application-prod.yml                                                                  |   86 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java                      |   61 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java             |   57 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java            |   70 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java               |   15 
 .idea/jarRepositories.xml                                                                                    |   20 
 framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java                         |   24 
 inspection-server/pom.xml                                                                                    |   41 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java                 |   20 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java                             |  170 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java                             |   41 
 user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java                                 |   36 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java                    |   53 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java           |  199 +
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java    |   90 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java                                |   60 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java     |   90 
 standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java                          |   24 
 user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java                            |   16 
 .idea/compiler.xml                                                                                           |   28 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java                         |   34 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java                               |   48 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java                             |   84 
 standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java            |   54 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java                    |   89 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java                              |   89 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java          |   78 
 user-server/pom.xml                                                                                          |   49 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java             |   85 
 sql/lims.sql                                                                                                 |  528 +++
 framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java                                      |  622 +++
 standard-server/src/main/resources/mapper/SpecificationsMapper.xml                                           |    5 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java                     |   84 
 user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java                                          |   57 
 user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java                                 |   39 
 framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java                     |   27 
 pom.xml                                                                                                      |  232 +
 user-server/src/main/resources/mapper/RoleMapper.xml                                                         |    5 
 framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java                            |   18 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java |   66 
 framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java                                   |  113 
 framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java                                    |  131 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java              |   15 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java                                  |   61 
 framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java                                  |   24 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java                               |  159 
 user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java                                |   84 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java                    |   44 
 framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java                          |   15 
 laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml                                           |   11 
 standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java                  |   47 
 framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java                       |  215 +
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java       |   75 
 standard-server/src/main/resources/mapper/ProductMapper.xml                                                  |   29 
 framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java                                            |   53 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java  |   70 
 user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java                                          |   89 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java       |   79 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java                                     |   28 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java        |   53 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java                |   79 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java                   |   20 
 standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java                          |   27 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java           |   27 
 laboratory-server/src/main/resources/mapper/MetricalInformationMapper.xml                                    |   13 
 standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java                           |   34 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java                            |   61 
 user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java                       |  135 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java             |   20 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java    |   68 
 standard-server/src/main/resources/mapper/StandardMapper.xml                                                 |   23 
 standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java                  |   65 
 laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml                                         |   11 
 framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java                                      |  122 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java                                  |   59 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java             |   34 
 inspection-server/src/main/resources/mapper/RawMaterialMapper.xml                                            |   37 
 inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml                                          |    5 
 user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java                                 |   19 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java                            |   76 
 .idea/encodings.xml                                                                                          |   13 
 framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java                                  |   37 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java                     |   23 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java                        |   28 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java         |   78 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java                  |   34 
 inspection-server/src/main/resources/mapper/InspectionMapper.xml                                             |   29 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java            |   37 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java                 |   70 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java                          |   66 
 sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java                                     |  190 +
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java                      |   94 
 user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java                          |   16 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java             |   23 
 user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java                                    |   67 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java          |   41 
 sys/src/main/resources/application.yml                                                                       |   28 
 framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java                                   |   57 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java                     |   30 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java                |   29 
 framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java                                     |   51 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java           |   82 
 user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java                          |   20 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java            |   15 
 .idea/.gitignore                                                                                             |    8 
 user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java                           |  179 +
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java                      |   29 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java                      |   97 
 user-server/src/main/resources/mapper/UserMapper.xml                                                         |   44 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java                    |   22 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java                        |   35 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java                              |  110 
 laboratory-server/src/main/resources/mapper/InstrumentMapper.xml                                             |   25 
 standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java                    |   24 
 inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml                                   |   53 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java                                   |   70 
 user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java                          |  147 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java   |   19 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java                         |   66 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java                         |   76 
 user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java                                  |   30 
 sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java                                             |   17 
 standard-server/src/main/resources/mapper/MaterialMapper.xml                                                 |   70 
 user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java                             |   74 
 user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java                                  |   16 
 standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java                   |   57 
 user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java                                |   16 
 inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml                                     |    4 
 user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java                       |   20 
 .idea/vcs.xml                                                                                                |    6 
 inspection-server/src/main/resources/mapper/InspectionProductMapper.xml                                      |    4 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java                  |   33 
 sys/src/main/resources/logback-spring.xml                                                                    |  236 +
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java                        |   42 
 standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java               |  103 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java           |   89 
 user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java                               |   41 
 standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java                        |   31 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java              |  119 
 laboratory-server/pom.xml                                                                                    |   30 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java                      |   26 
 framework/pom.xml                                                                                            |   43 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java                  |   23 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java      |   23 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java                  |   26 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java              |  139 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java                       |  100 
 sys/src/main/resources/application-dev.yml                                                                   |   85 
 user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java                    |   20 
 framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java                                         |   77 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java                   |   17 
 sys/src/main/resources/mysqldump.exe                                                                         |    0 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java                   |   41 
 laboratory-server/src/main/resources/mapper/ClassifyMapper.xml                                               |    5 
 sys/pom.xml                                                                                                  |   79 
 inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java        |   34 
 standard-server/pom.xml                                                                                      |   32 
 user-server/src/main/resources/mapper/EnterpriseMapper.xml                                                   |    5 
 laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java                |   78 
 172 files changed, 10,443 insertions(+), 0 deletions(-)

diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 榛樿蹇界暐鐨勬枃浠�
+/shelf/
+/workspace.xml
+# 鍩轰簬缂栬緫鍣ㄧ殑 HTTP 瀹㈡埛绔姹�
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/aws.xml b/.idea/aws.xml
new file mode 100644
index 0000000..b63b642
--- /dev/null
+++ b/.idea/aws.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="accountSettings">
+    <option name="activeRegion" value="us-east-1" />
+    <option name="recentlyUsedRegions">
+      <list>
+        <option value="us-east-1" />
+      </list>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..3516d6a
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="inspection-server" />
+        <module name="framework" />
+        <module name="sys" />
+        <module name="standard-server" />
+        <module name="laboratory-server" />
+        <module name="user-server" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="framework" options="-parameters" />
+      <module name="inspection-server" options="-parameters" />
+      <module name="laboratory-server" options="-parameters" />
+      <module name="standard-server" options="-parameters" />
+      <module name="sys" options="-parameters" />
+      <module name="user-server" options="-parameters" />
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..343cd9b
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
+    <file url="file://$PROJECT_DIR$/framework/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/inspection-server/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/laboratory-server/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/standard-server/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/sys/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/user-server/src/main/java" charset="UTF-8" />
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..980588c
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..0abcc97
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/framework/pom.xml b/framework/pom.xml
new file mode 100644
index 0000000..9a79668
--- /dev/null
+++ b/framework/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>framework</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>framework</name>
+    <description>framework</description>
+
+    <packaging>jar</packaging>
+    <dependencies>
+        <!--鏁版嵁搴撹繛鎺ユ睜-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+
+        <!-- mysql椹卞姩 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!--Swagger3-Ui缇庡寲-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-ui</artifactId>
+        </dependency>
+
+        <!--redis jar鍖�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java b/framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java
new file mode 100644
index 0000000..75e7058
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java
@@ -0,0 +1,57 @@
+package com.yuanchu.limslaboratory.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DruidConfig {
+    //鍔犺浇application.yaml涓殑Druid閰嶇疆
+    @ConfigurationProperties(prefix = "spring.datasource")
+    @Bean
+    public DataSource druid(){
+        return  new DruidDataSource();
+    }
+
+    //閰嶇疆Druid鐨勭洃鎺�
+    //1銆侀厤缃竴涓鐞嗗悗鍙扮殑Servlet
+    @Bean
+    public ServletRegistrationBean statViewServlet(){
+        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+        Map<String,String> initParams = new HashMap<>();
+
+        initParams.put("loginUsername","root");
+        initParams.put("loginPassword","123456");
+        initParams.put("allow","");//榛樿灏辨槸鍏佽鎵�鏈夎闂�
+//        initParams.put("deny","192.168.15.21"); 绂佹璇P璁块棶
+
+        bean.setInitParameters(initParams);
+        return bean;
+    }
+
+    //2銆侀厤缃竴涓獁eb鐩戞帶鐨刦ilter
+    @Bean
+    public FilterRegistrationBean webStatFilter(){
+        FilterRegistrationBean bean = new FilterRegistrationBean();
+        bean.setFilter(new WebStatFilter());
+
+        Map<String,String> initParams = new HashMap<>();
+        initParams.put("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
+
+        bean.setInitParameters(initParams);
+
+        bean.setUrlPatterns(Arrays.asList("/*"));
+
+        return bean;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java b/framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java
new file mode 100644
index 0000000..e9ccacb
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java
@@ -0,0 +1,37 @@
+package com.yuanchu.limslaboratory.config;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@Configuration
+public class MyCorsConfig {
+
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        // 1 璁剧疆璁块棶婧愬湴鍧�
+        corsConfiguration.addAllowedOrigin("*");
+        // 2 璁剧疆璁块棶婧愯姹傚ご
+        corsConfiguration.addAllowedHeader("*");
+        // 3 璁剧疆璁块棶婧愯姹傛柟娉�
+        corsConfiguration.addAllowedMethod("*");
+        // 4 鏆撮湶鍝簺澶撮儴淇℃伅
+//        corsConfiguration.addExposedHeader(JwtConstant.HEADER);
+        return corsConfiguration;
+    }
+    @Bean
+    public FilterRegistrationBean<CorsFilter> corsFilter() {
+//        log.info("璺ㄥ煙璁剧疆銆傘�傘�傘��");
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        // 5 瀵规帴鍙i厤缃法鍩熻缃�
+        source.registerCorsConfiguration("/**", buildConfig());
+        //鏈夊涓猣ilter鏃舵澶勮缃敼CorsFilter鐨勪紭鍏堟墽琛岄『搴�
+        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
+        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
+        return bean;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java b/framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java
new file mode 100644
index 0000000..7e2671f
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java
@@ -0,0 +1,122 @@
+package com.yuanchu.limslaboratory.config;
+
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Configuration
+@EnableOpenApi
+public class Swagger3 {
+    // 璺緞http://localhost:8080/doc.html
+    @Value("${swagger.enabled}")
+    private boolean enable;
+
+    private final String swaggerPackage = "com.yuanchu.limslaboratory";
+
+    /**
+     * 娣诲姞鎽樿淇℃伅
+     */
+    private ApiInfo apiInfo() {
+        // 鐢ˋpiInfoBuilder杩涜瀹氬埗
+        return new ApiInfoBuilder()
+                // 璁剧疆鏍囬
+                .title("LIMS绠$悊绯荤粺")
+                // 鎻忚堪
+                .description("LIMS绠$悊绯荤粺")
+                // 浣滆�呬俊鎭�
+                .contact(new Contact("Crunchy", null, null))
+                // 鐗堟湰
+                .version("鐗堟湰鍙�:V.1")
+                //鍗忚
+                .license("The Apache License")
+                //鍗忚url
+                .licenseUrl("http://www.baidu.com")
+                .build();
+    }
+
+    /**
+     * 鍒涘缓API
+     * http:IP:绔彛鍙�/swagger-ui/index.html 鍘熺敓鍦板潃
+     * http:IP:绔彛鍙�/doc.html bootStrap-UI鍦板潃
+     */
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.OAS_30).pathMapping("/")
+                // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛�
+                .enable(enable)
+                .apiInfo(apiInfo())
+                // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず
+                .select()
+                // 鎵弿鎵�鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲�
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+
+
+                // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ
+                .apis(RequestHandlerSelectors.basePackage(swaggerPackage))
+                // 鎵弿鎵�鏈� .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.regex("(?!/ApiError.*).*"))
+                .paths(PathSelectors.any())
+                .build()
+                // 鏀寔鐨勯�氳鍗忚闆嗗悎
+                .protocols(newHashSet("https", "http"))
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts());
+    }
+
+    /**
+     * 鏀寔鐨勯�氳鍗忚闆嗗悎
+     * @param type1
+     * @param type2
+     * @return
+     */
+    private Set<String> newHashSet(String type1, String type2){
+        Set<String> set = new HashSet<>();
+        set.add(type1);
+        set.add(type2);
+        return set;
+    }
+
+    /**
+     * 璁よ瘉鐨勫畨鍏ㄤ笂涓嬫枃
+     */
+    private List<SecurityScheme> securitySchemes() {
+        List<SecurityScheme> securitySchemes = new ArrayList<>();
+        securitySchemes.add((SecurityScheme) new ApiKey("token", "token", "header"));
+        return securitySchemes;
+    }
+
+    /**
+     * 鎺堟潈淇℃伅鍏ㄥ眬搴旂敤
+     */
+    private List<SecurityContext> securityContexts() {
+        List<SecurityContext> securityContexts = new ArrayList<>();
+        securityContexts.add(SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .forPaths(PathSelectors.any()).build());
+        return securityContexts;
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences = new ArrayList<>();
+        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+        return securityReferences;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java b/framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java
new file mode 100644
index 0000000..241a68a
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java
@@ -0,0 +1,24 @@
+package com.yuanchu.limslaboratory.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+@Configuration
+public class WebMvcConfig extends WebMvcConfigurationSupport {
+
+    @Value("${file.path}")
+    private String filePath;
+
+    @Override
+    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
+        //閰嶇疆鎷︽埅鍣ㄨ闂潤鎬佽祫婧�
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+
+        //璁剧疆鏂囦欢铏氭嫙璺緞鏄犲皠
+        registry.addResourceHandler("/img/**").addResourceLocations("file:"+filePath+"/");
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java b/framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java
new file mode 100644
index 0000000..8c0033e
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java
@@ -0,0 +1,18 @@
+package com.yuanchu.limslaboratory.exception;
+
+public class MyFileException extends RuntimeException{
+    public MyFileException() {
+    }
+
+    public MyFileException(String message) {
+        super(message);
+    }
+
+    public MyFileException(Throwable cause) {
+        super(cause);
+    }
+
+    public MyFileException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java b/framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..e94b324
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java
@@ -0,0 +1,215 @@
+package com.yuanchu.limslaboratory.handler;
+
+import com.yuanchu.limslaboratory.exception.MyFileException;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
+import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
+import org.springframework.beans.ConversionNotSupportedException;
+import org.springframework.beans.TypeMismatchException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+import org.springframework.jdbc.BadSqlGrammarException;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.multipart.MultipartException;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.BindException;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    @Value("${spring.servlet.multipart.max-file-size}")
+    private String maxFileSize;
+
+    @Value("${spring.servlet.multipart.max-request-size}")
+    private String maxRequestSize;
+
+    @ExceptionHandler(SQLException.class)
+    public Result<?> handlerSQLException(SQLException e)
+    {
+        log.error(e.getMessage().toLowerCase(), e);
+        return Result.fail("鏁版嵁鎿嶄綔澶辫触锛佽鑱旂郴绠$悊鍛�");
+    }
+
+    /**
+     * 鍞竴鍊煎湪鏁版嵁搴撲腑閲嶅
+     * Duplicate entry ' ' for key ' '
+     * @param e锛氶噸澶嶉敭寮傚父
+     * @return 199
+     */
+    @ExceptionHandler
+    public Result<?> DuplicateKeyException(DuplicateKeyException e) {
+        log.error(String.valueOf(e));
+        String message = e.getCause().getMessage();
+        String[] split = message.split("'");
+        return Result.fail("閲嶅娣诲姞锛氥��" + split[1] + "銆戞搷浣滃け璐ワ紒");
+    }
+
+    @ExceptionHandler
+    public Result<?> NullPointerException(NullPointerException e){
+        e.printStackTrace();
+        return Result.fail("閮ㄥ垎鍙傛暟涓虹┖锛岃妫�鏌ワ紒");
+    }
+
+    /** 杩愯鏃跺紓甯� */
+    @ExceptionHandler(RuntimeException.class)
+    public Result<?> runtimeExceptionHandler(RuntimeException e) {
+        e.printStackTrace();
+        return Result.fail("杩愯鏃跺紓甯�");
+    }
+
+    /** 绫诲瀷杞崲寮傚父 */
+    @ExceptionHandler(ClassCastException.class)
+    public Result<?> classCastExceptionHandler(ClassCastException e) {
+        e.printStackTrace();
+        return Result.fail("绫诲瀷杞崲寮傚父");
+    }
+    /** 鏂囦欢鏈壘鍒板紓甯� */
+    @ExceptionHandler(FileNotFoundException.class)
+    public Result<?> FileNotFoundException(FileNotFoundException e) {
+        e.printStackTrace();
+        return Result.fail("鏂囦欢鏈壘鍒板紓甯�");
+    }
+    /** 鏁板瓧鏍煎紡寮傚父 */
+    @ExceptionHandler(NumberFormatException.class)
+    public Result<?> NumberFormatException(NumberFormatException e) {
+        e.printStackTrace();
+        return Result.fail("鏁板瓧鏍煎紡寮傚父");
+    }
+    /** 瀹夊叏寮傚父 */
+    @ExceptionHandler(SecurityException.class)
+    public Result<?> SecurityException(SecurityException e) {
+        e.printStackTrace();
+        return Result.fail("瀹夊叏寮傚父");
+    }
+
+    /** 绫诲瀷涓嶅瓨鍦ㄥ紓甯� */
+    @ExceptionHandler(TypeNotPresentException.class)
+    public Result<?> TypeNotPresentException(TypeNotPresentException e) {
+        e.printStackTrace();
+        return Result.fail("绫诲瀷涓嶅瓨鍦ㄥ紓甯�");
+    }
+
+    /** IO寮傚父 */
+    @ExceptionHandler(IOException.class)
+    public Result<?> iOExceptionHandler(IOException e) {
+        e.printStackTrace();
+        return Result.fail("IO寮傚父");
+    }
+
+    /** 鏈煡鏂规硶寮傚父 */
+    @ExceptionHandler(NoSuchMethodException.class)
+    public Result<?> noSuchMethodExceptionHandler(NoSuchMethodException e) {
+        e.printStackTrace();
+        return Result.fail("鏈煡鏂规硶寮傚父");
+    }
+
+    /** 鏁扮粍瓒婄晫寮傚父 */
+    @ExceptionHandler(IndexOutOfBoundsException.class)
+    public Result<?> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException e) {
+        e.printStackTrace();
+        return Result.fail("鏁扮粍瓒婄晫寮傚父");
+    }
+    /** sql璇硶閿欒寮傚父 */
+    @ExceptionHandler(BadSqlGrammarException.class)
+    public Result<?> BadSqlGrammarException(BadSqlGrammarException e) {
+        e.printStackTrace();
+        return Result.fail("sql璇硶閿欒寮傚父");
+    }
+
+    /** 鏃犳硶娉ㄥ叆bean寮傚父 */
+    @ExceptionHandler(NoSuchBeanDefinitionException.class)
+    public Result<?> NoSuchBeanDefinitionException(NoSuchBeanDefinitionException e) {
+        e.printStackTrace();
+        return Result.fail("鏃犳硶娉ㄥ叆bean");
+    }
+
+    /** Http娑堟伅涓嶅彲璇诲紓甯� */
+    @ExceptionHandler({HttpMessageNotReadableException.class})
+    public Result<?> requestNotReadable(HttpMessageNotReadableException e) {
+        e.printStackTrace();
+        return Result.fail("Http娑堟伅涓嶅彲璇�");
+    }
+
+    /** 400閿欒 */
+    @ExceptionHandler({TypeMismatchException.class})
+    public Result<?> requestTypeMismatch(TypeMismatchException e) {
+        e.printStackTrace();
+        return Result.fail("鏈嶅姟鍣ㄥ紓甯�");
+    }
+
+    /** 500閿欒 */
+    @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
+    public Result<?> server500(RuntimeException e) {
+        e.printStackTrace();
+        return Result.fail("鏈嶅姟鍣ㄥ紓甯�");
+    }
+
+    /** 鏍堟孩鍑� */
+    @ExceptionHandler({StackOverflowError.class})
+    public Result<?> requestStackOverflow(StackOverflowError e) {
+        e.printStackTrace();
+        return Result.fail("鏍堟孩鍑哄紓甯�");
+    }
+
+    /** 闄ゆ暟涓嶈兘涓�0 */
+    @ExceptionHandler({ArithmeticException.class})
+    public Result<?> arithmeticException(ArithmeticException e) {
+        e.printStackTrace();
+        return Result.fail("闄ゆ暟涓嶈兘涓�0寮傚父");
+    }
+
+    /**
+     *鏂囦欢杩囧ぇ鎶ラ敊鎻愮ず
+     */
+    @ExceptionHandler({MultipartException.class})
+    public Result<?> fileUploadExceptionHandler(MultipartException  e) {
+        String msg;
+        Throwable rootCause = e.getRootCause();
+        if (rootCause instanceof FileSizeLimitExceededException) {
+            msg="涓婁紶鏂囦欢杩囧ぇ銆愬崟涓枃浠跺ぇ灏忎笉寰楄秴杩�" + maxFileSize + "銆�";
+        }else if(rootCause instanceof SizeLimitExceededException){
+            msg="涓婁紶鏂囦欢杩囧ぇ銆愭�讳笂浼犲ぇ灏忎笉寰楄秴杩�" + maxRequestSize + "銆�";
+        }else {
+            msg="鏂囦欢涓婁紶澶辫触銆愭湇鍔″櫒寮傚父銆�";
+        }
+        return Result.fail(msg);
+    }
+
+    /** 鏂囦欢鍚庣紑鍚嶄笉閫氳繃杩斿洖鎻愮ず */
+    @ExceptionHandler({MyFileException.class})
+    public Result<?> myFileException(Exception e) {
+        return Result.fail("鎶辨瓑涓嶆敮鎸併��" + e.getMessage() +"銆戝悗缂�鐨勬枃浠讹紒");
+    }
+
+    /**
+     * 鍙傛暟妫�楠�
+     */
+    @ExceptionHandler({MethodArgumentNotValidException.class})
+    public Result<?> methodArgumentNotValidException(MethodArgumentNotValidException e) {
+        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
+        String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining(";"));
+        return Result.fail(message);
+    }
+
+    /** 鍏朵粬閿欒 */
+    @ExceptionHandler({Exception.class})
+    public Result<?> exception(Exception e) {
+        e.printStackTrace();
+        return Result.fail("缃戠粶杩炴帴澶辫触锛岃閫�鍑哄悗鍐嶈瘯");
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java
new file mode 100644
index 0000000..cd69aeb
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java
@@ -0,0 +1,15 @@
+package com.yuanchu.limslaboratory.mybatis_config;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * 鑷畾涔夋坊鍔爉ybatis-plus鎵归噺娣诲姞
+ * @param <T>
+ */
+public interface MyBaseMapper <T> extends BaseMapper<T> {
+
+    int insertBatchSomeColumn(List<T> entityList);
+}
+
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java
new file mode 100644
index 0000000..f944f17
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java
@@ -0,0 +1,27 @@
+package com.yuanchu.limslaboratory.mybatis_config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class MyBatisPlusConfig {
+
+    /**
+     * 闇�瑕侀厤缃嫤鎴櫒锛屼笉鐒跺湪AddDevice涓殑total鏃犳硶鑾峰彇鍒�
+     * @return
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor(){
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 涔愯閿�
+        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+        // 鍒嗛〉閰嶇疆
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java
new file mode 100644
index 0000000..aee591a
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java
@@ -0,0 +1,22 @@
+package com.yuanchu.limslaboratory.mybatis_config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 璧峰鐗堟湰 3.3.0(鎺ㄨ崘浣跨敤)
+        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); // 璧峰鐗堟湰 3.3.0(鎺ㄨ崘浣跨敤)
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        // update鐨勬椂鍊欎娇鐢紝鏇存柊鐨勬椂鍊欏己鍒惰繘琛屽~鍏�
+        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // 璧峰鐗堟湰 3.3.0(鎺ㄨ崘)
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java
new file mode 100644
index 0000000..aec9276
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java
@@ -0,0 +1,24 @@
+package com.yuanchu.limslaboratory.mybatis_config;
+
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 鎵归噺娣诲姞
+ */
+@Component
+public class MySqlInjector extends DefaultSqlInjector {
+
+    @Override
+    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
+        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
+        //澧炲姞鑷畾涔夋柟娉曪紝瀛楁娉ㄨВ涓婁笉绛変簬FieldFill.DEFAULT鐨勫瓧娈垫墠浼氭彃鍏�
+        methodList.add(new InsertBatchSomeColumn(t->!t.isLogicDelete()));
+        return methodList;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java b/framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java
new file mode 100644
index 0000000..1fd71d9
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java
@@ -0,0 +1,113 @@
+package com.yuanchu.limslaboratory.utils;
+
+import com.yuanchu.limslaboratory.exception.MyFileException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.http.fileupload.IOUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.FileSystemUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * 淇濆瓨鏂囦欢宸ュ叿
+ */
+@Slf4j
+@Component
+public class FileSaveUtil {
+
+    // 鍙杫ml涓殑璺緞 + /
+    private static String FILE_PATH;
+
+    private static String[] ALLOWED;
+
+    @Value("${file.path}")
+    private String file;
+
+    @Value("${file.allowed}")
+    private String[] allowed;
+
+    @PostConstruct
+    public void getFile() {
+        FILE_PATH = this.file;
+    }
+
+    @PostConstruct
+    public void getAllowed(){
+        ALLOWED = this.allowed;
+    }
+    /**
+     * 瀛樺偍鏂囦欢涓诲嚱鏁�
+     * @param file 鏂囦欢浜岃繘鍒舵祦
+     * @return 杩斿洖鏂囦欢鍚嶇О鐢ㄤ簬瀛樺偍鏁版嵁搴�
+     */
+    public static String StoreFile(MultipartFile file) {
+        String originalFilename = file.getOriginalFilename();
+        // 鐢熸垚闅忔満鍚嶇О锛氭椂闂確闅忔満6浣嶆暟瀛�
+        String FileName = System.currentTimeMillis() + "_" + MyUtil.getNumber(6);
+        String suffix = null;
+        if (originalFilename != null) {
+            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
+            // 濡傛灉鍚庣紑鍚嶄笉閫氳繃鎶涘嚭寮傚父
+            if (!isFileAllowed(suffix)){
+                throw  new MyFileException(suffix);
+            }
+        }
+        // 鍚嶇О鎷兼帴
+        String fileName = FileName + suffix;
+        // 杩涜瀛樺偍
+        try {
+            storeFileWithFileName(file.getBytes(), fileName);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return fileName;
+    }
+
+    public static Boolean DeleteFile(String fileName) {
+        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
+    }
+    /**
+     * 瀛樺偍鏂囦欢鍑芥暟
+     * @param content 鏂囦欢浜岃繘鍒舵祦
+     * @param fileName 鏂囦欢鍚嶇О
+     */
+    private static void storeFileWithFileName(byte[] content, String fileName) {
+        // 瀛樺偍璺緞
+        String path = FILE_PATH + java.io.File.separatorChar;
+        // 鐩綍涓嶅瓨鍦ㄥ垯鍒涘缓
+        java.io.File file = new java.io.File(path);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        // 寮�濮嬪瓨鍌�
+        try (FileOutputStream os = new FileOutputStream(path + fileName);
+             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
+             IOUtils.copy(is, os);
+        } catch (IOException e) {
+            MyUtil.PrintLog("瀛樺偍鏂囦欢寮傚父锛�" + e);
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏂囦欢鏄惁琚厑璁镐笂浼�
+     *
+     * @param fileName 鏂囦欢鍚�
+     * @return 鍏佽true, 鍚﹀垯false
+     */
+    private static boolean isFileAllowed(String fileName) {
+        // 鑾峰彇鍚庣紑鍚�
+        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
+        for (String allow : ALLOWED) {
+            if (allow.equals(suffixName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java b/framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java
new file mode 100644
index 0000000..f272754
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java
@@ -0,0 +1,131 @@
+package com.yuanchu.limslaboratory.utils;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * JSON瑙f瀽澶勭悊
+ *
+ * @author 寮犲
+ */
+@Component
+public class JackSonUtil {
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private static final ObjectWriter OBJECT_WRITER = OBJECT_MAPPER.writerWithDefaultPrettyPrinter();
+
+    public static void marshal(File file, Object value) throws Exception {
+        try {
+            OBJECT_WRITER.writeValue(file, value);
+        } catch (JsonGenerationException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static void marshal(OutputStream os, Object value) throws Exception {
+        try {
+            OBJECT_WRITER.writeValue(os, value);
+        } catch (JsonGenerationException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static String marshal(Object value) throws Exception {
+        try {
+            return OBJECT_WRITER.writeValueAsString(value);
+        } catch (JsonGenerationException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static byte[] marshalBytes(Object value) throws Exception {
+        try {
+            return OBJECT_WRITER.writeValueAsBytes(value);
+        } catch (JsonGenerationException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static <T> T unmarshal(File file, Class<T> valueType) throws Exception {
+        try {
+            return OBJECT_MAPPER.readValue(file, valueType);
+        } catch (JsonParseException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static <T> T unmarshal(InputStream is, Class<T> valueType) throws Exception {
+        try {
+            return OBJECT_MAPPER.readValue(is, valueType);
+        } catch (JsonParseException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    /**
+     * 瀛楃涓茶浆瀵硅薄
+     * @param str
+     * @param valueType
+     * @return
+     * @param <T>
+     * @throws Exception
+     */
+    public static <T> T unmarshal(String str, Class<T> valueType) throws Exception {
+        try {
+            return OBJECT_MAPPER.readValue(str, valueType);
+        } catch (JsonParseException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+
+    public static <T> T unmarshal(byte[] bytes, Class<T> valueType) throws Exception {
+        try {
+            if (bytes == null) {
+                bytes = new byte[0];
+            }
+            return OBJECT_MAPPER.readValue(bytes, 0, bytes.length, valueType);
+        } catch (JsonParseException e) {
+            throw new Exception(e);
+        } catch (JsonMappingException e) {
+            throw new Exception(e);
+        } catch (IOException e) {
+            throw new Exception(e);
+        }
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java b/framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java
new file mode 100644
index 0000000..a9e8ade
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java
@@ -0,0 +1,77 @@
+package com.yuanchu.limslaboratory.utils;
+
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+@Component
+public class MyUtil<T> {
+
+    /**
+     * 鑷畾涔夎皟璇曞伐鍏风被
+     * @return
+     */
+    public static void PrintLog(String str){
+        // 绫诲悕
+        String className = Thread.currentThread().getStackTrace()[2].getClassName();
+        // 鍑芥暟鍚�
+        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
+        System.out.println("\033[1;94m" + className + "-->" + methodName + "-->"  + str + "\033[0m");
+    }
+
+    /**
+     * 鏃ユ湡宸ュ叿绫�
+     * @return
+     */
+    public static String MyDateFormat(){
+        //鑾峰彇鏃ユ湡
+        //瀵� import java.util.Date; 涓嬬殑鍖�
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return sdf.format(date);
+    }
+
+    /**
+     * 鑾峰彇闅忔満鍔犲瘑鐩�
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍔犲瘑鐩�
+     */
+    public static String getSalt(int n) {
+        char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890!@#$%^&*()+-=/[];~.".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 鑾峰彇闅忔満鏁板瓧
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍊�
+     */
+    public static String getNumber(int n) {
+        char[] chars = "1234567890".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    public static String getTimeSixNumberCode(String prefix){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String format = simpleDateFormat.format(new Date());
+        String timeStr = format.replace("-", "");
+        long incrNum = RedisUtil.incr("num", 1);
+        if(incrNum == 1){
+            RedisUtil.expire("num", 60 * 60 * 24);
+        }
+        String sixIncr = String.format("%06d", incrNum);
+        return prefix + timeStr + sixIncr;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java b/framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java
new file mode 100644
index 0000000..cab09bf
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java
@@ -0,0 +1,622 @@
+package com.yuanchu.limslaboratory.utils;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtil {
+    private static RedisTemplate<String, Object> redisTemplate;
+    public static RedisTemplate<String, Object> getRedisTemplate() {
+        return redisTemplate;
+    }
+    @Autowired
+    private RedisUtil(RedisConnectionFactory redisConnectionFactory){
+        // redisTemplate妯℃澘鍒濆鍖�
+        redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+        // 灏嗗璞″簭鍒楀寲
+        ObjectMapper om=new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
+                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
+
+        // String鐨勫簭鍒楀寲
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        // json搴忓垪鍖栭厤缃�
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Object.class);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        //key閲囩敤String鐨勫簭鍒楀寲鏂瑰紡
+        redisTemplate.setKeySerializer(stringRedisSerializer);
+        //hash鐨刱ey涔熼噰鐢⊿tring 鐨勫簭鍒楀寲鏂瑰紡
+        redisTemplate.setHashKeySerializer(stringRedisSerializer);
+        //value鐨勫簭鍒楀寲鏂瑰紡閲囩敤jackson鐨勬柟寮�
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+//        //hash鐨剉alue搴忓垪鍖栨柟寮忛噰鐢╦ackson
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+        redisTemplate.afterPropertiesSet();
+    }
+
+    // =============================common============================
+    /**
+     * 鎸囧畾缂撳瓨澶辨晥鏃堕棿
+     * @param key  閿�
+     * @param time 鏃堕棿(绉�)
+     */
+    public static boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁key 鑾峰彇杩囨湡鏃堕棿
+     * @param key 閿� 涓嶈兘涓簄ull
+     * @return 鏃堕棿(绉�) 杩斿洖0浠h〃涓烘案涔呮湁鏁�
+     */
+    public static long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+
+    /**
+     * 鍒ゆ柇key鏄惁瀛樺湪
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鍒犻櫎缂撳瓨
+     * @param key 鍙互浼犱竴涓�� 鎴栧涓�
+     */
+//    @SuppressWarnings("unchecked")
+    public static void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(Arrays.asList(key));
+//                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇骞跺垹闄ょ紦瀛�
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public static Object getAndDelete(String key) {
+        try{
+            return key == null ? null : get(key);
+        }finally {
+            del(key);
+        }
+    }
+
+    // ============================String=============================
+
+    /**
+     * 鏅�氱紦瀛樿幏鍙�
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public static Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏�
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true鎴愬姛 false澶辫触
+     */
+
+    public static boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏ュ苟璁剧疆鏃堕棿
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) time瑕佸ぇ浜�0 濡傛灉time灏忎簬绛変簬0 灏嗚缃棤闄愭湡
+     * @return true鎴愬姛 false 澶辫触
+     */
+
+    public static boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
+            } else {
+                // 鍙慨鏀瑰弬鏁颁笉淇敼ttl
+                redisTemplate.opsForValue().set(key, value, 0);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 閫掑
+     * @param key   閿�
+     * @param delta 瑕佸鍔犲嚑(澶т簬0)
+     */
+    public static long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+
+    /**
+     * 閫掑噺
+     * @param key   閿�
+     * @param delta 瑕佸噺灏戝嚑(灏忎簬0)
+     */
+    public static long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑噺鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+
+    // ================================Map=================================
+
+    /**
+     * HashGet
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     */
+    public static Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 鑾峰彇hashKey瀵瑰簲鐨勬墍鏈夐敭鍊�
+     * @param key 閿�
+     * @return 瀵瑰簲鐨勫涓敭鍊�
+     */
+    public static Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     * @param key 閿�
+     * @param map 瀵瑰簲澶氫釜閿��
+     */
+    public static boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * HashSet 骞惰缃椂闂�
+     * @param key  閿�
+     * @param map  瀵瑰簲澶氫釜閿��
+     * @param time 鏃堕棿(绉�)
+     * @return true鎴愬姛 false澶辫触
+     */
+    public static boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForHash().putAll(key, map);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public static boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) 娉ㄦ剰:濡傛灉宸插瓨鍦ㄧ殑hash琛ㄦ湁鏃堕棿,杩欓噷灏嗕細鏇挎崲鍘熸湁鐨勬椂闂�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public static boolean hset(String key, String item, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForHash().put(key, item, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎hash琛ㄤ腑鐨勫��
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 鍙互浣垮涓� 涓嶈兘涓簄ull
+     */
+    public static void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+
+    /**
+     * 鍒ゆ柇hash琛ㄤ腑鏄惁鏈夎椤圭殑鍊�
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+
+    /**
+     * hash閫掑 濡傛灉涓嶅瓨鍦�,灏变細鍒涘缓涓�涓� 骞舵妸鏂板鍚庣殑鍊艰繑鍥�
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸鍔犲嚑(澶т簬0)
+     */
+    public static double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+
+    /**
+     * hash閫掑噺
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸噺灏戣(灏忎簬0)
+     */
+    public static double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+
+    // ============================set=============================
+
+    /**
+     * 鏍规嵁key鑾峰彇Set涓殑鎵�鏈夊��
+     * @param key 閿�
+     */
+    public static Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 鏍规嵁value浠庝竴涓猻et涓煡璇�,鏄惁瀛樺湪
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 灏嗘暟鎹斁鍏et缂撳瓨
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public static long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 灏唖et鏁版嵁鏀惧叆缂撳瓨
+     *
+     * @param key    閿�
+     * @param time   鏃堕棿(绉�)
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public static long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = (long)values.length;
+            if (time > 0) {
+                count = redisTemplate.opsForSet().add(key, values);
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇set缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     */
+    public static long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 绉婚櫎鍊间负value鐨�
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+
+    public static long setRemove(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().remove(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    // ===============================list=================================
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勫唴瀹�
+     *
+     * @param key   閿�
+     * @param start 寮�濮�
+     * @param end   缁撴潫 0 鍒� -1浠h〃鎵�鏈夊��
+     */
+    public static List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     */
+    public static long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 閫氳繃绱㈠紩 鑾峰彇list涓殑鍊�
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩 index>=0鏃讹紝 0 琛ㄥご锛�1 绗簩涓厓绱狅紝渚濇绫绘帹锛沬ndex<0鏃讹紝-1锛岃〃灏撅紝-2鍊掓暟绗簩涓厓绱狅紝渚濇绫绘帹
+     */
+    public static Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     */
+    public static boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     */
+    public static boolean lSet(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForList().rightPush(key, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+    public static boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+    public static boolean lSet(String key, List<Object> value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForList().rightPushAll(key, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鏍规嵁绱㈠紩淇敼list涓殑鏌愭潯鏁版嵁
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩
+     * @param value 鍊�
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+
+    public static boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 绉婚櫎N涓�间负value
+     *
+     * @param key   閿�
+     * @param count 绉婚櫎澶氬皯涓�
+     * @param value 鍊�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+
+    public static long lRemove(String key, long count, Object value) {
+        try {
+            return redisTemplate.opsForList().remove(key, count, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+}
+
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java b/framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java
new file mode 100644
index 0000000..96ba602
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java
@@ -0,0 +1,51 @@
+package com.yuanchu.limslaboratory.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringUtil implements ApplicationContextAware {
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        context = applicationContext;
+    }
+
+    public static void set(ApplicationContext applicationContext) {
+        context = applicationContext;
+    }
+
+    /**
+     * 閫氳繃瀛楄妭鐮佽幏鍙�
+     * @param beanClass
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(Class<T> beanClass) {
+        return context.getBean(beanClass);
+    }
+
+    /**
+     * 閫氳繃BeanName鑾峰彇
+     * @param beanName
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(String beanName) {
+        return (T) context.getBean(beanName);
+    }
+
+    /**
+     * 閫氳繃beanName鍜屽瓧鑺傜爜鑾峰彇
+     * @param name
+     * @param beanClass
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(String name, Class<T> beanClass) {
+        return context.getBean(name, beanClass);
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java b/framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java
new file mode 100644
index 0000000..ab0385c
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java
@@ -0,0 +1,53 @@
+package com.yuanchu.limslaboratory.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Result<T> {
+
+    @ApiModelProperty(value = "鍝嶅簲鐮侊細200鎴愬姛锛�201澶辫触")
+    private int code;
+
+    @ApiModelProperty(value = "鍝嶅簲娑堟伅")
+    private String message;
+
+    @ApiModelProperty(value = "鍝嶅簲鍙傛暟")
+    private T data;
+
+    public static <T> Result<T> success(){
+        return new Result<>(200, "success",null);
+    }
+
+    public static <T> Result<T> success(String message){
+        return new Result<>(200, message,null);
+    }
+
+    public static <T> Result<T> success(T data){
+        return new Result<>(200, "success",data);
+    }
+
+    public static <T> Result<T> success(String message, T data){
+        return new Result<>(200, message,data);
+    }
+
+    public static <T> Result<T> fail(){
+        return new Result<>(201, "fail", null);
+    }
+
+    public static <T> Result<T> fail(String message){
+        return new Result<>(201, message, null);
+    }
+
+    public static <T> Result<T> fail(Integer code){
+        return new Result<>(code, "fail", null);
+    }
+
+    public static <T> Result<T> fail(Integer code, String message){
+        return new Result<>(code, message, null);
+    }
+}
diff --git a/inspection-server/pom.xml b/inspection-server/pom.xml
new file mode 100644
index 0000000..8a07947
--- /dev/null
+++ b/inspection-server/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>inspection-server</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>inspection-server</name>
+    <description>inspection-server</description>
+
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>framework</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>standard-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>laboratory-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.12</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java
new file mode 100644
index 0000000..dd191cd
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java
@@ -0,0 +1,139 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.text.ParseException;
+import java.util.*;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.yuanchu.limslaboratory.pojo.Inspection;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
+import com.yuanchu.limslaboratory.service.RawMaterialService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.service.InspectionService;
+import javax.annotation.Resource;
+
+/**
+ * 鐢宠琛�(Inspection)琛ㄦ帶鍒跺眰
+ *
+ * @author zss
+ * @since 2023-08-03 13:03:36
+ */
+@Api(tags = "璇曢獙绠$悊-->妫�楠岀敵璇�")
+@RestController
+@RequestMapping("/inspection")
+public class InspectionController {
+
+    @Autowired
+    private InspectionService inspectionService;
+
+    @Resource
+    RawMaterialService rawMaterialService;
+
+    @Resource
+    LinkBasicInformationService linkBasicInformationService;
+
+    @ApiOperation(value = "鏌ヨ妫�楠岀敵璇峰崟鍒楄〃")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageSize", value = "椤垫暟", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "countSize", value = "鏉℃暟/椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "message", value = "鐢宠鍗曞彿/鍘熸潗鏂欏悕绉�", dataTypeClass = String.class)
+    })
+    @GetMapping("/selectInspectsList")
+    public Result selectInspectsList(int pageSize, int countSize, String message) {
+        IPage<Map<String, Object>> inspectionPage = inspectionService.selectInspectsList(new Page<Object>(pageSize, countSize), message);
+        Map<String, Object> map = new HashMap<>();
+        map.put("total", inspectionPage.getTotal());
+        map.put("row", inspectionPage.getRecords());
+        return Result.success(map);
+    }
+
+
+    @ApiOperation(value = "鏌ヨ鎵�鏈夋姤妫�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "type", value = "绫诲瀷", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/selectAll")
+    public Result selectAll(Integer type) {
+        switch (type) {
+            case 0 :
+                //鍘熸潗鏂�
+                return Result.success(rawMaterialService.selectRawmaAll());
+            case 1 :
+                //濮旀墭鍗�
+                return Result.success(linkBasicInformationService.selectLinkAll());
+            case 2 :
+                //鎴愬搧妫�楠�
+                return Result.success("璇疯緭鍏ユ楠屼俊鎭�!");
+        }
+        return Result.fail("绫诲瀷閿欒!");
+    }
+
+
+    @ApiOperation(value = "閫夋嫨鍘熸潗鏂欐姤妫�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "鍘熸潗鏂欐姤妫�鍗昳d", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "startTime", value = "妫�楠屽紑濮嬫棩鏈�", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "endTime", value = "妫�楠岀粨鏉熸棩鏈�", dataTypeClass = String.class, required = true)
+    })
+    @GetMapping("/selectRawmaById")
+    public Result selectRawmaById(Integer id, String startTime, String endTime) throws ParseException {
+        return Result.success(rawMaterialService.selectRawmaById(id,startTime,endTime));
+    }
+
+
+    @ApiOperation(value = "閫夋嫨濮旀墭鎶ユ鍜屾牱鍝�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "bid", value = "濮旀墭鎶ユ鍗昳d", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "did", value = "濮旀墭鎶ユ鏍峰搧id", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/selectLinkByid")
+    public Result selectLinkByid(Integer bid, Integer did) {
+        return Result.success(linkBasicInformationService.selectLinkByid(bid, did));
+    }
+
+
+    @ApiOperation(value = "鏂板妫�楠屽崟")
+    @PostMapping("/addInspect")
+    public Result addInspect(@RequestHeader("token") String token, @RequestBody InspectionVo inspectionVo) throws Exception {
+        Object object = RedisUtil.get(token);
+        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
+        return Result.success(inspectionService.addInspect((Integer) unmarshal.get("id"), inspectionVo));
+    }
+
+    @ApiOperation(value = "鏍规嵁妫�楠屽崟id鏌ヨ鍘熸潗鏂欐楠屽崟璇︽儏")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "妫�楠屽崟id", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/selectInspectsListById")
+    public Result selectInspectsListById(Integer id) {
+        return Result.success(inspectionService.selectInspectsListById(id));
+    }
+
+    @ApiOperation(value = "涓婃姤(鏇存柊妫�楠岀姸鎬�)")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "妫�楠屽崟id", dataTypeClass = Integer.class, required = true)
+    })
+    @PostMapping("/updateInspectsById")
+    public Result updateInspectsById(Integer id) {
+        //濡傛灉宸茬粡涓婃姤浜嗕笉鑳藉啀涓�娆′笂鎶�
+        Inspection inspection = inspectionService.getById(id);
+        if (ObjectUtils.isNotEmpty(inspection.getInspectionStatus())) {
+            return Result.fail("宸茬粡涓婃姤杩囦簡,涓嶈兘鍐嶆涓婃姤!");
+        }
+        return Result.success(inspectionService.updateInspectsById(id));
+    }
+
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java
new file mode 100644
index 0000000..63ace1b
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java
@@ -0,0 +1,23 @@
+package com.yuanchu.limslaboratory.controller;
+
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.yuanchu.limslaboratory.service.InspectionMaterialService;
+
+/**
+ * (鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂�(InspectionMaterial)琛ㄦ帶鍒跺眰
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:28
+ */
+@Api(tags = "(鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂欐帴鍙�")
+@RestController
+@RequestMapping("/inspectionMaterial")
+public class InspectionMaterialController {
+
+    @Autowired
+    private InspectionMaterialService inspectionMaterialService;
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java
new file mode 100644
index 0000000..8203159
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java
@@ -0,0 +1,79 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.yuanchu.limslaboratory.pojo.InspectionProduct;
+import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
+import com.yuanchu.limslaboratory.service.InstrumentService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.service.InspectionProductService;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐢宠鍗曚笅鐗╂枡涓殑椤圭洰(InspectionProduct)琛ㄦ帶鍒跺眰
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:54
+ */
+@Api(tags = "璇曢獙绠$悊-->妫�楠岀敵璇�-->妫�楠岄」鐩�")
+@RestController
+@RequestMapping("/inspectionProduct")
+public class InspectionProductController {
+
+    @Autowired
+    private InspectionProductService inspectionProductService;
+
+    @Resource
+    InstrumentService instrumentService;
+
+    @ApiOperation(value = "鏌ヨ鎵�鏈夎澶�")
+    @GetMapping("/selectInstrument")
+    public Result selectInstrument() {
+        return Result.success(instrumentService.selectInstrument());
+    }
+
+    @ApiOperation("閫夋嫨璁惧淇℃伅")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "id", value = "璁惧ID", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/selectInstrumentById")
+    public Result selectInstrumentById(Integer id) {
+        String equipmentName = instrumentService.getById(id).getEquipmentName();
+        return Result.success(equipmentName);
+    }
+
+
+    @ApiOperation(value = "鏇存柊妫�楠岄」鐩�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "testValue", value = "妫�娴嬪��", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "required", value = "鏍囧噯鍊�", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "internal", value = "鍐呮帶鍊�", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "name", value = "椤圭洰鍚嶇О", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "inspectionMaterialId", value = "鍐呮帶鍊�", dataTypeClass = Integer.class, required = true)
+    })
+    @PostMapping("/updateInsProduct")
+    public Result updateInsProduct(@RequestHeader("token") String token, @RequestBody InspectionProduct inspectionProduct) throws Exception {
+        Object object = RedisUtil.get(token);
+        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
+        Integer userId = (Integer) unmarshal.get("id");
+        return Result.success(inspectionProductService.updateInsProduct(userId,inspectionProduct));
+    }
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java
new file mode 100644
index 0000000..22de441
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java
@@ -0,0 +1,68 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Api(tags = "鎶ユ绠$悊-->濮旀墭妫�楠�")
+@RestController
+@RequestMapping("/link-basic-table")
+public class LinkBasicInformationController {
+
+    @Autowired
+    private LinkBasicInformationService linkBasicInformationService;
+
+    @ApiOperation("閾炬帴-->鑾峰彇閾炬帴")
+    @GetMapping("/link")
+    public Result<?> getLink() {
+        Object link1 = null;
+        try {
+            link1 = RedisUtil.get("link");
+        } catch (Exception e) {
+            String uuid = IdWorker.get32UUID();
+            RedisUtil.set("link", uuid, 60 * 24);
+            return Result.success("success", uuid);
+        }
+        return Result.success(link1);
+    }
+
+    @ApiOperation(value = "鍒嗛〉琛ㄦ牸")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "entrustCoding", value = "濮旀墭缂栧彿", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "sampleName", value = "鏍峰搧鍚嶇О", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "entrusted", value = "濮旀墭鍗曚綅", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "inspectionStatus", value = "妫�楠岀姸鎬�", dataTypeClass = Integer.class)
+    })
+    @GetMapping("/page")
+    public Result<?> getLinkBasicPage(Integer pageNo, Integer pageSize, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus) {
+        IPage<Map<String, Object>> linkBasicPage = linkBasicInformationService.getLinkBasicPage(new Page<Object>(pageNo, pageSize), entrustCoding, sampleName, entrusted, inspectionStatus);
+        Map<String, Object> map = new HashMap<>();
+        map.put("total", linkBasicPage.getTotal());
+        map.put("row", linkBasicPage.getRecords());
+        return Result.success(map);
+    }
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java
new file mode 100644
index 0000000..82c0065
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java
@@ -0,0 +1,82 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
+import com.yuanchu.limslaboratory.pojo.Material;
+import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
+import com.yuanchu.limslaboratory.service.MaterialService;
+import com.yuanchu.limslaboratory.service.StandardService;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Api(tags = "鎶ユ绠$悊-->濮旀墭妫�楠�")
+@RestController
+@RequestMapping("/link-basic")
+public class LinkDetectionController {
+
+    @Autowired
+    private LinkBasicInformationService linkBasicInformationService;
+
+    @Autowired
+    private MaterialService materialService;
+
+    @Autowired
+    private StandardService standardService;
+
+    @ApiOperation("閾炬帴-->鑾峰彇鏍峰搧鍚嶇О")
+    @GetMapping("/material")
+    public Result<?> getMaterialIdAndName(@RequestHeader("link") String link) {
+        String redisLink = RedisUtil.get("link").toString();
+        if (redisLink.equals(link)){
+            LambdaQueryWrapper<Material> wrapper = new LambdaQueryWrapper<>();
+            wrapper.select(Material::getId, Material::getName, Material::getCode);
+            List<Map<String, Object>> maps = materialService.listMaps(wrapper);
+            return Result.success(maps);
+        }
+        return Result.fail("鎶辨瓑閾炬帴閿欒鎴栧凡杩囨湡锛�");
+    }
+
+    @ApiOperation("閾炬帴-->鑾峰彇瑙勬牸鍨嬪彿")
+    @GetMapping("/specification")
+    public Result<?> getSpecificationIdAndName(@RequestHeader("link") String link, String materialId) {
+        String redisLink = RedisUtil.get("link").toString();
+        if (redisLink.equals(link)){
+            List<Map<String, Object>> specificationIdAndName = standardService.getSpecificationIdAndName(materialId);
+            return Result.success(specificationIdAndName);
+        }
+        return Result.fail("鎶辨瓑閾炬帴閿欒鎴栧凡杩囨湡锛�");
+    }
+
+    @ApiOperation("閾炬帴-->娣诲姞妫�楠岀敵璇峰崟")
+    @PostMapping("/addInspection")
+    public Result<?> addLinkBasicInformation(@RequestHeader("link") String link, @RequestBody LinkBasicInformation linkBasicInformation) {
+        String redisLink = RedisUtil.get("link").toString();
+        if (redisLink.equals(link)){
+            String code = linkBasicInformationService.addLinkBasicInformation(linkBasicInformation);
+            if (!ObjectUtils.isEmpty(code)){
+                return Result.success("娣诲姞鎴愬姛锛�", code);
+            } else {
+                return Result.fail("娣诲姞澶辫触!");
+            }
+        }
+        return Result.fail("鎶辨瓑閾炬帴閿欒鎴栧凡杩囨湡锛�");
+
+    }
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java
new file mode 100644
index 0000000..a5d2ce3
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java
@@ -0,0 +1,57 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.RawMaterial;
+import com.yuanchu.limslaboratory.service.RawMaterialService;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-28
+ */
+@Api(tags = "鎶ユ绠$悊-->鍘熸潗鏂欐姤妫�-->椤甸潰鐗堟湰琛�")
+@RestController
+@RequestMapping("/raw-material")
+public class RawMaterialController {
+
+    @Autowired
+    private RawMaterialService rawMaterialService;
+
+    @ApiOperation("鏌ヨ鎵�鏈夋楠岃鍒掑垎閰�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "materialCoding", value = "鏉愭枡缂栫爜", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "materialName", value = "鏉愭枡鍚嶇О", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "condition", value = "鐘舵��", dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "createTime", value = "鏉ユ枡鏃ユ湡", dataTypeClass = String.class)
+    })
+    @GetMapping("/selectAll")
+    public Result<?> selectRawMaterial(Integer pageSize, Integer pageNo, String materialCoding, String materialName, Integer condition, String createTime) {
+        IPage<RawMaterial> iPage = rawMaterialService.selectRawMaterial(materialCoding, materialName, condition, createTime, new Page<Objects>(pageNo, pageSize));
+        Map<String, Object> map = new HashMap<>();
+        map.put("row", iPage.getRecords());
+        map.put("total", iPage.getTotal());
+        return Result.success(map);
+    }
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java
new file mode 100644
index 0000000..dd00306
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java
@@ -0,0 +1,29 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Inspection;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐢宠琛�(Inspection)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author zss
+ * @since 2023-08-03 13:03:36
+ */
+public interface InspectionMapper extends BaseMapper<Inspection> {
+
+
+    /**
+     * 鏌ヨ妫�楠岀敵璇峰崟鍒楄〃
+     * @param page
+     * @param message
+     * @return
+     */
+    IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message);
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java
new file mode 100644
index 0000000..3145666
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java
@@ -0,0 +1,15 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
+
+/**
+ * (鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂�(InspectionMaterial)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:28
+ */
+public interface InspectionMaterialMapper extends BaseMapper<InspectionMaterial> {
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java
new file mode 100644
index 0000000..f73d82b
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java
@@ -0,0 +1,15 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.limslaboratory.pojo.InspectionProduct;
+
+/**
+ * 鐢宠鍗曚笅鐗╂枡涓殑椤圭洰(InspectionProduct)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:54
+ */
+public interface InspectionProductMapper extends BaseMapper<InspectionProduct> {
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java
new file mode 100644
index 0000000..95e0c2a
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java
@@ -0,0 +1,37 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+public interface LinkBasicInformationMapper extends BaseMapper<LinkBasicInformation> {
+
+    IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus);
+
+    /**
+     * 鏌ヨ鎵�鏈夊鎵樼敵璇峰拰鏍峰搧
+     * @return
+     */
+    List<Map<String, Object>> selectLinkAll();
+
+    /**
+     * 閫夋嫨濮旀墭鐢宠鍜屾牱鍝�
+     * @param bid
+     * @param did
+     * @return
+     */
+    InspectionVo selectLinkByid(Integer bid, Integer did);
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java
new file mode 100644
index 0000000..7e6da26
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java
@@ -0,0 +1,17 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.mybatis_config.MyBaseMapper;
+import com.yuanchu.limslaboratory.pojo.LinkDetection;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+public interface LinkDetectionMapper extends MyBaseMapper<LinkDetection> {
+
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java
new file mode 100644
index 0000000..567cf9f
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java
@@ -0,0 +1,30 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.RawMaterial;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-28
+ */
+public interface RawMaterialMapper extends BaseMapper<RawMaterial> {
+
+    IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page);
+
+
+    List<RawMaterial> selectRawmaAll();
+
+    InspectionVo selectRawmaById(Integer id);
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java
new file mode 100644
index 0000000..3af517c
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java
@@ -0,0 +1,89 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.*;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.io.Serializable;
+
+/**
+ * 鐢宠琛�(Inspection)琛ㄥ疄浣撶被
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:05
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@Builder
+@TableName("inspection")
+public class Inspection implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鐢宠鍗曠紪鍙�
+     **/
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鐢宠鍗曠紪鐮�
+     **/
+    private String code;
+
+    /**
+     * 妫�楠岀被鍨� 0锛氬師鏉愭枡锛�1锛氫骇鍝侊紱2锛氬崐鎴愬搧锛�
+     **/
+    private Integer type;
+
+    /**
+     * 妫�楠岀姸鎬侊細1锛氬悎鏍硷紱0锛氫笉鍚堟牸
+     **/
+    private Integer inspectionStatus;
+
+    /**
+     * ${column.comment}
+     **/
+    private Integer state;
+
+    /**
+     * 鐧昏鏃ユ湡
+     **/
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * ${column.comment}
+     **/
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 鍏宠仈 鐧昏浜猴紙鐢ㄦ埛id锛�
+     **/
+    private Integer userId;
+
+    /**
+     * 妫�楠屽紑濮嬫棩鏈�
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 妫�楠岀粨鏉熸棩鏈�
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java
new file mode 100644
index 0000000..55311dc
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java
@@ -0,0 +1,97 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.*;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.io.Serializable;
+
+/**
+ * (鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂�(InspectionMaterial)琛ㄥ疄浣撶被
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:28
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@Builder
+@TableName("inspection_material")
+public class InspectionMaterial implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     **/
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鐗╂枡缂栫爜
+     **/
+    private String code;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     **/
+    private String name;
+
+    /**
+     * 鎶ユ鏁伴噺-鐗╂枡鏁伴噺
+     **/
+    private Integer num;
+
+    /**
+     * 鍗曚綅
+     **/
+    private String unit;
+
+    /**
+     * 渚涘簲鍟�
+     **/
+    private String supplier;
+
+    /**
+     * 瑙勬牸鍚嶇О-鍨嬪彿鍚嶇О
+     **/
+    private String specifications;
+
+    /**
+     * 鏉ユ枡鏃ユ湡
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date formTime;
+
+    /**
+     * ${column.comment}
+     **/
+    private Integer state;
+
+    /**
+     * ${column.comment}
+     **/
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * ${column.comment}
+     **/
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 鍏宠仈 鐢宠鍗昳d
+     **/
+    private Integer inspectionId;
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java
new file mode 100644
index 0000000..978a274
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java
@@ -0,0 +1,100 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.*;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.io.Serializable;
+
+/**
+ * 鐢宠鍗曚笅鐗╂枡涓殑椤圭洰(InspectionProduct)琛ㄥ疄浣撶被
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:55
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@Builder
+@TableName("inspection_product")
+public class InspectionProduct implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 椤圭洰id
+     **/
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 椤圭洰鍚嶇О
+     **/
+    private String name;
+
+    /**
+     * 鍗曚綅
+     **/
+    private String unit;
+
+    /**
+     * 瑕佹眰鍊�
+     **/
+    private String required;
+
+    /**
+     * 鍐呮帶鍊�
+     **/
+    private String internal;
+
+    /**
+     * 妫�娴嬪��
+     **/
+    private String testValue;
+
+    /**
+     * 缁撹 0锛氫笉鍚堟牸锛�1锛氬悎鏍�
+     **/
+    private Integer testState;
+
+    /**
+     * ${column.comment}
+     **/
+    private Integer state;
+
+    /**
+     * ${column.comment}
+     **/
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * ${column.comment}
+     **/
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 鍏宠仈 鎶ユ鐗╂枡id
+     **/
+    private Integer inspectionMaterialId;
+
+    /**
+     * 鍏宠仈 鐢ㄦ埛id 璇曢獙鍛�
+     **/
+    private Integer userId;
+
+    /**
+     * 鍏宠仈 璁惧id
+     **/
+    private Integer instrumentId;
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java
new file mode 100644
index 0000000..60e4a5a
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java
@@ -0,0 +1,89 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="LinkBasicInformation瀵硅薄", description="")
+public class LinkBasicInformation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭鑷", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "濮旀墭缂栫爜", hidden = true)
+    private String entrustCoding;
+
+    @ApiModelProperty(value = "濮旀墭鍗曚綅", required = true, example = "闃块噷宸村反")
+    private String entrusted;
+
+    @ApiModelProperty(value = "鑱旂郴浜�", required = true, example = "灏忛粦")
+    private String contacts;
+
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽", required = true, example = "12321423432")
+    private String contactNumber;
+
+    @ApiModelProperty(value = "鑱旂郴鍦板潃", required = true, example = "姹熻嫃鍗楅��")
+    private String contactAddress;
+
+    @ApiModelProperty(value = "瀹屾垚鏈熼檺", required = true, example = "2023-08-03", dataType = "date")
+    private Date completionDeadline;
+
+    @ApiModelProperty(value = "閫佹牱鏃堕棿", required = true, example = "2023-08-03", dataType = "date")
+    private Date inspectionTime;
+
+    @ApiModelProperty(value = "閫佹牱鏂瑰紡:1閫佹牱;2涓婇棬", required = true, example = "1")
+    private Integer sampleDeliveryMode;
+
+    @ApiModelProperty(value = "閫佹牱浜猴細濡傛灉閫佹牱鏂瑰紡閫夋嫨浜嗛�佹牱锛岄偅涔堝繀濉�", example = "灏忕櫧")
+    private String sampleSender;
+
+    @ApiModelProperty(value = "閫佹牱浜虹數璇濓細濡傛灉閫佹牱鏂瑰紡閫夋嫨浜嗛�佹牱锛岄偅涔堝繀濉�", example = "123456789676")
+    private String sampleDeliveryPhone;
+
+    @ApiModelProperty(value = "鎶ュ憡鏁�", required = true, example = "23")
+    private Integer reportNumber;
+
+    @ApiModelProperty(value = "濮旀墭澶囨敞", example = "濮旀墭澶囨敞YPBH123456789YPBH123456789YPBH123456789")
+    private String entrustRemarks;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "妫�楠屼俊鎭�")
+    private List<LinkDetection> linkDetectionList;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java
new file mode 100644
index 0000000..e62f2a8
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java
@@ -0,0 +1,82 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="LinkDetection瀵硅薄", description="")
+public class LinkDetection implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鏍峰搧缂栧彿", required = true, example = "YPBH123456789")
+    private String sampleNumber;
+
+    @ApiModelProperty(value = "鏍峰搧鍚嶇О", required = true, example = "鍙戝姩鏈�")
+    private String sampleName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿", required = true, example = "GGXH-AAAAA")
+    private String specificationsModels;
+
+    @NotBlank(message = "璇峰~鍐欏崟浣嶏紒")
+    @ApiModelProperty(value = "鍗曚綅", required = true, example = "鐧惧害")
+    private String unit;
+
+    @NotNull(message = "璇峰~鍐欐牱鍝佹暟閲忥紒")
+    @ApiModelProperty(value = "鏍峰搧鏁伴噺", required = true, example = "20")
+    private Integer samplesNumber;
+
+    @NotBlank(message = "璇曢獙涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "璇曢獙", required = true, example = "鍋氭ⅵ")
+    private String experiment;
+
+    @ApiModelProperty(value = "澶囨敞", example = "閫氳繃浜�")
+    private String remarks;
+
+    @ApiModelProperty(value = "LinkBasicInformation瀵硅薄Id", hidden = true)
+    private Integer linkBasicId;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "妫�楠屾棩鏈�", hidden = true)
+    private Date dateSurvey;
+
+    @ApiModelProperty(value = "妫�楠岀姸鎬�", hidden = true)
+    private Integer inspectionStatus;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java
new file mode 100644
index 0000000..372dd04
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java
@@ -0,0 +1,84 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="RawMaterial瀵硅薄", description="")
+public class RawMaterial implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "渚涘簲鍟嗗悕绉�")
+    private String supplierName;
+
+    @ApiModelProperty(value = "鏉愭枡缂栫爜")
+    private String materialCoding;
+
+    @ApiModelProperty(value = "鏉愭枡鍚嶇О")
+    private String materialName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationsModels;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "鏁伴噺")
+    private Integer quantity;
+
+    @ApiModelProperty(value = "鎶ユ鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime inspectionDate;
+
+    @ApiModelProperty(value = "妫�楠屼汉")
+    private String surveyor;
+
+    @ApiModelProperty(value = "妫�楠屾棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime dateSurvey;
+
+    @ApiModelProperty(value = "鐘舵��0:寰呮娴�;1:宸叉娴�")
+    private Integer condition;
+
+//    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java
new file mode 100644
index 0000000..089d728
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java
@@ -0,0 +1,66 @@
+package com.yuanchu.limslaboratory.pojo.vo;
+
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class InsProductVo implements Serializable {
+
+    /**
+     * 椤圭洰鍚嶇О
+     **/
+    @JsonSerialize
+    private String name;
+
+    /**
+     * 鍗曚綅
+     **/
+    @JsonSerialize
+    private String unit;
+
+    /**
+     * 鏍囧噯鍊�
+     **/
+    @JsonSerialize
+    private String required;
+
+    /**
+     * 鍐呮帶鍊�
+     **/
+    @JsonSerialize
+    private String internal;
+
+    /**
+     * 妫�娴嬪��
+     **/
+    @JsonSerialize
+    private String testValue;
+
+    /**
+     * 缁撹 0锛氫笉鍚堟牸锛�1锛氬悎鏍�
+     **/
+    @JsonSerialize
+    private Integer testState;
+
+    /**
+     * 璁惧鍚嶇О
+     **/
+    @JsonSerialize
+    private String instrumentName;
+
+    /**
+     * 鍏宠仈 鐢宠鍗昳d
+     **/
+    @JsonSerialize
+    private Integer inspectionMaterialId;
+
+    /**
+     *  妫�楠屽憳
+     **/
+    @JsonSerialize
+    private String userName;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java
new file mode 100644
index 0000000..16a58cb
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java
@@ -0,0 +1,94 @@
+package com.yuanchu.limslaboratory.pojo.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+//鏌ヨ妫�楠屽崟璇︽儏(妫�楠屽熀鏈俊鎭互鍙婃楠岄」鐩俊鎭�)
+public class InspectDetailVo implements Serializable {
+    
+    /* 妫�楠岃鎯� */
+    /**
+     * 鏉ユ枡鏃ユ湡
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date formTime;
+
+    /**
+     * 渚涘簲鍟�
+     **/
+    @JsonSerialize
+    private String supplier;
+
+    /**
+     * 鍘熸潗鏂欑紪鐮�
+     */
+    @JsonSerialize
+    private String code;
+
+    /**
+     * 鍘熸潗鏂欏悕绉�
+     */
+    @JsonSerialize
+    private String name;
+
+    /**
+     * 鍨嬪彿瑙勬牸
+     */
+    @JsonSerialize
+    private String specifications;
+
+    /**
+     * 鍗曚綅
+     */
+    @JsonSerialize
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @JsonSerialize
+    private Integer num;
+
+    /**
+     * 妫�楠屽紑濮嬫棩鏈�
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+
+    /**
+     * 妫�楠岀粨鏉熸棩鏈�
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
+
+    /**
+     * 鎶ユ浜猴紙褰撳墠鐢ㄦ埛鍚嶏級
+     */
+    @JsonSerialize
+    private String userName;
+
+    /* 妫�楠岄」鐩� */
+    @JsonSerialize
+    private List<InsProductVo> insProducts;
+
+    /* 妫�楠岀粨璁� */
+    /**
+     * 鍚堟牸鐘舵�� 0锛氫笉鍚堟牸锛�1锛氬悎鏍�
+     */
+    @JsonSerialize
+    private Integer inspectionStatus;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java
new file mode 100644
index 0000000..f804333
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java
@@ -0,0 +1,76 @@
+package com.yuanchu.limslaboratory.pojo.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serializable;
+import java.util.Date;
+//鏂板妫�楠屽崟
+@Data
+public class InspectionVo implements Serializable {
+
+    /**
+     *妫�楠岀被鍨� 0锛氬師鏉愭枡锛�1锛氫骇鍝侊紱2锛氬崐鎴愬搧锛�
+     **/
+    @JsonSerialize
+    private Integer type;
+
+    /**
+     * 鏉ユ枡鏃ユ湡
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date formTime;
+
+    /**
+     * 渚涘簲鍟�
+     **/
+    @JsonSerialize
+    private String supplier;
+
+    /**
+     * 鐗╂枡缂栫爜
+     **/
+    @JsonSerialize
+    private String mcode;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     **/
+    @JsonSerialize
+    private String name;
+
+    /**
+     * 瑙勬牸鍚嶇О-鍨嬪彿鍚嶇О
+     **/
+    @JsonSerialize
+    private String specifications;
+
+    /**
+     * 鍗曚綅
+     **/
+    @JsonSerialize
+    private String unit;
+
+    /**
+     * 鎶ユ鏁伴噺-鐗╂枡鏁伴噺
+     **/
+    @JsonSerialize
+    private Integer num;
+
+    /**
+     * 妫�楠屽紑濮嬫棩鏈�
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 妫�楠岀粨鏉熸棩鏈�
+     **/
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java
new file mode 100644
index 0000000..3c65806
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java
@@ -0,0 +1,15 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
+
+/**
+ * (鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂�(InspectionMaterial)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:28
+ */
+public interface InspectionMaterialService extends IService<InspectionMaterial> {
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java
new file mode 100644
index 0000000..3a367c5
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java
@@ -0,0 +1,23 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.InspectionProduct;
+import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
+
+/**
+ * 鐢宠鍗曚笅鐗╂枡涓殑椤圭洰(InspectionProduct)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:54
+ */
+public interface InspectionProductService extends IService<InspectionProduct> {
+
+    /**
+     * 鏇存柊妫�楠岄」鐩�
+     * @param userId
+     * @param inspectionProduct
+     * @return
+     */
+    boolean updateInsProduct(Integer userId, InspectionProduct inspectionProduct);
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java
new file mode 100644
index 0000000..e95c474
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java
@@ -0,0 +1,53 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.Inspection;
+import com.yuanchu.limslaboratory.pojo.vo.InspectDetailVo;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐢宠琛�(Inspection)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author zss
+ * @since 2023-08-03 13:03:36
+ */
+public interface InspectionService extends IService<Inspection> {
+
+
+    /**
+     *鏌ヨ妫�楠岀敵璇峰崟鍒楄〃
+     * @param page
+     * @param message
+     * @return
+     */
+    IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message);
+
+    /**
+     * 鏂板妫�楠岀敵璇疯〃
+     * @param id
+     * @param
+     * @return
+     */
+    Integer addInspect(Integer id, InspectionVo inspectionVo);
+
+
+    /**
+     *鏍规嵁妫�楠屽崟id鏌ヨ鍘熸潗鏂欐楠屽崟璇︽儏
+     * @param id
+     * @return
+     */
+    InspectDetailVo selectInspectsListById(Integer id);
+
+    /**
+     * 涓婃姤(鏇存柊妫�楠屽崟妫�楠岀粨鏋�)
+     * @param id
+     * @return
+     */
+    boolean updateInspectsById(Integer id);
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java
new file mode 100644
index 0000000..02b7207
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java
@@ -0,0 +1,41 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+public interface LinkBasicInformationService extends IService<LinkBasicInformation> {
+
+    @Transactional(rollbackFor = Exception.class)
+    String addLinkBasicInformation(LinkBasicInformation linkBasicInformation);
+
+    IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus);
+
+    /**
+     *鏌ヨ鎵�鏈夊鎵樻楠屽拰鏍峰搧
+     * @return
+     */
+    List<Map<String, Object>> selectLinkAll();
+
+    /**
+     * 鏍规嵁濮旀墭妫�楠宨d鍜屾牱鍝乮d鏌ヨ濮旀墭妫�楠屽拰鏍峰搧
+     * @param bid
+     * @param did
+     * @return
+     */
+    InspectionVo selectLinkByid(Integer bid, Integer did);
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java
new file mode 100644
index 0000000..ecd44e5
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.LinkDetection;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+public interface LinkDetectionService extends IService<LinkDetection> {
+
+    // 鎵归噺娣诲姞
+    void insertListData(Integer id, List<LinkDetection> linkDetectionList);
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java
new file mode 100644
index 0000000..143225f
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java
@@ -0,0 +1,41 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.RawMaterial;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-28
+ */
+public interface RawMaterialService extends IService<RawMaterial> {
+
+    IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page);
+
+    /**
+     * 鏌ヨ鍘熸潗鏂欐楠�
+     *
+     * @return
+     */
+    List<RawMaterial> selectRawmaAll();
+
+    /**
+     * 閫夋嫨鍘熸潗鏂欐姤妫�
+     *
+     * @param id
+     * @return
+     */
+    InspectionVo selectRawmaById(Integer id, String startTime, String endTime) throws ParseException;
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java
new file mode 100644
index 0000000..60be3c0
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java
@@ -0,0 +1,19 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.mapper.InspectionMaterialMapper;
+import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
+import com.yuanchu.limslaboratory.service.InspectionMaterialService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (鏍峰搧)妫�楠屽崟閲岄潰鐨勭墿鏂�(InspectionMaterial)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:28
+ */
+@Service
+public class InspectionMaterialServiceImpl extends ServiceImpl<InspectionMaterialMapper, InspectionMaterial> implements InspectionMaterialService {
+
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java
new file mode 100644
index 0000000..c07063c
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java
@@ -0,0 +1,90 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.mapper.InspectionProductMapper;
+import com.yuanchu.limslaboratory.pojo.InspectionProduct;
+import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
+import com.yuanchu.limslaboratory.service.InspectionProductService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 鐢宠鍗曚笅鐗╂枡涓殑椤圭洰(InspectionProduct)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author zss
+ * @since 2023-08-03 13:04:54
+ */
+@Service
+public class InspectionProductServiceImpl extends ServiceImpl<InspectionProductMapper, InspectionProduct> implements InspectionProductService {
+
+    @Resource
+    InspectionProductMapper inspectionProductMapper;
+
+    //鏇存柊妫�楠岄」鐩�
+    @Override
+    public boolean updateInsProduct(Integer userId, InspectionProduct inspectionProduct) {
+        //璧嬪�兼楠屽憳id
+        inspectionProduct.setUserId(userId);
+        //鍒ゆ柇妫�娴嬪�兼槸鍚︽弧瓒虫爣鍑嗗�煎拰鍐呮帶鍊肩殑瑕佹眰,濡傛灉涓嶆弧瓒冲垯妫�楠岀粨璁轰负涓嶅悎鏍�0
+        String testValue = inspectionProduct.getTestValue();//妫�楠屽��
+        String required = inspectionProduct.getRequired();//鏍囧噯鍊�
+        String internal = inspectionProduct.getInternal();//鍐呮帶鍊�
+        inspectionProduct.setTestState(checkValues(required, internal, testValue));
+        //鏍规嵁妫�楠岄」鐩悕鍜屽叧鑱旂殑妫�楠岀墿鏂檌d鏉ユ煡璇㈡楠岄」鐩殑鏁版嵁
+        LambdaUpdateWrapper<InspectionProduct> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(InspectionProduct::getInspectionMaterialId, inspectionProduct.getInspectionMaterialId())
+                .eq(InspectionProduct::getName, inspectionProduct.getName());
+        inspectionProductMapper.update(inspectionProduct, updateWrapper);
+        return true;
+    }
+
+    /*鍒ゆ柇妫�娴嬪�兼槸鍚︽弧瓒虫爣鍑嗗�煎拰鍐呮帶鍊肩殑瑕佹眰,濡傛灉涓嶆弧瓒冲垯妫�楠岀粨璁轰负涓嶅悎鏍�*/
+    private int checkValues(String standardValueStr, String controlValueStr, String detectionValueStr) {
+        boolean isStandardValueSatisfied = isValueSatisfied(standardValueStr, detectionValueStr);
+        boolean isControlValueSatisfied = isValueSatisfied(controlValueStr, detectionValueStr);
+
+        if (isStandardValueSatisfied && isControlValueSatisfied) {
+            return 1;
+        } else {
+            return 0;
+        }
+    }
+
+    private boolean isValueSatisfied(String valueStr, String detectionValueStr) {
+        String substring = valueStr.substring(1, 2);
+        if (substring.equals("=")) {
+            String operator = valueStr.substring(0, 2);
+            Double standardValue = Double.parseDouble(valueStr.substring(2));
+            Double detectionValue = Double.parseDouble(detectionValueStr);
+            switch (operator) {
+                case ">=":
+                    return detectionValue >= standardValue;
+                case "<=":
+                    return detectionValue <= standardValue;
+                default:
+                    return false;
+            }
+        } else {
+            String operator = valueStr.substring(0, 1);
+            Double standardValue = Double.parseDouble(valueStr.substring(1));
+            Double detectionValue = Double.parseDouble(detectionValueStr);
+            switch (operator) {
+                case ">":
+                    return detectionValue > standardValue;
+                case "鈮�":
+                    return detectionValue >= standardValue;
+                case "鈮�":
+                    return detectionValue <= standardValue;
+                case "<":
+                    return detectionValue < standardValue;
+                case "=":
+                    return detectionValue.equals(standardValue);
+                default:
+                    return false;
+            }
+        }
+    }
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java
new file mode 100644
index 0000000..444d70c
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java
@@ -0,0 +1,199 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import cn.hutool.core.lang.Snowflake;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.mapper.*;
+import com.yuanchu.limslaboratory.pojo.*;
+import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
+import com.yuanchu.limslaboratory.pojo.vo.InspectDetailVo;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import com.yuanchu.limslaboratory.service.*;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢宠琛�(Inspection)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author zss
+ * @since 2023-08-03 13:03:36
+ */
+@Service
+public class InspectionServiceImpl extends ServiceImpl<InspectionMapper, Inspection> implements InspectionService {
+
+    @Resource
+    InspectionMapper inspectionMapper;
+
+    @Resource
+    InspectionMaterialMapper inspectionMaterialMapper;
+
+    @Resource
+    InspectionProductService inspectionProductService;
+
+    @Resource
+    InspectionProductMapper inspectionProductMapper;
+
+    @Resource
+    MaterialMapper materialMapper;
+
+    @Resource
+    StandardService standardService;
+
+    @Resource
+    SpecificationsService specificationsService;
+
+    @Resource
+    ProductMapper productMapper;
+
+    @Resource
+    InstrumentService instrumentService;
+
+    @Resource
+    UserMapper userMapper;
+
+    /**
+     * 鏌ヨ妫�楠岀敵璇峰崟鍒楄〃
+     *
+     * @param message
+     * @return
+     */
+    @Override
+    public IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message) {
+        return inspectionMapper.selectInspectsList(page, message);
+    }
+
+    /**
+     * 鏂板妫�楠岀敵璇疯〃
+     *
+     * @param id
+     * @param
+     * @return
+     */
+    @Override
+    public Integer addInspect(Integer id, InspectionVo inspectionVo) {
+        /*鏂板妫�楠岀敵璇疯〃*/
+        Inspection inspection = Inspection.builder()
+                .startTime(inspectionVo.getStartTime())
+                .endTime(inspectionVo.getEndTime())
+                .type(inspectionVo.getType())
+                .code(new Snowflake(1, 1).nextIdStr())
+                .userId(id)
+                .build();
+        inspectionMapper.insert(inspection);
+        /*鏂板妫�楠屾牱鍝佽〃*/
+        InspectionMaterial inspectionMaterial = InspectionMaterial.builder()
+                .code(inspectionVo.getMcode())
+                .name(inspectionVo.getName())
+                .num(inspectionVo.getNum())
+                .unit(inspectionVo.getUnit())
+                .supplier(inspectionVo.getSupplier())
+                .specifications(inspectionVo.getSpecifications())
+                .formTime(inspectionVo.getFormTime())
+                .inspectionId(inspection.getId())
+                .build();
+        inspectionMaterialMapper.insert(inspectionMaterial);
+        /*鏂板妫�楠岄」鐩〃*/
+        //鑾峰彇鐗╂枡id
+        Material material = materialMapper.selectOne(Wrappers.<Material>query()
+                .eq("name", inspectionVo.getName())
+                .eq("code", inspectionVo.getMcode()));
+        //鑾峰彇瑙勬牸鍚嶇О鍜屽瀷鍙峰悕绉�
+        String specification = inspectionVo.getSpecifications();
+        String[] split = specification.split("-");
+        String stName = split[0];
+        String spName = split[1];
+        //鑾峰彇瑙勬牸id
+        Standard standard = standardService.getOne(Wrappers.<Standard>query()
+                .eq("name", stName)
+                .eq("material_id", material.getId()));
+        //鑾峰彇鍨嬪彿id
+        Specifications specifications = specificationsService.getOne(Wrappers.<Specifications>query()
+                .eq("name", spName)
+                .eq("standard_id", standard.getId()));
+        //鏍规嵁鍨嬪彿id鏌ヨ椤圭洰淇℃伅
+        List<Product> productList = productMapper.selectList(Wrappers.<Product>query().eq("specifications_id", specifications.getId()));
+        ArrayList<InspectionProduct> list = new ArrayList<>();
+        for (Product product : productList) {
+            InspectionProduct rawInsProduct = InspectionProduct.builder()
+                    .name(product.getName())
+                    .unit(product.getUnit())
+                    .required(product.getRequired())
+                    .internal(product.getInternal())
+                    .inspectionMaterialId(material.getId())
+                    .build();
+            list.add(rawInsProduct);
+        }
+        //妫�楠岄」鐩壒閲忔坊鍔�
+        inspectionProductService.saveBatch(list);
+        return inspection.getId();
+    }
+
+    //鏍规嵁妫�楠屽崟id鏌ヨ鍘熸潗鏂欐楠屽崟璇︽儏
+    @Override
+    public InspectDetailVo selectInspectsListById(Integer id) {
+        /*灏嗘楠屽崟鍩烘湰淇℃伅鏌ヨ鍑烘潵骞跺皝瑁呭埌RawInspectVo瀵硅薄涓�*/
+        Inspection inspection = inspectionMapper.selectById(id);
+        InspectDetailVo inspectDetailVo = new InspectDetailVo();
+        //鎶ユ浜�
+        User user = userMapper.selectById(inspection.getUserId());
+        inspectDetailVo.setUserName(user.getName());
+        //鎶ユ寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+        inspectDetailVo.setStartTime(inspection.getStartTime());
+        inspectDetailVo.setEndTime(inspection.getEndTime());
+        //妫�楠岀粨璁�
+        inspectDetailVo.setInspectionStatus(inspection.getInspectionStatus());
+        //鏌ヨ妫�楠岀墿鏂�
+        InspectionMaterial inspectionMaterial = inspectionMaterialMapper.selectOne(Wrappers.<InspectionMaterial>query().eq("inspection_id", id));
+        //鏉ユ枡鏃ユ湡,渚涘簲鍟嗗悕绉�,鍘熸潗鏂欑紪鐮�,鍘熸潗鏂欏悕绉�,瑙勬牸鍨嬪彿,鍗曚綅,鏁伴噺
+        BeanUtils.copyProperties(inspectionMaterial, inspectDetailVo);
+        /*鏌ヨ妫�楠屽崟閲岄潰鐨勬楠岄」鐩�,骞跺皝瑁呭埌RawInspectVo瀵硅薄涓�*/
+        LambdaQueryWrapper<InspectionProduct> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(InspectionProduct::getInspectionMaterialId, inspectionMaterial.getId());
+        List<InspectionProduct> inspectionProducts = inspectionProductMapper.selectList(queryWrapper);
+        //杩欓噷鏌ュ埌鐨勮澶噄d鍜屾楠屽憳id瑕佹煡璇㈠悕绉�
+        List<InsProductVo> insProductVos = inspectionProducts.stream().map(insProduct -> {
+            //灏嗕竴涓璞$殑鍊艰祴鍊肩粰鍙︿竴涓璞�
+            InsProductVo insProductVo = new InsProductVo();
+            BeanUtils.copyProperties(insProduct, insProductVo);
+            //鑾峰彇璁惧鍚�(鍓嶆彁鏄鏋滃瓨鍦�)
+            if (insProduct.getInstrumentId() != null) {
+                String equipmentName = instrumentService.getById(insProduct.getInstrumentId()).getEquipmentName();
+                insProductVo.setInstrumentName(equipmentName);
+            }
+            //鑾峰彇鐢ㄦ埛鍚�(鍓嶆彁鏄鏋滃瓨鍦�)
+            if (insProduct.getUserId() != null) {
+                String userName = userMapper.selectById(insProduct.getUserId()).getName();
+                insProductVo.setUserName(userName);
+            }
+            //椤圭洰鍏宠仈鐗╂枡id
+            insProductVo.setInspectionMaterialId(inspectionMaterial.getId());
+            return insProductVo;
+        }).collect(Collectors.toList());
+        inspectDetailVo.setInsProducts(insProductVos);
+        return inspectDetailVo;
+    }
+
+    //鏇存柊妫�楠屽崟妫�楠岀粨鏋�
+    @Override
+    public boolean updateInspectsById(Integer id) {
+        //鏇存柊妫�楠屽崟閲岄潰鐨勬楠岀姸鎬佸拰妫�楠岀粨璁�
+        InspectDetailVo inspectDetailVo = selectInspectsListById(id);
+        Inspection inspection = Inspection.builder()
+                .id(id)
+                .inspectionStatus(inspectDetailVo.getInspectionStatus())
+                .build();
+        inspectionMapper.updateById(inspection);
+        //鐢熸垚鎶ュ憡鍗�
+
+        return true;
+    }
+}
+
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java
new file mode 100644
index 0000000..59be02e
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java
@@ -0,0 +1,66 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
+import com.yuanchu.limslaboratory.mapper.LinkBasicInformationMapper;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.service.LinkDetectionService;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Service
+public class LinkBasicInformationServiceImpl extends ServiceImpl<LinkBasicInformationMapper, LinkBasicInformation> implements LinkBasicInformationService {
+
+    @Resource
+    private LinkBasicInformationMapper linkBasicInformationMapper;
+
+    @Autowired
+    private LinkDetectionService linkDetectionService;
+
+    @Override
+    public String addLinkBasicInformation(LinkBasicInformation linkBasicInformation) {
+        String code = MyUtil.getTimeSixNumberCode("SL");
+        linkBasicInformation.setEntrustCoding(code);
+        int insert = linkBasicInformationMapper.insert(linkBasicInformation);
+        if (insert == 1) {
+            linkDetectionService.insertListData(linkBasicInformation.getId(), linkBasicInformation.getLinkDetectionList());
+            return code;
+        }
+        return null;
+    }
+
+    @Override
+    public IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus) {
+        return linkBasicInformationMapper.getLinkBasicPage(page, entrustCoding, sampleName, entrusted, inspectionStatus);
+    }
+
+    //鏌ヨ鎵�鏈夊鎵樻楠屽拰鏍峰搧
+    @Override
+    public List<Map<String, Object>> selectLinkAll() {
+        return linkBasicInformationMapper.selectLinkAll();
+    }
+
+    //鏍规嵁濮旀墭妫�楠宨d鍜屾牱鍝乮d鏌ヨ濮旀墭妫�楠屽拰鏍峰搧
+    @Override
+    public InspectionVo selectLinkByid(Integer bid, Integer did) {
+        InspectionVo inspectionVo = linkBasicInformationMapper.selectLinkByid(bid, did);
+        inspectionVo.setType(1);
+        return inspectionVo;
+    }
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java
new file mode 100644
index 0000000..87a1700
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.yuanchu.limslaboratory.pojo.LinkDetection;
+import com.yuanchu.limslaboratory.mapper.LinkDetectionMapper;
+import com.yuanchu.limslaboratory.service.LinkDetectionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-08-03
+ */
+@Service
+public class LinkDetectionServiceImpl extends ServiceImpl<LinkDetectionMapper, LinkDetection> implements LinkDetectionService {
+
+    @Resource
+    private LinkDetectionMapper linkDetectionMapper;
+
+    // 鎵归噺娣诲姞
+    @Override
+    public void insertListData(Integer id, List<LinkDetection> linkDetectionList) {
+        for (LinkDetection linkDetection:linkDetectionList){
+            linkDetection.setLinkBasicId(id);
+        }
+        linkDetectionMapper.insertBatchSomeColumn(linkDetectionList);
+    }
+}
diff --git a/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java
new file mode 100644
index 0000000..2722a1a
--- /dev/null
+++ b/inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java
@@ -0,0 +1,78 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.pojo.RawMaterial;
+import com.yuanchu.limslaboratory.mapper.RawMaterialMapper;
+import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
+import com.yuanchu.limslaboratory.service.RawMaterialService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-28
+ */
+@Service
+public class RawMaterialServiceImpl extends ServiceImpl<RawMaterialMapper, RawMaterial> implements RawMaterialService {
+
+    @Resource
+    private RawMaterialMapper rawMaterialMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param materialCoding
+     * @param materialName
+     * @param condition
+     * @param createTime
+     * @param page
+     * @return
+     */
+    @Override
+    public IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page) {
+        return rawMaterialMapper.selectRawMaterial(materialCoding, materialName, condition, createTime, page);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊師鏉愭枡鎶ユ鍗�
+     *
+     * @return
+     */
+    @Override
+    public List<RawMaterial> selectRawmaAll() {
+        return rawMaterialMapper.selectRawmaAll();
+    }
+
+    /**
+     * 閫夋嫨鍘熸潗鏂欐姤妫�
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public InspectionVo selectRawmaById(Integer id, String startTime, String endTime) throws ParseException {
+        InspectionVo inspectionVo = rawMaterialMapper.selectRawmaById(id);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        inspectionVo.setStartTime(formatter.parse(startTime));
+        inspectionVo.setEndTime(formatter.parse(endTime));
+        inspectionVo.setType(0);
+        return inspectionVo;
+    }
+}
diff --git a/inspection-server/src/main/resources/mapper/InspectionMapper.xml b/inspection-server/src/main/resources/mapper/InspectionMapper.xml
new file mode 100644
index 0000000..6d7526d
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/InspectionMapper.xml
@@ -0,0 +1,29 @@
+<?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="com.yuanchu.limslaboratory.mapper.InspectionMapper">
+    <select id="selectInspectsList" resultType="map">
+        select i.id,
+        i.code icode,
+        type,
+        DATE_FORMAT(`form_time`,'%Y-%m-%d'),
+        supplier,
+        im.code mcode,
+        im.name,
+        specifications,
+        unit,
+        num,
+        DATE_FORMAT(i.`create_time`,'%Y-%m-%d'),
+        u.name userName,
+        inspection_status,
+        DATE_FORMAT(i.`start_time`,'%Y-%m-%d'),
+        DATE_FORMAT(i.`end_time`,'%Y-%m-%d')
+        from lims_laboratory.inspection i
+        join lims_laboratory.user u on i.user_id = u.id
+        join lims_laboratory.inspection_material im on i.id = im.inspection_id
+        where   i.state=1
+        <if test="message!=null">
+            and i.code like concat('%', #{message}, '%')
+            or im.name like concat('%', #{message}, '%')
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml b/inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml
new file mode 100644
index 0000000..d9f6112
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml
@@ -0,0 +1,4 @@
+<?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="com.yuanchu.limslaboratory.mapper.InspectionMaterialMapper">
+</mapper>
\ No newline at end of file
diff --git a/inspection-server/src/main/resources/mapper/InspectionProductMapper.xml b/inspection-server/src/main/resources/mapper/InspectionProductMapper.xml
new file mode 100644
index 0000000..93e3111
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/InspectionProductMapper.xml
@@ -0,0 +1,4 @@
+<?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="com.yuanchu.limslaboratory.mapper.InspectionProductMapper">
+</mapper>
\ No newline at end of file
diff --git a/inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml b/inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml
new file mode 100644
index 0000000..d659b1d
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml
@@ -0,0 +1,53 @@
+<?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="com.yuanchu.limslaboratory.mapper.LinkBasicInformationMapper">
+
+    <select id="getLinkBasicPage" resultType="map">
+        SELECT l.`id`, l.`entrust_coding`, l.`entrusted`, d.`samples_number`, d.`sample_name`, d.`specifications_models`,
+            DATE_FORMAT(l.`inspection_time`,'%Y-%m-%d') inspectionTime, DATE_FORMAT(l.`completion_deadline`,'%Y-%m-%d') inspectionTime, l.`contacts`, d.`date_survey`, d.`inspection_status`
+        FROM link_basic_information l, link_detection d
+        WHERE l.`id` = d.`link_basic_id`
+        AND l.`state` = 1
+        <if test="entrustCoding != null and entrustCoding != null">
+            AND l.`entrust_coding` like concat('%', #{entrustCoding}, '%')
+        </if>
+        <if test="sampleName != null and sampleName != null">
+            AND d.`sample_name` like concat('%', #{sampleName}, '%')
+        </if>
+        <if test="entrusted != null and entrusted != null">
+            AND l.`contacts` like concat('%', #{entrusted}, '%')
+        </if>
+        <if test="inspectionStatus != null and inspectionStatus != null">
+            AND d.`inspection_status` = #{inspectionStatus}
+        </if>
+    </select>
+
+    <select id="selectLinkAll" resultType="java.util.Map">
+        SELECT l.`id`, l.`entrust_coding`, l.`entrusted`, d.`samples_number`, d.`sample_name`, d.`specifications_models`,
+        DATE_FORMAT(l.`inspection_time`,'%Y-%m-%d') inspectionTime, l.`completion_deadline`, l.`contacts`, d.`date_survey`, d.`inspection_status`
+        FROM lims_laboratory.link_basic_information l, lims_laboratory.link_detection d
+        WHERE l.`id` = d.`link_basic_id`
+        AND l.`state` = 1
+    </select>
+
+    <select id="selectLinkByid" resultType="com.yuanchu.limslaboratory.pojo.vo.InspectionVo">
+        SELECT l.`inspection_time` formTime,
+        l.`entrusted` supplier,
+        d.`sample_number` mcode,
+        d.`sample_name` name,
+        d.`specifications_models` specifications,
+        d.`unit`,
+        d.`samples_number` num,
+        d.date_survey startTime,
+        l.completion_deadline endTime
+        FROM lims_laboratory.link_basic_information l, lims_laboratory.link_detection d
+        WHERE l.`id` = d.`link_basic_id`
+          AND l.`state` = 1
+        <if test="bid!=null">
+            and l.id=#{bid}
+        </if>
+        <if test="did!=null">
+            and d.id=#{did}
+        </if>
+    </select>
+</mapper>
diff --git a/inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml b/inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml
new file mode 100644
index 0000000..192de47
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.yuanchu.limslaboratory.mapper.LinkDetectionMapper">
+
+</mapper>
diff --git a/inspection-server/src/main/resources/mapper/RawMaterialMapper.xml b/inspection-server/src/main/resources/mapper/RawMaterialMapper.xml
new file mode 100644
index 0000000..5cffc9a
--- /dev/null
+++ b/inspection-server/src/main/resources/mapper/RawMaterialMapper.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="com.yuanchu.limslaboratory.mapper.RawMaterialMapper">
+
+    <select id="selectRawMaterial" resultType="com.yuanchu.limslaboratory.pojo.RawMaterial">
+        SELECT *
+        FROM raw_material r
+        where r.state = 1
+        <if test="materialCoding != null and materialCoding != ''">
+            AND r.`material_coding` LIKE CONCAT('%',#{materialCoding},'%')
+        </if>
+        <if test="materialName != null and materialName != ''">
+            AND r.`material_name` LIKE CONCAT('%',#{materialName},'%')
+        </if>
+        <if test="condition != null and condition != ''">
+            AND r.`condition` = #{condition}
+        </if>
+        <if test="createTime != null and createTime != ''">
+            AND DATE_FORMAT(r.`create_time`,'%Y-%m-%d') = #{createTime}
+        </if>
+    </select>
+    <select id="selectRawmaAll" resultType="com.yuanchu.limslaboratory.pojo.RawMaterial">
+        select * from lims_laboratory.raw_material where state=1
+    </select>
+
+    <select id="selectRawmaById" resultType="com.yuanchu.limslaboratory.pojo.vo.InspectionVo">
+        select create_time formTime,
+               supplier_name supplier,
+               material_coding mcode,
+               material_name name,
+               specifications_models specifications,
+               unit ,
+               quantity num
+        from lims_laboratory.raw_material
+        where id=#{id}
+    </select>
+</mapper>
diff --git a/laboratory-server/pom.xml b/laboratory-server/pom.xml
new file mode 100644
index 0000000..865f62c
--- /dev/null
+++ b/laboratory-server/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>laboratory-server</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>laboratory-server</name>
+    <description>laboratory-server</description>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>framework</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>user-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java
new file mode 100644
index 0000000..614814b
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java
@@ -0,0 +1,78 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.yuanchu.limslaboratory.pojo.Classify;
+import com.yuanchu.limslaboratory.pojo.dto.UpdateClassifyDto;
+import com.yuanchu.limslaboratory.service.ClassifyService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Api(tags = "瀹為獙瀹�-->1銆佽澶囧彴璐�-->1銆佸垎绫绘ā鍧�")
+@RestController
+@RequestMapping("/classify")
+public class ClassifyController {
+
+    @Autowired
+    private ClassifyService classifyService;
+
+    @ApiOperation("娣诲姞鍒嗙被")
+    @PostMapping("/add")
+    public Result<?> addClassifyInformation(@RequestBody Classify classify) {
+        Integer isAddClassifySuccess = classifyService.addClassifyInformation(classify);
+        if (isAddClassifySuccess == 1) {
+            return Result.success("娣诲姞鍒嗙被銆�"+ classify.getSonName() +"銆戞垚鍔燂紒");
+        } else if (isAddClassifySuccess == 2) {
+            return Result.fail("鎶辨瓑閲嶅娣诲姞鍒嗙被鍚嶇О銆�"+ classify.getSonName() +"銆戯紝娣诲姞澶辫触锛�");
+        }
+        return Result.fail("娣诲姞鍒嗙被銆�"+ classify.getSonName() +"銆戝け璐ワ紒");
+    }
+
+    @ApiOperation("鍒嗙被渚ц竟鏍忓垪琛細濡傛灉sonName涓虹┖锛屽垯甯︾潃father_name鐨処d杩涜鐐瑰嚮鎿嶄綔")
+    @GetMapping("/list")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(value = "鍒嗙被鍚嶇О", name = "classifyName", dataTypeClass = String.class)
+    })
+    public Result<?> getListClassifyInformation(String classifyName) {
+        return Result.success(classifyService.getListClassifyInformation(classifyName));
+    }
+
+    @ApiOperation("鍒犻櫎鍒嗙被")
+    @DeleteMapping("/delete")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(value = "鍒嗙被Id", name = "classifyId", dataTypeClass = String.class)
+    })
+    public Result<?> deleteClassifyInformation(String classifyId) {
+        Boolean isDeleteSuccess = classifyService.deleteClassifyInformation(classifyId);
+        if (isDeleteSuccess){
+            return Result.success("鍒犻櫎鍒嗙被鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎鍒嗙被澶辫触锛�");
+    }
+
+    @ApiOperation("鏇存柊鍒嗙被")
+    @PutMapping("/update")
+    public Result<?> updateClassifyInformation(@RequestBody UpdateClassifyDto updateClassifyDto) throws Exception {
+        Classify classify = JackSonUtil.unmarshal(JackSonUtil.marshal(updateClassifyDto), Classify.class);
+        Boolean isUpdateClassifySuccess = classifyService.updateClassifyInformation(classify);
+        if (isUpdateClassifySuccess){
+            return Result.success("鏇存柊鍒嗙被鎴愬姛锛�");
+        }
+        return Result.fail("鏇存柊鍒嗙被澶辫触锛�");
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java
new file mode 100644
index 0000000..7849ec4
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java
@@ -0,0 +1,91 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
+import com.yuanchu.limslaboratory.pojo.dto.UpdateEquipmentPointDto;
+import com.yuanchu.limslaboratory.service.EquipmentPointService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Api(tags = "瀹為獙瀹�-->1銆佽澶囧彴璐�-->3銆佽澶囩爜鐐�")
+@RestController
+@RequestMapping("/equipment-point")
+public class EquipmentPointController {
+
+    @Autowired
+    private EquipmentPointService equipmentPointService;
+
+    @ApiOperation("娣诲姞璁惧鐮佺偣")
+    @PostMapping("/add")
+    public Result<?> addEquipmentPointInformation(@RequestHeader("X-Token") String token, @RequestBody EquipmentPoint equipmentPoint) throws Exception {
+        Object object = RedisUtil.get(token);
+        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
+        equipmentPoint.setUserId((Integer) unmarshal.get("id"));
+        Integer isInsertSuccess = equipmentPointService.addEquipmentPointInformation(equipmentPoint);
+        if (isInsertSuccess == 1){
+            return Result.success("娣诲姞銆�"+ equipmentPoint.getEquipmentPointName() +"銆戞垚鍔燂紒");
+        }
+        return Result.fail("娣诲姞銆�"+ equipmentPoint.getEquipmentPointName() +"銆戝け璐ワ紒璁惧鐮佺偣缂栫爜閲嶅锛�");
+    }
+
+    @ApiOperation("鏍规嵁浠櫒Id鏌ヨ瀵瑰簲璁惧鐮佺偣鏁版嵁")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "InstrumentId", value = "浠櫒妯″潡Id", dataTypeClass = String.class, required = true)
+    })
+    @GetMapping("/list")
+    public Result<?> getListEquipmentPointInformation(String InstrumentId) {
+        List<Map<String, Object>> list = equipmentPointService.getListEquipmentPointInformation(InstrumentId);
+        return Result.success(list);
+    }
+
+    @ApiOperation("鏍规嵁鐮佺偣Id鍒犻櫎鏁版嵁")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "equipmentPointId", value = "璁惧鐮佺偣Id", dataTypeClass = Integer.class, required = true)
+    })
+    @DeleteMapping("/delete")
+    public Result<?> deleteEquipmentPointInformation(Integer equipmentPointId) {
+        Integer isDeleteSuccess = equipmentPointService.deleteEquipmentPointInformation(equipmentPointId);
+        if (isDeleteSuccess == 1){
+            return Result.success("鍒犻櫎鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎澶辫触锛�");
+    }
+
+    @ApiOperation("鏍规嵁鐮佺偣Id鏇存柊鏁版嵁")
+    @PutMapping("/update")
+    public Result<?> updateEquipmentPointInformation(@RequestHeader("X-Token") String token, @RequestBody UpdateEquipmentPointDto updateEquipmentPointDto) throws Exception {
+        Object object = RedisUtil.get(token);
+        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
+        EquipmentPoint equipmentPoint = JackSonUtil.unmarshal(JackSonUtil.marshal(updateEquipmentPointDto), EquipmentPoint.class);
+        equipmentPoint.setUserId((Integer) unmarshal.get("id"));
+        Integer isUpdateSuccess = equipmentPointService.updateEquipmentPointInformation(equipmentPoint);
+        if (isUpdateSuccess == 1){
+            return Result.success("鏇存柊鎴愬姛锛�");
+        }
+        return Result.fail("鏇存柊澶辫触锛�");
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java
new file mode 100644
index 0000000..ad3e993
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java
@@ -0,0 +1,119 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.pojo.dto.UpdateInstrumentDto;
+import com.yuanchu.limslaboratory.service.InstrumentService;
+import com.yuanchu.limslaboratory.service.UserService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Api(tags = "瀹為獙瀹�-->1銆佽澶囧彴璐�-->2銆佷华鍣ㄦā鍧�")
+@RestController
+@RequestMapping("/instrument")
+public class InstrumentController {
+
+    @Autowired
+    private InstrumentService instrumentService;
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("娣诲姞浠櫒璁惧")
+    @PostMapping("/add")
+    public Result<?> addInstrumentInformation(@RequestHeader("X-Token") String token, @RequestBody Instrument instrument) throws Exception {
+        Object object = RedisUtil.get(token);
+        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
+        instrument.setCreateUserId((Integer) unmarshal.get("id"));
+        Integer isInsertSuccess = instrumentService.addInstrumentInformation(instrument);
+        if (isInsertSuccess == 1){
+            return Result.success("娣诲姞銆�" + instrument.getEquipmentName() + "銆戞垚鍔�!");
+        }
+        return Result.fail("浠櫒璁惧缂栧彿閲嶅锛屾坊鍔犮��" + instrument.getEquipmentName() + "銆戝け璐�! ");
+    }
+
+    @ApiOperation("鏍规嵁鍒嗙被Id锛氬垎椤靛垪琛ㄥ睍绀�")
+    @GetMapping("/list")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "classifyId", value = "鍒嗙被Id", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "conditions", value = "鏌ヨ鐘舵��:榛樿鍏ㄩ儴", dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "whetherWhether", value = "鏄惁宸茶繃鏈�", dataTypeClass = Boolean.class),
+            @ApiImplicitParam(name = "numberOrNameOrSpecifications", value = "缂栧彿/璁惧鍚嶇О/瑙勬牸鍨嬪彿", dataTypeClass = String.class)
+    })
+    public Result<?> getListInstrumentInformation(Integer pageNo,
+                                                  Integer pageSize,
+                                                  Integer conditions,
+                                                  Integer classifyId,
+                                                  Boolean whetherWhether,
+                                                  String numberOrNameOrSpecifications) {
+        IPage<Map<String, Object>> pageList = instrumentService.getListInstrumentInformation(conditions, whetherWhether, numberOrNameOrSpecifications,
+                classifyId, new Page<Objects>(pageNo, pageSize));
+        Map<String, Object> map = new HashMap<>();
+        map.put("row", pageList.getRecords());
+        map.put("total", pageList.getTotal());
+        return Result.success(map);
+    }
+
+    @ApiOperation("鍒犻櫎浠櫒鏁版嵁")
+    @DeleteMapping("/delete")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "instrumentId", value = "浠櫒Id", dataTypeClass = String.class, required = true)
+    })
+    public Result<?> deleteInstrumentInformation(String instrumentId) {
+        Boolean isDeleteSuccess = instrumentService.deleteInstrumentInformation(instrumentId);
+        if (isDeleteSuccess){
+            return Result.success("鍒犻櫎浠櫒鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎浠櫒澶辫触锛�");
+    }
+
+    @ApiOperation("娣诲姞浠櫒鏃朵繚绠′汉涓嬫媺妗嗘暟鎹�")
+    @GetMapping("/get_user")
+    public Result<?> getMapUserInformation() {
+        return Result.success(userService.getUserNameAndId());
+    }
+
+    @ApiOperation("鏍规嵁浠櫒Id鑾峰彇淇℃伅鐢ㄤ簬缂栬緫")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "InstrumentId", value = "鍒嗙被Id", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/get_instrument")
+    public Result<?> getIdInstrumentInformation(Integer InstrumentId) {
+        Instrument idInstrumentInformation = instrumentService.getIdInstrumentInformation(InstrumentId);
+        return Result.success(idInstrumentInformation);
+    }
+
+    @ApiOperation("鏍规嵁浠櫒Id鏇存柊鏁版嵁")
+    @PutMapping("/update")
+    public Result<?> updateEquipmentPointInformation(@RequestBody UpdateInstrumentDto updateInstrumentDto) throws Exception {
+        Instrument instrument = JackSonUtil.unmarshal(JackSonUtil.marshal(updateInstrumentDto), Instrument.class);
+        Integer isUpdateSuccess = instrumentService.updateEquipmentPointInformation(instrument);
+        if (isUpdateSuccess == 1){
+            return Result.success("鏇存柊銆�" + instrument.getEquipmentName() + "銆戞垚鍔�!");
+        }
+        return Result.fail("浠櫒璁惧缂栧彿閲嶅锛屾洿鏂般��" + instrument.getEquipmentName() + "銆戝け璐�! ");
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java
new file mode 100644
index 0000000..bc6ea21
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java
@@ -0,0 +1,70 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.pojo.MeteringPlan;
+import com.yuanchu.limslaboratory.service.MeteringPlanService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-27
+ */
+@Api(tags = "瀹為獙瀹�-->2銆佽閲忕鐞�")
+@RestController
+@RequestMapping("/metering-plan")
+public class MeteringPlanController {
+
+    @Autowired
+    private MeteringPlanService meteringPlanService;
+
+    @ApiOperation("娣诲姞璁¢噺璁″垝")
+    @PostMapping("/add")
+    public Result<?> addMeteringPlanInformation(@RequestBody MeteringPlan meteringPlan) {
+        Integer isInsertSuccess = meteringPlanService.addMeteringPlanInformation(meteringPlan);
+        if (isInsertSuccess == 1){
+            return Result.success("娣诲姞璁¢噺璁″垝鎴愬姛!");
+        }
+        return Result.fail("娣诲姞璁¢噺璁″垝澶辫触! ");
+    }
+
+    @ApiOperation("璁¢噺璁″垝鍒嗛〉鏌ヨ")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "measureCodeOrNameOrUnit", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/plan_page_list")
+    public Result<?> pagingQueryOfMeteringPlan(Integer pageNo, Integer pageSize, String measureCodeOrNameOrUnit) {
+        IPage<Map<String, Object>> page = meteringPlanService.pagingQueryOfMeteringPlan(measureCodeOrNameOrUnit, new Page<Objects>(pageNo, pageSize));
+        return Result.success(page);
+    }
+
+    @ApiOperation("璁¢噺鍙拌处鍒嗛〉鏌ヨ")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true)
+    })
+    @GetMapping("/standing_page_list")
+    public Result<?> pagingQueryOfMeasurementLedger(Integer pageNo, Integer pageSize) {
+        IPage<Map<String, Object>> page = meteringPlanService.pagingQueryOfMeasurementLedger(new Page<Objects>(pageNo, pageSize));
+        return Result.success(page);
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java
new file mode 100644
index 0000000..a409b73
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java
@@ -0,0 +1,90 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.yuanchu.limslaboratory.pojo.MetricalInformation;
+import com.yuanchu.limslaboratory.pojo.dto.UpdateMetricalInformationDto;
+import com.yuanchu.limslaboratory.service.MetricalInformationService;
+import com.yuanchu.limslaboratory.service.UserService;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Api(tags = "瀹為獙瀹�-->1銆佽澶囧彴璐�-->4銆佽閲忎俊鎭�")
+@RestController
+@RequestMapping("/metrical-information")
+public class MetricalInformationController {
+
+    @Autowired
+    private MetricalInformationService metricalInformationService;
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("娣诲姞璁¢噺淇℃伅")
+    @PostMapping("/add")
+    public Result<?> addMetricalInformation(MetricalInformation metricalInformation,
+                                            @RequestPart(value = "file", required = false) MultipartFile file) {
+        Integer isInsertSuccess = metricalInformationService.addEquipmentPointInformation(metricalInformation, file);
+        if (isInsertSuccess == 1){
+            return Result.success("娣诲姞銆�"+ metricalInformation.getMeasurementUnit() +"銆戞垚鍔燂紒");
+        }
+        return Result.fail("娣诲姞銆�"+ metricalInformation.getMeasurementUnit() +"銆戝け璐ワ紒璁惧鐮佺偣缂栫爜閲嶅锛�");
+    }
+
+    @ApiOperation("鏌ヨ鎵�鏈夎閲忎俊鎭暟鎹�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "InstrumentId", value = "浠櫒妯″潡Id", dataTypeClass = String.class, required = true)
+    })
+    @GetMapping("/list")
+    public Result<?> getListMetricalInformation(String InstrumentId) {
+        List<Map<String, Object>> list = metricalInformationService.getListEquipmentPointInformation(InstrumentId);
+        return Result.success(list);
+    }
+
+    @ApiOperation("鏍规嵁璁¢噺淇℃伅Id鍒犻櫎鏁版嵁")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "metricalInformationId", value = "璁¢噺淇℃伅Id", dataTypeClass = Integer.class, required = true)
+    })
+    @DeleteMapping("/delete")
+    public Result<?> deleteMetricalInformation(Integer metricalInformationId) {
+        Integer isDeleteSuccess = metricalInformationService.deleteMetricalInformation(metricalInformationId);
+        if (isDeleteSuccess == 1){
+            return Result.success("鍒犻櫎鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎澶辫触锛�");
+    }
+
+    @ApiOperation("鏍规嵁璁¢噺淇℃伅Id鏇存柊鏁版嵁")
+    @PutMapping("/update")
+    public Result<?> updateMetricalInformation(UpdateMetricalInformationDto updateMetricalInformationDto,
+                                                     @RequestPart(value = "file", required = false) MultipartFile file) throws Exception {
+        MetricalInformation metricalInformation = JackSonUtil.unmarshal(JackSonUtil.marshal(updateMetricalInformationDto), MetricalInformation.class);
+        Integer isUpdateSuccess = metricalInformationService.updateMetricalInformation(metricalInformation, file);
+        if (isUpdateSuccess == 1){
+            return Result.success("鏇存柊鎴愬姛锛�");
+        }
+        return Result.fail("鏇存柊澶辫触锛�");
+    }
+
+    @ApiOperation("娣诲姞璁¢噺淇℃伅鏃惰礋璐d汉涓嬫媺妗嗘暟鎹�")
+    @GetMapping("/get_user")
+    public Result<?> getMapUserInformation() {
+        return Result.success(userService.getUserNameAndId());
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java
new file mode 100644
index 0000000..4d2856c
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.pojo.Classify;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface ClassifyMapper extends BaseMapper<Classify> {
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java
new file mode 100644
index 0000000..5918e89
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java
@@ -0,0 +1,23 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface EquipmentPointMapper extends BaseMapper<EquipmentPoint> {
+
+    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java
new file mode 100644
index 0000000..944bd9d
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java
@@ -0,0 +1,28 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface InstrumentMapper extends BaseMapper<Instrument> {
+
+    IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions,Boolean whetherWhether, String numberOrNameOrSpecifications, Integer classifyId, Page<Objects> page);
+
+    //鏌ヨ鎵�鏈夎澶囦俊鎭�
+    List<Map> selectInstrument();
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java
new file mode 100644
index 0000000..3153a71
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java
@@ -0,0 +1,22 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.MeteringPlan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-27
+ */
+public interface MeteringPlanMapper extends BaseMapper<MeteringPlan> {
+
+    IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java
new file mode 100644
index 0000000..ef27ce7
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.pojo.MetricalInformation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface MetricalInformationMapper extends BaseMapper<MetricalInformation> {
+
+    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java
new file mode 100644
index 0000000..019c5e4
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java
@@ -0,0 +1,60 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Classify瀵硅薄", description="")
+public class Classify implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鍒嗙被涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒嗙被鐖跺悕绉�", example = "娓╁害娴嬮噺浠〃")
+    private String fatherName;
+
+    @NotBlank(message = "鍚嶇О涓嶅厑璁镐负绌猴紒")
+    @ApiModelProperty(value = "鍒嗙被瀛愬悕绉�", example = "浣撴俯璁�",required = true)
+    private String sonName;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java
new file mode 100644
index 0000000..0d9a4f5
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java
@@ -0,0 +1,66 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="EquipmentPoint瀵硅薄", description="")
+public class EquipmentPoint implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "浠櫒Id 鍏宠仈", example = "1", required = true)
+    private Integer instrumentId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛Id 鍏宠仈", hidden = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "鐮佺偣缂栧彿", example = "Area-1", required = true)
+    private String equipmentPoint;
+
+    @ApiModelProperty(value = "鐮佺偣鍚嶇О", example = "瀵间綋灞忚斀锛堝鍘氶潰绉級", required = true)
+    private String equipmentPointName;
+
+    @ApiModelProperty(value = "鍗曚綅", example = "mm", required = true)
+    private String unit;
+
+    @ApiModelProperty(value = "鎻忚堪", example = "鐤簡锛屽仛涓嶄簡")
+    private String descriptiveness;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java
new file mode 100644
index 0000000..4c7b28b
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java
@@ -0,0 +1,110 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Instrument瀵硅薄", description="")
+public class Instrument implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒嗙被ID 鍏宠仈", example = "1", required = true)
+    private Integer classifyId;
+
+    @ApiModelProperty(value = "淇濈浜猴細鐢ㄦ埛琛ㄥ叧鑱擨d", example = "9", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "淇濈浜猴細鐢ㄦ埛琛ㄥ叧鑱擨d", hidden = true)
+    @TableField(value = "")
+    private Integer createUserId;
+
+    @ApiModelProperty(value = "浠櫒璁惧缂栧彿", example = "JSTC-W1-00001", required = true)
+    private String equipmentCode;
+
+    @ApiModelProperty(value = "浠櫒璁惧鍚嶇О", example = "鏁板瓧鐢垫ˉ", required = true)
+    private String equipmentName;
+
+    @ApiModelProperty(value = "榛樿1锛�1锛氳繍琛屻��2锛氭晠闅溿��3锛氭姤淇��4锛氭淇��5锛氬緟鏈�", example = "1", required = true)
+    private Integer conditions;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿", example = "WCDMS-1", required = true)
+    private String specificationsModels;
+
+    @ApiModelProperty(value = "娴嬮噺鑼冨洿", example = "12姣背")
+    private String measuringRange;
+
+    @ApiModelProperty(value = "璇樊", example = "0.000001寰背")
+    private String errorRate;
+
+    @ApiModelProperty(value = "鐢熶骇鍘傚", example = "姹熻嫃榈烽洀")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "鍒拌揣鏃ユ湡", example = "2001-07-06", dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date arrivalDate;
+
+    @ApiModelProperty(value = "楠屾敹鏃ユ湡", example = "2060-07-06", dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date acceptanceDate;
+
+    @ApiModelProperty(value = "瀛樻斁鍦�", example = "鍦扮悆浜氭床涓浗姹熻嫃鍗楅��")
+    private String storagePlace;
+
+    @ApiModelProperty(value = "鏄惁鏀寔鏁伴噰锛�1锛氭敮鎸侊紱0锛氫笉鏀寔", example = "1")
+    private Integer whetherDataAcquisition;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕佷华鍣ㄨ澶囪閲忥細濡傛灉闇�瑕佽閲忓懆鏈熷繀濉紱濡傛灉涓嶉渶瑕佽閲忓懆鏈熶笉蹇呭~.1锛氶渶瑕侊紱0锛氫笉闇�瑕�", example = "0")
+    private Integer equipmentMeasurement;
+
+    @ApiModelProperty(value = "璁¢噺鎴鏈夋晥鏈燂細涓巈quipmentMeasurement鐩稿叧鑱�", example = "12")
+    private Integer termValidity;
+
+    @ApiModelProperty(value = "鎻忚堪", example = "鐤媯鏄熸湡浜旓紒锛侊紒")
+    private String descriptiveness;
+
+    @JsonIgnore
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date createTime;
+
+    @JsonIgnore
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    private Date updateTime;
+
+    @JsonIgnore
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java
new file mode 100644
index 0000000..9bb3814
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java
@@ -0,0 +1,76 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="MeteringPlan瀵硅薄", description="")
+public class MeteringPlan implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "Id涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "璁¢噺璐熻矗浜� 鍏宠仈鐢ㄦ埛琛�", example = "10", required = true)
+    private Integer measurePerson;
+
+    @ApiModelProperty(value = "鍒涘缓浜� 鍏宠仈鐢ㄦ埛琛�", example = "21", required = true)
+    @TableField("create_Person")
+    private Integer createPerson;
+
+    @ApiModelProperty(value = "璁″垝鍗曞彿", hidden = true)
+    private String plannedOrderNumber;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�", example = "2023-07-06", required = true, dataType = "date")
+    private Date beginTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡", example = "2023-07-06", required = true, dataType = "date")
+    private Date endTime;
+
+    @ApiModelProperty(value = "璁″垝鐘舵�侊細涓夌锛�1锛氬凡瀹屾垚锛�2锛氬緟鎻愪氦锛�3锛氭湭瀹屾垚", example = "1", required = true)
+    private Integer planningStatus;
+
+    @ApiModelProperty(value = "璁¢噺鍗曚綅", example = "GB")
+    private String unit;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java
new file mode 100644
index 0000000..5ee2a7c
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java
@@ -0,0 +1,84 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="MetricalInformation瀵硅薄", description="")
+public class MetricalInformation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鍏宠仈Id", example = "7", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "浠櫒鍏宠仈Id", example = "1", required = true)
+    private Integer instrumentId;
+
+    @ApiModelProperty(value = "璁¢噺鍗曚綅", example = "GB", required = true)
+    private String measurementUnit;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�", example = "2023-07-06", required = true, dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    private Date beginDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡", example = "2026-07-06", required = true, dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    private Date endDate;
+
+    @ApiModelProperty(value = "涓嶇‘瀹氬害", example = "0.3%", required = true)
+    private String uncertainty;
+
+    @ApiModelProperty(value = "缁撴灉: 1锛氬悎鏍硷紱2锛氱煫姝e悗鍙敤锛�3锛氫笉鍚堟牸", example = "1", required = true)
+    private Integer result;
+
+    @ApiModelProperty(value = "鎬ц兘鎸囨爣", example = "10086")
+    private String performanceIndex;
+
+    @ApiModelProperty(value = "澶囨敞", example = "10086.com")
+    private String remarks;
+
+    @ApiModelProperty(value = "鏂囦欢璺緞", hidden = true)
+    private String filePath;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java
new file mode 100644
index 0000000..3a672de
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdateClassifyDto瀵硅薄", description="")
+public class UpdateClassifyDto {
+    @ApiModelProperty(value = "鍒嗙被涓婚敭", example = "1", required = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒嗙被鐖跺悕绉�", example = "娓╁害娴嬮噺浠〃")
+    private String fatherName;
+
+    @ApiModelProperty(value = "鍒嗙被瀛愬悕绉�", example = "浣撴俯璁�",required = true)
+    private String sonName;
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java
new file mode 100644
index 0000000..61069dd
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdateEquipmentPointDto瀵硅薄", description="")
+public class UpdateEquipmentPointDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭", example = "1", required = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "浠櫒Id 鍏宠仈", example = "1", required = true)
+    private Integer instrumentId;
+
+    @ApiModelProperty(value = "鐮佺偣缂栧彿", example = "Area-1", required = true)
+    private String equipmentPoint;
+
+    @ApiModelProperty(value = "鐮佺偣鍚嶇О", example = "瀵间綋灞忚斀锛堝鍘氶潰绉級", required = true)
+    private String equipmentPointName;
+
+    @ApiModelProperty(value = "鍗曚綅", example = "mm", required = true)
+    private String unit;
+
+    @ApiModelProperty(value = "鎻忚堪", example = "鐤簡锛屽仛涓嶄簡")
+    private String descriptiveness;
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java
new file mode 100644
index 0000000..675cb7a
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java
@@ -0,0 +1,70 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdateInstrumentDto瀵硅薄", description="")
+public class UpdateInstrumentDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "璁¢噺淇℃伅涓婚敭",example = "1", required = true)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒嗙被ID 鍏宠仈", example = "1", required = true)
+    private Integer classifyId;
+
+    @ApiModelProperty(value = "淇濈浜猴細鐢ㄦ埛琛ㄥ叧鑱擨d", example = "9", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "浠櫒璁惧缂栧彿", example = "JSTC-W1-00001", required = true)
+    private String equipmentCode;
+
+    @ApiModelProperty(value = "浠櫒璁惧鍚嶇О", example = "鏁板瓧鐢垫ˉ", required = true)
+    private String equipmentName;
+
+    @ApiModelProperty(value = "榛樿1锛�1锛氳繍琛屻��2锛氭晠闅溿��3锛氭姤淇��4锛氭淇��5锛氬緟鏈�", example = "1", required = true)
+    private Integer conditions;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿", example = "WCDMS-1", required = true)
+    private String specificationsModels;
+
+    @ApiModelProperty(value = "娴嬮噺鑼冨洿", example = "12姣背")
+    private String measuringRange;
+
+    @ApiModelProperty(value = "璇樊", example = "0.000001寰背")
+    private String errorRate;
+
+    @ApiModelProperty(value = "鐢熶骇鍘傚", example = "姹熻嫃榈烽洀")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "鍒拌揣鏃ユ湡", example = "2001-07-06", dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date arrivalDate;
+
+    @ApiModelProperty(value = "楠屾敹鏃ユ湡", example = "2060-07-06", dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date acceptanceDate;
+
+    @ApiModelProperty(value = "瀛樻斁鍦�", example = "鍦扮悆浜氭床涓浗姹熻嫃鍗楅��")
+    private String storagePlace;
+
+    @ApiModelProperty(value = "鏄惁鏀寔鏁伴噰锛�1锛氭敮鎸侊紱0锛氫笉鏀寔", example = "1")
+    private Integer whetherDataAcquisition;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕佷华鍣ㄨ澶囪閲忥細濡傛灉闇�瑕佽閲忓懆鏈熷繀濉紱濡傛灉涓嶉渶瑕佽閲忓懆鏈熶笉蹇呭~.1锛氶渶瑕侊紱0锛氫笉闇�瑕�", example = "0")
+    private Integer equipmentMeasurement;
+
+    @ApiModelProperty(value = "璁¢噺鎴鏈夋晥鏈燂細涓巈quipmentMeasurement鐩稿叧鑱�", example = "12")
+    private Integer termValidity;
+
+    @ApiModelProperty(value = "鎻忚堪", example = "鐤媯鏄熸湡浜旓紒锛侊紒")
+    private String descriptiveness;
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java
new file mode 100644
index 0000000..f209cd1
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java
@@ -0,0 +1,53 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdateMetricalInformationDto瀵硅薄", description="")
+public class UpdateMetricalInformationDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鍏宠仈Id", example = "7", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "璁¢噺鍗曚綅", example = "GB", required = true)
+    private String measurementUnit;
+
+    @ApiModelProperty(value = "寮�濮嬫棩鏈�", example = "2023-07-06", required = true, dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    private Date beginDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃ユ湡", example = "2026-07-06", required = true, dataType = "date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
+    private Date endDate;
+
+    @ApiModelProperty(value = "涓嶇‘瀹氬害", example = "0.3%", required = true)
+    private String uncertainty;
+
+    @ApiModelProperty(value = "缁撴灉: 1锛氬悎鏍硷紱2锛氱煫姝e悗鍙敤锛�3锛氫笉鍚堟牸", example = "1", required = true)
+    private Integer result;
+
+    @ApiModelProperty(value = "鎬ц兘鎸囨爣", example = "10086")
+    private String performanceIndex;
+
+    @ApiModelProperty(value = "澶囨敞", example = "10086.com")
+    private String remarks;
+
+    @ApiModelProperty(value = "鏂囦欢璺緞", hidden = true)
+    private String filePath;
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java
new file mode 100644
index 0000000..a297357
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java
@@ -0,0 +1,26 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.Classify;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface ClassifyService extends IService<Classify> {
+
+    Integer addClassifyInformation(Classify classify);
+
+    List<Map<String, Object>> getListClassifyInformation(String classifyName);
+
+    Boolean deleteClassifyInformation(String classifyId);
+
+    Boolean updateClassifyInformation(Classify classify);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java
new file mode 100644
index 0000000..4861c63
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java
@@ -0,0 +1,29 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface EquipmentPointService extends IService<EquipmentPoint> {
+
+    Integer addEquipmentPointInformation(EquipmentPoint equipmentPoint);
+
+    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
+
+    Integer deleteEquipmentPointInformation(Integer equipmentPointId);
+
+    Integer updateEquipmentPointInformation(EquipmentPoint equipmentPoint);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java
new file mode 100644
index 0000000..00c22c1
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java
@@ -0,0 +1,44 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface InstrumentService extends IService<Instrument> {
+
+    Integer addInstrumentInformation(Instrument instrument);
+
+    Boolean deleteInstrumentInformation(String instrumentId);
+
+    IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions, Boolean whetherWhether, String numberOrNameOrSpecifications,
+                                                            Integer classifyId, Page<Objects> page);
+
+    /**
+     * 鏇存柊浠櫒鏁版嵁鐨勬椂鍊欓渶瑕佽幏鍙栨墍鏈夋暟鎹�
+     * @param instrumentId
+     * @return
+     */
+    Instrument getIdInstrumentInformation(Integer instrumentId);
+
+    Integer updateEquipmentPointInformation(Instrument instrument);
+
+    /**
+     * 鏌ヨ鎵�鏈夎澶囦俊鎭�
+     * @return
+     */
+    List<Map> selectInstrument();
+
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java
new file mode 100644
index 0000000..5302b0c
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java
@@ -0,0 +1,26 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.MeteringPlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-27
+ */
+public interface MeteringPlanService extends IService<MeteringPlan> {
+
+    Integer addMeteringPlanInformation(MeteringPlan meteringPlan);
+
+    IPage<Map<String, Object>> pagingQueryOfMeteringPlan(String measureCodeOrNameOrUnit, Page<Objects> page);
+
+    IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java
new file mode 100644
index 0000000..eb8ad69
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java
@@ -0,0 +1,27 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.MetricalInformation;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+public interface MetricalInformationService extends IService<MetricalInformation> {
+
+    Integer addEquipmentPointInformation(MetricalInformation metricalInformation, MultipartFile file);
+
+    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
+
+    Integer deleteMetricalInformation(Integer metricalInformationId);
+
+    Integer updateMetricalInformation(MetricalInformation metricalInformation, MultipartFile file);
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java
new file mode 100644
index 0000000..66d8c86
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java
@@ -0,0 +1,85 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.yuanchu.limslaboratory.pojo.Classify;
+import com.yuanchu.limslaboratory.mapper.ClassifyMapper;
+import com.yuanchu.limslaboratory.service.ClassifyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Service
+public class ClassifyServiceImpl extends ServiceImpl<ClassifyMapper, Classify> implements ClassifyService {
+
+    @Resource
+    private ClassifyMapper classifyMapper;
+
+    @Override
+    public Integer addClassifyInformation(Classify classify) {
+        LambdaQueryWrapper<Classify> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Classify::getFatherName, classify.getFatherName());
+        wrapper.eq(Classify::getSonName, classify.getSonName());
+        wrapper.eq(Classify::getState, 1);
+        Classify classify1 = classifyMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(classify1)){
+            return classifyMapper.insert(classify);
+        } else {
+            return 2;
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> getListClassifyInformation(String classifyName) {
+        LambdaQueryWrapper<Classify> wrapper = new LambdaQueryWrapper<>();
+        if (!ObjectUtils.isEmpty(classifyName)){
+            wrapper.like(Classify::getFatherName, classifyName);
+        }
+        wrapper.groupBy(Classify::getFatherName);
+        wrapper.select(Classify::getId, Classify::getFatherName);
+        List<Map<String, Object>> maps = classifyMapper.selectMaps(wrapper);
+        for (Map<String, Object> map : maps){
+            LambdaQueryWrapper<Classify> wrapper1 = new LambdaQueryWrapper<>();
+            wrapper1.eq(Classify::getFatherName, map.get("father_name"));
+            wrapper1.isNotNull(Classify::getSonName);
+            wrapper1.select(Classify::getId, Classify::getSonName);
+            List<Map<String, Object>> maps1 = classifyMapper.selectMaps(wrapper1);
+            if (!ObjectUtils.isEmpty(maps1)){
+                map.put("children", maps1);
+                map.remove("id");
+            } else {
+                map.put("children", null);
+            }
+        }
+        return maps;
+    }
+
+    @Override
+    public Boolean deleteClassifyInformation(String classifyId) {
+        LambdaUpdateWrapper<Classify> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(Classify::getId, classifyId);
+        wrapper.set(Classify::getState, 0);
+        int isDeleteSuccess = classifyMapper.update(new Classify(), wrapper);
+        return isDeleteSuccess > 0;
+    }
+
+    @Override
+    public Boolean updateClassifyInformation(Classify classify) {
+        LambdaUpdateWrapper<Classify> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Classify::getId, classify.getId());
+        int isUpdateClassifySuccess = classifyMapper.update(classify, updateWrapper);
+        return isUpdateClassifySuccess > 0;
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java
new file mode 100644
index 0000000..94dc21a
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java
@@ -0,0 +1,75 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
+import com.yuanchu.limslaboratory.mapper.EquipmentPointMapper;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.service.EquipmentPointService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Service
+public class EquipmentPointServiceImpl extends ServiceImpl<EquipmentPointMapper, EquipmentPoint> implements EquipmentPointService {
+
+    @Resource
+    private EquipmentPointMapper equipmentPointMapper;
+
+    @Override
+    public Integer addEquipmentPointInformation(EquipmentPoint equipmentPoint) {
+        LambdaQueryWrapper<EquipmentPoint> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EquipmentPoint::getEquipmentPoint, equipmentPoint.getEquipmentPoint());
+        wrapper.eq(EquipmentPoint::getState, 1);
+        wrapper.eq(EquipmentPoint::getInstrumentId, equipmentPoint.getInstrumentId());
+        wrapper.select(EquipmentPoint::getEquipmentPoint);
+        EquipmentPoint equipmentPoint1 = equipmentPointMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(equipmentPoint1)){
+            return equipmentPointMapper.insert(equipmentPoint);
+        }
+        return 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId) {
+        return equipmentPointMapper.getListEquipmentPointInformation(InstrumentId);
+    }
+
+    @Override
+    public Integer deleteEquipmentPointInformation(Integer equipmentPointId) {
+        LambdaUpdateWrapper<EquipmentPoint> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(EquipmentPoint::getId, equipmentPointId);
+        updateWrapper.set(EquipmentPoint::getState, 0);
+        return equipmentPointMapper.update(new EquipmentPoint(), updateWrapper);
+    }
+
+    @Override
+    public Integer updateEquipmentPointInformation(EquipmentPoint equipmentPoint) {
+        LambdaQueryWrapper<EquipmentPoint> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EquipmentPoint::getEquipmentPoint, equipmentPoint.getEquipmentPoint());
+        wrapper.eq(EquipmentPoint::getState, 1);
+        wrapper.select(EquipmentPoint::getId, EquipmentPoint::getId);
+        EquipmentPoint equipmentPoint1 = equipmentPointMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(equipmentPoint1)){
+            return equipmentPointMapper.updateById(equipmentPoint);
+        } else if (equipmentPoint.getId().equals(equipmentPoint1.getId())){
+            return equipmentPointMapper.updateById(equipmentPoint);
+        }
+        return 0;
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java
new file mode 100644
index 0000000..5e91307
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java
@@ -0,0 +1,89 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.mapper.InstrumentMapper;
+import com.yuanchu.limslaboratory.service.InstrumentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Service
+public class InstrumentServiceImpl extends ServiceImpl<InstrumentMapper, Instrument> implements InstrumentService {
+
+    @Resource
+    private InstrumentMapper instrumentMapper;
+
+    @Override
+    public Integer addInstrumentInformation(Instrument instrument) {
+        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Instrument::getEquipmentCode, instrument.getEquipmentCode());
+        wrapper.eq(Instrument::getState, 1);
+        wrapper.select(Instrument::getEquipmentCode);
+        Instrument instrument1 = instrumentMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(instrument1)){
+            return instrumentMapper.insert(instrument);
+        }
+        return 0;
+    }
+
+    @Override
+    public Boolean deleteInstrumentInformation(String instrumentId) {
+        LambdaUpdateWrapper<Instrument> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Instrument::getId, instrumentId);
+        updateWrapper.set(Instrument::getState, 0);
+        int isUpdateSuccess = instrumentMapper.update(new Instrument(), updateWrapper);
+        return isUpdateSuccess > 0;
+    }
+
+    @Override
+    public IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions, Boolean whetherWhether, String numberOrNameOrSpecifications,
+                                                                   Integer classifyId, Page<Objects> page) {
+        return instrumentMapper.getListInstrumentInformation(conditions, whetherWhether, numberOrNameOrSpecifications, classifyId, page);
+    }
+
+    @Override
+    public Instrument getIdInstrumentInformation(Integer instrumentId) {
+        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Instrument::getId, instrumentId);
+        return instrumentMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public Integer updateEquipmentPointInformation(Instrument instrument) {
+        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Instrument::getEquipmentCode, instrument.getEquipmentCode());
+        wrapper.eq(Instrument::getState, 1);
+        wrapper.select(Instrument::getEquipmentCode, Instrument::getId);
+        Instrument instrument1 = instrumentMapper.selectOne(wrapper);
+        if (ObjectUtils.isEmpty(instrument1)){
+            return instrumentMapper.updateById(instrument);
+        } else if (instrument.getId().equals(instrument1.getId())){
+            return instrumentMapper.updateById(instrument);
+        }
+        return 0;
+    }
+
+    //鏌ヨ鎵�鏈夎澶囦俊鎭�
+    @Override
+    public List<Map> selectInstrument() {
+        return instrumentMapper.selectInstrument();
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java
new file mode 100644
index 0000000..1a5f4a8
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java
@@ -0,0 +1,51 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Instrument;
+import com.yuanchu.limslaboratory.pojo.MeteringPlan;
+import com.yuanchu.limslaboratory.mapper.MeteringPlanMapper;
+import com.yuanchu.limslaboratory.service.MeteringPlanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-27
+ */
+@Service
+public class MeteringPlanServiceImpl extends ServiceImpl<MeteringPlanMapper, MeteringPlan> implements MeteringPlanService {
+
+    @Resource
+    private MeteringPlanMapper meteringPlanMapper;
+
+    @Override
+    public Integer addMeteringPlanInformation(MeteringPlan meteringPlan) {
+        String timeSixNumber = MyUtil.getTimeSixNumberCode("P");
+        meteringPlan.setPlannedOrderNumber(timeSixNumber);
+        return meteringPlanMapper.insert(meteringPlan);
+    }
+
+    @Override
+    public IPage<Map<String, Object>> pagingQueryOfMeteringPlan(String measureCodeOrNameOrUnit, Page<Objects> page) {
+        return null;
+    }
+
+    @Override
+    public IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page) {
+        return meteringPlanMapper.pagingQueryOfMeasurementLedger(page);
+    }
+}
diff --git a/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java
new file mode 100644
index 0000000..74ed4a4
--- /dev/null
+++ b/laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java
@@ -0,0 +1,70 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.yuanchu.limslaboratory.pojo.MetricalInformation;
+import com.yuanchu.limslaboratory.mapper.MetricalInformationMapper;
+import com.yuanchu.limslaboratory.service.MetricalInformationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.utils.FileSaveUtil;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-20
+ */
+@Service
+public class MetricalInformationServiceImpl extends ServiceImpl<MetricalInformationMapper, MetricalInformation> implements MetricalInformationService {
+
+    @Resource
+    private MetricalInformationMapper metricalInformationMapper;
+
+    @Override
+    public Integer addEquipmentPointInformation(MetricalInformation metricalInformation, MultipartFile file) {
+        if (!ObjectUtils.isEmpty(file)){
+            String fileName = FileSaveUtil.StoreFile(file);
+            metricalInformation.setFilePath(fileName);
+        }
+        return metricalInformationMapper.insert(metricalInformation);
+    }
+
+    @Override
+    public List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId) {
+        return metricalInformationMapper.getListEquipmentPointInformation(InstrumentId);
+    }
+
+    @Override
+    public Integer deleteMetricalInformation(Integer metricalInformationId) {
+        LambdaUpdateWrapper<MetricalInformation> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(MetricalInformation::getId, metricalInformationId);
+        updateWrapper.set(MetricalInformation::getState, 0);
+        return metricalInformationMapper.update(new MetricalInformation(), updateWrapper);
+    }
+
+    @Override
+    public Integer updateMetricalInformation(MetricalInformation metricalInformation, MultipartFile file) {
+        if (!ObjectUtils.isEmpty(file)){
+            String fileName = FileSaveUtil.StoreFile(file);
+            metricalInformation.setFilePath(fileName);
+            LambdaQueryWrapper<MetricalInformation> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(MetricalInformation::getId, metricalInformation.getId());
+            wrapper.select(MetricalInformation::getFilePath);
+            MetricalInformation metricalInformation1 = metricalInformationMapper.selectOne(wrapper);
+            if (!ObjectUtils.isEmpty(metricalInformation1.getFilePath())){
+                FileSaveUtil.DeleteFile(metricalInformation1.getFilePath());
+            }
+        }
+        return metricalInformationMapper.updateById(metricalInformation);
+    }
+}
diff --git a/laboratory-server/src/main/resources/mapper/ClassifyMapper.xml b/laboratory-server/src/main/resources/mapper/ClassifyMapper.xml
new file mode 100644
index 0000000..f6e5f1c
--- /dev/null
+++ b/laboratory-server/src/main/resources/mapper/ClassifyMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.yuanchu.limslaboratory.mapper.ClassifyMapper">
+
+</mapper>
diff --git a/laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml b/laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml
new file mode 100644
index 0000000..c64e216
--- /dev/null
+++ b/laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml
@@ -0,0 +1,11 @@
+<?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="com.yuanchu.limslaboratory.mapper.EquipmentPointMapper">
+
+    <select id="getListEquipmentPointInformation" resultType="map">
+        SELECT e.`id`, e.`equipment_point` equipmentPoint, e.`equipment_point_name` equipmentPointName, e.`unit`,u.`name`, DATE_FORMAT(e.`update_time`, '%Y-%m-%d') updateTime, e.`descriptiveness`
+        FROM equipment_point e, `user` u
+        WHERE e.`user_id` = u.`id`
+        AND e.`instrument_id` = #{InstrumentId}
+    </select>
+</mapper>
diff --git a/laboratory-server/src/main/resources/mapper/InstrumentMapper.xml b/laboratory-server/src/main/resources/mapper/InstrumentMapper.xml
new file mode 100644
index 0000000..ee31f57
--- /dev/null
+++ b/laboratory-server/src/main/resources/mapper/InstrumentMapper.xml
@@ -0,0 +1,25 @@
+<?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="com.yuanchu.limslaboratory.mapper.InstrumentMapper">
+
+    <select id="getListInstrumentInformation" resultType="map">
+        SELECT i.`id`, i.`equipment_code`, i.`equipment_name`, i.`specifications_models`, u.`name`,
+               DATE_FORMAT(DATE_ADD(i.`create_time`, INTERVAL i.`term_validity` MONTH), '%Y-%m-%d') termValidity, i.`conditions`, i.`storage_place`
+        FROM instrument i, `user` u
+        WHERE i.`state` = 1
+          AND i.`classify_id` = #{classifyId}
+        <if test="conditions != null">
+            AND i.`conditions` = #{conditions}
+        </if>
+        <if test="numberOrNameOrSpecifications != null and numberOrNameOrSpecifications != ''">
+            AND CONCAT(i.`equipment_code`, i.`equipment_name`, i.`specifications_models`) LIKE CONCAT('%',#{numberOrNameOrSpecifications},'%')
+        </if>
+        <if test="whetherWhether == true">
+            AND DATE_FORMAT(DATE_ADD(i.`create_time`, INTERVAL i.`term_validity` MONTH), '%Y-%m-%d') <![CDATA[<]]> NOW()
+        </if>
+        AND i.`user_id` = u.`id`
+    </select>
+    <select id="selectInstrument" resultType="Map">
+        select id,equipment_name from lims_laboratory.instrument
+    </select>
+</mapper>
diff --git a/laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml b/laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml
new file mode 100644
index 0000000..ca6ab6b
--- /dev/null
+++ b/laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml
@@ -0,0 +1,11 @@
+<?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="com.yuanchu.limslaboratory.mapper.MeteringPlanMapper">
+
+    <select id="pagingQueryOfMeasurementLedger" resultType="map">
+        SELECT i.`equipment_code`, i.`equipment_name`, i.`specifications_models`, m.`create_time`, m.`uncertainty`,
+               m.`end_date`, i.`term_validity`, i.`storage_place`, i.`conditions`
+        FROM instrument i, metrical_information m
+        WHERE i.`id` = m.`instrument_id`
+    </select>
+</mapper>
diff --git a/laboratory-server/src/main/resources/mapper/MetricalInformationMapper.xml b/laboratory-server/src/main/resources/mapper/MetricalInformationMapper.xml
new file mode 100644
index 0000000..21de131
--- /dev/null
+++ b/laboratory-server/src/main/resources/mapper/MetricalInformationMapper.xml
@@ -0,0 +1,13 @@
+<?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="com.yuanchu.limslaboratory.mapper.MetricalInformationMapper">
+
+    <select id="getListEquipmentPointInformation" resultType="map">
+        SELECT m.`id`, u.`name`, m.`measurement_unit`, DATE_FORMAT(m.`begin_date`, '%Y-%m-%d') beginDate, DATE_FORMAT(m.`end_date`, '%Y-%m-%d') endDate,
+               m.`uncertainty`, m.`result`, m.`performance_index`, m.`remarks`, m.`file_path`, DATE_FORMAT(m.`create_time`, '%Y-%m-%d') createDate
+        FROM metrical_information m, `user` u
+        WHERE m.`user_id` = u.`id`
+        AND m.`state` = 1
+        AND m.`instrument_id` = #{InstrumentId}
+    </select>
+</mapper>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..b6025a8
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.3</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.yuanchu</groupId>
+    <artifactId>lims-laboratory</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>lims-laboratory</name>
+    <description>lims-laboratory</description>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>user-server</module>
+        <module>sys</module>
+        <module>framework</module>
+        <module>standard-server</module>
+        <module>inspection-server</module>
+        <module>laboratory-server</module>
+    </modules>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <log4j.version>1.2.17</log4j.version>
+        <mysql.version>8.0.28</mysql.version>
+        <jwt.version>4.4.0</jwt.version>
+        <swagger.version>3.0.0</swagger.version>
+        <knife4j-spring-ui.version>3.0.3</knife4j-spring-ui.version>
+        <druid.version>1.2.18</druid.version>
+        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
+        <openfeign.version>3.1.3</openfeign.version>
+        <feign-okhttp.version>11.0</feign-okhttp.version>
+        <shiro.version>1.5.3</shiro.version>
+
+        <!-- 鎵撳寘鍚庡鍑虹殑璺緞 -->
+        <package.path>${project.build.directory}/LIMS</package.path>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+
+        <!--鐑儴缃瞐-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!--lombok-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!--Swagger3-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+
+        <!--mybatis-plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis-plus.version}</version>
+        </dependency>
+
+        <!--鍚庣娉ㄩ噴妫�楠屽伐鍏�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <!--log4j-->
+            <dependency>
+                <groupId>log4j</groupId>
+                <artifactId>log4j</artifactId>
+                <version>${log4j.version}</version>
+            </dependency>
+
+            <!--mysql-->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+
+            <!--鏁版嵁搴撹繛鎺ユ睜-->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!--Swagger3-Ui缇庡寲-->
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-ui</artifactId>
+                <version>${knife4j-spring-ui.version}</version>
+            </dependency>
+
+            <!--mybatis-plus浠g爜鐢熸垚鍣�-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generator</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <!--feign-->
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-starter-openfeign</artifactId>
+                <version>${openfeign.version}</version>
+            </dependency>
+
+            <!--okhttp-->
+            <dependency>
+                <groupId>io.github.openfeign</groupId>
+                <artifactId>feign-okhttp</artifactId>
+                <version>${feign-okhttp.version}</version>
+            </dependency>
+
+            <!--瀹夊叏妗嗘灦shiro-->
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-spring-boot-starter</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+
+            <!--jwt-->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <!-- 涓婄嚎閮ㄧ讲 JAR鍚姩鍒嗙渚濊禆lib鍜岄厤缃� -->
+            <!-- 鎵撳寘jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <!-- 涓嶆墦鍖呰祫婧愭枃浠� -->
+                    <excludes>
+                        <exclude>*.**</exclude>
+                    </excludes>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <!-- MANIFEST.MF 涓� Class-Path 鍔犲叆鍓嶇紑 -->
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <!-- jar鍖呬笉鍖呭惈鍞竴鐗堟湰鏍囪瘑 -->
+                            <useUniqueVersions>false</useUniqueVersions>
+                            <!-- 鎸囧畾鍏ュ彛绫� -->
+                            <mainClass>com.yuanchu.limslaboratory.SysApplication</mainClass>
+                        </manifest>
+                        <!--  鎸囧畾閰嶇疆鏂囦欢鐩綍锛岃繖鏍穓ar杩愯鏃朵細鍘绘壘鍒板悓鐩綍涓嬬殑conf鏂囦欢澶逛笅鏌ユ壘  -->
+                        <manifestEntries>
+                            <Class-Path>conf/</Class-Path>
+                        </manifestEntries>
+                    </archive>
+                    <outputDirectory>${package.path}</outputDirectory>
+                </configuration>
+            </plugin>
+            <!-- 鎷疯礉渚濊禆 copy-dependencies -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${package.path}/lib/ </outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- 鎷疯礉璧勬簮鏂囦欢 copy-resources -->
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-resources</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <!--  鎸囧畾鍙備笌鏋勫缓鐨剅esource -->
+                                    <includes>
+                                        <include>*.**</include>
+                                        <!--鎺掗櫎application-dev.yml鏂囦欢-->
+                                    </includes>
+                                </resource>
+                            </resources>
+                            <outputDirectory>${package.path}/conf</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/sql/lims.sql b/sql/lims.sql
new file mode 100644
index 0000000..fee83e7
--- /dev/null
+++ b/sql/lims.sql
@@ -0,0 +1,528 @@
+/*
+SQLyog Ultimate v13.1.1 (64 bit)
+MySQL - 5.7.32-log : Database - lims_laboratory
+*********************************************************************
+*/
+
+/*!40101 SET NAMES utf8 */;
+
+/*!40101 SET SQL_MODE=''*/;
+
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+CREATE DATABASE /*!32312 IF NOT EXISTS*/`lims_laboratory` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
+
+USE `lims_laboratory`;
+
+/*Table structure for table `classify` */
+
+DROP TABLE IF EXISTS `classify`;
+
+CREATE TABLE `classify` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '鍒嗙被涓婚敭',
+  `father_name` varchar(25) NOT NULL COMMENT '鍒嗙被鐖跺悕绉�',
+  `son_name` varchar(25) DEFAULT NULL COMMENT '鍒嗙被瀛愬悕绉�',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎',
+  `create_time` datetime NOT NULL COMMENT '鍒涘缓鏃堕棿',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃堕棿',
+  `version` int(1) NOT NULL DEFAULT '1' COMMENT '涔愯閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `classify` */
+
+insert  into `classify`(`id`,`father_name`,`son_name`,`state`,`create_time`,`update_time`,`version`) values 
+(1,'娓╁害娴嬮噺浠〃','浣撴俯璁�',1,'2023-07-21 10:42:26','2023-07-21 14:14:54',1),
+(3,'浣撴俯璁�',NULL,1,'2023-07-21 10:48:51','2023-07-21 10:48:51',1),
+(5,'浣撴俯',NULL,1,'2023-07-21 10:53:32','2023-07-21 10:53:32',1),
+(10,'浣撴俯','浣撴俯',0,'2023-07-21 11:16:51','2023-07-21 13:45:52',1),
+(12,'浣撴俯','浣撴俯璁�',1,'2023-07-21 11:16:51','2023-07-21 11:16:51',1),
+(13,'浣撴俯','浣撴俯',1,'2023-07-21 13:50:52','2023-07-21 13:50:52',1);
+
+/*Table structure for table `enterprise` */
+
+DROP TABLE IF EXISTS `enterprise`;
+
+CREATE TABLE `enterprise` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '浼佷笟缂栧彿',
+  `name` varchar(20) NOT NULL COMMENT '浼佷笟鍚嶅瓧',
+  `byname` varchar(20) NOT NULL COMMENT '浼佷笟绠�绉�',
+  `link_name` varchar(10) NOT NULL COMMENT '鑱旂郴浜哄悕瀛�',
+  `link_phone` varchar(11) NOT NULL COMMENT '鑱旂郴浜虹數璇�',
+  `create_time` datetime NOT NULL COMMENT '鍒涘缓鏃堕棿',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃堕棿',
+  `version` int(1) NOT NULL DEFAULT '1' COMMENT '閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `enterprise` */
+
+insert  into `enterprise`(`id`,`name`,`byname`,`link_name`,`link_phone`,`create_time`,`update_time`,`version`) values 
+(1,'涓ぉ绉戞妧缃戠粶鏈夐檺鍏徃','涓ぉ绉戞妧','鏉庢灄','18400000000','2023-07-07 10:51:38','2023-07-07 10:51:41',1);
+
+/*Table structure for table `equipment_point` */
+
+DROP TABLE IF EXISTS `equipment_point`;
+
+CREATE TABLE `equipment_point` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
+  `instrument_id` int(10) NOT NULL COMMENT '浠櫒Id 鍏宠仈',
+  `user_id` int(10) NOT NULL COMMENT '鐢ㄦ埛Id 鍏宠仈',
+  `equipment_point` varchar(25) NOT NULL COMMENT '鐮佺偣缂栧彿',
+  `equipment_point_name` varchar(25) NOT NULL COMMENT '鐮佺偣鍚嶇О',
+  `unit` varchar(20) NOT NULL COMMENT '鍗曚綅',
+  `descriptiveness` varchar(100) DEFAULT '--' COMMENT '鎻忚堪',
+  `create_time` datetime NOT NULL COMMENT '鍒涘缓鏃ユ湡',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃ユ湡',
+  `state` int(11) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎',
+  `version` int(11) DEFAULT '1' COMMENT '涔愯閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `equipment_point` */
+
+insert  into `equipment_point`(`id`,`instrument_id`,`user_id`,`equipment_point`,`equipment_point_name`,`unit`,`descriptiveness`,`create_time`,`update_time`,`state`,`version`) values 
+(1,1,7,'Area-1','瀵间綋灞忚斀锛堝鍘氶潰绉級','mm','鐤簡锛屽仛涓嶄簡','2023-07-24 14:40:01','2023-07-24 17:23:15',1,1),
+(2,1,7,'Area-2','瀵间綋灞忚斀锛堝鍘氶潰绉級','mm','澶洶浜�','2023-07-24 14:40:01','2023-07-24 15:03:44',1,1);
+
+/*Table structure for table `inspection` */
+
+DROP TABLE IF EXISTS `inspection`;
+
+CREATE TABLE `inspection` (
+  `id` varchar(25) NOT NULL COMMENT '鎶ユ缂栧彿',
+  `type` int(1) NOT NULL COMMENT '0锛氬師鏉愭枡锛�1锛氫骇鍝侊紱2锛氬崐鎴愬搧锛�',
+  `inspection_status` int(1) NOT NULL DEFAULT '0' COMMENT '鎶ユ鐘舵�� 1锛氬凡妫�楠岋紱0鏈楠�',
+  `qualified_state` int(1) DEFAULT NULL COMMENT '鏄惁鍚堟牸 1锛氭槸锛�0鍚�',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '1锛氬緟鎻愪氦锛�2锛氬凡鎻愪氦锛�0锛氬凡浣滃簾',
+  `create_time` datetime NOT NULL COMMENT '鎶ユ鏃堕棿',
+  `update_time` datetime NOT NULL,
+  `version` int(1) DEFAULT '1',
+  `user_name` varchar(25) NOT NULL COMMENT '鎶ユ浜�',
+  `inspect_user_id` int(10) DEFAULT NULL COMMENT '鍏宠仈 妫�楠屼汉锛堢敤鎴穒d锛�',
+  `inspect_start_time` datetime DEFAULT NULL COMMENT '妫�楠屽紑濮嬫棩鏈�',
+  `inspect_end_time` datetime DEFAULT NULL COMMENT '妫�楠岀粨鏉熸棩鏈�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `inspection` */
+
+insert  into `inspection`(`id`,`type`,`inspection_status`,`qualified_state`,`state`,`create_time`,`update_time`,`version`,`user_name`,`inspect_user_id`,`inspect_start_time`,`inspect_end_time`) values 
+('1680929494813868034',0,0,NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,'娴嬭瘯浜哄憳',NULL,NULL,NULL),
+('1680929899014750210',0,0,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,'娴嬭瘯浜哄憳',NULL,NULL,NULL),
+('1681215775833042945',0,0,NULL,1,'2023-07-18 16:14:11','2023-07-18 16:14:11',1,'娴嬭瘯浜哄憳',NULL,NULL,NULL);
+
+/*Table structure for table `inspection_material_list` */
+
+DROP TABLE IF EXISTS `inspection_material_list`;
+
+CREATE TABLE `inspection_material_list` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `material_id` varchar(25) NOT NULL COMMENT '鐗╂枡id',
+  `material_num` int(10) NOT NULL COMMENT '鎶ユ鏁伴噺-鐗╂枡鏁伴噺',
+  `material_supplier` varchar(25) NOT NULL COMMENT '渚涘簲鍟�',
+  `material_name` varchar(25) NOT NULL COMMENT '鐗╂枡鍚嶇О',
+  `material_location` varchar(25) NOT NULL COMMENT '鐗╂枡瀛樻斁鍦�',
+  `material_batch` varchar(25) NOT NULL COMMENT '鐗╂枡鎵规',
+  `material_reel_number` varchar(25) NOT NULL COMMENT '鐗╂枡鐩樺彿',
+  `specifications_serial_number` varchar(50) NOT NULL COMMENT '瑙勬牸鍚嶇О/鍨嬪彿鍚嶇О',
+  `specifications_voltage_level` varchar(30) DEFAULT NULL COMMENT '鐢靛帇绛夌骇',
+  `specifications_cross_section` varchar(30) DEFAULT NULL COMMENT '涓荤嚎蹇冩埅闈�',
+  `specifications_number_of_cores` varchar(30) DEFAULT NULL COMMENT '涓荤嚎鑺姱鏁�',
+  `specifications_instruct` varchar(30) DEFAULT NULL COMMENT '鐢熶骇鎸囦护鍙�',
+  `notes` varchar(100) DEFAULT NULL COMMENT '澶囨敞',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL COMMENT '鎶ユ鏃堕棿',
+  `update_time` datetime NOT NULL,
+  `version` int(1) DEFAULT '1',
+  `inspection_id` varchar(25) NOT NULL COMMENT '鍏宠仈 鎶ユ鍗昳d',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `inspection_material_list` */
+
+insert  into `inspection_material_list`(`id`,`material_id`,`material_num`,`material_supplier`,`material_name`,`material_location`,`material_batch`,`material_reel_number`,`specifications_serial_number`,`specifications_voltage_level`,`specifications_cross_section`,`specifications_number_of_cores`,`specifications_instruct`,`notes`,`state`,`create_time`,`update_time`,`version`,`inspection_id`) values 
+(1,'1680929494813868034',100,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','娴嬭瘯瑙勬牸/dsahj1','1','1','1','1',NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,'1681215775833042945'),
+(2,'1680929899014750210',100,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','娴嬭瘯瑙勬牸/dsahj1','1','1','1','1',NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,'1681215775833042945'),
+(3,'1681499095783407618',100,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','23123','3424','2131','2','123','312',1,'2023-07-19 11:00:00','2023-07-19 11:00:00',1,'1681215775833042945'),
+(4,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','','','瑙勬牸/鍨嬪彿','','','',1,'2023-07-19 13:59:46','2023-07-19 13:59:46',1,'1681215775833042945'),
+(5,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','','','瑙勬牸/鍨嬪彿','','','',1,'2023-07-19 14:00:51','2023-07-19 14:00:51',1,'1681215775833042945'),
+(6,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','','','瑙勬牸/鍨嬪彿','','','',0,'2023-07-19 14:01:46','2023-07-19 14:01:46',1,'1681215775833042945'),
+(7,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','','','瑙勬牸/鍨嬪彿','','','',0,'2023-07-19 14:02:47','2023-07-19 14:02:47',1,'1681215775833042945'),
+(8,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','瑙勬牸/鍨嬪彿','5','2','4','3','1',1,'2023-07-19 14:25:56','2023-07-19 14:39:23',1,'1681215775833042945'),
+(9,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','瑙勬牸/鍨嬪彿','5','2','4','3','1',1,'2023-07-19 15:17:56','2023-07-19 15:17:56',1,'1681215775833042945'),
+(13,'1',10,'涓ぉ','鐢电嚎鐢电紗','鍦颁笅涓�灞�','1','123','瑙勬牸/鍨嬪彿','5','2','4','3','1',0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,'1681215775833042945');
+
+/*Table structure for table `inspection_product_list` */
+
+DROP TABLE IF EXISTS `inspection_product_list`;
+
+CREATE TABLE `inspection_product_list` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '椤圭洰id',
+  `name` varchar(25) NOT NULL COMMENT '椤圭洰鍚嶇О',
+  `method` varchar(25) NOT NULL COMMENT '璇曢獙鏂规硶',
+  `ask` varchar(30) DEFAULT NULL COMMENT '璇曢獙瑕佹眰',
+  `unit` varchar(20) NOT NULL COMMENT '鍗曚綅',
+  `required` varchar(20) NOT NULL COMMENT '鎷涙爣浜鸿姹傚��',
+  `internal` varchar(20) NOT NULL COMMENT '鍐呮帶鍊�',
+  `start_time` datetime DEFAULT NULL COMMENT '寮�濮嬫棩鏈�',
+  `end_time` datetime DEFAULT NULL COMMENT '缁撴潫鏃ユ湡',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(1) DEFAULT '1',
+  `inspection_material_list_id` int(10) NOT NULL COMMENT '鍏宠仈 鎶ユ鐗╂枡id',
+  `user_id` int(10) NOT NULL COMMENT '鍏宠仈 鐢ㄦ埛id 璇曢獙鍛�',
+  `instrument_id` int(10) DEFAULT NULL COMMENT '鍏宠仈 璁惧id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `inspection_product_list` */
+
+insert  into `inspection_product_list`(`id`,`name`,`method`,`ask`,`unit`,`required`,`internal`,`start_time`,`end_time`,`state`,`create_time`,`update_time`,`version`,`inspection_material_list_id`,`user_id`,`instrument_id`) values 
+(2,'椤圭洰涓�','灏鸿〃娴嬮噺',NULL,'绫�','>=1','>1',NULL,NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,1,1,NULL),
+(3,'椤圭洰涓�','灏鸿〃娴嬮噺',NULL,'绫�','>=1','>1',NULL,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,2,1,NULL),
+(4,'椤圭洰浜�','娴嬭瘯鏂规硶',NULL,'浜烘皯甯�','>1','>2',NULL,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,3,1,NULL),
+(5,'椤圭洰涓�','灏鸿〃娴嬮噺',NULL,'绫�','>=1','>1',NULL,NULL,0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,0,1,NULL),
+(6,'椤圭洰浜�','娴嬭瘯鏂规硶',NULL,'浜烘皯甯�','>1','>2',NULL,NULL,0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,0,1,NULL);
+
+/*Table structure for table `inspection_records` */
+
+DROP TABLE IF EXISTS `inspection_records`;
+
+CREATE TABLE `inspection_records` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '璁板綍id',
+  `method` varchar(25) NOT NULL COMMENT '妫�娴嬫柟娉�',
+  `num` int(10) NOT NULL COMMENT '妫�娴嬬殑鏍峰搧鏁伴噺',
+  `value` varchar(25) NOT NULL COMMENT '妫�娴嬪��',
+  `submit_state` int(1) NOT NULL DEFAULT '0' COMMENT '鎻愪氦鐘舵�� 0锛氬緟鎻愪氦锛�1锛氬緟瀹℃牳锛�2锛氬凡閫氳繃',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL COMMENT '妫�娴嬫棩鏈�',
+  `update_time` datetime NOT NULL,
+  `version` int(1) DEFAULT NULL,
+  `inspection_product_list_id` int(10) NOT NULL COMMENT '鍏宠仈 鏍峰搧涓嬬殑椤圭洰id',
+  `user_name` int(10) DEFAULT NULL COMMENT '鍏宠仈 瀹℃壒浜猴紙鐢ㄦ埛鍚嶇О锛�',
+  `approval_time` datetime DEFAULT NULL COMMENT '瀹℃壒鏃ユ湡',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `inspection_records` */
+
+/*Table structure for table `instrument` */
+
+DROP TABLE IF EXISTS `instrument`;
+
+CREATE TABLE `instrument` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
+  `classify_id` int(10) NOT NULL COMMENT '鍒嗙被ID 鍏宠仈',
+  `user_id` int(10) NOT NULL COMMENT '鐢ㄦ埛鍏宠仈 淇濈浜�',
+  `equipment_code` varchar(25) NOT NULL COMMENT '浠櫒璁惧缂栧彿',
+  `equipment_name` varchar(25) NOT NULL COMMENT '浠櫒璁惧鍚嶇О',
+  `conditions` int(1) NOT NULL COMMENT '榛樿1锛�1锛氳繍琛屻��2锛氭晠闅溿��3锛氭姤淇��4锛氭淇��5锛氬緟鏈�',
+  `specifications_models` varchar(25) NOT NULL COMMENT '瑙勬牸鍨嬪彿',
+  `measuring_range` varchar(25) DEFAULT '--' COMMENT '娴嬮噺鑼冨洿',
+  `error_rate` varchar(10) DEFAULT '--' COMMENT '璇樊',
+  `manufacturer` varchar(50) DEFAULT '--' COMMENT '鐢熶骇鍘傚',
+  `arrival_date` datetime DEFAULT NULL COMMENT '鍒拌揣鏃ユ湡',
+  `acceptance_date` datetime DEFAULT NULL COMMENT '楠屾敹鏃ユ湡',
+  `storage_place` varchar(100) DEFAULT '--' COMMENT '瀛樻斁鍦�',
+  `whether_data_acquisition` int(1) NOT NULL COMMENT '鏄惁鏀寔鏁伴噰',
+  `equipment_measurement` int(1) NOT NULL COMMENT '鏄惁闇�瑕佷华鍣ㄨ澶囪閲忥細濡傛灉闇�瑕佽閲忓懆鏈熷繀濉紱濡傛灉涓嶉渶瑕佽閲忓懆鏈熶笉蹇呭~',
+  `term_validity` int(11) NOT NULL COMMENT '璁¢噺鎴鏈夋晥鏈�',
+  `descriptiveness` varchar(100) DEFAULT '--' COMMENT '鎻忚堪',
+  `create_time` datetime NOT NULL COMMENT '鍒涘缓鏃堕棿',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃堕棿',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎',
+  `version` int(1) DEFAULT '1' COMMENT '涔愯閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `instrument` */
+
+insert  into `instrument`(`id`,`classify_id`,`user_id`,`equipment_code`,`equipment_name`,`conditions`,`specifications_models`,`measuring_range`,`error_rate`,`manufacturer`,`arrival_date`,`acceptance_date`,`storage_place`,`whether_data_acquisition`,`equipment_measurement`,`term_validity`,`descriptiveness`,`create_time`,`update_time`,`state`,`version`) values 
+(1,1,9,'JSTC-W1-00001','鏁板瓧鐢垫ˉ',1,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:15:23','2023-07-24 17:10:17',1,1),
+(2,1,9,'JSTC-W1-00002','鏁板瓧鐢垫ˉ',1,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:17:56','2023-07-21 15:58:35',1,1),
+(3,1,10,'JSTC-W1-00003','鏁板瓧鐢垫ˉ',3,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2020-01-09 15:18:02','2023-07-21 15:18:02',1,1),
+(4,1,11,'JSTC-W1-00004','鏁板瓧鐢垫ˉ',2,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:18:10','2023-07-21 15:18:10',1,1),
+(5,1,12,'JSTC-W1-00005','鏁板瓧鐢垫ˉ',4,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:18:15','2023-07-21 15:18:15',1,1),
+(6,1,13,'JSTC-W1-00006','A鏁板瓧鐢垫ˉ',1,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:18:19','2023-07-21 15:18:19',1,1),
+(7,1,14,'JSTC-W1-00007','鏁板瓧鐢垫ˉ',5,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-21 15:18:23','2023-07-21 15:18:23',1,1),
+(8,1,9,'JSTC-W1-00008','鏁板瓧鐢垫ˉ',1,'WCDMS-1','12姣背','0.000001寰背','姹熻嫃榈烽洀','2001-07-06 00:00:00','2060-07-06 00:00:00','鍦扮悆浜氭床涓浗姹熻嫃鍗楅��',1,0,12,'鐤媯鏄熸湡浜旓紒锛侊紒','2023-07-24 14:16:07','2023-07-24 14:16:07',1,1);
+
+/*Table structure for table `material` */
+
+DROP TABLE IF EXISTS `material`;
+
+CREATE TABLE `material` (
+  `id` varchar(25) NOT NULL COMMENT '鐗╂枡id',
+  `name` varchar(25) NOT NULL COMMENT '鐗╂枡鍚嶇О',
+  `supplier` varchar(25) NOT NULL COMMENT '渚涘簲鍟�',
+  `location` varchar(25) NOT NULL COMMENT '鐗╂枡瀛樻斁鍦�',
+  `num` int(10) NOT NULL COMMENT '鐗╂枡鏁伴噺',
+  `batch` varchar(25) NOT NULL COMMENT '鎵规',
+  `reel_number` varchar(25) NOT NULL COMMENT '鐩樺彿',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(1) NOT NULL DEFAULT '1',
+  `specifications_id` int(10) NOT NULL COMMENT '鍏宠仈 瑙勬牸id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `material` */
+
+insert  into `material`(`id`,`name`,`supplier`,`location`,`num`,`batch`,`reel_number`,`state`,`create_time`,`update_time`,`version`,`specifications_id`) values 
+('11111111111111','22222222222','1111111111','1111111',1111111,'111111','1111111',0,'2023-07-20 15:19:11','2023-07-21 13:04:12',1,1),
+('112233445566','鎵嬫満','test','test',1,'2','3',1,'2023-07-21 13:29:57','2023-07-21 13:29:57',1,1),
+('11223456','test','鑵捐','浠撳簱涓�锛屼簩鍙锋灦',200,'2','152453211563232',1,'2023-07-21 13:51:21','2023-07-21 13:51:21',1,1),
+('12345','testmaterial','test','test',1,'123','1',0,'2023-07-21 13:08:44','2023-07-21 13:13:54',1,1),
+('123456','test','test','test',1,'1','1',0,'2023-07-21 13:14:49','2023-07-21 13:20:20',1,1),
+('152423211563212','鎵嬫満','鐧惧害','浠撳簱涓�锛屼簩鍙锋灦',200,'1','152453211563212',0,'2023-07-17 14:22:57','2023-07-21 13:28:54',1,1),
+('152453211563211','鐭冲ご','鐧惧害','浠撳簱涓�锛屼笁鍙锋灦',200,'1','152453211563212',0,'2023-07-17 14:14:03','2023-07-21 13:42:15',1,1),
+('152453211563212','鐭冲ご','鐧惧害','浠撳簱涓�锛屼簩鍙锋灦',200,'1','152453211563212',1,'2023-07-21 13:41:49','2023-07-21 13:41:49',1,1),
+('152453211563222','鐭冲ご','鐧惧害','浠撳簱涓�锛屼笁鍙锋灦',200,'1','152453211563212',1,'2023-07-17 14:14:03','2023-07-20 11:09:36',1,4),
+('152453211563233','鐭冲ご','鐧惧害','浠撳簱涓�锛屼笁鍙锋灦',200,'1','152453211563212',1,'2023-07-17 14:14:03','2023-07-20 11:00:29',1,4),
+('218469124614','1122333','test','test',1,'1','1',1,'2023-07-21 13:31:00','2023-07-21 13:31:00',1,1),
+('22222222','2222222','22222222','22222222',22222222,'2222222222','2222222',0,'2023-07-20 15:20:20','2023-07-21 13:21:25',1,1);
+
+/*Table structure for table `metrical_information` */
+
+DROP TABLE IF EXISTS `metrical_information`;
+
+CREATE TABLE `metrical_information` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
+  `user_id` int(10) NOT NULL COMMENT '鐢ㄦ埛鍏宠仈Id',
+  `measurement_unit` varchar(15) NOT NULL COMMENT '璁¢噺鍗曚綅',
+  `begin_date` datetime NOT NULL COMMENT '寮�濮嬫棩鏈�',
+  `end_date` datetime NOT NULL COMMENT '缁撴潫鏃ユ湡',
+  `uncertainty` varchar(20) NOT NULL COMMENT '涓嶇‘瀹氬害',
+  `result` int(1) NOT NULL COMMENT '缁撴灉 1锛氬悎鏍硷紱2锛氱煫姝e悗鍙敤锛�3锛氫笉鍚堟牸',
+  `performance_index` varchar(100) DEFAULT NULL COMMENT '鎬ц兘鎸囨爣',
+  `remarks` varchar(100) DEFAULT NULL COMMENT '澶囨敞',
+  `file_path` varchar(50) DEFAULT NULL COMMENT '鏂囦欢璺緞',
+  `create_time` datetime NOT NULL COMMENT '鍒涘缓鏃堕棿',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃堕棿',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎',
+  `version` int(1) DEFAULT '1' COMMENT '涔愯閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `metrical_information` */
+
+insert  into `metrical_information`(`id`,`user_id`,`measurement_unit`,`begin_date`,`end_date`,`uncertainty`,`result`,`performance_index`,`remarks`,`file_path`,`create_time`,`update_time`,`state`,`version`) values 
+(1,7,'1','2023-07-25 00:00:00','2023-07-25 00:00:00','1',1,'1','1','1690255123954_131493.png','2023-07-25 10:43:30','2023-07-25 13:50:24',1,1),
+(2,7,'2','2023-07-25 00:00:00','2023-07-25 00:00:00','2',2,'2','2','1690264656523_540845.png','2023-07-25 11:18:44','2023-07-25 13:57:37',1,1);
+
+/*Table structure for table `plan` */
+
+DROP TABLE IF EXISTS `plan`;
+
+CREATE TABLE `plan` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '璁″垝缂栧彿',
+  `results` int(10) DEFAULT NULL COMMENT '妫�楠岀粨鏋� 0锛氭湭瀹屾垚锛�1锛氬凡瀹屾垚锛�',
+  `thing` varchar(50) DEFAULT NULL COMMENT '璇曢獙璇存槑',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '1锛氬緟璁ら锛�2锛氬緟鍒嗛厤锛�3锛氬凡鍒嗛厤锛�4锛氳秴鏈熷緟鍒嗛厤锛�5锛氬凡瀹屾垚锛�0锛氬凡浣滃簾',
+  `create_time` datetime NOT NULL COMMENT '浠诲姟鐧昏鏃堕棿',
+  `update_time` datetime NOT NULL,
+  `version` int(1) DEFAULT '1',
+  `inspection_id` varchar(25) NOT NULL COMMENT '鍏宠仈 鎶ユid(鐢宠鍗曠紪鍙�)',
+  `user_id` int(10) DEFAULT NULL COMMENT '鍏宠仈 鐢ㄦ埛id(璐熻矗浜篿d)',
+  `device_id` int(10) DEFAULT NULL COMMENT '鍏宠仈 璁惧id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `plan` */
+
+/*Table structure for table `product` */
+
+DROP TABLE IF EXISTS `product`;
+
+CREATE TABLE `product` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '娴嬭瘯鏍囧噯id',
+  `name` varchar(25) NOT NULL COMMENT '娴嬭瘯鏍囧噯鍚嶇О',
+  `method` varchar(25) NOT NULL COMMENT '璇曢獙鏂规硶',
+  `father` varchar(20) DEFAULT NULL COMMENT '娴嬭瘯鏍囧噯鐖剁被',
+  `unit` varchar(20) NOT NULL COMMENT '鍗曚綅',
+  `required` varchar(20) NOT NULL COMMENT '鎷涙爣浜鸿姹傚��',
+  `internal` varchar(20) NOT NULL COMMENT '鍐呮帶鍊�',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(1) NOT NULL DEFAULT '1',
+  `user_id` int(10) NOT NULL COMMENT '鍏宠仈 鐢ㄦ埛id',
+  `material_id` varchar(25) NOT NULL COMMENT '鍏宠仈 鐗╂枡id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `product` */
+
+insert  into `product`(`id`,`name`,`method`,`father`,`unit`,`required`,`internal`,`state`,`create_time`,`update_time`,`version`,`user_id`,`material_id`) values 
+(1,'鍗曚綅闀垮害璐ㄩ噺','--','閾濆寘閽㈣姱閾濈粸绾�','km','<=0.3458','<=0.3458',0,'2023-07-17 14:56:22','2023-07-21 13:28:54',1,7,'152423211563212'),
+(2,'鍗曚綅瀹藉害璐ㄩ噺','--','閾濆寘閽㈣姱閾濈粸绾�','km','<=0.3458','<=0.3458',1,'2023-07-17 14:56:22','2023-07-20 11:09:36',1,7,'152453211563222'),
+(3,'鍗曚綅瀹藉害璐ㄩ噺','--',NULL,'km','<=0.3458','<=0.3458',1,'2023-07-17 14:56:22','2023-07-20 11:09:36',1,7,'152453211563222'),
+(4,'濂藉1','鎺у埗鍙橀噺娉�','1111111','濂藉1','2000','100',0,'2023-07-20 16:05:38','2023-07-21 13:04:12',1,7,'11111111111111'),
+(5,'濂藉濂藉','---','鏂扮殑鐖堕」鐩�','濂藉濂藉','200','100',0,'2023-07-20 16:10:19','2023-07-21 13:04:12',1,7,'11111111111111'),
+(6,'濂藉濂藉','---','鏂扮殑鐖堕」鐩�','濂藉濂藉','200','100',0,'2023-07-20 16:11:39','2023-07-21 13:04:12',1,7,'11111111111111'),
+(7,'1111111','test',NULL,'test','12','123',1,'2023-07-21 13:31:34','2023-07-21 13:31:34',1,7,'112233445566'),
+(8,'111111','1',NULL,'11','1','1',1,'2023-07-21 13:33:06','2023-07-21 13:33:06',1,7,'112233445566'),
+(9,'鍗曚綅闀垮害璐ㄩ噺','--','閾濆寘閽㈣姱閾濈粸绾�','km','<=0.3458','<=0.3458',1,'2023-07-21 13:39:28','2023-07-21 13:39:28',1,7,'152453211563212'),
+(10,'鍗曚綅闀垮害璐ㄩ噺','--','閾濆寘閽㈣姱閾濈粸绾�','km','<=0.3458','<=0.3458',0,'2023-07-21 13:42:01','2023-07-21 14:19:34',1,7,'152453211563212'),
+(11,'1111111111','1111','閾濆寘閽㈣姱閾濈粸绾�','cm','11','111',0,'2023-07-21 13:48:25','2023-07-21 14:20:50',1,7,'152453211563212'),
+(12,'11111111','1','閾濆寘閽㈣姱閾濈粸绾�','1111','1','1',0,'2023-07-21 13:48:59','2023-07-21 14:19:04',1,7,'112233445566'),
+(13,'11111','--','11111111','km','<=0.3458','<=0.3458',1,'2023-07-21 13:52:21','2023-07-21 13:52:21',1,7,'11223456'),
+(14,'12345','--','11111111','km','<=0.3458','<=0.3458',0,'2023-07-21 13:53:58','2023-07-21 13:56:17',1,7,'11223456'),
+(15,'11111111111111','1','閾濆寘閽㈣姱閾濈粸绾�','111','11','1',0,'2023-07-21 14:23:10','2023-07-21 14:23:22',1,7,'152453211563212');
+
+/*Table structure for table `role` */
+
+DROP TABLE IF EXISTS `role`;
+
+CREATE TABLE `role` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '瑙掕壊id',
+  `name` varchar(30) NOT NULL COMMENT '瑙掕壊鍚�',
+  `power` int(1) NOT NULL COMMENT '0锛氭棤鏉冮檺锛�1锛氭湁鏉冮檺',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(10) NOT NULL COMMENT '涔愯閿�',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `role` */
+
+insert  into `role`(`id`,`name`,`power`,`state`,`create_time`,`update_time`,`version`) values 
+(1,'鏅�氫汉鍛�',1,1,'2023-07-07 11:30:06','2023-07-07 11:30:11',1);
+
+/*Table structure for table `serial_number` */
+
+DROP TABLE IF EXISTS `serial_number`;
+
+CREATE TABLE `serial_number` (
+  `id` varchar(25) NOT NULL COMMENT '鍨嬪彿缂栧彿',
+  `name` varchar(25) NOT NULL COMMENT '鍨嬪彿鍚嶇О',
+  `state` int(1) NOT NULL DEFAULT '1',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(1) NOT NULL DEFAULT '1',
+  `standards_id` varchar(15) NOT NULL COMMENT '鍏宠仈瀛楁 鏍囧噯id',
+  `user_id` int(10) NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `serial_number` */
+
+insert  into `serial_number`(`id`,`name`,`state`,`create_time`,`update_time`,`version`,`standards_id`,`user_id`) values 
+('111222','鍨嬪彿1',0,'2023-07-20 15:01:08','2023-07-20 15:20:09',1,'111',7),
+('230711000002','鍏夌氦2.0.1',1,'2023-07-11 22:34:11','2023-07-20 09:28:19',1,'230711000001',7),
+('ModelNumber001','鍏夌氦2.0.1',1,'2023-07-20 10:51:01','2023-07-20 10:51:01',1,'230711000002',7),
+('ModelNumber002','鍏夌氦2.0.2',1,'2023-07-18 13:36:13','2023-07-20 09:28:19',1,'230711000001',7),
+('ModelNumber003','鍏夌氦2.0.3',1,'2023-07-18 13:36:23','2023-07-20 10:54:11',1,'230711000002',7),
+('num1','鍏夌氦2.0.3',1,'2023-07-20 14:18:24','2023-07-20 14:18:24',1,'230711000002',7),
+('num2','鍏夌氦2.0.4',1,'2023-07-20 14:19:34','2023-07-20 14:19:34',1,'230711000002',7),
+('PleasantGoat','1345',1,'2023-07-18 13:46:49','2023-07-20 10:22:42',1,'230711000002',7),
+('spiritless','78915',1,'2023-07-18 13:46:24','2023-07-18 13:46:24',1,'230711000004',7);
+
+/*Table structure for table `specifications` */
+
+DROP TABLE IF EXISTS `specifications`;
+
+CREATE TABLE `specifications` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '瑙勬牸id',
+  `number` varchar(25) NOT NULL COMMENT '瑙勬牸缂栧彿',
+  `name` varchar(25) NOT NULL COMMENT '浜у搧瑙勬牸',
+  `instruct` varchar(25) DEFAULT NULL COMMENT '鐢熶骇鎸囦护鍙�',
+  `voltage_level` varchar(30) DEFAULT NULL COMMENT '鐢靛帇绛夌骇',
+  `cross_section` varchar(30) DEFAULT NULL COMMENT '涓荤嚎蹇冩埅闈�',
+  `number_of_cores` varchar(30) DEFAULT NULL COMMENT '涓荤嚎鑺姱鏁�',
+  `spe_state` int(1) NOT NULL DEFAULT '-1' COMMENT '瑙勬牸鐘舵�� 0锛氬仠鐢紱1锛氭甯革紱-1锛氳崏绋�',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃堕棿',
+  `version` int(1) NOT NULL DEFAULT '1',
+  `vel` varchar(15) NOT NULL DEFAULT 'V1.0' COMMENT '瑙勬牸鐗堟湰',
+  `serial_id` varchar(25) NOT NULL COMMENT '鍏宠仈瀛楁 鍨嬪彿id',
+  `user_id` int(10) NOT NULL COMMENT '鍏宠仈瀛楁 鐢ㄦ埛id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `specifications` */
+
+insert  into `specifications`(`id`,`number`,`name`,`instruct`,`voltage_level`,`cross_section`,`number_of_cores`,`spe_state`,`state`,`create_time`,`update_time`,`version`,`vel`,`serial_id`,`user_id`) values 
+(1,'111','ab','test','1','test','test',0,1,'2023-07-12 00:00:12','2023-07-21 09:52:22',1,'V1.0','230711000002',7),
+(2,'abc','AB','abc','abc','abc','abc',0,1,'2023-07-12 00:00:12','2023-07-20 16:34:38',1,'V1.0','230711000002',7),
+(4,'abc','AB','abc','abc','abc','abc',1,1,'2023-07-12 00:00:12','2023-07-20 11:00:29',1,'V1.0','ModelNumber003',7),
+(5,'abc','AB','abc','abc','abc','abc',1,1,'2023-07-12 00:00:12','2023-07-20 10:22:42',1,'V1.0','PleasantGoat',7),
+(6,'modelId','AB','test','test','test','test',-1,1,'2023-07-20 13:42:40','2023-07-20 13:42:40',1,'V1.0','230711000002',7),
+(7,'modelID1','test','test','test','test','test',-1,1,'2023-07-20 14:02:26','2023-07-20 14:02:26',1,'V1.0','230711000002',7),
+(8,'modelId2','test11','test','test','test','test',-1,1,'2023-07-20 14:03:54','2023-07-20 14:03:54',1,'V1.0','230711000002',7),
+(9,'111222','鍏夌氦2.0.3','test','test','test','test',-1,1,'2023-07-20 14:55:12','2023-07-20 14:55:12',1,'V1.0','230711000002',7);
+
+/*Table structure for table `standards` */
+
+DROP TABLE IF EXISTS `standards`;
+
+CREATE TABLE `standards` (
+  `id` varchar(15) NOT NULL COMMENT '鏍囧噯缂栧彿 yyMMdd000001(000001++)',
+  `name` varchar(25) NOT NULL COMMENT '鏍囧噯鍚嶇О',
+  `eng_name` varchar(25) NOT NULL COMMENT '鑻辨枃鍚嶇О',
+  `type` int(1) NOT NULL COMMENT '0锛氬師鏉愭枡锛�1锛氱數绾跨數缂�',
+  `state` int(1) NOT NULL DEFAULT '1' COMMENT '閫昏緫瀛楁 0锛氬垹闄わ紱1锛氭甯�',
+  `create_time` datetime NOT NULL COMMENT '鐢熸晥鏃ユ湡',
+  `update_time` datetime NOT NULL COMMENT '鏇存柊鏃ユ湡',
+  `version` int(1) NOT NULL DEFAULT '1',
+  `user_id` int(10) NOT NULL COMMENT '鍏宠仈瀛楁 鏇存柊浜篿d',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `standards` */
+
+insert  into `standards`(`id`,`name`,`eng_name`,`type`,`state`,`create_time`,`update_time`,`version`,`user_id`) values 
+('111','123131313','164654565',0,0,'2023-07-20 13:26:55','2023-07-20 15:20:09',1,7),
+('112233445566','楸奸奔','fish',1,0,'2023-07-20 10:54:12','2023-07-20 15:19:41',1,7),
+('230711000001','灏忕櫧','OpticalFibre',1,1,'2023-07-11 21:27:04','2023-07-20 09:28:19',1,6),
+('230711000002','鏉愭枡','OpticalFibrw',1,1,'2023-07-11 21:27:04','2023-07-20 10:22:42',1,6),
+('230711000003','鏄剧ず灞�','Monitor',2,1,'2023-07-18 13:43:52','2023-07-18 13:43:52',1,7),
+('230711000004','灏忛粦','Black',2,1,'2023-07-18 13:44:29','2023-07-18 13:44:29',1,7);
+
+/*Table structure for table `user` */
+
+DROP TABLE IF EXISTS `user`;
+
+CREATE TABLE `user` (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '鐢ㄦ埛id',
+  `account` varchar(20) NOT NULL COMMENT '璐﹀彿',
+  `password` varchar(100) NOT NULL COMMENT '瀵嗙爜',
+  `name` varchar(20) NOT NULL COMMENT '濮撳悕',
+  `phone` varchar(11) DEFAULT NULL COMMENT '鎵嬫満鍙�',
+  `email` varchar(30) DEFAULT NULL COMMENT '閭',
+  `age` int(3) DEFAULT NULL COMMENT '骞撮緞',
+  `job_state` int(1) NOT NULL DEFAULT '1' COMMENT '鍦ㄨ亴鐘舵�� 姝e父>=1,绂昏亴<=0',
+  `info` varchar(100) DEFAULT NULL COMMENT '涓�х鍚�',
+  `create_time` datetime NOT NULL,
+  `update_time` datetime NOT NULL,
+  `version` int(1) NOT NULL DEFAULT '1',
+  `role_id` int(10) NOT NULL,
+  `enterprise_id` int(10) NOT NULL COMMENT '鍏宠仈 浼佷笟ID',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `account_unique` (`account`)
+) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4;
+
+/*Data for the table `user` */
+
+insert  into `user`(`id`,`account`,`password`,`name`,`phone`,`email`,`age`,`job_state`,`info`,`create_time`,`update_time`,`version`,`role_id`,`enterprise_id`) values 
+(7,'123456','123456','灏忓皬','12345678981','12345678@qq.com',23,1,NULL,'2023-07-11 09:14:50','2023-07-11 09:14:50',1,1,1),
+(9,'1388967','123456','楸奸奔','19727565533','1981343953@qq.com',18,1,NULL,'2023-07-13 14:51:41','2023-07-13 14:51:41',1,1,1),
+(10,'1111111','123456','鍙彯褰�','17726824629','13958368246@gmail.com',13,1,NULL,'2023-07-13 14:57:23','2023-07-13 14:57:23',1,0,1),
+(11,'135686632','123456','鍙彯褰�','13795639054','19813438642@qq.com',18,1,NULL,'2023-07-13 14:58:45','2023-07-13 14:58:45',1,1,1),
+(12,'333','123456','楸奸奔','72398','2144',36,1,NULL,'2023-07-13 15:21:34','2023-07-13 15:21:34',1,0,1),
+(13,'199999','123456','楸奸奔','2154364646','18913908',34,1,NULL,'2023-07-13 15:22:16','2023-07-13 15:22:16',1,1,1),
+(14,'8957824','123456','寮犱笁','23875185298','2222222872',13,1,NULL,'2023-07-13 15:29:13','2023-07-13 15:29:13',1,1,1),
+(21,'45612345','123456','灏忛粦','12345678981','12345678@qq.com',23,1,NULL,'2023-07-17 10:36:23','2023-07-17 10:36:23',1,1,1),
+(23,'4561278345','123456','灏忛粦','12345678981','12345678@qq.com',23,1,NULL,'2023-07-17 11:28:50','2023-07-17 11:28:50',1,1,1);
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
diff --git a/standard-server/pom.xml b/standard-server/pom.xml
new file mode 100644
index 0000000..617d5f9
--- /dev/null
+++ b/standard-server/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>standard-server</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>standard-library</name>
+    <description>standard-library</description>
+
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>framework</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>user-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java
new file mode 100644
index 0000000..8a89867
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java
@@ -0,0 +1,65 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
+import com.yuanchu.limslaboratory.service.MaterialService;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Api(tags = "鏍囧噯搴�-->1銆佺墿鏂�")
+@RestController
+@RequestMapping("/material")
+public class MaterialController {
+
+    @Autowired
+    private MaterialService materialService;
+
+    @ApiOperation("娣诲姞鐗╂枡")
+    @PostMapping("/add")
+    public Result<?> addMaterialInformation(@Validated @RequestBody AddMaterialDto addMaterialDto) {
+        Integer isMaterialSuccess = materialService.addMaterialInformation(addMaterialDto);
+        if (isMaterialSuccess == 1) {
+            return Result.success("娣诲姞鐗╂枡銆�"+ addMaterialDto.getMaterialName() +"銆戞垚鍔燂紒");
+        }
+        return Result.fail("娣诲姞鐗╂枡銆�"+ addMaterialDto.getMaterialName() +"銆戝け璐ワ紒");
+    }
+
+    @ApiOperation("鏍规嵁鐗╂枡ID鍒犻櫎鐗╂枡")
+    @DeleteMapping("/delete")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(value = "鐗╂枡ID", name = "materialId", dataTypeClass = Integer.class)
+    })
+    public Result<?> deleteMaterialInformation(Integer materialId) {
+        Integer isDeleteMaterialSuccess = materialService.deleteMaterialInformation(materialId);
+        if (isDeleteMaterialSuccess == 1) {
+            return Result.success("鍒犻櫎鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎澶辫触锛�");
+    }
+
+    @ApiOperation(value = "鏍囧噯搴�-->鐗╂枡-->渚ц竟鏍忓洓绾у睍寮�", tags = "猸愨瓙猸愬悗绔皟鏁�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(value = "鍨嬪彿/鍨嬪彿鍚嶇О", name = "specificationName", dataTypeClass = String.class)
+    })
+    @GetMapping("/list")
+    public Result<?> getFourLevelInformation(String specificationName) {
+        List<Map<String, Object>> fourLevelInformation = materialService.getFourLevelInformation(specificationName);
+        return Result.success(fourLevelInformation);
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java
new file mode 100644
index 0000000..5853e6a
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java
@@ -0,0 +1,57 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.service.ProductService;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Api(tags = "鏍囧噯搴�-->4銆侀」鐩�")
+@RestController
+@RequestMapping("/product")
+public class ProductController {
+
+    @Autowired
+    private ProductService productService;
+
+    @ApiOperation("1銆佸垎椤垫煡璇㈤」鐩�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "specificationsId", value = "瑙勬牸鍨嬪彿ID", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(value = "鍘熸潗鏂欑紪鐮�/鍘熸潗鏂欏悕绉�", name = "productCodeOrName", dataTypeClass = String.class)
+    })
+    @GetMapping("/page")
+    public Result<?> pageProductInformation(Integer pageNo, Integer pageSize, Integer specificationsId, String productCodeOrName) {
+        IPage<Map<String, Object>> maps = productService.pageProductInformation(productCodeOrName, specificationsId, new Page<Objects>(pageNo, pageSize));
+        Map<String, Object> map = new HashMap<>();
+        map.put("row", maps.getRecords());
+        map.put("total", maps.getTotal());
+        return Result.success(map);
+    }
+
+    @ApiOperation("2銆佹牴鎹埗绫绘煡瀛愮被")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(value = "鐖剁被鍚嶇О", name = "fatherName", dataTypeClass = String.class)
+    })
+    @GetMapping("/father")
+    public Result<?> pageFatherNameProductInformation(String fatherName) {
+        List<Map<String, Object>> maps = productService.pageFatherNameProductInformation(fatherName);
+        return Result.success(maps);
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java
new file mode 100644
index 0000000..4be696a
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java
@@ -0,0 +1,54 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import com.yuanchu.limslaboratory.service.SpecificationsService;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Api(tags = "鏍囧噯搴�-->3銆佷骇鍝佽鏍�")
+@RestController
+@RequestMapping("/specifications")
+public class SpecificationsController {
+
+    @Autowired
+    private SpecificationsService specificationsService;
+
+    @ApiOperation("娣诲姞鐗╂枡")
+    @PostMapping("/add")
+    public Result<?> addSpecificationsInformation(@Validated @RequestBody AddSpecifications addSpecifications) {
+        Integer isMaterialSuccess = specificationsService.addSpecificationsInformation(addSpecifications);
+        if (isMaterialSuccess == 1) {
+            return Result.success("娣诲姞鐗╂枡銆�"+ addSpecifications.getSpecificationsName() +"銆戞垚鍔燂紒");
+        }
+        return Result.fail("娣诲姞鐗╂枡銆�"+ addSpecifications.getSpecificationsName() +"銆戝け璐ワ紒");
+    }
+
+    @ApiOperation("鍒犻櫎浜у搧瑙勬牸")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "specificationsId", value = "瑙勬牸Id", dataTypeClass = Integer.class, required = true)
+    })
+    @DeleteMapping("/delete")
+    public Result<?> deleteSpecificationsInformation(Integer specificationsId) {
+        Integer isStandardsSuccess = specificationsService.deleteSpecifications(specificationsId);
+        if (isStandardsSuccess == 1) {
+            return Result.success("鍒犻櫎鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎澶辫触锛�");
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java
new file mode 100644
index 0000000..665f006
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java
@@ -0,0 +1,47 @@
+package com.yuanchu.limslaboratory.controller;
+
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import com.yuanchu.limslaboratory.service.StandardService;
+import com.yuanchu.limslaboratory.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Api(tags = "鏍囧噯搴�-->2銆佹爣鍑�")
+@RestController
+@RequestMapping("/standards")
+public class StandardController {
+
+    @Autowired
+    private StandardService standardService;
+
+    @ApiOperation("娣诲姞鐗╂枡")
+    @PostMapping("/add")
+    public Result<?> addStandardInformation(@Validated @RequestBody AddStandardDto addStandardDto) {
+        Integer isMaterialSuccess = standardService.addStandardInformation(addStandardDto);
+        if (isMaterialSuccess == 1) {
+            return Result.success("娣诲姞鐗╂枡銆�"+ addStandardDto.getStandardName() +"銆戞垚鍔燂紒");
+        }
+        return Result.fail("娣诲姞鐗╂枡銆�"+ addStandardDto.getStandardName() +"銆戝け璐ワ紒");
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎鏁版嵁")
+    @DeleteMapping("/delete")
+    public Result<?> deleteStandardsInformation(Integer standardsId) {
+        Integer isDeleteMaterialSuccess = standardService.deleteStandardInformation(standardsId);
+        if (isDeleteMaterialSuccess == 1) {
+            return Result.success("鍒犻櫎鎴愬姛锛�");
+        }
+        return Result.fail("鍒犻櫎澶辫触锛�");
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java
new file mode 100644
index 0000000..0408808
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.pojo.Material;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+public interface MaterialMapper extends BaseMapper<Material> {
+
+    //鏌ヨ鐗╂枡淇℃伅
+    List<Map> selectMaterialLimit(int num1,int num2, int type);
+
+    //鏍规嵁鐗╂枡id鏌ヨ鐗╂枡淇℃伅
+    Map selectMaterialById(String materialId);
+
+    // 鍥涚骇鏍�
+    List<Map<String, Object>> FourTree(String specificationsName);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java
new file mode 100644
index 0000000..cbf5b02
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Product;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+public interface ProductMapper extends BaseMapper<Product> {
+
+    //鏍规嵁鐗╂枡id鏌ヨ妫�楠岄」鐩�
+    List<Map> selectProductByMaterialId(int materialId);
+
+    IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page);
+
+    Map<String, Object> selectOneChildren(Object father);
+
+    Map<String, Object> getProductInformation(Integer productId);
+
+    //閫氳繃椤圭洰鍚嶆煡璇㈤」鐩殑璇曢獙鏂规硶
+    List<Map> selectInstrumentByProname(String name);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java
new file mode 100644
index 0000000..3db0724
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java
@@ -0,0 +1,24 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Specifications;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+public interface SpecificationsMapper extends BaseMapper<Specifications> {
+
+    Map<String, Object> selectSNameSNName(int materialId);
+
+    IPage<Map<String, Objects>> listSpecificationsInformation(String specificationsName, String serialNumberId, Page<Objects> page);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java
new file mode 100644
index 0000000..8450941
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java
@@ -0,0 +1,24 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Standard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+public interface StandardMapper extends BaseMapper<Standard> {
+
+    IPage<Map<String, Object>> listPageStandardsInformation(Page<Object> page, String idOrNameOfStandards);
+
+    List<Map<String, Object>> getSpecificationIdAndName(String materialId);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java
new file mode 100644
index 0000000..f76bc42
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java
@@ -0,0 +1,61 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Accessors(chain = true)
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Material瀵硅薄", description="")
+public class Material implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鐗╂枡id", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鐗╂枡缂栫爜", hidden = true)
+    private String code;
+
+    @ApiModelProperty(value = "鐗╂枡鍚嶇О", example = "鐭冲ご", required = true)
+    private String name;
+
+    @ApiModelProperty(value = "0锛氬師鏉愭枡锛�1锛氭垚鍝侊紱2锛氬崐鎴愬搧", example = "1", required = true)
+    private Integer type;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java
new file mode 100644
index 0000000..707d80e
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java
@@ -0,0 +1,70 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Product瀵硅薄", description="")
+public class Product implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "椤圭洰id", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "椤圭洰鍚嶇О", example = "鍗曚綅闀垮害璐ㄩ噺", required = true)
+    private String name;
+
+    @ApiModelProperty(value = "椤圭洰鐖剁被", example = "閾濆寘閽㈣姱閾濈粸绾�")
+    private String father;
+
+    @ApiModelProperty(value = "鍗曚綅", example = "km", required = true)
+    private String unit;
+
+    @ApiModelProperty(value = "鏍囧噯鍊�", example = "<=0.3458", required = true)
+    private String required;
+
+    @ApiModelProperty(value = "鍐呮帶鍊�", example = "<=0.3458", required = true)
+    private String internal;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    private Integer version;
+
+    @ApiModelProperty(value = "鍏宠仈 鐗╂枡id", example = "1", hidden = true)
+    private Integer specifications_id;
+
+
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java
new file mode 100644
index 0000000..def7e4d
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java
@@ -0,0 +1,61 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Specifications瀵硅薄", description="瑙勬牸")
+public class Specifications implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鍨嬪彿id", hidden = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "浜у搧鍨嬪彿鍚嶇О", example = "AB", required = true)
+    private String name;
+
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    @TableLogic(value = "1", delval = "0")
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    @Version
+    private Integer version;
+
+    @ApiModelProperty(value = "鍏宠仈瀛楁 瑙勬牸id", hidden = true)
+    private Integer standardId;
+
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java
new file mode 100644
index 0000000..d4345d8
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java
@@ -0,0 +1,59 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Standards瀵硅薄", description="鏍囧噯")
+public class Standard implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "瑙勬牸缂栧彿 yyMMdd000001(000001++)", example = "230711000001", required = true)
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "瑙勬牸鍚嶇О", example = "鍏夌氦", required = true)
+    private String name;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0", hidden = true)
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "涔愯閿�", hidden = true)
+    @Version
+    private Integer version;
+
+    @ApiModelProperty(value = "鐗╂枡Id", hidden = true)
+    private Integer materialId;
+
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java
new file mode 100644
index 0000000..d3ce5ae
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java
@@ -0,0 +1,31 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="AddMaterialDto瀵硅薄", description="")
+public class AddMaterialDto {
+
+    @NotNull(message = "鐗╂枡绫诲瀷涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "0锛氬師鏉愭枡锛�1锛氭垚鍝侊紱2锛氬崐鎴愬搧", example = "1", required = true)
+    private Integer type;
+
+    @NotBlank(message = "鐗╂枡鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "鐗╂枡鍚嶇О", example = "鐭冲ご", required = true)
+    private String materialName;
+
+    @NotBlank(message = "鏍囧噯鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "鏍囧噯鍚嶇О", example = "鍏夌氦", required = true)
+    private String standardName;
+
+    @NotBlank(message = "浜у搧瑙勬牸鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "浜у搧瑙勬牸鍚嶇О", example = "AB", required = true)
+    private String specificationsName;
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java
new file mode 100644
index 0000000..413c9bd
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java
@@ -0,0 +1,23 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="AddSpecifications瀵硅薄", description="")
+public class AddSpecifications {
+
+    @NotNull(message = "鏍囧噯ID涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "鏍囧噯id", example = "1", required = true)
+    private Integer standardId;
+
+    @NotBlank(message = "浜у搧瑙勬牸鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "浜у搧瑙勬牸鍚嶇О", example = "AB", required = true)
+    private String specificationsName;
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java
new file mode 100644
index 0000000..2fe0eb6
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java
@@ -0,0 +1,28 @@
+package com.yuanchu.limslaboratory.pojo.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="AddStandardDto瀵硅薄", description="")
+public class AddStandardDto {
+
+    @NotNull(message = "鐗╂枡ID涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "鐗╂枡id", example = "1", required = true)
+    private Integer materialId;
+
+    @NotBlank(message = "鏍囧噯鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "鏍囧噯鍚嶇О", example = "鍏夌氦", required = true)
+    private String standardName;
+
+    @NotBlank(message = "浜у搧瑙勬牸鍚嶇О涓嶈兘涓虹┖锛�")
+    @ApiModelProperty(value = "浜у搧瑙勬牸鍚嶇О", example = "AB", required = true)
+    private String specificationsName;
+
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java
new file mode 100644
index 0000000..56e5501
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java
@@ -0,0 +1,42 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.Material;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+public interface MaterialService extends IService<Material> {
+
+    List<Map> selectMaterialLimit(int pageSize,int countSize, int type);
+
+
+    /**
+     * 鍒犻櫎绛変簬MaterialId鐨勬暟鎹�
+     * @param materialId
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    Integer deleteMaterialInformation(Integer materialId);
+
+    /**
+     * 涓夌骇娣诲姞鍙傛暟
+     */
+    @Transactional(rollbackFor = Exception.class)
+    Integer addMaterialInformation(AddMaterialDto addMaterialDto);
+
+    /**
+     * 鍥涚骇鍒嗗眰鏄剧ず
+     */
+    List<Map<String, Object>> getFourLevelInformation(String specificationName);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java
new file mode 100644
index 0000000..8fbb6af
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Product;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+public interface ProductService extends IService<Product> {
+    void deleteProductInformation(List<Integer> SpecificationsId);
+
+    IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page);
+
+    List<Map<String, Object>> pageFatherNameProductInformation(String fatherName);
+
+    /**
+     * 閫氳繃椤圭洰鍚嶆煡璇㈤」鐩殑璇曢獙鏂规硶
+     * @param name
+     * @return
+     */
+    List<Map> selectInstrumentByProname(String name);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java
new file mode 100644
index 0000000..5da007f
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java
@@ -0,0 +1,33 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yuanchu.limslaboratory.pojo.Specifications;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.Standard;
+import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+public interface SpecificationsService extends IService<Specifications> {
+    /**
+     * 澶氳〃鍒犻櫎锛岃〃鏍煎垎鍒湁锛歋pecification --> Material --> Product
+     * @param specificationsId
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    Integer deleteSpecifications(Integer specificationsId);
+
+    List<Integer> StandardIdDeleteSpecifications(List<Integer> deleteStandard);
+
+    Integer addSpecificationsInformation(AddSpecifications addStandardDto);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java
new file mode 100644
index 0000000..6e68274
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java
@@ -0,0 +1,35 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.Standard;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import io.swagger.models.auth.In;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+public interface StandardService extends IService<Standard> {
+
+    /**
+     * 鏍规嵁鏍囧噯Id鍒犻櫎鏁版嵁
+     * @param materialId
+     * @return
+     */
+    List<Integer> deleteStandardsInformation(Integer materialId);
+
+    @Transactional(rollbackFor = Exception.class)
+    Integer deleteStandardInformation(Integer standardsId);
+
+    Integer addStandardInformation(AddStandardDto addStandardDto);
+
+    List<Map<String, Object>> getSpecificationIdAndName(String materialId);
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java
new file mode 100644
index 0000000..4b75748
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java
@@ -0,0 +1,103 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.yuanchu.limslaboratory.pojo.Material;
+import com.yuanchu.limslaboratory.mapper.MaterialMapper;
+import com.yuanchu.limslaboratory.pojo.Specifications;
+import com.yuanchu.limslaboratory.pojo.Standard;
+import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
+import com.yuanchu.limslaboratory.service.MaterialService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.service.ProductService;
+import com.yuanchu.limslaboratory.service.SpecificationsService;
+import com.yuanchu.limslaboratory.service.StandardService;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Service
+public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
+
+    @Resource
+    private MaterialMapper materialMapper;
+
+    @Autowired
+    private StandardService standardService;
+
+    @Autowired
+    private SpecificationsService specificationsService;
+
+    @Autowired
+    private ProductService productService;
+
+    //鏌ヨ鐗╂枡淇℃伅
+    @Override
+    public List<Map> selectMaterialLimit(int pageSize, int countSize, int type) {
+        return materialMapper.selectMaterialLimit((pageSize - 1) * countSize,pageSize * countSize, type);
+    }
+
+
+
+    @Override
+    public Integer deleteMaterialInformation(Integer materialId) {
+        LambdaUpdateWrapper<Material> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Material::getId, materialId);
+        updateWrapper.set(Material::getState, 0);
+        int isDeleteSuccess = materialMapper.update(new Material(), updateWrapper);
+        if (isDeleteSuccess == 1){
+            List<Integer> isDeleteStandard = standardService.deleteStandardsInformation(materialId);
+            if (!ObjectUtils.isEmpty(isDeleteStandard)){
+                List<Integer> idDeleteSpecifications = specificationsService.StandardIdDeleteSpecifications(isDeleteStandard);
+                if (!ObjectUtils.isEmpty(idDeleteSpecifications)){
+                    productService.deleteProductInformation(idDeleteSpecifications);
+                }
+            }
+            return 1;
+        }
+        return 0;
+    }
+
+    @Override
+    public Integer addMaterialInformation(AddMaterialDto addMaterialDto) {
+        Material material = new Material()
+                .setCode("BZ" + IdWorker.getIdStr())
+                .setName(addMaterialDto.getMaterialName())
+                .setType(addMaterialDto.getType());
+        int isInsertSuccess = materialMapper.insert(material);
+        if (isInsertSuccess > 0){
+            Standard standard = new Standard()
+                    .setMaterialId(material.getId())
+                    .setName(addMaterialDto.getStandardName());
+            boolean save = standardService.save(standard);
+            if (save){
+                Specifications specifications = new Specifications()
+                        .setName(addMaterialDto.getSpecificationsName())
+                        .setStandardId(standard.getId());
+                boolean save1 = specificationsService.save(specifications);
+                if (save1)
+                    return 1;
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> getFourLevelInformation(String specificationName) {
+        return materialMapper.FourTree(specificationName);
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java
new file mode 100644
index 0000000..b82da28
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java
@@ -0,0 +1,79 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.Product;
+import com.yuanchu.limslaboratory.mapper.ProductMapper;
+import com.yuanchu.limslaboratory.service.ProductService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.yuanchu.limslaboratory.service.UserService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-17
+ */
+@Service
+public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
+
+    @Resource
+    private ProductMapper productMapper;
+
+    @Override
+    public void deleteProductInformation(List<Integer> SpecificationsId) {
+        for (Integer materialId : SpecificationsId){
+            LambdaUpdateWrapper<Product> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(Product::getSpecifications_id, materialId);
+            wrapper.set(Product::getState, 0);
+            productMapper.update(new Product(), wrapper);
+        }
+    }
+
+    @Override
+    public IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page) {
+        IPage<Map<String, Object>> iPage = productMapper.pageProductInformation(productCodeOrName, specificationsId, page);
+        List<Map<String, Object>> maps = iPage.getRecords();
+        maps.forEach(map -> {
+            int num = Integer.parseInt(map.get("num").toString());
+            boolean children = false;
+            if (num > 1){
+                children = true;
+            } else {
+                Map<String, Object> product = productMapper.selectOneChildren(map.get("father"));
+                map.putAll(product);
+            }
+            map.put("children", children);
+            map.remove("num");
+        });
+        return iPage;
+    }
+
+    @Override
+    public List<Map<String, Object>> pageFatherNameProductInformation(String fatherName) {
+        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Product::getFather, fatherName);
+        wrapper.select(Product::getId, Product::getName, Product::getUnit, Product::getRequired, Product::getInternal);
+        return productMapper.selectMaps(wrapper);
+    }
+
+    //閫氳繃椤圭洰鍚嶆煡璇㈤」鐩殑璇曢獙鏂规硶
+    @Override
+    public List<Map> selectInstrumentByProname(String name) {
+        return productMapper.selectInstrumentByProname(name);
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java
new file mode 100644
index 0000000..93be8b1
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java
@@ -0,0 +1,78 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.yuanchu.limslaboratory.pojo.Specifications;
+import com.yuanchu.limslaboratory.mapper.SpecificationsMapper;
+import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import com.yuanchu.limslaboratory.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Service
+public class SpecificationsServiceImpl extends ServiceImpl<SpecificationsMapper, Specifications> implements SpecificationsService {
+
+    @Resource
+    private SpecificationsMapper specificationsMapper;
+
+    @Autowired
+    private ProductService productService;
+
+    @Override
+    public Integer deleteSpecifications(Integer specificationsId) {
+        LambdaUpdateWrapper<Specifications> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Specifications::getId, specificationsId);
+        updateWrapper.set(Specifications::getState, 0);
+        List<Integer> list = new ArrayList<>();
+        list.add(specificationsId);
+        int isDeleteSuccess = specificationsMapper.update(new Specifications(), updateWrapper);
+        if (isDeleteSuccess == 1){
+            productService.deleteProductInformation(list);
+            return 1;
+        }
+        return 0;
+    }
+
+    @Override
+    public List<Integer> StandardIdDeleteSpecifications(List<Integer> deleteStandard) {
+        List<Integer> list = new ArrayList<>();
+        for (Integer standard : deleteStandard){
+            LambdaQueryWrapper<Specifications> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(Specifications::getStandardId, standard);
+            wrapper.select(Specifications::getId);
+            List<Specifications> maps1 = specificationsMapper.selectList(wrapper);
+            for (Specifications specifications:maps1){
+                LambdaUpdateWrapper<Specifications> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper.eq(Specifications::getId, specifications.getId());
+                updateWrapper.set(Specifications::getState, 0);
+                specificationsMapper.update(new Specifications(), updateWrapper);
+                list.add(specifications.getId());
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public Integer addSpecificationsInformation(AddSpecifications addStandardDto) {
+        Specifications specifications = new Specifications()
+                .setName(addStandardDto.getSpecificationsName())
+                .setStandardId(addStandardDto.getStandardId());
+        return specificationsMapper.insert(specifications);
+    }
+}
diff --git a/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java
new file mode 100644
index 0000000..7b13059
--- /dev/null
+++ b/standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java
@@ -0,0 +1,100 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.yuanchu.limslaboratory.mapper.StandardMapper;
+import com.yuanchu.limslaboratory.pojo.Material;
+import com.yuanchu.limslaboratory.pojo.Specifications;
+import com.yuanchu.limslaboratory.pojo.Standard;
+import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
+import com.yuanchu.limslaboratory.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-11
+ */
+@Service
+public class StandardServiceImpl extends ServiceImpl<StandardMapper, Standard> implements StandardService {
+
+    @Resource
+    private StandardMapper standardMapper;
+
+    @Lazy
+    @Autowired
+    private SpecificationsService specificationsService;
+
+    @Autowired
+    private ProductService productService;
+
+
+    @Override
+    public List<Integer> deleteStandardsInformation(Integer materialId) {
+        LambdaQueryWrapper<Standard> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Standard::getMaterialId, materialId);
+        wrapper.select(Standard::getId);
+        List<Integer> list = new ArrayList<>();
+        List<Standard> standards = standardMapper.selectList(wrapper);
+        for (Standard standard : standards){
+            LambdaUpdateWrapper<Standard> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(Standard::getMaterialId, materialId);
+            updateWrapper.set(Standard::getState, 0);
+            standardMapper.update(new Standard(), updateWrapper);
+            list.add(standard.getId());
+        }
+        return list;
+    }
+
+    @Override
+    public Integer deleteStandardInformation(Integer standardsId) {
+        LambdaUpdateWrapper<Standard> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(Standard::getId, standardsId);
+        updateWrapper.set(Standard::getState, 0);
+        List<Integer> list = new ArrayList<>();
+        int isDeleteSuccess = standardMapper.update(new Standard(), updateWrapper);
+        if (isDeleteSuccess == 1){
+            list.add(standardsId);
+            List<Integer> idDeleteSpecifications = specificationsService.StandardIdDeleteSpecifications(list);
+            if (!ObjectUtils.isEmpty(idDeleteSpecifications)){
+                productService.deleteProductInformation(idDeleteSpecifications);
+            }
+            return 1;
+        }
+        return 0;
+    }
+
+    @Override
+    public Integer addStandardInformation(AddStandardDto addStandardDto) {
+        Standard standard = new Standard()
+                .setMaterialId(addStandardDto.getMaterialId())
+                .setName(addStandardDto.getStandardName());
+        int save = standardMapper.insert(standard);
+        if (save == 1){
+            Specifications specifications = new Specifications()
+                    .setName(addStandardDto.getSpecificationsName())
+                    .setStandardId(standard.getId());
+            boolean save1 = specificationsService.save(specifications);
+            if (save1)
+                return 1;
+        }
+        return 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> getSpecificationIdAndName(String materialId) {
+        return standardMapper.getSpecificationIdAndName(materialId);
+    }
+}
diff --git a/standard-server/src/main/resources/mapper/MaterialMapper.xml b/standard-server/src/main/resources/mapper/MaterialMapper.xml
new file mode 100644
index 0000000..661b8fd
--- /dev/null
+++ b/standard-server/src/main/resources/mapper/MaterialMapper.xml
@@ -0,0 +1,70 @@
+<?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="com.yuanchu.limslaboratory.mapper.MaterialMapper">
+
+    <select id="selectMaterialLimit" resultType="Map">
+        select id,code, name
+        from lims_laboratory.material
+        where state = 1
+        and type = #{type}
+        order by create_time desc
+            limit #{num1},#{num2}
+    </select>
+    <select id="selectMaterialById" resultType="Map">
+        select m.id,
+               m.num,
+               m.supplier,
+               m.name,
+               m.location,
+               m.batch,
+               m.reel_number                reelNumber,
+               concat(s.name, '/', sn.name) specificationSerialNum,
+               s.voltage_level              voltageLevel,
+               s.cross_section              crossSection,
+               s.number_of_cores            numberOfCores,
+               s.instruct
+        from lims_laboratory.material m,
+             lims_laboratory.specifications s,
+             lims_laboratory.serial_number sn
+        where m.specifications_id = s.id
+          and s.serial_id = sn.id
+          and m.id=#{materialId}
+    </select>
+
+    <resultMap id="OneLevelTreeMap" type="Map">
+        <id property="id" column="materialId"/>
+        <result property="name" column="materialName"/>
+        <collection property="children" resultMap="TwoLevelTreeMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="TwoLevelTreeMap" type="Map">
+        <id property="id" column="standardId"/>
+        <result property="name" column="standardName"/>
+        <collection property="children" resultMap="ThreeLevelTreeMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="ThreeLevelTreeMap" type="Map">
+        <id property="id" column="specificationsId"/>
+        <result property="name" column="specificationsName"/>
+        <collection property="children" resultMap="FourLevelTreeMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="FourLevelTreeMap" type="Map">
+        <id property="id" column="productId"/>
+        <result property="name" column="productName"/>
+    </resultMap>
+
+    <select id="FourTree" resultMap="OneLevelTreeMap">
+        SELECT m.`id` materialId, m.`name` materialName, s.`id` standardId, s.`name` standardName,
+               f.`id` specificationsId, f.`name` specificationsName, p.`id` productId, p.`name` productName
+        FROM material m
+                 LEFT JOIN (SELECT s.`id`, s.`name`, s.`material_id` FROM standard s WHERE s.`state` = 1) s ON m.id = s.`material_id`
+                 LEFT JOIN (SELECT f.`id`, f.`name`, f.`standard_id` FROM specifications f WHERE f.`state` = 1
+                                                                                             <if test="specificationsName != null and specificationsName != ''">
+                                                                                                 AND f.`name` = #{specificationsName}
+                                                                                             </if>
+                                                                                           ) f ON s.`id` = f.`standard_id`
+                 LEFT JOIN (SELECT p.`id`, p.`name`, p.`specifications_id` FROM product p WHERE p.`state` = 1) p ON f.`id` = p.`specifications_id`
+        WHERE m.`state` = 1
+    </select>
+</mapper>
diff --git a/standard-server/src/main/resources/mapper/ProductMapper.xml b/standard-server/src/main/resources/mapper/ProductMapper.xml
new file mode 100644
index 0000000..e7d4c70
--- /dev/null
+++ b/standard-server/src/main/resources/mapper/ProductMapper.xml
@@ -0,0 +1,29 @@
+<?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="com.yuanchu.limslaboratory.mapper.ProductMapper">
+
+    <select id="pageProductInformation" resultType="map">
+        SELECT COUNT(1) num, p.`father`
+        FROM product p
+        WHERE p.`specifications_id` = #{specificationsId}
+        <if test="productCodeOrName != null and productCodeOrName != ''">
+            AND p.`father` = #{productCodeOrName}
+        </if>
+        GROUP BY p.`father`
+    </select>
+
+    <select id="selectOneChildren" resultType="map">
+        SELECT p.`id`, p.`name`, p.`unit`, p.`required`, p.`internal`
+        FROM product p
+        WHERE p.`father` = #{father}
+    </select>
+    <select id="selectProductByMaterialId" resultType="Map">
+        select p.name,unit,required,internal
+        from lims_laboratory.product p,
+             lims_laboratory.specifications sp,
+             lims_laboratory.standard st
+        where specifications_id=sp.id
+          and standard=st.id
+        and material_id=#{materialId}
+    </select>
+</mapper>
diff --git a/standard-server/src/main/resources/mapper/SpecificationsMapper.xml b/standard-server/src/main/resources/mapper/SpecificationsMapper.xml
new file mode 100644
index 0000000..4daa5c5
--- /dev/null
+++ b/standard-server/src/main/resources/mapper/SpecificationsMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.yuanchu.limslaboratory.mapper.SpecificationsMapper">
+
+</mapper>
diff --git a/standard-server/src/main/resources/mapper/StandardMapper.xml b/standard-server/src/main/resources/mapper/StandardMapper.xml
new file mode 100644
index 0000000..b232854
--- /dev/null
+++ b/standard-server/src/main/resources/mapper/StandardMapper.xml
@@ -0,0 +1,23 @@
+<?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="com.yuanchu.limslaboratory.mapper.StandardMapper">
+
+    <resultMap id="BaseResultMap" type="java.util.Map">
+        <id property="specificationsId" column="specificationsId" jdbcType="INTEGER"/>
+        <result property="specificationsName" column="specificationsName" jdbcType="VARCHAR"/>
+        <collection property="children" resultMap="BaseResultMapChildren" javaType="java.util.List"/>
+    </resultMap>
+    <resultMap id="BaseResultMapChildren" type="java.util.Map">
+        <id property="modelId" column="modelId" jdbcType="INTEGER"/>
+        <result property="modelName" column="modelName" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <select id="getSpecificationIdAndName" resultMap="BaseResultMap">
+        SELECT s.`id` specificationsId, s.`name` specificationsName, f.id modelId, f.name modelName
+        FROM standard s
+                 LEFT JOIN (SELECT f.`id`, f.`name`, f.`standard_id` FROM specifications f WHERE f.`state` = 1) f
+                           ON s.`id` = f.`standard_id`
+        WHERE s.`material_id` = #{materialId}
+          AND s.`state` = 1
+    </select>
+</mapper>
diff --git a/sys/pom.xml b/sys/pom.xml
new file mode 100644
index 0000000..effbb79
--- /dev/null
+++ b/sys/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>sys</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>sys</name>
+    <description>sys</description>
+
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <!--鍩虹妗嗘灦绫�-->
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>framework</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--鐢ㄦ埛鏈嶅姟妯″潡-->
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>user-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--鏍囧噯搴撴ā鍧�-->
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>standard-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--妫�楠屾ā鍧�-->
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>inspection-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--瀹為獙瀹ゆā鍧�-->
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>laboratory-server</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--druid-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+
+        <!--mybatis-plus浠g爜鐢熸垚鍣�-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+        </dependency>
+
+        <!-- framework: mybatis-plus浠g爜鐢熸垚闇�瑕佷竴涓ā鏉垮紩鎿� -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+        <!--mysql-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java b/sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java
new file mode 100644
index 0000000..0807851
--- /dev/null
+++ b/sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java
@@ -0,0 +1,83 @@
+package com.yuanchu.limslaboratory;
+
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.Collections;
+import java.util.Scanner;
+
+// 婕旂ず渚嬪瓙锛屾墽琛� main 鏂规硶鎺у埗鍙拌緭鍏ユā鍧楄〃鍚嶅洖杞﹁嚜鍔ㄧ敓鎴愬搴旈」鐩洰褰曚腑
+public class CodeGenerator {
+
+    public static String database_url = "jdbc:mysql://localhost:3306/mom_ocean?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
+    public static String database_username = "root";
+    public static String database_password= "123456";
+    public static String author = "姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃";
+    public static String model_name = "/inspect-server"; // 濡傛灉涓哄垎甯冨紡濉瓙妯″潡鍚嶇О锛屽鏋滀笉鏄垎甯冨紡涓虹┖鍗冲彲
+    public static String setParent = "com.yuanchu.mom"; // 鍖呰矾寰�
+    public static void main(String[] args) {
+        String projectPath = System.getProperty("user.dir");
+        System.out.println(projectPath+"===================");
+        FastAutoGenerator.create(database_url, database_username, database_password)
+                // 鍏ㄥ眬閰嶇疆
+                .globalConfig(builder -> {
+                    builder.author(author) // 璁剧疆浣滆��
+                            .commentDate("yyyy-MM-dd hh:mm:ss")   //娉ㄩ噴鏃ユ湡
+                            .outputDir(projectPath + model_name + "/src/main/java") // 鎸囧畾杈撳嚭鐩綍
+                            .disableOpenDir() //绂佹鎵撳紑杈撳嚭鐩綍锛岄粯璁ゆ墦寮�
+                    ;
+                })
+                // 鍖呴厤缃�
+                .packageConfig(builder -> {
+                    builder.entity("pojo");
+                    builder.parent(setParent) // 璁剧疆鐖跺寘鍚�
+                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + model_name +  "/src/main/resources/mapper")); // 璁剧疆mapperXml鐢熸垚璺緞
+                })
+                // 绛栫暐閰嶇疆
+                .strategyConfig(builder -> {
+                    builder.addInclude(scanner("琛ㄥ悕锛屽涓┖鏍煎垎鍓�").split(" ")) // 璁剧疆闇�瑕佺敓鎴愮殑琛ㄥ悕
+                            .addTablePrefix("sys_") // 璁剧疆杩囨护琛ㄥ墠缂�
+                            // Entity 绛栫暐閰嶇疆
+                            .entityBuilder()
+                            .enableLombok() //寮�鍚� Lombok
+                            .naming(NamingStrategy.underline_to_camel)  //鏁版嵁搴撹〃鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐锛氫笅鍒掔嚎杞┘宄板懡
+                            .columnNaming(NamingStrategy.underline_to_camel)    //鏁版嵁搴撹〃瀛楁鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐锛氫笅鍒掔嚎杞┘宄板懡
+                            // Mapper 绛栫暐閰嶇疆
+                            .mapperBuilder()
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴愭枃浠�
+                            // Service 绛栫暐閰嶇疆
+                            .serviceBuilder()
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴愭枃浠�
+                            .formatServiceFileName("%sService") //鏍煎紡鍖� service 鎺ュ彛鏂囦欢鍚嶇О锛�%s杩涜鍖归厤琛ㄥ悕锛屽 UserService
+                            .formatServiceImplFileName("%sServiceImpl") //鏍煎紡鍖� service 瀹炵幇绫绘枃浠跺悕绉帮紝%s杩涜鍖归厤琛ㄥ悕锛屽 UserServiceImpl
+                            // Controller 绛栫暐閰嶇疆
+                            .controllerBuilder()
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴愭枃浠�
+                    ;
+                })
+                .execute();
+    }
+
+    /**
+     * <p>
+     * 璇诲彇鎺у埗鍙板唴瀹�
+     * </p>
+     */
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("璇疯緭鍏�" + tip + "锛�");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+
+            if (StringUtils.isNotBlank(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("璇疯緭鍏ユ纭殑" + tip + "锛�");
+    }
+}
diff --git a/sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java b/sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java
new file mode 100644
index 0000000..8485701
--- /dev/null
+++ b/sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java
@@ -0,0 +1,17 @@
+package com.yuanchu.limslaboratory;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@MapperScan("com.yuanchu.limslaboratory.mapper")// 鎵弿Mybatis涓殑mapper鍖�
+@EnableFeignClients("com.yuanchu.limslaboratory.clients") // 鎵弿feign鎺ュ彛鎵�鍦ㄥ寘 閲嶈
+public class SysApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SysApplication.class, args);
+    }
+
+}
diff --git a/sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java b/sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java
new file mode 100644
index 0000000..2ed3705
--- /dev/null
+++ b/sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java
@@ -0,0 +1,190 @@
+package com.yuanchu.limslaboratory.backup;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Component
+@EnableScheduling
+@Slf4j
+public class MysqlDataBackup {
+    /**
+     * 鏁版嵁搴撶増鏈槸鍚︿负 8.0 + 锛坒alse=鍚�  true=鏄級锛� mysql8+ 闇�瑕佸弬鏁�  --column-statistics=0  锛� mysql8- 涓嶉渶瑕�
+     */
+    Boolean isDbVersion8 = false;
+
+    /**
+     * 澶囦唤鍛戒护
+     * USERNAME   璐﹀彿
+     * PASSWORD   瀵嗙爜
+     * SERVERPATH 鏈嶅姟鍣↖P/鍩熷悕
+     * DBNAME     鏁版嵁搴撳悕绉�
+     * FILEPATH   澶囦唤鏂囦欢瀛樻斁鍦板潃+鍚嶇О
+     * 璇存槑
+     * cmdCompression 锛� 闇�鍘嬬缉 锛堟湰鍦版垨鏈嶅姟鍣ㄩ渶瀹夎 mysqldump 鍛戒护(瀹夎mysql鑷甫鎮g嫭绔嬪畨瑁�) +  gzip 鍛戒护(鐙珛瀹夎)锛�
+     * cmd 锛�            涓嶅帇缂� (鏈湴鎴栨湇鍔″櫒闇�瀹夎 mysqldump 鍛戒护(瀹夎mysql鑷甫鎮g嫭绔嬪畨瑁�)
+     * --column-statistics=0     mysql8 娣诲姞璇ュ弬鏁�, 闈瀖ysql8 涓嶆坊鍔�, 鍚﹀垯灏嗗嚭閿�
+     */
+    String cmdMysql8 = "mysqldump --column-statistics=0  -u{USERNAME} -p{PASSWORD} -h{SERVERPATH} -P3306 --databases {DBNAME}"; //  > {FILEPATH}.sql
+    String cmd = "mysqldump -u{USERNAME} -p{PASSWORD} -h{SERVERPATH} -P3306 --databases {DBNAME}";      //  > {FILEPATH}.sql
+
+    /**
+     * 澶囦唤 sql 瀛樻斁鐩綍(鐩稿璺緞, 娉ㄦ剰鍙兘闇�瑕佸湪 MvcConfig 閰嶇疆璁块棶鏉冮檺)
+     */
+    @Value("${backup.path}")
+    private String filePath;
+
+    @Value("${spring.datasource.url}")
+    private String dbUrl;
+
+    @Value("${spring.datasource.username}")
+    private String dbUserName;
+
+    @Value("${spring.datasource.password}")
+    private String dbPassWord;
+
+    @Value("${backup.destiny}")
+    private Integer destiny;
+
+    @Value("${backup.mysqldump}")
+    private String mysqldump;
+
+    /**
+     * 姣忓ぉ鏅氫笂23鐐�05绉掓墽琛� 銆�  0 0 4 1/1 * ? 銆�
+     * 娴嬭瘯 20 绉掍竴娆°��  0/20 * * * * ? 銆慇Scheduled(cron = "5 * 23 * * ?")
+     */
+    @Scheduled(cron = "5 0 23 * * ?")
+    private void configureTasks() {
+        log.info("銆愬浠芥暟鎹簱銆�--START");
+        String dbUrl2 = dbUrl.replace("jdbc:mysql://", "");
+
+        // 鑾峰彇鏁版嵁搴撳悕绉�
+        String dbName = dbUrl2.substring(dbUrl2.lastIndexOf("/") + 1, dbUrl2.indexOf("?"));
+        // 鑾峰彇鏁版嵁搴撳湴鍧�
+        String serverPath = dbUrl2.substring(0, dbUrl2.lastIndexOf(":"));
+        // 鏁版嵁搴撹处鍙�
+        String username = dbUserName;
+        // 鏁版嵁搴撳瘑鐮�
+        String password = dbPassWord;
+
+        // 澶囦唤鏂囦欢鐩綍+鍚嶇О  澶囦唤鏂囦欢瀛樻斁鐩綍+鍚嶇О(鍚嶇О = 鏁版嵁搴撳悕+鏃堕棿瀛楃涓�.sql)
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        String format = simpleDateFormat.format(new Date());
+        String timeStr = format
+                .replaceAll("-", "_")
+                .replaceAll(" ", "_")
+                .replaceAll(":", "");
+        timeStr = timeStr.substring(0, 15);
+        String pathFileName = filePath + "/" + dbName + "_" + timeStr + ".sql";
+        String newCmd = "";
+        if (isDbVersion8) {
+            newCmd = cmdMysql8;
+        } else {
+            newCmd = cmd;
+        }
+        // 鎵ц鍛戒护
+        newCmd = newCmd.replace("{USERNAME}", username)
+                .replace("{PASSWORD}", password)
+                .replace("{SERVERPATH}", serverPath)
+                .replace("{DBNAME}", dbName)
+                .replace("{FILEPATH}", pathFileName);
+        PrintWriter printWriter = null;
+        BufferedReader bufferedReader = null;
+        try {
+            // 鍒涘缓瀛樻斁sql鐨勬枃浠�
+            existsFile(new File(pathFileName));
+            printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(pathFileName), "utf8"));
+            Process process = null;
+            String property = System.getProperty("os.name");
+            System.out.println(property);
+            if (property.indexOf("Linux") != -1) {
+                // linux
+                process = Runtime.getRuntime().exec(new String[]{"bash", "-c", newCmd});
+            } else {
+                // 鏈湴win
+                String mysqldumpPath = "cmd /c " + mysqldump + "/" + newCmd;
+                System.out.println(mysqldumpPath);
+                process = Runtime.getRuntime().exec(mysqldumpPath);
+            }
+            InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
+            bufferedReader = new BufferedReader(inputStreamReader);
+            String line;
+            while ((line = bufferedReader.readLine()) != null) {
+                printWriter.println(line);
+            }
+            // 姝ゆ浼氭墽琛岃繃闀挎椂闂�,鐩村埌澶囦唤瀹屾垚
+            printWriter.flush();
+            printWriter.close();
+            //0 琛ㄧず绾跨▼姝e父缁堟銆�
+            if (process.waitFor() == 0) {
+                // 绾跨▼姝e父鎵ц
+                log.info("銆愬浠芥暟鎹簱銆慡UCCESS锛孲QL鏂囦欢锛歿}", pathFileName);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("銆愬浠芥暟鎹簱銆慒AILURE");
+        } finally {
+            try {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (printWriter != null) {
+                    printWriter.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        log.info("銆愬浠芥暟鎹簱銆�--END");
+    }
+
+
+    /**
+     * 姣忓ぉ鏅氫笂23鐐�0鍒�10绉掓墽琛� 銆�  0 0 4 1/1 * ? 銆�
+     * 娴嬭瘯 20 绉掍竴娆°��  0/20 * * * * ? 銆�
+     */
+    @Scheduled(cron = "6 0 23 * * ?")
+    private void TimerDeleteFile(){
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("d");
+        Integer currentDay = Integer.valueOf(sdf.format(date));
+        File file = new File(filePath);
+        File[] files = file.listFiles();
+        if (files != null) {
+            for(File f : files){
+                if(f.isFile()){//鑻ユ槸鏂囦欢锛岀洿鎺ユ墦鍗�
+                    String[] splitFile = f.getName().split("_");
+                    Integer fileDay = Integer.valueOf(splitFile[splitFile.length - 2]);
+                    Integer i = currentDay - fileDay;
+                    if (i.equals(destiny)){
+                        f.delete();
+                        log.info("澶囦唤sql鏂囦欢杩囧杩涜鍒犻櫎锛�");
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏂囦欢鏄惁瀛樺湪锛屼笉瀛樺湪鍒涘缓
+     */
+    private static void existsFile(File file) {
+        // 鍒ゆ柇鏂囦欢璺緞鏄惁瀛樺湪,涓嶅瓨鍦ㄦ柊寤�
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        if (!file.exists()) {
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/sys/src/main/resources/application-dev.yml b/sys/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..7dc4eaa
--- /dev/null
+++ b/sys/src/main/resources/application-dev.yml
@@ -0,0 +1,85 @@
+swagger:
+  enabled: true
+
+# 鏃ュ織閰嶇疆
+logging:
+  config: classpath:logback-spring.xml
+  # 鏃ュ織瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  file-location: log
+
+# 鏁版嵁搴撳浠借矾寰�
+backup:
+  # 鏁版嵁搴撳浠借矾寰�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  path: E:/webapp/backup
+  # 鏁版嵁搴撳浠藉ぉ鏁�
+  destiny: 7
+  # 鏁版嵁搴撳浠藉伐鍏疯矾寰�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  mysqldump: E:\JavaCode\WMS\WMS_Admin\src\main\resources
+
+# 鐓х墖瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+file:
+  path: E:/webapp/images
+  # 涓婁紶鏂囦欢鍏佽鐨勬墿灞曞悕
+  allowed: png,jpg,jpeg,gif
+
+# 榈烽洀绠$悊绯荤粺瀵嗛挜
+login:
+  userID: c8b1aaacec366c24e5d18c7eea9e551b
+  secret: 701C85FCE0F7CFD714C2052D77098DC7f407b0ee79210bcef51787a0eb8ec7a5
+
+# 榈烽洀缃戠粶IP鎴栬�呭煙鍚�
+customer:
+  url: http://114.132.189.42:8011
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 寮�鍚痬ybatis-plus鏃ュ織
+
+# 鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/lims_laboratory?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+    username: root
+    password: 123456
+    druid:
+      #   Druid鏁版嵁婧愰厤缃�
+      initialSize: 5 # 鍒濆杩炴帴鏁�
+      minIdle: 10 # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      maxActive: 20 # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxWait: 60000 # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      timeBetweenEvictionRunsMillis: 60000 # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      validationQuery: SELECT 1 FROM DUAL # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      testWhileIdle: true #鐢宠杩炴帴鐨勬椂鍊欐娴嬶紝濡傛灉绌洪棽鏃堕棿澶т簬timeBetweenEvictionRunsMillis锛屾墽琛寁alidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堛��
+      testOnBorrow: false #閰嶇疆浠庤繛鎺ユ睜鑾峰彇杩炴帴鏃讹紝鏄惁妫�鏌ヨ繛鎺ユ湁鏁堟�э紝true姣忔閮芥鏌ワ紱false涓嶆鏌ャ�傚仛浜嗚繖涓厤缃細闄嶄綆鎬ц兘銆�
+      testOnReturn: false #閰嶇疆鍚戣繛鎺ユ睜褰掕繕杩炴帴鏃讹紝鏄惁妫�鏌ヨ繛鎺ユ湁鏁堟�э紝true姣忔閮芥鏌ワ紱false涓嶆鏌ャ�傚仛浜嗚繖涓厤缃細闄嶄綆鎬ц兘銆�
+      poolPreparedStatements: true #鎵撳紑PsCache锛屽苟涓旀寚瀹氭瘡涓繛鎺ヤ笂PSCache鐨勫ぇ灏�
+      maxPoolPreparedStatementPerConnectionSize: 20
+      filters: stat,wall,log4j # 閰嶇疆鐩戞帶缁熻鎷︽埅鐨刦ilters锛屽幓鎺夊悗鐩戞帶鐣岄潰sql鏃犳硶缁熻锛�'wall'鐢ㄤ簬闃茬伀澧�
+      useGlobalDataSourceStat: true #鍚堝苟澶氫釜DruidDatasource鐨勭洃鎺ф暟鎹�
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500; #閫氳繃connectProperties灞炴�ф潵鎵撳紑mergesql鍔熻兘缃楁參sQL璁板綍
+  redis:
+    # redis鏁版嵁搴撶储寮�(榛樿涓�0)锛屾垜浠娇鐢ㄧ储寮曚负3鐨勬暟鎹簱锛岄伩鍏嶅拰鍏朵粬鏁版嵁搴撳啿绐�
+    database: 0
+    # redis鏈嶅姟鍣ㄥ湴鍧�锛堥粯璁や负localhost锛�
+    host: localhost
+    # redis绔彛锛堥粯璁や负6379锛�
+    port: 6380
+    # redis璁块棶瀵嗙爜锛堥粯璁や负绌猴級
+    password: null
+    # redis杩炴帴瓒呮椂鏃堕棿锛堝崟浣嶆绉掞級
+    timeout: 5
+    # redis杩炴帴姹犻厤缃�
+    pool:
+      # 鏈�澶у彲鐢ㄨ繛鎺ユ暟锛堥粯璁や负8锛岃礋鏁拌〃绀烘棤闄愶級
+      max-active: 8
+      # 鏈�澶х┖闂茶繛鎺ユ暟锛堥粯璁や负8锛岃礋鏁拌〃绀烘棤闄愶級
+      max-idle: 8
+      # 鏈�灏忕┖闂茶繛鎺ユ暟锛堥粯璁や负0锛岃鍊煎彧鏈変负姝f暟鎵嶆湁鐢級
+      min-idle: 0
+      # 浠庤繛鎺ユ睜涓幏鍙栬繛鎺ユ渶澶х瓑寰呮椂闂达紙榛樿涓�-1锛屽崟浣嶄负姣锛岃礋鏁拌〃绀烘棤闄愶級
+      max-wait: -1
+
diff --git a/sys/src/main/resources/application-prod.yml b/sys/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..fda93ce
--- /dev/null
+++ b/sys/src/main/resources/application-prod.yml
@@ -0,0 +1,86 @@
+swagger:
+  enabled: false
+
+# 鏃ュ織閰嶇疆
+logging:
+  config: classpath:logback-spring.xml
+  # 鏃ュ織瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  file-location: /javaWork/LIMS/log
+
+# 鏁版嵁搴撳浠借矾寰�
+backup:
+  # 鏁版嵁搴撳浠借矾寰�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  path: /javaWork/LIMS/backup
+  # 鏁版嵁搴撳浠藉ぉ鏁�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  destiny: 7
+  # 鏁版嵁搴撳浠藉伐鍏疯矾寰�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+  mysqldump: /javaWork/LIMS/conf
+
+# 鐓х墖璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+file:
+  path: /javaWork/LIMS/images
+  # 涓婁紶鏂囦欢鍏佽鐨勬墿灞曞悕
+  allowed: png,jpg,jpeg,gif
+
+# 榈烽洀缃戠粶IP鎴栬�呭煙鍚�+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+customer:
+  url: http://114.132.189.42:8011
+
+login:
+  userID: c8b1aaacec366c24e5d18c7eea9e551b
+  secret: 701C85FCE0F7CFD714C2052D77098DC7f407b0ee79210bcef51787a0eb8ec7a5
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # 鍏抽棴mybatis-plus鏃ュ織
+
+# 鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.jdbc.Driver
+    url: jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+    username: root
+    password: 123456
+    druid:
+      #   Druid鏁版嵁婧愰厤缃�
+      initialSize: 5 # 鍒濆杩炴帴鏁�
+      minIdle: 10 # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      maxActive: 20 # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxWait: 60000 # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      timeBetweenEvictionRunsMillis: 60000 # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000 # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      validationQuery: SELECT 1 FROM DUAL # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      testWhileIdle: true #鐢宠杩炴帴鐨勬椂鍊欐娴嬶紝濡傛灉绌洪棽鏃堕棿澶т簬timeBetweenEvictionRunsMillis锛屾墽琛寁alidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堛��
+      testOnBorrow: false #閰嶇疆浠庤繛鎺ユ睜鑾峰彇杩炴帴鏃讹紝鏄惁妫�鏌ヨ繛鎺ユ湁鏁堟�э紝true姣忔閮芥鏌ワ紱false涓嶆鏌ャ�傚仛浜嗚繖涓厤缃細闄嶄綆鎬ц兘銆�
+      testOnReturn: false #閰嶇疆鍚戣繛鎺ユ睜褰掕繕杩炴帴鏃讹紝鏄惁妫�鏌ヨ繛鎺ユ湁鏁堟�э紝true姣忔閮芥鏌ワ紱false涓嶆鏌ャ�傚仛浜嗚繖涓厤缃細闄嶄綆鎬ц兘銆�
+      poolPreparedStatements: true #鎵撳紑PsCache锛屽苟涓旀寚瀹氭瘡涓繛鎺ヤ笂PSCache鐨勫ぇ灏�
+      maxPoolPreparedStatementPerConnectionSize: 20
+      filters: stat,wall,log4j # 閰嶇疆鐩戞帶缁熻鎷︽埅鐨刦ilters锛屽幓鎺夊悗鐩戞帶鐣岄潰sql鏃犳硶缁熻锛�'wall'鐢ㄤ簬闃茬伀澧�
+      useGlobalDataSourceStat: true #鍚堝苟澶氫釜DruidDatasource鐨勭洃鎺ф暟鎹�
+      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500; #閫氳繃connectProperties灞炴�ф潵鎵撳紑mergesql鍔熻兘缃楁參sQL璁板綍
+
+
+redis:
+  # redis鏁版嵁搴撶储寮�(榛樿涓�0)锛屾垜浠娇鐢ㄧ储寮曚负3鐨勬暟鎹簱锛岄伩鍏嶅拰鍏朵粬鏁版嵁搴撳啿绐�
+  database: 0
+  # redis鏈嶅姟鍣ㄥ湴鍧�锛堥粯璁や负loaclhost锛�
+  host: 127.0.0.1
+  # redis绔彛锛堥粯璁や负6379锛�
+  port: 6379
+  # redis璁块棶瀵嗙爜锛堥粯璁や负绌猴級
+  #  password:
+  # redis杩炴帴瓒呮椂鏃堕棿锛堝崟浣嶆绉掞級
+  timeout: 0
+  # redis杩炴帴姹犻厤缃�
+  pool:
+    # 鏈�澶у彲鐢ㄨ繛鎺ユ暟锛堥粯璁や负8锛岃礋鏁拌〃绀烘棤闄愶級
+    max-active: 8
+    # 鏈�澶х┖闂茶繛鎺ユ暟锛堥粯璁や负8锛岃礋鏁拌〃绀烘棤闄愶級
+    max-idle: 8
+    # 鏈�灏忕┖闂茶繛鎺ユ暟锛堥粯璁や负0锛岃鍊煎彧鏈変负姝f暟鎵嶆湁鐢級
+    min-idle: 0
+    # 浠庤繛鎺ユ睜涓幏鍙栬繛鎺ユ渶澶х瓑寰呮椂闂达紙榛樿涓�-1锛屽崟浣嶄负姣锛岃礋鏁拌〃绀烘棤闄愶級
+    max-wait: -1
+
diff --git a/sys/src/main/resources/application.yml b/sys/src/main/resources/application.yml
new file mode 100644
index 0000000..cc247aa
--- /dev/null
+++ b/sys/src/main/resources/application.yml
@@ -0,0 +1,28 @@
+server:
+  port: 1234
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 20MB # 鍗曚釜鏂囦欢澶у皬
+      max-request-size: 1024MB # 涓�娆¤姹傛枃浠舵�诲ぇ灏�
+  profiles:
+    active: dev
+
+mybatis-plus:
+  type-aliases-package: com.yuanchu.limslaboratory.pojo
+  mapper-locations: classpath*:/mapper/*.xml
+  global-config:
+    banner: off # 鍏抽棴mybatis-plus鍚姩鍥炬爣
+
+feign:
+  client:
+    config:
+      default:
+        connectTimeout: 2000
+        readTimeout: 3000
+        loggerLevel: FULL
+  httpclient:
+    enabled: false # 鍏抽棴 httpclient
+  okhttp:
+    enabled: true # 寮�鍚� okhttp
diff --git a/sys/src/main/resources/logback-spring.xml b/sys/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..9c97a9f
--- /dev/null
+++ b/sys/src/main/resources/logback-spring.xml
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 鏃ュ織绾у埆浠庝綆鍒伴珮鍒嗕负TRACE < DEBUG < INFO < WARN < ERROR < FATAL锛屾瘮濡�: 濡傛灉璁剧疆涓篧ARN锛屽垯浣庝簬WARN鐨勪俊鎭兘涓嶄細杈撳嚭 -->
+<!-- scan:褰撴灞炴�ц缃负true鏃讹紝閰嶇疆鏂囨。濡傛灉鍙戠敓鏀瑰彉锛屽皢浼氳閲嶆柊鍔犺浇锛岄粯璁ゅ�间负true -->
+<!-- scanPeriod:璁剧疆鐩戞祴閰嶇疆鏂囨。鏄惁鏈変慨鏀圭殑鏃堕棿闂撮殧锛屽鏋滄病鏈夌粰鍑烘椂闂村崟浣嶏紝榛樿鍗曚綅鏄绉掋�傚綋scan涓簍rue鏃讹紝姝ゅ睘鎬х敓鏁堛�傞粯璁ょ殑鏃堕棿闂撮殧涓�1鍒嗛挓銆� -->
+<!-- debug:褰撴灞炴�ц缃负true鏃讹紝灏嗘墦鍗板嚭logback鍐呴儴鏃ュ織淇℃伅锛屽疄鏃舵煡鐪媗ogback杩愯鐘舵�併�傞粯璁ゅ�间负false銆� -->
+<configuration  scan="true" scanPeriod="10 seconds">
+    <contextName>logback</contextName>
+
+    <!-- name鐨勫�兼槸鍙橀噺鐨勫悕绉帮紝value鐨勫�兼椂鍙橀噺瀹氫箟鐨勫�笺�傞�氳繃瀹氫箟鐨勫�间細琚彃鍏ュ埌logger涓婁笅鏂囦腑銆傚畾涔夊悗锛屽彲浠ヤ娇鈥�${}鈥濇潵浣跨敤鍙橀噺銆� -->
+    <springProperty scope="context" name="logs" source="logging.file-location" default="/var/log/myapp"/>
+    <property name="log.path" value="${logs}"/>
+
+    <!--0. 鏃ュ織鏍煎紡鍜岄鑹叉覆鏌� -->
+    <!-- 褰╄壊鏃ュ織渚濊禆鐨勬覆鏌撶被 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+    <!-- 褰╄壊鏃ュ織鏍煎紡 -->
+    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--1. 杈撳嚭鍒版帶鍒跺彴-->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <!--姝ゆ棩蹇梐ppender鏄负寮�鍙戜娇鐢紝鍙厤缃渶搴曠骇鍒紝鎺у埗鍙拌緭鍑虹殑鏃ュ織绾у埆鏄ぇ浜庢垨绛変簬姝ょ骇鍒殑鏃ュ織淇℃伅-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+        <encoder>
+            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+            <!-- 璁剧疆瀛楃闆� -->
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!--2. 杈撳嚭鍒版枃妗�-->
+    <!-- 2.1 level涓� DEBUG 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${log.path}/debug.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織褰掓。 -->
+            <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍debug绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.2 level涓� INFO 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${log.path}/info.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 姣忓ぉ鏃ュ織褰掓。璺緞浠ュ強鏍煎紡 -->
+            <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍info绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.3 level涓� WARN 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${log.path}/warn.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 姝ゅ璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍warn绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.4 level涓� ERROR 鏃ュ織锛屾椂闂存粴鍔ㄨ緭鍑�  -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${log.path}/error.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 姝ゅ璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗e彧璁板綍ERROR绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 2.5 鎵�鏈� 闄や簡DEBUG绾у埆鐨勫叾瀹冮珮浜嶥EBUG鐨� 鏃ュ織锛岃褰曞埌涓�涓枃浠�  -->
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃妗g殑璺緞鍙婃枃妗e悕 -->
+        <file>${log.path}/all.log</file>
+        <!--鏃ュ織鏂囨。杈撳嚭鏍煎紡-->
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset> <!-- 姝ゅ璁剧疆瀛楃闆� -->
+        </encoder>
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!--鏃ュ織鏂囨。淇濈暀澶╂暟-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <!-- 姝ゆ棩蹇楁枃妗h褰曢櫎浜咲EBUG绾у埆鐨勫叾瀹冮珮浜嶥EBUG鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>DENY</onMatch>
+            <onMismatch>ACCEPT</onMismatch>
+        </filter>
+    </appender>
+
+    <!--
+        <logger>鐢ㄦ潵璁剧疆鏌愪竴涓寘鎴栬�呭叿浣撶殑鏌愪竴涓被鐨勬棩蹇楁墦鍗扮骇鍒��
+        浠ュ強鎸囧畾<appender>銆�<logger>浠呮湁涓�涓猲ame灞炴�э紝
+        涓�涓彲閫夌殑level鍜屼竴涓彲閫夌殑addtivity灞炴�с��
+        name:鐢ㄦ潵鎸囧畾鍙楁logger绾︽潫鐨勬煇涓�涓寘鎴栬�呭叿浣撶殑鏌愪竴涓被銆�
+        level:鐢ㄦ潵璁剧疆鎵撳嵃绾у埆锛屽ぇ灏忓啓鏃犲叧锛歍RACE, DEBUG, INFO, WARN, ERROR, ALL 鍜� OFF锛�
+              杩樻湁涓�涓壒娈婂�糏NHERITED鎴栬�呭悓涔夎瘝NULL锛屼唬琛ㄥ己鍒舵墽琛屼笂绾х殑绾у埆銆�
+              濡傛灉鏈缃灞炴�э紝閭d箞褰撳墠logger灏嗕細缁ф壙涓婄骇鐨勭骇鍒��
+        addtivity:鏄惁鍚戜笂绾ogger浼犻�掓墦鍗颁俊鎭�傞粯璁ゆ槸true銆�
+        <logger name="org.springframework.web" level="info"/>
+        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
+    -->
+
+    <!--
+        浣跨敤mybatis鐨勬椂鍊欙紝sql璇彞鏄痙ebug涓嬫墠浼氭墦鍗帮紝鑰岃繖閲屾垜浠彧閰嶇疆浜唅nfo锛屾墍浠ユ兂瑕佹煡鐪媠ql璇彞鐨勮瘽锛屾湁浠ヤ笅涓ょ鎿嶄綔锛�
+        绗竴绉嶆妸<root level="info">鏀规垚<root level="DEBUG">杩欐牱灏变細鎵撳嵃sql锛屼笉杩囪繖鏍锋棩蹇楅偅杈逛細鍑虹幇寰堝鍏朵粬娑堟伅
+        绗簩绉嶅氨鏄崟鐙粰dao涓嬬洰褰曢厤缃甦ebug妯″紡锛屼唬鐮佸涓嬶紝杩欐牱閰嶇疆sql璇彞浼氭墦鍗帮紝鍏朵粬杩樻槸姝e父info绾у埆锛�
+        銆恖ogging.level.org.mybatis=debug logging.level.dao=debug銆�
+     -->
+
+    <!--
+        root鑺傜偣鏄繀閫夎妭鐐癸紝鐢ㄦ潵鎸囧畾鏈�鍩虹鐨勬棩蹇楄緭鍑虹骇鍒紝鍙湁涓�涓猯evel灞炴��
+        level:鐢ㄦ潵璁剧疆鎵撳嵃绾у埆锛屽ぇ灏忓啓鏃犲叧锛歍RACE, DEBUG, INFO, WARN, ERROR, ALL 鍜� OFF锛�
+        涓嶈兘璁剧疆涓篒NHERITED鎴栬�呭悓涔夎瘝NULL銆傞粯璁ゆ槸DEBUG
+        鍙互鍖呭惈闆朵釜鎴栧涓厓绱狅紝鏍囪瘑杩欎釜appender灏嗕細娣诲姞鍒拌繖涓猯ogger銆�
+    -->
+
+
+
+
+    <!-- 4  鏈�缁堢殑绛栫暐锛�
+                 鍩烘湰绛栫暐(root绾�) + 鏍规嵁profile鍦ㄥ惎鍔ㄦ椂, logger鏍囩涓畾鍒跺寲package鏃ュ織绾у埆(浼樺厛绾ч珮浜庝笂闈㈢殑root绾�)-->
+    <springProfile name="dev">
+        <root level="info">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="WARN_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="ALL_FILE" />
+        </root>
+        <logger name="com.yuanchu.limslaboratory.SysApplication" level="debug"/> <!-- 寮�鍙戠幆澧�, 鎸囧畾鏌愬寘鏃ュ織涓篸ebug绾� -->
+    </springProfile>
+
+    <springProfile name="test">
+        <root level="info">
+            <appender-ref ref="CONSOLE" />
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="WARN_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="ALL_FILE" />
+        </root>
+        <logger name="com.yuanchu.limslaboratory.SysApplication" level="info"/> <!-- 娴嬭瘯鐜, 鎸囧畾鏌愬寘鏃ュ織涓篿nfo绾� -->
+    </springProfile>
+
+    <springProfile name="prod">
+        <root level="info">
+            <!-- 鐢熶骇鐜鏈�濂戒笉閰嶇疆console鍐欐枃浠� -->
+            <appender-ref ref="DEBUG_FILE" />
+            <appender-ref ref="INFO_FILE" />
+            <appender-ref ref="WARN_FILE" />
+            <appender-ref ref="ERROR_FILE" />
+            <appender-ref ref="ALL_FILE" />
+        </root>
+        <logger name="com.yuanchu.limslaboratory" level="warn"/> <!-- 鐢熶骇鐜, 鎸囧畾鏌愬寘鏃ュ織涓簑arn绾� -->
+        <logger name="com.yuanchu.limslaboratory.SysApplication" level="info"/> <!-- 鐗瑰畾鏌愪釜绫绘墦鍗癷nfo鏃ュ織, 姣斿application鍚姩鎴愬姛鍚庣殑鎻愮ず璇� -->
+    </springProfile>
+
+</configuration>
diff --git a/sys/src/main/resources/mysqldump.exe b/sys/src/main/resources/mysqldump.exe
new file mode 100644
index 0000000..9f4ce5e
--- /dev/null
+++ b/sys/src/main/resources/mysqldump.exe
Binary files differ
diff --git a/sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java b/sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java
new file mode 100644
index 0000000..9d91f2b
--- /dev/null
+++ b/sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SysApplicationTests {
+
+    @Test
+    void contextLoads() {
+        String newString = String.format("%06d", 77);
+        System.out.println("newString === " + newString);
+
+    }
+}
+
+
diff --git a/user-server/pom.xml b/user-server/pom.xml
new file mode 100644
index 0000000..a1f86af
--- /dev/null
+++ b/user-server/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>lims-laboratory</artifactId>
+        <groupId>com.yuanchu</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <groupId>com.yunchu.limslaboratory</groupId>
+    <artifactId>user-server</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>user-server</name>
+    <description>user-server</description>
+
+    <packaging>jar</packaging>
+    <dependencies>
+        <dependency>
+            <groupId>com.yunchu.limslaboratory</groupId>
+            <artifactId>framework</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <!--feign-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!--okhttp-->
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-okhttp</artifactId>
+        </dependency>
+
+        <!--瀹夊叏妗嗘灦shiro-->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!--jwt-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java b/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java
new file mode 100644
index 0000000..8a3df54
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java
@@ -0,0 +1,19 @@
+package com.yuanchu.limslaboratory.clients;
+
+import com.yuanchu.limslaboratory.vo.Result;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Map;
+
+@FeignClient(value = "userservice", url = "${customer.url}")
+public interface UserClient {
+
+    @PostMapping("/business/login")
+    Result<?> BusynessUserLogin(@RequestBody Map<String, Object> mapData);
+
+    @PostMapping("/business/code")
+    Result<?> BusynessUserLoginToken(@RequestParam("code") String code);
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java b/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java
new file mode 100644
index 0000000..7b1ead7
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java
@@ -0,0 +1,74 @@
+package com.yuanchu.limslaboratory.clients;
+
+import com.yuanchu.limslaboratory.pojo.User;
+import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.Result;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class UserLoginUtils {
+
+    @Resource
+    private UserClient userClient;
+
+    @Value("${login.userID}")
+    private String LoginUserID;
+
+    @Value("${login.secret}")
+    private String LoginSecret;
+
+    public Result<Map<String, Object>> LoginExamine(User user){
+        Map<String, Object> mapData = new HashMap<>();
+        mapData.put("LoginUserID", LoginUserID);
+        mapData.put("LoginSecret", LoginSecret);
+        Result<?> code = userClient.BusynessUserLogin(mapData);
+        if (code.getCode() == 200){
+            Result<?> result = userClient.BusynessUserLoginToken(code.getData().toString());
+            if (result.getCode() == 200){
+                Map data = (Map) result.getData();
+                String token = data.get("token").toString();
+                data.remove("token");
+                HashMap<String, Object> mapRedis = new HashMap<>();
+                mapRedis.put("id", user.getId());
+                mapRedis.put("account", user.getAccount());
+                mapRedis.put("name", user.getName());
+                mapRedis.put("enterpriseId", user.getEnterpriseId());
+                mapRedis.put("data", data);
+                //瀛樺叆redis,浜屼釜灏忔椂鍚庡垹闄�
+                RedisUtil.set(token, mapRedis, 120);
+                // 灏嗙鍙戠殑 JWT token 杩斿洖缁欏墠绔�
+                HashMap<String, Object> map = new HashMap<>();
+                String refresh = JwtUtils.sign(user.getAccount());
+                map.put("token", token);
+                map.put("refresh", refresh);
+                RedisUtil.set(user.getAccount(), map, 168);
+                return Result.success(map);
+            } else {
+                return Result.fail(result.getMessage());
+            }
+        } else {
+            return Result.fail(code.getMessage());
+        }
+    }
+
+
+//    public Result<Map<String, Object>> LoginExamine(User user){
+//        String token = JwtUtils.sign(user.getAccount());
+//        //瀛樺叆redis,浜屼釜灏忔椂鍚庡垹闄�
+//        RedisUtil.set(token, user, 2);
+//        // 灏嗙鍙戠殑 JWT token 杩斿洖缁欏墠绔�
+//        HashMap<String, Object> map = new HashMap<>();
+//        String refresh = JwtUtils.sign(user.getAccount());
+//        map.put("token", token);
+//        map.put("refresh", refresh);
+//        RedisUtil.set(user.getAccount(), map, 120);
+//        return Result.success(map);
+//    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java b/user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java
new file mode 100644
index 0000000..52abac8
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java
@@ -0,0 +1,36 @@
+package com.yuanchu.limslaboratory.config;
+
+
+import feign.Feign;
+import okhttp3.OkHttpClient;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.cloud.commons.httpclient.OkHttpClientFactory;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.openfeign.FeignAutoConfiguration;
+import org.springframework.cloud.openfeign.support.FeignHttpClientProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+@ConditionalOnClass(Feign.class)
+@AutoConfigureBefore(FeignAutoConfiguration.class)
+public class FeignConfig {
+
+    private OkHttpClient okHttpClient;
+
+
+    //娉ㄥ叆okhttp
+    @Bean
+    public OkHttpClient okHttpClient(OkHttpClientFactory okHttpClientFactory,
+                                             FeignHttpClientProperties httpClientProperties) {
+        this.okHttpClient = okHttpClientFactory.createBuilder(httpClientProperties.isDisableSslValidation()).connectTimeout(httpClientProperties.getConnectionTimeout(),TimeUnit.SECONDS)
+                .followRedirects(httpClientProperties.isFollowRedirects())
+                .build();
+        return this.okHttpClient;
+    }
+
+}
+
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java
new file mode 100644
index 0000000..65ecfc8
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@RestController
+@RequestMapping("/enterprise")
+public class EnterpriseController {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java
new file mode 100644
index 0000000..0191900
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@RestController
+@RequestMapping("/role")
+public class RoleController {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java
new file mode 100644
index 0000000..9efad92
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java
@@ -0,0 +1,147 @@
+package com.yuanchu.limslaboratory.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.clients.UserLoginUtils;
+import com.yuanchu.limslaboratory.pojo.Enterprise;
+import com.yuanchu.limslaboratory.pojo.User;
+import com.yuanchu.limslaboratory.service.UserService;
+import com.yuanchu.limslaboratory.shiro.realm.ShiroRealm;
+import com.yuanchu.limslaboratory.utils.JackSonUtil;
+import com.yuanchu.limslaboratory.utils.MyUtil;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.utils.SpringUtil;
+import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
+import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
+import com.yuanchu.limslaboratory.vo.Result;
+import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
+import io.swagger.annotations.*;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@RestController
+@RequestMapping("/user")
+@Api(tags = "鐢ㄦ埛妯″潡")
+public class UserController {
+
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation("鐢ㄦ埛鐧诲綍")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "account", value = "璐﹀彿", dataTypeClass = String.class, required = true),
+            @ApiImplicitParam(name = "password", value = "瀵嗙爜", dataTypeClass = String.class, required = true)
+    })
+    @PostMapping("/login")
+    public Result<?> userLogin(String account, String password){
+        boolean loginSuccess = false;
+        Subject subject = SecurityUtils.getSubject();
+        if (!subject.isAuthenticated()) {
+            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, password);
+            try {
+                subject.login(usernamePasswordToken);
+                loginSuccess = true;
+            } catch (UnknownAccountException e) {
+                return Result.fail(202, "娌℃湁鎵惧埌璇ヨ处鍙凤紝璇锋鏌ヨ緭鍏ワ紒");
+            } catch (IncorrectCredentialsException e) {
+                return Result.fail(202, "瀵嗙爜涓嶅尮閰嶏紝璇锋鏌ヨ緭鍏ワ紒");
+            }
+        }
+        if (loginSuccess) {
+            // 鑾峰彇shiroRealm涓殑鏁版嵁
+            ShiroRealm bean = SpringUtil.getBean(ShiroRealm.class);
+            User user = bean.user;
+            user.setPassword(null);
+            UserLoginUtils bean1 = SpringUtil.getBean(UserLoginUtils.class);
+            return bean1.LoginExamine(user);
+        }else {
+            return Result.fail("鐧诲綍澶辫触");
+        }
+    }
+
+    @ApiOperation("鐧诲綍-->鑾峰彇鐢ㄦ埛淇℃伅")
+    @GetMapping("/info")
+    public Result<?> getUserInfo(@RequestHeader("X-Token") String token){
+        //鏍规嵁token鑾峰彇鐢ㄦ埛淇℃伅
+        Map<String,Object> data = userService.getUserInfo(token);
+        if (data != null){
+            return Result.success(data);
+        }
+        return Result.fail(202,"鐢ㄦ埛鐧诲綍淇℃伅鏃犳晥锛岃閲嶆柊鐧诲綍");
+    }
+
+    @PostMapping("/getUserById")
+    @ApiOperation("鑾峰彇鎸囧畾鐢ㄦ埛id鐨勭敤鎴蜂俊鎭拰浼佷笟淇℃伅")
+    public Result<?> getUserById(@RequestHeader("X-Token") String token) throws Exception {
+        Object o = RedisUtil.get(token);
+        Map<String, Object> unmarshal = null;
+        if (!ObjectUtils.isEmpty(o)){
+            unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(o), Map.class);
+            Map<String, String> map = userService.selectUserByUserId((Integer) unmarshal.get("id"));
+            return Result.success(map);
+        }
+        return Result.fail("Token閿欒锛�");
+    }
+
+    @PostMapping("/add_new_personnel")
+    @ApiOperation("瀹為獙瀹ょ鐞�-->浜哄憳绠$悊-->鏂板浜哄憳")
+    public Result<?> addNewPersonnel(@RequestHeader("X-Token") String token, @RequestBody NewPersonnelVo newPersonnelVo) throws Exception {
+        Object redisUserMessage = RedisUtil.get(token);
+        Map<String, Object> user = null;
+        Integer isAddSuccess = 0;
+        if (!ObjectUtils.isEmpty(redisUserMessage)) {
+            user = JackSonUtil.unmarshal(JackSonUtil.marshal(redisUserMessage), Map.class);
+            newPersonnelVo.setPassword("123456");
+            isAddSuccess = userService.addNewPersonnel(newPersonnelVo, user.get("enterpriseId").toString());
+        }
+
+        if (isAddSuccess == 1){
+            return Result.success("娣诲姞銆�" + newPersonnelVo.getName() + "銆戞垚鍔燂紝榛樿瀵嗙爜涓猴細" + newPersonnelVo.getPassword());
+        }
+        return Result.fail("娣诲姞澶辫触锛�");
+    }
+
+    @PutMapping("/update_new_personnel")
+    @ApiOperation("瀹為獙瀹ょ鐞�-->浜哄憳绠$悊-->缂栬緫鎿嶄綔")
+    public Result<?> updateNewPersonnel(@RequestBody UpdatePersonnelVo updatePersonnelVo) {
+        Integer isUpdateSuccess = userService.updateNewPersonnel(updatePersonnelVo);
+        if (isUpdateSuccess == 1){
+            return Result.success("鏇存柊銆�" + updatePersonnelVo.getName() + "銆戞垚鍔�");
+        }
+        return Result.fail("鏇存柊銆�" + updatePersonnelVo.getName() + "銆戝け璐�");
+    }
+
+    @GetMapping("/list_new_personnel")
+    @ApiOperation("瀹為獙瀹ょ鐞�-->浜哄憳绠$悊-->鍒嗛〉鏌ヨ")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pageNo", value = "璧峰椤�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "pageSize", value = "姣忎竴椤垫暟閲�", dataTypeClass = Integer.class, required = true),
+            @ApiImplicitParam(name = "name", value = "浜哄憳鍚嶇О", dataTypeClass = String.class)
+    })
+    public Result<Map<String, Object>> getNewPersonnelPage(Integer pageNo, Integer pageSize, String name) {
+        IPage<PagePersonnelVo> PageList = userService.getNewPersonnelPage(name, new Page<Objects>(pageNo, pageSize));
+        Map<String, Object> map = new HashMap<>();
+        map.put("row", PageList.getRecords());
+        map.put("total", PageList.getTotal());
+        return Result.success(map);
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java
new file mode 100644
index 0000000..9b927b0
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.pojo.Enterprise;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface EnterpriseMapper extends BaseMapper<Enterprise> {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java
new file mode 100644
index 0000000..764ad21
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.yuanchu.limslaboratory.pojo.Role;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface RoleMapper extends BaseMapper<Role> {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java
new file mode 100644
index 0000000..232f21d
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java
@@ -0,0 +1,30 @@
+package com.yuanchu.limslaboratory.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface UserMapper extends BaseMapper<User> {
+    Map<String, String> selectUserByUserId(int userId);
+
+    IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page);
+
+    List<Map> selectUser();
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java
new file mode 100644
index 0000000..3248894
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java
@@ -0,0 +1,67 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Enterprise瀵硅薄", description="")
+public class Enterprise implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "浼佷笟缂栧彿")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "浼佷笟鍚嶅瓧")
+    private String name;
+
+    @ApiModelProperty(value = "浼佷笟绠�绉�")
+    private String byname;
+
+    @ApiModelProperty(value = "鑱旂郴浜哄悕瀛�")
+    private String linkName;
+
+    @ApiModelProperty(value = "鑱旂郴浜虹數璇�")
+    private String linkPhone;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
+    private Date updateTime;
+
+    @Version
+    @ApiModelProperty(value = "閿�")
+    private Integer version;
+
+
+    public Enterprise(String name, String byname, String linkName, String linkPhone) {
+        this.name = name;
+        this.byname = byname;
+        this.linkName = linkName;
+        this.linkPhone = linkPhone;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java
new file mode 100644
index 0000000..c568112
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java
@@ -0,0 +1,57 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="Role瀵硅薄", description="")
+public class Role implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "瑙掕壊id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "瑙掕壊鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "0锛氭棤鏉冮檺锛�1锛氭湁鏉冮檺")
+    private Integer power;
+
+    @TableLogic(value = "1", delval = "0")
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎 姝e父>=1,鍒犻櫎<=0")
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
+    private Date updateTime;
+
+    @Version
+    @ApiModelProperty(value = "涔愯閿�")
+    private Integer version;
+
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java
new file mode 100644
index 0000000..14cea5b
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java
@@ -0,0 +1,89 @@
+package com.yuanchu.limslaboratory.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sun.jmx.snmp.Timestamp;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Accessors(chain = true)
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="User瀵硅薄", description="")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鐢ㄦ埛id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "璐﹀彿")
+    private String account;
+
+    @ApiModelProperty(value = "瀵嗙爜")
+    private String password;
+
+    @ApiModelProperty(value = "濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "閭")
+    private String email;
+
+    @ApiModelProperty(value = "骞撮緞")
+    private Integer age;
+
+    @ApiModelProperty(value = "涓�х鍚�")
+    private String info;
+
+    @ApiModelProperty(value = "鍦ㄨ亴鐘舵�� 姝e父>=1,绂昏亴<=0")
+    private Integer jobState;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    @Version
+    private Integer version;
+
+    @ApiModelProperty(value = "鍏宠仈 瑙掕壊id")
+    private Integer roleId;
+
+    @ApiModelProperty(value = "鍏宠仈 浼佷笟id")
+    private Integer enterpriseId;
+
+    public User(String account, String name, String phone, String email, String info) {
+        this.account = account;
+        this.name = name;
+        this.phone = phone;
+        this.email = email;
+        this.info = info;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java
new file mode 100644
index 0000000..677779d
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.Enterprise;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface EnterpriseService extends IService<Enterprise> {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java
new file mode 100644
index 0000000..f301dfb
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.yuanchu.limslaboratory.pojo.Role;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface RoleService extends IService<Role> {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java
new file mode 100644
index 0000000..7128e26
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java
@@ -0,0 +1,84 @@
+package com.yuanchu.limslaboratory.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
+import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
+import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+public interface UserService extends IService<User> {
+    /**
+     * 閫氳繃鐢ㄦ埛id鑾峰彇鐢ㄦ埛淇℃伅
+     * @param userId
+     * @return
+     */
+    Map<String, String> selectUserByUserId(int userId);
+
+    User AccordingUsernameSelectAll(String account);
+
+    /**
+     * 娣诲姞鐢ㄦ埛
+     * @param newPersonnelVo
+     * @param enterpriseId
+     * @return
+     */
+    Integer addNewPersonnel(NewPersonnelVo newPersonnelVo, String enterpriseId);
+
+    /**
+     * 鏇存柊鐢ㄦ埛鍩烘湰淇℃伅
+     * @param updatePersonnelVo
+     * @return
+     */
+    Integer updateNewPersonnel(UpdatePersonnelVo updatePersonnelVo);
+
+    /**
+     * 鍒嗛〉鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+     * @param name
+     * @param page
+     * @return
+     */
+    IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page);
+
+    /**
+     * 鐧诲綍鑾峰彇鐢ㄦ埛鍩烘湰淇℃伅涓庣郴缁熻秴鏃舵椂闂存彁閱�
+     * @param token
+     * @return
+     */
+    Map<String, Object> getUserInfo(String token);
+
+    /**
+     * 鏍规嵁Id鏌ヨ鏄惁瀛樺湪璇ョ敤鎴�
+     */
+    Boolean userIsNull(Integer Id);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛Id鏌ヨ鐢ㄦ埛鍚嶇О
+     * @param userId 鐢ㄦ埛Id
+     * @return
+     */
+    String selectByUserId(Integer userId);
+
+    /**
+     * 鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+     * @return
+     */
+    List<Map> selectUser();
+
+    /**
+     * 鑾峰彇鎵�鏈夌敤鎴风殑鍚嶇О涓嶪d
+     */
+    List<Map<String, Object>> getUserNameAndId();
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java
new file mode 100644
index 0000000..227ae2f
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.yuanchu.limslaboratory.pojo.Enterprise;
+import com.yuanchu.limslaboratory.mapper.EnterpriseMapper;
+import com.yuanchu.limslaboratory.service.EnterpriseService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Service
+public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper, Enterprise> implements EnterpriseService {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..ba4584e
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.yuanchu.limslaboratory.pojo.Role;
+import com.yuanchu.limslaboratory.mapper.RoleMapper;
+import com.yuanchu.limslaboratory.service.RoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Service
+public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
+
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..744ad7e
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java
@@ -0,0 +1,135 @@
+package com.yuanchu.limslaboratory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.limslaboratory.pojo.User;
+import com.yuanchu.limslaboratory.mapper.UserMapper;
+import com.yuanchu.limslaboratory.service.UserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
+import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
+import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2023-07-07
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public Map<String, Object> getUserInfo(String token) {
+        //鏍规嵁token鑾峰彇鐢ㄦ埛淇℃伅
+        Object obj = RedisUtil.get(token);
+        if (!ObjectUtils.isEmpty(obj)){
+            Map loginUser = (Map) obj;
+            Map map = (Map)loginUser.get("data");
+            Object residualTime = map.get("residualTime");
+            int i = Integer.parseInt(residualTime.toString());
+            String remind = null;
+            if (i <= 30) {
+                remind = "鎮ㄦ墍浣跨敤鐨勭郴缁熷嵆灏嗚繃鏈燂紒璇疯仈绯荤鐞嗗憳锛�";
+            }
+            Map<String, Object> data = new HashMap<>();
+            data.put("name",loginUser.get("name"));
+            data.put("remind", remind);
+            return data;
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean userIsNull(Integer Id) {
+        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        userLambdaQueryWrapper.eq(User::getId, Id);
+        userLambdaQueryWrapper.select(User::getName);
+        User user = userMapper.selectOne(userLambdaQueryWrapper);
+        return !ObjectUtils.isEmpty(user);
+    }
+
+    @Override
+    public String selectByUserId(Integer userId) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getId, userId);
+        wrapper.select(User::getName);
+        User user = userMapper.selectOne(wrapper);
+        return user.getName();
+    }
+
+    @Override
+    public List<Map> selectUser() {
+        return userMapper.selectUser();
+    }
+
+    @Override
+    public List<Map<String, Object>> getUserNameAndId() {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(User::getId, User::getName);
+        return userMapper.selectMaps(wrapper);
+    }
+
+    @Override
+    public Map<String, String> selectUserByUserId(int userId) {
+        return userMapper.selectUserByUserId(userId);
+    }
+
+    @Override
+    public User AccordingUsernameSelectAll(String account) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getAccount, account);
+        wrapper.select(User::getPassword, User::getId, User::getName, User::getAccount, User::getEnterpriseId);
+        return userMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public Integer addNewPersonnel(NewPersonnelVo newPersonnelVo, String enterpriseId) {
+        User user = new User()
+                .setName(newPersonnelVo.getName())
+                .setAccount(newPersonnelVo.getAccount())
+                .setAge(newPersonnelVo.getAge())
+                .setPhone(newPersonnelVo.getPhone())
+                .setEmail(newPersonnelVo.getEmail())
+                .setRoleId(newPersonnelVo.getRole_id())
+                .setPassword(newPersonnelVo.getPassword())
+                .setEnterpriseId(Integer.valueOf(enterpriseId));
+        return userMapper.insert(user);
+    }
+
+    @Override
+    public Integer updateNewPersonnel(UpdatePersonnelVo updatePersonnelVo) {
+        User user = new User()
+                .setName(updatePersonnelVo.getName())
+                .setAccount(updatePersonnelVo.getAccount())
+                .setAge(updatePersonnelVo.getAge())
+                .setPhone(updatePersonnelVo.getPhone())
+                .setEmail(updatePersonnelVo.getEmail())
+                .setRoleId(updatePersonnelVo.getRole_id())
+                .setPassword(updatePersonnelVo.getPassword())
+                .setJobState(updatePersonnelVo.getJobState());
+        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(User::getId, updatePersonnelVo.getId());
+        return userMapper.update(user, updateWrapper);
+    }
+
+    @Override
+    public IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page) {
+        return userMapper.getNewPersonnelPage(name, page);
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java
new file mode 100644
index 0000000..e4872db
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java
@@ -0,0 +1,28 @@
+package com.yuanchu.limslaboratory.shiro;
+
+import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
+import org.apache.shiro.authc.AuthenticationToken;
+
+public class JwtToken implements AuthenticationToken {
+    private static final long serialVersionUID = 1L;
+
+    // 鍔犲瘑鍚庣殑 JWT token涓�
+    private String token;
+
+    private String account;
+
+    public JwtToken(String token) {
+        this.token = token;
+        this.account = JwtUtils.getClaimFiled(token, "account");
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return this.account;
+    }
+
+    @Override
+    public Object getCredentials() {
+        return token;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java
new file mode 100644
index 0000000..4110709
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java
@@ -0,0 +1,61 @@
+package com.yuanchu.limslaboratory.shiro;
+
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.pam.AuthenticationStrategy;
+import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
+import org.apache.shiro.realm.Realm;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+
+public class MultiRealmAuthenticator extends ModularRealmAuthenticator {
+    private static final Logger log = LoggerFactory.getLogger(MultiRealmAuthenticator.class);
+
+    @Override
+    protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token)
+            throws AuthenticationException {
+        AuthenticationStrategy strategy = getAuthenticationStrategy();
+
+        AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token);
+
+        if (log.isTraceEnabled()) {
+            log.trace("Iterating through {} realms for PAM authentication", realms.size());
+        }
+        AuthenticationException authenticationException = null;
+        for (Realm realm : realms) {
+
+            aggregate = strategy.beforeAttempt(realm, token, aggregate);
+
+            if (realm.supports(token)) {
+
+                log.trace("Attempting to authenticate token [{}] using realm [{}]", token, realm);
+
+                AuthenticationInfo info = null;
+                try {
+                    info = realm.getAuthenticationInfo(token);
+                } catch (AuthenticationException e) {
+                    authenticationException = e;
+                    if (log.isDebugEnabled()) {
+                        String msg = "Realm [" + realm
+                                + "] threw an exception during a multi-realm authentication attempt:";
+                        log.debug(msg, e);
+                    }
+                }
+
+                aggregate = strategy.afterAttempt(realm, token, info, aggregate, authenticationException);
+
+            } else {
+                log.debug("Realm [{}] does not support token {}.  Skipping realm.", realm, token);
+            }
+        }
+        if (authenticationException != null) {
+            throw authenticationException;
+        }
+        aggregate = strategy.afterAllAttempts(token, aggregate);
+
+        return aggregate;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java
new file mode 100644
index 0000000..3109653
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java
@@ -0,0 +1,179 @@
+package com.yuanchu.limslaboratory.shiro.config;
+
+import com.yuanchu.limslaboratory.shiro.filter.JwtFilter;
+import com.yuanchu.limslaboratory.shiro.MultiRealmAuthenticator;
+import com.yuanchu.limslaboratory.shiro.realm.JwtRealm;
+import com.yuanchu.limslaboratory.shiro.realm.ShiroRealm;
+import com.yuanchu.limslaboratory.shiro.utils.JwtCredentialsMatcher;
+import org.apache.shiro.authc.credential.CredentialsMatcher;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.authc.pam.AuthenticationStrategy;
+import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
+import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
+import org.apache.shiro.authz.Authorizer;
+import org.apache.shiro.authz.ModularRealmAuthorizer;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
+import org.apache.shiro.mgt.DefaultSubjectDAO;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.mgt.SessionStorageEvaluator;
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import java.util.*;
+
+@Configuration
+public class ShiroConfig {
+
+    /**
+     * 涓嶅悜 Spring瀹瑰櫒涓敞鍐� JwtFilter Bean锛岄槻姝� Spring 灏� JwtFilter 娉ㄥ唽涓哄叏灞�杩囨护鍣�
+     * 鍏ㄥ眬杩囨护鍣ㄤ細瀵规墍鏈夎姹傝繘琛屾嫤鎴紝鑰屾湰渚嬩腑鍙渶瑕佹嫤鎴櫎 /login 鍜� /logout 澶栫殑璇锋眰
+     * 鍙︿竴绉嶇畝鍗曞仛娉曟槸锛氱洿鎺ュ幓鎺� jwtFilter()涓婄殑 @Bean 娉ㄨВ
+     */
+    @Bean
+    public FilterRegistrationBean<Filter> registration(JwtFilter filter) {
+        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<Filter>(filter);
+        registration.setEnabled(false);
+        return registration;
+    }
+
+    //ShiroFilter杩囨护鎵�鏈夎姹�
+    @Bean
+    public ShiroFilterFactoryBean getShiroFilterFactoryBean(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        //缁橲hiroFilter閰嶇疆瀹夊叏绠$悊鍣�
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+
+        // 娣诲姞 jwt 涓撶敤杩囨护鍣紝鎷︽埅闄� /login 鍜� /logout 澶栫殑璇锋眰
+        Map<String, Filter> filterMap = new LinkedHashMap<>();
+        filterMap.put("jwtFilter", new JwtFilter());
+        shiroFilterFactoryBean.setFilters(filterMap);
+
+        //閰嶇疆绯荤粺鍏叡璧勬簮
+        Map<String, String> map = new HashMap<String, String>();
+
+        // swagger鏀捐
+        map.put("/doc.html", "anon");
+        map.put("/webjars/**/**", "anon");
+        map.put("/swagger-resources", "anon");
+        map.put("/api-docs", "anon");
+        map.put("/v3/**", "anon");
+
+        map.put("/link-basic/*", "anon");
+        map.put("/user/login/**","anon");//琛ㄧず杩欎釜涓哄叕鍏辫祫婧� 涓�瀹氭槸鍦ㄥ彈闄愯祫婧愪笂闈�
+//        map.put("/**","jwtFilter");//琛ㄧず杩欎釜璧勬簮闇�瑕佽璇佸拰鎺堟潈
+
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
+
+        return shiroFilterFactoryBean;
+    }
+
+    /**
+     * 閰嶇疆 ModularRealmAuthenticator
+     */
+    @Bean
+    public ModularRealmAuthenticator authenticator() {
+        ModularRealmAuthenticator authenticator = new MultiRealmAuthenticator();
+        // 璁剧疆澶� Realm鐨勮璇佺瓥鐣ワ紝榛樿 AtLeastOneSuccessfulStrategy
+        AuthenticationStrategy strategy = new FirstSuccessfulStrategy();
+        authenticator.setAuthenticationStrategy(strategy);
+        return authenticator;
+    }
+
+
+    /**
+     * 绂佺敤session, 涓嶄繚瀛樼敤鎴风櫥褰曠姸鎬併�備繚璇佹瘡娆¤姹傞兘閲嶆柊璁よ瘉
+     */
+    @Bean
+    protected SessionStorageEvaluator sessionStorageEvaluator() {
+        DefaultSessionStorageEvaluator sessionStorageEvaluator = new DefaultSessionStorageEvaluator();
+        sessionStorageEvaluator.setSessionStorageEnabled(false);
+        return sessionStorageEvaluator;
+    }
+
+    /**
+     * 閰嶇疆 SecurityManager锛氭潈闄愮鐞嗗櫒
+     */
+    @Bean
+    public DefaultWebSecurityManager securityManager() {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+
+        // 1.韬唤楠岃瘉鍣�
+        securityManager.setAuthenticator(authenticator());
+
+        // 2.绠$悊Realm
+        List<Realm> realms = new ArrayList<Realm>(16);
+        realms.add(JwtRealm());
+        realms.add(shiroRealm());
+        securityManager.setRealms(realms); // 閰嶇疆澶氫釜realm
+
+        // 3.鍏抽棴shiro鑷甫鐨剆ession
+        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
+        subjectDAO.setSessionStorageEvaluator(sessionStorageEvaluator());
+        securityManager.setSubjectDAO(subjectDAO);
+
+        return securityManager;
+    }
+
+    //    鍒涘缓鑷畾涔塕ealm
+    @Bean
+    public Realm shiroRealm() {
+        ShiroRealm realm = new ShiroRealm();
+//        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
+////        //璁剧疆浣跨敤MD5鍔犲瘑绠楁硶
+////        credentialsMatcher.setHashAlgorithmName(Md5Hash.ALGORITHM_NAME);
+////        //鏁e垪娆℃暟
+////        credentialsMatcher.setHashIterations(1024);
+//        realm.setCredentialsMatcher(credentialsMatcher);
+        return realm;
+    }
+
+    @Bean
+    public Realm JwtRealm(){
+        JwtRealm jwtRealm = new JwtRealm();
+        // 璁剧疆鍔犲瘑绠楁硶
+        CredentialsMatcher credentialsMatcher = new JwtCredentialsMatcher();
+        // 璁剧疆鍔犲瘑娆℃暟
+        jwtRealm.setCredentialsMatcher(credentialsMatcher);
+        return jwtRealm;
+    }
+
+
+    // 浠ヤ笅涓変腑bean閫氱敤锛屽浐瀹氶厤缃�
+
+    /**
+     * 浜ょ敱 Spring 鏉ヨ嚜鍔ㄥ湴绠$悊 Shiro-Bean 鐨勭敓鍛藉懆鏈�
+     */
+    @Bean
+    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    /**
+     * 涓� Spring-Bean 寮�鍚 Shiro 娉ㄨВ鐨勬敮鎸�
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+        return authorizationAttributeSourceAdvisor;
+    }
+
+    /**
+     * 寮�鍚疉OP鏂规硶绾ф潈闄愭鏌�
+     */
+    @Bean
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        advisorAutoProxyCreator.setProxyTargetClass(true);
+        return advisorAutoProxyCreator;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java
new file mode 100644
index 0000000..a03022e
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java
@@ -0,0 +1,170 @@
+package com.yuanchu.limslaboratory.shiro.filter;
+
+import com.yuanchu.limslaboratory.shiro.JwtToken;
+import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
+import org.apache.shiro.web.util.WebUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+
+@Component
+public class JwtFilter extends BasicHttpAuthenticationFilter {
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    public Integer code;
+    public String message;
+
+    /**
+     * 鍓嶇疆澶勭悊
+     */
+    @Override
+    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
+        HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
+        // 璺ㄥ煙鏃朵細棣栧厛鍙戦�佷竴涓猳ption璇锋眰锛岃繖閲屾垜浠粰option璇锋眰鐩存帴杩斿洖姝e父鐘舵��
+        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
+            httpServletResponse.setStatus(HttpStatus.OK.value());
+            return false;
+        }
+        return super.preHandle(request, response);
+    }
+
+    /**
+     * 鍚庣疆澶勭悊
+     */
+    @Override
+    protected void postHandle(ServletRequest request, ServletResponse response) {
+        // 娣诲姞璺ㄥ煙鏀寔
+        this.fillCorsHeader(WebUtils.toHttp(request), WebUtils.toHttp(response));
+    }
+
+    /**
+     * 杩囨护鍣ㄦ嫤鎴姹傜殑鍏ュ彛鏂规硶
+     * 杩斿洖 true 鍒欏厑璁歌闂�
+     * 杩斿洖false 鍒欑姝㈣闂紝浼氳繘鍏� onAccessDenied()
+     */
+    @Override
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        // 濡傛灉token涓虹┖涓嶈閫氳繃
+        String header = ((HttpServletRequest) request).getHeader(JwtUtils.AUTH_HEADER);
+        if (ObjectUtils.isEmpty(header)){
+            code = 503;
+            message = "STS token瑙g爜杩囩▼涓紝鐢变簬鍐呴儴璋冪敤澶辫触瀵艰嚧瑙g爜澶辫触锛岃绋嶅悗鍐嶈瘯銆�";
+            return false;
+        }
+        boolean allowed = false;
+        try {
+            // 妫�娴婬eader閲岀殑 JWT token鍐呭鏄惁姝g‘锛屽皾璇曚娇鐢� token杩涜鐧诲綍
+            allowed = executeLogin(request, response);
+        } catch (IllegalStateException e) { // not found any token
+            log.error("Not found any token");
+        } catch (Exception e) {
+            log.error("Error occurs when login", e);
+        }
+        return allowed || super.isPermissive(mappedValue);
+    }
+
+
+    /**
+     * 韬唤楠岃瘉,妫�鏌� JWT token 鏄惁鍚堟硶
+     */
+    @Override
+    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
+        AuthenticationToken token = createToken(request, response);
+        if (token == null) {
+            String msg = "createToken method implementation returned null. A valid non-null AuthenticationToken "
+                    + "must be created in order to execute a login attempt.";
+            throw new IllegalStateException(msg);
+        }
+
+        try {
+            Subject subject = getSubject(request, response);
+            subject.login(token); // 浜ょ粰 Shiro 鍘昏繘琛岀櫥褰曢獙璇�
+            return onLoginSuccess(token, subject, request, response);
+        } catch (AuthenticationException e) {
+            return onLoginFailure(token, e, request, response);
+        }
+    }
+
+    /**
+     * 浠� Header 閲屾彁鍙� JWT token
+     */
+    @Override
+    protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+        String authorization = httpServletRequest.getHeader(JwtUtils.AUTH_HEADER);
+        JwtToken token = new JwtToken(authorization);
+        return token;
+    }
+
+    /**
+     * isAccessAllowed()鏂规硶杩斿洖false锛屼細杩涘叆璇ユ柟娉曪紝琛ㄧず鎷掔粷璁块棶
+     */
+    @Override
+    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
+        HttpServletResponse httpResponse = WebUtils.toHttp(servletResponse);
+        httpResponse.setCharacterEncoding("UTF-8");
+        httpResponse.setContentType("application/json;charset=UTF-8");
+        httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
+        PrintWriter writer = httpResponse.getWriter();
+        writer.write("{\"errCode\": "+ code +", \"msg\": \"" + message +"\"}");
+        fillCorsHeader(WebUtils.toHttp(servletRequest), httpResponse);
+        return false;
+    }
+
+    /**
+     * Shiro 鍒╃敤 JWT token 鐧诲綍鎴愬姛锛屼細杩涘叆璇ユ柟娉�
+     */
+    @Override
+    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
+                                     ServletResponse response) {
+        HttpServletResponse httpResponse = WebUtils.toHttp(response);
+        String newToken = null;
+        if (token instanceof JwtToken) {
+            newToken = JwtUtils.refreshTokenExpired(token.getCredentials().toString(), JwtUtils.SECRET);
+        }
+        if (newToken != null)
+            httpResponse.setHeader(JwtUtils.AUTH_HEADER, newToken);
+        return true;
+    }
+
+    /**
+     * Shiro 鍒╃敤 JWT token 鐧诲綍澶辫触锛屼細杩涘叆璇ユ柟娉�
+     */
+    @Override
+    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request,
+                                     ServletResponse response) {
+        // 姝ゅ鐩存帴杩斿洖 false 锛屼氦缁欏悗闈㈢殑  onAccessDenied()鏂规硶杩涜澶勭悊
+        String error = e.getClass().toString().split("\\.")[4];
+        if (error.equals("IncorrectCredentialsException")) {
+            code = 10010;
+        } else {
+            code = 401;
+        }
+        message = e.getMessage();
+        return false;
+    }
+
+    /**
+     * 娣诲姞璺ㄥ煙鏀寔
+     */
+    protected void fillCorsHeader(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
+        httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
+        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,HEAD");
+        httpServletResponse.setHeader("Access-Control-Allow-Headers",
+                httpServletRequest.getHeader("Access-Control-Request-Headers"));
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java
new file mode 100644
index 0000000..d75fd50
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java
@@ -0,0 +1,48 @@
+package com.yuanchu.limslaboratory.shiro.realm;
+
+import com.yuanchu.limslaboratory.pojo.User;
+import com.yuanchu.limslaboratory.shiro.JwtToken;
+import com.yuanchu.limslaboratory.utils.RedisUtil;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+
+public class JwtRealm extends AuthorizingRealm {
+    /**
+     * 闄愬畾杩欎釜 Realm 鍙鐞嗘垜浠嚜瀹氫箟鐨� JwtToken
+     */
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof JwtToken;
+    }
+
+    /**
+     * 姝ゅ鐨� SimpleAuthenticationInfo 鍙繑鍥炰换鎰忓�硷紝瀵嗙爜鏍¢獙鏃朵笉浼氱敤鍒板畠
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
+        JwtToken jwtToken = (JwtToken) authcToken;
+        if (jwtToken.getPrincipal() == null) {
+            throw new AccountException("Token鍙傛暟寮傚父锛�");
+        }
+        // 褰撳墠鐢ㄦ埛
+        String account = jwtToken.getPrincipal().toString();
+        // 褰撳墠鐢ㄦ埛鐨則oken
+        String credentials = (String)jwtToken.getCredentials();
+        User user = (User) RedisUtil.get(credentials);
+        // 鐢ㄦ埛涓嶅瓨鍦�
+        if (user == null) {
+            throw new UnknownAccountException("鐢ㄦ埛涓嶅瓨鍦紒");
+        }
+        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, account, getName());
+        return info;
+    }
+
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+        return info;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java
new file mode 100644
index 0000000..24b24b1
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java
@@ -0,0 +1,41 @@
+package com.yuanchu.limslaboratory.shiro.realm;
+
+import com.yuanchu.limslaboratory.pojo.User;
+import com.yuanchu.limslaboratory.service.UserService;
+import com.yuanchu.limslaboratory.utils.SpringUtil;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.util.ObjectUtils;
+
+public class ShiroRealm extends AuthorizingRealm {
+
+    public User user;
+
+    /**
+     * 闄愬畾杩欎釜 Realm 鍙鐞� UsernamePasswordToken
+     */
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof UsernamePasswordToken;
+    }
+
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
+        return null;
+    }
+
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
+        String principal = (String) authenticationToken.getPrincipal();
+        //鑾峰彇UserService瀵硅薄
+        UserService userService = SpringUtil.getBean(UserService.class);
+        user = userService.AccordingUsernameSelectAll(principal);
+        if (!ObjectUtils.isEmpty(user)) {
+            return new SimpleAuthenticationInfo(user.getAccount(), user.getPassword(), this.getName());
+        } else {
+            throw new UnknownAccountException();
+        }
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java
new file mode 100644
index 0000000..a04c5b6
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.shiro.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.credential.CredentialsMatcher;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JwtCredentialsMatcher implements CredentialsMatcher {
+    /**
+     * JwtCredentialsMatcher鍙渶楠岃瘉JwtToken鍐呭鏄惁鍚堟硶
+     */
+    @Override
+    public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {
+
+        String token = authenticationToken.getCredentials().toString();
+        String account = authenticationToken.getPrincipal().toString();
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(JwtUtils.getSecret());
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("account", account).build();
+            verifier.verify(token);
+            return true;
+        } catch (JWTVerificationException e) {
+
+        } catch (Exception e){
+            e.printStackTrace();
+        }
+        return false;
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java
new file mode 100644
index 0000000..68ae14f
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java
@@ -0,0 +1,159 @@
+package com.yuanchu.limslaboratory.shiro.utils;
+
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTCreationException;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.PostConstruct;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+
+@Component
+public class JwtUtils {
+    private static String staticSecret;
+
+    @Value("${login.secret}")
+    private String secret;
+
+    @PostConstruct
+    public void getApiToken() {
+        staticSecret = this.secret;
+    }
+
+    public static String getSecret() {
+        // lockie.zou
+        return staticSecret;
+    }
+
+    // 杩囨湡鏃堕棿 2 灏忔椂
+    private static final long EXPIRE_TIME = 2 * 60 * 60 * 1000;
+    //鑷繁瀹氬埗瀵嗛挜
+    public static final String SECRET = "J-(t]Poe9P";
+
+    //璇锋眰澶�
+    public static final String AUTH_HEADER = "X-Token";  // X-Authorization-With
+
+    /**
+     * 楠岃瘉token鏄惁姝g‘
+     * @param token
+     * @return
+     */
+    public static boolean verify(String token){
+        try{
+            String account = getClaimFiled(token, "account");
+            if (account == null){
+                return false;
+            }
+            Algorithm algorithm = Algorithm.HMAC256(getSecret());
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("account",account).build();
+            verifier.verify(token);
+            return true;
+        } catch (JWTVerificationException exception){
+            return false;
+        } catch (Exception e){
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鑾峰緱token涓殑鑷畾涔変俊鎭�,涓�鑸槸鑾峰彇token鐨剈sername锛屾棤闇�secret瑙e瘑涔熻兘鑾峰緱
+     * @param token
+     * @param filed
+     * @return
+     */
+    public static String getClaimFiled(String token, String filed){
+        try{
+            if (!ObjectUtils.isEmpty(token)){
+                DecodedJWT jwt = JWT.decode(token);
+                return jwt.getClaim(filed).asString();
+            }
+            return null;
+        } catch (JWTDecodeException e){
+            return null;
+        }
+    }
+
+    /**
+     * 鐢熸垚绛惧悕,鍑嗙‘鍦拌鏄敓鎴恡oken
+     * @return
+     */
+    public static String sign(String account){
+        try{
+            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+            Algorithm algorithm = Algorithm.HMAC256(SECRET);
+            //闄勫甫username,nickname淇℃伅
+            return JWT.create()
+                    .withClaim("account",account)
+                    .withExpiresAt(date)
+                    .sign(algorithm);
+        } catch (JWTCreationException e){
+            e.printStackTrace();
+            return null;
+        } catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇token鐨勭鍙戞椂闂�
+     * @param token
+     * @return
+     */
+    public static Date getIssueAt(String token){
+        try{
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getIssuedAt();
+        } catch (JWTDecodeException e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 楠岃瘉token鏄惁杩囨湡
+     * @param token
+     * @return
+     */
+    public static boolean isTokenExpired(String token){
+        Date now = Calendar.getInstance().getTime();
+        DecodedJWT jwt = JWT.decode(token);
+        return jwt.getExpiresAt().before(now);
+    }
+
+    /**
+     * 鍒锋柊token鐨勬湁鏁堟湡
+     * @param token
+     * @param secret
+     * @return
+     */
+    public static String refreshTokenExpired(String token, String secret){
+        DecodedJWT jwt = JWT.decode(token); //瑙f瀽token
+        Map<String, Claim> claims = jwt.getClaims(); //鑾峰彇token鐨勫弬鏁颁俊鎭�
+
+        try{
+            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTCreator.Builder builder = JWT.create().withExpiresAt(date);
+            for(Map.Entry<String,Claim> entry : claims.entrySet()){
+                builder.withClaim(entry.getKey(),entry.getValue().asString());
+            }
+            return builder.sign(algorithm);
+        } catch (JWTCreationException e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java
new file mode 100644
index 0000000..095138e
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java
@@ -0,0 +1,34 @@
+package com.yuanchu.limslaboratory.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="NewPersonnelVo瀵硅薄", description="鐢ㄤ簬瀵硅鑹茬鐞嗙殑娣诲姞")
+public class NewPersonnelVo {
+
+    @ApiModelProperty(value = "濮撳悕", example = "灏忛粦", required = true)
+    private String name;
+
+    @ApiModelProperty(value = "璐﹀彿", example = "45612345", required = true)
+    private String account;
+
+    @ApiModelProperty(value = "0锛氭棤鏉冮檺锛�1锛氭湁鏉冮檺", example = "1", required = true)
+    private Integer role_id;
+
+    @ApiModelProperty(value = "骞撮緞", example = "23")
+    private Integer age;
+
+    @ApiModelProperty(value = "骞撮緞", example = "23", hidden = true)
+    private String password;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�", example = "12345678981")
+    private String phone;
+
+    @ApiModelProperty(value = "閭", example = "12345678@qq.com")
+    private String email;
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java
new file mode 100644
index 0000000..b5564c0
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java
@@ -0,0 +1,39 @@
+package com.yuanchu.limslaboratory.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdatePersonnelVo瀵硅薄", description="鐢ㄤ簬瀵硅鑹茬鐞嗙殑鏇存柊")
+public class PagePersonnelVo {
+
+    @ApiModelProperty(value = "涓婚敭ID", example = "1", required = true)
+    private String id;
+
+    @ApiModelProperty(value = "濮撳悕", example = "灏忛粦", required = true)
+    private String username;
+
+    @ApiModelProperty(value = "瑙掕壊鏉冮檺", example = "灏忛粦", required = true)
+    private String roleName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "骞撮緞", example = "23")
+    private Integer age;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�", example = "12345678981")
+    private String phone;
+
+    @ApiModelProperty(value = "閭", example = "12345678@qq.com")
+    private String email;
+
+    @ApiModelProperty(value = "鍦ㄨ亴鐘舵�� 姝e父>=1,绂昏亴<=0", example = "0")
+    private Integer jobState;
+}
diff --git a/user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java
new file mode 100644
index 0000000..2c6c05a
--- /dev/null
+++ b/user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java
@@ -0,0 +1,41 @@
+package com.yuanchu.limslaboratory.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="UpdatePersonnelVo瀵硅薄", description="鐢ㄤ簬瀵硅鑹茬鐞嗙殑鏇存柊")
+public class UpdatePersonnelVo {
+
+    @ApiModelProperty(value = "涓婚敭ID", example = "1", required = true)
+    private String id;
+
+    @ApiModelProperty(value = "濮撳悕", example = "灏忛粦", required = true)
+    private String name;
+
+    @ApiModelProperty(value = "璐﹀彿", example = "45612345", required = true)
+    private String account;
+
+    @ApiModelProperty(value = "0锛氭棤鏉冮檺锛�1锛氭湁鏉冮檺", example = "1", required = true)
+    private Integer role_id;
+
+    @ApiModelProperty(value = "骞撮緞", example = "23")
+    private Integer age;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�", example = "12345678981")
+    private String phone;
+
+    @ApiModelProperty(value = "閭", example = "12345678@qq.com")
+    private String email;
+
+    @ApiModelProperty(value = "鍦ㄨ亴鐘舵�� 姝e父>=1,绂昏亴<=0", example = "0")
+    private Integer jobState;
+
+    @ApiModelProperty(value = "璐﹀彿瀵嗙爜", example = "654321")
+    private String password;
+
+
+}
diff --git a/user-server/src/main/resources/mapper/EnterpriseMapper.xml b/user-server/src/main/resources/mapper/EnterpriseMapper.xml
new file mode 100644
index 0000000..4e3ed5f
--- /dev/null
+++ b/user-server/src/main/resources/mapper/EnterpriseMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.yunachu.limslaboratory.mapper.EnterpriseMapper">
+
+</mapper>
diff --git a/user-server/src/main/resources/mapper/RoleMapper.xml b/user-server/src/main/resources/mapper/RoleMapper.xml
new file mode 100644
index 0000000..ea9cf2d
--- /dev/null
+++ b/user-server/src/main/resources/mapper/RoleMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.yuanchu.limslaboratory.mapper.RoleMapper">
+
+</mapper>
diff --git a/user-server/src/main/resources/mapper/UserMapper.xml b/user-server/src/main/resources/mapper/UserMapper.xml
new file mode 100644
index 0000000..54ecc0e
--- /dev/null
+++ b/user-server/src/main/resources/mapper/UserMapper.xml
@@ -0,0 +1,44 @@
+<?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="com.yuanchu.limslaboratory.mapper.UserMapper">
+    <select id="selectUserByUserId" parameterType="int" resultType="Map">
+        SELECT u.account    account,
+               u.name       uname,
+               u.phone,
+               u.email,
+               u.info,
+               e.byname     e_byname,
+               e.`name`     e_name,
+               e.link_name  e_link_name,
+               e.link_phone e_phone
+        FROM enterprise e,
+             `user` u
+        WHERE e.`id` = u.`enterprise_id`
+          AND u.id = #{userId}
+    </select>
+
+    <resultMap id="PagePersonnelVoMap" type="com.yuanchu.limslaboratory.vo.PagePersonnelVo">
+        <result property="id" column="id"/>
+        <result property="username" column="username"/>
+        <result property="roleName" column="roleName"/>
+        <result property="createTime" column="create_time"/>
+        <result property="age" column="age"/>
+        <result property="phone" column="phone"/>
+        <result property="email" column="email"/>
+        <result property="jobState" column="job_state"/>
+    </resultMap>
+    <select id="getNewPersonnelPage" resultMap="PagePersonnelVoMap">
+        SELECT u.`id`, u.`name` username, r.`name` roleName, u.`create_time`, IFNULL(u.`age`, '---') age,
+        IFNULL(u.`phone`, '---') phone, IFNULL(u.`email`, '---') email, u.`job_state`
+        FROM `user` u, role r
+        WHERE u.`role_id` = r.`id`
+        <if test="name != null">
+            AND u.name = #{name}
+        </if>
+    </select>
+
+    <select id="selectUser" resultType="Map">
+        select id, name
+        from lims_laboratory.user
+    </select>
+</mapper>

--
Gitblit v1.9.3