From 8d85246f061e3da623c7b9eb4e323ee724b4de0b Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期一, 13 一月 2025 13:20:01 +0800
Subject: [PATCH] 设备cnas代码搬迁

---
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExternalApplyServiceImpl.java                 |  163 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/ReservationMapper.java                                    |   23 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricRecord.java                                     |   89 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAccidentReport.java                                   |  120 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLease.java                                            |   47 
 cnas-server/src/main/resources/static/word/device-scrapped.docx                                            |    0 
 cnas-server/src/main/java/com/yuanchu/mom/service/IncidentSparePartsService.java                           |    7 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExternalApplyDto.java                                  |   12 
 cnas-server/src/main/resources/mapper/IncidentReportMapper.xml                                             |  118 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlanDetails.java                               |   76 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/OperationInstructionServiceImpl.java                |   27 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/QrShowServiceImpl.java                              |  218 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBreakdownMaintenanceMapper.java                     |   27 
 cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceMetricService.java                                |    7 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanDetailsMapper.java                   |   25 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLogServiceImpl.java                           |   11 
 cnas-server/src/main/resources/static/word/device-status.docx                                              |    0 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordService.java                       |   69 
 cnas-server/src/main/resources/static/word/maintenance-plan.docx                                           |    0 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastServiceImpl.java         |  195 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentSparePartsServiceImpl.java                  |   11 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceMaintenanceExport.java                               |   45 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentAcceptanceCheckServiceImpl.java             |   11 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLogController.java                              |   50 
 cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastDetailsMapper.xml                         |   22 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagement.java                           |   77 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultController.java                            |   50 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExport.java                                            |   19 
 cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionFileDto.java                                      |   44 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordDetailMapper.java                      |   16 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceFileService.java                         |   17 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordMapper.java                         |   28 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceStateMapper.java                                    |   20 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLogMapper.java                                      |    9 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordDetailsServiceImpl.java       |   20 
 cnas-server/src/main/resources/static/word/device-document.docx                                            |    0 
 framework/src/main/java/com/yuanchu/mom/enums/QrModelType.java                                             |   39 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCalibrationPlanController.java                  |  163 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentSpareParts.java                                     |   44 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanDetailMapper.java                    |   27 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLeaseMapper.java                                    |    9 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDto.java                                |   30 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DocumentServiceImpl.java                            |   11 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDetailsDto.java                   |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/Document.java                                               |   91 
 cnas-server/src/main/resources/mapper/OperationInstructionMapper.xml                                       |   13 
 cnas-server/src/main/java/com/yuanchu/mom/service/QrShowService.java                                       |    9 
 cnas-server/src/main/java/com/yuanchu/mom/vo/OperationInstructionVo.java                                   |   17 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordExportWord.java                                  |   28 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceRecordController.java                           |   70 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceRecordServiceImpl.java                        |  142 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceStateServiceImpl.java                         |  159 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBreakdownMaintenanceService.java                   |   41 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanServiceImpl.java               |  239 +
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordDetailsMapper.java                  |   16 
 cnas-server/src/main/resources/static/word/acceptance-certificate.docx                                     |    0 
 cnas-server/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml                               |   28 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordMapper.java                            |   31 
 cnas-server/src/main/java/com/yuanchu/mom/dto/ReservationDto.java                                          |   10 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLog.java                                              |   29 
 cnas-server/src/main/resources/static/word/incident-report.docx                                            |    0 
 cnas-server/src/main/resources/static/word/device-inspection-record.docx                                   |    0 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastMapper.java                    |   31 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java |   20 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDetailsDto.java                         |   32 
 cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml                               |   39 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAccidentReportController.java                   |   88 
 cnas-server/src/main/resources/mapper/DeviceMapper.xml                                                     |    7 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanServiceImpl.java               |  252 +
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceStateController.java                            |   89 
 cnas-server/src/main/resources/mapper/DeviceExamineRecordMapper.xml                                        |   25 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentInstallMapper.java                                |   16 
 cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml                        |   33 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBreakdownMaintenanceController.java             |   89 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceStateDto.java                                          |   32 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanMapper.java                          |   29 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceScrappedService.java                               |   43 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentReportMapper.java                                 |   37 
 cnas-server/src/main/java/com/yuanchu/mom/service/IncidentAcceptanceCheckService.java                      |    7 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultMapper.java                                    |    9 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentReportServiceImpl.java                      |  187 
 cnas-server/src/main/resources/mapper/DeviceExamineRecordDetailMapper.xml                                  |   22 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenanceImpl.java                          |   97 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricController.java                           |   35 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricRecordService.java                           |   16 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DocumentExportWordDto.java                                   |   45 
 cnas-server/src/main/resources/mapper/DeviceAccidentReportMapper.xml                                       |   29 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordDetail.java                              |   70 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLeaseController.java                            |   44 
 cnas-server/src/main/resources/mapper/DeviceFaultOneMapper.xml                                             |   50 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentFileMapper.java                                   |   16 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanDetailService.java                  |   16 
 cnas-server/src/main/java/com/yuanchu/mom/controller/IncidentReportController.java                         |   84 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrast.java                            |   97 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricsCopyService.java                            |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceScrapped.java                                         |  105 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBorrowServiceImpl.java                        |  124 
 cnas-server/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml                                |   17 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanDetailsService.java                 |   17 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricRecordMapper.java                             |   16 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricsCopyMapper.java                              |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceRecord.java                                           |   70 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java        |   20 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordDto.java                                  |   28 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetric.java                                           |   29 
 cnas-server/src/main/java/com/yuanchu/mom/service/IncidentReportService.java                               |   42 
 cnas-server/src/main/resources/mapper/DeviceMetricsCopyMapper.xml                                          |   20 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DocumentDao.java                                          |    9 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceInspectionRecordDto.java                               |   25 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExcel.java                                   |   33 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentFileServiceImpl.java                        |   11 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlanDetails.java                           |   62 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceStateService.java                                  |   31 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordAndMaintenanceDto.java                     |   38 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceScrappedDto.java                                       |   26 
 cnas-server/src/main/java/com/yuanchu/mom/excel/IncidentReportExport.java                                  |   31 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanDetailsMapper.java                       |   27 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExternalApplyService.java                          |   42 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java                              |    4 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementDetailsService.java          |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlan.java                                  |   75 
 cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportAddDto.java                                    |   26 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordDto.java                                         |   14 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceRecordMapper.java                                   |   37 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCheckMapper.java                                    |    7 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceService.java                             |   39 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/InstructionMapper.java                                    |   23 
 cnas-server/src/main/resources/mapper/DeviceExternalApplyMapper.xml                                        |   23 
 cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionDto.java                                          |   13 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecord.java                                 |   93 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExport.java                                  |   34 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordDetailService.java                    |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/Instruction.java                                            |   64 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceState.java                                            |  107 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultServiceImpl.java                         |   97 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceRecordExport.java                                    |   43 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricRecordController.java                     |   89 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentReport.java                                         |  142 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceScrappedServiceImpl.java                      |  181 
 cnas-server/src/main/resources/mapper/DeviceScrappedMapper.xml                                             |   27 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlan.java                                      |   67 
 cnas-server/src/main/resources/static/word/use-record.docx                                                 |    0 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementDetailsMapper.java            |   26 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricsCopyServiceImpl.java                   |   20 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlanDetail.java                            |   74 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCheckServiceImpl.java                         |   11 
 cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLogService.java                                   |    7 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceRecordService.java                                 |   31 
 cnas-server/src/main/resources/mapper/InstructionMapper.xml                                                |   30 
 cnas-server/src/main/resources/mapper/DeviceInspectionRecordMapper.xml                                     |   33 
 cnas-server/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml                                    |   16 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAccidentReportService.java                         |   41 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultOneService.java                               |   20 
 cnas-server/src/main/resources/mapper/IncidentFileMapper.xml                                               |   13 
 cnas-server/src/main/resources/mapper/IncidentInstallMapper.xml                                            |   14 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAccidentReportMapper.java                           |   35 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDto.java                         |   27 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceScrappedMapper.java                                 |   35 
 cnas-server/src/main/resources/static/word/maintenance-records.docx                                        |    0 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/OperationInstruction.java                                   |   89 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanService.java                        |   70 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricServiceImpl.java                        |   11 
 cnas-server/src/main/resources/mapper/IncidentSparePartsMapper.xml                                         |   14 
 cnas-server/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml                                      |   20 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastDetailsMapper.java             |   16 
 cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceCalibrationPlanDetailUpload.java              |   36 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanDetailsService.java                     |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentInstall.java                                        |   44 
 inspect-server/src/main/java/com/yuanchu/mom/utils/UserUtils.java                                          |   90 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java                                 |    4 
 cnas-server/src/main/resources/static/word/examine-plan-detail.docx                                        |    0 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceScrappedController.java                         |   86 
 cnas-server/src/main/resources/mapper/DeviceAcceptanceMapper.xml                                           |   17 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementMapper.java                   |   34 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/OperationInstructionMapper.java                           |   20 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFault.java                                            |   39 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/InstructionServiceImpl.java                         |   72 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExaminePlanController.java                      |  255 +
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenancePlanController.java                  |  104 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceTraceabilityManagementController.java           |  104 
 cnas-server/src/main/resources/mapper/DeviceMaintenanceMapper.xml                                          |   22 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultOneMapper.java                                 |   20 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExternalApply.java                                    |  123 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentAcceptanceCheckMapper.java                        |   16 
 cnas-server/src/main/resources/static/word/quipment-details.docx                                           |    0 
 cnas-server/src/main/resources/static/word/examine-record.docx                                             |    0 
 cnas-server/src/main/resources/static/word/review-examine-record-contrast.docx                             |    0 
 cnas-server/src/main/java/com/yuanchu/mom/service/OperationInstructionService.java                         |   20 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceStateExport.java                                     |   36 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceMapper.java                               |   27 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceFileMapper.java                           |   16 
 cnas-server/src/main/java/com/yuanchu/mom/service/InstructionService.java                                  |   23 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceFaultOneDto.java                                       |   17 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordServiceImpl.java                 |  196 
 cnas-server/src/main/resources/static/word/device-accident-report.docx                                     |    0 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBorrowController.java                           |   76 
 cnas-server/src/main/resources/static/word/traceability-management-details.docx                            |    0 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordDetailsService.java                |   16 
 cnas-server/src/main/resources/mapper/ReservationMapper.xml                                                |   40 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentInstallServiceImpl.java                     |   11 
 cnas-server/src/main/resources/static/word/device-external-apply.docx                                      |    0 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDetailsDto.java                             |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptanceFile.java                                   |   58 
 cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceBorrowExcel.java                                     |   39 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentSparePartsMapper.java                             |   16 
 cnas-server/src/main/java/com/yuanchu/mom/controller/ReservationController.java                            |   70 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/Reservation.java                                            |   84 
 cnas-server/src/main/resources/mapper/DeviceBorrowMapper.xml                                               |   46 
 cnas-server/src/main/resources/mapper/DeviceStateMapper.xml                                                |   44 
 cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml                                |   39 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAccidentReportServiceImpl.java                |  191 
 cnas-server/src/main/resources/static/word/device-calibration-plan.docx                                    |    0 
 cnas-server/src/main/resources/mapper/DeviceExaminePlanMapper.xml                                          |   33 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanService.java                        |   70 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrastDetails.java                     |   70 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlan.java                                  |   67 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecord.java                                    |  139 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementServiceImpl.java        |  244 +
 cnas-server/src/main/resources/mapper/DeviceInspectionRecordDetailsMapper.xml                              |   19 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java  |   20 
 cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportExportWordDto.java                             |   49 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDto.java                          |   47 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBreakdownMaintenance.java                             |   90 
 cnas-server/src/main/java/com/yuanchu/mom/service/IncidentInstallService.java                              |    7 
 cnas-server/src/main/java/com/yuanchu/mom/controller/InstructionController.java                            |  109 
 cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLeaseService.java                                 |    7 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDto.java                                |   31 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementService.java                 |   61 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricMapper.java                                   |    9 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceFileServiceImpl.java                |   20 
 cnas-server/src/main/resources/mapper/DeviceAcceptanceFileMapper.xml                                       |   18 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceInspectionRecordController.java                 |  104 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanMapper.java                              |   35 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBorrowMapper.java                                   |   25 
 cnas-server/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml                                   |   18 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagementDetails.java                    |   68 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordDetailServiceImpl.java           |   20 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentAcceptanceCheck.java                                |   50 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordService.java                          |   43 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLeaseServiceImpl.java                         |   11 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCheck.java                                            |   24 
 cnas-server/src/main/java/com/yuanchu/mom/service/DocumentService.java                                     |    7 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceServiceImpl.java                    |  159 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenanceController.java                      |   97 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExternalApplyMapper.java                            |   34 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanServiceImpl.java                   |  254 +
 cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentFile.java                                           |   40 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanDetailServiceImpl.java         |   20 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBreakdownMaintenanceServiceImpl.java          |  154 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenanceMapper.java                              |   18 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenanceService.java                            |   24 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDetailsDto.java                  |   25 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultService.java                                  |   10 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultOneController.java                         |   82 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DocumentController.java                               |   44 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCollectionDto.java                                     |   28 
 cnas-server/src/main/java/com/yuanchu/mom/service/IncidentFileService.java                                 |    7 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordDto.java                                   |   13 
 cnas-server/src/main/java/com/yuanchu/mom/service/ReservationService.java                                  |   26 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecordDetails.java                          |   63 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanDetailsServiceImpl.java            |   20 
 cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceExaminePlanUpload.java                        |   37 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptance.java                                       |   77 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastDetailsService.java           |   16 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenance.java                                      |   42 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricsCopy.java                                      |   66 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDetailDto.java                          |   21 
 cnas-server/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml                                      |   34 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFaultOne.java                                         |  125 
 cnas-server/src/main/java/com/yuanchu/mom/controller/QrShowController.java                                 |   34 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCheckController.java                            |   46 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java                                       |    2 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastService.java                  |   46 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultOneServiceImpl.java                      |   27 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java                                         |    2 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCheckService.java                                  |    7 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanService.java                            |   69 
 cnas-server/src/main/resources/mapper/DeviceMetricRecordMapper.xml                                         |   22 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricRecordServiceImpl.java                  |   20 
 cnas-server/src/main/java/com/yuanchu/mom/dto/OperationInstructionDto.java                                 |   35 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordServiceImpl.java              |  223 
 cnas-server/src/main/java/com/yuanchu/mom/service/impl/ReservationServiceImpl.java                         |  122 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceAccidentReportDto.java                                 |   31 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBorrow.java                                           |  159 
 cnas-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml                                       |   50 
 cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDto.java                                    |   33 
 cnas-server/src/main/resources/static/word/device-breakdown-maintenance.docx                               |    0 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAcceptanceController.java                       |  142 
 cnas-server/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml                                 |   17 
 cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExternalApplyController.java                    |   88 
 cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBorrowService.java                                 |   27 
 cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanMapper.java                          |   34 
 292 files changed, 13,830 insertions(+), 6 deletions(-)

diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAcceptanceController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAcceptanceController.java
new file mode 100644
index 0000000..a7b3ab9
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAcceptanceController.java
@@ -0,0 +1,142 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.pojo.DeviceAcceptance;
+import com.yuanchu.mom.pojo.DeviceAcceptanceFile;
+import com.yuanchu.mom.service.DeviceAcceptanceFileService;
+import com.yuanchu.mom.service.DeviceAcceptanceService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Api(tags = "璁惧楠屾敹(瑁呭)")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAcceptance")
+public class DeviceAcceptanceController {
+
+    private DeviceAcceptanceService deviceAcceptanceService;
+    private DeviceAcceptanceFileService deviceAcceptanceFileService;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹鍒楄〃")
+    @PostMapping("/pageDeviceAcceptance")
+    public Result<IPage<DeviceAcceptance>> pageDeviceAcceptance(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceAcceptance deviceAcceptance = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceAcceptance.class);
+        return Result.success(deviceAcceptanceService.pageDeviceAcceptance(page, deviceAcceptance));
+    }
+
+    /**
+     * 鏌ヨ璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧楠屾敹")
+    @GetMapping("/getDeviceAcceptance")
+    public Result getDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.getById(acceptanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧楠屾敹")
+    @GetMapping("/delDeviceAcceptance")
+    public Result delDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧楠屾敹")
+    @PostMapping("/addDeviceAcceptance")
+    public Result addDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.save(deviceAcceptance));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "缂栬緫璁惧楠屾敹")
+    @PostMapping("/updateDeviceAcceptance")
+    public Result updateDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.updateById(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧楠屾敹瀵煎嚭")
+    @GetMapping("/exportDeviceAcceptance")
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response){
+        deviceAcceptanceService.exportDeviceAcceptance(acceptanceId, response);
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鏂板
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鏂板")
+    @PostMapping("/uploadDeviceAcceptanceFile")
+    public Result<?> uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        return Result.success(deviceAcceptanceService.uploadDeviceAcceptanceFile(acceptanceId, file));
+    }
+
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒楄〃
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒楄〃")
+    @GetMapping("/getDeviceAcceptanceFileList")
+    public Result<List<DeviceAcceptanceFile>> getVerifyMethodFileList(Integer acceptanceId){
+        return Result.success(deviceAcceptanceFileService.list(Wrappers.<DeviceAcceptanceFile>lambdaQuery()
+                .eq(DeviceAcceptanceFile::getAcceptanceId, acceptanceId)));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒犻櫎
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒犻櫎")
+    @GetMapping("/delDeviceAcceptanceFileList")
+    public Result delDeviceAcceptanceFileList(Integer acceptanceFileId){
+        return Result.success(deviceAcceptanceFileService.removeById(acceptanceFileId));
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAccidentReportController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAccidentReportController.java
new file mode 100644
index 0000000..7345adf
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceAccidentReportController.java
@@ -0,0 +1,88 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.DeviceAccidentReport;
+import com.yuanchu.mom.service.DeviceAccidentReportService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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;
+
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧浜嬫晠鎶ュ憡鍒楄〃")
+    @PostMapping("/pageDeviceAccidentReport")
+    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceAccidentReport deviceAccidentReport = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceAccidentReport.class);
+        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 = "鍒犻櫎璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/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-server/src/main/java/com/yuanchu/mom/controller/DeviceBorrowController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBorrowController.java
new file mode 100644
index 0000000..8e3bfa3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBorrowController.java
@@ -0,0 +1,76 @@
+package com.yuanchu.mom.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.DeviceBorrow;
+import com.yuanchu.mom.service.DeviceBorrowService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@RestController
+@RequestMapping("/deviceBorrow")
+public class DeviceBorrowController {
+
+    @Resource
+    private DeviceBorrowService deviceBorrowService;
+
+
+    //鍒嗛〉
+    @PostMapping("/deviceBorrowPage")
+    public Result deviceBorrowPage(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceBorrow deviceBorrow = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceBorrow.class);
+        return Result.success(deviceBorrowService.deviceBorrowPage(page, deviceBorrow));
+    }
+
+    //鏌ヨ
+    @GetMapping("/getDeviceBorrow")
+    public Result getDeviceBorrow(Integer id) {
+        return Result.success(deviceBorrowService.getDeviceBorrow(id));
+    }
+
+    //鏂板
+    @PostMapping("/saveDeviceBorrow")
+    public Result saveDeviceBorrow(@RequestBody DeviceBorrow deviceBorrow) {
+        return Result.success(deviceBorrowService.saveDeviceBorrow(deviceBorrow));
+    }
+
+    //鍒犻櫎
+    @PostMapping("/deleteDeviceBorrow")
+    public Result deleteDeviceBorrow(Integer id) {
+        return Result.success(deviceBorrowService.removeById(id));
+    }
+
+    //瀵煎嚭
+    @PostMapping("/deviceBorrowExport")
+    public Result deviceBorrowExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+        List<DeviceBorrow> deviceBorrows = deviceBorrowService.getDeviceBorrowBydeviceId(deviceId);
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceBorrow.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(deviceBorrows);
+        return Result.success();
+    }
+
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBreakdownMaintenanceController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBreakdownMaintenanceController.java
new file mode 100644
index 0000000..57bb78b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceBreakdownMaintenanceController.java
@@ -0,0 +1,89 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.DeviceBreakdownMaintenance;
+import com.yuanchu.mom.service.DeviceBreakdownMaintenanceService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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;
+
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏁呴殰缁翠慨鍒楄〃")
+    @PostMapping("/pageDeviceBreakdownMaintenance")
+    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceBreakdownMaintenance deviceBreakdownMaintenance = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceBreakdownMaintenance.class);
+        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 = "鍒犻櫎璁惧鏁呴殰缁翠慨")
+    @GetMapping("/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-server/src/main/java/com/yuanchu/mom/controller/DeviceCalibrationPlanController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCalibrationPlanController.java
new file mode 100644
index 0000000..8460bfa
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCalibrationPlanController.java
@@ -0,0 +1,163 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.DeviceCalibrationPlanDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlan;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import com.yuanchu.mom.service.DeviceCalibrationPlanDetailService;
+import com.yuanchu.mom.service.DeviceCalibrationPlanService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Api(tags = "璁惧鏍″噯璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceCalibrationPlan")
+public class DeviceCalibrationPlanController {
+
+    private DeviceCalibrationPlanService deviceCalibrationPlanService;
+
+    private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "鏂板璁惧鏍″噯璁″垝")
+    @PostMapping("/addDeviceCalibrationPlan")
+    public Result addDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto){
+        return Result.success(deviceCalibrationPlanService.addDeviceCalibrationPlan(calibrationPlanDto));
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍″噯璁″垝
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎叆璁惧鏍″噯璁″垝")
+    @PostMapping("/importDeviceCalibrationPlan")
+    public Result importDeviceCalibrationPlan(MultipartFile file, String planYear){
+        return Result.success(deviceCalibrationPlanService.importDeviceCalibrationPlan(file, planYear));
+    }
+
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒犻櫎
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧鏍″噯璁″垝鍒犻櫎")
+    @GetMapping("/delQualitySupervise")
+    public Result delQualitySupervise(Integer planId){
+        return Result.success(deviceCalibrationPlanService.removeById(planId));
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @return
+     */
+    @ValueClassify("璐ㄩ噺璁惧鏍″噯璁″垝")
+    @ApiOperation(value = "璁惧鏍″噯璁″垝鎵瑰噯")
+    @PostMapping("/ratifyDeviceCalibrationPlan")
+    public Result ratifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
+        return Result.success(deviceCalibrationPlanService.ratifyDeviceCalibrationPlan(DeviceCalibrationPlan));
+    }
+
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒楄〃
+     * @param data
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧鏍″噯璁″垝鍒楄〃")
+    @PostMapping("/pageDeviceCalibrationPlan")
+    public Result<IPage<DeviceCalibrationPlanDto>> pageDeviceCalibrationPlan(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceCalibrationPlan DeviceCalibrationPlan = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceCalibrationPlan.class);
+        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlan(page, DeviceCalibrationPlan));
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+     * @param data
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "璁惧鏍″噯璁″垝璇︽儏鍒楄〃")
+    @PostMapping("/pageDeviceCalibrationPlanDetail")
+    public Result<IPage<DeviceCalibrationPlanDetail>> pageDeviceCalibrationPlanDetail(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceCalibrationPlanDetail deviceCalibrationPlanDetails = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceCalibrationPlanDetail.class);
+        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlanDetail(page, deviceCalibrationPlanDetails));
+    }
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "鏂板璁惧鏍″噯璁″垝璇︽儏")
+    @PostMapping("/addDeviceCalibrationPlanDetail")
+    public Result addDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+        if (deviceCalibrationPlanDetail.getPlanId() == null) {
+            throw new ErrorException("缂哄皯璁惧鏍″噯璁″垝涓昏〃id");
+        }
+        return Result.success(deviceCalibrationPlanDetailService.save(deviceCalibrationPlanDetail));
+    }
+
+    /**
+     * 淇敼璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "淇敼璁惧鏍″噯璁″垝璇︽儏")
+    @PostMapping("/updateDeviceCalibrationPlanDetail")
+    public Result updateDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+        return Result.success(deviceCalibrationPlanDetailService.updateById(deviceCalibrationPlanDetail));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "鍒犻櫎璁惧鏍″噯璁″垝璇︽儏")
+    @GetMapping("/delDeviceCalibrationPlanDetail")
+    public Result delDeviceCalibrationPlanDetail(Integer planDetailsId){
+        return Result.success(deviceCalibrationPlanDetailService.removeById(planDetailsId));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍″噯璁″垝
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭璁惧鏍″噯璁″垝")
+    @GetMapping("/exportDeviceCalibrationPlanDetail")
+    public void exportDeviceCalibrationPlanDetail(Integer planId, HttpServletResponse response){
+        deviceCalibrationPlanService.exportDeviceCalibrationPlanDetail(planId, response);
+    }
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCheckController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCheckController.java
new file mode 100644
index 0000000..cf14c10
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceCheckController.java
@@ -0,0 +1,46 @@
+package com.yuanchu.mom.controller;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yuanchu.mom.pojo.DeviceCheck;
+import com.yuanchu.mom.service.DeviceCheckService;
+import com.yuanchu.mom.vo.Result;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/device-check")
+public class DeviceCheckController {
+    @Autowired
+    private DeviceCheckService deviceCheckService;
+
+    @PostMapping(consumes= MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    public Result create(DeviceCheck deviceCheck) {
+        return Result.success(deviceCheckService.save(deviceCheck));
+    }
+
+    @GetMapping("/{id}")
+    public Result read(@PathVariable Integer id) {
+        LambdaQueryWrapper<DeviceCheck> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(DeviceCheck::getDeviceId,id);
+        return Result.success(deviceCheckService.list(lambdaQueryWrapper));
+    }
+
+    @PutMapping("/{id}")
+    public Result update(@PathVariable Integer id, @RequestBody DeviceCheck deviceCheck) {
+        deviceCheck.setDeviceId(id);
+        deviceCheckService.updateById(deviceCheck);
+        return Result.success();
+    }
+
+    @DeleteMapping("/{id}")
+    public Result delete(@PathVariable Integer id) {
+        return   Result.success(deviceCheckService.removeById(id));
+    }
+
+    @GetMapping
+    public Result list() {
+        return Result.success(deviceCheckService.list());
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java
index 4754723..c1df04d 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceController.java
@@ -59,10 +59,10 @@
     @ValueClassify("璁惧")
     @ApiOperation(value = "鏌ヨ璁惧璇︽儏鍒楄〃")
     @PostMapping("/selectDeviceParameter")
-    public Result selectDeviceParameter(@RequestBody Map<String, Object> data) throws Exception {
+    public Result selectDeviceParameter(@RequestBody Map<String, Object> data,@RequestParam(value = "laboratoryNameIsNull", required = false) Boolean laboratoryNameIsNull) throws Exception {
         Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
         DeviceDto itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceDto.class);
-        return Result.success(deviceService.selectDeviceParameter(page, itemParameter));
+        return Result.success(deviceService.selectDeviceParameter(page, itemParameter,laboratoryNameIsNull));
     }
 
     @ValueClassify("璁惧")
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExaminePlanController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExaminePlanController.java
new file mode 100644
index 0000000..cea4d7e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExaminePlanController.java
@@ -0,0 +1,255 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.DeviceExaminePlanDto;
+import com.yuanchu.mom.dto.DeviceExamineRecordContrastDto;
+import com.yuanchu.mom.dto.DeviceExamineRecordDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.pojo.DeviceExaminePlan;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import com.yuanchu.mom.service.DeviceExaminePlanDetailsService;
+import com.yuanchu.mom.service.DeviceExaminePlanService;
+import com.yuanchu.mom.service.DeviceExamineRecordContrastService;
+import com.yuanchu.mom.service.DeviceExamineRecordService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+@Api(tags = "璁惧鏍告煡璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceExaminePlan")
+public class DeviceExaminePlanController {
+
+    private DeviceExaminePlanService deviceExaminePlanService;
+
+    private DeviceExaminePlanDetailsService deviceExaminePlanDetailsService;
+
+    private DeviceExamineRecordService deviceExamineRecordService;
+
+    private DeviceExamineRecordContrastService deviceExamineRecordContrastService;
+
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鏍告煡璁″垝")
+    @PostMapping("/addDeviceExaminePlan")
+    public Result addDeviceExaminePlan(@RequestBody DeviceExaminePlanDto examinePlanDto){
+        return Result.success(deviceExaminePlanService.addDeviceExaminePlan(examinePlanDto));
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍告煡璁″垝
+     * @return
+     */
+    @ApiOperation(value = "瀵煎叆璁惧鏍告煡璁″垝")
+    @PostMapping("/importDeviceExaminePlan")
+    public Result importDeviceExaminePlan(MultipartFile file){
+        return Result.success(deviceExaminePlanService.importDeviceExaminePlan(file));
+    }
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍告煡璁″垝鍒犻櫎")
+    @GetMapping("/delQualitySupervise")
+    public Result delQualitySupervise(Integer planId){
+        return Result.success(deviceExaminePlanService.removeById(planId));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @return
+     */
+    @ValueClassify("璐ㄩ噺璁惧鏍告煡璁″垝")
+    @ApiOperation(value = "璁惧鏍告煡璁″垝鎵瑰噯")
+    @PostMapping("/ratifyDeviceExaminePlan")
+    public Result ratifyDeviceExaminePlan(@RequestBody DeviceExaminePlan DeviceExaminePlan){
+        return Result.success(deviceExaminePlanService.ratifyDeviceExaminePlan(DeviceExaminePlan));
+    }
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍告煡璁″垝鍒楄〃")
+    @PostMapping("/pageDeviceExaminePlan")
+    public Result<IPage<DeviceExaminePlanDto>> pageDeviceExaminePlan(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceExaminePlan DeviceExaminePlan = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceExaminePlan.class);
+        return Result.success(deviceExaminePlanService.pageDeviceExaminePlan(page, DeviceExaminePlan));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍告煡璁″垝璇︽儏鍒楄〃")
+    @PostMapping("/pageDeviceExaminePlanDetail")
+    public Result<IPage<DeviceExaminePlanDetails>> pageDeviceExaminePlanDetail(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceExaminePlanDetails deviceExaminePlanDetails = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceExaminePlanDetails.class);
+        return Result.success(deviceExaminePlanService.pageDeviceExaminePlanDetail(page, deviceExaminePlanDetails));
+    }
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鏍告煡璁″垝璇︽儏")
+    @PostMapping("/addDeviceExaminePlanDetail")
+    public Result addDeviceExaminePlanDetail(@RequestBody DeviceExaminePlanDetails deviceExaminePlanDetail){
+        if (deviceExaminePlanDetail.getPlanId() == null) {
+            throw new ErrorException("缂哄皯璁惧鏍告煡璁″垝涓昏〃id");
+        }
+        return Result.success(deviceExaminePlanDetailsService.save(deviceExaminePlanDetail));
+    }
+
+    /**
+     * 淇敼璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @ApiOperation(value = "淇敼璁惧鏍告煡璁″垝璇︽儏")
+    @PostMapping("/updateDeviceExaminePlanDetail")
+    public Result updateDeviceExaminePlanDetail(@RequestBody DeviceExaminePlanDetails deviceExaminePlanDetail){
+        return Result.success(deviceExaminePlanDetailsService.updateById(deviceExaminePlanDetail));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧鏍告煡璁″垝璇︽儏")
+    @GetMapping("/delDeviceExaminePlanDetail")
+    public Result delDeviceExaminePlanDetail(Integer planDetailsId){
+        return Result.success(deviceExaminePlanDetailsService.removeById(planDetailsId));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param planId 璁惧鏍告煡璁″垝id
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭璁惧鏍告煡璁″垝")
+    @GetMapping("/exportDeviceExaminePlanDetail")
+    public void exportDeviceExaminePlanDetail(Integer planId, HttpServletResponse response){
+        deviceExaminePlanService.exportDeviceExaminePlanDetail(planId, response);
+    }
+
+    /*********************************************** 鎶ュ憡 **************************************************/
+
+    /**
+     * 鏌ヨ鏍告煡璁板綍
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ鏍告煡璁板綍")
+    @GetMapping("/getExamineRecord")
+    public Result<DeviceExamineRecordDto> getExamineRecord(Integer planDetailsId){
+        return Result.success(deviceExamineRecordService.getExamineRecord(planDetailsId));
+    }
+
+    /**
+     * 鏂板鏍告煡璁板綍
+     * @return
+     */
+    @ApiOperation(value = "鏂板鏍告煡璁板綍")
+    @PostMapping("/addExamineRecord")
+    public Result addExamineRecord(@RequestBody DeviceExamineRecordDto deviceExamineRecordDto){
+        return Result.success(deviceExamineRecordService.addExamineRecord(deviceExamineRecordDto));
+    }
+
+
+    /**
+     * 澶嶆牳鏍告煡璁板綍
+     * @return
+     */
+    @ApiOperation(value = "澶嶆牳鏍告煡璁板綍")
+    @PostMapping("/reviewExamineRecord")
+    public Result reviewExamineRecord(@RequestBody DeviceExamineRecordDto deviceExamineRecordDto){
+        return Result.success(deviceExamineRecordService.reviewExamineRecord(deviceExamineRecordDto));
+    }
+
+    /**
+     * 瀵煎嚭澶嶆牳鏍告煡璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭澶嶆牳鏍告煡璁板綍")
+    @GetMapping("/exportReviewExamineRecordDetail")
+    public void exportReviewExamineRecordDetail(Integer planDetailsId, HttpServletResponse response){
+        deviceExamineRecordService.exportReviewExamineRecordDetail(planDetailsId, response);
+    }
+
+    /*********************************************** 鎶ュ憡瀵规瘮 **************************************************/
+
+
+    /**
+     * 鏌ヨ鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ鏍告煡瀵规瘮璁板綍")
+    @GetMapping("/getExamineRecordContrast")
+    public Result<DeviceExamineRecordContrastDto> getExamineRecordContrast(Integer planDetailsId){
+        return Result.success(deviceExamineRecordContrastService.getExamineRecordContrast(planDetailsId));
+    }
+
+    /**
+     * 鏂板鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @ApiOperation(value = "鏂板鏍告煡瀵规瘮璁板綍")
+    @PostMapping("/addExamineRecordContrast")
+    public Result addExamineRecordContrast(@RequestBody DeviceExamineRecordContrastDto deviceExamineRecordContrastDto){
+        return Result.success(deviceExamineRecordContrastService.addExamineRecordContrast(deviceExamineRecordContrastDto));
+    }
+
+
+    /**
+     * 瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @ApiOperation(value = "瀹℃牳鏍告煡瀵规瘮璁板綍")
+    @PostMapping("/reviewExamineRecordContrast")
+    public Result reviewExamineRecordContrast(@RequestBody DeviceExamineRecordContrastDto deviceExamineRecordContrastDto){
+        return Result.success(deviceExamineRecordContrastService.reviewExamineRecordContrast(deviceExamineRecordContrastDto));
+    }
+
+    /**
+     * 瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍")
+    @GetMapping("/exportReviewExamineRecordContrast")
+    public Result exportReviewExamineRecordContrast(Integer planDetailsId, HttpServletResponse response){
+        deviceExamineRecordContrastService.exportReviewExamineRecordContrast(planDetailsId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExternalApplyController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExternalApplyController.java
new file mode 100644
index 0000000..edd9e06
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceExternalApplyController.java
@@ -0,0 +1,88 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.DeviceExternalApply;
+import com.yuanchu.mom.service.DeviceExternalApplyService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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 10:28:43
+ */
+@Api(tags = "鍒╃敤澶栭儴璁惧鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceExternalApply")
+public class DeviceExternalApplyController {
+
+    private DeviceExternalApplyService deviceExternalApplyService;
+
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "鍒╃敤澶栭儴璁惧鐢宠鍒楄〃")
+    @PostMapping("/pageDeviceExternalApply")
+    public Result<IPage<DeviceExternalApply>> pageDeviceExternalApply(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceExternalApply deviceExternalApply = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceExternalApply.class);
+        return Result.success(deviceExternalApplyService.pageDeviceExternalApply(page, deviceExternalApply));
+    }
+
+    /**
+     * 鏌ヨ鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ鍒╃敤澶栭儴璁惧鐢宠")
+    @GetMapping("/getDeviceExternalApply")
+    public Result getDeviceExternalApply(Integer externalApplyId){
+        return Result.success(deviceExternalApplyService.getById(externalApplyId));
+    }
+
+    /**
+     * 鍒犻櫎鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎鍒╃敤澶栭儴璁惧鐢宠")
+    @GetMapping("/delDeviceExternalApply")
+    public Result delDeviceExternalApply(Integer externalApplyId){
+        return Result.success(deviceExternalApplyService.removeById(externalApplyId));
+    }
+
+    /**
+     * 鏂板鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏂板鍒╃敤澶栭儴璁惧鐢宠")
+    @PostMapping("/addDeviceExternalApply")
+    public Result addDeviceExternalApply(@RequestBody DeviceExternalApply deviceExternalApply){
+        return Result.success(deviceExternalApplyService.addDeviceExternalApply(deviceExternalApply));
+    }
+
+    /**
+     * 瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠
+     * @param externalApplyId 澶栭儴璁惧鐢宠id
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠")
+    @GetMapping("/exportDeviceExternalApply")
+    public Result exportDeviceExternalApply(Integer externalApplyId, HttpServletResponse response){
+        deviceExternalApplyService.exportDeviceExternalApply(externalApplyId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultController.java
new file mode 100644
index 0000000..c9b664a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultController.java
@@ -0,0 +1,50 @@
+package com.yuanchu.mom.controller;
+
+import com.yuanchu.mom.pojo.DeviceFault;
+import com.yuanchu.mom.service.DeviceFaultService;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/device-faults")
+public class DeviceFaultController {
+
+    private final DeviceFaultService deviceFaultService;
+
+    @Autowired
+    public DeviceFaultController(DeviceFaultService deviceFaultService) {
+        this.deviceFaultService = deviceFaultService;
+    }
+
+    @GetMapping
+    public List<DeviceFault> getAllDeviceFaults() {
+        return deviceFaultService.list();
+    }
+
+    @PostMapping
+    public DeviceFault createDeviceFault(@RequestBody DeviceFault deviceFault) {
+        deviceFaultService.save(deviceFault);
+        return deviceFault;
+    }
+
+    @PutMapping("/{id}")
+    public DeviceFault updateDeviceFault(@PathVariable Integer id, @RequestBody DeviceFault deviceFault) {
+        deviceFault.setId(id);
+        deviceFaultService.updateById(deviceFault);
+        return deviceFault;
+    }
+
+    @DeleteMapping("/{id}")
+    public void deleteDeviceFault(@PathVariable Integer id) {
+        deviceFaultService.removeById(id);
+    }
+
+    @GetMapping("/device/{deviceId}")
+    public Result<Map<String,Object>> getDeviceFaultsByDeviceId(@PathVariable Integer deviceId) {
+       return  Result.success(deviceFaultService.findByDeviceId(deviceId));
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultOneController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultOneController.java
new file mode 100644
index 0000000..e0521aa
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceFaultOneController.java
@@ -0,0 +1,82 @@
+package com.yuanchu.mom.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceFaultOneDto;
+import com.yuanchu.mom.excel.DeviceFaultOneExport;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceFaultOne;
+import com.yuanchu.mom.service.DeviceFaultOneService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+@RestController
+@RequestMapping("/deviceFaultOne")
+public class DeviceFaultOneController {
+
+    @Autowired
+    private DeviceFaultOneService deviceFaultOneService;
+
+    @Autowired
+    private NumberGenerator<DeviceFaultOne> numberGenerator;
+
+    @GetMapping("/deviceFaultOnePage")
+    public Result deviceFaultOnePage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber) {
+        return Result.success(deviceFaultOneService.deviceFaultOnePage(deviceId,page, processNumber));
+    }
+
+    @PostMapping("/addOrUpdateDeviceFaultOne")
+    public Result addOrUpdateDeviceFaultOne(@RequestBody DeviceFaultOne deviceFaultOne) {
+        if (ObjectUtils.isEmpty(deviceFaultOne.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceFaultOne::getProcessNumber);
+            deviceFaultOne.setProcessNumber(processNumber);
+        }
+        return Result.success(deviceFaultOneService.saveOrUpdate(deviceFaultOne));
+    }
+
+    @DeleteMapping("/deleteDeviceFaultOne")
+    public Result deleteDeviceFaultOne(@RequestParam("id") Integer id) {
+        return Result.success(deviceFaultOneService.removeById(id));
+    }
+
+    @ApiOperation(value = "濂栨儵璁板綍瀵煎嚭")
+    @PostMapping("exportRewardAndPunishmentRecords")
+    public void exportRewardAndPunishmentRecords(@RequestParam("deviceId") Integer deviceId, String processNumber,
+                                       HttpServletResponse response) throws Exception {
+        IPage<DeviceFaultOneDto> data = deviceFaultOneService.deviceFaultOnePage(deviceId, new Page<>(1, -1), processNumber);
+        List<DeviceFaultOneExport> studentList  = JSONObject.parseArray(JSON.toJSONString(data.getRecords()), DeviceFaultOneExport.class);
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceFaultOneExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(studentList);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceInspectionRecordController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceInspectionRecordController.java
new file mode 100644
index 0000000..8def047
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceInspectionRecordController.java
@@ -0,0 +1,104 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceInspectionRecordDto;
+import com.yuanchu.mom.pojo.DeviceInspectionRecord;
+import com.yuanchu.mom.service.DeviceInspectionRecordService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param data 鍒嗛〉鍙傛暟
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ璁惧鐐规璁板綍")
+    @PostMapping("/getDeviceInspectionRecordByPage")
+    @SneakyThrows
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(@RequestBody Map<String, Object> data) {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceInspectionRecordDto itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceInspectionRecordDto.class);
+        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("鍒犻櫎璁惧鐐规璁板綍")
+    @GetMapping("/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-server/src/main/java/com/yuanchu/mom/controller/DeviceLeaseController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLeaseController.java
new file mode 100644
index 0000000..ccd1492
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLeaseController.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yuanchu.mom.pojo.DeviceLease;
+import com.yuanchu.mom.service.IDeviceLeaseService;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/deviceleases")
+public class DeviceLeaseController {
+
+    @Autowired
+    private IDeviceLeaseService deviceLeaseService;
+
+    @PostMapping("")
+    public Result create( DeviceLease deviceLease) {
+        deviceLeaseService.save(deviceLease);
+        return Result.success();
+    }
+
+//    @GetMapping("/{leaseId}")
+//    public DeviceLease get(@PathVariable Integer leaseId) {
+//        return deviceLeaseService.getById(leaseId);
+//    }
+    @GetMapping("/list/{id}")
+    public Result get(@PathVariable Integer id) {
+        LambdaQueryWrapper<DeviceLease> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(DeviceLease::getDeviceId,id);
+        return Result.success(deviceLeaseService.list(lambdaQueryWrapper));
+    }
+
+    @PutMapping("/{leaseId}")
+    public boolean update(@PathVariable Integer leaseId, @RequestBody DeviceLease deviceLease) {
+        deviceLease.setLeaseId(leaseId);
+        return deviceLeaseService.updateById(deviceLease);
+    }
+
+    @DeleteMapping("/{leaseId}")
+    public boolean delete(@PathVariable Integer leaseId) {
+        return deviceLeaseService.removeById(leaseId);
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLogController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLogController.java
new file mode 100644
index 0000000..bdc0c15
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceLogController.java
@@ -0,0 +1,50 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yuanchu.mom.pojo.DeviceLog;
+import com.yuanchu.mom.service.IDeviceLogService;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/device-log") // 鏇存柊璺緞
+//杩欓噷鐨勬帴鍙e叏閮ㄦ槸鍦ㄨ澶囨牎鍑嗙殑鍦版柟鐢ㄥ埌,浣嗘槸鍏朵粬鍦版柟浼氬彟澶栧啓
+public class DeviceLogController {
+
+    @Autowired
+    private IDeviceLogService deviceLogService; // 鏇存柊Service寮曠敤
+
+    @GetMapping
+    public List<DeviceLog> getAllDeviceLogs() { // 鏇存柊鏂规硶鍚�
+        return deviceLogService.list();
+    }
+    @GetMapping("/{id}")
+    public Result getAllDeviceLogsBydId(@PathVariable int id) { // 鏇存柊鏂规硶鍚�
+        LambdaQueryWrapper<DeviceLog> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(DeviceLog::getDeviceId,id);
+        lambdaQueryWrapper.eq(DeviceLog::getRelevanceForm,"device_maintenance");
+        return Result.success(deviceLogService.list(lambdaQueryWrapper));
+    }
+    @PostMapping
+    public Result createDeviceLog(DeviceLog deviceLog) { // 鏇存柊鏂规硶鍚�
+        deviceLog.setRelevanceForm("device_maintenance");//鍏宠仈璁惧鏍″噯
+        deviceLogService.save(deviceLog);
+        return Result.success();
+    }
+
+    @PutMapping("/{id}")
+    public DeviceLog updateDeviceLog(@PathVariable Integer id, @RequestBody DeviceLog deviceLog) { // 鏇存柊鏂规硶鍚�
+        deviceLog.setId(id);
+        deviceLogService.updateById(deviceLog);
+        return deviceLog;
+    }
+
+    @DeleteMapping("/{id}")
+    public Result deleteDeviceLog(@PathVariable Integer id) { // 鏇存柊鏂规硶鍚�
+        deviceLogService.removeById(id);
+        return Result.success();
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenanceController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenanceController.java
new file mode 100644
index 0000000..4fe3184
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenanceController.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.excel.DeviceMaintenanceExport;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceMaintenance;
+import com.yuanchu.mom.service.DeviceMaintenanceService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+@RestController
+@RequestMapping("/device-maintain")
+public class DeviceMaintenanceController {
+
+    @Autowired
+    private DeviceMaintenanceService deviceMaintenanceService;
+
+    @Autowired
+    private NumberGenerator<DeviceMaintenance> numberGenerator;
+    //澧�
+    @PostMapping()
+    public Result create(DeviceMaintenance deviceMaintenance){
+        String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+        String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+        String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceMaintenance::getDeviceNumber);
+        deviceMaintenance.setDeviceNumber(processNumber);
+        return Result.success(deviceMaintenanceService.save(deviceMaintenance));
+    }
+
+    //閫氳繃deviceId鏌ヨ缁存姢鏁版嵁
+    @GetMapping("/getDeviceMaintenancePage")
+    public Result getDeviceMaintenancePage(@RequestParam("deviceId") Integer deviceId, Page page, String deviceNumber){
+        return Result.success(deviceMaintenanceService.getDeviceMaintenancePage(page, deviceId, deviceNumber));
+    }
+
+    //鍒�
+    @DeleteMapping("/delete/{id}")
+    public void deleteDeviceFault(@PathVariable Integer id) {
+        deviceMaintenanceService.removeById(id);
+    }
+
+    @GetMapping("/deviceMaintenanceExport")
+    public Result deviceMaintenanceExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
+        List<DeviceMaintenanceExport> list = deviceMaintenanceService.deviceMaintenanceExport(deviceId);
+        response.setHeader("requestType","excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceMaintenanceExport.class)
+                .registerWriteHandler(getHorizontalCellStyleStrategy((short) 12))
+                .sheet()
+                .doWrite(list);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "璁惧缁存姢璁板綍瀵煎嚭")
+    @GetMapping("/exportMaintenanceRecord")
+    @ValueAuth
+    public void exportMaintenanceRecord(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+        deviceMaintenanceService.exportMaintenanceRecord(deviceId, response);
+    }
+
+    /**
+     * 鍗曞厓鏍兼牱寮忕瓥鐣�
+     */
+    public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy(Short fontHeightInPoints) {
+        // 鍐呭鐨勭瓥鐣�
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+
+        // 銆愭按骞冲眳涓渶瑕佷娇鐢ㄤ互涓嬩袱琛屻��
+        // 璁剧疆鏂囧瓧宸﹀彸灞呬腑
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 璁剧疆鏂囧瓧涓婁笅灞呬腑
+        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆 鑷姩鎹㈣
+        contentWriteCellStyle.setWrapped(true);
+
+        // 鏍峰紡绛栫暐
+        return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenancePlanController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenancePlanController.java
new file mode 100644
index 0000000..6122748
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMaintenancePlanController.java
@@ -0,0 +1,104 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceMaintenancePlanDto;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlan;
+import com.yuanchu.mom.service.DeviceMaintenancePlanService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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 06:10:52
+ */
+@Api(tags = "璁惧淇濆吇璁″垝")
+@RestController
+@RequestMapping("/deviceMaintenancePlan")
+public class DeviceMaintenancePlanController {
+    @Resource
+    private DeviceMaintenancePlanService deviceMaintenancePlanService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     * @param data 鍒嗛〉鍙傛暟
+     * @return
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝")
+    @PostMapping("selectDeviceMaintenancePlanByPage")
+    @SneakyThrows
+    public Result<IPage<DeviceMaintenancePlan>> selectDeviceMaintenancePlanByPage(@RequestBody Map<String, Object> data){
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceMaintenancePlanDto itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceMaintenancePlanDto.class);
+        return deviceMaintenancePlanService.selectDeviceMaintenancePlanByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏂板璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @ApiOperation("鏂板璁惧淇濆吇璁″垝")
+    @PostMapping("/addMaintenancePlan")
+    public Result addMaintenancePlan(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.addMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 淇敼璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @ApiOperation("淇敼璁惧淇濆吇璁″垝")
+    @PostMapping("/updateMaintenancePlan")
+    public Result updateMaintenancePlan(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.updateMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 鍒犻櫎璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @ApiOperation("鍒犻櫎璁惧淇濆吇璁″垝")
+    @GetMapping("/deleteMaintenancePlan")
+    public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+     */
+    @ApiOperation("鏌ヨ璁惧淇濆吇璁″垝璇︽儏")
+    @GetMapping("/getMaintenancePlanDetail")
+    public Result<DeviceMaintenancePlanDto> getMaintenancePlanDetail(Integer maintenancePlanId) {
+        return deviceMaintenancePlanService.getMaintenancePlanDetail(maintenancePlanId);
+    }
+
+    /**
+     * 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+     */
+    @ApiOperation("淇濆吇璁″垝瀹℃牳鐘舵�佷慨鏀�")
+    @PostMapping("/reviewMaintenancePlanStatus")
+    public Result reviewMaintenancePlanStatus(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.reviewMaintenancePlanStatus(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 瀵煎嚭璁惧淇濆吇璁″垝
+     */
+    @ApiOperation("瀵煎嚭璁惧淇濆吇璁″垝")
+    @GetMapping("/exportDeviceMaintenancePlan")
+    public Result exportDeviceMaintenancePlan(@RequestParam("maintenancePlanId") Integer maintenancePlanId, HttpServletResponse response) {
+        return deviceMaintenancePlanService.exportDeviceMaintenancePlanDto(maintenancePlanId, response);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricController.java
new file mode 100644
index 0000000..c67c1d3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricController.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yuanchu.mom.pojo.DeviceMetric;
+import com.yuanchu.mom.service.IDeviceMetricService;
+import com.yuanchu.mom.vo.Result;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/deviceMetrics")
+public class DeviceMetricController {
+
+    @Autowired
+    private IDeviceMetricService deviceMetricService;
+
+    @PostMapping("/saveOrUpdateDeviceMetric")
+    public Result create(@RequestBody DeviceMetric deviceMetric) {
+        return Result.success(deviceMetricService.saveOrUpdate(deviceMetric));
+    }
+
+    @GetMapping("/selectDeviceMetric")
+    public Result read(@RequestParam("deviceId") Integer deviceId, @RequestParam("type") String type) {
+        return Result.success(deviceMetricService.list(Wrappers.<DeviceMetric>lambdaQuery()
+                .eq(DeviceMetric::getDeviceId,deviceId)
+                .eq(DeviceMetric::getType,type)));
+    }
+
+    @DeleteMapping("/deleteDeviceMetrics")
+    public Result delete(@RequestParam("id") Integer id) {
+      return   Result.success(deviceMetricService.removeById(id));
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricRecordController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricRecordController.java
new file mode 100644
index 0000000..9bfd1fd
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceMetricRecordController.java
@@ -0,0 +1,89 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceMetricRecordDto;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+import com.yuanchu.mom.pojo.DeviceMetricsCopy;
+import com.yuanchu.mom.service.DeviceMetricRecordService;
+import com.yuanchu.mom.service.DeviceMetricsCopyService;
+import com.yuanchu.mom.utils.FileSaveUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Api(tags = "璁惧 - 璁惧鏍″噯")
+@RestController
+@RequestMapping("/deviceMetricRecord")
+public class DeviceMetricRecordController {
+
+    @Autowired
+    private DeviceMetricRecordService deviceMetricRecordService;
+
+    @Autowired
+    private DeviceMetricsCopyService deviceMetricsCopyService;
+
+    @Autowired
+    private NumberGenerator<DeviceMetricRecord> numberGenerator;
+
+    @ApiOperation("璁惧鏍″噯鍒嗛〉鏌ヨ")
+    @GetMapping("/deviceMetricRecordPage")
+    public Result deviceMetricRecordPage(@RequestParam("deviceId") Integer deviceId, Page page, @RequestParam("type") String type) {
+        return Result.success(deviceMetricRecordService.page(page, Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏂板 鏇存柊")
+    @PostMapping("/addOrUpdateDeviceMetricRecord")
+    public Result addOrUpdateDeviceMetricRecord(@RequestBody DeviceMetricRecordDto deviceMetricRecordDto) {
+        if (ObjectUtils.isEmpty(deviceMetricRecordDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(5, "SBJZ" + year + month, DeviceMetricRecord::getProcessNumber);
+            deviceMetricRecordDto.setProcessNumber(processNumber);
+        }
+        deviceMetricRecordService.saveOrUpdate(deviceMetricRecordDto);
+        if (CollectionUtils.isNotEmpty(deviceMetricRecordDto.getDeviceMetricsCopyList())) {
+            deviceMetricRecordDto.getDeviceMetricsCopyList().forEach(i -> i.setDeviceMetricsId(deviceMetricRecordDto.getId()));
+            deviceMetricsCopyService.saveOrUpdateBatch(deviceMetricRecordDto.getDeviceMetricsCopyList());
+        }
+        return Result.success();
+    }
+
+    @ApiOperation("璁惧鏍″噯 鍒犻櫎")
+    @DeleteMapping("/deleteDeviceMetricRecord")
+    public Result deleteDeviceMetricRecord(@RequestParam("id") Integer id) {
+        DeviceMetricRecord deviceMetricRecord = deviceMetricRecordService.getById(id);
+        deviceMetricsCopyService.remove(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id));
+        // 鍒犻櫎鏂囦欢
+        FileSaveUtil.DeleteFile(deviceMetricRecord.getSystemFileName());
+        return Result.success(deviceMetricRecordService.removeById(id));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏍″噯鏉$洰鏌ヨ")
+    @GetMapping("/showDeviceMetricsCopy")
+    public Result showDeviceMetricsCopy(@RequestParam("id") Integer id, @RequestParam("type") String type) {
+        return Result.success(deviceMetricsCopyService.list(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id)
+                .eq(DeviceMetricsCopy::getType, type)));
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceRecordController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceRecordController.java
new file mode 100644
index 0000000..9e35023
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceRecordController.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceRecord;
+import com.yuanchu.mom.service.DeviceRecordService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+@Api(tags = "璁惧浣跨敤璁板綍")
+@RestController
+@RequestMapping("/deviceRecord")
+public class DeviceRecordController {
+    @Autowired
+    private DeviceRecordService deviceRecordService;
+
+    @Autowired
+    private NumberGenerator<DeviceRecord> numberGenerator;
+
+    @ValueClassify("璁惧浣跨敤璁板綍")
+    @ApiOperation(value = "澶囦娇鐢ㄨ褰曟煡璇�")
+    @GetMapping("/deviceRecordPage")
+    public Result deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        return Result.success(deviceRecordService.deviceRecordPage(deviceId, page, sampleCode, managementNumber));
+    }
+
+    @ApiOperation(value = "鏂板")
+    @PostMapping("/saveDeviceRecord")
+    public Result saveDeviceRecords(@RequestBody DeviceRecord deviceRecord) {
+        return Result.success(deviceRecordService.save(deviceRecord));
+    }
+
+    /**
+     * 缂栬緫璁惧浣跨敤璁板綍
+     * @param deviceRecord
+     * @return
+     */
+    @ApiOperation(value = "淇敼")
+    @PostMapping("/updateDeviceRecord")
+    public Result updateDeviceRecord(@RequestBody DeviceRecord deviceRecord) {
+        return Result.success(deviceRecordService.updateById(deviceRecord));
+    }
+
+    @DeleteMapping("/deleteDeviceRecord")
+    public Result deleteDeviceRecords(@RequestParam("id") Integer id) {
+        return Result.success(deviceRecordService.removeById(id));
+    }
+
+    @ApiOperation(value = "璁惧浣跨敤璁板綍瀵煎嚭")
+    @GetMapping("/exportUseRecord")
+    @ValueAuth
+    public void exportUseRecord(Integer deviceId, String exportDate, HttpServletResponse response) throws Exception {
+        deviceRecordService.exportUseRecord(deviceId, exportDate, response);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceScrappedController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceScrappedController.java
new file mode 100644
index 0000000..033d586
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceScrappedController.java
@@ -0,0 +1,86 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.DeviceScrapped;
+import com.yuanchu.mom.service.DeviceScrappedService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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 01:53:47
+ */
+@Api(tags = "璁惧鎶ュ簾鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceScrapped")
+public class DeviceScrappedController {
+
+    private DeviceScrappedService deviceScrappedService;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @param data
+     * @return
+     */
+    @ApiOperation(value = "璁惧鎶ュ簾鐢宠鍒楄〃")
+    @PostMapping("/pageDeviceScrapped")
+    public Result<IPage<DeviceScrapped>> pageDeviceScrapped(@RequestBody Map<String, Object> data) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceScrapped deviceScrapped = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceScrapped.class);
+        return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
+    }
+
+    /**
+     * 鏌ヨ璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧鎶ュ簾鐢宠")
+    @GetMapping("/getDeviceScrapped")
+    public Result getDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.getById(scrappedId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧鎶ュ簾鐢宠")
+    @GetMapping("/delDeviceScrapped")
+    public Result delDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.removeById(scrappedId));
+    }
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鎶ュ簾鐢宠")
+    @PostMapping("/addDeviceScrapped")
+    public Result addDeviceScrapped(@RequestBody DeviceScrapped deviceScrapped){
+        return Result.success(deviceScrappedService.addDeviceScrapped(deviceScrapped));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鎶ュ簾鐢宠
+     */
+    @ApiOperation("瀵煎嚭璁惧鎶ュ簾鐢宠")
+    @GetMapping("/exportDeviceScrapped")
+    public Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+        return deviceScrappedService.exportDeviceScrapped(scrappedId, response);
+    }
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceStateController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceStateController.java
new file mode 100644
index 0000000..8f697b5
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceStateController.java
@@ -0,0 +1,89 @@
+package com.yuanchu.mom.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.dto.DeviceStateDto;
+import com.yuanchu.mom.excel.DeviceStateExport;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceState;
+import com.yuanchu.mom.service.DeviceStateService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@RestController
+@RequestMapping("/deviceState")
+public class DeviceStateController {
+
+    @Autowired
+    private DeviceStateService deviceStateService;
+
+    @Autowired
+    private NumberGenerator<DeviceState> numberGenerator;
+
+    @PostMapping("saveDeviceState")
+    public Result saveIncidentReportData(@RequestBody DeviceState deviceState) {
+        if (ObjectUtils.isEmpty(deviceState.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceState::getProcessNumber);
+            deviceState.setProcessNumber(processNumber);
+        }
+        deviceStateService.saveOrUpdate(deviceState);
+        return Result.success();
+    }
+
+    @GetMapping("/getDeviceStatePage")
+    public Result getDeviceStatePage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
+        return Result.success(deviceStateService.getDeviceStatePage(deviceId, page, processNumber));
+    }
+
+    @DeleteMapping("/deleteDeviceState")
+    public Result deleteDeviceState(@RequestParam("stateId") Integer stateId){
+        return Result.success(deviceStateService.removeById(stateId));
+    }
+
+    @PostMapping("/deviceStateExport")
+    public Result deviceStateExport(@RequestParam("deviceId") Integer deviceId, String processNumber, HttpServletResponse response) throws Exception {
+        IPage<DeviceStateDto> deviceBorrows = deviceStateService.getDeviceStatePage(deviceId, new Page<>(1, -1), processNumber);
+        List<DeviceStateExport> studentList  = JSONObject.parseArray(JSON.toJSONString(deviceBorrows.getRecords()), DeviceStateExport.class);
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceStateExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(studentList);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "璁惧鍚姩/鍋滄瀵煎嚭")
+    @GetMapping("/exportDeviceStatus")
+    @ValueAuth
+    public void exportDeviceStatus(@RequestParam("processNumber") String processNumber,@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+        deviceStateService.exportDeviceStatus(deviceId, processNumber, response);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceTraceabilityManagementController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceTraceabilityManagementController.java
new file mode 100644
index 0000000..51e42c3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DeviceTraceabilityManagementController.java
@@ -0,0 +1,104 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceTraceabilityManagementDto;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagement;
+import com.yuanchu.mom.service.DeviceTraceabilityManagementService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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-20 02:27:44
+ */
+@Api(tags = "璁惧閲忓�兼函婧愯鍒�")
+@RestController
+@RequestMapping("/deviceTraceabilityManagement")
+public class DeviceTraceabilityManagementController {
+    @Resource
+    private DeviceTraceabilityManagementService deviceTraceabilityManagementService;
+
+    /**
+     * 鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�
+     * @param data 鍒嗛〉鍙傛暟
+     * @return
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�")
+    @PostMapping("selectDeviceTraceabilityManagementByPage")
+    @SneakyThrows
+    public Result<IPage<DeviceTraceabilityManagement>> selectDeviceTraceabilityManagementByPage(@RequestBody Map<String, Object> data){
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceTraceabilityManagementDto itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceTraceabilityManagementDto.class);
+        return deviceTraceabilityManagementService.selectDeviceTraceabilityManagementByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏂板閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @ApiOperation("鏂板閲忓�兼函婧愯鍒�")
+    @PostMapping("/addTraceabilityManagement")
+    public Result addTraceabilityManagement(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.addTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 淇敼閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @ApiOperation("淇敼閲忓�兼函婧愯鍒�")
+    @PostMapping("/updateTraceabilityManagement")
+    public Result updateTraceabilityManagement(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.updateTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 鍒犻櫎閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @ApiOperation("鍒犻櫎閲忓�兼函婧愯鍒�")
+    @GetMapping("/deleteTraceabilityManagement")
+    public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 鏌ヨ閲忓�兼函婧愯鍒掕鎯�
+     */
+    @ApiOperation("鏌ヨ閲忓�兼函婧愯鍒掕鎯�")
+    @GetMapping("/getTraceabilityManagementDetail")
+    public Result<DeviceTraceabilityManagementDto> getTraceabilityManagementDetail(Integer traceabilityManagementId) {
+        return deviceTraceabilityManagementService.getTraceabilityManagementDetail(traceabilityManagementId);
+    }
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鏍哥姸鎬佷慨鏀�
+     */
+    @ApiOperation("閲忓�兼函婧愯鍒掑鏍哥姸鎬佷慨鏀�")
+    @PostMapping("/reviewTraceabilityManagementStatus")
+    public Result reviewTraceabilityManagementStatus(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.reviewTraceabilityManagementStatus(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 瀵煎嚭閲忓�兼函婧愯鍒�
+     */
+    @ApiOperation("瀵煎嚭閲忓�兼函婧愯鍒�")
+    @GetMapping("/exportDeviceTraceabilityManagement")
+    public Result exportDeviceTraceabilityManagement(@RequestParam("traceabilityManagementId") Integer traceabilityManagementId, HttpServletResponse response) {
+        return deviceTraceabilityManagementService.exportDeviceTraceabilityManagementDto(traceabilityManagementId, response);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/DocumentController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/DocumentController.java
new file mode 100644
index 0000000..fbf50f0
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/DocumentController.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yuanchu.mom.pojo.Document;
+import com.yuanchu.mom.service.DocumentService;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/documents")
+public class DocumentController {
+
+    @Autowired
+    private DocumentService documentService;
+
+    @PostMapping
+    public Result createDocument( Document document) {
+        documentService.save(document);
+        return Result.success("ok");
+    }
+
+    @GetMapping("/{id}")
+    public Document getDocumentById(@PathVariable Integer id) {
+        return documentService.getById(id);
+    }
+
+    @PutMapping("updateDocument")
+    public Result updateDocument(@RequestBody Document document) {
+        return Result.success(documentService.updateById(document));
+    }
+
+    @DeleteMapping("/{id}")
+    public Result deleteDocumentById(@PathVariable Integer id) {
+        return Result.success(documentService.removeById(id));
+    }
+
+    @GetMapping("/getListByDId/{id}")
+    public Result getAllDocuments(@PathVariable Integer id) {
+        LambdaQueryWrapper<Document> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Document::getDeviceId,id);
+        return Result.success(documentService.list(lambdaQueryWrapper));
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/IncidentReportController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/IncidentReportController.java
new file mode 100644
index 0000000..9ce3f90
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/IncidentReportController.java
@@ -0,0 +1,84 @@
+package com.yuanchu.mom.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.IncidentReportAddDto;
+import com.yuanchu.mom.excel.IncidentReportExport;
+import com.yuanchu.mom.service.IncidentReportService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+@RestController
+@RequestMapping("/incident-report")
+public class IncidentReportController {
+    @Autowired
+    private IncidentReportService incidentReportService;
+
+    @PostMapping("saveIncidentReportData")
+    public Result saveIncidentReportData(@RequestBody IncidentReportAddDto incidentReportAddDto) {
+        incidentReportService.saveIncidentReportData(incidentReportAddDto);
+        return Result.success();
+    }
+
+    @GetMapping("/getShowIncidentReport")
+    public Result getShowIncidentReport(@RequestParam("id") Integer id) {
+        return Result.success(incidentReportService.getShowIncidentReport(id));
+    }
+
+    @DeleteMapping("/deleteIncidentReport")
+    public Result deleteIncidentReport(@RequestParam("id") Integer id) {
+        incidentReportService.deleteIncidentReport(id);
+        return Result.success();
+    }
+
+    @GetMapping("/incidentReportPage")
+    public Result incidentReportPage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
+        return Result.success(incidentReportService.getByDeviceId(deviceId, page, processNumber));
+    }
+
+    @DeleteMapping("deleteIncidentReportAll")
+    public Result deleteIncidentReport(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId) {
+        incidentReportService.deleteIncidentReportAll(sparePartsId, fileId, installId, acceptanceCheckId);
+        return Result.success();
+    }
+
+    @GetMapping("/incidentReportExport")
+    public Result incidentReportPage(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
+        List<IncidentReportExport> list = incidentReportService.incidentReportExport(deviceId);
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(IncidentReportExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(list);
+        return Result.success();
+    }
+
+    @ValueClassify("璁惧楠屾敹")
+    @ApiOperation(value = "璁惧楠屾敹瀵煎嚭")
+    @GetMapping("/acceptanceCertificateExport")
+    @ValueAuth
+    public void acceptanceCertificateExport(@RequestParam("deviceId") Integer deviceId, @RequestParam("processNumber") String processNumber, HttpServletResponse response) throws Exception {
+        incidentReportService.acceptanceCertificateExport(deviceId, processNumber, response);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/InstructionController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/InstructionController.java
new file mode 100644
index 0000000..50f0966
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/InstructionController.java
@@ -0,0 +1,109 @@
+package com.yuanchu.mom.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.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.InstructionDto;
+import com.yuanchu.mom.dto.OperationInstructionDto;
+import com.yuanchu.mom.pojo.Instruction;
+import com.yuanchu.mom.pojo.OperationInstruction;
+import com.yuanchu.mom.service.InstructionService;
+import com.yuanchu.mom.service.OperationInstructionService;
+import com.yuanchu.mom.vo.OperationInstructionVo;
+import com.yuanchu.mom.vo.Result;
+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("/instruction")
+public class InstructionController {
+
+    @Autowired
+    private InstructionService instructionService;
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @Autowired
+    private GetLook getLook;
+
+    @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<Instruction>> pageByPageQueryOfHomeworkInstructions(Page page, OperationInstructionDto operationInstructionDto){
+        return Result.success(instructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody InstructionDto instructionDto){
+        instructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @ValueAuth
+    @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        Instruction instruction = instructionService.getById(instructionId);
+        List<OperationInstructionVo> list = operationInstructionService.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(",");
+            operationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+    @GetMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        operationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = operationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            instructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+    @GetMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId(null);
+        operationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, map1.get("userId"))
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/QrShowController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/QrShowController.java
new file mode 100644
index 0000000..35b5f46
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/QrShowController.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.controller;
+
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.enums.QrModelType;
+import com.yuanchu.mom.service.QrShowService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping("/qr")
+public class QrShowController {
+
+    @Autowired
+    private QrShowService qrShowService;
+
+    /**
+     * 浜岀淮鐮佹壂鐮佽姹傛帴鍙�
+     * @param model
+     * @param code 缂栧彿
+     * @param type 绫诲瀷(word/device)
+     * @return
+     */
+    @ValueAuth
+    @GetMapping("/qrScan")
+    public String hello(Model model, @RequestParam("code") String code,@RequestParam("type") String type){
+        qrShowService.transformModelByType(model,code,type);
+        return QrModelType.getValueByType(type);
+    }
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/ReservationController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/ReservationController.java
new file mode 100644
index 0000000..cb3b77d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/ReservationController.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceDto;
+import com.yuanchu.mom.pojo.Reservation;
+import com.yuanchu.mom.service.DeviceService;
+import com.yuanchu.mom.service.ReservationService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@RestController
+@RequestMapping("/reservation")
+public class ReservationController {
+    @Autowired
+    private ReservationService reservationService;
+
+    @Resource
+    private DeviceService deviceService;
+
+    @PostMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(@RequestBody Map<String, Object> data, @RequestParam(value = "laboratoryNameIsNull", required = false) Boolean laboratoryNameIsNull,@RequestParam(value = "starttime", required = false)String starttime,@RequestParam(value = "endtime", required = false) String endtime) throws Exception {
+        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+        DeviceDto itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceDto.class);
+        Map<String, Object> map = reservationService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull,starttime,endtime);
+        return Result.success(map);
+    }
+
+    @PostMapping("/selectReservationParameterPage")
+    public Result selectReservationParameterPage(@RequestParam String deviceId,@RequestParam String reservationTime,@RequestParam String specificTime){
+        return Result.success(reservationService.selectReservationParameterPage(deviceId,reservationTime,specificTime));
+    }
+
+    @GetMapping("/{id}")
+    public Result getList(@PathVariable Integer id) {
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Reservation::getDeviceId,id);
+        return Result.success(reservationService.list(lambdaQueryWrapper));
+    }
+
+    @PostMapping("save")
+    public Result save(Reservation reservation){
+        reservation.setCreateDate(LocalDateTime.now());
+        reservationService.save(reservation);
+        return Result.success();
+    }
+
+
+    @DeleteMapping("/delete/{ids}")
+    public Result deleteReservation(@PathVariable String ids) {
+        String[] idArray = ids.split(",");
+        reservationService.removeBatchByIds(Arrays.asList(idArray));
+        return Result.success();
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceAccidentReportDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceAccidentReportDto.java
new file mode 100644
index 0000000..88030c6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceAccidentReportDto.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDetailDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDetailDto.java
new file mode 100644
index 0000000..66a7d27
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDetailDto.java
@@ -0,0 +1,21 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 10:05:08
+ * Description:
+ */
+@Data
+public class DeviceCalibrationPlanDetailDto extends DeviceCalibrationPlanDetail {
+
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+    @ApiModelProperty("鏈�杩戞瀹氭椂闂碨tr")
+    private String lastDateStr;
+    @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿Str")
+    private String planDateStr;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDto.java
new file mode 100644
index 0000000..43e4522
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCalibrationPlanDto.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceCalibrationPlan;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceCalibrationPlanDto extends DeviceCalibrationPlan {
+
+    @ApiModelProperty("缂栧埗浜�")
+    private String writeName;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private String ratifyName;
+
+    @ApiModelProperty("缂栧埗鏃堕棿")
+    private String writeTimeStr;
+
+    @ApiModelProperty("鎵瑰噯鏃堕棿")
+    private String ratifyTimeStr;
+
+    @ApiModelProperty("鏍″噯璁″垝璇︽儏")
+    private List<DeviceCalibrationPlanDetail> calibrationPlanDetailList;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCollectionDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCollectionDto.java
new file mode 100644
index 0000000..df52d4d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceCollectionDto.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 璁惧閲囬泦瀵硅薄
+ *
+ * @Author zhuo
+ * @Date 2024/12/3
+ */
+@Data
+public class DeviceCollectionDto {
+
+    @ApiModelProperty(value = "鏍峰搧id")
+    private Integer id;
+
+    @ApiModelProperty(value = "璁㈠崟缂栧彿")
+    private String entrustCode;
+
+    @ApiModelProperty(value = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @ApiModelProperty(value = "閲囬泦鐨勬楠岄」id")
+    private List<Integer> itemIds;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDetailsDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDetailsDto.java
new file mode 100644
index 0000000..e655f04
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDetailsDto.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 15:34:44
+ * Description:
+ */
+@Data
+public class DeviceExaminePlanDetailsDto extends DeviceExaminePlanDetails {
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDto.java
new file mode 100644
index 0000000..1ac4597
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExaminePlanDto.java
@@ -0,0 +1,33 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExaminePlan;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExaminePlanDto extends DeviceExaminePlan {
+
+    @ApiModelProperty("缂栧埗浜�")
+    private String writeName;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private String ratifyName;
+
+    @ApiModelProperty("缂栧埗鏃堕棿")
+    private String writeTimeStr;
+
+    @ApiModelProperty("鎵瑰噯鏃堕棿")
+    private String ratifyTimeStr;
+
+    @ApiModelProperty("骞村害")
+    private String year;
+
+    private List<DeviceExaminePlanDetails> examinePlanDetailsList;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDetailsDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDetailsDto.java
new file mode 100644
index 0000000..00cdc0e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDetailsDto.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 13:59:37
+ * Description:
+ */
+@Data
+public class DeviceExamineRecordContrastDetailsDto extends DeviceExamineRecordContrastDetails {
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDto.java
new file mode 100644
index 0000000..cd801eb
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordContrastDto.java
@@ -0,0 +1,47 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrast;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExamineRecordContrastDto extends DeviceExamineRecordContrast {
+
+    @ApiModelProperty("鏍告煡璁板綍瀵规瘮璇︽儏")
+    private List<DeviceExamineRecordContrastDetails> recordContrastDetailsList;
+
+
+    @ApiModelProperty("A璁惧鍚嶇О")
+    private String aDeviceName;
+
+    @ApiModelProperty("A璁惧缂栧彿")
+    private String aDeviceNumber;
+
+    @ApiModelProperty("b璁惧鍚嶇О")
+    private String bDeviceName;
+
+    @ApiModelProperty("b璁惧缂栧彿")
+    private String bDeviceNumber;
+
+    @ApiModelProperty("c璁惧鍚嶇О")
+    private String cDeviceName;
+
+    @ApiModelProperty("c璁惧缂栧彿")
+    private String cDeviceNumber;
+
+    @ApiModelProperty("鏍告煡鏃ユ湡")
+    private String checkerTimeStr;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private String reviewTimeStr;
+
+    @ApiModelProperty("瀹為獙瀹�")
+    private String labName;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordDto.java
new file mode 100644
index 0000000..5ddfb08
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExamineRecordDto.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExamineRecord;
+import com.yuanchu.mom.pojo.DeviceExamineRecordDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExamineRecordDto extends DeviceExamineRecord {
+
+    @ApiModelProperty("鏍告煡璁板綍璇︽儏")
+    private List<DeviceExamineRecordDetail> recordDetailList;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("璁惧缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鏈�鍚庝竴娆′慨鏀规棩鏈�")
+    private String updateTimeStr;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExport.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExport.java
new file mode 100644
index 0000000..411130d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExport.java
@@ -0,0 +1,19 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.Device;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜� 15:55:29
+ * Description:
+ */
+@Data
+public class DeviceExport extends Device {
+    @ApiModelProperty("绠$悊浜�")
+    private String equipmentManagerName;
+
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExternalApplyDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExternalApplyDto.java
new file mode 100644
index 0000000..a59dd4e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceExternalApplyDto.java
@@ -0,0 +1,12 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceExternalApply;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/19
+ */
+@Data
+public class DeviceExternalApplyDto extends DeviceExternalApply {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceFaultOneDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceFaultOneDto.java
new file mode 100644
index 0000000..82fe11c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceFaultOneDto.java
@@ -0,0 +1,17 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceFaultOne;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceFaultOneDto extends DeviceFaultOne {
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceInspectionRecordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceInspectionRecordDto.java
new file mode 100644
index 0000000..cd717f6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceInspectionRecordDto.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yuanchu.mom.pojo.DeviceInspectionRecord;
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDetailsDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDetailsDto.java
new file mode 100644
index 0000000..512f4c8
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDetailsDto.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 9:26:48
+ * Description: 璁惧淇濆吇璁″垝璇︽儏
+ */
+@Data
+public class DeviceMaintenancePlanDetailsDto extends DeviceMaintenancePlanDetails {
+
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+
+    @ApiModelProperty("浠櫒璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("浠櫒璁惧缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("浠櫒璁惧鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty("浠櫒缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty("褰掑睘瀹為獙瀹�")
+    private String storagePoint;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDto.java
new file mode 100644
index 0000000..22e922b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMaintenancePlanDto.java
@@ -0,0 +1,30 @@
+package com.yuanchu.mom.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlan;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 18:26:59
+ * Description:
+ */
+@Data
+public class DeviceMaintenancePlanDto extends DeviceMaintenancePlan {
+
+    @ApiModelProperty("璁惧淇濆吇璁″垝璇︽儏")
+    @TableField(exist = false)
+    private List<DeviceMaintenancePlanDetailsDto> deviceMaintenancePlanDetails;
+
+    @ApiModelProperty("缂栧埗鏃ユ湡")
+    private String datePreparationStr;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private String auditDateStr;
+
+    @ApiModelProperty("璁惧Id")
+    private Integer deviceId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordAndMaintenanceDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordAndMaintenanceDto.java
new file mode 100644
index 0000000..a2c1aea
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordAndMaintenanceDto.java
@@ -0,0 +1,38 @@
+package com.yuanchu.mom.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 10:43:06
+ * Description: 浠櫒璁惧妗f鍗′腑鏄剧ず鐨勮澶囨牎鍑嗚褰曞拰缁存姢璁板綍鐨勫垪琛ㄥ璞�
+ */
+@Data
+public class DeviceMetricRecordAndMaintenanceDto {
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+
+    // 鏍″噯琛ㄤ腑鐨勬暟鎹�
+    @ApiModelProperty("鏍″噯鏃ユ湡")
+    private String calibrationDateString;
+
+    @ApiModelProperty("璇佷功鏍囧彿")
+    private String certificateNumber;
+
+    @ApiModelProperty("鏍″噯鏈夋晥鏃ユ湡")
+    private String validityDateString;
+
+    @ApiModelProperty("鍒ゅ畾")
+    private String judgement;
+
+    // 缁翠慨璁板綍琛ㄤ腑鐨勬暟鎹�
+    @ApiModelProperty("缁翠慨鏃ユ湡")
+    private String maintenanceDateString;
+
+    @ApiModelProperty("澶勭悊鏂瑰紡")
+    private String handlingMethod;
+
+    @ApiModelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordDto.java
new file mode 100644
index 0000000..20aa80b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceMetricRecordDto.java
@@ -0,0 +1,13 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+import com.yuanchu.mom.pojo.DeviceMetricsCopy;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceMetricRecordDto extends DeviceMetricRecord {
+
+    private List<DeviceMetricsCopy> deviceMetricsCopyList;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordDto.java
new file mode 100644
index 0000000..af3eedf
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordDto.java
@@ -0,0 +1,14 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceRecordDto extends DeviceRecord {
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+    @ApiModelProperty("璁惧缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordExportWord.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordExportWord.java
new file mode 100644
index 0000000..01bf749
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceRecordExportWord.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜� 17:19:22
+ * Description:
+ */
+@Data
+public class DeviceRecordExportWord extends DeviceRecord {
+    @ApiModelProperty("浣跨敤鍓�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private String useBeforeString;
+
+    @ApiModelProperty("浣跨敤鍚�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private String useAfterString;
+
+    @ApiModelProperty("鎿嶄綔鏃堕棿 String yyyy-MM-dd")
+    private String operationDate;
+
+    @ApiModelProperty("浣跨敤寮�濮嬫棩鏈� String yyyy-MM-dd \n HH:mm:ss")
+    private String useStartDateString;
+
+    @ApiModelProperty("浣跨敤缁撴潫鏃ユ湡 String yyyy-MM-dd \n HH:mm:ss")
+    private String useEndDateString;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceScrappedDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceScrappedDto.java
new file mode 100644
index 0000000..c74cb62
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceScrappedDto.java
@@ -0,0 +1,26 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceScrapped;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 18:34:17
+ * Description:
+ */
+@Data
+public class DeviceScrappedDto extends DeviceScrapped {
+
+    @ApiModelProperty("鐢宠鏃堕棿")
+    private String applicantDateStr;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+    private String meteringRoomDateStr;
+
+    @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+    private String approverDateStr;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceStateDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceStateDto.java
new file mode 100644
index 0000000..80f317b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceStateDto.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceState;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceStateDto extends DeviceState {
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty(value = "鎿嶄綔鏃ユ湡 yyyy-MM-dd")
+    private String submitDateString;
+
+    @ApiModelProperty("璐熻矗浜哄鎵规棩鏈� yyyy-MM-dd")
+    private String departmentDateString;
+
+    @ApiModelProperty("璁¢噺瀹ゅ鎵规棩鏈� yyyy-MM-dd")
+    private String measuringRoomDateString;
+
+    @ApiModelProperty("鎵瑰噯鏃ユ湡 yyyy-MM-dd")
+    private String approvalDateString;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    private String largeCategory;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDetailsDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDetailsDto.java
new file mode 100644
index 0000000..b0bcba4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDetailsDto.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-20 鏄熸湡浜� 15:05:02
+ * Description:
+ */
+@Data
+public class DeviceTraceabilityManagementDetailsDto extends DeviceTraceabilityManagementDetails {
+    @ApiModelProperty("搴忓彿")
+    private Integer index;
+
+    @ApiModelProperty("浠櫒璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("浠櫒璁惧鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty("浠櫒缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDto.java
new file mode 100644
index 0000000..553d8f2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DeviceTraceabilityManagementDto.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagement;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-20 鏄熸湡浜� 14:30:45
+ * Description:
+ */
+@Data
+public class DeviceTraceabilityManagementDto extends DeviceTraceabilityManagement {
+    @ApiModelProperty("璁惧閲忓�兼函婧愯鍒掕鎯�")
+    private List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetails;
+
+    @ApiModelProperty("缂栧埗鏃ユ湡")
+    private String datePreparationStr;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private String auditDateStr;
+
+    @ApiModelProperty("璁惧Id")
+    private Integer deviceId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/DocumentExportWordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/DocumentExportWordDto.java
new file mode 100644
index 0000000..3ba6dc3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/DocumentExportWordDto.java
@@ -0,0 +1,45 @@
+package com.yuanchu.mom.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 8:45:34
+ * Description: 鐢ㄤ簬浠櫒璁惧妗f鍗$殑瀵煎嚭
+ */
+@Data
+public class DocumentExportWordDto {
+
+    // 璁惧妗f宸﹀垪琛�
+    @ApiModelProperty("搴忓彿")
+    private Integer index1;
+
+    @ApiModelProperty("妗f鍚嶇О")
+    private String name1;
+
+    @ApiModelProperty("浠芥暟")
+    private Integer quantity1;
+
+    @ApiModelProperty("椤电爜")
+    private Integer pageCount1;
+
+    @ApiModelProperty("褰掓。鏃ユ湡")
+    private String archiveDateString1;
+
+    // 璁惧妗f鍙冲垪琛�
+    @ApiModelProperty("搴忓彿")
+    private Integer index2;
+
+    @ApiModelProperty("妗f鍚嶇О")
+    private String name2;
+
+    @ApiModelProperty("浠芥暟")
+    private Integer quantity2;
+
+    @ApiModelProperty("椤电爜")
+    private Integer pageCount2;
+
+    @ApiModelProperty("褰掓。鏃ユ湡")
+    private String archiveDateString2;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportAddDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportAddDto.java
new file mode 100644
index 0000000..9f57770
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportAddDto.java
@@ -0,0 +1,26 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.*;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class IncidentReportAddDto extends IncidentReport {
+    private List<IncidentSpareParts> sparePartsConfirmationList; // 澶囦欢纭List
+    private List<IncidentFile> fileClassConfirmationList; // 鏂囦欢纭List
+    private List<IncidentInstall> installationAcceptanceRecordList; // 瀹夎楠屾敹璁板綍
+    private List<IncidentAcceptanceCheck> acceptanceCheckRecordList; // 楠屾敹鏍告煡璁板綍
+
+    private String deviceName;
+
+    private String managementNumber;
+
+    private String submitUser;
+
+    private String saveState;
+
+    private String manufacturer;
+
+    private String specificationModel;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportExportWordDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportExportWordDto.java
new file mode 100644
index 0000000..4ef89ba
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/IncidentReportExportWordDto.java
@@ -0,0 +1,49 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.IncidentReport;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-12 鏄熸湡鍥� 10:39:23
+ * Description: 瀵煎嚭楠屾敹鎶ュ憡鍒皐ord鐨刣to
+ */
+public class IncidentReportExportWordDto extends IncidentReport {
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("璁惧鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("閲戦")
+    private String amount;
+
+    @ApiModelProperty("鍑哄巶缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍒拌揣鏃ユ湡")
+    private String arrivalDateString;
+
+    @ApiModelProperty("瀛樻斁鍦扮偣")
+    private String deviceLocation;
+
+    @ApiModelProperty("鐢熶骇鍘傚")
+    private String manufacturer;
+
+    @ApiModelProperty("渚涘簲鍟�")
+    private String supplier;
+
+    @ApiModelProperty("缁翠慨鍗曚綅")
+    private String maintainUnit;
+
+    @ApiModelProperty("鏀惰澶囦富鏈哄拰澶囦欢鎯呭喌")
+    private String equipmentHostAndSpareParts;
+
+    @ApiModelProperty("楠屾敹鎯呭喌")
+    private String unpackingAcceptanceConclusionString;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡 yyyy-MM-dd")
+    private String submitDateString;
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionDto.java
new file mode 100644
index 0000000..be6cd9a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionDto.java
@@ -0,0 +1,13 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.Instruction;
+import com.yuanchu.mom.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InstructionDto extends Instruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionFileDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionFileDto.java
new file mode 100644
index 0000000..5bdf40e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/InstructionFileDto.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.yuanchu.mom.pojo.Instruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class InstructionFileDto extends Instruction {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(" 璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(" 鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @ApiModelProperty(" 璁惧缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty(" 鏂囨。鐗堟湰")
+    private String documentVersion;
+
+    @ApiModelProperty("闄勪欢")
+    private String attachmentInformation;
+
+    @ApiModelProperty(" 浣滆��")
+    private Integer author;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @ApiModelProperty("鏂囨。璇存槑")
+    private String documentNote;
+
+    private String documentType;
+
+    private String deviceModel;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/OperationInstructionDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/OperationInstructionDto.java
new file mode 100644
index 0000000..34ce252
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/OperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionDto 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-server/src/main/java/com/yuanchu/mom/dto/ReservationDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/ReservationDto.java
new file mode 100644
index 0000000..b6341b5
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/ReservationDto.java
@@ -0,0 +1,10 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.Reservation;
+import lombok.Data;
+
+@Data
+public class ReservationDto extends Reservation {
+
+    private String name;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceBorrowExcel.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceBorrowExcel.java
new file mode 100644
index 0000000..0b8e0de
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceBorrowExcel.java
@@ -0,0 +1,39 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DeviceBorrowExcel {
+
+    @ApiModelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty("0璁惧鐘舵��")
+    private String deviceStatus;
+
+    @ApiModelProperty("0鍋滅敤鍚敤鐞嗙敱")
+    private String reason;
+
+    @ExcelProperty(value = "鎻愪氦浜�")
+    private String createUser;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExcel.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExcel.java
new file mode 100644
index 0000000..0186de7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExcel.java
@@ -0,0 +1,33 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+
+
+@Data
+@EqualsAndHashCode
+public class DeviceFaultOneExcel {
+    @ExcelProperty("搴忓彿")
+    private Long index;
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+    @ExcelProperty("缁熶竴缂栧彿")
+    private Double managementNumber;
+    @ExcelProperty("鏁呴殰鎯呭喌")
+    private String faultSituation;
+    @ExcelProperty("鎻愪氦浜�")
+    private String submitPerson;
+    @ExcelProperty("鎻愪氦鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate faultDate;
+    @ExcelProperty("褰撳墠鐘舵��")
+    private String currentStatus;
+    @ExcelProperty("褰撳墠璐d换浜�")
+    private String currentResponsiblePerson;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExport.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExport.java
new file mode 100644
index 0000000..9d4fe3d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceFaultOneExport.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DeviceFaultOneExport {
+
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+    
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ExcelProperty(value = "缁熶竴缂栧彿")
+    private String managementNumber;
+
+    @ExcelProperty("鏁呴殰鎯呭喌")
+    private String faultSituation;
+
+    @ExcelProperty("鎻愪氦浜�")
+    private String submitPerson;
+
+    @ExcelProperty("鎻愪氦鏃ユ湡")
+    private LocalDateTime createTime;
+
+    @ExcelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ExcelProperty("褰撳墠璐d换浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceMaintenanceExport.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceMaintenanceExport.java
new file mode 100644
index 0000000..97add3a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceMaintenanceExport.java
@@ -0,0 +1,45 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+public class DeviceMaintenanceExport {
+
+    @ColumnWidth(20)
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ColumnWidth(20)
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+
+    @ColumnWidth(20)
+    @ExcelProperty("绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ColumnWidth(50)
+    @ExcelProperty("缁存姢鍐呭")
+    private String content;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢鏃堕棿")
+    private String date;
+
+    @ColumnWidth(20)
+    @ExcelProperty("涓嬫缁存姢鏃堕棿")
+    private String nextDate;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢绫诲瀷")
+    private String maintenanceType;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢浜�")
+    private String name;
+
+    @ColumnWidth(50)
+    @ExcelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceRecordExport.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceRecordExport.java
new file mode 100644
index 0000000..7f04eb6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceRecordExport.java
@@ -0,0 +1,43 @@
+package com.yuanchu.mom.excel;
+
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceRecordExport {
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ExcelProperty("绠$悊缂栧彿")
+    private String managementNumber;
+    
+    @ExcelProperty("娓╁害")
+    private String temperature;
+
+    @ExcelProperty("婀垮害")
+    private String humidity;
+
+    @ExcelProperty("浣跨敤鍓�")
+    private String useBefore;
+
+    @ExcelProperty("浣跨敤鍚�")
+    private String useAfter;
+
+    @ExcelProperty("寮傚父鎯呭喌")
+    private String abnormal;
+
+    @ExcelProperty("浣跨敤鏃ユ湡")
+    private String useDate;
+
+    @ExcelProperty("浣跨敤浜�")
+    private String usePerson;
+
+    @ExcelProperty("澶囨敞")
+    private String remark;
+    
+    
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceStateExport.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceStateExport.java
new file mode 100644
index 0000000..98a69bf
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/DeviceStateExport.java
@@ -0,0 +1,36 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DeviceStateExport {
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ExcelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ExcelProperty("璁惧鐘舵��")
+    private String deviceStatus;
+
+    @ExcelProperty("鍋滅敤鍚敤鐞嗙敱")
+    private String reason;
+
+    @ExcelProperty("鎻愪氦浜�")
+    private String createUser;
+
+    @ExcelProperty("鎻愪氦鏃ユ湡")
+    private LocalDateTime createTime;
+
+    @ExcelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ExcelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/IncidentReportExport.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/IncidentReportExport.java
new file mode 100644
index 0000000..859525d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/IncidentReportExport.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class IncidentReportExport {
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ExcelProperty(value = "搴忓垪鍙�")
+    private String serialNumber;
+
+    @ExcelProperty(value = "鎻愪氦鑰�")
+    private String submitUser;
+
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    private String createTime;
+
+    @ExcelProperty(value = "褰撳墠鐘舵��")
+    private String saveState;
+
+    @ExcelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceCalibrationPlanDetailUpload.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceCalibrationPlanDetailUpload.java
new file mode 100644
index 0000000..0508d3a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceCalibrationPlanDetailUpload.java
@@ -0,0 +1,36 @@
+package com.yuanchu.mom.excel.upload;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceCalibrationPlanDetailUpload {
+
+    @ApiModelProperty("璁惧鍚嶇О鍙婂瀷鍙�")
+    private String deviceName;
+
+    @ApiModelProperty("璁惧鏁伴噺")
+    private String deviceAmount;
+
+    @ApiModelProperty("浠櫒缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @ApiModelProperty("妫�瀹氬懆鏈�")
+    private String verificationCycles;
+
+    @ApiModelProperty("鏈�杩戞瀹氭椂闂�")
+    private String lastDate;
+
+    @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿")
+    private String planDate;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceExaminePlanUpload.java b/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceExaminePlanUpload.java
new file mode 100644
index 0000000..d1f2948
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/excel/upload/DeviceExaminePlanUpload.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.excel.upload;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceExaminePlanUpload {
+
+    @ApiModelProperty("璁惧缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("鏍告煡鏃堕棿")
+    private String checkTime;
+
+    @ApiModelProperty("鏍告煡鎸囨爣")
+    private String checkIndex;
+
+    @ApiModelProperty("鏍告煡鏂规硶")
+    private String checkMethod;
+
+    @ApiModelProperty("缁撴灉濡備綍鍒ゅ畾")
+    private String howResults;
+
+    @ApiModelProperty("鏍告煡璐d换浜�")
+    private String checkChargerUser;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceFileMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceFileMapper.java
new file mode 100644
index 0000000..5a70331
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceFileMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileMapper extends BaseMapper<DeviceAcceptanceFile> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceMapper.java
new file mode 100644
index 0000000..ba823da
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAcceptanceMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.DeviceAcceptance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+public interface DeviceAcceptanceMapper extends BaseMapper<DeviceAcceptance> {
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, @Param("ew") QueryWrapper<DeviceAcceptance> ew);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAccidentReportMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAccidentReportMapper.java
new file mode 100644
index 0000000..eec03cb
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceAccidentReportMapper.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceAccidentReportDto;
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/mapper/DeviceBorrowMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBorrowMapper.java
new file mode 100644
index 0000000..ea40b3d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBorrowMapper.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.DeviceBorrow;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+public interface DeviceBorrowMapper extends BaseMapper<DeviceBorrow> {
+
+    IPage<DeviceBorrow> deviceBorrowPage(Page page, @Param("ew")QueryWrapper<DeviceBorrow> ew);
+
+    List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBreakdownMaintenanceMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBreakdownMaintenanceMapper.java
new file mode 100644
index 0000000..3842188
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceBreakdownMaintenanceMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.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-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanDetailMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanDetailMapper.java
new file mode 100644
index 0000000..fbf3f17
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanDetailMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+public interface DeviceCalibrationPlanDetailMapper extends BaseMapper<DeviceCalibrationPlanDetail> {
+
+    /**
+     * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlanDetail> ew);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanMapper.java
new file mode 100644
index 0000000..85120a7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCalibrationPlanMapper.java
@@ -0,0 +1,29 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceCalibrationPlanDto;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlan;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+public interface DeviceCalibrationPlanMapper extends BaseMapper<DeviceCalibrationPlan> {
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlan> ew);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCheckMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCheckMapper.java
new file mode 100644
index 0000000..305c2eb
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceCheckMapper.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceCheck;
+
+public interface DeviceCheckMapper extends BaseMapper<DeviceCheck> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanDetailsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanDetailsMapper.java
new file mode 100644
index 0000000..8a928af
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanDetailsMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:16
+ */
+public interface DeviceExaminePlanDetailsMapper extends BaseMapper<DeviceExaminePlanDetails> {
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceExaminePlanDetails> pageDeviceExaminePlanDetail(Page page, @Param("ew") QueryWrapper<DeviceExaminePlanDetails> ew);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanMapper.java
new file mode 100644
index 0000000..9240f37
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExaminePlanMapper.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceExaminePlanDto;
+import com.yuanchu.mom.pojo.DeviceExaminePlan;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+public interface DeviceExaminePlanMapper extends BaseMapper<DeviceExaminePlan> {
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceExaminePlanDto> deviceExaminePlanDetailsMapper(Page page, @Param("ew") QueryWrapper<DeviceExaminePlan> ew);
+
+    /**
+     * 鏌ヨ璁惧鏍告煡璁″垝璇︽儏
+     * @param deviceExaminePlanId 璁惧鏍告煡璁″垝id
+     * @return
+     */
+    DeviceExaminePlanDto selectExamineExaminePlanDto(@Param("deviceExaminePlanId") Integer deviceExaminePlanId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastDetailsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastDetailsMapper.java
new file mode 100644
index 0000000..e2e96f2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:57
+ */
+public interface DeviceExamineRecordContrastDetailsMapper extends BaseMapper<DeviceExamineRecordContrastDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastMapper.java
new file mode 100644
index 0000000..9e1b458
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordContrastMapper.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.dto.DeviceExamineRecordContrastDto;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrast;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:43
+ */
+public interface DeviceExamineRecordContrastMapper extends BaseMapper<DeviceExamineRecordContrast> {
+
+    /**
+     * 鏌ヨ鏍告煡瀵规瘮璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    DeviceExamineRecordContrastDto getExamineRecordContrast(Integer planDetailsId);
+
+    /**
+     * 鏌ヨ瀵规瘮璁板綍鐢ㄤ簬瀵煎嚭
+     * @param planDetailsId
+     * @return
+     */
+    DeviceExamineRecordContrastDto selectExamineRecordContrastDto(@Param("planDetailsId") Integer planDetailsId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordDetailMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordDetailMapper.java
new file mode 100644
index 0000000..295f513
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordDetailMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceExamineRecordDetail;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:15:11
+ */
+public interface DeviceExamineRecordDetailMapper extends BaseMapper<DeviceExamineRecordDetail> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordMapper.java
new file mode 100644
index 0000000..2d32652
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExamineRecordMapper.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.dto.DeviceExamineRecordDto;
+import com.yuanchu.mom.pojo.DeviceExamineRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:28
+ */
+public interface DeviceExamineRecordMapper extends BaseMapper<DeviceExamineRecord> {
+
+    /**
+     * 鏌ヨ璁惧鏍告煡璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    DeviceExamineRecordDto getExamineRecord(Integer planDetailsId);
+
+    /**
+     * 澶嶆牳鏍告煡璁板綍
+     * @param planDetailsId 澶嶆牳鏍告煡璁板綍id
+     * @return
+     */
+    DeviceExamineRecordDto selectReviewExamineRecordDto(@Param("planDetailsId") Integer planDetailsId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExternalApplyMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExternalApplyMapper.java
new file mode 100644
index 0000000..4523f7f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceExternalApplyMapper.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.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.yuanchu.mom.pojo.DeviceExternalApply;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍒╃敤澶栭儴璁惧鐢宠琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 10:28:43
+ */
+public interface DeviceExternalApplyMapper extends BaseMapper<DeviceExternalApply> {
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceExternalApply> pageDeviceExternalApply(Page page, @Param("ew") QueryWrapper<DeviceExternalApply> ew);
+
+    /**
+     * 瀵煎嚭鏌ヨ鍒╃敤澶栭儴璁惧鐢宠
+     * @param externalApplyId 澶栭儴璁惧鐢宠琛╥d
+     * @return
+     */
+    DeviceExternalApply selectDeviceExternalById(@Param("externalApplyId") Integer externalApplyId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultMapper.java
new file mode 100644
index 0000000..03f8847
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultMapper.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceFault;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceFaultMapper extends BaseMapper<DeviceFault> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultOneMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultOneMapper.java
new file mode 100644
index 0000000..5aecc64
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceFaultOneMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceFaultOneDto;
+import com.yuanchu.mom.pojo.DeviceFaultOne;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+public interface DeviceFaultOneMapper extends BaseMapper<DeviceFaultOne> {
+
+    IPage<DeviceFaultOneDto> deviceFaultOnePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordDetailsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordDetailsMapper.java
new file mode 100644
index 0000000..1be1910
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordMapper.java
new file mode 100644
index 0000000..6b2f8e6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceInspectionRecordMapper.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceInspectionRecordDto;
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/mapper/DeviceLeaseMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLeaseMapper.java
new file mode 100644
index 0000000..f73004b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLeaseMapper.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceLease;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceLeaseMapper extends BaseMapper<DeviceLease> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLogMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLogMapper.java
new file mode 100644
index 0000000..e0149d0
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceLogMapper.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceLogMapper extends BaseMapper<DeviceLog> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenanceMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenanceMapper.java
new file mode 100644
index 0000000..a8c06ff
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenanceMapper.java
@@ -0,0 +1,18 @@
+package com.yuanchu.mom.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.excel.DeviceMaintenanceExport;
+import com.yuanchu.mom.pojo.DeviceMaintenance;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
+    List<DeviceMaintenance> getDeviceMaintenanceParam();
+
+//    IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId);
+
+    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanDetailsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanDetailsMapper.java
new file mode 100644
index 0000000..81da4b4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanDetailsMapper.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.dto.DeviceMaintenancePlanDetailsDto;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:11:46
+ */
+public interface DeviceMaintenancePlanDetailsMapper extends BaseMapper<DeviceMaintenancePlanDetails> {
+
+    /**
+     * 鏌ヨ璁惧淇濆吇璇︽儏
+     * @param maintenancePlanId 璁惧淇濆吇璁″垝id
+     */
+    List<DeviceMaintenancePlanDetailsDto> deviceInspectionRecordDetailsList(@Param("maintenancePlanId") Integer maintenancePlanId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanMapper.java
new file mode 100644
index 0000000..0e0f76b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMaintenancePlanMapper.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceMaintenancePlanDto;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlan;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:10:52
+ */
+public interface DeviceMaintenancePlanMapper extends BaseMapper<DeviceMaintenancePlan> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     * @param page 褰撳墠椤�
+     * @param queryWrappers 鏌ヨ鏉′欢
+     * @return
+     */
+    IPage<DeviceMaintenancePlan> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceMaintenancePlanDto> queryWrappers);
+
+    /**
+     * 鏍规嵁淇濆吇璁″垝id鏌ヨ璁惧淇濆吇璁″垝
+     * @param maintenancePlanId 淇濆吇璁″垝id
+     * @return
+     */
+    DeviceMaintenancePlanDto selectMaintenancePlanById(@Param("maintenancePlanId") Integer maintenancePlanId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java
index 597c683..74c00ee 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMapper.java
@@ -32,7 +32,7 @@
     //鏌ヨ璁惧璐熻矗浜�
     List<Device> selectDevicePrincipal();
 
-    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers);
+    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers,@Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull);
 
     List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id);
 
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricMapper.java
new file mode 100644
index 0000000..79795cd
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricMapper.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceMetric;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceMetricMapper extends BaseMapper<DeviceMetric> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricRecordMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricRecordMapper.java
new file mode 100644
index 0000000..fecc91c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricRecordMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricsCopyMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricsCopyMapper.java
new file mode 100644
index 0000000..de2144b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceMetricsCopyMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyMapper extends BaseMapper<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceRecordMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceRecordMapper.java
new file mode 100644
index 0000000..bfe4fe1
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceRecordMapper.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceRecordDto;
+import com.yuanchu.mom.pojo.DeviceRecord;
+
+import java.util.List;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+public interface DeviceRecordMapper extends BaseMapper<DeviceRecord> {
+
+    IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber, Integer userId);
+
+
+    /**
+     * 鏌ヨ鏈~鍐欑殑璁惧
+     * @return
+     */
+    List<DeviceRecordDto> selectNotFilled();
+
+    /**
+     * 鏌ヨ瀵煎嚭璁惧浣跨敤璁板綍
+     * @param deviceId
+     * @param exportDate
+     * @return
+     */
+    List<DeviceRecord> selectExportList(Integer deviceId, String exportDate);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceScrappedMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceScrappedMapper.java
new file mode 100644
index 0000000..81bec98
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceScrappedMapper.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceScrappedDto;
+import com.yuanchu.mom.pojo.DeviceScrapped;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+public interface DeviceScrappedMapper extends BaseMapper<DeviceScrapped> {
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceScrapped> pageDeviceScrapped(Page page, @Param("ew") QueryWrapper<DeviceScrapped> ew);
+
+    /**
+     * 鏍规嵁id鏌ヨ璁惧鎶ュ簾鐢宠
+     * @param scrappedId
+     * @return
+     */
+    DeviceScrappedDto selectDeviceScrappedById(@Param("scrappedId") Integer scrappedId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceStateMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceStateMapper.java
new file mode 100644
index 0000000..78eec80
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceStateMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DeviceStateDto;
+import com.yuanchu.mom.pojo.DeviceState;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateMapper extends BaseMapper<DeviceState> {
+
+    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementDetailsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementDetailsMapper.java
new file mode 100644
index 0000000..7f86413
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementDetailsMapper.java
@@ -0,0 +1,26 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.dto.DeviceTraceabilityManagementDetailsDto;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:58
+ */
+public interface DeviceTraceabilityManagementDetailsMapper extends BaseMapper<DeviceTraceabilityManagementDetails> {
+
+    /**
+     * 鏍规嵁婧簮璁″垝id鏌ヨ婧簮璁″垝璇︽儏
+     * @param traceabilityManagementId 婧簮璁″垝id
+     * @return 婧簮璁″垝璇︽儏
+     */
+    List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetailsList(@Param("traceabilityManagementId") Integer traceabilityManagementId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementMapper.java
new file mode 100644
index 0000000..1dbefae
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DeviceTraceabilityManagementMapper.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceTraceabilityManagementDto;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagement;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:44
+ */
+public interface DeviceTraceabilityManagementMapper extends BaseMapper<DeviceTraceabilityManagement> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧閲忓�兼函婧愯鍒�
+     * @param page
+     * @param queryWrappers
+     * @return
+     */
+    IPage<DeviceTraceabilityManagement> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceTraceabilityManagementDto> queryWrappers);
+
+    /**
+     * 鏍规嵁id鏌ヨ璁惧閲忓�兼函婧愯鍒�
+     * @param traceabilityManagementId
+     * @return
+     */
+    DeviceTraceabilityManagementDto selectDeviceTraceabilityManagementById(@Param("traceabilityManagementId") Integer traceabilityManagementId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/DocumentDao.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DocumentDao.java
new file mode 100644
index 0000000..197544f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/DocumentDao.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.Document;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DocumentDao extends BaseMapper<Document> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentAcceptanceCheckMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentAcceptanceCheckMapper.java
new file mode 100644
index 0000000..79686a9
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentAcceptanceCheckMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.IncidentAcceptanceCheck;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-楠屾敹鏍告煡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:19
+ */
+public interface IncidentAcceptanceCheckMapper extends MyBaseMapper<IncidentAcceptanceCheck> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentFileMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentFileMapper.java
new file mode 100644
index 0000000..bc8d0e5
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentFileMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.IncidentFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-鏂囦欢绫荤‘璁� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:36
+ */
+public interface IncidentFileMapper extends MyBaseMapper<IncidentFile> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentInstallMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentInstallMapper.java
new file mode 100644
index 0000000..bf6940d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentInstallMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.IncidentInstall;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-瀹夎楠屾敹妫�鏌� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:50
+ */
+public interface IncidentInstallMapper extends MyBaseMapper<IncidentInstall> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentReportMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentReportMapper.java
new file mode 100644
index 0000000..66f1a94
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentReportMapper.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.IncidentReportAddDto;
+import com.yuanchu.mom.dto.IncidentReportExportWordDto;
+import com.yuanchu.mom.excel.IncidentReportExport;
+import com.yuanchu.mom.pojo.IncidentReport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+public interface IncidentReportMapper extends BaseMapper<IncidentReport> {
+
+    IPage<IncidentReportAddDto> getByDeviceId(Page page, @Param("deviceId") Integer deviceId, @Param("processNumber") String processNumber);
+
+    IncidentReportAddDto getShowIncidentReport(Integer id);
+
+    List<IncidentReportExport> incidentReportExport(Integer deviceId);
+
+    /**
+     * 瀵煎嚭楠屾敹鎶ュ憡
+     * @param deviceId  璁惧id
+     * @param processNumber  娴佺▼鍙�
+     * @return
+     */
+    IncidentReportExportWordDto acceptanceCertificateExport(@Param("deviceId") Integer deviceId,@Param("processNumber") String processNumber);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentSparePartsMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentSparePartsMapper.java
new file mode 100644
index 0000000..01b1134
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/IncidentSparePartsMapper.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.IncidentSpareParts;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-澶囦欢纭 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:42:06
+ */
+public interface IncidentSparePartsMapper extends MyBaseMapper<IncidentSpareParts> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/InstructionMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/InstructionMapper.java
new file mode 100644
index 0000000..d235ba2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/InstructionMapper.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.OperationInstructionDto;
+import com.yuanchu.mom.pojo.Instruction;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<Instruction> {
+
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<OperationInstructionDto> ew);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/OperationInstructionMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..df732b8
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.OperationInstruction;
+import com.yuanchu.mom.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/ReservationMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/ReservationMapper.java
new file mode 100644
index 0000000..0038674
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/ReservationMapper.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.dto.ReservationDto;
+import com.yuanchu.mom.pojo.Reservation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationMapper extends BaseMapper<Reservation> {
+
+
+    List<ReservationDto> selectReservationParameterPage(@Param("deviceId") Integer deviceId, @Param("reservationTime") String reservationTime, @Param("specificTime") String specificTime);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptance.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptance.java
new file mode 100644
index 0000000..49fd79c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptance.java
@@ -0,0 +1,77 @@
+package com.yuanchu.mom.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-20 01:45:14
+ */
+@Getter
+@Setter
+@TableName("device_acceptance")
+@ApiModel(value = "DeviceAcceptance瀵硅薄", description = "璁惧楠屾敹(瑁呭)")
+public class DeviceAcceptance {
+
+    @TableId(value = "acceptance_id", type = IdType.AUTO)
+    private Integer acceptanceId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒拌揣鏃ユ湡")
+    private LocalDate arrivalDate;
+
+    @ApiModelProperty("閲戦")
+    private String goldAmount;
+
+    @ApiModelProperty("缁翠慨鍗曚綅")
+    private String maintenanceunit;
+
+    @ApiModelProperty("鏀惰澶囦富鏈哄拰澶囦唤鎯呭喌")
+    private String spareParts;
+
+    @ApiModelProperty("瀹夎鍜岃皟璇曟儏鍐�")
+    private String installationDebugging;
+
+    @ApiModelProperty("楠屾敹鎯呭喌")
+    private String checkSituation;
+
+    @ApiModelProperty("鎺ユ敹绛惧瓧")
+    private String receivingSignature;
+
+    @ApiModelProperty("鍘傚浠h〃")
+    private String producer;
+
+    @ApiModelProperty("鎺ユ敹浜�")
+    private String recipient;
+
+    @ApiModelProperty("鎺ユ敹鏃堕棿")
+    private String recipientDate;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptanceFile.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptanceFile.java
new file mode 100644
index 0000000..9ce26b2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAcceptanceFile.java
@@ -0,0 +1,58 @@
+package com.yuanchu.mom.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-20 01:45:26
+ */
+@Getter
+@Setter
+@TableName("device_acceptance_file")
+@ApiModel(value = "DeviceAcceptanceFile瀵硅薄", description = "璁惧楠屾敹(瑁呭)闄勪欢琛�")
+public class DeviceAcceptanceFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "acceptance_file_id", type = IdType.AUTO)
+    private Integer acceptanceFileId;
+
+    @ApiModelProperty("璁惧楠屾敹id")
+    private Integer acceptanceId;
+
+    @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @ApiModelProperty("闄勪欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAccidentReport.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAccidentReport.java
new file mode 100644
index 0000000..54b1d40
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceAccidentReport.java
@@ -0,0 +1,120 @@
+package com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/pojo/DeviceBorrow.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBorrow.java
new file mode 100644
index 0000000..79a4384
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBorrow.java
@@ -0,0 +1,159 @@
+package com.yuanchu.mom.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yuanchu.mom.annotation.ValueTableShow;
+import com.yuanchu.mom.common.OrderBy;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Getter
+@Setter
+@TableName("device_borrow")
+@ApiModel(value = "DeviceBorrow瀵硅薄", description = "璁惧鍊熺敤")
+public class DeviceBorrow extends OrderBy implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ExcelIgnore
+    private Integer id;
+
+    @ValueTableShow(1)
+    @ApiModelProperty("娴佺▼缂栧彿")
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁惧id")
+    @ExcelIgnore
+    private Integer deviceId;
+
+    @ValueTableShow(3)
+    @ApiModelProperty("绠$悊缂栧彿")
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String unifyNumber;
+
+    @ApiModelProperty("鍊熺敤浜�")
+    @ValueTableShow(4)
+    @ExcelProperty(value = "鍊熺敤浜�")
+    private String recipientUser;
+
+    @ValueTableShow(5)
+    @ExcelProperty(value = "鍊熺敤浜鸿仈绯绘柟寮�")
+    @ApiModelProperty("鍊熺敤浜鸿仈绯绘柟寮�")
+    private String borrowerContactInformation;
+
+    @ValueTableShow(6)
+    @ApiModelProperty("鍊熺敤鏃剁姸鎬�")
+    @ExcelProperty(value = "鍊熺敤鏃剁姸鎬�")
+    //0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾
+    private Integer recipientState;
+
+    @ValueTableShow(5)
+    @ApiModelProperty("鍊熺敤鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    private Date recipientTime;
+
+    @ApiModelProperty("鍊熷嚭浜�")
+    @ValueTableShow(7)
+    @ExcelProperty(value = "鍊熷嚭浜�")
+    private String submitUser;
+
+    @ValueTableShow(8)
+    @ApiModelProperty("鍊熷嚭鏃ユ湡")
+    @ExcelProperty(value = "鍊熷嚭鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ValueTableShow(9)
+    @ApiModelProperty("褰撳墠鐘舵��")
+    @ExcelProperty(value = "褰撳墠鐘舵��")
+    private String nowState;
+
+    @ApiModelProperty("褰撳墠璐d换浜�")
+    @ValueTableShow(10)
+    @ExcelProperty(value = "褰撳墠璐d换浜�")
+    private String nowUser;
+
+    @ExcelIgnore
+    @ApiModelProperty("闄勪欢")
+    //璺緞
+    private String url;
+
+    @ValueTableShow(11)
+    @ApiModelProperty("闄勪欢")
+    @ExcelProperty(value = "闄勪欢")
+    //鏂囦欢鍚�
+    private String fileName;
+
+    @ApiModelProperty("涓嬬幆鑺傝矗浠讳汉")
+    @ExcelIgnore
+    private String nextUser;
+
+    @ApiModelProperty("鎻愪氦鎿嶄綔浜�")
+    @ExcelIgnore
+    private String submitOperationUser;
+
+    @ApiModelProperty("鎻愪氦鎿嶄綔鏃堕棿")
+    @ExcelIgnore
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime submitOperationTime;
+
+    @ApiModelProperty("褰掕繕浜�")
+    @ExcelIgnore
+    private String rebackUser;
+
+    @ApiModelProperty("褰掕繕鏃ユ湡")
+    @ExcelIgnore
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime rebackTime;
+
+    @ApiModelProperty("鎺ュ彈鐘舵��0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾")
+    @ExcelIgnore
+    private Integer receiveState;
+
+    @ApiModelProperty("璁惧璐d换浜�")
+    @ExcelIgnore
+    private String deviceUser;
+
+    @ApiModelProperty("澶囨敞")
+    @ExcelIgnore
+    private String note;
+
+    @ApiModelProperty("鎺ユ敹鎿嶄綔浜�")
+    @ExcelIgnore
+    private String receiveOperationUser;
+
+    @ApiModelProperty("鎺ユ敹鎿嶄綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ExcelIgnore
+    private LocalDateTime receiveOperationTime;
+
+    @ValueTableShow(2)
+    @ApiModelProperty("璁惧鍚嶇О")
+    @TableField(select = false, exist = false)
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+
+    @ApiModelProperty("娴佺▼璺熻釜")
+    @TableField(select = false, exist = false)
+    @ExcelIgnore
+    private List<DeviceLog> deviceLogs;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBreakdownMaintenance.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBreakdownMaintenance.java
new file mode 100644
index 0000000..fbf109a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceBreakdownMaintenance.java
@@ -0,0 +1,90 @@
+package com.yuanchu.mom.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 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-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlan.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlan.java
new file mode 100644
index 0000000..11a12d3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlan.java
@@ -0,0 +1,67 @@
+package com.yuanchu.mom.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.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Getter
+@Setter
+@TableName("device_calibration_plan")
+@ApiModel(value = "DeviceCalibrationPlan瀵硅薄", description = "璁惧鏍″噯璁″垝涓昏〃")
+public class DeviceCalibrationPlan {
+
+    @TableId(value = "plan_id", type = IdType.AUTO)
+    private Integer planId;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String planName;
+
+    @ApiModelProperty("璁″垝骞翠唤")
+    private String planYear;
+
+    @ApiModelProperty("缂栧埗浜�")
+    private Integer writeUserId;
+
+    @ApiModelProperty("缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @ApiModelProperty("鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @ApiModelProperty("鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @ApiModelProperty("鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlanDetail.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlanDetail.java
new file mode 100644
index 0000000..e673ffe
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCalibrationPlanDetail.java
@@ -0,0 +1,74 @@
+package com.yuanchu.mom.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-16 03:58:29
+ */
+@Getter
+@Setter
+@TableName("device_calibration_plan_detail")
+@ApiModel(value = "DeviceCalibrationPlanDetail瀵硅薄", description = "璁惧鏍″噯璁″垝璇︽儏琛�")
+public class DeviceCalibrationPlanDetail {
+
+    @TableId(value = "plan_detail_id", type = IdType.AUTO)
+    private Integer planDetailId;
+
+    @ApiModelProperty("璁″垝涓昏〃id")
+    private Integer planId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("璁惧鍚嶇О鍙婂瀷鍙�")
+    private String deviceName;
+
+    @ApiModelProperty("璁惧鏁伴噺")
+    private String deviceAmount;
+
+    @ApiModelProperty("浠櫒缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @ApiModelProperty("妫�瀹氬懆鏈�")
+    private String verificationCycles;
+
+    @ApiModelProperty("鏈�杩戞瀹氭椂闂�")
+    private LocalDate lastDate;
+
+    @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿")
+    private LocalDate planDate;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCheck.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCheck.java
new file mode 100644
index 0000000..dce68da
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceCheck.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("device_check")
+public class DeviceCheck {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id; //id
+    private Integer deviceId;            // 璁惧ID
+    private String measurementParameter; // 璁¢噺鍙傛暟
+    private String rangeOfMeasurement;   // 閲忕▼鑼冨洿
+    private String maxPermissibleError;  // 鏈�澶у厑璁歌宸�
+    private String judgmentCriteria;     // 鍒ゅ畾鏍囧噯
+    private String createdBy;           // 鍒涘缓浜�
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime creationTime;      // 鍒涘缓鏃堕棿
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlan.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlan.java
new file mode 100644
index 0000000..95ea60a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlan.java
@@ -0,0 +1,67 @@
+package com.yuanchu.mom.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.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+@Getter
+@Setter
+@TableName("device_examine_plan")
+@ApiModel(value = "DeviceExaminePlan瀵硅薄", description = "璁惧鏍告煡璁″垝涓昏〃")
+public class DeviceExaminePlan {
+
+    @TableId(value = "plan_id", type = IdType.AUTO)
+    private Integer planId;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String planName;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String planYear;
+
+    @ApiModelProperty("缂栧埗浜�")
+    private Integer writeUserId;
+
+    @ApiModelProperty("缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @ApiModelProperty("鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @ApiModelProperty("鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @ApiModelProperty("鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlanDetails.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlanDetails.java
new file mode 100644
index 0000000..315fba3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExaminePlanDetails.java
@@ -0,0 +1,76 @@
+package com.yuanchu.mom.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.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝璇︽儏琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:16
+ */
+@Getter
+@Setter
+@TableName("device_examine_plan_details")
+@ApiModel(value = "DeviceExaminePlanDetails瀵硅薄", description = "璁惧鏍告煡璁″垝璇︽儏琛�")
+public class DeviceExaminePlanDetails {
+
+    @TableId(value = "plan_details_id", type = IdType.AUTO)
+    private Integer planDetailsId;
+
+    @ApiModelProperty("涓昏〃id")
+    private Integer planId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("璁惧缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("鏍告煡鏃堕棿")
+    private String checkTime;
+
+    @ApiModelProperty("鏍告煡鎸囨爣")
+    private String checkIndex;
+
+    @ApiModelProperty("鏍告煡鏂规硶")
+    private String checkMethod;
+
+    @ApiModelProperty("缁撴灉濡備綍鍒ゅ畾")
+    private String howResults;
+
+    @ApiModelProperty("鏍告煡璐d换浜篿d")
+    private Integer checkChargerUserId;
+
+    @ApiModelProperty("鏍告煡璐d换浜�")
+    private String checkChargerUser;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecord.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecord.java
new file mode 100644
index 0000000..6288573
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecord.java
@@ -0,0 +1,139 @@
+package com.yuanchu.mom.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 07:14:28
+ */
+@Getter
+@Setter
+@TableName("device_examine_record")
+@ApiModel(value = "DeviceExamineRecord瀵硅薄", description = "璁惧鏍告煡璁板綍琛�")
+public class DeviceExamineRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_id", type = IdType.AUTO)
+    private Integer recordId;
+
+    @ApiModelProperty("璁惧鏍告煡璇︽儏id")
+    private Integer planDetailsId;
+
+    @ApiModelProperty("绮惧害绛夌骇")
+    private String accuracyGrade;
+
+    @ApiModelProperty("浣跨敤鐗╄川鍚嶇О")
+    private String materialName;
+
+    @ApiModelProperty("浣跨敤鐗╄川绠$悊缂栧彿")
+    private String materialNumber;
+
+    @ApiModelProperty("浣跨敤鐗╄川绮惧害/涓嶇‘瀹氬害")
+    private String materialAccuracyUncertainty;
+
+    @ApiModelProperty("浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+    private String materialModel;
+
+    @ApiModelProperty("浣跨敤鐗╄川鏍告煡鏂瑰紡")
+    private String materialCheckMethod;
+
+    @ApiModelProperty("浣跨敤鐗╄川鏍告煡椤圭洰")
+    private String materialCheckItems;
+
+    @ApiModelProperty("娓╁害")
+    private String temperature;
+
+    @ApiModelProperty("婀垮害")
+    private String humidity;
+
+    @ApiModelProperty("鍒ゅ畾")
+    private String determine;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鏍告煡浜篿d")
+    private Integer checkerUserId;
+
+    @ApiModelProperty("鏍告煡浜�")
+    private String checkerUser;
+
+    @ApiModelProperty("澶嶆牳浜篿d")
+    private Integer reviewUserId;
+
+    @ApiModelProperty("澶嶆牳浜�")
+    private String reviewUser;
+
+    @ApiModelProperty("瀹℃牳鐘舵��0,涓嶉�氳繃, 1閫氳繃")
+    private Integer reviewStatus;
+
+    @ApiModelProperty("瀹℃牳澶囨敞")
+    private String reviewRemark;
+
+    @ApiModelProperty("娴嬭瘯鐐�1")
+    private String dataValue1;
+    @ApiModelProperty("娴嬭瘯鐐�2")
+    private String dataValue2;
+    @ApiModelProperty("娴嬭瘯鐐�3")
+    private String dataValue3;
+    @ApiModelProperty("娴嬭瘯鐐�4")
+    private String dataValue4;
+    @ApiModelProperty("娴嬭瘯鐐�5")
+    private String dataValue5;
+    @ApiModelProperty("娴嬭瘯鐐�6")
+    private String dataValue6;
+
+    @ApiModelProperty("鏈�澶у亸宸�1")
+    private String maximun1;
+    @ApiModelProperty("鏈�澶у亸宸�2")
+    private String maximun2;
+    @ApiModelProperty("鏈�澶у亸宸�3")
+    private String maximun3;
+    @ApiModelProperty("鏈�澶у亸宸�4")
+    private String maximun4;
+    @ApiModelProperty("鏈�澶у亸宸�5")
+    private String maximun5;
+    @ApiModelProperty("鏈�澶у亸宸�6")
+    private String maximun6;
+
+    @ApiModelProperty("鐩稿鍋忓樊1")
+    private String relative1;
+    @ApiModelProperty("鐩稿鍋忓樊2")
+    private String relative2;
+    @ApiModelProperty("鐩稿鍋忓樊3")
+    private String relative3;
+    @ApiModelProperty("鐩稿鍋忓樊4")
+    private String relative4;
+    @ApiModelProperty("鐩稿鍋忓樊5")
+    private String relative5;
+    @ApiModelProperty("鐩稿鍋忓樊6")
+    private String relative6;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrast.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrast.java
new file mode 100644
index 0000000..91f4099
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrast.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.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 07:14:43
+ */
+@Getter
+@Setter
+@TableName("device_examine_record_contrast")
+@ApiModel(value = "DeviceExamineRecordContrast瀵硅薄", description = "璁惧鏍告煡璁板綍瀵规瘮琛�")
+public class DeviceExamineRecordContrast implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_contrast_id", type = IdType.AUTO)
+    private Integer recordContrastId;
+
+    @ApiModelProperty("鏍告煡鏂瑰紡")
+    private String checkMethod;
+
+    @ApiModelProperty("璁惧鏍告煡璇︽儏id")
+    private Integer planDetailsId;
+
+    @ApiModelProperty("璁惧idA")
+    private Integer aDeviceId;
+
+    @ApiModelProperty("璁惧idb")
+    private Integer bDeviceId;
+
+    @ApiModelProperty("璁惧idc")
+    private Integer cDeviceId;
+
+    @ApiModelProperty("鑼冨洿涓嶇‘瀹氬害A")
+    private String aRangeUncertainty;
+
+    @ApiModelProperty("鑼冨洿涓嶇‘瀹氬害b")
+    private String bRangeUncertainty;
+
+    @ApiModelProperty("鑼冨洿涓嶇‘瀹氬害c")
+    private String cRangeUncertainty;
+
+    @ApiModelProperty("缁煎悎鍒ゅ畾")
+    private String judgment;
+
+    @ApiModelProperty("鏍告煡浜篿d")
+    private Integer checkerUserId;
+
+    @ApiModelProperty("鏍告煡浜�")
+    private String checkerUser;
+
+    @ApiModelProperty("鏍告煡鏃ユ湡")
+    private LocalDateTime checkerTime;
+
+    @ApiModelProperty("瀹℃牳浜篿d")
+    private Integer reviewUserId;
+
+    @ApiModelProperty("瀹℃牳浜�")
+    private String reviewUser;
+
+    @ApiModelProperty("瀹℃牳鐘舵��0,涓嶉�氳繃, 1閫氳繃")
+    private Integer reviewStatus;
+
+    @ApiModelProperty("瀹℃牳澶囨敞")
+    private String reviewRemark;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private LocalDateTime reviewTime;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrastDetails.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrastDetails.java
new file mode 100644
index 0000000..761d626
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordContrastDetails.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.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 07:14:57
+ */
+@Getter
+@Setter
+@TableName("device_examine_record_contrast_details")
+@ApiModel(value = "DeviceExamineRecordContrastDetails瀵硅薄", description = "璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛�")
+public class DeviceExamineRecordContrastDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_contrast_details_id", type = IdType.AUTO)
+    private Integer recordContrastDetailsId;
+
+    @ApiModelProperty("璁惧鏍告煡璇︽儏id")
+    private Integer recordContrastId;
+
+    @ApiModelProperty("鏍告煡椤圭洰")
+    private String checkItems;
+
+    @ApiModelProperty("a浠櫒绀哄��")
+    private String indicationA;
+
+    @ApiModelProperty("b浠櫒绀哄��")
+    private String indicationB;
+
+    @ApiModelProperty("c浠櫒绀哄��")
+    private String indicationC;
+
+    @ApiModelProperty("宸��")
+    private String dValue;
+
+    @ApiModelProperty("鍋忓樊")
+    private String deviation;
+
+    @ApiModelProperty("鍒ゅ畾")
+    private String determine;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordDetail.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordDetail.java
new file mode 100644
index 0000000..a871313
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExamineRecordDetail.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.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 07:15:11
+ */
+@Getter
+@Setter
+@TableName("device_examine_record_detail")
+@ApiModel(value = "DeviceExamineRecordDetail瀵硅薄", description = "璁惧鏍告煡璁板綍璇︽儏琛�")
+public class DeviceExamineRecordDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_detail_id", type = IdType.AUTO)
+    private Integer recordDetailId;
+
+    @ApiModelProperty("璁捐澶囨牳鏌ヨ褰昳d")
+    private Integer recordId;
+
+    @ApiModelProperty("娴嬭瘯鐐�")
+    private String testPoint;
+
+    @ApiModelProperty("鍐呭鍊�1")
+    private String dataValue1;
+
+    @ApiModelProperty("鍐呭鍊�2")
+    private String dataValue2;
+
+    @ApiModelProperty("鍐呭鍊�3")
+    private String dataValue3;
+
+    @ApiModelProperty("鍐呭鍊�4")
+    private String dataValue4;
+
+    @ApiModelProperty("鍐呭鍊�5")
+    private String dataValue5;
+
+    @ApiModelProperty("鍐呭鍊�6")
+    private String dataValue6;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExternalApply.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExternalApply.java
new file mode 100644
index 0000000..19efa1b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceExternalApply.java
@@ -0,0 +1,123 @@
+package com.yuanchu.mom.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 10:28:43
+ */
+@Getter
+@Setter
+@TableName("device_external_apply")
+@ApiModel(value = "DeviceExternalApply瀵硅薄", description = "鍒╃敤澶栭儴璁惧鐢宠琛�")
+public class DeviceExternalApply {
+
+    @TableId(value = "external_apply_id", type = IdType.AUTO)
+    private Integer externalApplyId;
+
+    @ApiModelProperty("鍗曚綅鍚嶇О")
+    private String unitName;
+
+    @ApiModelProperty("鍦板潃")
+    private String address;
+
+    @ApiModelProperty("浠櫒鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("浠櫒鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("閰嶄欢")
+    private String parts;
+
+    @ApiModelProperty("瀵规柟浠櫒缂栧彿")
+    private String instrumentNumber;
+
+    @ApiModelProperty("鎶�鏈寚鏍�")
+    private String technicalIndex;
+
+    @ApiModelProperty("鎶�鏈姹�")
+    private String technicalRequirements;
+
+    @ApiModelProperty("鍒╃敤鍘熷洜")
+    private String useReason;
+
+    @ApiModelProperty("0鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("0鐢宠浜�")
+    private String applicantUser;
+
+    @ApiModelProperty("0鐢宠鏃堕棿")
+    private LocalDate applicantDate;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("2璁¢噺瀹ゆ剰瑙�")
+    private String meteringRoomOpinion;
+
+    @ApiModelProperty("2璁¢噺瀹や汉id")
+    private Integer meteringRoomUserId;
+
+    @ApiModelProperty("2璁¢噺瀹や汉")
+    private String meteringRoomUser;
+
+    @ApiModelProperty("2璁¢噺瀹や汉濉啓鏃堕棿")
+    private LocalDate meteringRoomDate;
+
+    @ApiModelProperty("3鎵瑰噯浜烘剰瑙�")
+    private String approverOpinion;
+
+    @ApiModelProperty("3鎵瑰噯浜篿d")
+    private Integer approverUserId;
+
+    @ApiModelProperty("3鎵瑰噯浜�")
+    private String approverUser;
+
+    @ApiModelProperty("3鎵瑰噯浜哄~鍐欐椂闂�")
+    private LocalDate approverDate;
+
+    @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:鎵瑰噯浜�")
+    private Integer flowType;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFault.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFault.java
new file mode 100644
index 0000000..727f3d3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFault.java
@@ -0,0 +1,39 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@TableName("device_faults")
+public class DeviceFault {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    //璁惧di
+    private Integer deviceId;
+    //鏁呴殰娆℃暟
+    private Integer faultCount;
+    //鏈�杩戞晠闅滄棩鏈�
+    private LocalDate recentFaultDate;
+    //鏈�杩戞牎鍑嗘棩鏈�
+    private LocalDate recentCalibrationDate;
+   // 鏈�杩戞牎鍑嗙粨璁�
+    private String calibrationConclusion;
+  // 鏈�杩戞鏌ユ棩鏈�
+    private LocalDate recentCheckDate;
+  // 涓嬩竴娆℃鏌ユ棩鏈�
+    private LocalDate nextCheckDate;
+//妫�鏌ョ粨璁�
+    private String checkConclusion;
+//缁存姢绫诲瀷
+    private String maintenanceType;
+//缁存姢浜哄憳
+    private String maintenancePerson;
+//澶囨敞
+    private String comments;
+
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFaultOne.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFaultOne.java
new file mode 100644
index 0000000..3e6cb6e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceFaultOne.java
@@ -0,0 +1,125 @@
+package com.yuanchu.mom.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.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+@Getter
+@Setter
+@TableName("device_fault_one")
+@ApiModel(value = "DeviceFaultOne瀵硅薄", description = "璁惧鏁呴殰琛�")
+public class DeviceFaultOne implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("1娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("1鍑嗙‘搴﹂噺鍊�")
+    private String measureOfAccuracy;
+
+    @ApiModelProperty("1鏁呴殰鎯呭喌")
+    private String faultSituation;
+
+    @ApiModelProperty("1鏂囦欢鍘熷悕")
+    private String fileName;
+
+    @ApiModelProperty("1绯荤粺鏂囦欢鍚�")
+    private String systemFileName;
+
+    @ApiModelProperty("1涓嬬幆鑺傝礋璐d汉")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("1鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("1鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("2缁翠慨鏂瑰紡鍙婅垂鐢�")
+    private String methodCost;
+
+    @ApiModelProperty("2瀹℃牳鎰忚")
+    private String adminAuditOption;
+
+    @ApiModelProperty("2璁惧绠$悊鍛�-涓嬬幆鑺傝礋璐d汉")
+    private String adminNextPesponsible;
+
+    @ApiModelProperty("2绠$悊鍛�-鎿嶄綔浜�")
+    private String adminOperatingPersonnel;
+
+    @ApiModelProperty("2绠$悊鍛�-鏃ユ湡")
+    private LocalDateTime adminDate;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 瀹℃牳鎰忚")
+    private String technicalAuditOption;
+
+    @ApiModelProperty("3鎶�鏈礋璐d汉 涓嬬幆鑺傝礋璐d汉")
+    private String technicalNextPesponsible;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鎿嶄綔浜�")
+    private String technicalOperatingPersonnel;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鏃ユ湡")
+    private LocalDateTime technicalDate;
+
+    @ApiModelProperty("4缁翠慨鎯呭喌")
+    private String maintainSituation;
+
+    @ApiModelProperty("4 缁翠慨 涓嬬幆鑺傝礋璐d汉")
+    private String maintainNextPesponsible;
+
+    @ApiModelProperty("4 缁翠慨 鎿嶄綔浜�")
+    private String maintainOperatingPersonnel;
+
+    @ApiModelProperty("4 缁翠慨 鏃ユ湡")
+    private LocalDateTime maintainDate;
+
+    @ApiModelProperty("5楠屾敹纭鏍″噯鎯呭喌")
+    private String checkCalSituation;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鎿嶄綔浜�")
+    private String afterMaintenanceOperatingPersonnel;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鏃ユ湡")
+    private LocalDateTime afterMaintenanceDate;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("鎻愪氦浜�")
+    private String submitPerson;
+
+    @ApiModelProperty("褰撳墠璐d换浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏁呴殰鏃ユ湡")
+    private LocalDate faultDate;
+
+    @ApiModelProperty("瑕佹眰淇鏃ユ湡")
+    private LocalDate requestRepairDate;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecord.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecord.java
new file mode 100644
index 0000000..3780a7d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecord.java
@@ -0,0 +1,93 @@
+package com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecordDetails.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecordDetails.java
new file mode 100644
index 0000000..3bd7b90
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceInspectionRecordDetails.java
@@ -0,0 +1,63 @@
+package com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/pojo/DeviceLease.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLease.java
new file mode 100644
index 0000000..28da273
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLease.java
@@ -0,0 +1,47 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("device_leases")
+public class DeviceLease implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Integer leaseId;
+
+    private String processNumber;
+
+    private String deviceName;
+
+    private String managementNumber;
+
+    private String borrower;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDate borrowDate;
+
+    private String borrowStatus;
+
+    private String submitter;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime submissionDate;
+
+    private String currentStatus;
+
+    private String currentResponsible;
+
+    private int deviceId;
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLog.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLog.java
new file mode 100644
index 0000000..9481bad
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceLog.java
@@ -0,0 +1,29 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("device_log") // 璁板綍
+public class DeviceLog implements Serializable {
+
+    @TableId(type= IdType.AUTO)
+    private Integer id;
+    private String operator;
+//    @JsonFormat()
+    private LocalDateTime operationTime;
+    private String operationType;
+    private String operationContent;
+    private Integer deviceId;
+
+    //鍏宠仈鐨勮〃鍚�
+    private String relevanceForm;
+
+    //鍏宠仈鐨刬d
+    private Integer relevanceId;
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenance.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenance.java
new file mode 100644
index 0000000..f2b81a1
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenance.java
@@ -0,0 +1,42 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+//@Accessors(chain = true)
+@TableName("device_maintenance")
+public class DeviceMaintenance {
+//    @TableId(value = "id", type = IdType.AUTO)
+    private static final long serialVersionUID = 1L;
+    //璁惧id
+    @TableId(type=IdType.AUTO)
+    private Integer id;
+    private Integer deviceId;
+
+    private String deviceName;
+    //缂栧彿
+    private String deviceNumber;
+    //缁熶竴缂栧彿
+    private String managementNumber;
+    //缁存姢鍐呭
+    private String content;
+    //缁存姢鏃ユ湡
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate date;
+    //涓嬫缁存姢鏃ユ湡
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate nextDate;
+    //缁存姢绫诲瀷
+    private Integer maintenanceType;
+    //缁存姢浜哄憳
+    private String name;
+    //澶囨敞
+    private String comments;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlan.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlan.java
new file mode 100644
index 0000000..1b9ec7d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlan.java
@@ -0,0 +1,75 @@
+package com.yuanchu.mom.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 06:10:52
+ */
+@Getter
+@Setter
+@TableName("device_maintenance_plan")
+@ApiModel(value = "DeviceMaintenancePlan瀵硅薄", description = "璁惧淇濆吇璁″垝琛�")
+public class DeviceMaintenancePlan implements Serializable {
+
+    @ApiModelProperty("璁惧淇濆吇璁″垝id")
+    @TableId(value = "maintenance_plan_id", type = IdType.AUTO)
+    private Integer maintenancePlanId;
+
+    @ApiModelProperty("缂栧埗浜�")
+    private String compiler;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String planName;
+
+    @ApiModelProperty("璁″垝骞翠唤")
+    private String planYear;
+
+    @ApiModelProperty("缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @ApiModelProperty("缂栧埗鏃ユ湡")
+    private LocalDateTime datePreparation;
+
+    @ApiModelProperty("瀹℃牳鐘舵�侊紝0鏈鏍革紝1瀹℃牳")
+    private Integer status;
+
+    @ApiModelProperty("瀹℃牳浜篿d")
+    private Integer auditId;
+
+    @ApiModelProperty("瀹℃牳浜�")
+    private String audit;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @ApiModelProperty("瀹℃牳淇℃伅")
+    private String auditRemark;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlanDetails.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlanDetails.java
new file mode 100644
index 0000000..69b80d9
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMaintenancePlanDetails.java
@@ -0,0 +1,62 @@
+package com.yuanchu.mom.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 06:11:46
+ */
+@Getter
+@Setter
+@TableName("device_maintenance_plan_details")
+@ApiModel(value = "DeviceMaintenancePlanDetails瀵硅薄", description = "璁惧淇濆吇璁″垝璇︽儏琛�")
+public class DeviceMaintenancePlanDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("淇濆吇璁″垝璇︽儏id")
+    @TableId(value = "maintenance_plan_detail_id", type = IdType.AUTO)
+    private Integer maintenancePlanDetailId;
+
+    @ApiModelProperty("淇濆吇璁″垝id")
+    private Integer maintenancePlanId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("淇濆吇鍏抽敭閮ㄤ綅")
+    private String maintenanceSite;
+
+    @ApiModelProperty("淇濆吇鍐呭")
+    private String maintenanceContent;
+
+    @ApiModelProperty("淇濆吇鍛ㄦ湡")
+    private String maintenanceIntervals;
+
+    @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;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetric.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetric.java
new file mode 100644
index 0000000..6fa0bf5
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetric.java
@@ -0,0 +1,29 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("device_metrics")
+public class DeviceMetric implements Serializable {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id; //id
+    private Integer deviceId;            // 璁惧ID
+    private String measurementParameter; // 璁¢噺鍙傛暟
+    private String rangeOfMeasurement;   // 閲忕▼鑼冨洿
+    private String maxPermissibleError;  // 鏈�澶у厑璁歌宸�
+    private String judgmentCriteria;     // 鍒ゅ畾鏍囧噯
+    private String createdBy;           // 鍒涘缓浜�
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime creationTime;      // 鍒涘缓鏃堕棿
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type; // 绫诲瀷
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricRecord.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricRecord.java
new file mode 100644
index 0000000..5dffcf7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricRecord.java
@@ -0,0 +1,89 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Getter
+@Setter
+@TableName("device_metric_record")
+@ApiModel(value = "DeviceMetricRecord瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍")
+public class DeviceMetricRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁板綍缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁¢噺鍗曚綅")
+    private String unitOfMeasure;
+
+    @ApiModelProperty("鏍″噯鏃ユ湡")
+    private Date calibrationDate;
+
+    @ApiModelProperty("涓嬫鏍″噯鏃ユ湡")
+    private Date nextCalibrationDate;
+
+    @ApiModelProperty("璁$畻鍣ㄥ叿")
+    private String calculatingApparatus;
+
+    @ApiModelProperty("璁$畻鏍囧噯閲忕▼")
+    private String standardRange;
+
+    @ApiModelProperty("璁¢噺鏍囧噯涓嶇‘瀹氬害")
+    private String calibrationStandardUncertainty;
+
+    @ApiModelProperty("渚濇嵁鏂囦欢")
+    private String byDocument;
+
+    @ApiModelProperty("璇佷功缂栧彿")
+    private String certificateSerialNumber;
+
+    @ApiModelProperty("鐘舵��")
+    private String status;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿 / 鐧昏鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鐧昏浜�")
+    private String createUser;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+
+    @ApiModelProperty("纭鏃堕棿")
+    private Date confirmDate;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricsCopy.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricsCopy.java
new file mode 100644
index 0000000..290c530
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceMetricsCopy.java
@@ -0,0 +1,66 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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-09-27 10:20:11
+ */
+@Getter
+@Setter
+@TableName("device_metrics_copy")
+@ApiModel(value = "DeviceMetricsCopy瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰")
+public class DeviceMetricsCopy implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧鏍″噯 - 鏍″噯璁板綍id")
+    private Integer deviceMetricsId;
+
+    @ApiModelProperty("璁¢噺鍙傛暟")
+    private String measurementParameter;
+
+    @ApiModelProperty("閲忕▼鑼冨洿")
+    private String rangeOfMeasurement;
+
+    @ApiModelProperty("鏈�澶у厑璁歌宸�")
+    private String maxPermissibleError;
+
+    @ApiModelProperty("鍒ゅ畾鏍囧噯")
+    private String judgmentCriteria;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createdBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private LocalDateTime creationTime;
+
+    @ApiModelProperty("鏄惁鏍″噯")
+    private String isCalibration;
+
+    @ApiModelProperty("鍒ゅ畾缁撴灉")
+    private String result;
+
+    @ApiModelProperty("鍗曢」缁撴灉璇存槑")
+    private String singleResultStatement;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceRecord.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceRecord.java
new file mode 100644
index 0000000..5198d9f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceRecord.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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>
+ * cnas璁惧浣跨敤璁板綍琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+@Getter
+@Setter
+@TableName("device_record")
+@ApiModel(value = "DeviceRecord瀵硅薄", description = "cnas璁惧浣跨敤璁板綍琛�")
+public class DeviceRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Integer deviceId;
+
+    @ApiModelProperty("璁㈠崟id")
+    private Integer insOrderId;
+
+    @ApiModelProperty("鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @ApiModelProperty("娓╁害")
+    private String temperature;
+
+    @ApiModelProperty("婀垮害")
+    private String humidity;
+
+    @ApiModelProperty("浣跨敤鍓�0寮傚父1鑹ソ")
+    private Integer useBefore;
+
+    @ApiModelProperty("浣跨敤鍚�0寮傚父1鑹ソ")
+    private Integer useAfter;
+
+    @ApiModelProperty("寮傚父鎯呭喌")
+    private String abnormal;
+
+    @ApiModelProperty("浣跨敤浜篿d")
+    private Integer usePersonId;
+
+    @ApiModelProperty("浣跨敤浜�")
+    private String usePerson;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("浣跨敤寮�濮嬫棩鏈�")
+    private LocalDateTime useStartDate;
+
+    @ApiModelProperty("浣跨敤缁撴潫鏃ユ湡")
+    private LocalDateTime useEndDate;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceScrapped.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceScrapped.java
new file mode 100644
index 0000000..b412c4a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceScrapped.java
@@ -0,0 +1,105 @@
+package com.yuanchu.mom.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 01:53:47
+ */
+@Getter
+@Setter
+@TableName("device_scrapped")
+@ApiModel(value = "DeviceScrapped瀵硅薄", description = "璁惧鎶ュ簾鐢宠琛�")
+public class DeviceScrapped {
+
+    @TableId(value = "scrapped_id", type = IdType.AUTO)
+    private Integer scrappedId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("閰嶄欢")
+    private String parts;
+
+    @ApiModelProperty("鎶ュ簾鐞嗙敱")
+    private String reasonsForScrap;
+
+    @ApiModelProperty("鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("鐢宠浜�")
+    private String applicantUser;
+
+    @ApiModelProperty("鐢宠鏃堕棿")
+    private LocalDate applicantDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("璁¢噺瀹ゆ剰瑙�")
+    private String meteringRoomOpinion;
+
+    @ApiModelProperty("璁¢噺瀹や汉id")
+    private Integer meteringRoomUserId;
+
+    @ApiModelProperty("璁¢噺瀹や汉")
+    private String meteringRoomUser;
+
+    @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+    private LocalDate meteringRoomDate;
+
+    @ApiModelProperty("鎵瑰噯浜烘剰瑙�")
+    private String approverOpinion;
+
+    @ApiModelProperty("鎵瑰噯浜篿d")
+    private Integer approverUserId;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private String approverUser;
+
+    @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+    private LocalDate approverDate;
+
+    @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:鎵瑰噯浜�")
+    private Integer flowType;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceState.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceState.java
new file mode 100644
index 0000000..4b829d4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceState.java
@@ -0,0 +1,107 @@
+package com.yuanchu.mom.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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-09-26 09:51:40
+ */
+@Getter
+@Setter
+@TableName("device_state")
+@ApiModel(value = "DeviceState瀵硅薄", description = "璁惧鍋滅敤/鍚敤")
+public class DeviceState implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("璁惧鍋滅敤鍚敤id")
+    @TableId(value = "state_id", type = IdType.AUTO)
+    private Integer stateId;
+
+    @ApiModelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("0閰嶄欢")
+    private String accessoryPart;
+
+    @ApiModelProperty("0璁惧鐘舵��")
+    private String deviceStatus;
+
+    @ApiModelProperty("0鍋滅敤鍚敤鐞嗙敱")
+    private String reason;
+
+    @ApiModelProperty("0涓嬬幆鑺傝矗浠讳汉")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("0鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("0鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentReviewOpinion;
+
+    @ApiModelProperty("1涓嬬幆鑺傝矗浠讳汉")
+    private String departmentNextPesponsible;
+
+    @ApiModelProperty("1鎿嶄綔浜�")
+    private String departmentOperatingPersonnel;
+
+    @ApiModelProperty("1鏃ユ湡")
+    private LocalDateTime departmentDate;
+
+    @ApiModelProperty("2璁¢噺瀹ゆ剰瑙�")
+    private String measuringRoomReviewOpinion;
+
+    @ApiModelProperty("2涓嬬幆鑺傝矗浠讳汉")
+    private String measuringRoomNextPesponsible;
+
+    @ApiModelProperty("2鎿嶄綔浜�")
+    private String measuringRoomOperatingPersonnel;
+
+    @ApiModelProperty("2鏃ユ湡")
+    private LocalDateTime measuringRoomDate;
+
+    @ApiModelProperty("3鎵瑰噯鎰忚")
+    private String approvalOpinion;
+
+    @ApiModelProperty("3涓嬬幆鑺傝矗浠讳汉")
+    private String approvalNextPesponsible;
+
+    @ApiModelProperty("3鎿嶄綔浜�")
+    private String approvalOperatingPersonnel;
+
+    @ApiModelProperty("3鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("璁惧Id")
+    private Integer deviceId;
+
+    @ApiModelProperty("褰撳墠鐜妭璐熻矗浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鎻愪氦浜�")
+    @ExcelProperty(value = "鎻愪氦浜�")
+    private String createUser;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagement.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagement.java
new file mode 100644
index 0000000..0398118
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagement.java
@@ -0,0 +1,77 @@
+package com.yuanchu.mom.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.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:44
+ */
+@Getter
+@Setter
+@TableName("device_traceability_management")
+@ApiModel(value = "DeviceTraceabilityManagement瀵硅薄", description = "璁惧閲忓�兼函婧愯鍒掕〃")
+public class DeviceTraceabilityManagement {
+
+    @ApiModelProperty("璁惧閲忓�兼函婧愯鍒抜d")
+    @TableId(value = "traceability_management_id", type = IdType.AUTO)
+    private Integer traceabilityManagementId;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("璁″垝鍚嶇О")
+    private String planName;
+
+    @ApiModelProperty("璁″垝骞翠唤")
+    private String planYear;
+
+    @ApiModelProperty("缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @ApiModelProperty("缂栧埗浜�")
+    private String compiler;
+
+    @ApiModelProperty("缂栧埗鏃堕棿")
+    private LocalDateTime datePreparation;
+
+    @ApiModelProperty("瀹℃牳鐘舵�侊紝0鏈鏍革紝1瀹℃牳")
+    private Integer status;
+
+    @ApiModelProperty("淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("瀹℃牳浜篿d")
+    private Integer auditId;
+
+    @ApiModelProperty("瀹℃牳浜�")
+    private String audit;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @ApiModelProperty("瀹℃牳淇℃伅")
+    private String auditRemark;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagementDetails.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagementDetails.java
new file mode 100644
index 0000000..7d00d32
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DeviceTraceabilityManagementDetails.java
@@ -0,0 +1,68 @@
+package com.yuanchu.mom.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-20 02:27:58
+ */
+@Getter
+@Setter
+@TableName("device_traceability_management_details")
+@ApiModel(value = "DeviceTraceabilityManagementDetails瀵硅薄", description = "璁惧閲忓�兼函婧愯鍒掕鎯呰〃")
+public class DeviceTraceabilityManagementDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("璁惧閲忓�兼函婧愯鍒掕鎯卛d")
+    @TableId(value = "traceability_management_detail_id", type = IdType.AUTO)
+    private Integer traceabilityManagementDetailId;
+
+    @ApiModelProperty("璁惧閲忓�兼函婧愯鍒抜d")
+    private Integer traceabilityManagementId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鎶�鏈寚鏍囧弬鏁�")
+    private String technicalIndexParameters;
+
+    @ApiModelProperty("鎶�鏈寚鏍囪姹�")
+    private String technicalRequirements;
+
+    @ApiModelProperty("妫�瀹氬懆鏈�")
+    private String verificationCycle;
+
+    @ApiModelProperty("妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/Document.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Document.java
new file mode 100644
index 0000000..bf7fa04
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Document.java
@@ -0,0 +1,91 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+@Data
+@TableName(value = "device_documents")
+public class Document implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鏂囨。绫诲瀷锛堟灇涓撅級
+     */
+    private String documentType;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐗堟湰鍙�
+     */
+    private String version;
+
+    /**
+     * 鏁伴噺
+     */
+    private Integer quantity;
+
+    /**
+     * 椤垫暟
+     */
+    private Integer pageCount;
+
+    /**
+     * 鎻愪緵鍟�
+     */
+    private String provider;
+
+    /**
+     * 鎻愪緵鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime provideDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String comments;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime createdAt;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updatedAt;
+
+    private int deviceId;
+
+    @ApiModelProperty("璧勪骇缂栧彿")
+    private String number;
+
+    @ApiModelProperty("鍘熷鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String fileName;
+
+
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentAcceptanceCheck.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentAcceptanceCheck.java
new file mode 100644
index 0000000..b45fd60
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentAcceptanceCheck.java
@@ -0,0 +1,50 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-楠屾敹鏍告煡
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:19
+ */
+@Getter
+@Setter
+@TableName("device_incident_acceptance_check")
+@ApiModel(value = "IncidentAcceptanceCheck瀵硅薄", description = "璁惧楠屾敹-楠屾敹鏍告煡")
+public class IncidentAcceptanceCheck implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer acceptanceCheckId;
+
+    @ApiModelProperty("浠櫒妯″潡")
+    private String instrumentModule;
+
+    @ApiModelProperty("鏍告煡鍙傛暟")
+    private String verificationParameter;
+
+    @ApiModelProperty("鍙帴鏀堕檺")
+    private String acceptableLimit;
+
+    @ApiModelProperty("鏍告煡缁撴灉")
+    private String verificationResult;
+
+    @ApiModelProperty("鏍告煡缁撹")
+    private String verificationConclusion;
+
+    @ApiModelProperty("璁惧楠屾敹ID")
+    private Integer incidentId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentFile.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentFile.java
new file mode 100644
index 0000000..363c580
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentFile.java
@@ -0,0 +1,40 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-鏂囦欢绫荤‘璁�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:36
+ */
+@Getter
+@Setter
+@TableName("device_incident_file")
+@ApiModel(value = "IncidentFile瀵硅薄", description = "璁惧楠屾敹-鏂囦欢绫荤‘璁�")
+public class IncidentFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer fileId;
+
+    @ApiModelProperty("搴旀湁鍐屾暟")
+    private Integer expectedCopies;
+
+    @ApiModelProperty("瀹為檯鏀跺埌鍐屾暟")
+    private Integer actualCopies;
+
+    @ApiModelProperty("璁惧楠屾敹id")
+    private Integer incidentId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentInstall.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentInstall.java
new file mode 100644
index 0000000..672319f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentInstall.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-瀹夎楠屾敹妫�鏌�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:50
+ */
+@Getter
+@Setter
+@TableName("device_incident_install")
+@ApiModel(value = "IncidentInstall瀵硅薄", description = "璁惧楠屾敹-瀹夎楠屾敹妫�鏌�")
+public class IncidentInstall implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer installId;
+
+    @ApiModelProperty("椤圭洰")
+    private String installationProject;
+
+    @ApiModelProperty("瀹夎鎯呭喌")
+    private String installationSituation;
+
+    @ApiModelProperty("瀹夎瀹屾垚")
+    private String installationCompleted;
+
+    @ApiModelProperty("璁惧楠屾敹")
+    private Integer incidentId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentReport.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentReport.java
new file mode 100644
index 0000000..179521c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentReport.java
@@ -0,0 +1,142 @@
+package com.yuanchu.mom.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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-09-19 03:54:49
+ */
+@Getter
+@Setter
+@TableName("device_incident_report")
+@ApiModel(value = "IncidentReport瀵硅薄", description = "璁惧楠屾敹娣诲姞楠屾敹瀛楁琛�")
+public class IncidentReport implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    @ApiModelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("搴忓垪鍙�")
+    private String serialNumber;
+
+    @ApiModelProperty("璁惧绫诲埆")
+    private String deviceClass;
+
+    @ApiModelProperty("寮�绠卞墠妫�鏌ュ鍖呰鏈夋棤鐮存崯")
+    private String checkOuterPackaging;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("璁惧寮�绠遍獙鏀剁粨璁�")
+    private String unpackingAcceptanceConclusion;
+
+    @ApiModelProperty("1鎻愪氦 涓嬬幆鑺傝礋璐d汉鍚嶇О")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦澶囨敞")
+    private String submitRemarks;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 澶嶆牳鎰忚")
+    private String unpackingReviewOpinion;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 涓嬬幆鑺傝礋璐d汉")
+    private String unpackingNextPesponsible;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 鎿嶄綔浜�")
+    private String unpackingOperatingPersonnel;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 鏃ユ湡")
+    private LocalDateTime unpackingDate;
+
+    @ApiModelProperty("3瀹夎浣嶇疆")
+    private String installLocation;
+
+    @ApiModelProperty("3瀹夎澶囨敞")
+    private String installRemarks;
+
+    @ApiModelProperty("3瀹夎涓嬬幆鑺傝礋璐d汉")
+    private String installNextPesponsible;
+
+    @ApiModelProperty("3瀹夎鎿嶄綔浜�")
+    private String installOperatingPersonnel;
+
+    @ApiModelProperty("3瀹夎鏃ユ湡")
+    private LocalDateTime installDate;
+
+    @ApiModelProperty("4瀹夎楠屾敹澶嶆牳鎰忚")
+    private String installationAcceptanceCompoundOpinion;
+
+    @ApiModelProperty("4瀹夎楠屾敹涓嬬幆鑺傝礋璐d汉")
+    private String installationAcceptanceNextPesponsible;
+
+    @ApiModelProperty("4瀹夎楠屾敹鎿嶄綔浜�")
+    private String installationAcceptanceOperatingPersonnel;
+
+    @ApiModelProperty("4瀹夎楠屾敹鏃ユ湡")
+    private LocalDateTime installationAcceptanceDate;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 璁惧寮�绠遍獙鏀剁粨璁�")
+    private String acceptanceCheckUnpackingConclusion;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 涓嬬幆鑺傝礋璐d汉")
+    private String acceptanceCheckNextPesponsible;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 鎿嶄綔浜�")
+    private String acceptanceCheckOperatingPersonnel;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 鏃ユ湡")
+    private LocalDateTime acceptanceCheckDate;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 瀹℃牳鎰忚")
+    private String acceptanceAuditAuditOpinion;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 鎿嶄綔浜�")
+    private String acceptanceAuditOperatingPersonnel;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 鏃ユ湡")
+    private LocalDateTime acceptanceAuditDate;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡 / 鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentSpareParts.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentSpareParts.java
new file mode 100644
index 0000000..20f2ce7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/IncidentSpareParts.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-澶囦欢纭
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:42:06
+ */
+@Getter
+@Setter
+@TableName("device_incident_spare_parts")
+@ApiModel(value = "IncidentSpareParts瀵硅薄", description = "璁惧楠屾敹-澶囦欢纭")
+public class IncidentSpareParts implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer sparePartsId;
+
+    @ApiModelProperty("鍚嶇О")
+    private String name;
+
+    @ApiModelProperty("鏁伴噺")
+    private Integer number;
+
+    @ApiModelProperty("澶囨敞")
+    private String note;
+
+    @ApiModelProperty("璁惧楠屾敹ID")
+    private Integer incidentId;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/Instruction.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Instruction.java
new file mode 100644
index 0000000..3e16b62
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Instruction.java
@@ -0,0 +1,64 @@
+package com.yuanchu.mom.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 Instruction 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-server/src/main/java/com/yuanchu/mom/pojo/OperationInstruction.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/OperationInstruction.java
new file mode 100644
index 0000000..ad91937
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/OperationInstruction.java
@@ -0,0 +1,89 @@
+package com.yuanchu.mom.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")
+@ApiModel(value = "OperationInstruction瀵硅薄", description = "璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�")
+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-server/src/main/java/com/yuanchu/mom/pojo/Reservation.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Reservation.java
new file mode 100644
index 0000000..f048e6f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/Reservation.java
@@ -0,0 +1,84 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Getter
+@Setter
+@TableName("device_reservation")
+public class Reservation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     *  璁惧id
+     */
+    private Integer deviceId;
+
+    /**
+     * 棰勫畾璁惧
+     */
+    private String deviceName;
+
+    /**
+     *  瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
+    /**
+     *  棰勫畾鏃堕棿
+     */
+
+    private String reservationTime;
+
+    /**
+     *  鍏蜂綋鏃堕棿
+     */
+    private String specificTime;
+
+
+
+    /**
+     * 鑱旂郴浜�
+     */
+    private String linkPerson;
+
+    /**
+     *  鑱旂郴鐢佃瘽
+     */
+    private String phone;
+
+    /**
+     *  娴佺▼缂栧彿
+     */
+    private String deviceNumber;
+
+    /**
+     *  棰勫畾璇存槑
+     */
+    private String reservationSpecification;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createDate;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceFileService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceFileService.java
new file mode 100644
index 0000000..8e25b77
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceFileService.java
@@ -0,0 +1,17 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileService extends IService<DeviceAcceptanceFile> {
+
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceService.java
new file mode 100644
index 0000000..0fcc541
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAcceptanceService.java
@@ -0,0 +1,39 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceAcceptance;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+public interface DeviceAcceptanceService extends IService<DeviceAcceptance> {
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance);
+
+
+    boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file);
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAccidentReportService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAccidentReportService.java
new file mode 100644
index 0000000..c7ff366
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceAccidentReportService.java
@@ -0,0 +1,41 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/service/DeviceBorrowService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBorrowService.java
new file mode 100644
index 0000000..b33cf6c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBorrowService.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceBorrow;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+public interface DeviceBorrowService extends IService<DeviceBorrow> {
+
+    Map<String,Object> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow);
+
+    int saveDeviceBorrow(DeviceBorrow deviceBorrow);
+
+    DeviceBorrow getDeviceBorrow(Integer id);
+
+    List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBreakdownMaintenanceService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBreakdownMaintenanceService.java
new file mode 100644
index 0000000..2245a26
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceBreakdownMaintenanceService.java
@@ -0,0 +1,41 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.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-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanDetailService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanDetailService.java
new file mode 100644
index 0000000..dffd454
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanDetailService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+public interface DeviceCalibrationPlanDetailService extends IService<DeviceCalibrationPlanDetail> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanService.java
new file mode 100644
index 0000000..c88037d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCalibrationPlanService.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceCalibrationPlanDto;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlan;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+public interface DeviceCalibrationPlanService extends IService<DeviceCalibrationPlan> {
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝
+     * @param calibrationPlanDto
+     * @return
+     */
+    boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
+
+    /**
+     * 瀵煎叆璁惧鏍″噯璁″垝
+     * @param file
+     * @return
+     */
+    boolean importDeviceCalibrationPlan(MultipartFile file, String planYear);
+
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @param DeviceCalibrationPlan
+     * @return
+     */
+    boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan DeviceCalibrationPlan);
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒楄〃
+     * @param page
+     * @param DeviceCalibrationPlan
+     * @return
+     */
+    IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan DeviceCalibrationPlan);
+
+    /**
+     * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param DeviceCalibrationPlanDetails
+     * @return
+     */
+    IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail DeviceCalibrationPlanDetails);
+
+
+    /**
+     * 瀵煎嚭璁惧鏍″噯璁″垝
+     *
+     * @param DeviceCalibrationPlanId
+     * @param response
+     */
+    void exportDeviceCalibrationPlanDetail(Integer DeviceCalibrationPlanId, HttpServletResponse response);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCheckService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCheckService.java
new file mode 100644
index 0000000..5485dae
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceCheckService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceCheck;
+
+public interface DeviceCheckService extends IService<DeviceCheck> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanDetailsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanDetailsService.java
new file mode 100644
index 0000000..0d2f2cc
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanDetailsService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:16
+ */
+public interface DeviceExaminePlanDetailsService extends IService<DeviceExaminePlanDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanService.java
new file mode 100644
index 0000000..b99728b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExaminePlanService.java
@@ -0,0 +1,69 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceExaminePlanDto;
+import com.yuanchu.mom.pojo.DeviceExaminePlan;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+public interface DeviceExaminePlanService extends IService<DeviceExaminePlan> {
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @param examinePlanDto
+     * @return
+     */
+    boolean addDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto);
+
+    /**
+     * 瀵煎叆璁惧鏍告煡璁″垝
+     * @param file
+     * @return
+     */
+    boolean importDeviceExaminePlan(MultipartFile file);
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @param DeviceExaminePlan
+     * @return
+     */
+    boolean ratifyDeviceExaminePlan(DeviceExaminePlan DeviceExaminePlan);
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @param page
+     * @param DeviceExaminePlan
+     * @return
+     */
+    IPage<DeviceExaminePlanDto> pageDeviceExaminePlan(Page page, DeviceExaminePlan DeviceExaminePlan);
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param DeviceExaminePlanDetails
+     * @return
+     */
+    IPage<DeviceExaminePlanDetails> pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails DeviceExaminePlanDetails);
+
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param deviceExaminePlanId 璁惧鏍告煡璁″垝id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceExaminePlanDetail(Integer deviceExaminePlanId, HttpServletResponse response);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastDetailsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastDetailsService.java
new file mode 100644
index 0000000..0611952
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastDetailsService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:57
+ */
+public interface DeviceExamineRecordContrastDetailsService extends IService<DeviceExamineRecordContrastDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastService.java
new file mode 100644
index 0000000..5e1fdb4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordContrastService.java
@@ -0,0 +1,46 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceExamineRecordContrastDto;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrast;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:43
+ */
+public interface DeviceExamineRecordContrastService extends IService<DeviceExamineRecordContrast> {
+
+    /**
+     * 鏌ヨ鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    DeviceExamineRecordContrastDto getExamineRecordContrast(Integer planDetailsId);
+
+    /**
+     * 鏂板鏍告煡瀵规瘮璁板綍
+     * @return
+     *
+     */
+    boolean addExamineRecordContrast(DeviceExamineRecordContrastDto deviceExamineRecordContrastDto);
+
+    /**
+     * 瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    boolean reviewExamineRecordContrast(DeviceExamineRecordContrastDto deviceExamineRecordContrastDto);
+
+    /**
+     * 瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍
+     *
+     * @param recordId 瀹℃牳鏍告煡瀵规瘮璁板綍id
+     * @param response
+     * @return
+     */
+    void exportReviewExamineRecordContrast(Integer recordId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordDetailService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordDetailService.java
new file mode 100644
index 0000000..5ea8d87
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordDetailService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceExamineRecordDetail;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:15:11
+ */
+public interface DeviceExamineRecordDetailService extends IService<DeviceExamineRecordDetail> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordService.java
new file mode 100644
index 0000000..cf52709
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExamineRecordService.java
@@ -0,0 +1,43 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceExamineRecordDto;
+import com.yuanchu.mom.pojo.DeviceExamineRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:28
+ */
+public interface DeviceExamineRecordService extends IService<DeviceExamineRecord> {
+
+    /**
+     * 鏌ヨ鏍告煡璁板綍
+     * @return
+     */
+    DeviceExamineRecordDto getExamineRecord(Integer planDetailsId);
+
+    /**
+     * 鏂板鏍告煡璁板綍
+     * @return
+     */
+    boolean addExamineRecord(DeviceExamineRecordDto deviceExamineRecordDto);
+
+    /**
+     * 澶嶆牳鏍告煡璁板綍
+     * @return
+     */
+    boolean reviewExamineRecord(DeviceExamineRecordDto deviceExamineRecordDto);
+
+    /**
+     * 瀵煎嚭澶嶆牳鏍告煡璁板綍
+     * @param planDetailsId
+     * @param response 鍝嶅簲
+     */
+    void exportReviewExamineRecordDetail(Integer planDetailsId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExternalApplyService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExternalApplyService.java
new file mode 100644
index 0000000..f5cf59d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceExternalApplyService.java
@@ -0,0 +1,42 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceExternalApply;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍒╃敤澶栭儴璁惧鐢宠琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 10:28:43
+ */
+public interface DeviceExternalApplyService extends IService<DeviceExternalApply> {
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @param page
+     * @param deviceExternalApply
+     * @return
+     */
+    IPage<DeviceExternalApply> pageDeviceExternalApply(Page page, DeviceExternalApply deviceExternalApply);
+
+    /**
+     * 鏂板鍒╃敤澶栭儴璁惧鐢宠
+     * @param deviceExternalApply
+     * @return
+     */
+    boolean addDeviceExternalApply(DeviceExternalApply deviceExternalApply);
+
+    /**
+     * 瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠
+     *
+     * @param externalApplyId 澶栭儴璁惧鐢宠id
+     * @param response
+     */
+    void exportDeviceExternalApply(Integer externalApplyId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultOneService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultOneService.java
new file mode 100644
index 0000000..84a545a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultOneService.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceFaultOneDto;
+import com.yuanchu.mom.pojo.DeviceFaultOne;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+public interface DeviceFaultOneService extends IService<DeviceFaultOne> {
+
+    IPage<DeviceFaultOneDto> deviceFaultOnePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultService.java
new file mode 100644
index 0000000..e0cc5ab
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceFaultService.java
@@ -0,0 +1,10 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceFault;
+
+import java.util.Map;
+
+public interface DeviceFaultService extends IService<DeviceFault> {
+    Map<String,Object> findByDeviceId(Integer deviceId);
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordDetailsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordDetailsService.java
new file mode 100644
index 0000000..8c3bd6f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordDetailsService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordService.java
new file mode 100644
index 0000000..59dd4e2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceInspectionRecordService.java
@@ -0,0 +1,69 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceInspectionRecordDto;
+import com.yuanchu.mom.pojo.DeviceInspectionRecord;
+import com.yuanchu.mom.vo.Result;
+
+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-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanDetailsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanDetailsService.java
new file mode 100644
index 0000000..3ffd81c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanDetailsService.java
@@ -0,0 +1,17 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:11:46
+ */
+public interface DeviceMaintenancePlanDetailsService extends IService<DeviceMaintenancePlanDetails> {
+
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanService.java
new file mode 100644
index 0000000..bde6a68
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenancePlanService.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceMaintenancePlanDto;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlan;
+import com.yuanchu.mom.vo.Result;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:10:52
+ */
+public interface DeviceMaintenancePlanService extends IService<DeviceMaintenancePlan> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     * @param page 褰撳墠椤�
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     * @return
+     */
+    Result<IPage<DeviceMaintenancePlan>> selectDeviceMaintenancePlanByPage(IPage page, DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+    /**
+     * 鏂板璁惧淇濆吇璁″垝
+     *
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    Result addMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+    /**
+     * 淇敼璁惧淇濆吇璁″垝
+     *
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    Result updateMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+    /**
+     * 鍒犻櫎璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+    /**
+     * 瀵煎嚭璁惧淇濆吇璁″垝
+     *
+     * @param maintenancePlanId 璁惧淇濆吇璁″垝id
+     * @param response          鍝嶅簲
+     */
+    Result exportDeviceMaintenancePlanDto(Integer maintenancePlanId, HttpServletResponse response);
+
+    /**
+     * 鏌ョ湅璁惧淇濆吇璁″垝璇︽儏
+     * @param maintenancePlanId 璁惧淇濆吇璁″垝id
+     * @return
+     */
+    Result<DeviceMaintenancePlanDto> getMaintenancePlanDetail(Integer maintenancePlanId);
+
+    /**
+     * 瀹℃牳璁惧淇濆吇璁″垝鐘舵��
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     * @return
+     */
+    Result reviewMaintenancePlanStatus(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenanceService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenanceService.java
new file mode 100644
index 0000000..0b8e1d3
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMaintenanceService.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.excel.DeviceMaintenanceExport;
+import com.yuanchu.mom.pojo.DeviceMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface DeviceMaintenanceService extends IService<DeviceMaintenance> {
+    IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber);
+
+    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+
+    /**
+     * 瀵煎嚭Word璁惧缁存姢璁板綍
+     *
+     * @param deviceId
+     * @param response
+     */
+    void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricRecordService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricRecordService.java
new file mode 100644
index 0000000..be629d1
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricRecordService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordService extends IService<DeviceMetricRecord> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricsCopyService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricsCopyService.java
new file mode 100644
index 0000000..881e1a1
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceMetricsCopyService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyService extends IService<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceRecordService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceRecordService.java
new file mode 100644
index 0000000..bf261f4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceRecordService.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceRecordDto;
+import com.yuanchu.mom.pojo.DeviceRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+public interface DeviceRecordService extends IService<DeviceRecord> {
+
+    IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber);
+
+
+    /**
+     * 瀵煎嚭璁惧浣跨敤璁板綍
+     *
+     * @param deviceId
+     * @param response
+     */
+    void exportUseRecord(Integer deviceId, String exportDate, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceScrappedService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceScrappedService.java
new file mode 100644
index 0000000..5d93aa7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceScrappedService.java
@@ -0,0 +1,43 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceScrapped;
+import com.yuanchu.mom.vo.Result;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+public interface DeviceScrappedService extends IService<DeviceScrapped> {
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @param page
+     * @param deviceScrapped
+     * @return
+     */
+    IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped);
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     * @param deviceScrapped
+     * @return
+     */
+    boolean addDeviceScrapped(DeviceScrapped deviceScrapped);
+
+    /**
+     * 淇敼璁惧鎶ュ簾鐢宠
+     * @param scrappedId 璁惧鎶ュ簾鐢宠id
+     * @return
+     */
+    Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java
index e1e034d..4f08b8b 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceService.java
@@ -19,7 +19,7 @@
 
     List<User> selectUserList();
 
-    Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter);
+    Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter,Boolean laboratoryNameIsNull);
 
     int addDeviceParameter(Device itemParameter);
 
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceStateService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceStateService.java
new file mode 100644
index 0000000..ff9fbbf
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceStateService.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceStateDto;
+import com.yuanchu.mom.pojo.DeviceState;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateService extends IService<DeviceState> {
+
+    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+
+    /**
+     * 瀵煎嚭璁惧鐘舵��
+     *
+     * @param deviceId
+     * @param processNumber
+     * @param response
+     */
+    void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementDetailsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementDetailsService.java
new file mode 100644
index 0000000..297a544
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementDetailsService.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:58
+ */
+public interface DeviceTraceabilityManagementDetailsService extends IService<DeviceTraceabilityManagementDetails> {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementService.java
new file mode 100644
index 0000000..7a406ee
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DeviceTraceabilityManagementService.java
@@ -0,0 +1,61 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceTraceabilityManagementDto;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagement;
+import com.yuanchu.mom.vo.Result;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:44
+ */
+public interface DeviceTraceabilityManagementService extends IService<DeviceTraceabilityManagement> {
+
+    /**
+     * 鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�
+     * @param page 鍒嗛〉鍙傛暟
+     * @param itemParameter 閲忓�兼函婧愯鍒�
+     * @return
+     */
+    Result<IPage<DeviceTraceabilityManagement>> selectDeviceTraceabilityManagementByPage(IPage page, DeviceTraceabilityManagementDto itemParameter);
+
+    /**
+     * 鏂板閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    Result addTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 淇敼閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    Result updateTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 鍒犻櫎閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 鏌ヨ閲忓�兼函婧愯鍒掕鎯�
+     */
+    Result<DeviceTraceabilityManagementDto> getTraceabilityManagementDetail(Integer traceabilityManagementId);
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鏍哥姸鎬佷慨鏀�
+     */
+    Result reviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鍑�
+     */
+    Result exportDeviceTraceabilityManagementDto(Integer traceabilityManagementId, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/DocumentService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/DocumentService.java
new file mode 100644
index 0000000..4d64b65
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/DocumentService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.Document;
+
+public interface DocumentService extends IService<Document> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLeaseService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLeaseService.java
new file mode 100644
index 0000000..c1bc242
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLeaseService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceLease;
+
+public interface IDeviceLeaseService extends IService<DeviceLease> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLogService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLogService.java
new file mode 100644
index 0000000..1442c8c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceLogService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceLog;
+
+public interface IDeviceLogService extends IService<DeviceLog> {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceMetricService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceMetricService.java
new file mode 100644
index 0000000..6d1d311
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IDeviceMetricService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.DeviceMetric;
+
+public interface IDeviceMetricService extends IService<DeviceMetric> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentAcceptanceCheckService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentAcceptanceCheckService.java
new file mode 100644
index 0000000..abb187b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentAcceptanceCheckService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.IncidentAcceptanceCheck;
+
+public interface IncidentAcceptanceCheckService extends IService<IncidentAcceptanceCheck> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentFileService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentFileService.java
new file mode 100644
index 0000000..0f92eaa
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentFileService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.IncidentFile;
+
+public interface IncidentFileService extends IService<IncidentFile> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentInstallService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentInstallService.java
new file mode 100644
index 0000000..aad567d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentInstallService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.IncidentInstall;
+
+public interface IncidentInstallService extends IService<IncidentInstall> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentReportService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentReportService.java
new file mode 100644
index 0000000..9cb895a
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentReportService.java
@@ -0,0 +1,42 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.IncidentReportAddDto;
+import com.yuanchu.mom.excel.IncidentReportExport;
+import com.yuanchu.mom.pojo.IncidentReport;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+public interface IncidentReportService extends IService<IncidentReport> {
+
+    void saveIncidentReportData(IncidentReportAddDto incidentReportAddDto);
+
+    IPage<IncidentReportAddDto> getByDeviceId(Integer deviceId, Page page, String processNumber);
+
+    void deleteIncidentReport(Integer id);
+
+    IncidentReportAddDto getShowIncidentReport(Integer id);
+
+    void deleteIncidentReportAll(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId);
+
+    List<IncidentReportExport> incidentReportExport(Integer deviceId);
+
+    /**
+     * 瀵煎嚭楠屾敹鎶ュ憡
+     * @param deviceId  璁惧id
+     * @param processNumber  娴佺▼鍙�
+     * @param response  鍝嶅簲Word鏂囨。
+     */
+    void acceptanceCertificateExport(Integer deviceId, String processNumber, HttpServletResponse response);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentSparePartsService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentSparePartsService.java
new file mode 100644
index 0000000..5074fbf
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/IncidentSparePartsService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.IncidentSpareParts;
+
+public interface IncidentSparePartsService extends IService<IncidentSpareParts> {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/InstructionService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/InstructionService.java
new file mode 100644
index 0000000..e8a033c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/InstructionService.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.InstructionDto;
+import com.yuanchu.mom.dto.OperationInstructionDto;
+import com.yuanchu.mom.pojo.Instruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionService extends IService<Instruction> {
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page, OperationInstructionDto operationInstructionDto);
+
+    void newHomeworkGuidebookAdded(InstructionDto instructionDto);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/OperationInstructionService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/OperationInstructionService.java
new file mode 100644
index 0000000..297587b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/OperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.OperationInstruction;
+import com.yuanchu.mom.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionService extends IService<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/QrShowService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/QrShowService.java
new file mode 100644
index 0000000..2a04d21
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/QrShowService.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.service;
+
+import org.springframework.ui.Model;
+
+public interface QrShowService {
+
+    void transformModelByType(Model model,String code,String type);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/ReservationService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/ReservationService.java
new file mode 100644
index 0000000..3450451
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/ReservationService.java
@@ -0,0 +1,26 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DeviceDto;
+import com.yuanchu.mom.dto.ReservationDto;
+import com.yuanchu.mom.pojo.Reservation;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationService extends IService<Reservation> {
+
+    Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime);
+
+    List<ReservationDto> selectReservationParameterPage( String deviceId, String reservationTime,  String specificTime);
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceFileServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceFileServiceImpl.java
new file mode 100644
index 0000000..ef6a8e9
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceAcceptanceFileMapper;
+import com.yuanchu.mom.pojo.DeviceAcceptanceFile;
+import com.yuanchu.mom.service.DeviceAcceptanceFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+@Service
+public class DeviceAcceptanceFileServiceImpl extends ServiceImpl<DeviceAcceptanceFileMapper, DeviceAcceptanceFile> implements DeviceAcceptanceFileService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceServiceImpl.java
new file mode 100644
index 0000000..836daa0
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAcceptanceServiceImpl.java
@@ -0,0 +1,159 @@
+package com.yuanchu.mom.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.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.DeviceAcceptanceFileMapper;
+import com.yuanchu.mom.mapper.DeviceAcceptanceMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceAcceptance;
+import com.yuanchu.mom.pojo.DeviceAcceptanceFile;
+import com.yuanchu.mom.service.DeviceAcceptanceService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.QueryWrappers;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Service
+public class DeviceAcceptanceServiceImpl extends ServiceImpl<DeviceAcceptanceMapper, DeviceAcceptance> implements DeviceAcceptanceService {
+
+    @Resource
+    private DeviceAcceptanceFileMapper deviceAcceptanceFileMapper;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    @Override
+    public IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return baseMapper.pageDeviceAcceptance(page, QueryWrappers.queryWrappers(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        if (acceptanceId == null) {
+            throw new ErrorException("缂哄皯楠屾敹id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        DeviceAcceptanceFile acceptanceFile = new DeviceAcceptanceFile();
+        acceptanceFile.setAcceptanceId(acceptanceId);
+        acceptanceFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            acceptanceFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            acceptanceFile.setType(2);
+        }
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            acceptanceFile.setFileUrl(pathName);
+            deviceAcceptanceFileMapper.insert(acceptanceFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @Override
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response) {
+        DeviceAcceptance deviceAcceptance = baseMapper.selectById(acceptanceId);
+        if (deviceAcceptance == null) {
+            throw new ErrorException("璁惧楠屾敹涓嶅瓨鍦�");
+        }
+        Device device = null;
+        if (deviceAcceptance.getDeviceId() != null) {
+            device = deviceMapper.selectById(deviceAcceptance.getDeviceId());
+        }
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/acceptance-certificate.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        Device finalDevice = device;
+        String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAcceptance", deviceAcceptance);
+                    put("device", finalDevice);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAccidentReportServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAccidentReportServiceImpl.java
new file mode 100644
index 0000000..516bc94
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceAccidentReportServiceImpl.java
@@ -0,0 +1,191 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceAccidentReportDto;
+import com.yuanchu.mom.mapper.DeviceAccidentReportMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceAccidentReport;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceAccidentReportService;
+import com.yuanchu.mom.utils.QueryWrappers;
+import com.yuanchu.mom.utils.UserUtils;
+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 GetLook getLook;
+
+    @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(getLook.selectPowerByMethodAndUserId(null).get("userId"));
+        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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBorrowServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBorrowServiceImpl.java
new file mode 100644
index 0000000..ce5b3f5
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBorrowServiceImpl.java
@@ -0,0 +1,124 @@
+package com.yuanchu.mom.service.impl;
+
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.common.PrintChina;
+import com.yuanchu.mom.mapper.DeviceBorrowMapper;
+import com.yuanchu.mom.mapper.DeviceLogMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.DeviceBorrow;
+import com.yuanchu.mom.pojo.DeviceLog;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceBorrowService;
+import com.yuanchu.mom.utils.QueryWrappers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceBorrowServiceImpl extends ServiceImpl<DeviceBorrowMapper, DeviceBorrow> implements DeviceBorrowService {
+
+    @Resource
+    DeviceBorrowMapper deviceBorrowMapper;
+
+    @Resource
+    DeviceLogMapper deviceLogMapper;
+
+    @Resource
+    GetLook getLook;
+
+    @Resource
+    UserMapper userMapper;
+
+    @Autowired
+    private NumberGenerator<DeviceBorrow> numberGenerator;
+
+    @Override
+    public Map<String, Object> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("head", PrintChina.printChina(DeviceBorrow.class));
+        IPage<DeviceBorrow> iPage = deviceBorrowMapper.deviceBorrowPage(page, QueryWrappers.queryWrappers(deviceBorrow));
+        map.put("body", iPage);
+        return map;
+    }
+
+    @Override
+    public int saveDeviceBorrow(DeviceBorrow deviceBorrow) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = userMapper.selectById(userId);
+        //鏂板鐨勬椂鍊欐坊鍔犳柊寤烘祦绋�
+        if (ObjectUtils.isEmpty(deviceBorrow.getId())) {
+            deviceBorrow.setSubmitUser(user.getName());
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceBorrow::getProcessNumber);
+            deviceBorrow.setProcessNumber(processNumber);
+            deviceBorrowMapper.insert(deviceBorrow);
+            DeviceLog deviceLog = new DeviceLog();
+            deviceLog.setOperator(user.getName());
+            deviceLog.setOperationTime(LocalDateTime.now());
+            deviceLog.setOperationType("鏂板缓");
+            deviceLog.setOperationContent("鏂板缓娴佺▼");
+            deviceLog.setRelevanceForm("device_borrow");
+            deviceLog.setRelevanceId(deviceBorrow.getId());
+            deviceLogMapper.insert(deviceLog);
+        } else {
+            DeviceBorrow borrow = deviceBorrowMapper.selectById(deviceBorrow.getId());
+            deviceBorrowMapper.updateById(deviceBorrow);
+            //閫氳繃鎴栬�呴┏鍥炲鍔犳祦绋嬭窡韪�
+            if (deviceBorrow.getNowState().equals("鍏抽棴")) {
+                DeviceLog deviceLog = new DeviceLog();
+                deviceLog.setOperator(user.getName());
+                deviceLog.setOperationTime(LocalDateTime.now());
+                deviceLog.setOperationType("鎺ユ敹閫氳繃");
+                deviceLog.setRelevanceForm("device_borrow");
+                deviceLog.setRelevanceId(deviceBorrow.getId());
+                deviceLogMapper.insert(deviceLog);
+            }
+            else if (deviceBorrow.getNowState().equals("鎻愪氦") && borrow.getNowState().equals("鎺ユ敹")) {
+                DeviceLog deviceLog = new DeviceLog();
+                deviceLog.setOperator(user.getName());
+                deviceLog.setOperationTime(LocalDateTime.now());
+                deviceLog.setOperationType("鎺ユ敹椹冲洖");
+                deviceLog.setRelevanceForm("device_borrow");
+                deviceLog.setRelevanceId(deviceBorrow.getId());
+                deviceLogMapper.insert(deviceLog);
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public DeviceBorrow getDeviceBorrow(Integer id) {
+        List<DeviceLog> deviceLogs = deviceLogMapper.selectList(Wrappers.<DeviceLog>lambdaQuery()
+                .eq(DeviceLog::getRelevanceForm, "device_borrow")
+                .eq(DeviceLog::getRelevanceId, id));
+        DeviceBorrow deviceBorrow = deviceBorrowMapper.selectById(id);
+        deviceBorrow.setDeviceLogs(deviceLogs);
+        return deviceBorrow;
+    }
+
+    @Override
+    public List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId) {
+        return deviceBorrowMapper.getDeviceBorrowBydeviceId(deviceId);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBreakdownMaintenanceServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
new file mode 100644
index 0000000..1475979
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -0,0 +1,154 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.mapper.DeviceBreakdownMaintenanceMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceBreakdownMaintenance;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceBreakdownMaintenanceService;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+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 GetLook getLook;
+    @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(getLook.selectPowerByMethodAndUserId(null).get("userId"));
+
+        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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanDetailServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
new file mode 100644
index 0000000..5c9ea18
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceCalibrationPlanDetailMapper;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import com.yuanchu.mom.service.DeviceCalibrationPlanDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+@Service
+public class DeviceCalibrationPlanDetailServiceImpl extends ServiceImpl<DeviceCalibrationPlanDetailMapper, DeviceCalibrationPlanDetail> implements DeviceCalibrationPlanDetailService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanServiceImpl.java
new file mode 100644
index 0000000..de965da
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCalibrationPlanServiceImpl.java
@@ -0,0 +1,252 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceCalibrationPlanDetailDto;
+import com.yuanchu.mom.dto.DeviceCalibrationPlanDto;
+import com.yuanchu.mom.excel.upload.DeviceCalibrationPlanDetailUpload;
+import com.yuanchu.mom.mapper.DeviceCalibrationPlanDetailMapper;
+import com.yuanchu.mom.mapper.DeviceCalibrationPlanMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlan;
+import com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail;
+import com.yuanchu.mom.service.DeviceCalibrationPlanDetailService;
+import com.yuanchu.mom.service.DeviceCalibrationPlanService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceCalibrationPlanServiceImpl extends ServiceImpl<DeviceCalibrationPlanMapper, DeviceCalibrationPlan> implements DeviceCalibrationPlanService {
+
+    @Resource
+    private DeviceCalibrationPlanDetailMapper deviceCalibrationPlanDetailMapper;
+    @Resource
+    private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private GetLook getLook;
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝
+     * @param calibrationPlanDto
+     * @return
+     */
+    @Override
+    public boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        // 缂栧埗鏃ユ湡
+        calibrationPlanDto.setWriteUserId(userId);
+        calibrationPlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(calibrationPlanDto);
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
+            for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
+                calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
+            }
+            deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
+        }
+
+        return true;
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍″噯璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importDeviceCalibrationPlan(MultipartFile file, String planYear) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        DeviceCalibrationPlan calibrationPlan = new DeviceCalibrationPlan();
+        calibrationPlan.setPlanName(fileName);
+        calibrationPlan.setPlanYear(planYear);
+        calibrationPlan.setWriteUserId(userId);
+        calibrationPlan.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(calibrationPlan);
+
+        List<DeviceCalibrationPlanDetail> detailsUploadList = new ArrayList<>();
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), DeviceCalibrationPlanDetailUpload.class, new AnalysisEventListener<DeviceCalibrationPlanDetailUpload>() {
+                @Override
+                public void invoke(DeviceCalibrationPlanDetailUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
+                            StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
+                        // 瀵硅薄澶嶅埗
+                        DeviceCalibrationPlanDetail calibrationPlanDetail = new DeviceCalibrationPlanDetail();
+                        BeanUtils.copyProperties(detailsUpload, calibrationPlanDetail);
+                        // 鏍煎紡璇濇渶杩戞瀹氭椂闂村拰鏈勾璁″垝鏍″噯鏃堕棿
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
+                        calibrationPlanDetail.setLastDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
+                        calibrationPlanDetail.setPlanDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
+
+                        calibrationPlanDetail.setPlanId(calibrationPlan.getPlanId());
+                        detailsUploadList.add(calibrationPlanDetail);
+                    }
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            deviceCalibrationPlanDetailService.saveBatch(detailsUploadList);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @param deviceCalibrationPlan
+     * @return
+     */
+    @Override
+    public boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
+                .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
+                .set(DeviceCalibrationPlan::getRatifyUserId, userId)
+                .set(DeviceCalibrationPlan::getRatifyRemark, deviceCalibrationPlan.getRatifyRemark())
+                .set(DeviceCalibrationPlan::getRatifyStatus, deviceCalibrationPlan.getRatifyStatus())
+                .set(DeviceCalibrationPlan::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒楄〃
+     * @param page
+     * @param deviceCalibrationPlan
+     * @return
+     */
+    @Override
+    public IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan) {
+        return baseMapper.pageDeviceCalibrationPlan(page, QueryWrappers.queryWrappers(deviceCalibrationPlan));
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param deviceCalibrationPlanDetails
+     * @return
+     */
+    @Override
+    public IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
+        if (deviceCalibrationPlanDetails.getPlanId() == null) {
+            return new Page();
+        }
+        return deviceCalibrationPlanDetailMapper.pageDeviceCalibrationPlanDetail(page, QueryWrappers.queryWrappers(deviceCalibrationPlanDetails));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍″噯璁″垝
+     * @param deviceCalibrationPlanId
+     * @param response
+     */
+    @Override
+    public void exportDeviceCalibrationPlanDetail(Integer deviceCalibrationPlanId, HttpServletResponse response) {
+        // 鏌ヨ璁惧鏍″噯璁″垝
+        DeviceCalibrationPlan deviceCalibrationPlan = baseMapper.selectById(deviceCalibrationPlanId);
+        DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
+        BeanUtils.copyProperties(deviceCalibrationPlan, deviceCalibrationPlanDto);
+        // 璁剧疆缂栧埗鍜屾壒鍑嗘椂闂存牸寮�
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        deviceCalibrationPlanDto.setWriteTimeStr(deviceCalibrationPlan.getWriteTime() == null ? null : deviceCalibrationPlan.getWriteTime().format(formatter));
+        deviceCalibrationPlanDto.setRatifyTimeStr(deviceCalibrationPlan.getRatifyTime() == null ? null : deviceCalibrationPlan.getRatifyTime().format(formatter));
+
+        // 鏌ヨ璁惧鏍″噯璁″垝璇︽儏
+        List<DeviceCalibrationPlanDetail> deviceCalibrationPlanDetailList = deviceCalibrationPlanDetailMapper.selectList(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, deviceCalibrationPlanId));
+        // 璁剧疆搴忓彿 鍜� 鏃堕棿
+        ArrayList<DeviceCalibrationPlanDetailDto> deviceCalibrationPlanDetailDtoList = new ArrayList<>();
+        deviceCalibrationPlanDetailList.forEach(deviceCalibrationPlanDetail -> {
+            DeviceCalibrationPlanDetailDto deviceCalibrationPlanDetailDto = new DeviceCalibrationPlanDetailDto();
+            BeanUtils.copyProperties(deviceCalibrationPlanDetail, deviceCalibrationPlanDetailDto);
+            deviceCalibrationPlanDetailDto.setIndex(deviceCalibrationPlanDetailList.indexOf(deviceCalibrationPlanDetail) + 1);
+            deviceCalibrationPlanDetailDto.setLastDateStr((deviceCalibrationPlanDetail.getLastDate().format(formatter)));
+            deviceCalibrationPlanDetailDto.setPlanDateStr((deviceCalibrationPlanDetail.getPlanDate().format(formatter)));
+            deviceCalibrationPlanDetailDtoList.add(deviceCalibrationPlanDetailDto);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-calibration-plan.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceCalibrationPlanDetailDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceCalibrationPlan", deviceCalibrationPlanDto);
+                    put("deviceCalibrationPlanDetailDtoList", deviceCalibrationPlanDetailDtoList);
+                    //鑾峰彇缂栧埗浜虹殑绛惧悕鍦板潃
+                    put("organizationUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getRatifyUserId()));
+                    //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+                    put("approvedUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getWriteUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧鏍″噯璁″垝琛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCheckServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCheckServiceImpl.java
new file mode 100644
index 0000000..a9dbfb2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceCheckServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceCheckMapper;
+import com.yuanchu.mom.pojo.DeviceCheck;
+import com.yuanchu.mom.service.DeviceCheckService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceCheckServiceImpl extends ServiceImpl<DeviceCheckMapper, DeviceCheck> implements DeviceCheckService {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanDetailsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..c6302d1
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import com.yuanchu.mom.service.DeviceExaminePlanDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:16
+ */
+@Service
+public class DeviceExaminePlanDetailsServiceImpl extends ServiceImpl<DeviceExaminePlanDetailsMapper, DeviceExaminePlanDetails> implements DeviceExaminePlanDetailsService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanServiceImpl.java
new file mode 100644
index 0000000..0abd5e4
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExaminePlanServiceImpl.java
@@ -0,0 +1,254 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceExaminePlanDetailsDto;
+import com.yuanchu.mom.dto.DeviceExaminePlanDto;
+import com.yuanchu.mom.excel.upload.DeviceExaminePlanUpload;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper;
+import com.yuanchu.mom.mapper.DeviceExaminePlanMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceExaminePlan;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceExaminePlanDetailsService;
+import com.yuanchu.mom.service.DeviceExaminePlanService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceExaminePlanServiceImpl extends ServiceImpl<DeviceExaminePlanMapper, DeviceExaminePlan> implements DeviceExaminePlanService {
+
+    @Resource
+    private DeviceExaminePlanDetailsMapper deviceExaminePlanDetailsMapper;
+    @Resource
+    private DeviceExaminePlanDetailsService deviceExaminePlanDetailsService;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private GetLook getLook;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @param examinePlanDto
+     * @return
+     */
+    @Override
+    public boolean addDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        // 鏂囦欢鍚嶇О
+        examinePlanDto.setWriteUserId(userId);
+        examinePlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(examinePlanDto);
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(examinePlanDto.getExaminePlanDetailsList())) {
+            for (DeviceExaminePlanDetails deviceExaminePlanDetails : examinePlanDto.getExaminePlanDetailsList()) {
+                deviceExaminePlanDetails.setPlanId(examinePlanDto.getPlanId());
+            }
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDto.getExaminePlanDetailsList());
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍告煡璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importDeviceExaminePlan(MultipartFile file) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        DeviceExaminePlan examinePlan = new DeviceExaminePlan();
+        examinePlan.setPlanName(fileName);
+        examinePlan.setWriteUserId(userId);
+        examinePlan.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(examinePlan);
+
+        List<DeviceExaminePlanDetails> examinePlanDetails = new ArrayList<>();
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), DeviceExaminePlanUpload.class, new AnalysisEventListener<DeviceExaminePlanUpload>() {
+                @Override
+                public void invoke(DeviceExaminePlanUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
+                            StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
+                        // 瀵硅薄澶嶅埗
+                        DeviceExaminePlanDetails planDetails = new DeviceExaminePlanDetails();
+                        BeanUtils.copyProperties(detailsUpload, planDetails);
+
+                        planDetails.setPlanId(examinePlan.getPlanId());
+                        examinePlanDetails.add(planDetails);
+                    }
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            for (DeviceExaminePlanDetails examinePlanDetail : examinePlanDetails) {
+                Device device = deviceMapper.selectOne(Wrappers.<Device>lambdaQuery()
+                        .eq(Device::getManagementNumber, examinePlanDetail.getDeviceNumber().trim()));
+                if (device == null) {
+                    throw new ErrorException("璁惧缂栧彿" + examinePlanDetail.getDeviceNumber() + "鏈煡璇㈠埌璁惧, 璇烽噸鏂板鍏�");
+                }
+                User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                        .eq(User::getName, examinePlanDetail.getCheckChargerUser()));
+                if (user == null) {
+                    throw new ErrorException("璁惧缂栧彿" + examinePlanDetail.getDeviceNumber() + "鏈煡璇㈠埌鏍告煡浜�");
+                }
+                examinePlanDetail.setDeviceId(device.getId());
+                examinePlanDetail.setCheckChargerUserId(user.getId());
+            }
+
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDetails);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public boolean ratifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        baseMapper.update(null, Wrappers.<DeviceExaminePlan>lambdaUpdate()
+                .eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
+                .set(DeviceExaminePlan::getRatifyUserId, userId)
+                .set(DeviceExaminePlan::getRatifyRemark, deviceExaminePlan.getRatifyRemark())
+                .set(DeviceExaminePlan::getRatifyStatus, deviceExaminePlan.getRatifyStatus())
+                .set(DeviceExaminePlan::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @param page
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public IPage<DeviceExaminePlanDto> pageDeviceExaminePlan(Page page, DeviceExaminePlan deviceExaminePlan) {
+        return baseMapper.deviceExaminePlanDetailsMapper(page, QueryWrappers.queryWrappers(deviceExaminePlan));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param deviceExaminePlanDetails
+     * @return
+     */
+    @Override
+    public IPage<DeviceExaminePlanDetails> pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails deviceExaminePlanDetails) {
+        if (deviceExaminePlanDetails.getPlanId() == null) {
+            return new Page();
+        }
+        return deviceExaminePlanDetailsMapper.pageDeviceExaminePlanDetail(page, QueryWrappers.queryWrappers(deviceExaminePlanDetails));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param deviceExaminePlanId 璁惧鏍告煡璁″垝id
+     * @param response 鍝嶅簲浣�
+     */
+    @Override
+    public void exportDeviceExaminePlanDetail(Integer deviceExaminePlanId, HttpServletResponse response) {
+        // 鏌ヨ璁惧鏍告煡璁″垝
+        DeviceExaminePlanDto deviceExaminePlanDto = baseMapper.selectExamineExaminePlanDto(deviceExaminePlanId);
+
+        // 鏌ヨ璁惧鏍告煡璁″垝璇︽儏
+        List<DeviceExaminePlanDetails> deviceExaminePlanDetailsList = deviceExaminePlanDetailsMapper.selectList(Wrappers.<DeviceExaminePlanDetails>lambdaQuery().eq(DeviceExaminePlanDetails::getPlanId, deviceExaminePlanId));
+        // 璁剧疆搴忓彿
+        ArrayList<DeviceExaminePlanDetailsDto> deviceExaminePlanDetailsDtoList = new ArrayList<>();
+        deviceExaminePlanDetailsList.forEach(deviceExamineRecordContrastDetail -> {
+            DeviceExaminePlanDetailsDto deviceExaminePlanDetailsDto = new DeviceExaminePlanDetailsDto();
+            BeanUtils.copyProperties(deviceExamineRecordContrastDetail, deviceExaminePlanDetailsDto);
+            deviceExaminePlanDetailsDto.setIndex(deviceExaminePlanDetailsList.indexOf(deviceExamineRecordContrastDetail) + 1);
+            deviceExaminePlanDetailsDtoList.add(deviceExaminePlanDetailsDto);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/examine-plan-detail.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceExaminePlanDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceExaminePlan", deviceExaminePlanDto);
+                    put("deviceExaminePlanDetailsDtoList", deviceExaminePlanDetailsDtoList);
+                    //鑾峰彇鏍告煡浜虹殑绛惧悕鍦板潃
+                    put("writeUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getWriteUserId()));
+                    //鑾峰彇瀹℃煡浜虹殑绛惧悕鍦板潃
+                    put("reviewUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getRatifyUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧鏍告煡璁″垝", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java
new file mode 100644
index 0000000..2be725c
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceExamineRecordContrastDetailsMapper;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+import com.yuanchu.mom.service.DeviceExamineRecordContrastDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:57
+ */
+@Service
+public class DeviceExamineRecordContrastDetailsServiceImpl extends ServiceImpl<DeviceExamineRecordContrastDetailsMapper, DeviceExamineRecordContrastDetails> implements DeviceExamineRecordContrastDetailsService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastServiceImpl.java
new file mode 100644
index 0000000..8fcb01b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordContrastServiceImpl.java
@@ -0,0 +1,195 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceExamineRecordContrastDetailsDto;
+import com.yuanchu.mom.dto.DeviceExamineRecordContrastDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper;
+import com.yuanchu.mom.mapper.DeviceExamineRecordContrastMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceExaminePlanDetails;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrast;
+import com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceExamineRecordContrastDetailsService;
+import com.yuanchu.mom.service.DeviceExamineRecordContrastService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+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.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:43
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceExamineRecordContrastServiceImpl extends ServiceImpl<DeviceExamineRecordContrastMapper, DeviceExamineRecordContrast> implements DeviceExamineRecordContrastService {
+
+    @Resource
+    private DeviceExamineRecordContrastDetailsService deviceExamineRecordContrastDetailsService;
+    @Resource
+    private DeviceExaminePlanDetailsMapper deviceExaminePlanDetailsMapper;
+    @Resource
+    private GetLook getLook;
+    @Resource
+    private UserMapper userMapper;
+    /**
+     * 鏌ヨ鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Override
+    public DeviceExamineRecordContrastDto getExamineRecordContrast(Integer planDetailsId) {
+        DeviceExamineRecordContrastDto contrastDto = baseMapper.getExamineRecordContrast(planDetailsId);
+        // 鍒ゆ柇鏄惁涓虹┖
+        if (contrastDto == null) {
+            contrastDto = new DeviceExamineRecordContrastDto();
+            // 鏌ヨ璁惧璇︽儏
+            DeviceExaminePlanDetails deviceExaminePlanDetails = deviceExaminePlanDetailsMapper.selectById(planDetailsId);
+            contrastDto.setPlanDetailsId(deviceExaminePlanDetails.getPlanDetailsId());
+
+        } else {
+            // 鏌ヨ璇︽儏
+            List<DeviceExamineRecordContrastDetails> list = deviceExamineRecordContrastDetailsService.list(Wrappers.<DeviceExamineRecordContrastDetails>lambdaQuery()
+                    .eq(DeviceExamineRecordContrastDetails::getRecordContrastId, contrastDto.getRecordContrastId()));
+            contrastDto.setRecordContrastDetailsList(list);
+        }
+
+        return contrastDto;
+    }
+
+    /**
+     * 鏂板鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Override
+    public boolean addExamineRecordContrast(DeviceExamineRecordContrastDto dto) {
+        if (dto.getPlanDetailsId() == null) {
+            throw new ErrorException("缂哄皯璁″垝璇︾粏淇℃伅id");
+        }
+        if (dto.getRecordContrastId() == null) {
+            Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+            User user = userMapper.selectById(userId);
+            dto.setCheckerUserId(userId);
+            dto.setCheckerUser(user.getName());
+
+            // 鏌ヨ瀹℃煡浜篿d
+            if (dto.getReviewUserId() != null) {
+                User reviewUser = userMapper.selectById(dto.getReviewUserId());
+                dto.setReviewUser(reviewUser.getName());
+            }
+        }
+        this.saveOrUpdate(dto);
+
+        // 鍒犻櫎鍏ㄩ儴璇︽儏
+        deviceExamineRecordContrastDetailsService.remove(Wrappers.<DeviceExamineRecordContrastDetails>lambdaQuery()
+                .eq(DeviceExamineRecordContrastDetails::getRecordContrastId, dto.getRecordContrastId()));
+        //娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(dto.getRecordContrastDetailsList())) {
+            for (DeviceExamineRecordContrastDetails details : dto.getRecordContrastDetailsList()) {
+                details.setRecordContrastId(dto.getRecordContrastId());
+            }
+            deviceExamineRecordContrastDetailsService.saveBatch(dto.getRecordContrastDetailsList());
+        }
+        return false;
+    }
+
+
+    /**
+     * 瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Override
+    public boolean reviewExamineRecordContrast(DeviceExamineRecordContrastDto dto) {
+        if (dto.getPlanDetailsId() == null) {
+            throw new ErrorException("缂哄皯璁″垝璇︾粏淇℃伅id");
+        }
+        LambdaUpdateWrapper<DeviceExamineRecordContrast> wrapper = Wrappers.<DeviceExamineRecordContrast>lambdaUpdate()
+                .eq(DeviceExamineRecordContrast::getPlanDetailsId, dto.getPlanDetailsId())
+                .set(DeviceExamineRecordContrast::getReviewStatus, dto.getReviewStatus())
+                .set(DeviceExamineRecordContrast::getReviewRemark, dto.getReviewRemark())
+                .set(DeviceExamineRecordContrast::getReviewTime, LocalDateTime.now());
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (dto.getReviewStatus().equals(0)) {
+            wrapper.set(DeviceExamineRecordContrast::getReviewUserId, null)
+                    .set(DeviceExamineRecordContrast::getReviewUser, null);
+        }
+
+        this.update(wrapper);
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍
+     *
+     * @param planDetailsId 璇︽儏id
+     * @param response
+     */
+    @Override
+    public void exportReviewExamineRecordContrast(Integer planDetailsId, HttpServletResponse response) {
+        // 鏌ヨ瀵规瘮璁板綍
+        DeviceExamineRecordContrastDto deviceExamineRecordContrast = baseMapper.selectExamineRecordContrastDto(planDetailsId);
+
+        // 鏌ヨ瀵规瘮璁板綍璇︽儏
+        List<DeviceExamineRecordContrastDetails> deviceExamineRecordContrastDetailList = deviceExamineRecordContrastDetailsService.list(Wrappers.<DeviceExamineRecordContrastDetails>lambdaQuery().eq(DeviceExamineRecordContrastDetails::getRecordContrastId, deviceExamineRecordContrast.getRecordContrastId()));
+        // 璁剧疆搴忓彿
+        ArrayList<DeviceExamineRecordContrastDetailsDto> deviceExamineRecordContrastDetailsDtoList = new ArrayList<>();
+        deviceExamineRecordContrastDetailList.forEach(deviceExamineRecordContrastDetail -> {
+            DeviceExamineRecordContrastDetailsDto deviceExamineRecordContrastDetailsDto = new DeviceExamineRecordContrastDetailsDto();
+            BeanUtils.copyProperties(deviceExamineRecordContrastDetail, deviceExamineRecordContrastDetailsDto);
+            deviceExamineRecordContrastDetailsDto.setIndex(deviceExamineRecordContrastDetailList.indexOf(deviceExamineRecordContrastDetail) + 1);
+            deviceExamineRecordContrastDetailsDtoList.add(deviceExamineRecordContrastDetailsDto);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/review-examine-record-contrast.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceExamineRecordContrastDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceExamineRecordContrast", deviceExamineRecordContrast);
+                    put("deviceExamineRecordContrastDetailsDtoList", deviceExamineRecordContrastDetailsDtoList);
+                    //鑾峰彇鏍告煡浜虹殑绛惧悕鍦板潃
+                    put("checkerUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExamineRecordContrast.getCheckerUserId()));
+                    //鑾峰彇瀹℃煡浜虹殑绛惧悕鍦板潃
+                    put("reviewUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExamineRecordContrast.getReviewUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "瀹℃牳鏍告煡瀵规瘮璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordDetailServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordDetailServiceImpl.java
new file mode 100644
index 0000000..642f032
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceExamineRecordDetailMapper;
+import com.yuanchu.mom.pojo.DeviceExamineRecordDetail;
+import com.yuanchu.mom.service.DeviceExamineRecordDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:15:11
+ */
+@Service
+public class DeviceExamineRecordDetailServiceImpl extends ServiceImpl<DeviceExamineRecordDetailMapper, DeviceExamineRecordDetail> implements DeviceExamineRecordDetailService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordServiceImpl.java
new file mode 100644
index 0000000..51a1cd7
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExamineRecordServiceImpl.java
@@ -0,0 +1,196 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceExamineRecordDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper;
+import com.yuanchu.mom.mapper.DeviceExamineRecordMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.*;
+import com.yuanchu.mom.service.DeviceExamineRecordDetailService;
+import com.yuanchu.mom.service.DeviceExamineRecordService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+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.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:28
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceExamineRecordServiceImpl extends ServiceImpl<DeviceExamineRecordMapper, DeviceExamineRecord> implements DeviceExamineRecordService {
+
+    @Resource
+    private DeviceExamineRecordDetailService deviceExamineRecordDetailService;
+    @Resource
+    private DeviceExaminePlanDetailsMapper deviceExaminePlanDetailsMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private GetLook getLook;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鏌ヨ鏍告煡璁板綍
+     *
+     * @return
+     */
+    @Override
+    public DeviceExamineRecordDto getExamineRecord(Integer planDetailsId) {
+        DeviceExamineRecordDto deviceExamineRecord = baseMapper.getExamineRecord(planDetailsId);
+
+        // 鍒ゆ柇鏄惁涓虹┖
+        if (deviceExamineRecord == null) {
+            deviceExamineRecord = new DeviceExamineRecordDto();
+            // 鏌ヨ璁惧璇︽儏
+            DeviceExaminePlanDetails deviceExaminePlanDetails = deviceExaminePlanDetailsMapper.selectById(planDetailsId);
+            Device device = deviceMapper.selectById(deviceExaminePlanDetails.getDeviceId());
+            if (device != null) {
+                deviceExamineRecord.setDeviceName(device.getDeviceName());
+                deviceExamineRecord.setDeviceNumber(device.getManagementNumber());
+                deviceExamineRecord.setPlanDetailsId(deviceExaminePlanDetails.getPlanDetailsId());
+            }
+        } else {
+            // 鏌ヨ璇︽儏
+            List<DeviceExamineRecordDetail> list = deviceExamineRecordDetailService.list(Wrappers.<DeviceExamineRecordDetail>lambdaQuery()
+                    .eq(DeviceExamineRecordDetail::getRecordId, deviceExamineRecord.getRecordId()));
+            deviceExamineRecord.setRecordDetailList(list);
+        }
+
+        return deviceExamineRecord;
+    }
+
+    /**
+     * 鏂板鏍告煡璁板綍
+     *
+     * @return
+     */
+    @Override
+    public boolean addExamineRecord(DeviceExamineRecordDto deviceExamineRecordDto) {
+        if (deviceExamineRecordDto.getPlanDetailsId() == null) {
+            throw new ErrorException("缂哄皯璁″垝璇︾粏淇℃伅id");
+        }
+        if (deviceExamineRecordDto.getRecordId() == null) {
+            Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+            User user = userMapper.selectById(userId);
+            deviceExamineRecordDto.setCheckerUserId(userId);
+            deviceExamineRecordDto.setCheckerUser(user.getName());
+
+            // 鏌ヨ瀹℃煡浜篿d
+            if (deviceExamineRecordDto.getReviewUserId() != null) {
+                User reviewUser = userMapper.selectById(deviceExamineRecordDto.getReviewUserId());
+                deviceExamineRecordDto.setReviewUser(reviewUser.getName());
+            }
+
+        }
+        this.saveOrUpdate(deviceExamineRecordDto);
+
+        // 鍒犻櫎鍏ㄩ儴璇︽儏
+        deviceExamineRecordDetailService.remove(Wrappers.<DeviceExamineRecordDetail>lambdaQuery()
+                .eq(DeviceExamineRecordDetail::getRecordId, deviceExamineRecordDto.getRecordId()));
+        //娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(deviceExamineRecordDto.getRecordDetailList())) {
+            for (DeviceExamineRecordDetail deviceExamineRecordDetail : deviceExamineRecordDto.getRecordDetailList()) {
+                deviceExamineRecordDetail.setRecordId(deviceExamineRecordDto.getRecordId());
+            }
+            deviceExamineRecordDetailService.saveBatch(deviceExamineRecordDto.getRecordDetailList());
+        }
+
+        return true;
+    }
+
+
+    /**
+     * 澶嶆牳鏍告煡璁板綍
+     *
+     * @return
+     */
+    @Override
+    public boolean reviewExamineRecord(DeviceExamineRecordDto dto) {
+        if (dto.getPlanDetailsId() == null) {
+            throw new ErrorException("缂哄皯璁″垝璇︾粏淇℃伅id");
+        }
+        LambdaUpdateWrapper<DeviceExamineRecord> wrapper = Wrappers.<DeviceExamineRecord>lambdaUpdate()
+                .eq(DeviceExamineRecord::getPlanDetailsId, dto.getPlanDetailsId())
+                .set(DeviceExamineRecord::getReviewStatus, dto.getReviewStatus())
+                .set(DeviceExamineRecord::getReviewRemark, dto.getReviewRemark());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (dto.getReviewStatus().equals(0)) {
+            wrapper.set(DeviceExamineRecord::getReviewUserId, null)
+                    .set(DeviceExamineRecord::getReviewUser, null);
+        }
+
+        this.update(wrapper);
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭澶嶆牳鏍告煡璁板綍
+     *
+     * @param planDetailsId 澶嶆牳鏍告煡璁板綍id
+     * @return
+     */
+    @Override
+    public void exportReviewExamineRecordDetail(Integer planDetailsId, HttpServletResponse response) {
+        // 鏌ヨ澶嶆牳鏍告煡璁板綍
+        DeviceExamineRecordDto deviceExamineRecordDto = baseMapper.selectReviewExamineRecordDto(planDetailsId);
+
+        // 鏌ヨ澶嶆牳鏍告煡璁板綍璇︽儏
+        List<DeviceExamineRecordDetail> deviceExamineRecordDetailList = deviceExamineRecordDetailService.list(Wrappers.<DeviceExamineRecordDetail>lambdaQuery().eq(DeviceExamineRecordDetail::getRecordId, deviceExamineRecordDto.getRecordId()));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/examine-record.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceExamineRecordDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceExamineRecordDto", deviceExamineRecordDto);
+                    put("deviceExamineRecordDetailList", deviceExamineRecordDetailList);
+                    //鑾峰彇鏍告煡浜虹殑绛惧悕鍦板潃
+                    put("checkerUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExamineRecordDto.getCheckerUserId()));
+                    //鑾峰彇瀹℃煡浜虹殑绛惧悕鍦板潃
+                    put("reviewUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExamineRecordDto.getReviewUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = StringUtils.isNotEmpty(deviceExamineRecordDto.getDeviceName()) ? deviceExamineRecordDto.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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExternalApplyServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExternalApplyServiceImpl.java
new file mode 100644
index 0000000..3797992
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceExternalApplyServiceImpl.java
@@ -0,0 +1,163 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.mapper.DeviceExternalApplyMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceExternalApply;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceExternalApplyService;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+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 10:28:43
+ */
+@Service
+public class DeviceExternalApplyServiceImpl extends ServiceImpl<DeviceExternalApplyMapper, DeviceExternalApply> implements DeviceExternalApplyService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private GetLook getLook;
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @param page
+     * @param deviceExternalApply
+     * @return
+     */
+    @Override
+    public IPage<DeviceExternalApply> pageDeviceExternalApply(Page page, DeviceExternalApply deviceExternalApply) {
+        return baseMapper.pageDeviceExternalApply(page, QueryWrappers.queryWrappers(deviceExternalApply));
+    }
+
+    /**
+     * 鏂板鍒╃敤澶栭儴璁惧鐢宠
+     * @param deviceExternalApply
+     * @return
+     */
+    @Override
+    public boolean addDeviceExternalApply(DeviceExternalApply deviceExternalApply) {
+        DeviceExternalApply apply = new DeviceExternalApply();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(getLook.selectPowerByMethodAndUserId(null).get("userId"));
+        switch (deviceExternalApply.getFlowType()) {
+            case 0:
+                BeanUtils.copyProperties(deviceExternalApply, apply);
+                // 鐢宠
+                apply.setUseReason(deviceExternalApply.getUseReason());
+                apply.setApplicantUserId(user.getId());
+                apply.setApplicantUser(user.getName());
+                apply.setApplicantDate(LocalDate.now());
+
+                // 澶勭悊浜轰俊鎭�
+                User departmentHeadUser = userMapper.selectById(deviceExternalApply.getDepartmentHeadUserId());
+                apply.setApplicantUserId(departmentHeadUser.getId());
+                apply.setApplicantUser(departmentHeadUser.getName());
+
+                baseMapper.insert(apply);
+                break;
+            case 1:
+                apply.setExternalApplyId(deviceExternalApply.getExternalApplyId());
+                // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+                apply.setDepartmentHeadOpinion(deviceExternalApply.getDepartmentHeadOpinion());
+                apply.setDepartmentHeadDate(LocalDate.now());
+
+                // 璁¢噺瀹や俊鎭�
+                User meteringRoomUser = userMapper.selectById(deviceExternalApply.getMeteringRoomUserId());
+                apply.setMeteringRoomUserId(meteringRoomUser.getId());
+                apply.setMeteringRoomUser(meteringRoomUser.getName());
+
+                baseMapper.updateById(apply);
+                break;
+            case 2:
+                apply.setExternalApplyId(deviceExternalApply.getExternalApplyId());
+                // 璁¢噺瀹ゆ剰瑙�
+                apply.setMeteringRoomOpinion(deviceExternalApply.getMeteringRoomOpinion());
+                apply.setMeteringRoomDate(LocalDate.now());
+
+                // 鎵瑰噯浜轰俊鎭�
+                User approverUser = userMapper.selectById(deviceExternalApply.getApproverUserId());
+                apply.setApproverUserId(approverUser.getId());
+                apply.setApproverUser(approverUser.getName());
+
+                baseMapper.updateById(apply);
+                break;
+            case 3:
+                apply.setExternalApplyId(deviceExternalApply.getExternalApplyId());
+                //鎵瑰噯浜�
+                apply.setApproverOpinion(deviceExternalApply.getApproverOpinion());
+                apply.setApproverDate(LocalDate.now());
+
+                apply.setIsFinish(1);
+                baseMapper.updateById(apply);
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠
+     *
+     * @param externalApplyId 澶栭儴璁惧鐢宠id
+     * @param response
+     */
+    @Override
+    public void exportDeviceExternalApply(Integer externalApplyId, HttpServletResponse response) {
+        // 鏌ヨ澶栭儴璁惧鐢宠
+        DeviceExternalApply deviceAccidentReport = baseMapper.selectDeviceExternalById(externalApplyId);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-external-apply.docx");
+        Configure configure = Configure.builder()
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAccidentReport", deviceAccidentReport);
+                    // 鐢宠浜虹鍚�
+                    put("applicantUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getApplicantUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                    // 璁¢噺瀹や汉绛惧悕
+                    put("meteringRoomUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getMeteringRoomUserId()));
+                    // 鎵瑰噯浜虹鍚�
+                    put("approverUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getApproverUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "鍒╃敤澶栭儴璁惧鐢宠", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultOneServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultOneServiceImpl.java
new file mode 100644
index 0000000..6a75732
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultOneServiceImpl.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.DeviceFaultOneDto;
+import com.yuanchu.mom.mapper.DeviceFaultOneMapper;
+import com.yuanchu.mom.pojo.DeviceFaultOne;
+import com.yuanchu.mom.service.DeviceFaultOneService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+@Service
+public class DeviceFaultOneServiceImpl extends ServiceImpl<DeviceFaultOneMapper, DeviceFaultOne> implements DeviceFaultOneService {
+
+    @Override
+    public IPage<DeviceFaultOneDto> deviceFaultOnePage(Integer deviceId, Page page, String processNumber) {
+        return baseMapper.deviceFaultOnePage(deviceId, page, processNumber);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultServiceImpl.java
new file mode 100644
index 0000000..d725167
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceFaultServiceImpl.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.*;
+import com.yuanchu.mom.pojo.*;
+import com.yuanchu.mom.service.DeviceFaultService;
+import com.yuanchu.mom.service.EnumService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DeviceFaultServiceImpl extends ServiceImpl<DeviceFaultMapper, DeviceFault> implements DeviceFaultService {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private QrShowServiceImpl qrShowService;
+
+    @Autowired
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    @Autowired
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Autowired
+    private DeviceFaultOneMapper deviceFaultOneMapper;
+
+    @Autowired
+    private EnumService enumService;
+
+    @Override
+    public Map<String,Object> findByDeviceId(Integer deviceId) {
+        Map<String,Object> map = new HashMap<>();
+        if(Objects.isNull(deviceId)){
+            return map;
+        }
+        //鏌ヨ璁惧涓昏〃淇℃伅
+        Device device = deviceMapper.selectById(deviceId);
+        if(!Objects.isNull(device)){
+            //鏌ヨ璁惧鏍″噯淇℃伅
+            DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(device.getId(), "calibrate");
+            //鏌ヨ璁惧鏍告煡淇℃伅
+            DeviceMetricRecord examine = qrShowService.getDeviceMetricRecord(device.getId(), "examine");
+            //鏌ヨ璁惧缁存姢璁板綍
+            DeviceMaintenance deviceMaintenance = Optional.ofNullable(deviceMaintenanceMapper.selectOne(Wrappers.<DeviceMaintenance>lambdaQuery()
+                    .eq(DeviceMaintenance::getDeviceId, device.getId())
+                    .orderByDesc(DeviceMaintenance::getId)
+                    .last("limit 1"))).orElse(new DeviceMaintenance());
+            //鏌ヨ璁惧鏁呴殰淇℃伅
+            List<DeviceFaultOne> deviceFaultOneList = Optional.ofNullable(deviceFaultOneMapper.selectList(Wrappers.<DeviceFaultOne>lambdaQuery()
+                    .eq(DeviceFaultOne::getDeviceId, device.getId())
+                    .orderByDesc(DeviceFaultOne::getId))).orElse(new ArrayList<>());
+            //鏌ヨ璁惧鐘舵�佸瓧鍏�
+            List<Enums> deviceStatus = enumService.selectEnumByCategory("璁惧鐘舵��");
+            Enums findEnum = deviceStatus.stream().filter(e-> Integer.parseInt(e.getValue()) ==device.getDeviceStatus()).findFirst().orElse(new Enums());
+            map.put("progress",qrShowService.calcDeviceNextCheckRatio(calibrate.getCalibrationDate(),calibrate.getNextCalibrationDate()));//璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+            map.put("deviceName",device.getDeviceName());//璁惧鍚嶇О
+            map.put("deviceCode",device.getManagementNumber());//璁惧缂栧彿
+            map.put("usedYears",qrShowService.calcUsedYears(device.getActivationDate()));//鍚敤鏃堕暱(骞�)
+            map.put("deviceStatus",findEnum.getLabel());//璁惧杩愯鐘舵��
+            map.put("faultCount",deviceFaultOneList.size());//鏁呴殰娆℃暟
+            String faultDate = !deviceFaultOneList.isEmpty() ?qrShowService.formatDate(deviceFaultOneList.get(0).getFaultDate(),"yyyy-MM-dd"):"";
+            map.put("faultDate",faultDate);//鏈�杩戞晠闅滄棩鏈�
+            map.put("lastCalibrationDate",qrShowService.formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牎鍑嗘棩鏈�
+            map.put("nextCalibrationDate",qrShowService.formatDate(calibrate.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍″噯鏃ユ湡
+            String calibrateStatus = "0yes".equals(calibrate.getStatus())?"鍚堟牸":"1no".equals(calibrate.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("calibrateStatus",Objects.isNull(calibrate.getCalibrationDate())?"":calibrateStatus);//鏍″噯鎬荤粨璁�
+            map.put("lastExamineDate",examine.getCalibrationDate());//鏈�杩戞牳鏌ユ棩鏈�
+            map.put("nextExamineDate",examine.getNextCalibrationDate());//涓嬫鏍告煡鏃ユ湡
+            String examineStatus = "0yes".equals(examine.getStatus())?"鍚堟牸":"1no".equals(examine.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("examineStatus",Objects.isNull(examine.getCalibrationDate())?"":examineStatus);//鏍告煡鎬荤粨璁�
+            map.put("maintenanceDate",deviceMaintenance.getDate());//鏈�杩戠淮鎶ゆ棩鏈�
+            map.put("nextMaintenanceDate",deviceMaintenance.getNextDate());//涓嬫缁存姢鏃ユ湡
+            String maintenanceType = "";
+            if(!Objects.isNull(deviceMaintenance.getMaintenanceType())){
+                maintenanceType = 0==deviceMaintenance.getMaintenanceType()?"浣跨敤鍓嶇淮鎶�":"浣跨敤鍚庣淮鎶�";
+            }
+            map.put("maintenanceType",maintenanceType);//缁存姢鎬荤粨璁�
+            //娴嬮噺椤圭洰
+            String insProduct = "";
+            if(StringUtils.isNotBlank(device.getInsProductIds())){
+                String[] ids = device.getInsProductIds().split(",");
+                List<StructureItemParameter> parameters = structureItemParameterMapper.selectBatchIds(Arrays.asList(ids));
+                List<String> itemList = parameters.stream().map(StructureItemParameter::getInspectionItem).distinct().collect(Collectors.toList());
+                insProduct = String.join(",",itemList);
+            }
+            map.put("insProduct",insProduct);//娴嬮噺椤圭洰
+        }
+        return map;
+    }
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordDetailsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
new file mode 100644
index 0000000..36b279f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceInspectionRecordDetailsMapper;
+import com.yuanchu.mom.pojo.DeviceInspectionRecordDetails;
+import com.yuanchu.mom.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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordServiceImpl.java
new file mode 100644
index 0000000..801c07f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -0,0 +1,223 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceInspectionRecordDto;
+import com.yuanchu.mom.mapper.DeviceInspectionRecordMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceInspectionRecord;
+import com.yuanchu.mom.pojo.DeviceInspectionRecordDetails;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceInspectionRecordDetailsService;
+import com.yuanchu.mom.service.DeviceInspectionRecordService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import com.yuanchu.mom.vo.Result;
+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 GetLook getLook;
+    @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 = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        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-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLeaseServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLeaseServiceImpl.java
new file mode 100644
index 0000000..1fac358
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLeaseServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceLeaseMapper;
+import com.yuanchu.mom.pojo.DeviceLease;
+import com.yuanchu.mom.service.IDeviceLeaseService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceLeaseServiceImpl extends ServiceImpl<DeviceLeaseMapper, DeviceLease> implements IDeviceLeaseService {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLogServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLogServiceImpl.java
new file mode 100644
index 0000000..91e1365
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceLogServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceLogMapper;
+import com.yuanchu.mom.pojo.DeviceLog;
+import com.yuanchu.mom.service.IDeviceLogService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceLogServiceImpl extends ServiceImpl<DeviceLogMapper, DeviceLog> implements IDeviceLogService {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenanceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenanceImpl.java
new file mode 100644
index 0000000..a40ab69
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenanceImpl.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.yuanchu.mom.excel.DeviceMaintenanceExport;
+import com.yuanchu.mom.mapper.DeviceMaintenanceMapper;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.pojo.DeviceMaintenance;
+import com.yuanchu.mom.service.DeviceMaintenanceService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+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.util.HashMap;
+import java.util.List;
+
+@Service
+public class DeviceMaintenanceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements DeviceMaintenanceService {
+    @Resource
+    DeviceMaintenanceMapper deviceMaintenanceMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Override
+    public IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber) {
+        return baseMapper.selectPage(page, Wrappers.<DeviceMaintenance>lambdaQuery()
+                .eq(DeviceMaintenance::getDeviceId, deviceId)
+                .like(DeviceMaintenance::getDeviceNumber, deviceNumber));
+    }
+
+    @Override
+    public List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId) {
+        return baseMapper.deviceMaintenanceExport(deviceId);
+    }
+
+    @Override
+    public void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response) {
+        // 鏌ヨcnas璁惧缁翠慨璁板綍
+        List<DeviceMaintenance> deviceMaintenanceList = baseMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery()
+                .eq(DeviceMaintenance::getDeviceId, deviceId)
+                .select(DeviceMaintenance::getDate,
+                        DeviceMaintenance::getDeviceNumber,
+                        DeviceMaintenance::getDeviceName,
+                        DeviceMaintenance::getManagementNumber,
+                        DeviceMaintenance::getContent,
+                        DeviceMaintenance::getName,
+                        DeviceMaintenance::getComments));
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/maintenance-records.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceMaintenanceList", new HackLoopTableRenderPolicy())
+                .build();
+        // 鑾峰彇璁惧 鍚嶇О 鍜� 缂栧彿
+        DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(0);
+        String deviceName = deviceMaintenance.getDeviceName();
+        String managementNumber = deviceMaintenance.getManagementNumber();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceMaintenanceList", deviceMaintenanceList);
+                    put("deviceName", deviceName);
+                    put("managementNumber", managementNumber);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧缁存姢淇濆吇璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+//    @Override
+//    public List<DeviceMaintenance> getDeviceMaintenanceParam() {
+//        Map<String, Object> map = new HashMap<>();
+//        map.put("head",PrintChina.printChina(DeviceMaintenance.class));
+//        IPage<DeviceMaintenance> iPage = deviceMaintenanceMapper.getDeviceMaintenanceParam(page, QueryWrappers.queryWrappers(itemParameter));
+//        map.put("body",page);
+//        return deviceMaintenanceMapper.getDeviceMaintenanceParam();
+//    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..ee45b41
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceMaintenancePlanDetailsMapper;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails;
+import com.yuanchu.mom.service.DeviceMaintenancePlanDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:11:46
+ */
+@Service
+public class DeviceMaintenancePlanDetailsServiceImpl extends ServiceImpl<DeviceMaintenancePlanDetailsMapper, DeviceMaintenancePlanDetails> implements DeviceMaintenancePlanDetailsService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanServiceImpl.java
new file mode 100644
index 0000000..81ca79f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMaintenancePlanServiceImpl.java
@@ -0,0 +1,239 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceMaintenancePlanDetailsDto;
+import com.yuanchu.mom.dto.DeviceMaintenancePlanDto;
+import com.yuanchu.mom.mapper.DeviceMaintenancePlanDetailsMapper;
+import com.yuanchu.mom.mapper.DeviceMaintenancePlanMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlan;
+import com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceMaintenancePlanDetailsService;
+import com.yuanchu.mom.service.DeviceMaintenancePlanService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import com.yuanchu.mom.vo.Result;
+import org.apache.commons.collections4.CollectionUtils;
+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.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:10:52
+ */
+@Service
+public class DeviceMaintenancePlanServiceImpl extends ServiceImpl<DeviceMaintenancePlanMapper, DeviceMaintenancePlan> implements DeviceMaintenancePlanService {
+
+    @Resource
+    private DeviceMaintenancePlanDetailsService deviceMaintenancePlanDetailsService;
+
+    @Resource
+    private DeviceMaintenancePlanDetailsMapper deviceMaintenancePlanDetailsMapper;
+
+    @Resource
+    private GetLook getLook;
+
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     *
+     * @param page
+     * @return
+     */
+    @Override
+    public Result<IPage<DeviceMaintenancePlan>> selectDeviceMaintenancePlanByPage(IPage page, DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        IPage<DeviceMaintenancePlan> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceMaintenancePlanDto));
+        return Result.success(iPage);
+    }
+
+    /**
+     * 鏂板璁惧淇濆吇璁″垝
+     *
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Override
+    public Result addMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = userMapper.selectById(userId);
+        deviceMaintenancePlanDto.setCompilerId(userId);
+        deviceMaintenancePlanDto.setCompiler(user.getName());
+        deviceMaintenancePlanDto.setDatePreparation(LocalDateTime.now());
+
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceMaintenancePlanDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceMaintenancePlanDto.getAuditId());
+            deviceMaintenancePlanDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceMaintenancePlanDto);
+
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceMaintenancePlanDetailsDto> deviceMaintenancePlanDetails = deviceMaintenancePlanDto.getDeviceMaintenancePlanDetails();
+        if (CollectionUtils.isNotEmpty(deviceMaintenancePlanDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceMaintenancePlanDetails> collect = deviceMaintenancePlanDetails.stream().map(deviceMaintenancePlanDetail -> { // 閬嶅巻璇︽儏
+                deviceMaintenancePlanDetail.setDeviceId(deviceMaintenancePlanDto.getDeviceId()); // 璁惧ID
+                deviceMaintenancePlanDetail.setMaintenancePlanId(deviceMaintenancePlanDto.getMaintenancePlanId()); // 淇濆吇璁″垝ID
+                DeviceMaintenancePlanDetails planDetails = new DeviceMaintenancePlanDetails();
+                BeanUtils.copyProperties(deviceMaintenancePlanDetail, planDetails);
+                return planDetails;
+            }).collect(Collectors.toList());
+            deviceMaintenancePlanDetailsService.saveBatch(collect);
+        }
+
+        return Result.success();
+    }
+
+    /**
+     * 淇敼璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Override
+    public Result updateMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceMaintenancePlanDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceMaintenancePlanDto.getAuditId());
+            deviceMaintenancePlanDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceMaintenancePlanDto);
+
+        // 鍒犻櫎鍘熸湰鐨勮鎯�
+        deviceMaintenancePlanDetailsService.remove(Wrappers.<DeviceMaintenancePlanDetails>lambdaQuery().eq(DeviceMaintenancePlanDetails::getMaintenancePlanId, deviceMaintenancePlanDto.getMaintenancePlanId()));
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceMaintenancePlanDetailsDto> deviceMaintenancePlanDetails = deviceMaintenancePlanDto.getDeviceMaintenancePlanDetails();
+        if (CollectionUtils.isNotEmpty(deviceMaintenancePlanDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceMaintenancePlanDetails> collect = deviceMaintenancePlanDetails.stream().map(deviceMaintenancePlanDetail -> { // 閬嶅巻璇︽儏
+                deviceMaintenancePlanDetail.setDeviceId(deviceMaintenancePlanDto.getDeviceId()); // 璁惧ID
+                deviceMaintenancePlanDetail.setMaintenancePlanId(deviceMaintenancePlanDto.getMaintenancePlanId()); // 淇濆吇璁″垝ID
+                DeviceMaintenancePlanDetails planDetails = new DeviceMaintenancePlanDetails();
+                BeanUtils.copyProperties(deviceMaintenancePlanDetail, planDetails);
+                return planDetails;
+            }).collect(Collectors.toList());
+            deviceMaintenancePlanDetailsService.saveBatch(collect);
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧淇濆吇璁″垝
+     *
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Override
+    public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        this.removeById(deviceMaintenancePlanDto);
+        deviceMaintenancePlanDetailsService.remove(Wrappers.<DeviceMaintenancePlanDetails>lambdaQuery().eq(DeviceMaintenancePlanDetails::getMaintenancePlanId, deviceMaintenancePlanDto.getMaintenancePlanId()));
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧淇濆吇璁″垝
+     *
+     * @param maintenancePlanId 璁惧淇濆吇璁″垝id
+     * @param response          鍝嶅簲
+     */
+    @Override
+    public Result exportDeviceMaintenancePlanDto(Integer maintenancePlanId, HttpServletResponse response) {
+        // 鏌ヨ璁惧淇濆吇璁″垝
+        DeviceMaintenancePlanDto deviceMaintenancePlan = baseMapper.selectMaintenancePlanById(maintenancePlanId);
+
+        // 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+        List<DeviceMaintenancePlanDetailsDto> deviceMaintenancePlanDetailsDtoList = deviceMaintenancePlanDetailsMapper.deviceInspectionRecordDetailsList(maintenancePlanId);
+        // 璁剧疆搴忓彿
+        deviceMaintenancePlanDetailsDtoList.forEach(deviceInspectionRecordDetails -> {
+            deviceInspectionRecordDetails.setIndex(deviceMaintenancePlanDetailsDtoList.indexOf(deviceInspectionRecordDetails) + 1);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/maintenance-plan.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceMaintenancePlanDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceMaintenancePlan", deviceMaintenancePlan);
+                    put("deviceMaintenancePlanDetailsDtoList", deviceMaintenancePlanDetailsDtoList);
+                    // 缂栧埗浜虹鍚嶅湴鍧�
+                    put("compilerUrl", UserUtils.getFinalUserSignatureUrl(deviceMaintenancePlan.getCompilerId()));
+                    // 瀹℃牳浜虹鍚嶅湴鍧�
+                    put("auditUrl", UserUtils.getFinalUserSignatureUrl(deviceMaintenancePlan.getAuditId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧淇濆吇璁″垝琛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+     *
+     * @param maintenancePlanId 璁惧淇濆吇璁″垝id
+     */
+    @Override
+    public Result<DeviceMaintenancePlanDto> getMaintenancePlanDetail(Integer maintenancePlanId) {
+        // 鏌ヨ璁惧淇濆吇璁″垝
+        DeviceMaintenancePlan deviceMaintenancePlan = baseMapper.selectById(maintenancePlanId);
+        // 鏌ヨ璇︽儏
+        DeviceMaintenancePlanDto deviceMaintenancePlanDto = new DeviceMaintenancePlanDto();
+        BeanUtils.copyProperties(deviceMaintenancePlan, deviceMaintenancePlanDto);
+        deviceMaintenancePlanDto.setDeviceMaintenancePlanDetails(deviceMaintenancePlanDetailsMapper.deviceInspectionRecordDetailsList(maintenancePlanId));
+        return Result.success(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 瀹℃牳璁惧淇濆吇璁″垝
+     *
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Override
+    public Result reviewMaintenancePlanStatus(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        LambdaUpdateWrapper<DeviceMaintenancePlan> wrapper = Wrappers.<DeviceMaintenancePlan>lambdaUpdate()
+                .eq(DeviceMaintenancePlan::getMaintenancePlanId, deviceMaintenancePlanDto.getMaintenancePlanId())
+                .set(DeviceMaintenancePlan::getStatus, deviceMaintenancePlanDto.getStatus())        // 瀹℃牳鐘舵��
+                .set(DeviceMaintenancePlan::getAuditRemark, deviceMaintenancePlanDto.getAuditRemark());// 瀹℃牳澶囨敞
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (deviceMaintenancePlanDto.getStatus().equals(0)) {
+            wrapper.set(DeviceMaintenancePlan::getAuditId, null)
+                    .set(DeviceMaintenancePlan::getAudit, null);
+        }
+        this.update(wrapper); // 鏇存柊
+        return Result.success();
+    }
+
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricRecordServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricRecordServiceImpl.java
new file mode 100644
index 0000000..51cc359
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceMetricRecordMapper;
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+import com.yuanchu.mom.service.DeviceMetricRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Service
+public class DeviceMetricRecordServiceImpl extends ServiceImpl<DeviceMetricRecordMapper, DeviceMetricRecord> implements DeviceMetricRecordService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricServiceImpl.java
new file mode 100644
index 0000000..0de34e0
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceMetricMapper;
+import com.yuanchu.mom.pojo.DeviceMetric;
+import com.yuanchu.mom.service.IDeviceMetricService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceMetricServiceImpl extends ServiceImpl<DeviceMetricMapper, DeviceMetric> implements IDeviceMetricService {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricsCopyServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricsCopyServiceImpl.java
new file mode 100644
index 0000000..3aba303
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceMetricsCopyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceMetricsCopyMapper;
+import com.yuanchu.mom.pojo.DeviceMetricsCopy;
+import com.yuanchu.mom.service.DeviceMetricsCopyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Service
+public class DeviceMetricsCopyServiceImpl extends ServiceImpl<DeviceMetricsCopyMapper, DeviceMetricsCopy> implements DeviceMetricsCopyService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceRecordServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceRecordServiceImpl.java
new file mode 100644
index 0000000..f043077
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceRecordServiceImpl.java
@@ -0,0 +1,142 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceRecordDto;
+import com.yuanchu.mom.dto.DeviceRecordExportWord;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.DeviceRecordMapper;
+import com.yuanchu.mom.mapper.LaboratoryMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceRecord;
+import com.yuanchu.mom.service.DeviceRecordService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+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.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+@Service
+public class DeviceRecordServiceImpl extends ServiceImpl<DeviceRecordMapper, DeviceRecord> implements DeviceRecordService {
+    @Resource
+    private LaboratoryMapper laboratoryMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private GetLook getLook;
+
+    @Override
+    public IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("deviceRecordPage");
+        Integer userId = null;
+        if (map1.get("look") == 1) {
+            //涓汉
+            userId = map1.get("userId");
+        }
+
+        return baseMapper.deviceRecordPage(deviceId, page, sampleCode, managementNumber, userId);
+    }
+
+
+    @Override
+    public void exportUseRecord(Integer deviceId, String exportDate, HttpServletResponse response) {
+        // 鏌ヨcnas璁惧浣跨敤璁板綍
+        List<DeviceRecord> deviceList = baseMapper.selectExportList(deviceId, exportDate);
+        // 璁惧淇℃伅
+        Device device = deviceMapper.selectById(deviceId);
+
+
+        // 鏌ヨ璁惧灞炰簬鍝釜瀹為獙瀹�
+        String laboratoryName = "瑁呭绾跨紗瀹為獙瀹�";
+
+        // 瑕佹槧灏勫埌word鏁版嵁
+        List<DeviceRecordExportWord> deviceExportList = new ArrayList<>();
+        // deviceExportList 璧嬪��
+        for (DeviceRecord deviceRecord : deviceList) {
+            // 澶勭悊璁惧 寮�濮嬩娇鐢ㄦ椂闂� 鍜� 缁撴潫鏃堕棿
+            String startTime = "";
+            String endTime = "";
+            String operationDate = "";
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+            if (deviceRecord.getUseStartDate() != null) {
+                startTime = deviceRecord.getUseStartDate().format(formatter);
+                endTime = deviceRecord.getUseEndDate().format(formatter);
+                String[] startTimeSplit = startTime.split(" ");
+                String[] endTimeSplit = endTime.split(" ");
+                startTime = startTimeSplit[1];
+                if (startTimeSplit[0].equals(endTimeSplit[0])) {
+                    endTime = endTimeSplit[1];
+                } else {
+                    endTime = endTimeSplit[0] + '\n' + endTimeSplit[1];
+                }
+                DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy.M.d");
+                operationDate = deviceRecord.getUseStartDate().format(formatter2);
+            }
+            // 澶勭悊浣跨敤鍓嶅拰浣跨敤鍚�
+            String useBeforeString = deviceRecord.getUseBefore() == 0? "寮傚父" : "鑹ソ";
+            String useAfterString = deviceRecord.getUseAfter() == 0 ? "寮傚父" : "鑹ソ";
+
+            DeviceRecordExportWord deviceRecordExportWord = new DeviceRecordExportWord();
+            // 杩涜璧嬪��
+            BeanUtils.copyProperties(deviceRecord, deviceRecordExportWord);
+            deviceRecordExportWord.setUseBeforeString(useBeforeString); // 浣跨敤鍓�
+            deviceRecordExportWord.setUseAfterString(useAfterString); // 浣跨敤鍚�
+            deviceRecordExportWord.setOperationDate(operationDate); // 璁惧鎿嶄綔鏃ユ湡
+            deviceRecordExportWord.setUseStartDateString(startTime); // 寮�濮嬫椂闂�
+            deviceRecordExportWord.setUseEndDateString(endTime); // 缁撴潫鏃堕棿
+            deviceExportList.add(deviceRecordExportWord);
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/use-record.docx");
+        Configure configure = Configure.builder()
+                .bind("useRecord", new HackLoopTableRenderPolicy())
+                .build();
+        String deviceName = device.getDeviceName();
+        String managementNumber = device.getManagementNumber();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("useRecord", deviceExportList);
+                    put("deviceName", deviceName);
+                    put("managementNumber", managementNumber);
+                    put("laboratory", laboratoryName);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浠櫒浣跨敤璁板綍琛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceScrappedServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceScrappedServiceImpl.java
new file mode 100644
index 0000000..ffccb7d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceScrappedServiceImpl.java
@@ -0,0 +1,181 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceScrappedDto;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.DeviceScrappedMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.Device;
+import com.yuanchu.mom.pojo.DeviceScrapped;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceScrappedService;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import com.yuanchu.mom.vo.Result;
+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 01:53:47
+ */
+@Service
+public class DeviceScrappedServiceImpl extends ServiceImpl<DeviceScrappedMapper, DeviceScrapped> implements DeviceScrappedService {
+
+    @Resource
+    private DeviceMapper deivceMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private GetLook getLook;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     *
+     * @param deviceScrapped
+     * @return
+     */
+    @Override
+    public IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
+        return baseMapper.pageDeviceScrapped(page, QueryWrappers.queryWrappers(deviceScrapped));
+    }
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     *
+     * @return
+     */
+    @Override
+    public boolean addDeviceScrapped(DeviceScrapped deviceScrapped) {
+        DeviceScrapped scrapped = new DeviceScrapped();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(getLook.selectPowerByMethodAndUserId(null).get("userId"));
+        switch (deviceScrapped.getFlowType()) {
+            case 0:
+                BeanUtils.copyProperties(deviceScrapped, scrapped);
+                // 鐢宠
+                scrapped.setReasonsForScrap(deviceScrapped.getReasonsForScrap());
+                scrapped.setApplicantUserId(user.getId());
+                scrapped.setApplicantUser(user.getName());
+                scrapped.setApplicantDate(LocalDate.now());
+
+                // 澶勭悊浜轰俊鎭�
+                User departmentHeadUser = userMapper.selectById(deviceScrapped.getDepartmentHeadUserId());
+                scrapped.setApplicantUserId(departmentHeadUser.getId());
+                scrapped.setApplicantUser(departmentHeadUser.getName());
+
+                baseMapper.insert(scrapped);
+                break;
+            case 1:
+                scrapped.setScrappedId(deviceScrapped.getScrappedId());
+                // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+                scrapped.setDepartmentHeadOpinion(deviceScrapped.getDepartmentHeadOpinion());
+                scrapped.setDepartmentHeadDate(LocalDate.now());
+
+                // 璁¢噺瀹や俊鎭�
+                User meteringRoomUser = userMapper.selectById(deviceScrapped.getMeteringRoomUserId());
+                scrapped.setMeteringRoomUserId(meteringRoomUser.getId());
+                scrapped.setMeteringRoomUser(meteringRoomUser.getName());
+
+                baseMapper.updateById(scrapped);
+                break;
+            case 2:
+                scrapped.setScrappedId(deviceScrapped.getScrappedId());
+                // 璁¢噺瀹ゆ剰瑙�
+                scrapped.setMeteringRoomOpinion(deviceScrapped.getMeteringRoomOpinion());
+                scrapped.setMeteringRoomDate(LocalDate.now());
+
+                // 鎵瑰噯浜轰俊鎭�
+                User approverUser = userMapper.selectById(deviceScrapped.getApproverUserId());
+                scrapped.setApproverUserId(approverUser.getId());
+                scrapped.setApproverUser(approverUser.getName());
+
+                baseMapper.updateById(scrapped);
+                break;
+            case 3:
+                scrapped.setScrappedId(deviceScrapped.getScrappedId());
+                //鎵瑰噯浜�
+                scrapped.setApproverOpinion(deviceScrapped.getApproverOpinion());
+                scrapped.setApproverDate(LocalDate.now());
+                scrapped.setIsFinish(1);
+                baseMapper.updateById(scrapped);
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧鎶ュ簾鐢宠
+     *
+     * @param scrappedId 璁惧鎶ュ簾鐢宠id
+     * @param response   鍝嶅簲
+     * @return 缁撴灉
+     */
+    @Override
+    public Result<?> exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+        // 鏌ヨ鎶ュ簾鏁版嵁
+        DeviceScrappedDto deviceScrapped = baseMapper.selectDeviceScrappedById(scrappedId);
+        if (deviceScrapped == null) {
+            return Result.fail("璁惧鎶ュ簾鐢宠涓嶅瓨鍦�");
+        }
+        Device device = null;
+        if (deviceScrapped.getDeviceId() != null) {
+            device = deivceMapper.selectById(deviceScrapped.getDeviceId());
+            device = device == null ? new Device() : device;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-scrapped.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceScrapped", deviceScrapped);
+                    put("device", finalDevice);
+                    // 鐢宠浜虹鍚�
+                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApplicantUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getDepartmentHeadUserId()));
+                    // 璁¢噺瀹ょ鍚�
+                    put("metrologyRoomUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getMeteringRoomUserId()));
+                    // 鎵瑰噯浜虹鍚�
+                    put("approverUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApproverUserId()));
+                }});
+
+        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("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
index 616b615..d6abe8c 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceServiceImpl.java
@@ -62,12 +62,12 @@
     }
 
     @Override
-    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter) {
+    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter,Boolean laboratoryNameIsNull) {
         Map<String, Object> map = new HashMap<>();
         map.put("head", PrintChina.printChina(DeviceDto.class));
         Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectDeviceParameter");
         if (map1.get("look") == 1) itemParameter.setCreateUser(map1.get("userId"));
-        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter));
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter),laboratoryNameIsNull);
         map.put("body", iPage);
         return map;
     }
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceStateServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceStateServiceImpl.java
new file mode 100644
index 0000000..fad8214
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceStateServiceImpl.java
@@ -0,0 +1,159 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.dto.DeviceStateDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.DeviceStateMapper;
+import com.yuanchu.mom.mapper.LaboratoryMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceState;
+import com.yuanchu.mom.pojo.Laboratory;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceStateService;
+import org.springframework.beans.factory.annotation.Value;
+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.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@Service
+public class DeviceStateServiceImpl extends ServiceImpl<DeviceStateMapper, DeviceState> implements DeviceStateService {
+
+    @Resource
+    private LaboratoryMapper laboratoryMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber) {
+        return baseMapper.getDeviceStatePage(deviceId, page, processNumber);
+    }
+
+    @Override
+    public void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response) {
+        // 鏍规嵁娴佺▼缂栧彿 鏌ヨcnas璁惧鐘舵��
+        DeviceStateDto deviceStateDto = baseMapper.getDeviceStatePage(deviceId,new Page<DeviceStateDto>(1,1), processNumber).getRecords().get(0);
+
+        // 瀵规椂闂磋繘琛屼慨鏀�
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        deviceStateDto.setSubmitDateString(deviceStateDto.getSubmitDate() != null ? deviceStateDto.getSubmitDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setDepartmentDateString(deviceStateDto.getDepartmentDate() != null? deviceStateDto.getDepartmentDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setMeasuringRoomDateString(deviceStateDto.getMeasuringRoomDate() != null? deviceStateDto.getMeasuringRoomDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setApprovalDateString(deviceStateDto.getApprovalDate() != null? deviceStateDto.getApprovalDate().format(format) : "  骞� 鏈� 鏃�");
+
+        // 鏌ヨ璁惧灞炰簬鍝釜瀹為獙瀹�
+        String laboratoryName;
+        String largeCategory = deviceStateDto.getLargeCategory();
+        if (StringUtils.isNotBlank(largeCategory)) {
+            largeCategory = largeCategory.substring(0, 1);
+            Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
+                    .eq(Laboratory::getLaboratoryNumber, largeCategory)
+                    .select(Laboratory::getLaboratoryName));
+            laboratoryName = laboratory.getLaboratoryName();
+        } else {
+            laboratoryName = "";
+        }
+
+        //todo: 璁惧鐘舵�佹煡璇㈢鍚嶅湴鍧� 鏆傛椂浜哄悕鏌ヨ
+        //鑾峰彇鐢宠浜虹殑绛惧悕鍦板潃
+        String applicantUrl = null;
+        if (deviceStateDto.getSubmitOperatingPersonnel() != null) {
+            applicantUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getSubmitOperatingPersonnel()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(applicantUrl)) {
+                throw new ErrorException("鎵句笉鍒扮敵璇蜂汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+        String headOfDepartmentUrl = null;
+        if (deviceStateDto.getDepartmentNextPesponsible() != null) {
+            headOfDepartmentUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, deviceStateDto.getDepartmentNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(headOfDepartmentUrl)) {
+                throw new ErrorException("鎵句笉鍒伴儴闂ㄨ礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+        String measurementRoomUrl = null;
+        if (deviceStateDto.getMeasuringRoomNextPesponsible() != null) {
+            measurementRoomUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getMeasuringRoomNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(measurementRoomUrl)) {
+                throw new ErrorException("鎵句笉鍒拌閲忓澶嶆祴浜虹殑绛惧悕");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String approvedUrl = null;
+        if (deviceStateDto.getApprovalNextPesponsible() != null) {
+            approvedUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getApprovalNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(approvedUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-status.docx");
+        Configure configure = Configure.builder()
+                .build();
+        String finalApplicantUrl = applicantUrl; // 鐢宠浜虹殑绛惧悕鍦板潃
+        String finalHeadOfDepartmentUrl = headOfDepartmentUrl; // 閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+        String finalMeasurementRoomUrl = measurementRoomUrl; // 璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+        String finalApprovedUrl = approvedUrl; // 鎵瑰噯浜虹殑绛惧悕鍦板潃
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceStateDto", deviceStateDto);
+                    put("submitOperatingPersonnelUrl", StringUtils.isNotBlank(finalApplicantUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApplicantUrl).create() : null);
+                    put("departmentNextPesponsibleUrl", StringUtils.isNotBlank(finalHeadOfDepartmentUrl) ? Pictures.ofLocal(imgUrl + "/" + finalHeadOfDepartmentUrl).create() : null);
+                    put("measuringRoomNextPesponsibleUrl", StringUtils.isNotBlank(finalMeasurementRoomUrl) ? Pictures.ofLocal(imgUrl + "/" + finalMeasurementRoomUrl).create() : null);
+                    put("approvalNextPesponsibleUrl", StringUtils.isNotBlank(finalApprovedUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovedUrl).create() : null);
+                    put("laboratory", laboratoryName);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧缁存姢淇濆吇璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java
new file mode 100644
index 0000000..a4a3903
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DeviceTraceabilityManagementDetailsMapper;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails;
+import com.yuanchu.mom.service.DeviceTraceabilityManagementDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:58
+ */
+@Service
+public class DeviceTraceabilityManagementDetailsServiceImpl extends ServiceImpl<DeviceTraceabilityManagementDetailsMapper, DeviceTraceabilityManagementDetails> implements DeviceTraceabilityManagementDetailsService {
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementServiceImpl.java
new file mode 100644
index 0000000..86ef8b6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DeviceTraceabilityManagementServiceImpl.java
@@ -0,0 +1,244 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.DeviceTraceabilityManagementDetailsDto;
+import com.yuanchu.mom.dto.DeviceTraceabilityManagementDto;
+import com.yuanchu.mom.mapper.DeviceTraceabilityManagementDetailsMapper;
+import com.yuanchu.mom.mapper.DeviceTraceabilityManagementMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagement;
+import com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.DeviceTraceabilityManagementDetailsService;
+import com.yuanchu.mom.service.DeviceTraceabilityManagementService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.UserUtils;
+import com.yuanchu.mom.utils.QueryWrappers;
+import com.yuanchu.mom.vo.Result;
+import org.apache.commons.collections4.CollectionUtils;
+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.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:44
+ */
+@Service
+public class DeviceTraceabilityManagementServiceImpl extends ServiceImpl<DeviceTraceabilityManagementMapper, DeviceTraceabilityManagement> implements DeviceTraceabilityManagementService {
+
+    @Resource
+    private DeviceTraceabilityManagementDetailsService deviceTraceabilityManagementDetailsService;
+
+    @Resource
+    private DeviceTraceabilityManagementDetailsMapper deviceTraceabilityManagementDetailsMapper;
+
+    @Resource
+    private GetLook getLook;
+
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param page
+     * @return
+     */
+    @Override
+    public Result<IPage<DeviceTraceabilityManagement>> selectDeviceTraceabilityManagementByPage(IPage page, DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        IPage<DeviceTraceabilityManagement> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceTraceabilityManagementDto));
+        return Result.success(iPage);
+    }
+
+
+    /**
+     * 鏂板璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param deviceTraceabilityManagementDto 璁惧閲忓�兼函婧愯鍒�
+     */
+    @Override
+    public Result addTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = userMapper.selectById(userId);
+        deviceTraceabilityManagementDto.setCompilerId(userId);
+        deviceTraceabilityManagementDto.setCompiler(user.getName());
+        deviceTraceabilityManagementDto.setDatePreparation(LocalDateTime.now());
+
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceTraceabilityManagementDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceTraceabilityManagementDto.getAuditId());
+            deviceTraceabilityManagementDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceTraceabilityManagementDto);
+
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetails = deviceTraceabilityManagementDto.getDeviceTraceabilityManagementDetails();
+        if (CollectionUtils.isNotEmpty(deviceTraceabilityManagementDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceTraceabilityManagementDetails> collect = deviceTraceabilityManagementDetails.stream().map(detailsDto -> {
+                detailsDto.setTraceabilityManagementId(deviceTraceabilityManagementDto.getTraceabilityManagementId()); // 閲忓�兼函婧愯鍒扞D
+                DeviceTraceabilityManagementDetails details = new DeviceTraceabilityManagementDetails();
+                BeanUtils.copyProperties(detailsDto, details);
+                return details;
+            }).collect(Collectors.toList());
+            deviceTraceabilityManagementDetailsService.saveBatch(collect);
+        }
+
+        return Result.success();
+    }
+
+    /**
+     * 淇敼璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param deviceTraceabilityManagementDto 璁惧閲忓�兼函婧愯鍒�
+     */
+    @Override
+    public Result updateTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceTraceabilityManagementDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceTraceabilityManagementDto.getAuditId());
+            deviceTraceabilityManagementDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceTraceabilityManagementDto);
+
+        // 鍒犻櫎鍘熸湰鐨勮鎯�
+        deviceTraceabilityManagementDetailsService.remove(Wrappers.<DeviceTraceabilityManagementDetails>lambdaQuery().eq(DeviceTraceabilityManagementDetails::getTraceabilityManagementId, deviceTraceabilityManagementDto.getTraceabilityManagementId()));
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetails = deviceTraceabilityManagementDto.getDeviceTraceabilityManagementDetails();
+        if (CollectionUtils.isNotEmpty(deviceTraceabilityManagementDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceTraceabilityManagementDetails> collect = deviceTraceabilityManagementDetails.stream().map(detailsDto -> {
+                detailsDto.setTraceabilityManagementId(deviceTraceabilityManagementDto.getTraceabilityManagementId()); // 閲忓�兼函婧愯鍒扞D
+                DeviceTraceabilityManagementDetails details = new DeviceTraceabilityManagementDetails();
+                BeanUtils.copyProperties(detailsDto, details);
+                return details;
+            }).collect(Collectors.toList());
+            deviceTraceabilityManagementDetailsService.saveBatch(collect);
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param deviceTraceabilityManagementDto 璁惧閲忓�兼函婧愯鍒�
+     */
+    @Override
+    public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        this.removeById(deviceTraceabilityManagementDto);
+        deviceTraceabilityManagementDetailsService.remove(Wrappers.<DeviceTraceabilityManagementDetails>lambdaQuery().eq(DeviceTraceabilityManagementDetails::getTraceabilityManagementId, deviceTraceabilityManagementDto.getTraceabilityManagementId()));
+        return Result.success();
+    }
+
+    /**
+     * 鏌ヨ璁惧閲忓�兼函婧愯鍒掕鎯�
+     *
+     * @param traceabilityManagementId 璁惧閲忓�兼函婧愯鍒抜d
+     */
+    @Override
+    public Result<DeviceTraceabilityManagementDto> getTraceabilityManagementDetail(Integer traceabilityManagementId) {
+        // 鏌ヨ璁惧閲忓�兼函婧愯鍒�
+        DeviceTraceabilityManagement deviceTraceabilityManagement = baseMapper.selectById(traceabilityManagementId);
+        // 鏌ヨ璇︽儏
+        DeviceTraceabilityManagementDto deviceTraceabilityManagementDto = new DeviceTraceabilityManagementDto();
+        BeanUtils.copyProperties(deviceTraceabilityManagement, deviceTraceabilityManagementDto);
+        deviceTraceabilityManagementDto.setDeviceTraceabilityManagementDetails(deviceTraceabilityManagementDetailsMapper.deviceTraceabilityManagementDetailsList(traceabilityManagementId));
+        return Result.success(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 瀹℃牳璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param deviceTraceabilityManagementDto 璁惧閲忓�兼函婧愯鍒�
+     */
+    @Override
+    public Result reviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = userMapper.selectById(userId);
+
+        LambdaUpdateWrapper<DeviceTraceabilityManagement> wrapper = Wrappers.<DeviceTraceabilityManagement>lambdaUpdate()
+                .eq(DeviceTraceabilityManagement::getTraceabilityManagementId, deviceTraceabilityManagementDto.getTraceabilityManagementId())
+                .set(DeviceTraceabilityManagement::getAuditDate, LocalDateTime.now())
+                .set(DeviceTraceabilityManagement::getAuditId, user.getId())
+                .set(DeviceTraceabilityManagement::getAudit, user.getName())
+                .set(DeviceTraceabilityManagement::getStatus, deviceTraceabilityManagementDto.getStatus())        // 瀹℃牳鐘舵��
+                .set(DeviceTraceabilityManagement::getAuditRemark, deviceTraceabilityManagementDto.getAuditRemark());// 瀹℃牳澶囨敞
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (deviceTraceabilityManagementDto.getStatus().equals(0)) {
+            wrapper.set(DeviceTraceabilityManagement::getAuditId, null)
+                    .set(DeviceTraceabilityManagement::getAudit, null);
+        }
+        this.update(wrapper); // 鏇存柊
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param traceabilityManagementId 璁惧閲忓�兼函婧愯鍒抜d
+     */
+    @Override
+    public Result exportDeviceTraceabilityManagementDto(Integer traceabilityManagementId, HttpServletResponse response) {
+        // 鏌ヨ璁惧淇濆吇璁″垝
+        DeviceTraceabilityManagementDto deviceTraceabilityManagement = baseMapper.selectDeviceTraceabilityManagementById(traceabilityManagementId);
+
+        // 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+        List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetailsDtoList = deviceTraceabilityManagementDetailsMapper.deviceTraceabilityManagementDetailsList(traceabilityManagementId);
+        // 璁剧疆搴忓彿
+        deviceTraceabilityManagementDetailsDtoList.forEach(deviceTraceabilityManagementDetails -> {
+            deviceTraceabilityManagementDetails.setIndex(deviceTraceabilityManagementDetailsDtoList.indexOf(deviceTraceabilityManagementDetails) + 1);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/traceability-management-details.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceTraceabilityManagementDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceTraceabilityManagement", deviceTraceabilityManagement);
+                    put("deviceTraceabilityManagementDetailsDtoList", deviceTraceabilityManagementDetailsDtoList);
+                    // 缂栧埗浜虹鍚嶅湴鍧�
+                    put("compilerUrl", UserUtils.getFinalUserSignatureUrl(deviceTraceabilityManagement.getCompilerId()));
+                    // 瀹℃牳浜虹鍚嶅湴鍧�
+                    put("auditUrl", UserUtils.getFinalUserSignatureUrl(deviceTraceabilityManagement.getAuditId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String finalFileName = deviceTraceabilityManagement.getFileName() == null ? "" : deviceTraceabilityManagement.getFileName() + "_";
+            String fileName = URLEncoder.encode(
+                    finalFileName+ "璁惧閲忓�兼函婧愯鍒�", "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-server/src/main/java/com/yuanchu/mom/service/impl/DocumentServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DocumentServiceImpl.java
new file mode 100644
index 0000000..ae2481d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/DocumentServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.DocumentDao;
+import com.yuanchu.mom.pojo.Document;
+import com.yuanchu.mom.service.DocumentService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DocumentServiceImpl extends ServiceImpl<DocumentDao, Document> implements DocumentService {
+}
\ No newline at end of file
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentAcceptanceCheckServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentAcceptanceCheckServiceImpl.java
new file mode 100644
index 0000000..b2174e2
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentAcceptanceCheckServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.IncidentAcceptanceCheckMapper;
+import com.yuanchu.mom.pojo.IncidentAcceptanceCheck;
+import com.yuanchu.mom.service.IncidentAcceptanceCheckService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentAcceptanceCheckServiceImpl extends ServiceImpl<IncidentAcceptanceCheckMapper, IncidentAcceptanceCheck> implements IncidentAcceptanceCheckService {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentFileServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentFileServiceImpl.java
new file mode 100644
index 0000000..f7d37ab
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentFileServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.IncidentFileMapper;
+import com.yuanchu.mom.pojo.IncidentFile;
+import com.yuanchu.mom.service.IncidentFileService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentFileServiceImpl extends ServiceImpl<IncidentFileMapper, IncidentFile> implements IncidentFileService {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentInstallServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentInstallServiceImpl.java
new file mode 100644
index 0000000..1933426
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentInstallServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.IncidentInstallMapper;
+import com.yuanchu.mom.pojo.IncidentInstall;
+import com.yuanchu.mom.service.IncidentInstallService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentInstallServiceImpl extends ServiceImpl<IncidentInstallMapper, IncidentInstall> implements IncidentInstallService {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentReportServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentReportServiceImpl.java
new file mode 100644
index 0000000..8edf35b
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentReportServiceImpl.java
@@ -0,0 +1,187 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.dto.IncidentReportAddDto;
+import com.yuanchu.mom.dto.IncidentReportExportWordDto;
+import com.yuanchu.mom.excel.IncidentReportExport;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.IncidentReportMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.*;
+import com.yuanchu.mom.service.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+@Service
+//@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class IncidentReportServiceImpl extends ServiceImpl<IncidentReportMapper, IncidentReport> implements IncidentReportService {
+
+    private UserMapper userMapper;
+    private IncidentSparePartsService incidentSparePartsService;
+    private IncidentFileService incidentFileService;
+    private IncidentInstallService incidentInstallService;
+    private IncidentAcceptanceCheckService incidentAcceptanceCheckService;
+
+    private final NumberGenerator<IncidentReport> numberGenerator;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    public IncidentReportServiceImpl(UserMapper userMapper, IncidentSparePartsService incidentSparePartsService, IncidentFileService incidentFileService, IncidentInstallService incidentInstallService, IncidentAcceptanceCheckService incidentAcceptanceCheckService, NumberGenerator<IncidentReport> numberGenerator) {
+        this.userMapper = userMapper;
+        this.incidentSparePartsService = incidentSparePartsService;
+        this.incidentFileService = incidentFileService;
+        this.incidentInstallService = incidentInstallService;
+        this.incidentAcceptanceCheckService = incidentAcceptanceCheckService;
+        this.numberGenerator = numberGenerator;
+    }
+
+    @Override
+    public void saveIncidentReportData(IncidentReportAddDto incidentReportAddDto) {
+        if (ObjectUtils.isEmpty(incidentReportAddDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-07FM " + month + "-" + year + month, IncidentReport::getProcessNumber);
+            incidentReportAddDto.setProcessNumber(processNumber);
+        }
+        this.saveOrUpdate(incidentReportAddDto);
+        // 澶囦欢纭List
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getSparePartsConfirmationList())) {
+            incidentReportAddDto.getSparePartsConfirmationList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentSparePartsService.saveOrUpdateBatch(incidentReportAddDto.getSparePartsConfirmationList());
+        }
+        // 鏂囦欢纭List
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getFileClassConfirmationList())) {
+            incidentReportAddDto.getFileClassConfirmationList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentFileService.saveOrUpdateBatch(incidentReportAddDto.getFileClassConfirmationList());
+        }
+        // 瀹夎楠屾敹璁板綍
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getInstallationAcceptanceRecordList())) {
+            incidentReportAddDto.getInstallationAcceptanceRecordList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentInstallService.saveOrUpdateBatch(incidentReportAddDto.getInstallationAcceptanceRecordList());
+        }
+        // 楠屾敹鏍告煡璁板綍
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getAcceptanceCheckRecordList())) {
+            incidentReportAddDto.getAcceptanceCheckRecordList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentAcceptanceCheckService.saveOrUpdateBatch(incidentReportAddDto.getAcceptanceCheckRecordList());
+        }
+    }
+
+    @Override
+    public IPage<IncidentReportAddDto> getByDeviceId(Integer deviceId, Page page, String processNumber) {
+        return baseMapper.getByDeviceId(page, deviceId, processNumber);
+    }
+
+    @Override
+    public void deleteIncidentReport(Integer id) {
+        baseMapper.deleteById(id);
+        incidentSparePartsService.remove(Wrappers.<IncidentSpareParts>lambdaQuery().eq(IncidentSpareParts::getIncidentId, id));
+        incidentFileService.remove(Wrappers.<IncidentFile>lambdaQuery().eq(IncidentFile::getIncidentId, id));
+        incidentInstallService.remove(Wrappers.<IncidentInstall>lambdaQuery().eq(IncidentInstall::getIncidentId, id));
+        incidentAcceptanceCheckService.remove(Wrappers.<IncidentAcceptanceCheck>lambdaQuery().eq(IncidentAcceptanceCheck::getIncidentId, id));
+    }
+
+    @Override
+    public IncidentReportAddDto getShowIncidentReport(Integer id) {
+        return baseMapper.getShowIncidentReport(id);
+    }
+
+    @Override
+    public void deleteIncidentReportAll(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId) {
+        if (ObjectUtils.isNotEmpty(sparePartsId)) {
+            incidentSparePartsService.removeById(sparePartsId);
+        }
+        if (ObjectUtils.isNotEmpty(fileId)) {
+            incidentFileService.removeById(fileId);
+        }
+        if (ObjectUtils.isNotEmpty(installId)) {
+            incidentInstallService.removeById(installId);
+        }
+        if (ObjectUtils.isNotEmpty(acceptanceCheckId)) {
+            incidentAcceptanceCheckService.removeById(acceptanceCheckId);
+        }
+    }
+
+    @Override
+    public List<IncidentReportExport> incidentReportExport(Integer deviceId) {
+        return baseMapper.incidentReportExport(deviceId);
+    }
+
+    /**
+     * 瀵煎嚭楠屾敹鎶ュ憡
+     * @param deviceId  璁惧id
+     * @param processNumber  娴佺▼鍙�
+     * @param response  鍝嶅簲Word鏂囨。
+     */
+    @Override
+    public void acceptanceCertificateExport(Integer deviceId, String processNumber, HttpServletResponse response) {
+        IncidentReportExportWordDto incidentReport = baseMapper.acceptanceCertificateExport(deviceId, processNumber);
+
+        String submitOperatingPersonnel = incidentReport.getSubmitOperatingPersonnel();
+
+        String operatingPersonnelNameUrl = null;
+        if (submitOperatingPersonnel != null) {
+            operatingPersonnelNameUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, submitOperatingPersonnel))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(operatingPersonnelNameUrl)) {
+                throw new ErrorException("鎵句笉鍒扮敵璇蜂汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/incident-report.docx");
+        Configure configure = Configure.builder()
+                .build();
+        String fileOperatingPersonnelNameUrl = operatingPersonnelNameUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("incidentReport", incidentReport);
+                    put("submitOperatingPersonnelUrl", StringUtils.isNotBlank(fileOperatingPersonnelNameUrl) ? Pictures.ofLocal( imgUrl + "/" + fileOperatingPersonnelNameUrl).create() : null);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧楠屾敹鎶ュ憡", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentSparePartsServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentSparePartsServiceImpl.java
new file mode 100644
index 0000000..45f0176
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/IncidentSparePartsServiceImpl.java
@@ -0,0 +1,11 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.IncidentSparePartsMapper;
+import com.yuanchu.mom.pojo.IncidentSpareParts;
+import com.yuanchu.mom.service.IncidentSparePartsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentSparePartsServiceImpl extends ServiceImpl<IncidentSparePartsMapper, IncidentSpareParts> implements IncidentSparePartsService {
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/InstructionServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/InstructionServiceImpl.java
new file mode 100644
index 0000000..6b90e5e
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/InstructionServiceImpl.java
@@ -0,0 +1,72 @@
+package com.yuanchu.mom.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.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.InstructionDto;
+import com.yuanchu.mom.dto.OperationInstructionDto;
+import com.yuanchu.mom.mapper.InstructionMapper;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.Instruction;
+import com.yuanchu.mom.service.InstructionService;
+import com.yuanchu.mom.service.OperationInstructionService;
+import com.yuanchu.mom.utils.QueryWrappers;
+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;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InstructionServiceImpl extends ServiceImpl<InstructionMapper, Instruction> implements InstructionService {
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<Instruction> numberGenerator;
+
+    @Autowired
+    private GetLook getLook;
+
+    @Override
+    public IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page, OperationInstructionDto operationInstructionDto) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(InstructionDto instructionDto) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId(null);
+        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, Instruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(map1.get("userId"));
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/OperationInstructionServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/OperationInstructionServiceImpl.java
new file mode 100644
index 0000000..4602127
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/OperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.OperationInstructionMapper;
+import com.yuanchu.mom.pojo.OperationInstruction;
+import com.yuanchu.mom.service.OperationInstructionService;
+import com.yuanchu.mom.vo.OperationInstructionVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class OperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements OperationInstructionService {
+
+    @Override
+    public List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/QrShowServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/QrShowServiceImpl.java
new file mode 100644
index 0000000..be76ca6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/QrShowServiceImpl.java
@@ -0,0 +1,218 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yuanchu.mom.mapper.*;
+import com.yuanchu.mom.pojo.DeviceMetricRecord;
+import com.yuanchu.mom.service.CustomService;
+import com.yuanchu.mom.service.InsOrderService;
+import com.yuanchu.mom.service.ProductService;
+import com.yuanchu.mom.service.QrShowService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+
+@Service
+public class QrShowServiceImpl implements QrShowService {
+
+    @Autowired
+    private InsOrderService insOrderService;
+
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    private CustomService customService;
+
+    @Autowired
+    private InsOrderMapper insOrderMapper;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private DeviceMetricRecordMapper deviceMetricRecordMapper;
+
+    @Autowired
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    @Autowired
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    private String getIp(){
+        if(StringUtils.isNotBlank(active)){
+            return "prod".equals(active)?"https://zttx-lims.ztt.cn:8021/lims/":"http://114.132.189.42:8001/";
+        }
+        return "http://192.168.1.124:8001/lims/";
+    }
+
+    @Override
+    public void transformModelByType(Model model, String code, String type) {
+//        if(StringUtils.isNotBlank(type)){
+//            switch (type){
+//                case "word":
+//                    InsOrder insOrder = insOrderService.getOne(Wrappers.<InsOrder>lambdaQuery()
+//                            .eq(InsOrder::getEntrustCode, code));
+//                    Product product = productService.getOne(Wrappers.<Product>lambdaQuery()
+//                            .eq(Product::getName, insOrder.getSample()));
+//                    String insOrderModel = productService.getWordQrModel(insOrder.getId());
+//                    Custom company = customService.getOne(Wrappers.<Custom>lambdaQuery()
+//                            .eq(Custom::getCompany, insOrder.getCompany()));
+//                    String orderType = insOrderMapper.getEnumLabelByValue(insOrder.getOrderType());
+//                    String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+//                    model.addAttribute("entrustCode", code);
+//                    model.addAttribute("productName",product.getName());
+//                    model.addAttribute("productNameEn",product.getNameEn());
+//                    model.addAttribute("insOrderModel", insOrderModel);
+//                    model.addAttribute("company", company.getCompany());
+//                    model.addAttribute("companyEn", company.getCompanyEn());
+//                    model.addAttribute("getTime", insOrder.getExamineTime().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+//                    String getTimeEn = monthNames[insOrder.getExamineTime().getMonthValue() - 1] + " " + insOrder.getExamineTime().getDayOfMonth() + ", " + insOrder.getExamineTime().getYear();
+//                    model.addAttribute("getTimeEn", getTimeEn);
+//                    model.addAttribute("issuingDate", insOrder.getIssuingDate().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+//                    String issuingDateEn = monthNames[insOrder.getIssuingDate().getMonthValue() - 1] + " " + insOrder.getIssuingDate().getDayOfMonth() + ", " + insOrder.getIssuingDate().getYear();
+//                    model.addAttribute("issuingDateEn", issuingDateEn);
+//                    model.addAttribute("orderType", orderType);
+//                    model.addAttribute("orderTypeEn", insOrder.getOrderType());
+//                    break;
+//                case "device":
+//                    //鏌ヨ璁惧涓昏〃淇℃伅
+//                    Device device = deviceMapper.selectOne(Wrappers.<Device>lambdaQuery().eq(Device::getManagementNumber, code));
+//                    if(!Objects.isNull(device)){
+//                        //鏌ヨ璁惧鏍″噯淇℃伅
+//                        DeviceMetricRecord calibrate = getDeviceMetricRecord(device.getId(), "calibrate");
+//                        //鏌ヨ璁惧鏍告煡淇℃伅
+//                        DeviceMetricRecord examine = getDeviceMetricRecord(device.getId(), "examine");
+//                        //鏌ヨ璁惧缁存姢璁板綍
+//                        DeviceMaintenance deviceMaintenance = Optional.ofNullable(deviceMaintenanceMapper.selectOne(Wrappers.<DeviceMaintenance>lambdaQuery()
+//                                .eq(DeviceMaintenance::getDeviceId, device.getId())
+//                                .orderByDesc(DeviceMaintenance::getId)
+//                                .last("limit 1"))).orElse(new DeviceMaintenance());
+//                        model.addAttribute("progress",calcDeviceNextCheckRatio(calibrate.getCalibrationDate(),calibrate.getNextCalibrationDate()));//璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+//                        model.addAttribute("deviceName",device.getDeviceName());//璁惧鍚嶇О
+//                        model.addAttribute("deviceCode",device.getManagementNumber());//璁惧缂栧彿
+//                        model.addAttribute("usedYears",calcUsedYears(device.getActivationDate()));//鍚敤鏃堕暱(骞�)
+//                        model.addAttribute("runStatus",device.getDeviceStatus());//璁惧杩愯鐘舵��
+//                        model.addAttribute("lastCalibrationDate",formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牎鍑嗘棩鏈�
+//                        model.addAttribute("nextCalibrationDate",formatDate(calibrate.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍″噯鏃ユ湡
+//                        String calibrateStatus = "0yes".equals(calibrate.getStatus())?"鍚堟牸":"1no".equals(calibrate.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+//                        model.addAttribute("calibrateStatus",Objects.isNull(calibrate.getCalibrationDate())?"":calibrateStatus);//鏍″噯鎬荤粨璁�
+//                        model.addAttribute("lastExamineDate",formatDate(examine.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牳鏌ユ棩鏈�
+//                        model.addAttribute("nextExamineDate",formatDate(examine.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍告煡鏃ユ湡
+//                        String examineStatus = "0yes".equals(examine.getStatus())?"鍚堟牸":"1no".equals(examine.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+//                        model.addAttribute("examineStatus",Objects.isNull(examine.getCalibrationDate())?"":examineStatus);//鏍告煡鎬荤粨璁�
+//                        model.addAttribute("maintenanceDate",formatDate(deviceMaintenance.getDate(),"yyyy-MM-dd"));//鏈�杩戠淮鎶ゆ棩鏈�
+//                        model.addAttribute("nextMaintenanceDate",formatDate(deviceMaintenance.getNextDate(),"yyyy-MM-dd"));//涓嬫缁存姢鏃ユ湡
+//                        String maintenanceType = "";
+//                        if(!Objects.isNull(deviceMaintenance.getMaintenanceType())){
+//                            maintenanceType = 0==deviceMaintenance.getMaintenanceType()?"浣跨敤鍓嶇淮鎶�":"浣跨敤鍚庣淮鎶�";
+//                        }
+//                        model.addAttribute("maintenanceType",maintenanceType);//缁存姢鎬荤粨璁�
+//                        //娴嬮噺椤圭洰
+//                        String insProduct = "";
+//                        if(StringUtils.isNotBlank(device.getInsProductIds())){
+//                            String[] ids = device.getInsProductIds().split(",");
+//                            List<StructureItemParameter> parameters = structureItemParameterMapper.selectBatchIds(Arrays.asList(ids));
+//                            List<String> itemList = parameters.stream().map(StructureItemParameter::getInspectionItem).distinct().collect(Collectors.toList());
+//                            insProduct = String.join(",",itemList);
+//                        }
+//                        model.addAttribute("insProduct",insProduct);//娴嬮噺椤圭洰
+//                        model.addAttribute("fileName",calibrate.getSystemFileName());
+//                        model.addAttribute("downloadUrl",getIp()+"img/"+calibrate.getSystemFileName());
+//                    }
+//                    break;
+//            }
+//        }
+    }
+
+    /**
+     * 璁$畻鍚敤鏃堕暱
+     * @param activationDate
+     * @return
+     */
+    public double calcUsedYears(LocalDateTime activationDate) {
+        if(Objects.isNull(activationDate)){
+            return 0;
+        }
+        BigDecimal defDays = BigDecimal.valueOf(365);
+        BigDecimal usedDays = BigDecimal.valueOf(Duration.between(activationDate,LocalDateTime.now()).toDays());
+        return usedDays.divide(defDays,2,RoundingMode.HALF_UP).setScale(2,RoundingMode.HALF_UP).doubleValue();
+    }
+
+    /**
+     * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public double calcDeviceNextCheckRatio(Date startDate, Date endDate){
+        if(Objects.isNull(startDate) || Objects.isNull(endDate)){
+            return 0;
+        }
+        LocalDateTime startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        long totalDays = Duration.between(startLocalDate, endLocalDate).toDays();
+        long usedDays = Duration.between(startLocalDate, LocalDateTime.now()).toDays();
+        BigDecimal calcVal = BigDecimal.valueOf(usedDays).divide(BigDecimal.valueOf(totalDays),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
+        if(calcVal.compareTo(BigDecimal.ZERO)<0){
+            calcVal = BigDecimal.ZERO;
+        }else if(calcVal.compareTo(BigDecimal.valueOf(100))>0){
+            calcVal = BigDecimal.valueOf(100);
+        }
+        return calcVal.doubleValue();
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @param deviceId
+     * @param type
+     * @return
+     */
+    public DeviceMetricRecord getDeviceMetricRecord(int deviceId,String type){
+        return Optional.ofNullable(
+                deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)
+                .orderByDesc(DeviceMetricRecord::getCreateTime)
+                .last("limit 1"))).orElse(new DeviceMetricRecord());
+    }
+
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(Date date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        return localDateTime.format(DateTimeFormatter.ofPattern(formatter));
+    }
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(LocalDate date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        return date.format(DateTimeFormatter.ofPattern(formatter));
+    }
+
+
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/ReservationServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/ReservationServiceImpl.java
new file mode 100644
index 0000000..b3746a6
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/ReservationServiceImpl.java
@@ -0,0 +1,122 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.common.PrintChina;
+import com.yuanchu.mom.dto.DeviceDto;
+import com.yuanchu.mom.dto.ReservationDto;
+import com.yuanchu.mom.mapper.DeviceMapper;
+import com.yuanchu.mom.mapper.ReservationMapper;
+import com.yuanchu.mom.pojo.Reservation;
+import com.yuanchu.mom.service.DataConfigService;
+import com.yuanchu.mom.service.ReservationService;
+import com.yuanchu.mom.utils.QueryWrappers;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Service
+public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reservation> implements ReservationService {
+
+    @Autowired
+    private GetLook getLook;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private ReservationMapper reservationMapper;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Override
+    public Map<String, Object> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime) {
+        ArrayList<String> dateTextList = new ArrayList<>();
+        if (StringUtils.isNoneEmpty(starttime)&&StringUtils.isNoneEmpty(endtime)){
+            LocalDate startDate = LocalDate.parse(starttime, DateTimeFormatter.ISO_LOCAL_DATE);
+            LocalDate endDate = LocalDate.parse(endtime, DateTimeFormatter.ISO_LOCAL_DATE);
+            while (!startDate.isAfter(endDate)) {
+                dateTextList.add(startDate.toString());
+                startDate = startDate.plusDays(1);
+            }
+        }
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(Reservation::getReservationTime,starttime,endtime);
+        List<Reservation> reservations = reservationMapper.selectList(lambdaQueryWrapper);
+        HashMap dates = new HashMap<String, Integer>();
+
+        Map<Integer, List<Reservation>> deviceIdcollect = reservations.stream().collect(Collectors.groupingBy(Reservation::getDeviceId));
+        for (Integer deviceId : deviceIdcollect.keySet()) {
+            List<Reservation> deviceIdList = deviceIdcollect.get(deviceId);
+            Map<String, List<Reservation>> collect = deviceIdList.stream().collect(Collectors.groupingBy(Reservation::getReservationTime));
+            for (String date : collect.keySet()) {
+                List<Reservation> reservations1 = collect.get(date);
+                Map<String, List<Reservation>> collect1 = reservations1.stream().collect(Collectors.groupingBy(Reservation::getSpecificTime));
+                for (String s : collect1.keySet()) {
+                    if (!(dates.containsKey(deviceId + date + s))) {
+                        dates.put(deviceId + date + s, collect1.get(s).size());
+                    }
+                }
+            }
+        }
+
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("head", PrintChina.printChina(DeviceDto.class));
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectDeviceParameter");
+        if (map1.get("look") == 1) itemParameter.setCreateUser(map1.get("userId"));
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        List<DeviceDto> records = iPage.getRecords();
+        ArrayList<JSONObject> datas = new ArrayList<>();
+
+        String [] dateArrays={"09:00-12:00","13:00-18:00", "18:00-22:00"};
+        for (DeviceDto record : records) {
+            for (int i = 0; i < dateArrays.length; i++) {
+                String dateArray = dateArrays[i];
+                JSONObject temp = JSON.parseObject(JSON.toJSONString(record));
+                temp.put("time", dateArray);
+                JSONArray dataArray = new JSONArray();
+                for (String date : dateTextList) {
+                    JSONObject dateObject = new JSONObject();
+                    dateObject.put("date", date);
+                    dateObject.put("value", dates.containsKey(record.getId()+date + dateArray) ? dates.get(record.getId()+date + dateArray) : 0);
+                    dataArray.add(dateObject);
+                }
+                temp.put("dateList", dataArray);
+                datas.add(temp);
+            }
+        }
+        map.put("body", datas);
+        return map;
+    }
+
+
+    @Override
+    public List<ReservationDto> selectReservationParameterPage(String deviceId, String reservationTime, String specificTime) {
+        return reservationMapper.selectReservationParameterPage(Integer.parseInt(deviceId), reservationTime, specificTime);
+    }
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/vo/OperationInstructionVo.java b/cnas-server/src/main/java/com/yuanchu/mom/vo/OperationInstructionVo.java
new file mode 100644
index 0000000..fa12c42
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/vo/OperationInstructionVo.java
@@ -0,0 +1,17 @@
+package com.yuanchu.mom.vo;
+
+import com.yuanchu.mom.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionVo extends OperationInstruction {
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+}
diff --git a/cnas-server/src/main/resources/mapper/DeviceAcceptanceFileMapper.xml b/cnas-server/src/main/resources/mapper/DeviceAcceptanceFileMapper.xml
new file mode 100644
index 0000000..796ec3e
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceAcceptanceFileMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceAcceptanceFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceAcceptanceFile">
+        <id column="acceptance_file_id" property="acceptanceFileId" />
+        <result column="acceptance_id" property="acceptanceId" />
+        <result column="type" property="type" />
+        <result column="file_url" property="fileUrl" />
+        <result column="file_name" property="fileName" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceAcceptanceMapper.xml b/cnas-server/src/main/resources/mapper/DeviceAcceptanceMapper.xml
new file mode 100644
index 0000000..a2668ab
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceAcceptanceMapper.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.yuanchu.mom.mapper.DeviceAcceptanceMapper">
+
+    <!-- 璁惧楠屾敹鍒楄〃 -->
+    <select id="pageDeviceAcceptance" resultType="com.yuanchu.mom.pojo.DeviceAcceptance">
+        select * from (
+        select *
+        from device_acceptance
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceAccidentReportMapper.xml b/cnas-server/src/main/resources/mapper/DeviceAccidentReportMapper.xml
new file mode 100644
index 0000000..80f7fb3
--- /dev/null
+++ b/cnas-server/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.yuanchu.mom.mapper.DeviceAccidentReportMapper">
+
+    <!-- 璁惧浜嬫晠鎶ュ憡鍒楄〃 -->
+    <select id="pageDeviceAccidentReport" resultType="com.yuanchu.mom.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.yuanchu.mom.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-server/src/main/resources/mapper/DeviceBorrowMapper.xml b/cnas-server/src/main/resources/mapper/DeviceBorrowMapper.xml
new file mode 100644
index 0000000..684da3c
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceBorrowMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceBorrowMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceBorrow">
+        <id column="id" property="id"/>
+        <result column="process_number" property="processNumber"/>
+        <result column="device_id" property="deviceId"/>
+        <result column="unify_number" property="unifyNumber"/>
+        <result column="recipient_user" property="recipientUser"/>
+        <result column="recipient_state" property="recipientState"/>
+        <result column="recipient_time" property="recipientTime"/>
+        <result column="submit_user" property="submitUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="now_state" property="nowState"/>
+        <result column="now_user" property="nowUser"/>
+        <result column="url" property="url"/>
+        <result column="file_name" property="fileName"/>
+        <result column="next_user" property="nextUser"/>
+        <result column="submit_operation_user" property="submitOperationUser"/>
+        <result column="submit_operation_time" property="submitOperationTime"/>
+        <result column="reback_user" property="rebackUser"/>
+        <result column="reback_time" property="rebackTime"/>
+        <result column="receive_state" property="receiveState"/>
+        <result column="device_user" property="deviceUser"/>
+        <result column="note" property="note"/>
+        <result column="receive_operation_user" property="receiveOperationUser"/>
+        <result column="receive_operation_time" property="receiveOperationTime"/>
+    </resultMap>
+    <select id="deviceBorrowPage" resultType="com.yuanchu.mom.pojo.DeviceBorrow">
+        select * from (
+        select db.*,device_name
+        from device_borrow db
+        left join `center-lims`.device on db.device_id=device.id
+        )a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getDeviceBorrowBydeviceId" resultType="com.yuanchu.mom.pojo.DeviceBorrow">
+        select db.*,device_name
+        from device_borrow db
+                 left join `center-lims`.device on db.device_id=device.id
+        where device_id=#{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml b/cnas-server/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
new file mode 100644
index 0000000..996a7ae
--- /dev/null
+++ b/cnas-server/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.yuanchu.mom.mapper.DeviceBreakdownMaintenanceMapper">
+
+    <!--璁惧鏁呴殰缁翠慨鍒楄〃-->
+    <select id="pageDeviceBreakdownMaintenance" resultType="com.yuanchu.mom.pojo.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-server/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml b/cnas-server/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml
new file mode 100644
index 0000000..14d1b99
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.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.yuanchu.mom.mapper.DeviceCalibrationPlanDetailMapper">
+
+    <!-- 璁惧鏍″噯璁″垝璇︽儏鍒楄〃 -->
+    <select id="pageDeviceCalibrationPlanDetail" resultType="com.yuanchu.mom.pojo.DeviceCalibrationPlanDetail">
+        select * from (
+        select *
+        from device_calibration_plan_detail
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml b/cnas-server/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
new file mode 100644
index 0000000..af97d5a
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceCalibrationPlanMapper">
+
+    <!-- 璁惧鏍″噯璁″垝鍒楄〃 -->
+    <select id="pageDeviceCalibrationPlan" resultType="com.yuanchu.mom.dto.DeviceCalibrationPlanDto">
+        select *
+        from (select cqm.*,
+        u1.name write_name,
+        u3.name ratify_name
+        from device_calibration_plan cqm
+        left join user u1 on u1.id = cqm.write_user_id
+        left join user u3 on u3.id = cqm.ratify_user_id
+        order by cqm.create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml
new file mode 100644
index 0000000..6518609
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExaminePlanDetailsMapper">
+
+
+    <!--璁惧鏍告煡璁″垝璇︽儏鍒楄〃-->
+    <select id="pageDeviceExaminePlanDetail" resultType="com.yuanchu.mom.pojo.DeviceExaminePlanDetails">
+        select * from (
+        select *
+        from device_examine_plan_details
+        order by check_time asc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExaminePlanMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExaminePlanMapper.xml
new file mode 100644
index 0000000..dd974fd
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExaminePlanMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExaminePlanMapper">
+
+    <!-- 璁惧鏍告煡璁″垝鍒楄〃 -->
+    <select id="deviceExaminePlanDetailsMapper" resultType="com.yuanchu.mom.dto.DeviceExaminePlanDto">
+        select *
+        from (select cqm.*,
+        u1.name write_name,
+        u3.name ratify_name
+        from device_examine_plan cqm
+        left join user u1 on u1.id = cqm.write_user_id
+        left join user u3 on u3.id = cqm.ratify_user_id
+        order by cqm.create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectExamineExaminePlanDto" resultType="com.yuanchu.mom.dto.DeviceExaminePlanDto">
+        select
+            cqm.*,
+            date_format(cqm.write_time, '%Y-%m-%d') writeTimeStr,
+            date_format(cqm.ratify_time, '%Y-%m-%d') ratifyTimeStr,
+            date_format(cqm.create_time, '%Y') year,
+            u1.name write_name,
+            u3.name ratify_name
+        from device_examine_plan cqm
+        left join user u1 on u1.id = cqm.write_user_id
+        left join user u3 on u3.id = cqm.ratify_user_id
+        where cqm.plan_id = #{deviceExaminePlanId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastDetailsMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastDetailsMapper.xml
new file mode 100644
index 0000000..056d18a
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastDetailsMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExamineRecordContrastDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceExamineRecordContrastDetails">
+        <id column="record_contrast_details_id" property="recordContrastDetailsId" />
+        <result column="record_contrast_id" property="recordContrastId" />
+        <result column="check_items" property="checkItems" />
+        <result column="indication_a" property="indicationA" />
+        <result column="indication_b" property="indicationB" />
+        <result column="indication_c" property="indicationC" />
+        <result column="d_value" property="dValue" />
+        <result column="deviation" property="deviation" />
+        <result column="determine" property="determine" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml
new file mode 100644
index 0000000..4f4d7d6
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExamineRecordContrastMapper">
+
+    <!-- 鏌ヨ鏍告煡瀵规瘮璁板綍 -->
+    <select id="getExamineRecordContrast" resultType="com.yuanchu.mom.dto.DeviceExamineRecordContrastDto">
+        select derc.*,
+               d1.device_name aDeviceName,
+               d1.management_number aDeviceNumber,
+               d2.device_name bDeviceName,
+               d2.management_number bDeviceNumber,
+               d3.device_name cDeviceName,
+               d3.management_number cDeviceNumber
+        from device_examine_record_contrast derc
+                 left join device d1 on d1.id = derc.a_device_id
+                 left join device d2 on d2.id = derc.a_device_id
+                 left join device d3 on d3.id = derc.a_device_id
+        where derc.plan_details_id = #{planDetailsId}
+    </select>
+    <select id="selectExamineRecordContrastDto"
+            resultType="com.yuanchu.mom.dto.DeviceExamineRecordContrastDto">
+        select derc.*,
+               d1.device_name aDeviceName,
+               d1.management_number aDeviceNumber,
+               d2.device_name bDeviceName,
+               d2.management_number bDeviceNumber,
+               d3.device_name cDeviceName,
+               d3.management_number cDeviceNumber,
+               DATE_FORMAT(derc.create_time, '%Y-%m-%d') checkerTimeStr,
+               DATE_FORMAT(derc.review_time, '%Y-%m-%d') reviewTimeStr,
+               d1.storage_point labName
+        from device_examine_record_contrast derc
+                 left join device d1 on d1.id = derc.a_device_id
+                 left join device d2 on d2.id = derc.a_device_id
+                 left join device d3 on d3.id = derc.a_device_id
+        where derc.plan_details_id = #{planDetailsId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExamineRecordDetailMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExamineRecordDetailMapper.xml
new file mode 100644
index 0000000..8d8167e
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExamineRecordDetailMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExamineRecordDetailMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceExamineRecordDetail">
+        <id column="record_detail_id" property="recordDetailId" />
+        <result column="record_id" property="recordId" />
+        <result column="data_value1" property="dataValue1" />
+        <result column="data_value2" property="dataValue2" />
+        <result column="data_value3" property="dataValue3" />
+        <result column="data_value4" property="dataValue4" />
+        <result column="data_value5" property="dataValue5" />
+        <result column="data_value6" property="dataValue6" />
+        <result column="data_value7" property="dataValue7" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExamineRecordMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExamineRecordMapper.xml
new file mode 100644
index 0000000..25e587c
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExamineRecordMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExamineRecordMapper">
+
+    <select id="getExamineRecord" resultType="com.yuanchu.mom.dto.DeviceExamineRecordDto">
+        select der.*,
+               d.device_name,
+               d.management_number deviceNumber
+        from device_examine_record der
+                 left join device_examine_plan_details depd on depd.plan_details_id = der.plan_details_id
+                 left join device d on d.id = depd.device_id
+        where der.plan_details_id = #{planDetailsId}
+    </select>
+    <select id="selectReviewExamineRecordDto" resultType="com.yuanchu.mom.dto.DeviceExamineRecordDto">
+        select der.*,
+               Date_Format(der.update_time, '%Y-%m-%d') updateTimeStr,
+               d.device_name,
+               d.management_number deviceNumber
+        from device_examine_record der
+                 left join device_examine_plan_details depd on depd.plan_details_id = der.plan_details_id
+                 left join device d on d.id = depd.device_id
+        where der.plan_details_id = #{planDetailsId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceExternalApplyMapper.xml b/cnas-server/src/main/resources/mapper/DeviceExternalApplyMapper.xml
new file mode 100644
index 0000000..c7c04f4
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceExternalApplyMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceExternalApplyMapper">
+
+    <!--鍒╃敤澶栭儴璁惧鐢宠鍒楄〃-->
+    <select id="pageDeviceExternalApply" resultType="com.yuanchu.mom.pojo.DeviceExternalApply">
+        select * from (
+        select *
+        from device_external_apply
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceExternalById" resultType="com.yuanchu.mom.pojo.DeviceExternalApply">
+        select
+            dea.*
+        from device_external_apply dea
+        where dea.external_apply_id = #{externalApplyId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceFaultOneMapper.xml b/cnas-server/src/main/resources/mapper/DeviceFaultOneMapper.xml
new file mode 100644
index 0000000..aa8e4ad
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceFaultOneMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceFaultOneMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceFaultOne">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="process_number" property="processNumber" />
+        <result column="measure_of_accuracy" property="measureOfAccuracy" />
+        <result column="fault_situation" property="faultSituation" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="method_cost" property="methodCost" />
+        <result column="admin_audit_option" property="adminAuditOption" />
+        <result column="admin_next_pesponsible" property="adminNextPesponsible" />
+        <result column="admin_operating_personnel" property="adminOperatingPersonnel" />
+        <result column="technical_audit_option" property="technicalAuditOption" />
+        <result column="technical_next_pesponsible" property="technicalNextPesponsible" />
+        <result column="technical_operating_personnel" property="technicalOperatingPersonnel" />
+        <result column="technical_date" property="technicalDate" />
+        <result column="maintain_situation" property="maintainSituation" />
+        <result column="maintain_next_pesponsible" property="maintainNextPesponsible" />
+        <result column="maintain_operating_personnel" property="maintainOperatingPersonnel" />
+        <result column="maintain_date" property="maintainDate" />
+        <result column="check_cal_situation" property="checkCalSituation" />
+        <result column="after_maintenance_operating_personnel" property="afterMaintenanceOperatingPersonnel" />
+        <result column="after_maintenance_date" property="afterMaintenanceDate" />
+        <result column="current_status" property="currentState" />
+        <result column="submit_person" property="submitPerson" />
+        <result column="current_responsible" property="currentResponsible" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <select id="deviceFaultOnePage" resultType="com.yuanchu.mom.dto.DeviceFaultOneDto">
+        select dfo.*,
+               d.device_name,
+               d.management_number,
+               d.specification_model
+        from device_fault_one dfo
+                 left join device d on d.id = dfo.device_id
+        where dfo.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and dfo.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceInspectionRecordDetailsMapper.xml b/cnas-server/src/main/resources/mapper/DeviceInspectionRecordDetailsMapper.xml
new file mode 100644
index 0000000..989d1f9
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceInspectionRecordDetailsMapper.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.yuanchu.mom.mapper.DeviceInspectionRecordDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceInspectionRecordDetails">
+        <id column="inspection_record_detail_id" property="inspectionRecordDetailId" />
+        <result column="test_items" property="testItems" />
+        <result column="standard_value" property="standardValue" />
+        <result column="measured_value" property="measuredValue" />
+        <result column="indication_error" property="indicationError" />
+        <result column="allowable_error" property="allowableError" />
+        <result column="single_item_conclusion" property="singleItemConclusion" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user_id" property="updateUserId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceInspectionRecordMapper.xml b/cnas-server/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
new file mode 100644
index 0000000..ae3146a
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceInspectionRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceInspectionRecord">
+        <id column="inspection_record" property="inspectionRecord" />
+        <result column="material_name" property="materialName" />
+        <result column="material_model" property="materialModel" />
+        <result column="material_management_number" property="materialManagementNumber" />
+        <result column="material_accuracy_grade" property="materialAccuracyGrade" />
+        <result column="temperature" property="temperature" />
+        <result column="humidity" property="humidity" />
+        <result column="test_conclusion" property="testConclusion" />
+        <result column="remark" property="remark" />
+        <result column="recorder" property="recorder" />
+        <result column="recorder_id" property="recorderId" />
+        <result column="reviewer" property="reviewer" />
+        <result column="reviewer_id" property="reviewerId" />
+        <result column="test_date" property="testDate" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user_id" property="updateUserId" />
+    </resultMap>
+    <select id="selectDeviceParameterPage" resultType="com.yuanchu.mom.pojo.DeviceInspectionRecord">
+        SELECT
+            *
+        from device_inspection_record
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceMaintenanceMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMaintenanceMapper.xml
new file mode 100644
index 0000000..f41688b
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceMaintenanceMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceMaintenanceMapper">
+
+    <select id="getDeviceMaintenanceParam" resultType="com.yuanchu.mom.pojo.DeviceMaintenance">
+        select id,device_id,device_name, device_number,management_number,content,name
+        ,date from device_maintenance
+    </select>
+
+<!--    <select id="getDeviceMaintenancePage" resultType="com.yuanchu.mom.pojo.DeviceMaintenance">-->
+<!--        select *-->
+<!--        from device_maintenance dm-->
+<!--        where dm.device_id = #{deviceId}-->
+<!--    </select>-->
+
+    <select id="deviceMaintenanceExport" resultType="com.yuanchu.mom.excel.DeviceMaintenanceExport">
+        select id, device_id, device_name, device_number, management_number, content, date, if(maintenance_type = 1, '璁″垝涓淮鎶�', '浣跨敤鍓嶅悗缁存姢'), next_date, name, comments
+        from device_maintenance dm
+        where dm.device_id = #{deviceId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml
new file mode 100644
index 0000000..fbcbd2b
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceMaintenancePlanDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceMaintenancePlanDetails">
+        <id column="maintenance_plan_detail_id" property="maintenancePlanDetailId" />
+        <result column="maintenance_plan_id" property="maintenancePlanId" />
+        <result column="device_id" property="deviceId" />
+        <result column="maintenance_site" property="maintenanceSite" />
+        <result column="maintenance_content" property="maintenanceContent" />
+        <result column="maintenance_intervals" property="maintenanceIntervals" />
+    </resultMap>
+    <select id="deviceInspectionRecordDetailsList"
+            resultType="com.yuanchu.mom.dto.DeviceMaintenancePlanDetailsDto">
+        select
+            dmpd.*,
+            d.device_name,
+            d.management_number device_number,
+            d.specification_model,
+            d.management_number,
+            d.storage_point
+        from device_maintenance_plan_details dmpd
+        left join device d on dmpd.device_id = d.id
+        where dmpd.maintenance_plan_id = #{maintenancePlanId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml
new file mode 100644
index 0000000..3c4d75b
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceMaintenancePlanMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceMaintenancePlan">
+        <id column="maintenance_plan_id" property="maintenancePlanId" />
+        <result column="create_user" property="createUser" />
+        <result column="create_id" property="createId" />
+        <result column="create_date" property="createDate" />
+        <result column="audit_id" property="auditId" />
+        <result column="audit" property="audit" />
+        <result column="audit_date" property="auditDate" />
+    </resultMap>
+
+    <!-- 鏍规嵁璁惧id鏌ヨ璁惧鐨勪繚鍏昏鍒� -->
+    <select id="selectDeviceParameterPage" resultType="com.yuanchu.mom.pojo.DeviceMaintenancePlan">
+        select
+            *
+        from device_maintenance_plan
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectMaintenancePlanById" resultType="com.yuanchu.mom.dto.DeviceMaintenancePlanDto">
+        select
+            dmp.*,
+            date_format(dmp.date_preparation, '%Y-%m-%d') as datePreparationStr,
+            date_format(dmp.audit_date, '%Y-%m-%d') as auditDateStr
+        from device_maintenance_plan dmp
+        where dmp.maintenance_plan_id = #{maintenancePlanId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMapper.xml
index 1bb8478..f4c9e77 100644
--- a/cnas-server/src/main/resources/mapper/DeviceMapper.xml
+++ b/cnas-server/src/main/resources/mapper/DeviceMapper.xml
@@ -107,7 +107,14 @@
         device d
         LEFT JOIN `user` u ON u.id = d.equipment_manager
         LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
+        LEFT JOIN device_metric_record cmr ON d.id = cmr.device_id
         LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+        <where>
+            <if test="laboratoryNameIsNull != null and laboratoryNameIsNull == true">
+                l.laboratory_name is null
+            </if>
+            AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = ''
+        </where>
         GROUP BY
         d.id,
         u.name, l.laboratory_name
diff --git a/cnas-server/src/main/resources/mapper/DeviceMetricRecordMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMetricRecordMapper.xml
new file mode 100644
index 0000000..2b59410
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceMetricRecordMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceMetricRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceMetricRecord">
+        <id column="id" property="id" />
+        <result column="unit_of_measure" property="unitOfMeasure" />
+        <result column="calibration_date" property="calibrationDate" />
+        <result column="next_calibration_date" property="nextCalibrationDate" />
+        <result column="calculating_apparatus" property="calculatingApparatus" />
+        <result column="standard_range" property="standardRange" />
+        <result column="calibration_standard_uncertainty" property="calibrationStandardUncertainty" />
+        <result column="by_document" property="byDocument" />
+        <result column="certificate_serial_number" property="certificateSerialNumber" />
+        <result column="status" property="status" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceMetricsCopyMapper.xml b/cnas-server/src/main/resources/mapper/DeviceMetricsCopyMapper.xml
new file mode 100644
index 0000000..87f5db0
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceMetricsCopyMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceMetricsCopyMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceMetricsCopy">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="measurement_parameter" property="measurementParameter" />
+        <result column="range_of_measurement" property="rangeOfMeasurement" />
+        <result column="max_permissible_error" property="maxPermissibleError" />
+        <result column="judgment_criteria" property="judgmentCriteria" />
+        <result column="created_by" property="createdBy" />
+        <result column="creation_time" property="creationTime" />
+        <result column="is_calibration" property="isCalibration" />
+        <result column="result" property="result" />
+        <result column="single_result_statement" property="singleResultStatement" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceScrappedMapper.xml b/cnas-server/src/main/resources/mapper/DeviceScrappedMapper.xml
new file mode 100644
index 0000000..936c810
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceScrappedMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceScrappedMapper">
+
+    <!-- 璁惧鎶ュ簾鐢宠鍒楄〃 -->
+    <select id="pageDeviceScrapped" resultType="com.yuanchu.mom.pojo.DeviceScrapped">
+        select * from (
+        select *
+        from device_scrapped
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceScrappedById" resultType="com.yuanchu.mom.dto.DeviceScrappedDto">
+        select
+            *,
+            date_format(applicant_date,'%Y骞�%m鏈�%d鏃�') as applicantDateStr,
+            date_format(department_head_date,'%Y骞�%m鏈�%d鏃�') as departmentHeadDateStr,
+            date_format(metering_room_date,'%Y骞�%m鏈�%d鏃�') as meteringRoomDateStr,
+            date_format(approver_date,'%Y骞�%m鏈�%d鏃�') as approverDateStr
+        from device_scrapped
+        where scrapped_id = #{scrappedId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceStateMapper.xml b/cnas-server/src/main/resources/mapper/DeviceStateMapper.xml
new file mode 100644
index 0000000..99a655a
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceStateMapper.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceStateMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceState">
+        <id column="state_id" property="stateId" />
+        <result column="accessory_part" property="accessoryPart" />
+        <result column="device_status" property="deviceStatus" />
+        <result column="reason" property="reason" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="department_review_opinion" property="departmentReviewOpinion" />
+        <result column="department_next_pesponsible" property="departmentNextPesponsible" />
+        <result column="department_operating_personnel" property="departmentOperatingPersonnel" />
+        <result column="department_date" property="departmentDate" />
+        <result column="measuring_room_review_opinion" property="measuringRoomReviewOpinion" />
+        <result column="measuring_room_next_pesponsible" property="measuringRoomNextPesponsible" />
+        <result column="measuring_room_operating_personnel" property="measuringRoomOperatingPersonnel" />
+        <result column="measuring_room_date" property="measuringRoomDate" />
+        <result column="approval_opinion" property="approvalOpinion" />
+        <result column="approval_next_pesponsible" property="approvalNextPesponsible" />
+        <result column="approval_operating_personnel" property="approvalOperatingPersonnel" />
+        <result column="approval_date" property="approvalDate" />
+        <result column="current_state" property="currentState" />
+        <result column="device_id" property="deviceId" />
+        <result column="current_responsible" property="currentResponsible" />
+    </resultMap>
+
+    <select id="getDeviceStatePage" resultType="com.yuanchu.mom.dto.DeviceStateDto">
+        select ds.*,
+               d.device_name,
+               d.management_number,
+               d.specification_model,
+               d.large_category
+        from device_state ds
+                 left join device d on d.id = ds.device_id
+        where ds.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and ds.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml b/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml
new file mode 100644
index 0000000..a6d4fd3
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceTraceabilityManagementDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceTraceabilityManagementDetails">
+        <id column="traceability_management_detail_id" property="traceabilityManagementDetailId" />
+        <result column="traceability_management_id" property="traceabilityManagementId" />
+        <result column="device_id" property="deviceId" />
+        <result column="technical_index_parameters" property="technicalIndexParameters" />
+        <result column="technical_requirements" property="technicalRequirements" />
+        <result column="verification_cycle" property="verificationCycle" />
+        <result column="verification_unit" property="verificationUnit" />
+        <result column="remark" property="remark" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+    <select id="deviceTraceabilityManagementDetailsList"
+            resultType="com.yuanchu.mom.dto.DeviceTraceabilityManagementDetailsDto">
+        select
+            dtmd.*,
+            d.device_name,
+            d.device_name,
+            d.specification_model,
+            d.management_number
+        from device_traceability_management_details dtmd
+                 left join device d on dtmd.device_id = d.id
+        where dtmd.traceability_management_id = #{traceabilityManagementId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml b/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml
new file mode 100644
index 0000000..c3e5ae1
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceTraceabilityManagementMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.DeviceTraceabilityManagement">
+        <id column="traceability_management_id" property="traceabilityManagementId" />
+        <result column="compiler_id" property="compilerId" />
+        <result column="compiler" property="compiler" />
+        <result column="date_preparation" property="datePreparation" />
+        <result column="status" property="status" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="audit_id" property="auditId" />
+        <result column="audit" property="audit" />
+        <result column="audit_date" property="auditDate" />
+        <result column="audit_remark" property="auditRemark" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+    <select id="selectDeviceParameterPage" resultType="com.yuanchu.mom.pojo.DeviceTraceabilityManagement">
+        select
+        *
+        from device_traceability_management
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceTraceabilityManagementById"
+            resultType="com.yuanchu.mom.dto.DeviceTraceabilityManagementDto">
+        select
+            dtm.*,
+            date_format(dtm.date_preparation, '%Y-%m-%d') as datePreparationStr,
+            date_format(dtm.audit_date, '%Y-%m-%d') as auditDateStr
+        from device_traceability_management dtm
+        where dtm.traceability_management_id = #{traceabilityManagementId}
+    </select>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml b/cnas-server/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml
new file mode 100644
index 0000000..9991e89
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.IncidentAcceptanceCheckMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.IncidentAcceptanceCheck">
+        <id column="acceptance_checkId" property="acceptanceCheckId" />
+        <result column="instrument_module" property="instrumentModule" />
+        <result column="verification_parameter" property="verificationParameter" />
+        <result column="acceptable_limit" property="acceptableLimit" />
+        <result column="verification_result" property="verificationResult" />
+        <result column="verification_conclusion" property="verificationConclusion" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/IncidentFileMapper.xml b/cnas-server/src/main/resources/mapper/IncidentFileMapper.xml
new file mode 100644
index 0000000..f521ced
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/IncidentFileMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.IncidentFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.IncidentFile">
+        <id column="file_id" property="fileId" />
+        <result column="expected_copies" property="expectedCopies" />
+        <result column="actual_copies" property="actualCopies" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/IncidentInstallMapper.xml b/cnas-server/src/main/resources/mapper/IncidentInstallMapper.xml
new file mode 100644
index 0000000..0bfa771
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/IncidentInstallMapper.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.yuanchu.mom.mapper.IncidentInstallMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.IncidentInstall">
+        <id column="install_id" property="installId" />
+        <result column="installation_project" property="installationProject" />
+        <result column="installation_situation" property="installationSituation" />
+        <result column="installation_completed" property="installationCompleted" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/IncidentReportMapper.xml b/cnas-server/src/main/resources/mapper/IncidentReportMapper.xml
new file mode 100644
index 0000000..cb035bf
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/IncidentReportMapper.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.IncidentReportMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.IncidentReport">
+        <id column="id" property="id" />
+        <result column="process_number" property="processNumber" />
+        <result column="device_id" property="deviceId" />
+        <result column="serial_number" property="serialNumber" />
+        <result column="device_class" property="deviceClass" />
+        <result column="check_outer_packaging" property="checkOuterPackaging" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="unpacking_acceptance_conclusion" property="unpackingAcceptanceConclusion" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_remarks" property="submitRemarks" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="unpacking_review_opinion" property="unpackingReviewOpinion" />
+        <result column="unpacking_next_pesponsible" property="unpackingNextPesponsible" />
+        <result column="unpacking_operating_personnel" property="unpackingOperatingPersonnel" />
+        <result column="unpacking_date" property="unpackingDate" />
+        <result column="install_location" property="installLocation" />
+        <result column="install_remarks" property="installRemarks" />
+        <result column="install_next_pesponsible" property="installNextPesponsible" />
+        <result column="install_operating_personnel" property="installOperatingPersonnel" />
+        <result column="install_date" property="installDate" />
+        <result column="installation_acceptance_compound_opinion" property="installationAcceptanceCompoundOpinion" />
+        <result column="installation_acceptance_next_pesponsible" property="installationAcceptanceNextPesponsible" />
+        <result column="installation_acceptance_operating_personnel" property="installationAcceptanceOperatingPersonnel" />
+        <result column="installation_acceptance_date" property="installationAcceptanceDate" />
+        <result column="acceptance_check_unpacking_conclusion" property="acceptanceCheckUnpackingConclusion" />
+        <result column="acceptance_check_next_pesponsible" property="acceptanceCheckNextPesponsible" />
+        <result column="acceptance_check_operating_personnel" property="acceptanceCheckOperatingPersonnel" />
+        <result column="acceptance_check_date" property="acceptanceCheckDate" />
+        <result column="acceptance_audit_operating_personnel" property="acceptanceAuditOperatingPersonnel" />
+        <result column="acceptance_audit_date" property="acceptanceAuditDate" />
+        <result column="create_user" property="createUser" />
+        <result column="current_state" property="currentState" />
+        <result column="create_time" property="createTime" />
+        <result column="current_responsible" property="currentResponsible" />
+        <result column="acceptance_audit_audit_opinion" property="acceptanceAuditAuditOpinion" />
+    </resultMap>
+
+    <resultMap id="IncidentReportAddDtoMap" type="com.yuanchu.mom.dto.IncidentReportAddDto" extends="BaseResultMap">
+        <result column="device_name" property="deviceName" />
+        <result column="management_number" property="managementNumber" />
+        <result column="manufacturer" property="manufacturer" />
+        <result column="specification_model" property="specificationModel" />
+        <collection property="sparePartsConfirmationList" ofType="com.yuanchu.mom.pojo.IncidentSpareParts">
+            <id column="spare_parts_id" property="sparePartsId" />
+            <result column="name" property="name" />
+            <result column="number" property="number" />
+            <result column="note" property="note" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="fileClassConfirmationList" ofType="com.yuanchu.mom.pojo.IncidentFile">
+            <id column="file_id" property="fileId" />
+            <result column="expected_copies" property="expectedCopies" />
+            <result column="actual_copies" property="actualCopies" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="installationAcceptanceRecordList" ofType="com.yuanchu.mom.pojo.IncidentInstall">
+            <id column="install_id" property="installId" />
+            <result column="installation_project" property="installationProject" />
+            <result column="installation_situation" property="installationSituation" />
+            <result column="installation_completed" property="installationCompleted" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="acceptanceCheckRecordList" ofType="com.yuanchu.mom.pojo.IncidentAcceptanceCheck">
+            <id column="acceptance_check_id" property="acceptanceCheckId" />
+            <result column="instrument_module" property="instrumentModule" />
+            <result column="verification_parameter" property="verificationParameter" />
+            <result column="acceptable_limit" property="acceptableLimit" />
+            <result column="verification_result" property="verificationResult" />
+            <result column="verification_conclusion" property="verificationConclusion" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+    </resultMap>
+
+    <select id="getByDeviceId" resultType="com.yuanchu.mom.dto.IncidentReportAddDto">
+        select dir.*, d.device_name, d.management_number, u.name submitUser
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+            left join user u on u.id = dir.create_user
+        where dir.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and dir.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+
+    <select id="getShowIncidentReport" resultMap="IncidentReportAddDtoMap">
+        select dir.*, d.device_name, d.management_number, d.manufacturer, d.specification_model,
+               diac.acceptance_check_id, diac.instrument_module,diac.verification_parameter, diac.acceptable_limit, diac.verification_result, diac.verification_conclusion,
+               disp.spare_parts_id, disp.name, disp.number, disp.note,
+               dif.file_id, dif.expected_copies, dif.actual_copies,
+               dii.install_id, dii.installation_completed, dii.installation_project, dii.installation_situation
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+                 left join device_incident_acceptance_check diac on diac.incident_id = dir.id
+                 left join device_incident_file dif on dif.incident_id = dir.id
+                 left join device_incident_install dii on dii.incident_id = dir.id
+                 left join device_incident_spare_parts disp on disp.incident_id = dir.id
+        where dir.id = #{id}
+    </select>
+
+    <select id="incidentReportExport" resultType="com.yuanchu.mom.excel.IncidentReportExport">
+        select dir.*, d.device_name, d.management_number, d.manufacturer, d.specification_model
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+        where dir.device_id = #{deviceId}
+    </select>
+
+    <select id="acceptanceCertificateExport" resultType="com.yuanchu.mom.dto.IncidentReportExportWordDto">
+        select
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/IncidentSparePartsMapper.xml b/cnas-server/src/main/resources/mapper/IncidentSparePartsMapper.xml
new file mode 100644
index 0000000..3456cc5
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/IncidentSparePartsMapper.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.yuanchu.mom.mapper.IncidentSparePartsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.IncidentSpareParts">
+        <id column="spare_parts_id" property="sparePartsId" />
+        <result column="name" property="name" />
+        <result column="number" property="number" />
+        <result column="note" property="note" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml b/cnas-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
new file mode 100644
index 0000000..38dcf28
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.DeviceRecordMapper">
+
+    <select id="deviceRecordPage" resultType="com.yuanchu.mom.dto.DeviceRecordDto">
+        select dr.*,
+               d.device_name,
+               d.management_number
+        from device_record dr
+                 left join device d on d.id = dr.device_id
+        where 1=1
+        <if test="deviceId != null">
+            and dr.device_id = #{deviceId}
+        </if>
+        <if test="sampleCode != '' and sampleCode != null">
+            and dr.sample_code like concat('%', #{sampleCode}, '%')
+        </if>
+        <if test="managementNumber != '' and managementNumber != null">
+            and d.management_number like concat('%', #{managementNumber}, '%')
+        </if>
+        <if test="userId != null">
+            and dr.use_person_id = #{userId}
+            and dr.use_start_date is null
+        </if>
+        ORDER BY (dr.use_start_date IS NULL) desc , dr.use_start_date DESC
+    </select>
+
+
+    <select id="selectNotFilled" resultType="com.yuanchu.mom.dto.DeviceRecordDto">
+        select dr.*,
+               d.device_name,
+               d.management_number
+        from device_record dr
+                 left join device d on d.id = dr.device_id
+        where dr.use_start_date is null
+    </select>
+
+    <!-- 鏌ヨ瀵煎嚭璁惧浣跨敤璁板綍 -->
+    <select id="selectExportList" resultType="com.yuanchu.mom.pojo.DeviceRecord">
+        select dr.*
+        from device_record dr
+        where dr.use_start_date is not null
+        <if test="deviceId != null">
+            and dr.device_id = #{deviceId}
+        </if>
+        <if test="exportDate != '' and exportDate != null">
+            and DATE_FORMAT(dr.use_start_date, '%Y-%m') = #{exportDate};
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/InstructionMapper.xml b/cnas-server/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..36edc87
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.InstructionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.Instruction">
+        <id column="id" property="id" />
+        <result column="application_number" property="applicationNumber" />
+        <result column="person_liable" property="personLiable" />
+        <result column="controlled_application_description" property="controlledApplicationDescription" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.yuanchu.mom.dto.OperationInstructionDto">
+        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-server/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-server/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..77dd4d0
--- /dev/null
+++ b/cnas-server/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.yuanchu.mom.mapper.OperationInstructionMapper">
+
+    <select id="homeworkGuidebookEditor" resultType="com.yuanchu.mom.vo.OperationInstructionVo">
+        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/cnas-server/src/main/resources/mapper/ReservationMapper.xml b/cnas-server/src/main/resources/mapper/ReservationMapper.xml
new file mode 100644
index 0000000..5721573
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/ReservationMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.ReservationMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.Reservation">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="customer_name" property="customerName" />
+        <result column="reservation_time" property="reservationTime" />
+        <result column="specific_time" property="specificTime" />
+        <result column="link_person" property="linkPerson" />
+        <result column="phone" property="phone" />
+        <result column="device_number" property="deviceNumber" />
+        <result column="reservation_specification" property="reservationSpecification" />
+        <result column="create_user" property="createUser" />
+        <result column="create_date" property="createDate" />
+    </resultMap>
+
+
+    <select id="selectReservationParameterPage" resultType="com.yuanchu.mom.dto.ReservationDto">
+        SELECT
+        a.id,
+        a.create_date,
+        a.create_user,
+        a.customer_name,
+        a.device_id,
+        a.device_name,
+        a.device_number,
+        a.link_person,
+        a.phone ,
+        a.reservation_specification,
+        b.name
+        FROM
+        device_reservation a
+        INNER JOIN USER b ON a.create_user = b.id
+        where a.device_id = #{deviceId} and  a.reservation_time = #{reservationTime} and a.specific_time=#{specificTime}
+    </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/static/word/acceptance-certificate.docx b/cnas-server/src/main/resources/static/word/acceptance-certificate.docx
new file mode 100644
index 0000000..c4412dd
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/acceptance-certificate.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-accident-report.docx b/cnas-server/src/main/resources/static/word/device-accident-report.docx
new file mode 100644
index 0000000..6263ba9
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-accident-report.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-breakdown-maintenance.docx b/cnas-server/src/main/resources/static/word/device-breakdown-maintenance.docx
new file mode 100644
index 0000000..595edc5
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-breakdown-maintenance.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-calibration-plan.docx b/cnas-server/src/main/resources/static/word/device-calibration-plan.docx
new file mode 100644
index 0000000..4f4e6ff
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-calibration-plan.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-document.docx b/cnas-server/src/main/resources/static/word/device-document.docx
new file mode 100644
index 0000000..d9e1d51
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-document.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-external-apply.docx b/cnas-server/src/main/resources/static/word/device-external-apply.docx
new file mode 100644
index 0000000..8df765b
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-external-apply.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-inspection-record.docx b/cnas-server/src/main/resources/static/word/device-inspection-record.docx
new file mode 100644
index 0000000..2c7a4f4
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-inspection-record.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-scrapped.docx b/cnas-server/src/main/resources/static/word/device-scrapped.docx
new file mode 100644
index 0000000..96dfdd8
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-scrapped.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/device-status.docx b/cnas-server/src/main/resources/static/word/device-status.docx
new file mode 100644
index 0000000..5753f22
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/device-status.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/examine-plan-detail.docx b/cnas-server/src/main/resources/static/word/examine-plan-detail.docx
new file mode 100644
index 0000000..118c324
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/examine-plan-detail.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/examine-record.docx b/cnas-server/src/main/resources/static/word/examine-record.docx
new file mode 100644
index 0000000..2462971
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/examine-record.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/incident-report.docx b/cnas-server/src/main/resources/static/word/incident-report.docx
new file mode 100644
index 0000000..c190287
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/incident-report.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/maintenance-plan.docx b/cnas-server/src/main/resources/static/word/maintenance-plan.docx
new file mode 100644
index 0000000..d4e69a0
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/maintenance-plan.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/maintenance-records.docx b/cnas-server/src/main/resources/static/word/maintenance-records.docx
new file mode 100644
index 0000000..ba8c9f8
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/maintenance-records.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/quipment-details.docx b/cnas-server/src/main/resources/static/word/quipment-details.docx
new file mode 100644
index 0000000..d244180
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/quipment-details.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/review-examine-record-contrast.docx b/cnas-server/src/main/resources/static/word/review-examine-record-contrast.docx
new file mode 100644
index 0000000..dd48c97
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/review-examine-record-contrast.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/traceability-management-details.docx b/cnas-server/src/main/resources/static/word/traceability-management-details.docx
new file mode 100644
index 0000000..cb6d3b9
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/traceability-management-details.docx
Binary files differ
diff --git a/cnas-server/src/main/resources/static/word/use-record.docx b/cnas-server/src/main/resources/static/word/use-record.docx
new file mode 100644
index 0000000..236e645
--- /dev/null
+++ b/cnas-server/src/main/resources/static/word/use-record.docx
Binary files differ
diff --git a/framework/src/main/java/com/yuanchu/mom/enums/QrModelType.java b/framework/src/main/java/com/yuanchu/mom/enums/QrModelType.java
new file mode 100644
index 0000000..10884d5
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/enums/QrModelType.java
@@ -0,0 +1,39 @@
+package com.yuanchu.mom.enums;
+
+import org.apache.commons.lang3.StringUtils;
+
+public enum QrModelType {
+
+    WORD_TYPE("word","word_qr_show"),
+    DEVICE_TYPE("device","device_qr_show");
+
+    String type,value;
+
+    QrModelType(String desc, String value) {
+        this.type = desc;
+        this.value = value;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 鏍规嵁绫诲瀷鑾峰彇鏋氫妇鍊�
+     * @param type
+     * @return
+     */
+    public static String getValueByType(String type){
+        for (QrModelType qrModelType : QrModelType.values()) {
+            if(StringUtils.isNotBlank(type) && type.equals(qrModelType.getType())){
+                return qrModelType.getValue();
+            }
+        }
+        throw new IllegalArgumentException();
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/yuanchu/mom/utils/UserUtils.java b/inspect-server/src/main/java/com/yuanchu/mom/utils/UserUtils.java
new file mode 100644
index 0000000..3f82104
--- /dev/null
+++ b/inspect-server/src/main/java/com/yuanchu/mom/utils/UserUtils.java
@@ -0,0 +1,90 @@
+package com.yuanchu.mom.utils;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.PictureRenderData;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 10:35:50
+ * Description: User宸ュ叿绫�
+ */
+@Component
+public class UserUtils {
+    private static UserMapper userMapper;
+
+    private static String imgUrl;
+
+    @Autowired
+    public void setUserMapper(UserMapper userMapper) {
+        UserUtils.userMapper = userMapper;
+    }
+
+    @Autowired
+    public void setImgUrl(@Value("${file.path}") String imgUrl) {
+        UserUtils.imgUrl = imgUrl;
+    }
+
+    /**
+     * 閫氳繃浜哄憳id鑾峰彇鐢ㄦ埛绛惧悕鍦板潃
+     * @param userId 浜哄憳id
+     * @return 鐢ㄦ埛绛惧悕鍦板潃
+     */
+    public static String getUserSignatureUrl(Integer userId) {
+        String userSignatureUrl = null;
+        if (userId != null) {
+            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getId, userId))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(userSignatureUrl)) {
+                throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+            }
+            return imgUrl + "\\" + userSignatureUrl;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 閫氳繃浜哄憳id鑾峰彇娓叉煋Word鐢ㄦ埛绛惧悕瀵硅薄
+     * @param userId 浜哄憳id
+     * @return 鐢ㄦ埛绛惧悕瀵硅薄 or null
+     */
+    public static PictureRenderData getFinalUserSignatureUrl(Integer userId) {
+        String userSignatureUrl = null;
+        if (userId != null) {
+            userSignatureUrl = userMapper.selectById(userId)
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(userSignatureUrl)) {
+                throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+            }
+        }
+        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
+    }
+
+
+    /**
+     * 閫氳繃鍚嶅瓧鑾峰彇娓叉煋Word鐢ㄦ埛绛惧悕瀵硅薄
+     * @param userName 浜哄憳鍚嶅瓧
+     * @return 鐢ㄦ埛绛惧悕瀵硅薄 or null
+     */
+    public static PictureRenderData getFinalUserSignatureUrl(String userName) {
+        String userSignatureUrl = null;
+        if (userName != null) {
+            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, userName))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(userSignatureUrl)) {
+                throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+            }
+        }
+        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
+    }
+}

--
Gitblit v1.9.3