From 3cfdf020e7f3c5fcef3a4b48e8532704b5b8b83b Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期四, 20 二月 2025 13:20:16 +0800
Subject: [PATCH] 设备移植

---
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java              |   20 
 cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java                               |   94 +
 cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java                     |   10 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java             |   16 
 cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml                           |   17 
 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java               |   45 
 pom.xml                                                                                     |    8 
 cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java                  |   15 
 cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java                       |  861 +++++++++++++++
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java                     |   28 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java           |    5 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java              |  492 +++++++++
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java                     |   89 +
 cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java                     |   22 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java              |  115 ++
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java     |   38 
 cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java                          |   34 
 cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java                       |   55 +
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java                     |   77 +
 cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java                           |   36 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java                      |   44 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java                            |   19 
 cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java                                 |  138 ++
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java |    2 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java    |   14 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java            |   14 
 cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java                   |   23 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java                               |   43 
 ruoyi-admin/pom.xml                                                                         |    7 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java                       |   59 +
 cnas-device/pom.xml                                                                         |   28 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java                         |   43 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java          |   75 +
 cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java                             |   80 +
 cnas-device/src/main/resources/mapper/DeviceMapper.xml                                      |  189 +++
 inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java                |   26 
 cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java                   |   45 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java                 |  205 +++
 cnas-device/src/main/resources/mapper/DataConfigMapper.xml                                  |   50 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java                       |   12 
 40 files changed, 3,176 insertions(+), 17 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
index b50d427..5b0b1cd 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
@@ -139,7 +139,7 @@
                     }
                     return true;
                 }).peek(standardProductList -> {
-                    // todo: 鍒ゆ柇鏄惁鏄師鏉愪笅鍗�, 闇�瑕佸晩鎶婇鑹茬粦瀹氬埌璇曟牱棰滆壊鐨勮姹傚�间笂
+                    //鍒ゆ柇鏄惁鏄師鏉愪笅鍗�, 闇�瑕佸晩鎶婇鑹茬粦瀹氬埌璇曟牱棰滆壊鐨勮姹傚�间笂
                     if (StringUtils.isNotBlank(insSample.getPartNo())) {
                         // 鍒ゆ柇鏄惁鏈夎繖涓瓧娈典笖鏄枃鏈被鍨�
                         if (StringUtils.isNotBlank(standardProductList.getInspectionItem())
diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
new file mode 100644
index 0000000..4aee7af
--- /dev/null
+++ b/cnas-device/pom.xml
@@ -0,0 +1,28 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.8.9</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cnas-device</artifactId>
+
+    <dependencies>
+
+        <!--涓氬姟妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>inspect-server</artifactId>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+</project>
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
new file mode 100644
index 0000000..36b2341
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
@@ -0,0 +1,205 @@
+package com.ruoyi.device.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.dto.DeviceCollectionDto;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DataConfigService;
+import com.ruoyi.device.service.DeviceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(DeviceController)琛ㄦ帶鍒跺眰
+ */
+@Api(tags = "璁惧")
+@RestController
+@RequestMapping("/deviceScope")
+public class DeviceController {
+
+    @Resource
+    private DeviceService deviceService;
+
+    @Value("${file.path}")
+    private String filePath;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+
+    @ApiOperation(value = "鏌ョ湅璁惧浜岀淮鐮佹寜閽�")
+    @GetMapping("/showDeviceQrCodeButton")
+    public void showDeviceQrCodeButton() { }
+
+    //璁惧宸ュ叿鏄庣粏
+
+    @ApiOperation(value = "鏌ヨ璁惧璇︽儏鍒楄〃")
+    @GetMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull){
+        return Result.success(deviceService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull));
+    }
+
+    @ApiOperation(value = "娣诲姞璁惧璇︽儏鍙傛暟")
+    @PostMapping("/addDeviceParameter")
+    public Result addDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.addDeviceParameter(itemParameter));
+    }
+
+    @ApiOperation(value = "鍒犻櫎璁惧璇︽儏鍙傛暟")
+    @DeleteMapping("/delDeviceParameter")
+    public Result<?> delDeviceParameter(Integer id) {
+        return Result.success(deviceService.delDeviceParameter(id));
+    }
+
+    @ApiOperation(value = "淇敼璁惧璇︽儏鍙傛暟")
+    @PostMapping("/upDeviceParameter")
+    public Result<?> upDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.upDeviceParameter(itemParameter));
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧鎬昏")
+    @GetMapping("/selectEquipmentOverview")
+    public Result selectEquipmentOverview() {
+        return Result.success(deviceService.selectEquipmentOverview());
+    }
+
+    @ApiOperation(value = "鑾峰彇琚巿鏉冧汉")
+    @GetMapping("/authorizedPerson")
+    public Result authorizedPerson() {
+        return Result.success(deviceService.authorizedPerson());
+    }
+
+    @ApiOperation(value = "鎼滅储")
+    @GetMapping("/search")
+    public Result search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return Result.success(deviceService.search(status, deviceName, specificationModel, largeCategory));
+    }
+
+    //鍥剧墖涓婁紶
+    @ApiOperation(value = "璁惧鏂囦欢涓婁紶")
+    @PostMapping("/uploadFile")
+    public Result uploadFile(MultipartFile file) {
+        String urlString;
+        String pathName;
+        String filename = file.getOriginalFilename();
+        String path;
+        try {
+            String contentType = file.getContentType();
+            if (contentType != null && contentType.startsWith("image/")) {
+                // 鏄浘鐗�
+                path = filePath;
+            } else {
+                // 鏄枃浠�
+                path = wordUrl;
+            }
+
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            HashMap<String, String> map = new HashMap<>();
+            map.put("name", filename);
+            map.put("url", pathName);
+            return Result.success(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("鏂囦欢涓婁紶閿欒");
+            return null;
+        }
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧璐熻矗浜�")
+    @GetMapping("/selectDevicePrincipal")
+    public Result selectDevicePrincipal() {
+        return Result.success(deviceService.selectDevicePrincipal());
+    }
+
+    @ApiOperation(value = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃")
+    @GetMapping("/selectDeviceByCategory")
+    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory) {
+        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,laboratory));
+    }
+
+    @ApiOperation(value = "閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃")
+    @GetMapping("/selectDeviceByCode")
+    public Result<DeviceDto> selectDeviceByCode(Integer id) {
+        return Result.success(deviceService.selectDeviceByCode(id));
+    }
+
+
+    @ApiOperation("/鏁伴噰-鏁版嵁閲囬泦")
+    @PostMapping("/dataCollection")
+    public Result<?> dataAcquisition(HttpServletRequest request,@RequestBody DeviceCollectionDto dto) {
+        return deviceService.dataAcquisition(request, dto);
+    }
+
+    @ApiOperation(value = "缁存姢鏁伴噰閰嶇疆")
+    @PostMapping("/saveDataAcquisitionConfiguration")
+    public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) {
+        dataConfigService.saveDataAcquisitionConfiguration(deviceId, dataConfigList);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ鏁伴噰閰嶇疆")
+    @GetMapping("/queryDataAcquisitionConfiguration")
+    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
+        return dataConfigService.queryDataAcquisitionConfiguration(dataConfig);
+    }
+
+
+    @ApiOperation(value = "鍒犻櫎鏁伴噰閰嶇疆")
+    @DeleteMapping("/deleteDataAcquisitionConfiguration")
+    public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("ids") String ids) {
+        List<String> split = Arrays.asList(ids.split(","));
+        List<String> collect = split.stream().distinct().collect(Collectors.toList());
+        dataConfigService.removeBatchByIds(collect);
+        return Result.success();
+    }
+
+
+
+    @ApiOperation(value = "宸︿晶璁惧鏍戝舰鏍�")
+    @GetMapping("/treeDevice")
+    public Result treeDevice(String deviceName) {
+        return Result.success(deviceService.treeDevice(deviceName));
+    }
+
+
+    @ApiOperation(value = "璁惧妗f瀵煎嚭")
+    @GetMapping("/exportDeviceFile")
+    public void exportDeviceFile(@RequestParam Integer deviceId, HttpServletResponse response) throws Exception {
+        deviceService.exportDeviceFile(deviceId,response);
+    }
+
+    @ApiOperation(value = "浠櫒璁惧涓�瑙堣〃瀵煎嚭")
+    @GetMapping("/exportEquipmentDetails")
+    public void exportEquipmentDetails(HttpServletResponse response) throws Exception {
+        deviceService.exportEquipmentDetails(response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java
new file mode 100644
index 0000000..ea630ea
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DataConfig;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DataConfigDto {
+
+    private List<DataConfig> dataConfigList;
+
+    private Boolean isDevice;
+
+    @ApiModelProperty("鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty("閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty("瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty("璁惧IP")
+    private String ip;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java
new file mode 100644
index 0000000..29a7c53
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 璁惧閲囬泦瀵硅薄
+ *
+ * @Author zhuo
+ * @Date 2024/12/3
+ */
+@Data
+public class DeviceCollectionDto {
+
+    @ApiModelProperty(value = "鏍峰搧id")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String entrustCode;
+
+    @ApiModelProperty(value = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @ApiModelProperty(value = "閲囬泦鐨勬楠岄」id")
+    private List<Integer> itemIds;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java
new file mode 100644
index 0000000..e9034d4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java
@@ -0,0 +1,77 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceConfigDtoPage{
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty(value = "閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty(value = "瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty(value = "IP鍦板潃")
+    private String ip;
+
+    @ApiModelProperty(value = "妫�楠岄」鍒嗙被")
+    private String inspectionItemClass;
+
+    @ApiModelProperty(value = "妫�楠岄」")
+    private String inspectionItem;
+
+    @ApiModelProperty(value = "妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @ApiModelProperty(value = "鍏紡")
+    private String formula;
+
+    @ApiModelProperty(value = "鍙傜収X")
+    private String referx;
+
+    @ApiModelProperty(value = "X")
+    private String x;
+
+    @ApiModelProperty(value = "鍙傜収Y")
+    private String refery;
+
+
+    @ApiModelProperty(value = "Y")
+    private String y;
+
+    @ApiModelProperty(value = "鍒悕")
+    private String anotherName;
+
+    @ApiModelProperty(value = "鍖归厤鍚嶇О")
+    private String matchingName;
+
+    private Integer id;
+
+    @ApiModelProperty(value = "妫�楠屽璞�")
+    private String sample;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩甶d")
+    private Integer structureItemParameterId;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
new file mode 100644
index 0000000..da16e75
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
@@ -0,0 +1,43 @@
+package com.ruoyi.device.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.device.pojo.Device;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceDto extends Device {
+
+    @ApiModelProperty(value = "绠$悊浜�")
+    private String equipmentManagerUser;
+
+    @ApiModelProperty(value = "鎵�灞為儴闂�")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String laboratoryName;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩�")
+    private String insProductItem;
+
+    @ApiModelProperty(value = "绠$悊浜哄鍚�")
+    private String equipmentManagerName;
+
+    @ApiModelProperty(value = "琚巿鏉冧汉濮撳悕")
+    private String authorizedPersonName;
+
+    @ApiModelProperty(value = "鏍稿噯璇佷功缂栧彿")
+    private String calibrateNo;
+
+    @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDateTwo;
+
+    @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDateTwo;
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java
new file mode 100644
index 0000000..d02ecdf
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java
@@ -0,0 +1,19 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.Device;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜� 15:55:29
+ * Description:
+ */
+@Data
+public class DeviceExport extends Device {
+    @ApiModelProperty("绠$悊浜�")
+    private String equipmentManagerName;
+
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java
new file mode 100644
index 0000000..da58c09
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java
@@ -0,0 +1,38 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 10:43:06
+ * Description: 浠櫒璁惧妗f鍗′腑鏄剧ず鐨勮澶囨牎鍑嗚褰曞拰缁存姢璁板綍鐨勫垪琛ㄥ璞�
+ */
+@Data
+public class DeviceMetricRecordAndMaintenanceDto {
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+
+    // 鏍″噯琛ㄤ腑鐨勬暟鎹�
+    @ApiModelProperty("鏍″噯鏃ユ湡")
+    private String calibrationDateString;
+
+    @ApiModelProperty("璇佷功鏍囧彿")
+    private String certificateNumber;
+
+    @ApiModelProperty("鏍″噯鏈夋晥鏃ユ湡")
+    private String validityDateString;
+
+    @ApiModelProperty("鍒ゅ畾")
+    private String judgement;
+
+    // 缁翠慨璁板綍琛ㄤ腑鐨勬暟鎹�
+    @ApiModelProperty("缁翠慨鏃ユ湡")
+    private String maintenanceDateString;
+
+    @ApiModelProperty("澶勭悊鏂瑰紡")
+    private String handlingMethod;
+
+    @ApiModelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java
new file mode 100644
index 0000000..0db811c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java
@@ -0,0 +1,45 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 8:45:34
+ * Description: 鐢ㄤ簬浠櫒璁惧妗f鍗$殑瀵煎嚭
+ */
+@Data
+public class DocumentExportWordDto {
+
+    // 璁惧妗f宸﹀垪琛�
+    @ApiModelProperty("搴忓彿")
+    private Integer index1;
+
+    @ApiModelProperty("妗f鍚嶇О")
+    private String name1;
+
+    @ApiModelProperty("浠芥暟")
+    private Integer quantity1;
+
+    @ApiModelProperty("椤电爜")
+    private Integer pageCount1;
+
+    @ApiModelProperty("褰掓。鏃ユ湡")
+    private String archiveDateString1;
+
+    // 璁惧妗f鍙冲垪琛�
+    @ApiModelProperty("搴忓彿")
+    private Integer index2;
+
+    @ApiModelProperty("妗f鍚嶇О")
+    private String name2;
+
+    @ApiModelProperty("浠芥暟")
+    private Integer quantity2;
+
+    @ApiModelProperty("椤电爜")
+    private Integer pageCount2;
+
+    @ApiModelProperty("褰掓。鏃ユ湡")
+    private String archiveDateString2;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java
new file mode 100644
index 0000000..d2cde7e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java
@@ -0,0 +1,45 @@
+package com.ruoyi.device.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+public class DeviceMaintenanceExport {
+
+    @ColumnWidth(20)
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ColumnWidth(20)
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+
+    @ColumnWidth(20)
+    @ExcelProperty("绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ColumnWidth(50)
+    @ExcelProperty("缁存姢鍐呭")
+    private String content;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢鏃堕棿")
+    private String date;
+
+    @ColumnWidth(20)
+    @ExcelProperty("涓嬫缁存姢鏃堕棿")
+    private String nextDate;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢绫诲瀷")
+    private String maintenanceType;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢浜�")
+    private String name;
+
+    @ColumnWidth(50)
+    @ExcelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java
new file mode 100644
index 0000000..7392b4e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeMapper extends BaseMapper<CollectBridge> {
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
new file mode 100644
index 0000000..e810e5c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceConfigDtoPage;
+import com.ruoyi.device.pojo.DataConfig;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigMapper extends BaseMapper<DataConfig> {
+
+    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
+
+    List<Integer> deleteDataConfig();
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
new file mode 100644
index 0000000..0297885
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 璁惧缁存姢淇濆吇
+ */
+@Mapper
+public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
+    List<DeviceMaintenance> getDeviceMaintenanceParam();
+
+
+    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
new file mode 100644
index 0000000..2f2c500
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
@@ -0,0 +1,43 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.Device;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞�
+ */
+public interface DeviceMapper extends BaseMapper<Device> {
+
+    IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew);
+    List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew);
+
+    //鑾峰彇琚巿鏉冧汉
+    List<Device> authorizedPerson();
+
+    //鏌ヨ
+    List<Device> search(@Param(value = "status") Integer status, @Param(value = "deviceName") String deviceName,
+                        @Param(value = "specificationModel") String specificationModel, @Param(value = "largeCategory") String largeCategory);
+
+    //鑾峰彇鍥剧墖鏁版嵁
+    void selectDeviceImage(@Param(value = "name") String name ,@Param(value = "id") Integer id);
+
+    //鏌ヨ璁惧璐熻矗浜�
+    List<Device> selectDevicePrincipal();
+
+    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers, @Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull);
+
+    List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id);
+
+    List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
+
+    DeviceDto selectDeviceByCode(Integer id);
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java
new file mode 100644
index 0000000..bc4bc28
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java
new file mode 100644
index 0000000..d2fc7d0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java
@@ -0,0 +1,12 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.Document;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璁惧妗f
+ */
+@Mapper
+public interface DocumentMapper extends BaseMapper<Document> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java
new file mode 100644
index 0000000..3d02bbe
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java
@@ -0,0 +1,34 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+@Data
+@TableName("collect_bridge")
+public class CollectBridge {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("濮旀墭缂栧彿")
+    private String entrustCode;
+
+    @ApiModelProperty("閲囬泦鍊�")
+    private String collectValue;
+
+    @ApiModelProperty("鏃堕棿")
+    private LocalDateTime collectDate;
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
new file mode 100644
index 0000000..547679d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
@@ -0,0 +1,80 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("device_data_config")
+@ApiModel(value = "DataConfig瀵硅薄", description = "")
+public class DataConfig implements Serializable {
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鍏紡")
+    private String formula;
+
+    @ApiModelProperty("鍙傜収X")
+    private String referx;
+
+    @ApiModelProperty("鍙傜収Y")
+    private String refery;
+
+    @ApiModelProperty("x")
+    private String x;
+
+    @ApiModelProperty("y")
+    private String y;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("妫�楠岄」鍒嗙被")
+    private String inspectionItemClass;
+
+    @ApiModelProperty("妫�楠岄」鐩�")
+    private String inspectionItem;
+
+    @ApiModelProperty("妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @TableField(exist = false)
+    @ApiModelProperty("妫�楠岄」瀛愰」")
+    private String insProductItem;
+
+    @ApiModelProperty("妫�楠岄」id")
+    private Integer structureItemParameterId;
+
+    @ApiModelProperty("搴忓彿")
+    private String serialNumber;
+
+    @ApiModelProperty("鍒悕")
+    private String anotherName;
+
+    @ApiModelProperty("鍖归厤鍚嶇О")
+    private String matchingName;
+
+    @TableField(select = false, exist = false)
+    private Boolean isDevice;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
new file mode 100644
index 0000000..d403f5a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
@@ -0,0 +1,138 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 璁惧(Device)琛ㄥ璞�
+ */
+@TableName(value = "device")
+@Data
+public class Device implements Serializable {
+
+    @ApiModelProperty(value = "涓婚敭")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "en璁惧鍚嶇О")
+    private String enDeviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "鐢熶骇鍘傚")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "鍑哄巶缂栧彿")
+    private String factoryNo;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty(value = "鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @ApiModelProperty(value = "璐疆鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime acquisitionDate;
+
+    @ApiModelProperty(value = "鏍″噯鏈夋晥鏃ユ湡")
+    private LocalDateTime activationDate;
+
+    @ApiModelProperty(value = "绠$悊浜篒d")
+    private Integer equipmentManager;
+
+    @ApiModelProperty(value = "瀛樻斁鐐�")
+    private String storagePoint;
+
+    @ApiModelProperty(value = "鎵�灞為儴闂↖d")
+    private Integer subordinateDepartmentsId;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩甀d")
+    private String insProductIds;
+
+    @ApiModelProperty(value = "鏍″噯鏈嶅姟鏈烘瀯")
+    private String calibrationServices;
+
+    @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDate;
+
+    @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDate;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    private String largeCategory;
+
+    @ApiModelProperty(value = "鍗曚环")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "璁惧鐘舵��")
+    private Integer deviceStatus;
+
+    @ApiModelProperty(value = "鏍″噯鍛ㄦ湡(鏈�)")
+    private String calibrationDate;
+
+    @ApiModelProperty(value = "鍥剧墖涓婁紶")
+    private String imageUpload;
+
+    @ApiModelProperty(value = "鍥剧墖澶囨敞")
+    private String imageName;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏁伴噰-鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty("鏁伴噰-閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty("鏁伴噰-瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty("鏁伴噰-璁惧IP")
+    private String ip;
+
+    @ApiModelProperty("鏁伴噰-鏄惁涓烘暟閲囪澶�")
+    @TableField(exist = false)
+    private Boolean isItADataAcquisitionDevice;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @ApiModelProperty("琚巿鏉冧汉")
+    private String authorizedPerson;
+
+    @ApiModelProperty("璧勪骇缂栫爜")
+    private String assetCode;
+
+    @ApiModelProperty("浜у湴")
+    private String origin;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
new file mode 100644
index 0000000..bf3c6c6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -0,0 +1,44 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+/**
+ * 璁惧缁存姢淇濆吇
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("device_maintenance")
+public class DeviceMaintenance {
+
+    //璁惧id
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer deviceId;
+
+    private String deviceName;
+    //缂栧彿
+    private String deviceNumber;
+    //缁熶竴缂栧彿
+    private String managementNumber;
+    //缁存姢鍐呭
+    private String content;
+    //缁存姢鏃ユ湡
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate date;
+    //涓嬫缁存姢鏃ユ湡
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate nextDate;
+    //缁存姢绫诲瀷
+    private Integer maintenanceType;
+    //缁存姢浜哄憳
+    private String name;
+    //澶囨敞
+    private String comments;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java
new file mode 100644
index 0000000..5855ca2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Getter
+@Setter
+@TableName("device_metric_record")
+@ApiModel(value = "DeviceMetricRecord瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍")
+public class DeviceMetricRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁板綍缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁¢噺鍗曚綅")
+    private String unitOfMeasure;
+
+    @ApiModelProperty("鏍″噯鏃ユ湡")
+    private Date calibrationDate;
+
+    @ApiModelProperty("涓嬫鏍″噯鏃ユ湡")
+    private Date nextCalibrationDate;
+
+    @ApiModelProperty("璁$畻鍣ㄥ叿")
+    private String calculatingApparatus;
+
+    @ApiModelProperty("璁$畻鏍囧噯閲忕▼")
+    private String standardRange;
+
+    @ApiModelProperty("璁¢噺鏍囧噯涓嶇‘瀹氬害")
+    private String calibrationStandardUncertainty;
+
+    @ApiModelProperty("渚濇嵁鏂囦欢")
+    private String byDocument;
+
+    @ApiModelProperty("璇佷功缂栧彿")
+    private String certificateSerialNumber;
+
+    @ApiModelProperty("鐘舵��")
+    private String status;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿 / 鐧昏鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鐧昏浜�")
+    private String createUser;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+
+    @ApiModelProperty("纭鏃堕棿")
+    private Date confirmDate;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java
new file mode 100644
index 0000000..25ab334
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java
@@ -0,0 +1,94 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 璁惧妗f
+ */
+@Data
+@TableName(value = "device_documents")
+public class Document implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鏂囨。绫诲瀷锛堟灇涓撅級
+     */
+    private String documentType;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐗堟湰鍙�
+     */
+    private String version;
+
+    /**
+     * 鏁伴噺
+     */
+    private Integer quantity;
+
+    /**
+     * 椤垫暟
+     */
+    private Integer pageCount;
+
+    /**
+     * 鎻愪緵鍟�
+     */
+    private String provider;
+
+    /**
+     * 鎻愪緵鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime provideDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String comments;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime createdAt;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updatedAt;
+
+    private int deviceId;
+
+    @ApiModelProperty("璧勪骇缂栧彿")
+    private String number;
+
+    @ApiModelProperty("鍘熷鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String fileName;
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
new file mode 100644
index 0000000..e680c0e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.pojo.DataConfig;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigService extends IService<DataConfig> {
+
+    void deleteDataConfig();
+
+    void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList);
+
+    Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java
new file mode 100644
index 0000000..b732701
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java
@@ -0,0 +1,59 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.device.dto.DeviceCollectionDto;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.Device;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔℃帴鍙�
+ */
+public interface DeviceService extends IService<Device> {
+
+
+    IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull);
+
+    int addDeviceParameter(Device itemParameter);
+
+    int delDeviceParameter(Integer id);
+
+    int upDeviceParameter(Device itemParameter);
+
+    List<Device> selectEquipmentOverview();
+
+    List<Device> authorizedPerson();
+
+    List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory);
+
+    List<Device> selectDevicePrincipal();
+
+    List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory);
+
+    DeviceDto selectDeviceByCode(Integer id);
+
+    Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto);
+
+    List<Map<String, Object>> treeDevice(String deviceName);
+
+    /**
+     * 瀵煎嚭璁惧鍒楄〃
+     * @param deviceId
+     * @param response
+     */
+    void exportDeviceFile(Integer deviceId, HttpServletResponse response);
+
+    /**
+     * 瀵煎嚭璁惧宸ュ叿鏄庣粏
+     * @param response
+     */
+    void exportEquipmentDetails(HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java
new file mode 100644
index 0000000..bd9b275
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java
@@ -0,0 +1,10 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.Document;
+
+/**
+ * 璁惧妗f
+ */
+public interface DocumentService extends IService<Document> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java b/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java
new file mode 100644
index 0000000..8ed0bfd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java
@@ -0,0 +1,55 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import org.springframework.ui.Model;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+
+public interface QrShowService {
+
+    /**
+     * 璁$畻鍚敤鏃堕暱
+     * @param activationDate
+     * @return
+     */
+    double calcUsedYears(LocalDateTime activationDate);
+
+    /**
+     * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    double calcDeviceNextCheckRatio(Date startDate, Date endDate);
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @param deviceId
+     * @param type
+     * @return
+     */
+    DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type);
+
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    String formatDate(Date date,String formatter);
+
+
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    String formatDate(LocalDate date, String formatter);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
new file mode 100644
index 0000000..1bbac34
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
@@ -0,0 +1,75 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.mapper.DataConfigMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DataConfigService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Service
+@AllArgsConstructor
+public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService {
+
+    private DeviceMapper deviceMapper;
+
+    private DataConfigMapper dataConfigMapper;
+
+    @Override
+    public void deleteDataConfig() {
+        List<Integer> integers = dataConfigMapper.deleteDataConfig();
+        if (!integers.isEmpty()) {
+            dataConfigMapper.deleteBatchIds(integers);
+        }
+    }
+
+    @Override
+    public void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList) {
+        if (dataConfigList.getIsDevice()) {
+            Device device = new Device();
+            BeanUtils.copyProperties(dataConfigList, device);
+            device.setId(deviceId);
+            deviceMapper.updateById(device);
+        } else {
+            this.saveOrUpdateBatch(dataConfigList.getDataConfigList());
+        }
+    }
+
+    @Override
+    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
+        if (dataConfig.getIsDevice()) {
+            LambdaQueryWrapper<DataConfig> wrapper = Wrappers.<DataConfig>lambdaQuery()
+                    .eq(DataConfig::getDeviceId, dataConfig.getDeviceId())
+                    .eq(DataConfig::getInspectionItem, dataConfig.getInspectionItem())
+                    .eq(DataConfig::getInspectionItemSubclass, dataConfig.getInspectionItemSubclass());
+            if (StringUtils.isNotBlank(dataConfig.getInspectionItemClass())) {
+                wrapper.eq(DataConfig::getInspectionItemClass, dataConfig.getInspectionItemClass());
+            }
+            if (dataConfig.getStructureItemParameterId() != null) {
+                wrapper.eq(DataConfig::getStructureItemParameterId, dataConfig.getStructureItemParameterId());
+            }
+            List<DataConfig> list = baseMapper.selectList(wrapper);
+            return Result.success(list);
+        } else {
+            return Result.success(dataConfigMapper.selectDataConfigList(dataConfig.getDeviceId()));
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..2192576
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,492 @@
+package com.ruoyi.device.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.device.dto.*;
+import com.ruoyi.device.mapper.CollectBridgeMapper;
+import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.device.pojo.*;
+import com.ruoyi.device.service.DataConfigService;
+import com.ruoyi.device.service.DeviceService;
+import com.ruoyi.device.service.DocumentService;
+import com.ruoyi.device.utils.DataAcquisition;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔″疄鐜扮被
+ */
+@Service
+@AllArgsConstructor
+public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
+
+    private DeviceMapper deviceMapper;
+
+    private UserMapper userMapper;
+
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    private DataConfigService dataConfigService;
+
+    private QrShowServiceImpl qrShowService;
+
+    private InsSampleMapper insSampleMapper;
+
+    private DocumentService documentService;
+
+    private DeviceMetricRecordMapper deviceMetricRecordMapper;
+
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    private CollectBridgeMapper collectBridgeMapper;
+
+    @Override
+    public IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        return iPage;
+    }
+
+    @Override
+    public int addDeviceParameter(Device itemParameter) {
+        return deviceMapper.insert(itemParameter);
+    }
+
+    @Override
+    public int delDeviceParameter(Integer id) {
+        return deviceMapper.deleteById(id);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public int upDeviceParameter(Device itemParameter) {
+        // 鍒犻櫎鏁伴噰闆嗛厤缃暟鎹�
+        dataConfigService.deleteDataConfig();
+        // 闇�瑕佸悓鏃舵洿鏀� device琛�
+
+
+        return deviceMapper.updateById(itemParameter);
+    }
+
+    @Override
+    public List<Device> selectEquipmentOverview() {
+        return deviceMapper.selectEquipmentOverview(new Page(1, 10), QueryWrappers.queryWrappers(new Device()));
+    }
+
+    @Override
+    public List<Device> authorizedPerson() {
+        return deviceMapper.authorizedPerson();
+    }
+
+    @Override
+    public List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return deviceMapper.search(status, deviceName, specificationModel, largeCategory);
+    }
+
+    @Override
+    public List<Device> selectDevicePrincipal() {
+        return deviceMapper.selectDevicePrincipal();
+    }
+
+    @Override
+    public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
+        List<Integer> id;
+
+        try {
+            id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
+                    .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+                    .eq(ObjectUtils.isNotEmpty(inspectionItemSubclass), StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
+                    .eq(ObjectUtils.isNotEmpty(laboratory), StructureItemParameter::getLaboratory, laboratory)
+                    .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
+        } catch (Exception e) {
+            return null;
+        }
+        List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .eq(Device::getDeviceStatus, 0)
+                .isNotNull(Device::getInsProductIds));
+        List<Device> devices2 = new ArrayList<>();
+        for (Device device : devices) {
+            String[] ids = device.getInsProductIds().split(",");
+            for (String i : ids) {
+                if (ObjectUtils.isNotEmpty(i)) {
+                    if (id.contains(Integer.parseInt(i))) {
+                        devices2.add(device);
+                        break;
+                    }
+                }
+            }
+        }
+        return devices2;
+    }
+
+    @Override
+    public DeviceDto selectDeviceByCode(Integer id) {
+        DeviceDto deviceDto = deviceMapper.selectDeviceByCode(id);
+        List<Integer> ids = new ArrayList<>();
+        if (Strings.isNotEmpty(deviceDto.getAuthorizedPerson())) {
+            if (deviceDto.getAuthorizedPerson().equals("null")) {
+                deviceDto.setAuthorizedPerson("[]");
+            }
+            ids = JSON.parseArray(deviceDto.getAuthorizedPerson(), Integer.class);
+        }
+        String name = "";
+        if (!ids.isEmpty()) {
+            name = userMapper.selectBatchIds(ids).stream().map(User::getName).collect(Collectors.joining(","));
+        }
+        deviceDto.setAuthorizedPersonName(name);
+        //鏌ヨ璁惧鏍″噯淇℃伅
+        DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate");
+        deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
+
+        // 鍒颁簡鍋滅敤鏃ユ湡锛岃嚜鍔ㄥ皢鐘舵�佹敼涓哄仠鐢�
+        if (deviceDto.getNextCalibrationDate() != null) {
+            if (LocalDateTime.now().isAfter(deviceDto.getNextCalibrationDate())) {
+                // todo: 璁惧杩愯鐘舵�佸瓧鍏�
+//                List<Enums> enums = enumService.selectEnumByCategory("璁惧鐘舵��");
+//                List<Enums> status = enums.stream().filter(item -> item.getLabel().equals("鍋滅敤")).collect(Collectors.toList());
+//                deviceDto.setDeviceStatus(Integer.parseInt(status.get(0).getValue()));
+                deviceMapper.updateById(deviceDto);
+            }
+        }
+        return deviceDto;
+    }
+
+    @Override
+    public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) {
+
+        // 鏌ヨ妫�楠岄」
+        List<Integer> itemIds = dto.getItemIds();
+        if (CollectionUtils.isEmpty(itemIds)) {
+            throw new ErrorException("娌℃湁闇�瑕佹暟閲囩殑妫�楠岄」");
+        }
+        List<InsProduct> insProducts = insSampleMapper.selectProductResult(itemIds);
+
+        // 鏌ヨ妫�楠岄」缁戝畾鐨刬d
+        List<Integer> itemParameterIds = insProducts.stream().map(InsProduct::getStructureItemParameterId).collect(Collectors.toList());
+
+        Set<String> deviceCodeSet = new LinkedHashSet<>();
+        for (InsProduct product : insProducts) {
+            // 鏌ヨ璁惧
+            // 娣诲姞璁惧缂栧彿
+            if (product.getInsProductResult() != null) {
+                List<JSONObject> jsonObjects = JSON.parseArray(product.getInsProductResult().getEquipValue(), JSONObject.class);
+                for (JSONObject jsonObject : jsonObjects) {
+                    if (!"".equals(jsonObject.get("v") + "")) {
+                        List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                        deviceCodeSet.addAll(v);
+                    }
+                }
+            }
+        }
+        if (CollectionUtils.isEmpty(deviceCodeSet)) {
+            throw new ErrorException("鏈�夋嫨璁惧淇℃伅");
+        }
+        // 鑾峰彇璁惧闆嗗悎
+        List<Device> deviceList = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .in(Device::getManagementNumber, deviceCodeSet)
+                .isNotNull(Device::getIp)
+                .ne(Device::getIp, ""));
+
+        if (CollectionUtils.isEmpty(deviceList)) {
+            throw new ErrorException("鏃犺澶囬厤缃噰闆嗙粦瀹氫俊鎭�");
+        }
+
+        // 鏁伴噰杩斿洖淇℃伅
+        Map<String, Object> map = new HashMap<>();
+        for (Device device : deviceList) {
+            String ip = device.getIp();
+            // 鏍规嵁妫�楠岄」鑾峰彇config
+            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
+                    .in(DataConfig::getStructureItemParameterId, itemParameterIds)
+                    .eq(DataConfig::getDeviceId, device.getId()));
+
+            // 鑾峰彇璁惧閰嶇疆绫�
+            // 鍒ゆ柇璁惧鏄惁鏄暟瀛楃洿妗�
+            if (device.getManagementNumber().equals("JCZX-ZB-ER02022")) {
+                map.putAll(dataCollectBridge(list, device, dto.getEntrustCode()));
+            } else {
+                map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag()));
+            }
+        }
+
+
+        // 4銆侀�犲惊鐜鏁帮紝鍙備笌鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(map)) {
+            Map<String, Object> frequency = DataAcquisition.createFrequency(dto.getEntrustCode(), dto.getEntrustCode(), map);
+            return Result.success(frequency);
+        } else {
+            return Result.success(null);
+        }
+    }
+
+    /**
+     * 鑾峰彇鏁板瓧鐩存ˉ妫�娴嬩俊鎭�
+     * @return
+     */
+    public Map<String, ?> dataCollectBridge(List<DataConfig> dataConfig, Device device, String entrustCode) {
+        // 鎷兼帴鍚嶅瓧
+        Map<String, List<DataConfig>> userMap = dataConfig.stream()
+                .peek(i -> {
+                    String itemName = i.getInspectionItem();
+                    if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
+                        itemName += "@" + i.getInspectionItemClass();
+                    }
+                    String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
+
+                    // 娣诲姞妫�楠岄」鍚嶇О
+                    i.setInsProductItem(name);
+                })
+                .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
+
+        Map<String, Object> map = new HashMap<>();
+
+        userMap.forEach((k, v) -> {
+            List<String> resultValue = new ArrayList<>();
+            // 鏌ヨ鐩存ˉ鐢垫祦鐢甸樆鏁伴噰鍊�
+            List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery()
+                    .like(CollectBridge::getEntrustCode, entrustCode)
+                    .orderByAsc(CollectBridge::getCollectDate));
+
+            resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList());
+
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", resultValue);
+            map.put(k, hashMap);
+        });
+        return map;
+    }
+
+
+    @Override
+    public List<Map<String, Object>> treeDevice(String deviceName) {
+        List<Map<String, Object>> listMap = deviceMapper.treeDevice(deviceName);
+        return listMap;
+    }
+
+
+
+    @Override
+    public void exportDeviceFile(Integer deviceId, HttpServletResponse response) {
+
+        // 璁惧淇℃伅
+        Device device = baseMapper.selectById(deviceId);
+        // 璁惧妗f
+        List<Document> documentList = documentService.list(Wrappers.<Document>lambdaQuery().eq(Document::getDeviceId, deviceId));
+        // 璁惧鏍″噯琛�
+        List<DeviceMetricRecord> deviceMetricRecordList = deviceMetricRecordMapper.selectList(Wrappers.<DeviceMetricRecord>lambdaQuery().eq(DeviceMetricRecord::getDeviceId, deviceId));
+        // 璁惧缁翠慨琛�
+        List<DeviceMaintenance> deviceMaintenanceList = deviceMaintenanceMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery().eq(DeviceMaintenance::getDeviceId, deviceId));
+
+
+        // 杩斿洖缁檞ord鐨勬暟鎹垪琛� 鍒嗕负宸﹀彸涓ゅ垪鏁版嵁
+        List<DocumentExportWordDto> documentExportWordDtoList = new ArrayList<>();
+        // 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀�
+        extracted(documentList, documentExportWordDtoList);
+
+
+        // 灏嗘牎鍑嗚〃鍜岀淮淇〃鏀惧叆涓�涓璞′腑鏂逛究word琛ㄦ牸涓樉绀�
+        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = getDeviceMetricRecordAndMaintenanceDtoList(deviceMetricRecordList, deviceMaintenanceList);
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-document.docx");
+        Configure configure = Configure.builder()
+                .bind("document", new HackLoopTableRenderPolicy())
+                .bind("deviceMetricRecordAndMaintenanceDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("device", device);
+                    put("document", documentExportWordDtoList); // 妗f
+                    put("deviceMetricRecordAndMaintenanceDtoList", deviceMetricRecordAndMaintenanceDtoList); // 鏍″噯琛� 鍜� 缁翠慨琛�
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    device.getDeviceName() + "妗f", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    private List<DeviceMetricRecordAndMaintenanceDto> getDeviceMetricRecordAndMaintenanceDtoList(List<DeviceMetricRecord> deviceMetricRecordList, List<DeviceMaintenance> deviceMaintenanceList) {
+        // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闆嗗悎
+        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = new ArrayList<>();
+        // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闀垮害鍙兘涓嶄竴鏍� 鍙栨渶澶у�� 涓嶅鐨勭敤绌烘暟鎹~鍏�
+        int metricRecordSize = deviceMetricRecordList.size();
+        int maintenanceSize = deviceMaintenanceList.size();
+        int size = Math.max(metricRecordSize, maintenanceSize);
+        // 缁� 鏍¢獙鍜岀淮淇璞� 璧嬪��
+        for (int i = 0; i < size; i++) {
+            // 鏍¢獙鍜岀淮淇璞�
+            DeviceMetricRecordAndMaintenanceDto deviceMetricRecordAndMaintenanceDto = new DeviceMetricRecordAndMaintenanceDto();
+            // 璁剧疆搴忓彿
+            deviceMetricRecordAndMaintenanceDto.setIndex(i + 1);
+
+            // 鏍″噯琛ㄦ暟鎹�
+            if (metricRecordSize > i) {
+                // 璁剧疆鏃ユ湡鏍煎紡
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                // 鑾峰彇璁惧鏍″噯琛ㄦ暟鎹�
+                DeviceMetricRecord deviceMetricRecord = deviceMetricRecordList.get(i);
+                // 璁剧疆鏍″噯鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setCalibrationDateString(sdf.format(deviceMetricRecord.getCalibrationDate()));
+                // 璁剧疆璇佷功缂栧彿
+                deviceMetricRecordAndMaintenanceDto.setCertificateNumber(deviceMetricRecord.getCertificateSerialNumber());
+                // 璁剧疆鏈夋晥鏈�
+                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getNextCalibrationDate()));
+                // 璁剧疆鏍″噯鏈夋晥鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getConfirmDate()));
+                // 璁剧疆妫�楠岀粨鏋�
+                deviceMetricRecordAndMaintenanceDto.setJudgement(deviceMetricRecord.getStatus());
+            }
+
+            // 缁翠慨琛ㄦ暟鎹�
+            if (maintenanceSize > i) {
+                // 鑾峰彇璁惧缁翠慨琛ㄦ暟鎹�
+                DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(i);
+                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                // 缁翠慨鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getDate().format(dateTimeFormatter));
+                // 澶勭悊鏂规硶
+                deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getContent());
+                // 澶囨敞
+                deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getComments());
+            }
+
+            deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto);
+        }
+        return deviceMetricRecordAndMaintenanceDtoList;
+    }
+
+    /**
+     * 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀�
+     *
+     * @param documentList              妗f鍒楄〃
+     * @param documentExportWordDtoList 杩斿洖缁檞ord鐨勬暟鎹垪琛�
+     */
+    private static void extracted(List<Document> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
+        // 缁欐。妗堝姞搴忓彿   骞朵笖鍒嗕负宸﹀彸涓や釜鍒楄〃鍦╳ord涓樉绀�
+        for (int i = 0; i < documentList.size(); i++) {
+            // 鍒涘缓word琛ㄦ牸涓竴琛岀殑鏁版嵁瀵硅薄
+            DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto();
+            // 鑾峰彇妗f淇℃伅
+            Document document = documentList.get(i);
+            // 鏍煎紡鍖栨棩鏈�
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            // 鏍规嵁搴忓彿 鍒嗗埆鍔犲叆涓や釜鍒楄〃
+            if (i % 2 == 0) {
+                // 濂囨暟鍦ㄥ乏鍒�
+                documentExportWordDto.setIndex1(i + 1);
+                documentExportWordDto.setName1(document.getName());
+                documentExportWordDto.setQuantity1(document.getQuantity());
+                documentExportWordDto.setPageCount1(document.getPageCount());
+                documentExportWordDto.setArchiveDateString1(document.getProvideDate().format(dateTimeFormatter));
+            } else {
+                // 鍋舵暟鍦ㄥ彸鍒�
+                documentExportWordDto.setIndex2(i + 1);
+                documentExportWordDto.setName2(document.getName());
+                documentExportWordDto.setQuantity2(document.getQuantity());
+                documentExportWordDto.setPageCount2(document.getPageCount());
+                documentExportWordDto.setArchiveDateString2(document.getProvideDate().format(dateTimeFormatter));
+            }
+            // 鎶婁竴琛屾暟鎹璞″姞鍏ュ垪琛�
+            documentExportWordDtoList.add(documentExportWordDto);
+        }
+    }
+
+    @Override
+    public void exportEquipmentDetails(HttpServletResponse response) {
+        List<Device> deviceList = baseMapper.selectList(null);
+        List<DeviceExport> deviceExportList = new ArrayList<>();
+
+        int index = 1;
+        for (Device device : deviceList) {
+            Integer equipmentManager = device.getEquipmentManager();
+            String equipmentManagerName = null;
+            if (equipmentManager != null) {
+                User user = userMapper.selectById(equipmentManager);
+                if (user != null) {
+                    equipmentManagerName = user.getName();
+                }
+            }
+            DeviceExport deviceExport = new DeviceExport();
+            BeanUtils.copyProperties(device, deviceExport);
+            deviceExport.setIndex(index);
+            deviceExport.setEquipmentManagerName(equipmentManagerName);
+            deviceExportList.add(deviceExport);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/quipment-details.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceList", deviceExportList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浠櫒璁惧涓�瑙堣〃", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java
new file mode 100644
index 0000000..0f905bc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DocumentMapper;
+import com.ruoyi.device.pojo.Document;
+import com.ruoyi.device.service.DocumentService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璁惧妗f
+ */
+@Service
+public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> implements DocumentService {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java
new file mode 100644
index 0000000..bb26ed6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java
@@ -0,0 +1,115 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.service.ProductService;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.service.QrShowService;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.system.service.CustomService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+
+@Service
+public class QrShowServiceImpl implements QrShowService {
+
+
+
+    @Autowired
+    private DeviceMetricRecordMapper deviceMetricRecordMapper;
+
+
+
+    /**
+     * 璁$畻鍚敤鏃堕暱
+     * @param activationDate
+     * @return
+     */
+    public double calcUsedYears(LocalDateTime activationDate) {
+        if(Objects.isNull(activationDate)){
+            return 0;
+        }
+        BigDecimal defDays = BigDecimal.valueOf(365);
+        BigDecimal usedDays = BigDecimal.valueOf(Duration.between(activationDate,LocalDateTime.now()).toDays());
+        return usedDays.divide(defDays,2,RoundingMode.HALF_UP).setScale(2,RoundingMode.HALF_UP).doubleValue();
+    }
+
+    /**
+     * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public double calcDeviceNextCheckRatio(Date startDate, Date endDate){
+        if(Objects.isNull(startDate) || Objects.isNull(endDate)){
+            return 0;
+        }
+        LocalDateTime startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        long totalDays = Duration.between(startLocalDate, endLocalDate).toDays();
+        long usedDays = Duration.between(startLocalDate, LocalDateTime.now()).toDays();
+        BigDecimal calcVal = BigDecimal.valueOf(usedDays).divide(BigDecimal.valueOf(totalDays),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
+        if(calcVal.compareTo(BigDecimal.ZERO)<0){
+            calcVal = BigDecimal.ZERO;
+        }else if(calcVal.compareTo(BigDecimal.valueOf(100))>0){
+            calcVal = BigDecimal.valueOf(100);
+        }
+        return calcVal.doubleValue();
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @param deviceId
+     * @param type
+     * @return
+     */
+    public DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type){
+        return Optional.ofNullable(
+                deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)
+                .orderByDesc(DeviceMetricRecord::getCreateTime)
+                .last("limit 1"))).orElse(new DeviceMetricRecord());
+    }
+
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(Date date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        return localDateTime.format(DateTimeFormatter.ofPattern(formatter));
+    }
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(LocalDate date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        return date.format(DateTimeFormatter.ofPattern(formatter));
+    }
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
new file mode 100644
index 0000000..5065c0b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
@@ -0,0 +1,861 @@
+package com.ruoyi.device.utils;
+
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.framework.exception.ErrorException;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class DataAcquisition {
+
+    private static final String HTTP = "http://";
+
+    private static final String GETFILE = ":9527/lims/getFile"; // 鑾峰彇鏂囦欢鎺ュ彛
+
+    private static final String MOVEFILE = ":9527/lims/moveFile"; // 鏂囦欢绉诲姩鍦板潃
+
+    private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗�
+
+    public static final String frequency = "frequency";
+
+    /**
+     * 鏁伴噰鍏ュ彛
+     *
+     * @param dataConfig
+     * @param device
+     * @return
+     */
+    public static Map<String, Object> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip, String cableTag) {
+        // 鍒ゆ柇鏄惁鏄奖鍍忔祴閲忎华
+        if (device.getManagementNumber().equals("JCZX-ZB-OP07001")) {
+            if (device.getFileType().equals(".xlsx")) {
+                String url = device.getCollectUrl() + "\\" + sampleCode.replace("/", "");
+                if (StringUtils.isNotBlank(dataConfig.get(0).getAnotherName())) {
+                    url += dataConfig.get(0).getAnotherName() ;
+                }
+                url += ".xlsx";
+                device.setCollectUrl(url);
+            }
+        }
+        // 鍒ゆ柇鏄惁鏄數缂嗙噧鐑х儫瀵嗗害娴嬮噺绯荤粺
+        if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
+            if (device.getFileType().equals(".txt")) {
+                device.setCollectUrl(device.getCollectUrl() + "\\-" + sampleCode.replace("/", ""));
+            }
+        }
+        /**
+         * filePath 鏂囦欢閲囬泦璺緞
+         * fileExtension 鏂囦欢鍚庣紑
+         * entrustCode 濮旀墭缂栧彿
+         * sampleCode 鏍峰搧缂栧彿
+         * mdbEntrustCode mdb鏂囦欢闇�瑕侊細濮旀墭缂栧彿瀛楁 涓轰粈涔堟病鏈夊幓杩欎釜mdb鍓嶇紑鍛紵鍥犱负宸茬粡缁欏鎴风殑閮ㄥ垎鐢佃剳涓婂畨瑁呬簡閲囬泦鍣紝鑰岀敤鎴蜂笉鎺ュ彈閲嶆柊瀹夎閲囬泦鍣紝鎵�浠ュ氨娌℃湁鍘婚櫎
+         * mdbSampleCode mdb鏂囦欢闇�瑕侊細鏍峰搧缂栧彿瀛楁
+         */
+        String http = HTTP + ip + GETFILE +
+                "?filePath=" + device.getCollectUrl() +
+                "&fileExtension=" + device.getFileType() +
+                "&entrustCode=" + entrustCode +
+                "&sampleCode=" + sampleCode +
+                "&mdbEntrustCode=" + device.getEntrustCode() +
+                "&mdbSampleCode=" + device.getSampleCode() +
+                "&dbFileName=" + device.getDbFileName();
+        String result = null;
+        try {
+            result = HttpUtil.get(http);
+        } catch (IORuntimeException e) {
+            e.printStackTrace();
+            throw new ErrorException("鎵�鍦ㄧ數鑴戞湭瀹夎鎴栨湭鍚姩锛歀IMS鏂囦欢閲囬泦鍣紒");
+        }
+        JSONObject jsonObject = JSON.parseObject(result);
+        if (Objects.equals(jsonObject.get("code"), 1)) {
+            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
+                throw new ErrorException("鏈煡璇㈠埌鏂囦欢锛佸彲鑳借璺緞锛�" + device.getCollectUrl() + "锛変笅骞舵病鏈夋墍闇�(" + device.getFileType() +")鏂囦欢锛�");
+            } else {
+                throw new ErrorException(jsonObject.get("msg") + "");
+            }
+        } else {
+            String data = jsonObject.get("data") + "";
+            // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁�
+            Map<String, List<DataConfig>> userMap = dataConfig.stream()
+                    .peek(i -> {
+                        String itemName = i.getInspectionItem();
+                        if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
+                            itemName += "@" + i.getInspectionItemClass();
+                        }
+                        String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
+
+                        // 娣诲姞妫�楠岄」鍚嶇О
+                        i.setInsProductItem(name);
+                    })
+                    .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
+            Map<String, Object> map;
+            switch (device.getFileType()) {
+                case ".docx":
+                    map = analysisString(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".xlsx":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".txt":
+                    map = analysisTxt(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".csv":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".mdb":
+                    // 鍒ゆ柇鏄惁鏄媺鍔涙満
+                    if (device.getManagementNumber().equals("JCZX-ZB-FF01014")) {
+                        map = analysisMdbByPull(data, userMap, device, cableTag);
+                    } else {
+                        map = analysisMdb(data, userMap, device);
+                    }
+                    break;
+                case ".db":
+                    map = analysisDb(data, userMap, device);
+                    break;
+                case ".png":
+                    map = readPngString(data, userMap, device);
+                    break;
+                default:
+                    map = null;
+                    break;
+            }
+            // 濡傛灉瀛樺湪瀛樺偍鍦板潃锛屽垯绉诲姩鍦板潃
+            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
+                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType();
+                HttpUtil.get(s);
+            }
+            return map;
+        }
+    }
+
+    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) {
+        Set<String> set = new LinkedHashSet<>();
+        map.forEach((key, value) -> {
+            String[] split = key.split(",");
+            String inspectionItem = split[0];
+            // 鍙鏈変竴涓笉涓虹┖灏眘et杩涘幓
+            if (ObjectUtils.isNotEmpty(value)) {
+                set.add(inspectionItem);
+            }
+        });
+        Map<String, Object> result = new HashMap<>();
+        for (String inspectionItemKey : set) {
+            Map<String, Object> hashMap = new HashMap<>();
+            map.forEach((key, value) -> {
+                String[] split = key.split(",");
+                String inspectionItem = split[0];
+                if (inspectionItemKey.equals(inspectionItem)) {
+                    if (split.length > 1) {
+                        hashMap.put(split[1], value);
+                    } else {
+                        hashMap.put("", value);
+                    }
+                }
+            });
+            String frequency = createKey(entrustCode, sampleCode, inspectionItemKey);
+            hashMap.put("frequency", frequency);
+            result.put(inspectionItemKey, hashMap);
+        }
+        return result;
+    }
+
+    public static String createKey(String entrustCode, String sampleCode, String inspectionItemKey) {
+
+        return "1";
+    }
+
+    /**
+     * 闇�瑕侀�氳繃X,Y杞村畾浣�
+     *
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            DataConfig configVo = v.get(0);
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+
+    /**
+     * 鎷夊姏鏈烘暟閲�
+     *
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisMdbByPull(String data, Map<String, List<DataConfig>> dataConfig, Device device, String cableTag) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+
+        dataConfig.forEach((k, v) -> {
+            List<Map<String, String>> resultValue = new ArrayList<>();
+
+            DataConfig configVo = v.get(0);
+            for (int i = 0; i < dataList.size(); i++) {
+                JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                // 鑾峰彇鏃堕棿
+                String dDate = jsonObject1.getString("dDate");
+                String dTime = jsonObject1.getString("dTime");
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
+
+                // 瑙f瀽绗竴涓棩鏈熸椂闂村瓧绗︿覆
+                LocalDateTime dateTime1 = LocalDateTime.parse(dDate, formatter);
+                // 鑾峰彇骞存湀鏃�
+                String yearMonthDay = dateTime1.toLocalDate().toString();
+
+                // 瑙f瀽绗簩涓棩鏈熸椂闂村瓧绗︿覆
+                LocalDateTime dateTime2 = LocalDateTime.parse(dTime, formatter);
+                // 鑾峰彇鏃跺垎
+                String hourMinute = dateTime2.toLocalTime().toString();
+                // 鎷兼帴骞存湀鏃ュ拰鏃跺垎
+                String mergedDateTime = yearMonthDay + " " + hourMinute;
+
+                // 鑾峰彇鍘氬害
+                String report = jsonObject1.getString("Report");
+                String thickness = extractValue(report, "鍘氬害:\\s*(\\S*?)~");
+
+                // 鑾峰彇鎷変几寮哄害浼搁暱鐜�
+                String result = "";
+                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("鎷変几寮哄害")) {
+                    result = extractValue(report, "鎷変几寮哄害:\\s*(\\S*?)~");
+
+                }
+                //鍒ゆ柇妫�楠屽瓙椤规槸鍚︽槸鎷変几寮哄害
+                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("浼搁暱鐜�")) {
+                    result = extractValue(report, "浼搁暱鐜�:\\s*(\\S*?)~");
+                }
+                Map<String, String> reportMap = new HashMap<>();
+                reportMap.put("mergedDateTime", mergedDateTime);
+                reportMap.put("thickness", thickness);
+                reportMap.put("result", result);
+                resultValue.add(reportMap);
+            }
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", resultValue);
+            map.put(k, hashMap);
+        });
+        return map;
+    }
+
+    private static String extractValue(String input, String regex) {
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(input);
+        return matcher.find() ? matcher.group(1) : null;
+    }
+
+    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
+
+    /**
+     * 鍙渶X杞�
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> readPngString(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String referx = getRefer(v.get(config).getReferx());
+                String result = null;
+                // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+                String[] aColumnY = data.split("\n");
+                List<String> list1 = new ArrayList<>();
+                // 璇ュ惊鐜緱鍑虹敤鎴烽厤缃殑y杞�
+                for (int i = 0; i < aColumnY.length; i++) {
+                    String addDataWithSpaces = referx.replaceAll("", " ");
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    if (aColumnY[i].contains(addDataWithSpaces)) {
+                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
+                        while (matcher.find()) {
+                            String group = matcher.group();
+                            list1.add(group);
+                        }
+                    }
+                    if (ObjectUtils.isNotEmpty(list1)) {
+                        result = list1.get(x);
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(result)) {
+                    list.add(result);
+                }
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 浠庢枃浠朵腑鎻愬彇鍑烘潵鐨勬枃瀛楋紝濡傛灉鏈夊叕寮忥紝杩涜鍏紡璁$畻锛屽惁鍒欏彇鍒楄〃绗竴涓��
+     *
+     * @param list       鎻愬彇鍑虹殑鏁板瓧
+     * @param dataConfig 瀛樺偍鍏紡鐨勫璞�
+     * @return
+     */
+    private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) {
+        if (list.size() == 0) {
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", null);
+            return hashMap;
+        }
+        ArrayList<Object> listResult = new ArrayList<>();
+        Map<String, Object> hashMap = new HashMap<>();
+        // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
+            // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                String s = calculationFormulaList(list, dataConfig.getFormula());
+                listResult.add(s);
+            } else {
+                list.forEach(i -> {
+                    List<Object> strings = Arrays.asList(i.toString().split(","));
+                    String s = calculationFormulaList(strings, dataConfig.getFormula());
+                    listResult.add(s);
+                });
+            }
+        } else {
+            listResult.addAll(list);
+        }
+        // 涓轰簡缁欏墠绔仛鏁版嵁鍖哄垎
+        if (listResult.size() > 1) {
+            hashMap.put("result", listResult);
+        } else {
+            hashMap.put("result", listResult.get(0).toString());
+        }
+        hashMap.put("equipName", device.getDeviceName());
+        hashMap.put("equipValue", device.getManagementNumber());
+        return hashMap;
+    }
+
+    /**
+     * 瑙f瀽String鏁版嵁
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                // 鍒ゆ柇鏄惁鏄儫瀵嗗害
+                if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
+                    // 鎸夎鍒嗗壊鏁版嵁
+                    String[] lines = data.split("\n");
+
+                    // 鎻愬彇鏈�鍚庝竴琛岀殑绗竴涓暟瀛�
+                    String lastLine = lines[lines.length - 1];
+                    String firstNumber = lastLine.split("\t")[0];
+                    list.add(firstNumber);
+                } else {
+                    list = analyzeData(data, v, k, ",");
+                }
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisString(String data, Map<String, List<DataConfig>> dataConfig, Device device,
+                                                      String entrustCode, String sampleCode) {
+        String processingDataAfterSpaces = data
+                .replaceAll("  +", splitIdentifier)
+                .replaceAll("\r", "")
+                .replaceAll(" ", "");
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 鍙朮锛孻涓や釜瀹氫綅
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    public static Map<String, Object> analysisList(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(data, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier,
+                                                                   Device device, String entrustCodeValue, String sampleCodeValue) {
+        entrustCodeValue = entrustCodeValue.replaceAll(" ", "");
+        sampleCodeValue = sampleCodeValue.replaceAll(" ", "");
+        // 鏈�缁堢粨鏋�
+        List<Object> list = new ArrayList<>();
+        int numberOfDataEntries = 0;
+        // 鍙杄ntrustCode涓巗ampleCode鎵�鍦ㄤ綅
+        for (int config = 0; config < v.size(); config++) {
+            numberOfDataEntries = 0;
+            Integer entrustCodeY = null;
+            Integer sampleCodeY = null;
+            Integer referYCoordinate = null;
+            String refery = getRefer(v.get(config).getRefery());
+            String entrustCode = getRefer(device.getEntrustCode()); // 濮旀墭缂栧彿瀛楁
+            String sampleCode = getRefer(device.getSampleCode()); // 鏍峰搧缂栧彿瀛楁
+            if (ObjectUtils.isEmpty(refery)) {
+                continue;
+            }
+            // 鍘婚櫎鎵�鏈夌殑绌烘牸锛岄�氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉閫氳繃鍒ゆ柇锛屽畾浣嶅埌Y杞�
+                if (aColumnY[i].contains(entrustCode) && aColumnY[i].contains(sampleCode)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    for (int j = 0; j < aLine.length; j++) {
+                        if (aLine[j].contains(entrustCode)) {
+                            entrustCodeY = j;
+                        }
+                        if (aLine[j].contains(sampleCode) ) {
+                            sampleCodeY = j;
+                        }
+                        if (aLine[j].contains(refery)) {
+                            referYCoordinate = j;
+                        }
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(entrustCodeY) && ObjectUtils.isNotEmpty(sampleCodeY) && ObjectUtils.isNotEmpty(referYCoordinate)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    try {
+                        if (aLine[entrustCodeY].contains(entrustCodeValue) && aLine[sampleCodeY].contains(sampleCodeValue)) {
+                            String result = aLine[referYCoordinate];
+                            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+                            if (ObjectUtils.isNotEmpty(result)) {
+                                numberOfDataEntries += 1;
+                                list.add(result);
+                            }
+                        }
+                    } catch (Exception e) {}
+                }
+            }
+        }
+        // 鎷兼帴鏁伴噰閰嶇疆
+        List<Object> result = new ArrayList<>();
+        for (int i = 0; i < numberOfDataEntries; i++) {
+            String aggregate = "";
+            for (int j = 0; j < v.size(); j++) {
+                int index;
+                if (j == 0) {
+                    index = i;
+                } else {
+                    index = numberOfDataEntries + i;
+                }
+                aggregate += list.get(index).toString() + ",";
+            }
+            int lastIndex = aggregate.lastIndexOf(",");
+            String substring = aggregate.substring(0, lastIndex);
+            result.add(substring);
+        }
+        return result;
+    }
+
+    // 鐢变簬鍦ㄦ柟娉曚腑浼氬ぇ閲忕殑鍒ゆ柇锛屾墍浠ュ仛涓�涓柟娉�
+    private static int getXOrY(String value, String k, String tips) {
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ErrorException(k + "锛氭湭閰嶇疆" + tips + "鍧愭爣杞寸殑鍊硷紒");
+        }
+    }
+
+    // 闃叉鍙傜収鐗╀负绌烘姤閿欙紝杩涜鍒ゆ柇濡傛灉涓虹┖璧嬪�肩┖瀛楃
+    private static String getRefer(String refer) {
+        return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : "";
+    }
+
+    /**
+     * 濮旀墭缂栧彿涓庢牱鍝佺紪鍙烽兘涓虹┖鎵ц
+     *
+     * @param data
+     * @param v
+     * @param k
+     * @param split
+     * @return
+     */
+    public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) {
+        List<Object> list = new ArrayList<>();
+        for (int config = 0; config < v.size(); config++) {
+            // 鍙栦袱涓敤鎴烽厤缃殑鍙傜収鐗�
+            String referx = getRefer(v.get(config).getReferx());
+            String refery = getRefer(v.get(config).getRefery());
+            if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) {
+                continue;
+            }
+            // 鏈�缁堢粨鏋�
+            List<Object> result = new ArrayList<>();
+            // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            Integer end = null;
+            // 閲囬泦鏁版嵁锛歒杞�
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓虹┖鍒欐墽琛岋紝鍚屾椂璇ヨ鍖呭惈Y鍙傜収
+                if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && aColumnY[i].contains(refery)) {
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    String[] aLineX = aColumnY[i].split(split);
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(refery)) {
+                            String[] split1 = new String[0];
+                            try {
+                                split1 = aColumnY[i + y].split(split);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歒杞村畾浣嶈秴鍑猴紒");
+                            }
+                            try {
+                                result.add(split1[j]);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                            }
+                        }
+                    }
+                    // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓嶄负绌哄垯鎵ц,姝ゅY瀹氬尯鍩�
+                } else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) {
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    // 缂撳瓨Y鐨勭粨鏉熷��
+                    if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) {
+                        end = i + y;
+                    }
+                    // 鍒ゆ柇鏄惁鍦ㄥ弬鐓х墿涓鸿捣鍒帮紝Y鍧愭爣鍊间负鏈�缁堣寖鍥�
+                    if (ObjectUtils.isNotEmpty(end) && i <= end) {
+                        String[] aLineX = aColumnY[i].split(split);
+                        for (int j = 0; j < aLineX.length; j++) {
+                            if (aLineX[j].contains(referx)) {
+                                try {
+                                    result.add(aLineX[j + x]);
+                                } catch (Exception e) {
+                                    throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                                }
+                                break;
+                            }
+                        }
+                    }
+                    // 濡傛灉X鍙傜収涓嶄负绌哄悓鏃惰琛屽寘鍚玐鍙傜収锛屽垯鎵ц涓嬮潰鐨勪唬鐮�
+                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
+                    String[] aLineX = aColumnY[i].split(split);
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(referx)) {
+                            try {
+                                result.add(aLineX[j + x]);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                            }
+                        }
+                    }
+                }
+            }
+            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+            if (ObjectUtils.isNotEmpty(result)) {
+//                String formatProcessing = getFormatProcessing(result);
+                list.addAll(result);
+            }
+        }
+        return list;
+    }
+
+    public static String getFormatProcessing(String value) {
+        value = value.replaceAll("%", "");
+        if (value.contains("=")) {
+            String[] split = value.split("=");
+            return split[split.length - 1];
+        } else if (value.contains(":")) {
+            String[] split = value.split(":");
+            return split[split.length - 1];
+        } else {
+            return value;
+        }
+    }
+
+    public static String getIp(HttpServletRequest request) {
+        String ipAddress = request.getRemoteAddr();
+        // 闃叉鍥炵幆鍦板潃鍙樹负IPv6
+        return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
+    }
+
+    public static String calculationFormulaList(List<Object> list, String formula) {
+        //棣栧厛灏唋ist杞崲涓篵igdecmic
+        List<BigDecimal> bigDecimalList = list.stream()
+                .map(obj -> {
+                    return new BigDecimal((obj).toString());
+                }).collect(Collectors.toList());
+
+        //灏嗕腑鏂囩殑(杞崲鑻辨枃鐨�())
+        formula = formula.replace("锛�", "(")
+                .replace("锛�", ")")
+                .replace("锛�", ",");
+        //鐒跺悗鎻愬彇鍏紡
+        String strs = formula.substring(0, formula.indexOf("("));
+        String upperStr = strs.toUpperCase();
+        if (upperStr.matches(".*\\d.*")) {
+            upperStr = "";
+        }
+        //鐒跺悗鑾峰彇鏈�澶栭潰鎷彿閲岄潰鐨勫��,鍐嶆牴鎹�","鍒嗗壊
+        int start = formula.indexOf("(");
+        int end = -1;
+        int a = 0;
+        for (int i = start; i < formula.length(); i++) {
+            char c = formula.charAt(i);
+            if (c == '(') {
+                a++;
+            } else if (c == ')') {
+                a--;
+                if (a == 0) {
+                    end = i;
+                }
+            }
+        }
+        if (start == -1 || end == -1) {
+            throw new ErrorException("鍏紡鎷彿涓嶅尮閰�: " + formula);
+        }
+
+        String argumentsStr = formula.substring(start + 1, end);
+        List<String> arguments = new ArrayList<>();
+        int bracketCount = 0;
+        StringBuilder currentArgument = new StringBuilder();
+        for (char c : argumentsStr.toCharArray()) {
+            if (c == ',' && bracketCount == 0) {
+                arguments.add(currentArgument.toString());
+                currentArgument.setLength(0);
+            } else {
+                if (c == '(') bracketCount++;
+                if (c == ')') bracketCount--;
+                currentArgument.append(c);
+            }
+        }
+        arguments.add(currentArgument.toString());
+        String[] bracketStrs = arguments.toArray(new String[0]);
+        List<BigDecimal> results = new ArrayList<>();
+        for (String expr : bracketStrs) {
+            Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
+            Matcher matcher = pattern.matcher(expr);
+            StringBuffer sb = new StringBuffer();
+            while (matcher.find()) {
+                String letter = matcher.group(1);
+                int index = Integer.parseInt(matcher.group(2)) - 1; // 灏�1-based杞负0-based
+                if (index < bigDecimalList.size()) {
+                    matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
+                } else {
+                    throw new RuntimeException("鍏紡涓殑涓嬫爣 " + index + " 瓒呭嚭鑼冨洿");
+                }
+            }
+            matcher.appendTail(sb);
+
+            // 璁$畻琛ㄨ揪寮�
+            ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
+            try {
+                Object result = engine.eval(sb.toString());
+                results.add(new BigDecimal(result.toString()));
+            } catch (Exception e) {
+                throw new IllegalArgumentException("鏃犳硶璁$畻鍏紡: " + sb, e);
+            }
+        }
+        // 鏍规嵁鍑芥暟鍚嶇О杩涜鐩稿簲璁$畻
+        BigDecimal finalResult;
+        if (upperStr.equals("") || upperStr == null) {
+            finalResult = results.get(0);
+        } else {
+            switch (upperStr) {
+                case "MAX":
+                    finalResult = results.stream().max(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MAX鍊�"));
+                    break;
+                case "MIN":
+                    finalResult = results.stream().min(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MIN鍊�"));
+                    break;
+                case "SUM":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "ABS":
+                    finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "AVERAGE":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
+                            .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
+                    break;
+                case "MEDIAN":
+                    int size = results.size();
+                    if (size % 2 == 1) {
+                        finalResult = results.get(size / 2);
+                    } else {
+                        BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
+                        finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    break;
+                default:
+                    throw new UnsupportedOperationException("鏆備笉鏀寔鍑芥暟: " + upperStr);
+            }
+        }
+
+        return finalResult.toString();
+        // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+    }
+
+}
diff --git a/cnas-device/src/main/resources/mapper/DataConfigMapper.xml b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml
new file mode 100644
index 0000000..c28aac6
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml
@@ -0,0 +1,50 @@
+<?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.ruoyi.device.mapper.DataConfigMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.device.pojo.DataConfig">
+        <id column="id" property="id" />
+        <result column="formula" property="formula" />
+        <result column="referx" property="referx" />
+        <result column="refery" property="refery" />
+        <result column="x" property="x" />
+        <result column="y" property="y" />
+    </resultMap>
+
+    <select id="selectDataConfigList" resultType="com.ruoyi.device.dto.DeviceConfigDtoPage">
+        SELECT d.device_name,
+               d.file_type,
+               d.collect_url,
+               d.storage_url,
+               d.ip,
+               d.entrust_code,
+               d.sample_code,
+               d.db_file_name,
+               ip.inspection_item,
+               ip.inspection_item_class,
+               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
+                  ip.inspection_item_subclass, ip.inspection_item)                            inspection_item_subclass,
+               ip.sample,
+               ddc.formula,
+               ddc.referx,
+               ddc.refery,
+               ddc.x,
+               ddc.y,
+               ddc.another_name,
+               ddc.matching_name,
+               ddc.id,
+               ip.id                                                                          structureItemParameterId
+        FROM device d
+                 left join structure_item_parameter ip on FIND_IN_SET(ip.id, d.ins_product_ids)
+                 left join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+        where d.id = #{deviceId}
+    </select>
+
+    <select id="deleteDataConfig" resultType="integer">
+        SELECT ddc.id
+        FROM device d
+                 left join structure_item_parameter ip on not FIND_IN_SET(ip.id, d.ins_product_ids)
+                 inner join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml
new file mode 100644
index 0000000..79d1849
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml
@@ -0,0 +1,17 @@
+<?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.ruoyi.device.mapper.DeviceMaintenanceMapper">
+
+    <select id="getDeviceMaintenanceParam" resultType="com.ruoyi.device.pojo.DeviceMaintenance">
+        select id,device_id,device_name, device_number,management_number,content,name
+        ,date from device_maintenance
+    </select>
+
+
+    <select id="deviceMaintenanceExport" resultType="com.ruoyi.device.excel.DeviceMaintenanceExport">
+        select id, device_id, device_name, device_number, management_number, content, date, if(maintenance_type = 1, '璁″垝涓淮鎶�', '浣跨敤鍓嶅悗缁存姢'), next_date, name, comments
+        from device_maintenance dm
+        where dm.device_id = #{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
new file mode 100644
index 0000000..2d5c6c8
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
@@ -0,0 +1,189 @@
+<?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.ruoyi.device.mapper.DeviceMapper">
+    <select id="selectDeviceParameter" resultType="com.ruoyi.device.pojo.Device">
+        select * from(
+        select id,
+        large_category,
+        date_production,
+        equipment_manager,
+        authorized_person,
+        device_name,
+        internal_code,
+        asset_code,
+        calibration_date,
+        scrap_time,
+        acceptance_records,
+        subclass,
+        factory_no,
+        acquisition_date,
+        accurate_measurement,
+        specification_model,
+        device_status,
+        storage_point,
+        activation_date,
+        latest_traceability,
+        down_time,
+        maintenance_records,
+        manufacturer,
+        detection_type,
+        _costs,
+        calibration_certicate,
+        create_user,
+        create_time,
+        update_user,
+        update_time,
+        status
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectEquipmentOverview" resultType="com.ruoyi.device.pojo.Device">
+        select * from(
+        select id,
+        device_name,
+        specification_model,
+        device_status,
+        create_user,
+        status,
+        update_time
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="authorizedPerson" resultType="com.ruoyi.device.pojo.Device">
+        select id,
+               authorized_person
+        from device
+    </select>
+    <select id="search" resultType="com.ruoyi.device.pojo.Device">
+        select *
+        from device
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+            <if test="status!=null and status!=''">
+                and device_status = status
+            </if>
+            <if test="specificationModel!=null and specificationModel!= ''">
+                and specification_model = #{specificationModel}
+            </if>
+            <if test="largeCategory!=null">
+                and large_category = #{largeCategory}
+            </if>
+            <if test="largeCategory == 'null'">
+                and (large_category = '' or large_category is null)
+            </if>
+        </where>
+    </select>
+
+    <select id="selectDeviceImage" resultType="com.ruoyi.device.pojo.Device">
+        select (image_upload, create_user, create_time) values (#{image_upload}
+             , #{createUser}
+             , #{createTime})
+    </select>
+    <select id="selectDevicePrincipal" resultType="com.ruoyi.device.pojo.Device">
+        select id,
+               equipment_manager
+        from device
+    </select>
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.Device">
+        select * from(
+        SELECT
+        d.*,
+        cmr.calibration_date as last_calibration_date_two,
+        cmr.next_calibration_date as next_calibration_date_two,
+        GROUP_CONCAT(distinct inspection_item SEPARATOR ';') AS insProductItem,
+        u.name ,
+        l.laboratory_name
+        FROM
+        device d
+        LEFT JOIN `user` u ON u.id = d.equipment_manager
+        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
+        LEFT JOIN device_metric_record cmr ON d.id = cmr.device_id
+        LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+        <where>
+            <if test="laboratoryNameIsNull != null and laboratoryNameIsNull == true">
+                l.laboratory_name is null
+            </if>
+            AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = ''
+        </where>
+        GROUP BY
+        d.id,
+        u.name, l.laboratory_name
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getInspectionItemSubclass" resultType="map">
+        SELECT ip.inspection_item,
+               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
+                  ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass
+        FROM ins_product ip
+        where ip.ins_sample_id = #{id}
+    </select>
+    <resultMap id="treeDeviceDto" type="map">
+        <result property="label" column="laboratory_name"/>
+        <result property="value" column="value" />
+        <collection property="children" resultMap="storagePointMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="storagePointMap" type="map">
+        <result property="value" column="value"/>
+        <result property="label" column="storage_point"/>
+        <collection property="children" resultMap="deviceNameMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="deviceNameMap" type="map">
+        <result property="value" column="id"/>
+        <result property="label" column="device_name"/>
+        <result property="managementNumber" column="management_number"/>
+    </resultMap>
+
+    <select id="treeDevice" resultMap="treeDeviceDto">
+        select
+        d.id,
+        case when l.laboratory_name is null || l.laboratory_name ='' then '鍏朵粬' else l.laboratory_name end as laboratory_name,
+        case when d.storage_point is null || d.storage_point ='' then '鍏朵粬' else d.storage_point end as storage_point,
+        d.device_name,
+        d.management_number,
+        null as value
+        from device d
+        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+        </where>
+        order by l.laboratory_name desc, d.storage_point desc
+    </select>
+
+    <select id="selectDeviceByCode" resultType="com.ruoyi.device.dto.DeviceDto">
+        SELECT d.*,
+               GROUP_CONCAT(DISTINCT inspection_item SEPARATOR ';') AS ins_product_item,
+               l.laboratory_name,
+               u1.name                                                 equipmentManager_name,
+               u2.name                                                 authorized_person_name
+        FROM device d
+                 LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+                 LEFT JOIN laboratory l ON d.subordinate_departments_id = l.id
+                 LEFT JOIN user u1 ON u1.id = d.equipment_manager
+                 LEFT JOIN user u2 ON u2.id = d.authorized_person
+        WHERE d.id = #{id}
+
+        GROUP BY d.id,
+                 l.laboratory_name,
+                 u1.name,
+                 u2.name
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index c2d04ee..bda6f2e 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -211,11 +211,6 @@
         return Result.success();
     }
 
-    @Scheduled(fixedDelay = 1200000)
-    public void getIfsOrderTiming() {
-        insOrderService.getIfsOrder();
-    }
-
 
     @ApiOperation(value = "淇敼璁㈠崟鍗曞彿")
     @PostMapping("/updateEntrustCode")
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index 1f39ef1..b1d6747 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -35,10 +35,7 @@
 import com.ruoyi.common.core.domain.entity.InformationNotification;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.domain.entity.User;
-import com.ruoyi.common.utils.DateImageUtil;
-import com.ruoyi.common.utils.QueryWrappers;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.common.utils.*;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.dto.*;
 import com.ruoyi.inspect.mapper.*;
@@ -634,10 +631,7 @@
             }
             String thing = null;
             if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
-                long begin = System.currentTimeMillis();
                 thing = standardTemplateService.getStandTempThingById(product.getTemplateId());
-                long end = System.currentTimeMillis();
-                System.out.println("=========鏃堕棿====" + (end - begin));
             }
             if (StrUtil.isNotEmpty(thing)) {
                 JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
@@ -648,10 +642,7 @@
                 style.put("columnlen", config.get("columnlen"));
                 product.setTemplate(cellData);
                 product.setStyle(style);
-                long begin = System.currentTimeMillis();
                 product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
-                long end = System.currentTimeMillis();
-                System.out.println("=========鏃堕棿22222====" + (end - begin));
             }
         }
     }
@@ -1527,7 +1518,7 @@
             standardMethod2.append("銆�").append(s);
         }
         standardMethod2.replace(0, 1, "");
-        // todo: 妫�娴嬬被鍨�
+        // todo: 鏌ヨ瀛楀吀妫�娴嬬被鍨�
 //        List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName("");
         String orderType = null;
 
@@ -2289,6 +2280,7 @@
         String finalModelStr = modelStr;
 
         // todo: 鏌ヨ瀛楀吀
+        //        List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName("");
         String orderType = null;
         String formType = null;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
new file mode 100644
index 0000000..c15200c
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java
@@ -0,0 +1,26 @@
+package com.ruoyi.inspect.task;
+
+import com.ruoyi.inspect.service.InsOrderService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @Author zhuo
+ * @Date 2025/2/20
+ */
+@Component
+public class RawMaterIalSchedule {
+
+    @Resource
+    private InsOrderService insOrderService;
+
+    /**
+     * 瀹氭椂浠诲姟鑾峰彇閲囪喘璁㈠崟
+     */
+    @Scheduled(fixedDelay = 1200000)
+    public void getIfsOrderTiming() {
+        insOrderService.getIfsOrder();
+    }
+}
diff --git a/pom.xml b/pom.xml
index 344fdf9..94e9b64 100644
--- a/pom.xml
+++ b/pom.xml
@@ -264,6 +264,13 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
+            <!--cnas璁惧绠$悊-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>cnas-device</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
             <!-- minio -->
             <dependency>
                 <groupId>io.minio</groupId>
@@ -376,6 +383,7 @@
         <module>performance-server</module>
         <module>cnas-require</module>
         <module>cnas-manage</module>
+        <module>cnas-device</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 9f62143..7dd0fdb 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -91,6 +91,13 @@
             <artifactId>cnas-manage</artifactId>
         </dependency>
 
+        <!--cnas璁惧绠$悊-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-device</artifactId>
+        </dependency>
+
+
     </dependencies>
 
     <build>

--
Gitblit v1.9.3