From ed8d0914b272da2006b2ec53cc7374d2e0734de8 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期六, 22 二月 2025 16:04:59 +0800
Subject: [PATCH] 移植设备事故和作业指导书

---
 cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java                 |  107 ++
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java                           |   31 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java                         |   25 
 cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java                             |   88 +
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java                                         |   64 +
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java        |  221 ++++
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java                                           |   14 
 cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java                             |   65 +
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java     |    2 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java                     |   35 
 cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml                                |   14 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java             |   67 +
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java            |   16 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java                                         |   97 ++
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java                     |   35 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java                              |   13 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java                      |   23 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java                             |  120 ++
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java          |   16 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java            |    2 
 cnas-device/src/main/resources/mapper/InstructionMapper.xml                                           |   19 
 cnas-device/pom.xml                                                                                   |   17 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java                   |   28 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java                                       |   93 +
 ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java                                    |   29 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java                                         |   69 +
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java                 |    2 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java                                      |   60 +
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java                   |   41 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java                        |   90 +
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java                    |   63 +
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java             |   84 +
 cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java                              |   23 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java                           |   93 +
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java                 |   69 +
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java                                |   64 +
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java    |  152 +++
 cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml                            |   17 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java       |   85 +
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java    |   27 
 cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml                                  |   29 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java               |   27 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java |   20 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java                   |    4 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java                     |    6 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java           |   99 ++
 cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml                                  |   13 
 cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java                     |   20 
 ruoyi-admin/src/main/resources/application-druid.yml                                                  |   13 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java                |  103 ++
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java          |  189 ++++
 cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java                          |   21 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java             |   41 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java             |   20 
 54 files changed, 2,777 insertions(+), 8 deletions(-)

diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
index 4aee7af..74dbc21 100644
--- a/cnas-device/pom.xml
+++ b/cnas-device/pom.xml
@@ -18,6 +18,23 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>inspect-server</artifactId>
         </dependency>
+
+        <!--mqtt jar鍖�-->
+        <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>
+        <!--mqtt闇�瑕佺殑jar鍖�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+        <!--mqtt闇�瑕佺殑jar鍖�-->
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-stream</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
index 27c15bf..d77575d 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
@@ -60,7 +60,7 @@
      * @return
      */
     @ApiOperation(value = "鍒犻櫎璁惧楠屾敹")
-    @GetMapping("/delDeviceAcceptance")
+    @DeleteMapping("/delDeviceAcceptance")
     public Result delDeviceAcceptance(Integer acceptanceId){
         return Result.success(deviceAcceptanceService.removeById(acceptanceId));
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
new file mode 100644
index 0000000..22a216b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Api(tags = "璁惧浜嬫晠鎶ュ憡鍗�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAccidentReport")
+public class DeviceAccidentReportController {
+
+    private DeviceAccidentReportService deviceAccidentReportService;
+
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧浜嬫晠鎶ュ憡鍒楄〃")
+    @GetMapping("/pageDeviceAccidentReport")
+    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
+    }
+
+    /**
+     * 鏌ヨ璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/getDeviceAccidentReport")
+    public Result getDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.getById(accidentReportId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧浜嬫晠鎶ュ憡")
+    @DeleteMapping("/delDeviceAccidentReport")
+    public Result delDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.removeById(accidentReportId));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧浜嬫晠鎶ュ憡")
+    @PostMapping("/addDeviceAccidentReport")
+    public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @ApiOperation(value = "瀵煎嚭璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/exportDeviceAccidentReport")
+    public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
index 6ddde96..6be1b18 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
@@ -30,7 +30,7 @@
 
 
     //鍒嗛〉
-    @PostMapping("/deviceBorrowPage")
+    @GetMapping("/deviceBorrowPage")
     public Result deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) throws Exception {
         return Result.success(deviceBorrowService.deviceBorrowPage(page, deviceBorrow));
     }
@@ -48,13 +48,13 @@
     }
 
     //鍒犻櫎
-    @PostMapping("/deleteDeviceBorrow")
+    @DeleteMapping("/deleteDeviceBorrow")
     public Result deleteDeviceBorrow(Integer id) {
         return Result.success(deviceBorrowService.removeById(id));
     }
 
     //瀵煎嚭
-    @PostMapping("/deviceBorrowExport")
+    @GetMapping("/deviceBorrowExport")
     public Result deviceBorrowExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
         List<DeviceBorrow> deviceBorrows = deviceBorrowService.getDeviceBorrowBydeviceId(deviceId);
         response.setHeader("requestType", "excel");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
new file mode 100644
index 0000000..f86dd9c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
@@ -0,0 +1,85 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Api(tags = "璁惧鏁呴殰缁翠慨琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceBreakdownMaintenance")
+public class DeviceBreakdownMaintenanceController {
+
+    private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
+
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏁呴殰缁翠慨鍒楄〃")
+    @GetMapping("/pageDeviceBreakdownMaintenance")
+    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏌ヨ璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧鏁呴殰缁翠慨")
+    @GetMapping("/getDeviceBreakdownMaintenance")
+    public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧鏁呴殰缁翠慨")
+    @DeleteMapping("/delDeviceBreakdownMaintenance")
+    public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鏁呴殰缁翠慨")
+    @PostMapping("/addDeviceBreakdownMaintenance")
+    public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
+        return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭璁惧鏁呴殰缁翠慨")
+    @GetMapping("/exportDeviceBreakdownMaintenance")
+    public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
+        deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
new file mode 100644
index 0000000..9db6182
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
@@ -0,0 +1,99 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ *  璁惧鐐规璁板綍琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Api(tags = "璁惧鐐规璁板綍")
+@RestController
+@RequestMapping("/deviceInspectionRecord")
+public class DeviceInspectionRecordController {
+    @Resource
+    private DeviceInspectionRecordService deviceInspectionRecordService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ璁惧鐐规璁板綍")
+    @GetMapping("/getDeviceInspectionRecordByPage")
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto itemParameter) {
+        return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     */
+    @ApiOperation("鏌ヨ鐐规璇︽儏")
+    @GetMapping("/getDeviceInspectionRecord")
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     * @param deviceInspectionRecord  璁惧鐐规璁板綍
+     */
+    @ApiOperation("鏂板璁惧鐐规璁板綍")
+    @PostMapping("/addDeviceInspectionRecord")
+    public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
+    }
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     */
+    @ApiOperation("淇敼璁惧鐐规璁板綍")
+    @PostMapping("/updateDeviceInspectionRecord")
+    public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     */
+    @ApiOperation("鍒犻櫎璁惧鐐规璁板綍")
+    @DeleteMapping("/deleteDeviceInspectionRecord")
+    public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
+    }
+
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @return
+     */
+    @ApiOperation(value = "澶嶆牳鏍告煡璁板綍")
+    @PostMapping("/reviewDeviceInspectionRecord")
+    public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
+        return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
+    }
+
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     */
+    @ApiOperation("瀵煎嚭璁惧鐐规璁板綍")
+    @GetMapping("/exportDeviceInspectionRecord")
+    public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
+        return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
new file mode 100644
index 0000000..a4af938
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
@@ -0,0 +1,103 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/deviceInstruction")
+public class DeviceInstructionController {
+
+    @Autowired
+    private DeviceInstructionService deviceInstructionService;
+
+    @Autowired
+    private DeviceOperationInstructionService deviceOperationInstructionService;
+
+
+    @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<DeviceInstruction>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
+        return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
+        deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
+        List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.homeworkGuidebookEditor(instructionId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("instruction", instruction);
+        return Result.success(map);
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+    @GetMapping("/deleteHomeworkGuidebook")
+    public Result deleteHomeworkGuidebook(String ids){
+        if (ObjectUtils.isNotEmpty(ids)) {
+            String[] idArray = ids.split(",");
+            deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+    @GetMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        deviceOperationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            deviceInstructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+    @GetMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+        deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
index 9ee8ffe..4052858 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -65,7 +65,7 @@
      * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
      */
     @ApiOperation("鍒犻櫎璁惧淇濆吇璁″垝")
-    @GetMapping("/deleteMaintenancePlan")
+    @DeleteMapping("/deleteMaintenancePlan")
     public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
         return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
index 9bada11..95794eb 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
@@ -35,7 +35,7 @@
      * @return
      */
     @ApiOperation(value = "璁惧鎶ュ簾鐢宠鍒楄〃")
-    @PostMapping("/pageDeviceScrapped")
+    @GetMapping("/pageDeviceScrapped")
     public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
         return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
     }
@@ -55,7 +55,7 @@
      * @return
      */
     @ApiOperation(value = "鍒犻櫎璁惧鎶ュ簾鐢宠")
-    @GetMapping("/delDeviceScrapped")
+    @DeleteMapping("/delDeviceScrapped")
     public Result delDeviceScrapped(Integer scrappedId){
         return Result.success(deviceScrappedService.removeById(scrappedId));
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
index d1036ac..b506a92 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -62,7 +62,7 @@
      * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
      */
     @ApiOperation("鍒犻櫎閲忓�兼函婧愯鍒�")
-    @GetMapping("/deleteTraceabilityManagement")
+    @DeleteMapping("/deleteTraceabilityManagement")
     public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
         return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
new file mode 100644
index 0000000..41fa6e3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-18 鏄熸湡涓� 10:00:48
+ * Description:
+ */
+@Data
+public class DeviceAccidentReportDto extends DeviceAccidentReport {
+    @ApiModelProperty("鏃堕棿")
+    private String accidentDateStr;
+
+    @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+    private String reportDateStr;
+
+    @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+    private String assessorDateStr;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private String technicalDirectorDateStr;
+
+    @ApiModelProperty("涓讳换濉啓鏃堕棿")
+    private String directorHeadDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
new file mode 100644
index 0000000..3d5ba22
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
@@ -0,0 +1,90 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Getter
+@Setter
+@TableName("device_breakdown_maintenance")
+@ApiModel(value = "DeviceBreakdownMaintenance瀵硅薄", description = "璁惧鏁呴殰缁翠慨琛�")
+public class DeviceBreakdownMaintenance {
+
+    @TableId(value = "maintenance_id", type = IdType.AUTO)
+    private Integer maintenanceId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("瀹夎鍦板潃")
+    private String location;
+
+    @ApiModelProperty("鎹熷潖鎴栨晠闅滄儏鍐�")
+    private String damageOrMalfunction;
+
+    @ApiModelProperty("鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("鐢宠浜�")
+    private String applicantUser;
+
+    @ApiModelProperty("瑕佹眰淇鏃堕棿")
+    private LocalDate repairDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("缁翠慨璁颁簨")
+    private String maintenanceRecord;
+
+    @ApiModelProperty("缁翠慨浜�")
+    private String maintenanceUser;
+
+    @ApiModelProperty("缁翠慨鏃堕棿")
+    private LocalDate maintenanceDate;
+
+    @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @ApiModelProperty("娴佺▼, 0:鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:缁翠慨璁颁簨")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
new file mode 100644
index 0000000..f71386a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 17:23:22
+ * Description:
+ */
+@Data
+public class DeviceInspectionRecordDto extends DeviceInspectionRecord {
+
+    @TableField(exist = false)
+    @ApiModelProperty("娴嬭瘯璇︽儏鍐呭")
+    private List<DeviceInspectionRecordDetails> details;
+
+    @ApiModelProperty("娴嬭瘯鏃堕棿")
+    private String testDateString;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
new file mode 100644
index 0000000..11244b4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceInstructionDto extends DeviceInstruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
new file mode 100644
index 0000000..89ebd4c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceOperationInstructionDto extends OperationInstruction {
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("涓婁紶浜�")
+    private String uploaderName;
+
+    @ApiModelProperty("瀹℃壒浜�")
+    private String approverName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
new file mode 100644
index 0000000..25de891
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
@@ -0,0 +1,35 @@
+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.DeviceAccidentReportDto;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportMapper extends BaseMapper<DeviceAccidentReport> {
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, @Param("ew") QueryWrapper<DeviceAccidentReport> ew);
+
+    /**
+     * 鏌ヨ璁惧浜嬫晠鎶ュ憡璇︽儏
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @return
+     */
+    DeviceAccidentReportDto selectDeviceAccidentReportById(Integer accidentReportId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
new file mode 100644
index 0000000..78e9da2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
@@ -0,0 +1,27 @@
+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.DeviceBreakdownMaintenance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceMapper extends BaseMapper<DeviceBreakdownMaintenance> {
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, @Param("ew") QueryWrapper<DeviceBreakdownMaintenance> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
new file mode 100644
index 0000000..66d10cd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
new file mode 100644
index 0000000..5cb34ee
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
@@ -0,0 +1,28 @@
+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.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param page
+     * @param queryWrappers
+     * @return
+     */
+    IPage<DeviceInspectionRecord> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
new file mode 100644
index 0000000..12fd129
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
@@ -0,0 +1,23 @@
+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.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
+
+
+    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..f034e12
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
new file mode 100644
index 0000000..d429673
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.mqtt;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQBean {
+
+	@Bean("mqClient") // 鍚姩WEB鏈嶅姟鍣ㄧ殑鏃跺�欒皟鐢ㄦ鏂规硶鍒濆鍖�
+	public MQClient myMQTTClient(){
+		MQClient mqClient = new MQClient();
+		return mqClient;
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
new file mode 100644
index 0000000..51fb42a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -0,0 +1,93 @@
+package com.ruoyi.device.mqtt;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class MQCallback<component> implements MqttCallback {
+
+    private MQClient mqClient; // MQTT杩炴帴鏁版嵁
+
+    private MQConfig mqConfig; // yml閰嶇疆鏁版嵁
+
+    private static MQCallback mqCallback;
+
+    @Resource
+    private CollectBridgeService collectBridgeService;
+
+    @PostConstruct
+    public void init() {
+		mqCallback = this;
+         // 鍒濅娇鍖栨椂灏嗗凡闈欐�佸寲鐨刢onfigParam瀹炰緥鍖�
+		mqCallback.collectBridgeService = this.collectBridgeService;
+    }
+
+    public MQCallback(MQClient mqClient, MQConfig mqConfig) {
+        this.mqClient = mqClient;
+        this.mqConfig = mqConfig;
+    }
+
+    /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+    @SneakyThrows
+    @Override
+    public void connectionLost(Throwable cause) {
+        /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+        if (mqClient != null) {
+            while (true) {
+                try {
+                    log.info("==============銆嬨�嬨�媅MQTT] 杩炴帴涓㈠け锛屽皾璇曢噸杩�...");
+                    MQClient mqttPushClient = new MQClient();
+                    mqttPushClient.connect(mqConfig);
+                    if (mqClient.getClient().isConnected()) {
+                        log.info("=============>>閲嶈繛鎴愬姛");
+                    }
+                    break;
+                } catch (Exception e) {
+                    log.error("=============>>>[MQTT] 杩炴帴鏂紑锛岄噸杩炲け璐ワ紒<<=============");
+                    continue;
+                }
+            }
+        }
+        log.info(cause.getMessage());
+    }
+
+    /**
+     * MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈紝瀹樻柟璇濈О涓猴細璁㈤槄鍚庣殑娑堟伅
+     * @param topic 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+     * @param message 淇℃伅
+     * @throws Exception 鎶ラ敊
+     */
+    @Override
+    public void messageArrived(String topic, MqttMessage message) throws Exception {
+        try {
+            String parse = new String(message.getPayload());
+            JSONObject jsonObject = JSONObject.parseObject(parse);
+            // 濉厖閲囬泦鏁版嵁
+            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("============銆嬨�嬫帴鏀舵秷鎭富棰樺紓甯� : " + e.getMessage());
+        }
+    }
+
+    /**
+     * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈�
+     * 瀹樻柟璇濈О涓猴細鍙戝竷鍚庝細鎵ц鍒拌繖閲�
+     * @param token 杩炴帴token
+     */
+    @Override
+    public void deliveryComplete(IMqttDeliveryToken token) {
+//        log.info("==========鍙戝竷淇℃伅={}==========", token.isComplete());
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
new file mode 100644
index 0000000..1c3c548
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
@@ -0,0 +1,97 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQClient {
+
+	private static MqttClient client;
+	public static MqttClient getClient() {
+		return client;
+	}
+	public static void setClient(MqttClient client) {
+		MQClient.client = client;
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄧ殑閰嶇疆
+	 * @param userName 璐﹀彿
+	 * @param password 瀵嗙爜
+	 * @param outTime 瓒呮椂鏃堕棿
+	 * @param KeepAlive 蹇冭烦妫�娴嬫椂闂�
+	 * @return
+	 */
+	private MqttConnectOptions getOption(String userName, String password, int outTime, int KeepAlive) {
+		MqttConnectOptions option = new MqttConnectOptions();
+		// 璁剧疆鏄惁娓呯┖session,false琛ㄧず鏈嶅姟鍣ㄤ細淇濈暀瀹㈡埛绔殑杩炴帴璁板綍锛宼rue琛ㄧず姣忔杩炴帴鍒版湇鍔″櫒閮戒互鏂扮殑韬唤杩炴帴
+		option.setCleanSession(true);
+		// 璁剧疆杩炴帴鐨勭敤鎴峰悕
+		option.setUserName(userName);
+		// 璁剧疆杩炴帴鐨勫瘑鐮�
+		option.setPassword(password.toCharArray());
+		// 璁剧疆瓒呮椂鏃堕棿 鍗曚綅涓虹
+		option.setConnectionTimeout(outTime);
+		// 璁剧疆浼氳瘽蹇冭烦鏃堕棿 鍗曚綅涓虹 鏈嶅姟鍣ㄤ細姣忛殧(1.5*keepTime)绉掔殑鏃堕棿鍚戝鎴风鍙戦�佷釜娑堟伅鍒ゆ柇瀹㈡埛绔槸鍚﹀湪绾匡紝浣嗚繖涓柟娉曞苟娌℃湁閲嶈繛鐨勬満鍒�
+		option.setKeepAliveInterval(KeepAlive);
+		// setWill鏂规硶锛屽鏋滈」鐩腑闇�瑕佺煡閬撳鎴风鏄惁鎺夌嚎鍙互璋冪敤璇ユ柟娉曘�傝缃渶缁堢鍙g殑閫氱煡娑堟伅
+		// option.setWill(topic, "close".getBytes(), 2, true);
+		//璁剧疆鏈�澶ч�熷害
+		option.setMaxInflight(1000);
+		log.info("================>>>MQTT杩炴帴璁よ瘉鎴愬姛<<======================");
+		return option;
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄥ嚱鏁�
+	 * @param mqttConfig yml涓璏QTT鐨勯厤缃�
+	 */
+	public void connect(MQConfig mqttConfig) throws MqttException {
+		client = new MqttClient(mqttConfig.getUrl(), mqttConfig.getClientId(), new MemoryPersistence());
+		MqttConnectOptions options = getOption(mqttConfig.getUsername(), mqttConfig.getPassword(),
+				mqttConfig.getTimeout(), mqttConfig.getKeepAlive());
+		MQClient.setClient(client);
+		//杩炴帴澶辫触璋冪敤鍥炶皟鍑芥暟锛岄噸鏂拌繛鎺�
+		client.setCallback(new MQCallback<Object>(this, mqttConfig));
+		if (!client.isConnected()) {
+			client.connect(options);
+			// 璁㈤槄涓婚
+			MQSubscribe.subscribe_0(mqttConfig.getSubscribe());
+			log.info("================>>>MQTT杩炴帴鎴愬姛<<======================");
+		} else {// 杩欓噷鐨勯�昏緫鏄鏋滆繛鎺ヤ笉鎴愬姛灏遍噸鏂拌繛鎺�
+			client.disconnect();
+			client.connect(options);
+		}
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂嚎閲嶈繛
+	 * @throws Exception
+	 */
+	public Boolean reConnect() throws Exception {
+		Boolean isConnected = false;
+		if (null != client) {
+			client.connect();
+			if (client.isConnected()) {
+				isConnected = true;
+			}
+		}
+		return isConnected;
+	}
+
+	/**
+	 * 寮傚父鍏抽棴鏈嶅姟锛學EB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂紑杩炴帴鍑芥暟
+	 */
+	@SneakyThrows
+	public void close(){
+		client.close();
+		client.disconnect();
+		log.info("================>>寮傚父鍏抽棴涓巑qtt鏈嶅姟鍣ㄧ殑杩炴帴<<======================");
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
new file mode 100644
index 0000000..a88b29c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
@@ -0,0 +1,64 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+public class MQConfig {
+
+	/**
+	 * MQTT-鏈嶅姟绔�-IP
+	 */
+	@Value("${mqtt.url}")
+	private String url;
+
+	/**
+	 * MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�
+	 */
+	@Value("${mqtt.username}")
+	private String username;
+
+	/**
+	 * MQTT-鏈嶅姟绔�-瀵嗙爜
+	 */
+	@Value("${mqtt.password}")
+	private String password;
+
+	/**
+	 * 瓒呮椂鏃堕棿
+	 */
+	@Value("${mqtt.timeout}")
+	private int timeout;
+
+	/**
+	 * 蹇冭烦妫�娴嬫椂闂�
+	 */
+	@Value("${mqtt.keepalive}")
+	private int keepAlive;
+
+	/**
+	 * 蹇冭烦鍖呯骇鍒�
+	 */
+	@Value("${mqtt.qos}")
+	private int qos;
+
+	/**
+	 * 鏈嶅姟绔繛鎺ヨ秴鏃舵椂闂�
+	 */
+	@Value("${mqtt.completion-timeout}")
+	private int completionTimeout;
+
+	/**
+	 * clientId
+	 */
+	@Value("${mqtt.clientId}")
+	private String clientId;
+
+	/**
+	 * 璁㈤槄涓婚
+	 */
+	@Value("${mqtt.subscribe}")
+	private String subscribe;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
new file mode 100644
index 0000000..78c26d7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQPublic {
+
+	/**
+	 * 閫氫俊璐ㄩ噺qos涓�0锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彧鍙戦�佷竴娆★紝涓嶇MQTT鏈嶅姟鍣ㄦ湁娌℃湁鏀跺埌
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_0(int qos, String topic, byte[] pushMessage) {
+		publish(0, false, topic, pushMessage);
+	}
+
+	/**
+	 * 閫氫俊璐ㄩ噺qos涓�1锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝MQTT鏈嶅姟鍣ㄤ竴瀹氫細鏀跺埌涓�娆℃暟鎹紝濡傛灉MQTT鏈嶅姟鍣ㄦ病鏈夊搷搴斺�滄敹鍒版暟鎹�濓紝閭d箞WEB鏈嶅姟鍣ㄥ氨浼氫竴鐩村彂閫佹暟鎹�
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝璋冪敤姝ゅ嚱鏁帮紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺qos涓�1
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_1(String topic, byte[] pushMessage) {
+		publish(1, false, topic, pushMessage);
+	}
+
+	/**
+	 *閫氫俊璐ㄩ噺qos涓�2锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝涓よ�呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け锛屼絾鏄浉搴旂殑涔熶細娑堣�楄绠楁満涓殑璧勬簮
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺锛�2
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_2(String topic, byte[] pushMessage) {
+		publish(2,false, topic, pushMessage);
+	}
+
+	/**
+	 * 鍙戝竷鍑芥暟锛歐EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *
+	 * @param qos 閫氫俊璐ㄩ噺
+	 * @param retained 榛樿锛歠alse-闈炴寔涔呭寲锛堟槸鎸囦竴鏉℃秷鎭秷璐瑰畬锛屽氨浼氳鍒犻櫎锛涙寔涔呭寲锛屾秷璐瑰畬锛岃繕浼氫繚瀛樺湪鏈嶅姟鍣ㄤ腑锛屽綋鏂扮殑璁㈤槄鑰呭嚭鐜帮紝缁х画缁欐柊璁㈤槄鑰呮秷璐癸級
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish(int qos, boolean retained, String topic, byte[] pushMessage) {
+		MqttMessage message = new MqttMessage();
+		message.setQos(qos);
+		message.setRetained(retained);
+		// 灏哠tring[]鏁扮粍杞崲涓篵yte鏁扮粍鍙戦��
+		message.setPayload(pushMessage);
+		MqttTopic mTopic = MQClient.getClient().getTopic(topic);
+		if (null == mTopic) {
+			log.error("===============>>>MQTT {} 涓嶅瓨鍦�<<=======================",topic);
+		}
+		MqttDeliveryToken token;
+		try {
+			token = mTopic.publish(message);
+			token.waitForCompletion();
+		} catch (MqttPersistenceException e) {
+			e.printStackTrace();
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
new file mode 100644
index 0000000..0541e3f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
@@ -0,0 +1,60 @@
+package com.ruoyi.device.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQSubscribe {
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛歁QTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 * @param qos MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *            qos涓�0锛氬彧鍚慦EB鏈嶅姟鍣ㄥ彂閫佷竴娆★紱
+	 *            qos涓�1锛氳嚦灏戝悜WEB鏈嶅姟鍣ㄥ彂閫佷竴娆★紝鎺ユ敹鏂逛細鍝嶅簲涓�涓姤鏂囷紱
+	 *            qos涓�2锛氫袱鑰呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け
+	 */
+	private static void subscribe(String topic, int qos) {
+		try {
+			MQClient.getClient().subscribe(topic,qos);
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�0
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public static void subscribe_0(String topic) {
+		subscribe(topic, 0);
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�1
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public void subscribe_1(String topic) {
+		subscribe(topic, 1);
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�2
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public void subscribe_2(String topic) {
+		subscribe(topic, 2);
+	}
+
+	public void OffSubscribe(String topic) {
+		try {
+			MQClient.getClient().unsubscribe(topic);
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
new file mode 100644
index 0000000..44558f3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
@@ -0,0 +1,120 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Getter
+@Setter
+@TableName("device_accident_report")
+@ApiModel(value = "DeviceAccidentReport瀵硅薄", description = "璁惧浜嬫晠鎶ュ憡鍗�")
+public class DeviceAccidentReport {
+
+    @TableId(value = "accident_report_id", type = IdType.AUTO)
+    private Integer accidentReportId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍦板潃")
+    private String address;
+
+    @ApiModelProperty("鏃堕棿")
+    private LocalDateTime accidentDate;
+
+    @ApiModelProperty("浜嬫晠鎯呭喌鎻忚堪")
+    private String descriptionOfAccident;
+
+    @ApiModelProperty("鎶ュ憡浜篿d")
+    private Integer reportUserId;
+
+    @ApiModelProperty("鎶ュ憡浜�")
+    private String reportUser;
+
+    @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+    private LocalDate reportDate;
+
+    @ApiModelProperty("璇勪及浜烘剰瑙�")
+    private String assessorOpinion;
+
+    @ApiModelProperty("璇勪及浜篿d")
+    private Integer assessorUserId;
+
+    @ApiModelProperty("璇勪及浜�")
+    private String assessorUser;
+
+    @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+    private LocalDate assessorDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉鎰忚")
+    private String technicalDirectorOpinion;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉id")
+    private Integer technicalDirectorUserId;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉")
+    private String technicalDirectorUser;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private LocalDate technicalDirectorDate;
+
+    @ApiModelProperty("涓讳换鎰忚")
+    private String directorHeadOpinion;
+
+    @ApiModelProperty("涓讳换id")
+    private Integer directorHeadUserId;
+
+    @ApiModelProperty("涓讳换")
+    private String directorHeadUser;
+
+    @ApiModelProperty("涓讳换濉啓鏃堕棿")
+    private LocalDate directorHeadDate;
+
+    @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @ApiModelProperty("娴佺▼, 0:鎶ュ憡, 1璇勪及, 2:閮ㄩ棬璐熻矗浜烘剰瑙�, 3:鎶�鏈礋璐d汉鎰忚, 4:涓讳换鎰忚")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
new file mode 100644
index 0000000..e605cb3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
@@ -0,0 +1,93 @@
+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;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record")
+@ApiModel(value = "DeviceInspectionRecord瀵硅薄", description = "")
+public class DeviceInspectionRecord implements Serializable {
+
+    @ApiModelProperty("璁惧鐐规璁板綍id")
+    @TableId(value = "inspection_record_id", type = IdType.AUTO)
+    private Integer inspectionRecordId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("娴嬮噺鑼冨洿")
+    private String measurementScope;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川鍚嶇О")
+    private String materialName;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+    private String materialModel;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川绠$悊缂栧彿")
+    private String materialManagementNumber;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川绮惧害绛夌骇")
+    private String materialAccuracyGrade;
+
+    @ApiModelProperty("娓╁害")
+    private String temperature;
+
+    @ApiModelProperty("婀垮害")
+    private String humidity;
+
+    @ApiModelProperty("娴嬭瘯缁撹")
+    private String testConclusion;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鐘舵�侊紙鏄惁澶嶆牳锛�0鏈鏍革紝1澶嶆牳")
+    private Integer status;
+
+    @ApiModelProperty("娴嬭瘯浜�")
+    private String recorder;
+
+    @ApiModelProperty("娴嬭瘯浜篿d")
+    private Integer recorderId;
+
+    @ApiModelProperty("澶嶆牳浜�")
+    private String reviewer;
+
+    @ApiModelProperty("澶嶆牳浜篿d")
+    private Integer reviewerId;
+
+    @ApiModelProperty("澶嶆牳淇℃伅")
+    private String reviewerRemark;
+
+    @ApiModelProperty("娴嬭瘯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime testDate;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
new file mode 100644
index 0000000..feaed31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
@@ -0,0 +1,63 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record_details")
+@ApiModel(value = "DeviceInspectionRecordDetails瀵硅薄", description = "")
+public class DeviceInspectionRecordDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("鐐规璇︽儏id")
+    @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
+    private Integer inspectionRecordDetailId;
+
+    @ApiModelProperty("鐐规id")
+    private Integer inspectionRecordId;
+
+    @ApiModelProperty("娴嬭瘯椤圭洰")
+    private String testItems;
+
+    @ApiModelProperty("鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty("瀹炴祴鍊�")
+    private String measuredValue;
+
+    @ApiModelProperty("绀哄�艰宸�")
+    private String indicationError;
+
+    @ApiModelProperty("鍏佽璇樊")
+    private String allowableError;
+
+    @ApiModelProperty("鍗曢」缁撹")
+    private String singleItemConclusion;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
new file mode 100644
index 0000000..5a4f845
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
@@ -0,0 +1,64 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Getter
+@Setter
+@TableName("device_instruction")
+@ApiModel(value = "Instruction瀵硅薄", description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class DeviceInstruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
new file mode 100644
index 0000000..7666be1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
@@ -0,0 +1,88 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+public class OperationInstruction {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧涓婚敭id")
+    private String deviceId;
+
+    @ApiModelProperty("鏂囦欢绫诲瀷")
+    private String documentType;
+
+    @ApiModelProperty("鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @ApiModelProperty("鏂囦欢鐗堟湰")
+    private String documentVersion;
+
+    @ApiModelProperty("浣滆��")
+    private String author;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @ApiModelProperty("鏂囨。璇存槑")
+    private String documentNote;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("浣滀笟鎸囧涔d")
+    private Integer instructionId;
+
+    @ApiModelProperty("涓婁紶浜篿d")
+    private Integer uploader;
+
+    @ApiModelProperty("瀹℃壒浜篿d")
+    private Integer approverId;
+
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Boolean status;
+
+    @ApiModelProperty("鐢熸晥鏃堕棿")
+    private LocalDateTime entryIntoForceTime;
+
+    @ApiModelProperty("涓婁紶鏃堕棿")
+    private LocalDateTime uploadTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
new file mode 100644
index 0000000..3a6ce16
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeService extends IService<CollectBridge> {
+
+    /**
+     * 濉厖閲囬泦鏁版嵁
+     * @param jsonObject
+     */
+    void addBridgeValue(JSONObject jsonObject);
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
new file mode 100644
index 0000000..0b2ff31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
@@ -0,0 +1,41 @@
+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.device.pojo.DeviceAccidentReport;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
new file mode 100644
index 0000000..e244044
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
@@ -0,0 +1,41 @@
+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.device.dto.DeviceBreakdownMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
new file mode 100644
index 0000000..4fd6270
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
new file mode 100644
index 0000000..7278b3c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  璁惧鐐规璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordService extends IService<DeviceInspectionRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param page
+     */
+    Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecord);
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    Result getDeviceInspectionRecord(Integer inspectionRecordId);
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param deviceExamineRecordDto
+     * @return
+     */
+    Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response
+     */
+    Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
new file mode 100644
index 0000000..70e5f1c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
@@ -0,0 +1,23 @@
+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.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface DeviceInstructionService extends IService<DeviceInstruction> {
+
+    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
+
+    void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
new file mode 100644
index 0000000..afc8bdd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
new file mode 100644
index 0000000..a1acb6e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.device.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.device.mapper.CollectBridgeMapper;
+import com.ruoyi.device.pojo.CollectBridge;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+@Service
+@Slf4j
+public class CollectBridgeServiceImpl extends ServiceImpl<CollectBridgeMapper, CollectBridge> implements CollectBridgeService {
+
+    /**
+     * 濉厖閲囬泦鏁版嵁
+     * @param jsonObject
+     */
+    @Override
+    public void addBridgeValue(JSONObject jsonObject) {
+        JSONArray dataArray = jsonObject.getJSONArray("data");
+        for (int i = 0; i < dataArray.size(); i++) {
+            JSONObject listInfo = dataArray.getJSONObject(i);
+            // 瀛樺偍鏁版嵁
+            String dataStream = listInfo.getString("dataStream");
+            if (dataStream.equals("DQCS.DQCS.SN")) {
+                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+                String entrustCode = pointsJSONObject.getString("value");
+                // 瑙f瀽鏃堕棿鎴�
+                Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time"));
+                LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+                // 鍏堝瓨鍌ㄧ紪鍙�, 鍚庣画瀛樺偍鍊�
+                CollectBridge collectBridge = new CollectBridge();
+                collectBridge.setEntrustCode(entrustCode);
+                collectBridge.setCollectDate(collectDate);
+                baseMapper.insert(collectBridge);
+
+            }
+            // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+            if (dataStream.equals("DQCS.DQCS.64")) {
+                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+                String value = pointsJSONObject.getString("value");
+
+                if (value.equals("64")) {
+                    for (int j = 0; j < dataArray.size(); j++) {
+                        JSONObject listInfo2 = dataArray.getJSONObject(j);
+                        String dataStream2 = listInfo2.getString("dataStream");
+                        // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+                        if (dataStream2.equals("DQCS.DQCS.DZZ")) {
+                            JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints");
+                            JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0);
+                            String collectValue = pointsJSONObject2.getString("value");
+
+                            // 瑙f瀽鏃堕棿鎴�
+                            Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time"));
+                            LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+                            // 鏌ヨ鏈�鏂颁竴鏉℃暟鎹�
+                            CollectBridge collectBridge = baseMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery()
+                                    .orderByDesc(CollectBridge::getCollectDate)
+                                    .last("limit 1"));
+
+                            // 鍒ゆ柇涓ゆ潯鏁版嵁鏄惁鐩稿樊鍦�10鍒嗛挓涔嬪唴鍜屾湁娌℃湁缂栧彿
+                            if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) &&
+                                    StringUtils.isNotBlank(collectBridge.getEntrustCode())) {
+                                // 淇敼妫�楠屽��
+                                collectBridge.setCollectValue(collectValue);
+                                baseMapper.updateById(collectBridge);
+                            } else {
+                                // 鍙瓨鍌ㄥ��
+                                CollectBridge bridge = new CollectBridge();
+                                bridge.setCollectValue(collectValue);
+                                bridge.setCollectDate(collectDate);
+                                baseMapper.insert(bridge);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
+        Duration duration = Duration.between(dateTime1, dateTime2);
+        long minutesDifference = Math.abs(duration.toMinutes());
+        return minutesDifference <= 10;
+    }
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
new file mode 100644
index 0000000..60d610e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
@@ -0,0 +1,189 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceAccidentReportDto;
+import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Service
+public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
+
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
+        return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
+        DeviceAccidentReport accidentReport = new DeviceAccidentReport();
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        switch (deviceAccidentReport.getFlowType()) {
+            case 0:
+                // 鎶ュ憡
+                BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
+                accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
+                accidentReport.setReportUserId(user.getId());
+                accidentReport.setReportUser(user.getName());
+                accidentReport.setReportDate(LocalDate.now());
+
+                // 璇勪及浜轰俊鎭�
+                User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
+                accidentReport.setAssessorUserId(assessorUser.getId());
+                accidentReport.setAssessorUser(assessorUser.getName());
+
+                baseMapper.insert(accidentReport);
+                break;
+            case 1:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 璇勪及
+                accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
+                accidentReport.setAssessorDate(LocalDate.now());
+
+                // 閮ㄩ棬璐熻矗浜�
+                User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
+                accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
+                accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 2:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 閮ㄩ棬璐熻矗浜烘剰瑙�
+                accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
+                accidentReport.setDepartmentHeadDate(LocalDate.now());
+
+                // 鎶�鏈礋璐d汉淇℃伅
+                User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
+                accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
+                accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 3:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 鎶�鏈礋璐d汉鎰忚
+                accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
+                accidentReport.setTechnicalDirectorDate(LocalDate.now());
+
+                // 涓讳换淇℃伅
+                User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
+                accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
+                accidentReport.setDirectorHeadUser(directorHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 4:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 涓讳换鎰忚
+                accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
+                accidentReport.setDirectorHeadDate(LocalDate.now());
+
+                accidentReport.setIsFinish(1);
+                baseMapper.updateById(accidentReport);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        // 鏌ヨ浜嬫晠鎶ュ憡
+        DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
+
+        Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
+        device = device == null ? new Device() : device;
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAccidentReport", deviceAccidentReport);
+                    put("device", finalDevice);
+                    // 鎶ュ憡浜虹鍚�
+                    put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
+                    // 璇勪及浜虹鍚�
+                    put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                    // 鎶�鏈礋璐d汉绛惧悕
+                    put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
+                    // 涓讳换绛惧悕
+                    put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧浜嬫晠鎶ュ憡鍗�", "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/DeviceBreakdownMaintenanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
new file mode 100644
index 0000000..8fb4089
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -0,0 +1,152 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Service
+public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
+        //褰撳墠鐧诲綍鐢ㄦ埛
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+
+        switch (deviceBreakdownMaintenance.getFlowType()) {
+            case 0:
+                BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
+                // 鐢宠
+                breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
+                breakdownMaintenance.setApplicantUserId(user.getId());
+                breakdownMaintenance.setApplicantUser(user.getName());
+                breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
+
+                // 澶勭悊浜轰俊鎭�
+                User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
+                breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
+                breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
+
+                baseMapper.insert(breakdownMaintenance);
+                break;
+            case 1:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+                breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
+                breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+            case 2:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 璁¢噺瀹ゆ剰瑙�
+                breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
+                breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
+                breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
+
+                breakdownMaintenance.setIsFinish(1);
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
+        // 鏌ヨ澶栭儴璁惧鐢宠
+        DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
+
+        Device device = null;
+        if (deviceBreakdownMaintenance.getDeviceId() != null) {
+            device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
+            device = device == null ? new Device() : device;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
+                    put("device", finalDevice);
+                    // 鐢宠浜虹鍚�
+                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧鏁呴殰缁翠慨鐢宠琛�", "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/DeviceInspectionRecordDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
new file mode 100644
index 0000000..9058081
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Service
+public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
new file mode 100644
index 0000000..2c8041d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -0,0 +1,221 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     *
+     * @param page 褰撳墠椤电爜
+     */
+    @Override
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
+        IPage<DeviceInspectionRecord> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
+        return Result.success(iPage);
+    }
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    @Override
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
+        DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, dto);
+        List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
+        dto.setDetails(list);
+        return Result.success(dto);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        deviceInspectionRecord.setRecorderId(userId);
+        deviceInspectionRecord.setRecorder(user.getName());
+
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+
+        return Result.success();
+    }
+
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        this.removeById(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        return Result.success();
+    }
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param dto
+     * @return
+     */
+    @Override
+    public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
+        LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
+                .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
+                .set(DeviceInspectionRecord::getStatus, dto.getStatus())
+                .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (dto.getStatus().equals(0)) {
+            wrapper.set(DeviceInspectionRecord::getReviewerId, null)
+                    .set(DeviceInspectionRecord::getReviewer, null);
+        }
+        this.update(wrapper);
+
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response                 鍝嶅簲
+     */
+    @Override
+    public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
+        DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
+
+        List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
+
+        Integer deviceId = deviceInspectionRecord.getDeviceId();
+
+        Device device = deviceMapper.selectById(deviceId);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceInspectionRecord", deviceInspectionRecordDto);
+                    put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
+                    put("device", device);
+                    put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
+                    put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    device.getDeviceName() + "鐐规璁板綍", "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("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
new file mode 100644
index 0000000..6f5bb5b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
@@ -0,0 +1,67 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.InstructionMapper;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
+
+    @Autowired
+    private DeviceOperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<DeviceInstruction> numberGenerator;
+
+    @Override
+    public IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto) {
+        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, DeviceInstruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(SecurityUtils.getUserId().intValue());
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
new file mode 100644
index 0000000..273dd2c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.OperationInstructionMapper;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
+
+    @Override
+    public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
new file mode 100644
index 0000000..7ead8cb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
@@ -0,0 +1,65 @@
+package com.ruoyi.device.task;
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧浣跨敤璁板綍鎻愰啋
+ */
+@Component
+public class DeviceRecordSchedule {
+    @Resource
+    private DeviceRecordMapper deviceRecordMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    /**
+     * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
+    public void task1() {
+        // 鏌ヨ鏈~鍐欑殑璁惧浣跨敤璁板綍
+        List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
+        Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
+        userPersonIdMap.forEach((userId, recordList) -> {
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+                User user = userMapper.selectById(userId);
+                String message = "";
+                message += "璁惧浣跨敤璁板綍鏈~鍐欐彁閱掗�氱煡";
+                for (DeviceRecordDto deviceRecord : recordList) {
+                    message += "\n璁惧鍚嶇О缂栧彿: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
+                    message += "\n濮旀墭缂栧彿: " + deviceRecord.getSampleCode();
+                    message += "\n";
+                }
+                message += "\n璇峰幓濉啓璁惧浣跨敤璁板綍";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+
+            });
+        });
+
+
+    }
+
+}
diff --git a/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
new file mode 100644
index 0000000..2bbfce0
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceAccidentReportMapper">
+
+    <!-- 璁惧浜嬫晠鎶ュ憡鍒楄〃 -->
+    <select id="pageDeviceAccidentReport" resultType="com.ruoyi.device.pojo.DeviceAccidentReport">
+        select * from (
+        select *
+        from device_accident_report
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceAccidentReportById" resultType="com.ruoyi.device.dto.DeviceAccidentReportDto">
+        select
+            d.*,
+            date_format(d.accident_date,'%Y-%m-%d') accidentDateStr, -- 鏃堕棿
+            date_format(d.report_date,'%Y-%m-%d') reportDateStr, -- 鎶ュ憡浜哄~鍐欐椂闂�
+            date_format(d.assessor_date,'%Y-%m-%d') assessorDateStr, -- 璇勪及浜哄~鍐欐椂闂�
+            date_format(d.department_head_date,'%Y-%m-%d') departmentHeadDateStr, -- 閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�
+            date_format(d.technical_director_date,'%Y-%m-%d') technicalDirectorDateStr, -- 鎶�鏈礋璐d汉濉啓鏃堕棿
+            date_format(d.director_head_date,'%Y-%m-%d') directorHeadDateStr -- 涓讳换濉啓鏃堕棿
+        from device_accident_report d
+        where d.accident_report_id = #{accidentReportId}
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
new file mode 100644
index 0000000..4877ecf
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.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.DeviceBreakdownMaintenanceMapper">
+
+    <!--璁惧鏁呴殰缁翠慨鍒楄〃-->
+    <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
+        select * from (
+        select *
+        from device_breakdown_maintenance
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
new file mode 100644
index 0000000..af4ac42
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
@@ -0,0 +1,14 @@
+<?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.DeviceInspectionRecordMapper">
+
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
+        SELECT
+            *
+        from device_inspection_record
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/InstructionMapper.xml b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..2d1a823
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,19 @@
+<?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.InstructionMapper">
+
+
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.pojo.DeviceInstruction">
+        SELECT
+            doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
+        FROM
+            device_operation_instruction doi
+                LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+                left join device d on d.id = doi.device_id
+                left join user u on u.id = doi.uploader
+                left join user u1 on u1.id = doi.approver_id
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..5679e35
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.OperationInstructionMapper">
+
+    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
+        SELECT
+            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+        FROM
+            device_operation_instruction doi
+                left join device d on d.id = doi.device_id
+        where doi.instruction_id = #{instructionId}
+    </select>
+</mapper>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
new file mode 100644
index 0000000..854d84a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
@@ -0,0 +1,29 @@
+package com.ruoyi.web;
+
+import com.ruoyi.device.mqtt.MQClient;
+import com.ruoyi.device.mqtt.MQConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MqttApplicationRunner implements ApplicationRunner {
+
+	@Autowired
+	private MQConfig mqConfig;
+
+	@Value("${mqtt.client}")
+	private Boolean client;
+
+	@Override
+	public void run(ApplicationArguments args) throws Exception {
+		if (client) {
+			MQClient mqttPushClient = new MQClient();
+			mqttPushClient.connect(mqConfig);
+		}
+	}
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index f32dbe2..33a491d 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -98,3 +98,16 @@
   custorder: http://192.168.20.47/PurchService.ashx?
   custorder-port: http://192.168.20.47:8008/PurchService.ashx?
   erp-services: http://192.168.20.47:8081
+
+# 澶囨敞 18083瀵嗙爜锛歾ttZTT123!@
+mqtt:
+  url: tcp://mqtt-ztt.zttiot.com:1883 # 鏈嶅姟鍣╥p
+  username: forwarder # MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍鍚�
+  password: ZTlink12345 # MQTT-鏈嶅姟绔�-瀵嗙爜锛�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍瀵嗙爜
+  timeout: 100 # 瓒呮椂鏃堕棿 锛堝崟浣嶏細绉掞級
+  keepalive: 60 # 蹇冭烦 锛堝崟浣嶏細绉掞級
+  qos: 1 # 蹇冭烦鍖呯骇鍒�
+  completion-timeout: 3000 # 杩炴帴瓒呮椂鏃堕棿锛堝崟浣嶏細绉掞級
+  clientId: javaPublish # clientId
+  subscribe: /ztt/v3/2443521/publish # 璁㈤槄涓婚
+  client: false # 濡傛灉寮�鍙戦渶瑕佸惎鍔ㄦ祴璇曪紝闇�瑕佹敼涓篺alse涓嶇劧浼氫竴鐩存姤閿�

--
Gitblit v1.9.3